UNPKG

@neuctra/ui

Version:

A modern, responsive, customizable React UI component library powered by Tailwind CSS and Vite.

1 lines 1.19 MB
{"version":3,"file":"index.cjs","sources":["../src/components/basic/Text.tsx","../src/lib/cn.ts","../src/components/basic/Button.tsx","../src/components/basic/Image.tsx","../src/components/basic/Container.tsx","../src/components/basic/Avatar.tsx","../src/components/basic/Badge.tsx","../src/components/basic/List.tsx","../node_modules/framer-motion/dist/es/context/LayoutGroupContext.mjs","../node_modules/framer-motion/dist/es/utils/use-constant.mjs","../node_modules/framer-motion/dist/es/utils/is-browser.mjs","../node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.mjs","../node_modules/framer-motion/dist/es/context/PresenceContext.mjs","../node_modules/motion-utils/dist/es/array.mjs","../node_modules/motion-utils/dist/es/clamp.mjs","../node_modules/motion-utils/dist/es/format-error-message.mjs","../node_modules/motion-utils/dist/es/errors.mjs","../node_modules/motion-utils/dist/es/global-config.mjs","../node_modules/motion-utils/dist/es/is-numerical-string.mjs","../node_modules/motion-utils/dist/es/is-object.mjs","../node_modules/motion-utils/dist/es/is-zero-value-string.mjs","../node_modules/motion-utils/dist/es/memo.mjs","../node_modules/motion-utils/dist/es/noop.mjs","../node_modules/motion-utils/dist/es/pipe.mjs","../node_modules/motion-utils/dist/es/progress.mjs","../node_modules/motion-utils/dist/es/subscription-manager.mjs","../node_modules/motion-utils/dist/es/time-conversion.mjs","../node_modules/motion-utils/dist/es/velocity-per-second.mjs","../node_modules/motion-utils/dist/es/warn-once.mjs","../node_modules/motion-utils/dist/es/easing/cubic-bezier.mjs","../node_modules/motion-utils/dist/es/easing/modifiers/mirror.mjs","../node_modules/motion-utils/dist/es/easing/modifiers/reverse.mjs","../node_modules/motion-utils/dist/es/easing/back.mjs","../node_modules/motion-utils/dist/es/easing/anticipate.mjs","../node_modules/motion-utils/dist/es/easing/circ.mjs","../node_modules/motion-utils/dist/es/easing/ease.mjs","../node_modules/motion-utils/dist/es/easing/utils/is-easing-array.mjs","../node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.mjs","../node_modules/motion-utils/dist/es/easing/utils/map.mjs","../node_modules/motion-dom/dist/es/frameloop/order.mjs","../node_modules/motion-dom/dist/es/frameloop/render-step.mjs","../node_modules/motion-dom/dist/es/frameloop/batcher.mjs","../node_modules/motion-dom/dist/es/frameloop/frame.mjs","../node_modules/motion-dom/dist/es/frameloop/sync-time.mjs","../node_modules/motion-dom/dist/es/animation/utils/is-css-variable.mjs","../node_modules/motion-dom/dist/es/value/types/numbers/index.mjs","../node_modules/motion-dom/dist/es/value/types/utils/sanitize.mjs","../node_modules/motion-dom/dist/es/value/types/utils/float-regex.mjs","../node_modules/motion-dom/dist/es/value/types/utils/is-nullish.mjs","../node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.mjs","../node_modules/motion-dom/dist/es/value/types/color/utils.mjs","../node_modules/motion-dom/dist/es/value/types/color/rgba.mjs","../node_modules/motion-dom/dist/es/value/types/color/hex.mjs","../node_modules/motion-dom/dist/es/value/types/numbers/units.mjs","../node_modules/motion-dom/dist/es/value/types/color/hsla.mjs","../node_modules/motion-dom/dist/es/value/types/color/index.mjs","../node_modules/motion-dom/dist/es/value/types/utils/color-regex.mjs","../node_modules/motion-dom/dist/es/value/types/complex/index.mjs","../node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.mjs","../node_modules/motion-dom/dist/es/utils/mix/immediate.mjs","../node_modules/motion-dom/dist/es/utils/mix/number.mjs","../node_modules/motion-dom/dist/es/utils/mix/color.mjs","../node_modules/motion-dom/dist/es/utils/mix/visibility.mjs","../node_modules/motion-dom/dist/es/utils/mix/complex.mjs","../node_modules/motion-dom/dist/es/utils/mix/index.mjs","../node_modules/motion-dom/dist/es/animation/drivers/frame.mjs","../node_modules/motion-dom/dist/es/animation/waapi/utils/linear.mjs","../node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.mjs","../node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.mjs","../node_modules/motion-dom/dist/es/animation/generators/spring.mjs","../node_modules/motion-dom/dist/es/animation/generators/utils/velocity.mjs","../node_modules/motion-dom/dist/es/animation/generators/inertia.mjs","../node_modules/motion-dom/dist/es/utils/interpolate.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.mjs","../node_modules/motion-dom/dist/es/animation/generators/keyframes.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/get-final.mjs","../node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.mjs","../node_modules/motion-dom/dist/es/animation/utils/WithPromise.mjs","../node_modules/motion-dom/dist/es/animation/JSAnimation.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.mjs","../node_modules/motion-dom/dist/es/render/dom/parse-transform.mjs","../node_modules/motion-dom/dist/es/render/utils/keys-transform.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.mjs","../node_modules/motion-dom/dist/es/render/dom/is-css-var.mjs","../node_modules/motion-dom/dist/es/render/dom/style-set.mjs","../node_modules/motion-dom/dist/es/utils/supports/flags.mjs","../node_modules/motion-dom/dist/es/utils/supports/memo.mjs","../node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.mjs","../node_modules/motion-dom/dist/es/utils/supports/linear-easing.mjs","../node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.mjs","../node_modules/motion-dom/dist/es/animation/waapi/easing/supported.mjs","../node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.mjs","../node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.mjs","../node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.mjs","../node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.mjs","../node_modules/motion-dom/dist/es/animation/NativeAnimation.mjs","../node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.mjs","../node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.mjs","../node_modules/motion-dom/dist/es/animation/utils/is-animatable.mjs","../node_modules/motion-dom/dist/es/animation/utils/can-animate.mjs","../node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.mjs","../node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.mjs","../node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.mjs","../node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.mjs","../node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.mjs","../node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.mjs","../node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.mjs","../node_modules/motion-dom/dist/es/animation/utils/default-transitions.mjs","../node_modules/motion-dom/dist/es/animation/utils/resolve-transition.mjs","../node_modules/motion-dom/dist/es/animation/utils/get-value-transition.mjs","../node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.mjs","../node_modules/motion-dom/dist/es/animation/interfaces/motion-value.mjs","../node_modules/motion-dom/dist/es/render/utils/resolve-variants.mjs","../node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.mjs","../node_modules/motion-dom/dist/es/render/utils/keys-position.mjs","../node_modules/motion-dom/dist/es/value/index.mjs","../node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.mjs","../node_modules/motion-dom/dist/es/render/utils/setters.mjs","../node_modules/motion-dom/dist/es/value/utils/is-motion-value.mjs","../node_modules/motion-dom/dist/es/value/will-change/is.mjs","../node_modules/motion-dom/dist/es/value/will-change/add-will-change.mjs","../node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.mjs","../node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.mjs","../node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.mjs","../node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.mjs","../node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.mjs","../node_modules/motion-dom/dist/es/animation/interfaces/visual-element.mjs","../node_modules/motion-dom/dist/es/value/types/auto.mjs","../node_modules/motion-dom/dist/es/value/types/test.mjs","../node_modules/motion-dom/dist/es/value/types/dimensions.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.mjs","../node_modules/motion-dom/dist/es/value/types/complex/filter.mjs","../node_modules/motion-dom/dist/es/value/types/complex/mask.mjs","../node_modules/motion-dom/dist/es/value/types/int.mjs","../node_modules/motion-dom/dist/es/value/types/maps/transform.mjs","../node_modules/motion-dom/dist/es/value/types/maps/number.mjs","../node_modules/motion-dom/dist/es/value/types/maps/defaults.mjs","../node_modules/motion-dom/dist/es/value/types/utils/animatable-none.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.mjs","../node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.mjs","../node_modules/motion-dom/dist/es/utils/resolve-elements.mjs","../node_modules/motion-dom/dist/es/value/types/utils/get-as-type.mjs","../node_modules/motion-dom/dist/es/utils/is-html-element.mjs","../node_modules/motion-dom/dist/es/frameloop/microtask.mjs","../node_modules/motion-dom/dist/es/gestures/drag/state/is-active.mjs","../node_modules/motion-dom/dist/es/gestures/drag/state/set-active.mjs","../node_modules/motion-dom/dist/es/gestures/utils/setup.mjs","../node_modules/motion-dom/dist/es/gestures/hover.mjs","../node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.mjs","../node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.mjs","../node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.mjs","../node_modules/motion-dom/dist/es/gestures/press/utils/state.mjs","../node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.mjs","../node_modules/motion-dom/dist/es/gestures/press/index.mjs","../node_modules/motion-dom/dist/es/utils/is-svg-element.mjs","../node_modules/motion-dom/dist/es/resize/handle-element.mjs","../node_modules/motion-dom/dist/es/resize/handle-window.mjs","../node_modules/motion-dom/dist/es/resize/index.mjs","../node_modules/motion-dom/dist/es/utils/is-svg-svg-element.mjs","../node_modules/motion-dom/dist/es/value/types/utils/find.mjs","../node_modules/motion-dom/dist/es/projection/geometry/models.mjs","../node_modules/motion-dom/dist/es/render/store.mjs","../node_modules/motion-dom/dist/es/render/utils/is-animation-controls.mjs","../node_modules/motion-dom/dist/es/render/utils/is-variant-label.mjs","../node_modules/motion-dom/dist/es/render/utils/variant-props.mjs","../node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.mjs","../node_modules/motion-dom/dist/es/render/utils/motion-values.mjs","../node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.mjs","../node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.mjs","../node_modules/motion-dom/dist/es/render/VisualElement.mjs","../node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.mjs","../node_modules/motion-dom/dist/es/render/Feature.mjs","../node_modules/motion-dom/dist/es/projection/geometry/conversion.mjs","../node_modules/motion-dom/dist/es/projection/utils/has-transform.mjs","../node_modules/motion-dom/dist/es/projection/geometry/delta-apply.mjs","../node_modules/motion-dom/dist/es/projection/utils/measure.mjs","../node_modules/motion-dom/dist/es/render/html/utils/build-transform.mjs","../node_modules/motion-dom/dist/es/render/html/utils/build-styles.mjs","../node_modules/motion-dom/dist/es/render/html/utils/render.mjs","../node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.mjs","../node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.mjs","../node_modules/motion-dom/dist/es/projection/styles/scale-correction.mjs","../node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.mjs","../node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.mjs","../node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.mjs","../node_modules/motion-dom/dist/es/render/svg/utils/path.mjs","../node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.mjs","../node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.mjs","../node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.mjs","../node_modules/motion-dom/dist/es/render/svg/utils/render.mjs","../node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.mjs","../node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.mjs","../node_modules/motion-dom/dist/es/render/utils/get-variant-context.mjs","../node_modules/motion-dom/dist/es/render/utils/shallow-compare.mjs","../node_modules/motion-dom/dist/es/render/utils/animation-state.mjs","../node_modules/motion-dom/dist/es/projection/geometry/copy.mjs","../node_modules/motion-dom/dist/es/projection/geometry/delta-calc.mjs","../node_modules/motion-dom/dist/es/projection/geometry/delta-remove.mjs","../node_modules/motion-dom/dist/es/projection/geometry/utils.mjs","../node_modules/motion-dom/dist/es/projection/utils/each-axis.mjs","../node_modules/motion-dom/dist/es/projection/styles/transform.mjs","../node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs","../node_modules/motion-dom/dist/es/animation/animate/single-value.mjs","../node_modules/motion-dom/dist/es/events/add-dom-event.mjs","../node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.mjs","../node_modules/motion-dom/dist/es/projection/utils/flat-tree.mjs","../node_modules/motion-dom/dist/es/utils/delay.mjs","../node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.mjs","../node_modules/motion-dom/dist/es/projection/shared/stack.mjs","../node_modules/motion-dom/dist/es/projection/node/state.mjs","../node_modules/motion-dom/dist/es/projection/node/create-projection-node.mjs","../node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.mjs","../node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.mjs","../node_modules/framer-motion/dist/es/context/MotionConfigContext.mjs","../node_modules/framer-motion/dist/es/utils/use-composed-ref.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/utils.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs","../node_modules/framer-motion/dist/es/context/LazyContext.mjs","../node_modules/framer-motion/dist/es/motion/features/definitions.mjs","../node_modules/framer-motion/dist/es/motion/features/load-features.mjs","../node_modules/framer-motion/dist/es/motion/utils/valid-prop.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/filter-props.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/index.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/utils.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/create.mjs","../node_modules/framer-motion/dist/es/render/html/utils/create-render-state.mjs","../node_modules/framer-motion/dist/es/render/html/use-props.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.mjs","../node_modules/framer-motion/dist/es/render/svg/use-props.mjs","../node_modules/framer-motion/dist/es/render/svg/lowercase-elements.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.mjs","../node_modules/framer-motion/dist/es/render/dom/use-render.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-visual-state.mjs","../node_modules/framer-motion/dist/es/render/html/use-html-visual-state.mjs","../node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.mjs","../node_modules/framer-motion/dist/es/motion/utils/symbol.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.mjs","../node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.mjs","../node_modules/framer-motion/dist/es/utils/is-ref-object.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-visual-element.mjs","../node_modules/framer-motion/dist/es/motion/index.mjs","../node_modules/framer-motion/dist/es/render/components/create-proxy.mjs","../node_modules/framer-motion/dist/es/render/dom/create-visual-element.mjs","../node_modules/framer-motion/dist/es/motion/features/animation/index.mjs","../node_modules/framer-motion/dist/es/motion/features/animation/exit.mjs","../node_modules/framer-motion/dist/es/motion/features/animations.mjs","../node_modules/framer-motion/dist/es/events/event-info.mjs","../node_modules/framer-motion/dist/es/events/add-pointer-event.mjs","../node_modules/framer-motion/dist/es/utils/get-context-window.mjs","../node_modules/framer-motion/dist/es/utils/distance.mjs","../node_modules/framer-motion/dist/es/gestures/pan/PanSession.mjs","../node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.mjs","../node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.mjs","../node_modules/framer-motion/dist/es/gestures/drag/index.mjs","../node_modules/framer-motion/dist/es/gestures/pan/index.mjs","../node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.mjs","../node_modules/framer-motion/dist/es/motion/features/drag.mjs","../node_modules/framer-motion/dist/es/gestures/hover.mjs","../node_modules/framer-motion/dist/es/gestures/focus.mjs","../node_modules/framer-motion/dist/es/gestures/press.mjs","../node_modules/framer-motion/dist/es/motion/features/viewport/observers.mjs","../node_modules/framer-motion/dist/es/motion/features/viewport/index.mjs","../node_modules/framer-motion/dist/es/motion/features/gestures.mjs","../node_modules/framer-motion/dist/es/motion/features/layout.mjs","../node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.mjs","../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs","../src/components/basic/Dropdown.tsx","../src/components/basic/Alert.tsx","../src/components/basic/Accordion.tsx","../src/components/basic/Checkbox.tsx","../src/components/basic/RadioGroup.tsx","../src/components/basic/Switch.tsx","../src/lib/useScrollLock.ts","../src/lib/useFocusTrap.ts","../src/components/basic/Drawer.tsx","../src/components/basic/Select.tsx","../src/components/basic/Input.tsx","../src/components/basic/Textarea.tsx","../src/components/basic/Modal.tsx","../src/components/basic/Table.tsx","../src/components/basic/Tabs.tsx","../src/components/basic/ThemeToggleButton.tsx","../src/components/basic/Card.tsx","../src/components/basic/Divider.tsx","../src/components/basic/Chip.tsx","../src/components/basic/Kbd.tsx","../src/components/basic/Skeleton.tsx","../src/components/basic/Spinner.tsx","../src/components/basic/Progress.tsx","../src/components/basic/Stat.tsx","../src/components/basic/EmptyState.tsx","../src/components/basic/Timeline.tsx","../src/components/basic/Breadcrumb.tsx","../src/components/basic/Pagination.tsx","../src/components/basic/Stepper.tsx","../src/components/basic/Tooltip.tsx","../src/components/basic/Popover.tsx","../src/components/basic/Slider.tsx","../src/components/basic/NumberInput.tsx","../src/components/basic/Rating.tsx","../src/components/basic/TagInput.tsx","../src/components/basic/PinInput.tsx","../src/components/basic/FileUpload.tsx","../src/components/basic/Callout.tsx","../src/components/basic/Toggle.tsx","../src/components/basic/ToggleGroup.tsx","../src/components/basic/CopyButton.tsx","../src/components/basic/AvatarGroup.tsx","../src/components/basic/Calendar.tsx","../src/components/basic/DatePicker.tsx","../src/components/basic/Carousel.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\n\ntype HTMLElementTag = keyof HTMLElementTagNameMap;\n\nexport type TextProps<T extends HTMLElementTag = \"span\"> = {\n  as?: T;\n  children: React.ReactNode;\n\n  transform?: \"uppercase\" | \"lowercase\" | \"capitalize\";\n\n  italic?: boolean;\n  underline?: boolean;\n  strikethrough?: boolean;\n  truncate?: boolean;\n\n  color?: \"default\" | \"muted\" | \"primary\" | string;\n\n  className?: string;\n} & Omit<React.ComponentPropsWithoutRef<T>, \"className\">;\n\n/* ------------------ MAPS ------------------ */\n\nconst transformMap = {\n  uppercase: \"uppercase\",\n  lowercase: \"lowercase\",\n  capitalize: \"capitalize\",\n};\n\nconst colorMap: Record<string, string> = {\n  default: \"text-foreground\",\n  primary: \"text-primary\",\n  muted: \"text-muted-foreground\",\n};\n\n/* ------------------ COMPONENT ------------------ */\n\nexport function Text<T extends HTMLElementTag = \"span\">({\n  as,\n  children,\n  transform,\n  italic,\n  underline,\n  strikethrough,\n  truncate,\n  color = \"default\",\n  className,\n  ...rest\n}: TextProps<T>) {\n  const Element = (as || \"p\") as any;\n  const isAnchor = Element === \"a\";\n\n  return (\n    <Element\n      className={clsx(\n        className,\n\n        transform && transformMap[transform],\n\n        italic && \"italic\",\n        underline && \"underline\",\n        strikethrough && \"line-through\",\n\n        truncate && \"truncate\",\n\n        isAnchor && \"text-primary hover:opacity-80 underline\",\n\n        colorMap[color] || color,\n      )}\n      {...(isAnchor && { rel: \"noopener noreferrer\" })}\n      {...rest}\n    >\n      {children}\n    </Element>\n  );\n}\n\nexport default Text;","import clsx, { type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names, resolving Tailwind conflicts by argument order.\n *\n * `clsx` alone only concatenates, so `clsx(\"px-5\", \"px-2\")` emits both and the\n * winner is decided by stylesheet order rather than intent. `twMerge` drops the\n * losing utility, which is what makes a consumer's `className` actually\n * override a component's defaults — pass it LAST.\n */\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/* -------------------------------------------------------------------------- */\n/* 🧩 Types                                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  /** Optional so icon-only buttons are possible — pair with `aria-label`. */\n  children?: React.ReactNode;\n\n  iconBefore?: React.ReactNode;\n  iconAfter?: React.ReactNode;\n\n  loading?: boolean;\n  loadingText?: string;\n\n  fullWidth?: boolean;\n\n  variant?:\n    | \"default\"\n    | \"outline\"\n    | \"ghost\"\n    | \"secondary\"\n    | \"destructive\"\n    | \"success\"\n    | \"warning\"\n    | \"info\";\n  size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n  /** 🔥 Full Customization */\n  contentClassName?: string;\n  iconClassName?: string;\n  loaderClassName?: string;\n  textClassName?: string;\n\n  contentStyle?: React.CSSProperties;\n  iconStyle?: React.CSSProperties;\n  loaderStyle?: React.CSSProperties;\n  textStyle?: React.CSSProperties;\n}\n\n/* -------------------------------------------------------------------------- */\n/* 🔘 Button                                                                 */\n/* -------------------------------------------------------------------------- */\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n  function Button(\n    {\n      children,\n      iconBefore,\n      iconAfter,\n      loading = false,\n      loadingText = \"Loading...\",\n      fullWidth = false,\n      variant = \"default\",\n      size = \"sm\",\n      disabled,\n\n      className,\n      contentClassName,\n      iconClassName,\n      loaderClassName,\n      textClassName,\n\n      style,\n      contentStyle,\n      iconStyle,\n      loaderStyle,\n      textStyle,\n\n      type = \"button\",\n      ...rest\n    },\n    ref,\n  ) {\n    const isDisabled = disabled || loading;\n\n    /* 📏 Sizes */\n    const sizeClasses = {\n      xs: \"px-3 py-1.5 text-xs min-h-[28px] rounded-md\",\n      sm: \"px-4 py-2 text-sm min-h-[32px] rounded-md\",\n      md: \"px-6 py-2.5 text-[15px] min-h-[40px] rounded-lg\",\n      lg: \"px-8 py-3 text-base min-h-[48px] rounded-xl\",\n      xl: \"px-10 py-3.5 text-lg min-h-[56px] rounded-2xl\",\n    } as const;\n\n    /* ↔️ Gap between icon and label, scaled with the size */\n    const gapClasses = {\n      xs: \"gap-1.5\",\n      sm: \"gap-2\",\n      md: \"gap-2\",\n      lg: \"gap-2.5\",\n      xl: \"gap-3\",\n    } as const;\n\n    /* 🌀 Spinner stroke, so it doesn't look solid at xs */\n    const loaderBorder = {\n      xs: \"border\",\n      sm: \"border-2\",\n      md: \"border-2\",\n      lg: \"border-2\",\n      xl: \"border-[3px]\",\n    } as const;\n\n    /* 🎨 VARIANTS (SHADCN STYLE) */\n    const variantClasses: Record<\n      NonNullable<ButtonProps[\"variant\"]>,\n      string\n    > = {\n      default: \"bg-primary text-primary-foreground hover:opacity-90\",\n      outline:\n        \"border border-border bg-background text-foreground hover:bg-accent\",\n      ghost: \"bg-transparent text-foreground hover:bg-accent\",\n      secondary: \"bg-muted text-muted-foreground hover:opacity-90\",\n      destructive:\n        \"bg-destructive text-destructive-foreground hover:opacity-90\",\n      success: \"bg-success text-success-foreground hover:opacity-90\",\n      warning: \"bg-warning text-warning-foreground hover:opacity-90\",\n      info: \"bg-info text-info-foreground hover:opacity-90\",\n    };\n\n    /* 🔘 Icon sizes */\n    const iconSizes = {\n      xs: 14,\n      sm: 16,\n      md: 20,\n      lg: 24,\n      xl: 28,\n    } as const;\n\n    return (\n      <button\n        ref={ref}\n        type={type}\n        disabled={isDisabled}\n        aria-busy={loading || undefined}\n        className={cn(\n          \"inline-flex items-center justify-center transition-all duration-200\",\n          \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n          sizeClasses[size] ?? sizeClasses.md,\n          variantClasses[variant] ?? variantClasses.default,\n          fullWidth && \"w-full\",\n          isDisabled && \"opacity-60 cursor-not-allowed\",\n          className,\n        )}\n        style={style}\n        {...rest}\n      >\n        {/* 🔥 CONTENT WRAPPER */}\n        <span\n          className={cn(\n            \"inline-flex items-center\",\n            gapClasses[size] ?? gapClasses.md,\n            contentClassName,\n          )}\n          style={contentStyle}\n        >\n          {loading ? (\n            <>\n              {/* Loader */}\n              <span\n                aria-hidden=\"true\"\n                className={cn(\n                  \"border-current border-t-transparent rounded-full animate-spin\",\n                  loaderBorder[size] ?? loaderBorder.md,\n                  loaderClassName,\n                )}\n                style={{\n                  width: iconSizes[size],\n                  height: iconSizes[size],\n                  flexShrink: 0,\n                  ...loaderStyle,\n                }}\n              />\n\n              {/* Loading Text */}\n              <span\n                className={cn(\n                  \"whitespace-nowrap text-current\",\n                  textClassName,\n                )}\n                style={textStyle}\n              >\n                {loadingText}\n              </span>\n            </>\n          ) : (\n            <>\n              {iconBefore && (\n                <span\n                  aria-hidden=\"true\"\n                  className={cn(\n                    \"inline-flex items-center justify-center shrink-0 text-current\",\n                    // Size the SVG itself, not just its wrapper — otherwise a\n                    // default 24px lucide icon spills out of a 14px xs box.\n                    \"[&_svg]:w-full [&_svg]:h-full\",\n                    iconClassName,\n                  )}\n                  style={{\n                    width: iconSizes[size],\n                    height: iconSizes[size],\n                    ...iconStyle,\n                  }}\n                >\n                  {iconBefore}\n                </span>\n              )}\n\n              {children !== undefined && children !== null && (\n                <span\n                  className={cn(\"whitespace-nowrap text-current\", textClassName)}\n                  style={textStyle}\n                >\n                  {children}\n                </span>\n              )}\n\n              {iconAfter && (\n                <span\n                  aria-hidden=\"true\"\n                  className={cn(\n                    \"inline-flex items-center justify-center shrink-0 text-current\",\n                    \"[&_svg]:w-full [&_svg]:h-full\",\n                    iconClassName,\n                  )}\n                  style={{\n                    width: iconSizes[size],\n                    height: iconSizes[size],\n                    ...iconStyle,\n                  }}\n                >\n                  {iconAfter}\n                </span>\n              )}\n            </>\n          )}\n        </span>\n      </button>\n    );\n  },\n);\n\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport React, { forwardRef, useMemo } from \"react\";\n\n/* -------------------------------------------------------------------------- */\n/* 🧩 Types                                                                  */\n/* -------------------------------------------------------------------------- */\n\ntype Responsive<T> =\n  | T\n  | {\n      base?: T;\n      sm?: T;\n      md?: T;\n      lg?: T;\n      xl?: T;\n    };\n\nexport interface ImageProps extends React.HTMLAttributes<HTMLDivElement> {\n  src?: string;\n  alt?: string;\n  title?: string;\n\n  /** Layout */\n  width?: Responsive<number | string>;\n  height?: Responsive<number | string>;\n  aspectRatio?: number;\n\n  /** Styling */\n  radius?: number | string;\n  border?: string;\n  shadow?: boolean;\n  opacity?: number;\n  objectFit?: React.CSSProperties[\"objectFit\"];\n\n  /** Overlay */\n  overlay?: React.ReactNode;\n  overlayColor?: string;\n\n  /** Interaction */\n  clickable?: boolean;\n  onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n\n  /** States */\n  fallback?: React.ReactNode;\n\n  /** Behavior */\n  loading?: \"lazy\" | \"eager\";\n\n  /** 🔥 Full Customization */\n  className?: string;\n  imageClassName?: string;\n  overlayClassName?: string;\n  fallbackClassName?: string;\n\n  style?: React.CSSProperties;\n  imageStyle?: React.CSSProperties;\n  overlayStyle?: React.CSSProperties;\n  fallbackStyle?: React.CSSProperties;\n}\n\n/* -------------------------------------------------------------------------- */\n/* 🛠 Utility                                                                 */\n/* -------------------------------------------------------------------------- */\n\nconst resolveResponsive = <T,>(\n  value: Responsive<T> | undefined\n): T | undefined => {\n  if (!value) return undefined;\n  if (typeof value !== \"object\" || !(\"base\" in value)) return value as T;\n  return value.base;\n};\n\n/* -------------------------------------------------------------------------- */\n/* 🖼 Image Component                                                         */\n/* -------------------------------------------------------------------------- */\n\nexport const Image = forwardRef<HTMLDivElement, ImageProps>(\n  (props, ref) => {\n    const {\n      src,\n      alt = \"\",\n      title,\n      width = \"100%\",\n      height,\n      aspectRatio,\n      radius,\n      border,\n      shadow,\n      opacity = 1,\n      objectFit = \"cover\",\n\n      overlay,\n      overlayColor = \"color-mix(in srgb, var(--background) 60%, transparent)\",\n\n      clickable,\n      onClick,\n\n      fallback,\n      loading = \"lazy\",\n\n      className,\n      imageClassName,\n      overlayClassName,\n      fallbackClassName,\n\n      style,\n      imageStyle,\n      overlayStyle,\n      fallbackStyle,\n\n      ...rest\n    } = props;\n\n    const resolvedWidth = resolveResponsive(width);\n    const resolvedHeight = resolveResponsive(height);\n\n    /* Wrapper styles */\n    const wrapperStyles: React.CSSProperties = useMemo(\n      () => ({\n        width: resolvedWidth,\n        height: resolvedHeight,\n        aspectRatio,\n        borderRadius: radius,\n        border,\n        overflow: \"hidden\",\n        position: \"relative\",\n        display: \"inline-block\",\n        cursor: clickable ? \"pointer\" : undefined,\n        boxShadow: shadow ? \"0 4px 12px color-mix(in srgb, var(--foreground) 15%, transparent)\" : undefined,\n        backgroundColor: \"var(--background)\",\n        ...style,\n      }),\n      [\n        resolvedWidth,\n        resolvedHeight,\n        aspectRatio,\n        radius,\n        border,\n        shadow,\n        clickable,\n        style,\n      ]\n    );\n\n    /* Image styles */\n    const imageStyles: React.CSSProperties = {\n      width: \"100%\",\n      height: \"100%\",\n      objectFit,\n      opacity,\n      display: \"block\",\n      ...imageStyle,\n    };\n\n    /* Overlay styles */\n    const overlayStyles: React.CSSProperties = {\n      position: \"absolute\",\n      inset: 0,\n      background: overlayColor,\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      color: \"var(--primary-foreground)\",\n      ...overlayStyle,\n    };\n\n    /* Fallback styles */\n    const fallbackStyles: React.CSSProperties = {\n      width: \"100%\",\n      height: \"100%\",\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      padding: 16,\n      color: \"var(--muted-foreground)\",\n      backgroundColor: \"var(--muted)\",\n      ...fallbackStyle,\n    };\n\n    const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n      if (!clickable) return;\n      if (e.key === \"Enter\" || e.key === \" \") {\n        e.preventDefault();\n        onClick?.(e as any);\n      }\n    };\n\n    return (\n      <div\n        ref={ref}\n        role={clickable ? \"button\" : undefined}\n        tabIndex={clickable ? 0 : undefined}\n        aria-label={alt}\n        title={title}\n        onClick={clickable ? onClick : undefined}\n        onKeyDown={handleKeyDown}\n        style={wrapperStyles}\n        className={className}\n        {...rest}\n      >\n        {src ? (\n          <img\n            src={src}\n            alt={alt}\n            loading={loading}\n            style={imageStyles}\n            className={imageClassName}\n          />\n        ) : (\n          <div style={fallbackStyles} className={fallbackClassName}>\n            {fallback || \"No Image\"}\n          </div>\n        )}\n\n        {overlay && (\n          <div style={overlayStyles} className={overlayClassName}>\n            {overlay}\n          </div>\n        )}\n      </div>\n    );\n  }\n);\n\nImage.displayName = \"Image\";","\"use client\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\n\ntype ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n  size?: ContainerSize;\n  padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n  center?: boolean;\n\n  /** Custom styles (framework independent) */\n  style?: React.CSSProperties;\n\n  className?: string;\n  children?: React.ReactNode;\n}\n\n/** Max width mapping (Tailwind-friendly but optional) */\nconst sizeMap: Record<ContainerSize, string> = {\n  sm: \"max-w-sm\",\n  md: \"max-w-md\",\n  lg: \"max-w-lg\",\n  xl: \"max-w-xl\",\n  \"2xl\": \"max-w-2xl\",\n  full: \"w-full\",\n};\n\n/** Padding mapping */\nconst paddingMap: Record<NonNullable<ContainerProps[\"padding\"]>, string> = {\n  none: \"p-0\",\n  sm: \"p-4\",\n  md: \"p-6\",\n  lg: \"p-8\",\n  xl: \"p-12\",\n};\n\n/**\n * 🧱 Container Component\n * - Works with Tailwind OR plain CSS\n * - Controls width & horizontal spacing only\n * - Layout should be handled via className or style\n */\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n  (\n    {\n      size = \"full\",\n      padding = \"none\",\n      center = true,\n      className,\n      style,\n      children,\n      ...rest\n    },\n    ref,\n  ) => {\n    const classes = clsx(\n      className,\n      \"w-full box-border\",\n      sizeMap[size],\n      paddingMap[padding],\n      center && \"mx-auto\",\n    );\n\n    return (\n      <div ref={ref} className={classes} style={{ ...style }} {...rest}>\n        {children}\n      </div>\n    );\n  },\n);\n\nContainer.displayName = \"Container\";\n\nexport default Container;\n","\"use client\";\n\nimport React, { useState, CSSProperties } from \"react\";\nimport { User } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\ntype AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"responsive\";\ntype AvatarVariant = \"circular\" | \"rounded\" | \"square\";\ntype StatusPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface AvatarProps {\n  src?: string;\n  alt?: string;\n  size?: AvatarSize;\n  variant?: AvatarVariant;\n  isOnline?: boolean;\n  isOffline?: boolean;\n  ring?: boolean;\n  fallback?: string;\n  onClick?: () => void;\n  statusPosition?: StatusPosition;\n  className?: string;\n  statusClassName?: string;\n  style?: CSSProperties;\n  statusStyle?: CSSProperties;\n\n  /** 🔥 Full Customization */\n  imageClassName?: string;\n  fallbackClassName?: string;\n  iconClassName?: string;\n}\n\n// Size maps with proper pixel values for status dots\nconst sizeMap: Record<Exclude<AvatarSize, \"responsive\">, number> = {\n  xs: 24,\n  sm: 32,\n  md: 40,\n  lg: 48,\n  xl: 56,\n  \"2xl\": 64,\n};\n\nconst fontSizeMap: Record<Exclude<AvatarSize, \"responsive\">, string> = {\n  xs: \"text-xs\",\n  sm: \"text-sm\",\n  md: \"text-base\",\n  lg: \"text-lg\",\n  xl: \"text-xl\",\n  \"2xl\": \"text-2xl\",\n};\n\nconst dimensionMap: Record<Exclude<AvatarSize, \"responsive\">, string> = {\n  xs: \"w-6 h-6\",\n  sm: \"w-8 h-8\",\n  md: \"w-10 h-10\",\n  lg: \"w-12 h-12\",\n  xl: \"w-14 h-14\",\n  \"2xl\": \"w-16 h-16\",\n};\n\nconst variantMap: Record<AvatarVariant, string> = {\n  circular: \"rounded-full\",\n  rounded: \"rounded-lg\",\n  square: \"rounded-none\",\n};\n\nconst statusPositionMap: Record<StatusPosition, string> = {\n  \"top-left\": \"-top-0.5 -left-0.5\",\n  \"top-right\": \"-top-0.5 -right-0.5\",\n  \"bottom-left\": \"-bottom-0.5 -left-0.5\",\n  \"bottom-right\": \"-bottom-0.5 -right-0.5\",\n};\n\n// Get status dot size based on avatar size\nconst getStatusDotSize = (size: Exclude<AvatarSize, \"responsive\">): string => {\n  const sizes: Record<Exclude<AvatarSize, \"responsive\">, string> = {\n    xs: \"w-2 h-2\",\n    sm: \"w-2.5 h-2.5\",\n    md: \"w-3 h-3\",\n    lg: \"w-3.5 h-3.5\",\n    xl: \"w-4 h-4\",\n    \"2xl\": \"w-4.5 h-4.5\",\n  };\n  return sizes[size];\n};\n\n// Get status border width based on avatar size\nconst getStatusBorderWidth = (\n  size: Exclude<AvatarSize, \"responsive\">,\n): string => {\n  const borders: Record<Exclude<AvatarSize, \"responsive\">, string> = {\n    xs: \"border\",\n    sm: \"border\",\n    md: \"border-2\",\n    lg: \"border-2\",\n    xl: \"border-[3px]\",\n    \"2xl\": \"border-[3px]\",\n  };\n  return borders[size];\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n  src,\n  alt = \"User avatar\",\n  size = \"md\",\n  variant = \"circular\",\n  isOnline = false,\n  isOffline = false,\n  fallback,\n  ring = false,\n  onClick,\n  statusPosition = \"bottom-right\",\n  className = \"\",\n  statusClassName = \"\",\n  style,\n  statusStyle,\n  imageClassName = \"\",\n  fallbackClassName = \"\",\n  iconClassName = \"\",\n}) => {\n  const [imageError, setImageError] = useState(false);\n  const clickable = !!onClick;\n  const resolvedSize = size === \"responsive\" ? \"md\" : size;\n\n  const initials =\n    fallback ||\n    alt\n      .split(\" \")\n      .map((n) => n[0])\n      .join(\"\")\n      .toUpperCase()\n      .slice(0, 2);\n\n  // Presence uses the status palette: success = online, muted = offline —\n  // not the brand primary, which may be any hue the theme defines. Border\n  // width/color are applied once by the dot itself.\n  const statusColor = isOnline\n    ? \"bg-success\"\n    : isOffline\n      ? \"bg-muted-foreground\"\n      : \"\";\n\n  const statusDotSize = getStatusDotSize(resolvedSize);\n  const statusBorderWidth = getStatusBorderWidth(resolvedSize);\n\n  return (\n    <div\n      role={clickable ? \"button\" : \"img\"}\n      tabIndex={clickable ? 0 : -1}\n      aria-label={alt}\n      onClick={onClick}\n      className={`relative inline-flex items-center justify-center \n        ${dimensionMap[resolvedSize]} \n        ${variantMap[variant]} \n        bg-background text-foreground\n        transition-all duration-200 \n        ${clickable ? \"cursor-pointer hover:scale-105 active:scale-95\" : \"\"} \n        ${ring ? \"ring-2 ring-border ring-offset-2\" : \"\"} \n        ${className}`}\n      style={{\n        ...style,\n        ...(ring ? { ringColor: \"var(--border)\" } : {}),\n      }}\n      onKeyDown={(e) => {\n        if (clickable && (e.key === \"Enter\" || e.key === \" \")) {\n          e.preventDefault();\n          onClick?.();\n        }\n      }}\n    >\n      {src && !imageError ? (\n        <img\n          src={src}\n          alt={alt}\n          onError={() => setImageError(true)}\n          className={cn(\n            \"w-full h-full object-cover\",\n            variantMap[variant],\n            imageClassName,\n          )}\n        />\n      ) : (\n        <div\n          className={cn(\n            \"w-full h-full flex items-center justify-center bg-muted text-foreground font-semibold\",\n            fontSizeMap[resolvedSize],\n            variantMap[variant],\n            fallbackClassName,\n          )}\n        >\n          {initials || (\n            <User\n              className={cn(\"w-1/2 h-1/2 text-muted-foreground\", iconClassName)}\n            />\n          )}\n        </div>\n      )}\n\n      {/* Status Dot - Now properly visible */}\n      {(isOnline || isOffline) && (\n        <span\n          aria-label={isOnline ? \"Online\" : \"Offline\"}\n          title={isOnline ? \"Online\" : \"Offline\"}\n          className={`\n            absolute\n            ${statusPositionMap[statusPosition]}\n            ${statusColor}\n            ${statusDotSize}\n            ${statusBorderWidth}\n            border-background\n            rounded-full\n            shadow-md\n            z-10\n            ${statusClassName}\n          `}\n          style={{\n            ...statusStyle,\n          }}\n        />\n      )}\n    </div>\n  );\n};\n\n// Export additional helper for responsive sizing\nexport const getAvatarSize = (size: AvatarSize): number => {\n  if (size === \"responsive\") return 40;\n  return sizeMap[size];\n};\n","\"use client\";\n\nimport React, { memo, CSSProperties } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/* -------------------------------------------------------------------------- */\n/*                                🧩 Types                                    */\n/* -------------------------------------------------------------------------- */\n\nexport interface BadgeProps {\n  text?: string;\n\n  variant?: \"solid\" | \"outline\" | \"soft\";\n\n  icon?: React.ReactNode;\n  iconPosition?: \"left\" | \"right\";\n\n  size?: \"sm\" | \"md\" | \"lg\";\n\n  rounded?: boolean;\n\n  notificationDot?: boolean;\n  dotColor?: string;\n  count?: number | string;\n  pulse?: boolean;\n\n  className?: string;\n  style?: CSSProperties;\n  dotClassName?: string;\n  dotStyle?: CSSProperties;\n  countClassName?: string;\n  countStyle?: CSSProperties;\n  iconClassName?: string;\n  iconStyle?: CSSProperties;\n  textClassName?: string;\n  textStyle?: CSSProperties;\n\n  onClick?: () => void;\n}\n\n/* -------------------------------------------------------------------------- */\n/*                                🏷 Badge                                    */\n/* -------------------------------------------------------------------------- */\n\nexport const Badge: React.FC<BadgeProps> = memo(\n  ({\n    text,\n    icon,\n    iconPosition = \"left\",\n    variant = \"solid\",\n    size = \"sm\",\n    rounded = true,\n\n    notificationDot = false,\n    count,\n    pulse = false,\n\n    className,\n    style,\n    dotClassName,\n    dotStyle,\n    countClassName,\n    countStyle,\n    iconClassName,\n    iconStyle,\n    textClassName,\n    textStyle,\n\n    onClick,\n  }) => {\n    const sizes = {\n      sm: \"px-2.5 py-0.5 text-[11px] gap-1\",\n      md: \"px-3 py-1 text-xs gap-1.5\",\n      lg: \"px-4 py-1.5 text-sm gap-2\",\n    } as const;\n\n    // The icon slot has to scale with the size too — otherwise a `lg` badge\n    // renders the same icon box as an `sm` one.\n    const iconSizes = {\n      sm: \"w-3 h-3\",\n      md: \"w-3.5 h-3.5\",\n      lg: \"w-4 h-4\",\n    } as const;\n\n    const variants = {\n      // text-primary-foreground, not text-white — a light --primary (the\n      // README's own example is a bright green) fails contrast against white.\n      solid: \"bg-primary text-primary-foreground\",\n      outline: \"border border-primary text-primary bg-transparent\",\n      soft: \"bg-primary/10 text-primary\",\n    } as const;\n\n    const isInteractive = Boolean(onClick);\n\n    return (\n      <span\n        onClick={onClick}\n        // A clickable badge has to be reachable and operable by keyboard.\n        role={isInteractive ? \"button\" : undefined}\n        tabIndex={isInteractive ? 0 : undefined}\n        onKeyDown={\n          isInteractive\n            ? (e) => {\n                if (e.key === \"Enter\" || e.key === \" \") {\n                  e.preventDefault();\n                  onClick?.();\n                }\n              }\n            : undefined\n        }\n        style={style}\n        className={cn(\n          \"relative inline-flex items-center justify-center font-medium\",\n          \"transition-all duration-200 select-none\",\n\n          variants[variant] ?? variants.solid,\n\n          rounded ? \"rounded-full\" : \"rounded-md\",\n          sizes[size] ?? sizes.sm,\n\n          isInteractive &&\n            \"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background \" +\n              // Hover stays within the variant's own color ramp.\n              (variant === \"solid\"\n                ? \"hover:bg-primary/90\"\n                : variant === \"outline\"\n                  ? \"hover:bg-primary/10\"\n                  : \"hover:bg-primary/20\"),\n\n          className,\n        )}\n      >\n        {/* Dot — suppressed when a count is shown, since both sit in the same\n            corner and would overlap. */}\n        {notificationDot && count === undefined && (\n          <span\n            aria-hidden=\"true\"\n            style={dotStyle}\n            className={cn(\n              \"absolute -top-1 -right-1 w-2 h-2 rounded-full bg-destructive\",\n              // animate-ping scales the dot to 2x and fades it out, so on its\n              // own the dot vanishes. Render the ping as a sibling ring and\n              // keep a solid dot underneath.\n              pulse &&\n                \"before:absolute before:inset-0 before:rounded-full before:bg-destructive before:animate-ping motion-reduce:before:animate-none\",\n              dotClassName,\n            )}\n          />\n        )}\n\n        {/* Count */}\n        {count !== undefined && (\n          <span\n            role=\"status\"\n            style={countStyle}\n            className={cn(\n              \"absolute -top-2 -right-2 min-w-[18px] h-[18px] px-1 text-[10px]\",\n              \"flex items-center justify-center rounded-full\",\n              \"bg-destructive text-destructive-foreground\",\n              countClassName,\n            )}\n          >\n            {count}\n          </span>\n        )}\n\n        {/* Icon Left */}\n        {icon && iconPosition === \"left\" && (\n          <span\n            aria-hidden=\"true\"\n            style={iconStyle}\n            className={cn(\n              \"flex items-center shrink-0 [&_svg]:w-full [&_svg]:h-full\",\n              iconSizes[size] ?? iconSizes.sm,\n              iconClassName,\n            )}\n          >\n            {icon}\n          </span>\n        )}\n\n        {/* Text */}\n        {text && (\n          <span style={textStyle} className={cn(textClassName)}>\n            {text}\n          </span>\n        )}\n\n        {/* Icon Right */}\n        {icon && iconPosition === \"right\" && (\n          <span\n            aria-hidden=\"true\"\n            style={iconStyle}\n            className={cn(\n              \"flex items-center shrink-0 [&_svg]:w-full [&_svg]:h-full\",\n              iconSizes[size] ?? iconSizes.sm,\n              iconClassName,\n            )}\n          >\n            {icon}\n          </span>\n        )}\n      </span>\n    );\n  },\n);\n\nBadge.displayName = \"Badge\";\n","\"use client\";\n\nimport React, {\n  CSSProperties,\n  ElementType,\n  MouseEvent,\n  ReactNode,\n  useMemo,\n  useState,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { ChevronDown, ChevronRight, ExternalLink } from \"lucide-react\";\n\nexport type ListType = \"unordered\" | \"ordered\" | \"inline\";\nexport type ListVariant = \"default\" | \"nav\" | \"menu\" | \"card\" | \"ghost\";\nexport type ListSize = \"sm\" | \"md\" | \"lg\";\nexport type ListDensity = \"compact\" | \"normal\" | \"comfortable\";\nexport type NestedMode = \"always\" | \"collapse\";\nexport type BulletVariant = \"dot\" | \"line\" | \"number\" | \"none\";\n\nexport interface ListItemType {\n  id?: string | number;\n  text?: ReactNode;\n  label?: ReactNode;\n  description?: ReactNode;\n  icon?: ReactNode;\n  leading?: ReactNode;\n  trailing?: ReactNode;\n  badge?: ReactNode;\n  shortcut?: ReactNode;\n\n  href?: string;\n  target?: React.HTMLAttributeAnchorTarget;\n  rel?: string;\n  download?: boolean | string;\n  onClick?: (\n    event: MouseEvent<HTMLElement>,\n    item: ListItemType,\n  ) => void;\n\n  subItems?: ListItemType[];\n  items?: ListItemType[];\n  expanded?: boolean;\n  defaultExpanded?: boolean;\n  collapsible?: boolean;\n\n  active?: boolean;\n  disabled?: boolean;\n  danger?: boolean;\n  separator?: boolean;\n  hidden?: boolean;\n\n  title?: string;\n  ariaLabel?: string;\n  role?: string;\n\n  className?: string;\n  contentClassName?: string;\n  iconClassName?: string;\n  textClassName?: string;\n  descriptionClassName?: string;\n  badgeClassName?: string;\n  subListClassName?: string;\n\n  style?: CSSProperties;\n  contentStyle?: CSSProperties;\n  iconStyle?: CSSProperties;\n  textStyle?: CSSProperties;\n  descriptionStyle?: CSSProperties;\n  badgeStyle?: CSSProperties;\n  subListStyle?: CSSProperties;\n}\n\nexport interface ListRenderItemParams {\n  item: ListItemType;\n  index: number;\n  depth: number;\n  active: boolean;\n  expanded: boolean;\n  disabled: boolean;\n  hasChildren: boolean;\n  toggle: () => void;\n  select: (event: MouseEvent<HTMLElement>) => void;\n}\n\nexport interface ListProps {\n  title?: ReactNode;\n  titleIcon?: ReactNode;\n  description?: ReactNode;\n  items: ListItemType[];\n\n  type?: ListType;\n  variant?: ListVariant;\n  size?: ListSize;\n  density?: ListDensity;\n  nestedMode?: NestedMode;\n  bulletVariant?: BulletVariant;\n\n  showTree?: boolean;\n  showBullets?: boolean;\n  showDividers?: boolean;\n  interactive?: boolean;\n  fullWidth?: boolean;\n  disabled?: boolean;\n\n  activeItemId?: string | number;\n  defaultActiveItemId?: string | number;\n  onActiveChange?: (id: string | number, item: ListItemType) => void;\n\n  expandedIds?: Array<string | number>;\n  defaultExpandedIds?: Array<string | number>;\n  onExpandedChange?: (ids: Array<string | number>) => void;\n\n  role?: string;\n  ariaLabel?: string;\n  emptyState?: ReactNode;\n  linkComponent?: ElementType;\n  renderItem?: (params: ListRenderItemParams) => ReactNode;\n\n  className?: string;\n  headerClassName?: string;\n  listClassName?: string;\n  itemClassName?: string;\n  itemContentClassName?: string;\n  titleClassName?: string;\n  descriptionClassName?: string;\n  bulletClassName?: string;\n  textClassName?: string;\n  iconClassName?: string;\n  badgeClassName?: string;\n  shortcutClassName?: string;\n  trailingClassName?: string;\n  subListClassName?: string;\n  separatorClassName?: string;\n  chevronClassName?: string;\n  externalIconClassName?: string;\n  emptyStateClassName?: string;\n\n  style?: CSSProperties;\n  headerStyle?: CSSProperties;\n  listStyle?: CSSProperties;\n  itemStyle?: CSSProperties;\n  itemContentStyle?: CSSProperties;\n  titleStyle?: CSSProperties;\n  descriptionStyle?: CSSProperties;\n  bulletStyle?: CSSProperties;\n  textStyle?: CSSProperties;\n  iconStyle?: CSSProperties;\n  badgeStyle?: CSSProperties;\n  shortcutStyle?: CSSProperties;\n  trailingStyle?: CSSProperties;\n  subListStyle?: CSSProperties;\n  separatorStyle?: CSSProperties;\n}\n\nexport interface ListItemProps {\n  item?: ListItemType;\n  index?: number;\n  depth?: number;\n  isInline?: boolean;\n  isOrdered?: boolean;\n  showTree?: boolean;\n  showBullets?: boolean;\n  showDividers?: boolean;\n  interactive?: boolean;\n  disabled?: boolean;\n  variant?: ListVariant;\n  size?: ListSize;\n  density?: ListDensity;\n  nestedMode?: NestedMode;\n  bulletVariant?: BulletVariant;\n  activeItemId?: string | number;\n  expandedIds?: Set<string | number>;\n  toggleExpanded?: (id: string | number, item: ListItemType) => void;\n  selectItem?: (id: string | number, item: ListItemType) => void;\n  linkComponent?: ElementType;\n  renderItem?: (params: ListRenderItemParams) => ReactNode;\n\n  itemClassName?: string;\n  itemContentClassName?: string;\n  bulletClassName?: string;\n  textClassName?: string;\n  iconClassName?: string;\n  badgeClassName?: string;\n  shortcutClassName?: string;\n  trailingClassName?: string;\n  subListClassName?: string;\n  separatorClassName?: string;\n  chevronClassName?: string;\n  externalIconClassName?: string;\n\n  itemStyle?: CSSProperties;\n  itemContentStyle?: CSSProperties;\n  bulletStyle?: CSSProperties;\n  textStyle?: CSSProperties;\n  iconStyle?: CSSProperties;\n  badgeStyle?: CSSProperties;\n  shortcutStyle?: CSSProperties;\n  trailingStyle?: CSSProperties;\n  subListStyle?: CSSProperties;\n  separatorStyle?: CSSProperties;\n}\n\nconst sizeClasses: Record<ListSize, string> = {\n  sm: \"text-xs\",\n  md: \"text-sm\",\n  lg: \"text-base\",\n};\n\nconst paddingClasses: Record<ListDensity, Record<ListSize, string>> = {\n  compact: {\n    sm: \"px-2 py-1\",\n    md: \"px-2.5 py-1.5\",\n    lg: \"px-3 py-2\",\n  },\n  normal: {\n    sm: \"px-2.5 py-1.5\",\n    md: \"px-3 py-2\",\n    lg: \"px-3.5 py-2.5\",\n  },\n  comfortable: {\n    sm: \"px-3 py-2\",\n    md: \"px-3.5 py-2.5\",\n    lg: \"px-4 py-3\",\n  },\n};\n\nconst variantClasses: Record<ListVariant, string> = {\n  default: \"rounded-md hover:bg-accent\",\n  nav: \"rounded-lg hover:bg-accent hover:text-foreground\",\n  menu: \"rounded-md hover:bg-accent\",\n  card: \"rounded-lg border border-border bg-card hover:bg-accent\",\n  ghost: \"rounded-md hover:bg-accent/70\",\n};\n\nconst activeClasses: Record<ListVariant, string> = {\n  default: \"bg-accent text-foreground\",\n  nav: \"bg-primary text-foreground\",\n  menu: \"bg-accent text-foreground\",\n  card: \"border-primary bg-primary/10 text-foreground\",\n  ghost: \"bg-accent text-foreground\",\n};\n\nconst getItemId = (item: ListItemType, index: number, depth: number) =>\n  item.id ?? `${depth}-${index}-${String(item.text ?? item.label ?? \"item\")}`;\n\nconst getChildren = (item: ListItemType) => item.subItems ?? item.items ?? [];\n\nconst getLabel = (item: ListItemType) => item.text ?? item.label;\n\nconst shouldUseRel = (target?: React.HTMLAttributeAnchorTarget, rel?: string) =>\n  rel ?? (target === \"_blank\" ? \"noreferrer\" : undefined);\n\nexport const ListItem: React.FC<ListItemProps & Partial<ListItemType>> = (\n  props,\n) => {\n  const item = props.item ?? {\n    id: props.id,\n    text: props.text,\n    label: props.label,\n    description: props.description,\n    icon: props.icon,\n    leading: props.leading,\n    trailing: props.trailing,\n    badge: props.badge,\n    shortcut: props.shortcut,\n    href: props.href,\n    target: props.target,\n    rel: props.rel,\n    download: props.download,\n    onClick: props.onClick,\n    subItems: props.subItems,\n    items: props.items,\n    expanded: props.expanded,\n    defaultExpanded: props.defaultExpanded,\n    collapsible: props.collapsible,\n    active: props.active,\n    disabled: props.disabled,\n    danger: props.danger,\n    separator: props.separator,\n    hidden: props.hidden,\n    title: props.title,\n    ariaLabel: props.ariaLabel,\n    role: props.role,\n    className: props.className,\n    contentClassName: props.contentClassName,\n    iconClassName: props.iconClassName,\n    textClassName: props.textClassName,\n    descriptionClassName: props.descriptionClassName,\n    badgeClassName: props.badgeClassName,\n    subListClassName: props.subListClassName,\n    style: props.style,\n    contentStyle: props.contentStyle,\n    iconStyle: props.iconStyle,\n    textStyle: props.textStyle,\n    descriptionStyle: props.descriptionStyle,\n    badgeStyle: props.badgeStyle,\n    subListStyle: props.subListStyle,\n  };\n\n  const {\n    index = 0,\n    depth = 0,\n    isInline = false,\n    isOrdered = false,\n    showTree = false,\n    showBullets = false,\n    showDividers = false,\n    interactive = true,\n    disabled: listDisabled = false,\n    variant = \"default\",\n    size = \"md\",\n    density = \"normal\",\n    nestedMode = \"collapse\",\n    bulletVariant = \"dot\",\n    activeItemId,\n    expandedIds,\n    toggleExpanded,\n    selectItem,\n    linkComponent,\n    renderItem,\n    itemClassName,\n    itemContentClassName,\n    bulletClassName,\n    textClassName,\n    iconClassName,\n    badgeClassName,\n    shortcutClassName,\n    trailingClassName,\n    subListClassName,\n    separatorClassName,\n    chevronClassName,\n    externalIconClassName,\n    itemStyle,\n    itemContentStyle,\n    bulletStyle,\n    textStyle,\n    iconStyle,\n    badgeStyle,\n    shortcutStyle,\n    trailingStyle,\n    subListStyle,\n    separatorStyle,\n  } = props;\n\n  if (item.hidden) return null;\n\n  const id = getItemId(item, index, depth);\n  const children = getChildren(item);\n  const hasChildren = children.length > 0;\n  const itemDisabled = listDisabled || !!item.disabled;\n  const itemActive = item.active || activeItemId === id;\n  const controlledExpanded = item.expanded;\n  const setExpanded = expandedIds?.has(id);\n  const expanded =\n    controlledExpanded ?? setExpanded ?? item.defaultExpanded ?? nestedMode === \"always\";\n  const collapsible = item.collapsible ?? nestedMode === \"collapse\";\n  const label = getLabel(item);\n  const LeadingIcon = item.leading ?? item.icon;\n  const LinkComponent = linkComponent ?? \"a\";\n  const hasAction = !!item.href || !!item.onClick || hasChildren;\n  const isClickable = interactive && hasAction && !itemDisabled;\n  const isExternal = item.target === \"_blank\";\n\n  const toggle = () => {\n    if (!hasChildren || itemDisabled) return;\n    toggleExpanded?.(id, item);\n  };\n\n  const handleSelect = (event: MouseEvent<HTMLElement>) => {\n    if (itemDisabled) {\n      event.preventDefault();\n      return;\n    }\n\n    if (hasChildren && (!item.href || collapsible)) {\n      toggle();\n    }\n\n    item.onClick?.(event, item);\n    selectItem?.(id, item);\n  };\n\n  if (item.separator) {\n    return (\n      <li\n        role=\"separator\"\n        className={clsx(\"my-1 h-px bg-border\", separatorClassName)}\n        style={separatorStyle}\n      />\n    );\n  }\n\n  const marker =\n    showBullets &&\n    !isOrdered &&\n    !isInline &&\n    !LeadingIcon &&\n    bulletVariant !== \"none\";\n\n  const content = (\n    <>\n      {marker && (\n        <span\n          aria-hidden=\"true\"\n          className={clsx(\n            \"shrink-0\",\n            bulletVariant === \"line\" && \"mt-1.5 h-px w-4 bg-current opacity-50\",\n            bulletVariant === \"number\" &&\n              \"flex h-5 min-w-5 items-center justify-center rounded-full bg-primary/10 px-1 text-xs font-medium text-foreground\",\n            bulletVariant === \"dot\" && \"mt-1.5 h-2 w-2 rounded-full bg-primary\",\n            bulletClassName,\n          )}\n          style={bulletStyle}\n        >\n          {bulletVariant === \"number\" ? index + 1 : null}\n        </span>\n      )}\n\n      {LeadingIcon && (\n        <span\n          className={clsx(\n            \"shrink-0 text-foreground/70\",\n            item.iconClassName,\n            iconClassName,\n          )}\n          style={{ ...iconStyle, ...item.iconStyle }}\n        >\n          {LeadingIcon}\n        </span>\n      )}\n\n      <span className=\"min-w-0 flex-1\">\n        <span\n          className={clsx(\n            \"block truncate\",\n            item.textClassName,\n            textClassName,\n          )}\n          style={{ ...textStyle, ...item.textStyle }}\n        >\n          {label}\n        </span>\n\n        {item.description && (\n          <span\n            className={clsx(\n              \"mt-0.5 block truncate text-xs text-foreground/70\",\n              item.descriptionClassName,\n            )}\n            style={item.descriptionStyle}\n          >\n            {item.description}\n          </span>\n        )}\n      </span>\n\n      {item.badge && (\n        <span\n          className={clsx(\n            \"shrink-0 rounded-full bg-primary/10 px-2 py-0.5 text-xs font-medium text-foreground\",\n            item.badgeClassName,\n            badgeClassName,\n          )}\n          style={{ ...badgeStyle, ...item.badgeStyle }}\n        >\n          {item.badge}\n        </span>\n      )}\n\n      {item.shortcut && (\n        <kbd\n          className={clsx(\n            \"shrink-0 rounded border border-border bg-muted px-1.5 py-0.5 text-[11px] text-foreground/60\",\n            shortcutClassName,\n          )}\n          style={props.shortcutStyle}\n        >\n          {item.shortcut}\n        </kbd>\n      )}\n\n      {item.trailing && (\n        <span\n          className={clsx(\"shrink-0 text-foreground/70\", trailingClassName)}\n          style={trailingStyle}\n        >\n          {item.trailing}\n        </span>\n      )}\n\n      {isExternal && (\n        <ExternalLink\n          aria-hidden=\"true\"\n          className={clsx(\"h-3.5 w-3.5 shrink-0 text-foreground/60\", externalIconClassName)}\n        />\n      )}\n\n      {hasChildren && collapsible && !item.trailing && (\n        <span className={clsx(\"shrink-0 text-foreground/60\", chevronClassName)}>\n          {expanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />}\n        </span>\n      )}\n    </>\n  );\n\n  const contentClassName = clsx(\n    \"group/list-item flex min-w-0 items-center gap-2.5 transition-all\",\n    \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n    sizeClasses[size],\n    paddingClasses[density][size],\n    variantClasses[variant],\n    itemActive && activeClasses[variant],\n    item.danger && \"text-foreground hover:bg-destructive/10\",\n    itemDisabled && \"pointer-events-none opacity-50\",\n    isClickable && \"cursor-pointer\",\n    !isClickable && \"cursor-default\",\n    item.contentClassName,\n    itemContentClassName,\n  );\n\n  const sharedElementProps = {\n    title: item.title,\n    \"aria-label\": item.ariaLabel,\n    \"aria-current\": itemActive ? (\"page\" as const) : undefined,\n    \"aria-expanded\": hasChildren && collapsible ? expanded : undefined,\n    className: contentClassName,\n    style: { ...itemContentStyle, ...item.contentStyle },\n  };\n\n  const defaultItem = (\n    <>\n      {item.href ? (\n        <LinkComponent\n          {...sharedElementProps}\n          href={item.href}\n          target={item.target}\n          rel={shouldUseRel(item.target, item.rel)}\n          download={item.download}\n          onClick={handleSelect}\n        >\n          {content}\n        </LinkComponent>\n      ) : (\n        <>\n          {isClickable ? (\n            <button\n              {...sharedElementProps}\n              type=\"button\"\n              disabled={itemDisabled}\n              onClick={handleSelect}\n            >\n              {content}\n            </button>\n          ) : (\n            <div {...sharedElementProps}>{content}</div>\n          )}\n        </>\n      )}\n    </>\n  );\n\n  return (\n    <li\n      role={item.role}\n      className={clsx(\n        \"relative\",\n        showDividers && \"border-b border-border last:border-b-0\",\n        showTree && depth > 0 && !isInline && \"pl-4\",\n        isInline && \"shrink-0\",\n        item.className,\n        itemClassName,\n      )}\n      style={{ ...itemStyle, ...item.style }}\n    >\n      {showTree && depth > 0 && !isInline && (\n        <>\n          <span className=\"absolute left-1.5 top-0 h-full w-px bg-border\" />\n          <span className=\"absolute left-1.5 top-5 h-px w-3 bg-border\" />\n        </>\n      )}\n\n      {renderItem\n        ? renderItem({\n            item,\n            index,\n            depth,\n            active: itemActive,\n            expanded,\n            disabled: itemDisabled,\n            hasChildren,\n            toggle,\n            select: handleSelect,\n          })\n        : defaultItem}\n\n      {hasChildren && !isInline && expanded && (\n        <ul\n          role=\"group\"\n          className={clsx(\n            \"mt-1 list-none space-y-1 pl-3\",\n            showTree && \"pl-4\",\n            item.subListClassName,\n            subListClassName,\n          )}\n          style={{ ...subListStyle, ...item.subListStyle }}\n        >\n          {children.map((child, childIndex) => (\n            <ListItem\n              key={getItemId(child, childIndex, depth + 1)}\n              item={child}\n              index={childIndex}\n              depth={depth + 1}\n              isOrdered={isOrdered}\n              showTree={showTree}\n              showBullets={showBullets}\n              showDividers={showDividers}\n              interactive={interactive}\n              disabled={listDisabled}\n              variant={variant}\n              size={size}\n              density={density}\n              nestedMode={nestedMode}\n              bulletVariant={bulletVariant}\n              activeItemId={activeItemId}\n              expandedIds={expandedIds}\n              toggleExpanded={toggleExpanded}\n              selectItem={selectItem}\n              linkComponent={linkComponent}\n              renderItem={renderItem}\n              itemClassName={itemClassName}\n              itemContentClassName={itemContentClassName}\n              bulletClassName={bulletClassName}\n              textClassName={textClassName}\n              iconClassName={iconClassName}\n              badgeClassName={badgeClassName}\n              shortcutClassName={shortcutClassName}\n              trailingClassName={trailingClassName}\n              subListClassName={subListClassName}\n              separatorClassName={separatorClassName}\n              chevronClassName={chevronClassName}\n              externalIconClassName={externalIconClassName}\n              itemStyle={itemStyle}\n              itemContentStyle={itemContentStyle}\n              bulletStyle={bulletStyle}\n              textStyle={textStyle}\n              iconStyle={iconStyle}\n              badgeStyle={badgeStyle}\n              shortcutStyle={shortcutStyle}\n              trailingStyle={trailingStyle}\n              subListStyle={subListStyle}\n              separatorStyle={separatorStyle}\n            />\n          ))}\n        </ul>\n      )}\n    </li>\n  );\n};\n\nexport const List: React.FC<ListProps> = ({\n  title,\n  titleIcon,\n  description,\n  items,\n  type = \"unordered\",\n  variant = \"default\",\n  size = \"md\",\n  density = \"normal\",\n  nestedMode = \"collapse\",\n  bulletVariant = \"dot\",\n  showTree = false,\n  showBullets = false,\n  showDividers = false,\n  interactive = true,\n  fullWidth = true,\n  disabled = false,\n  activeItemId,\n  defaultActiveItemId,\n  onActiveChange,\n  expandedIds,\n  defaultExpandedIds = [],\n  onExpandedChange,\n  role,\n  ariaLabel,\n  emptyState,\n  linkComponent,\n  renderItem,\n  className,\n  headerClassName,\n  listClassName,\n  itemClassName,\n  itemContentClassName,\n  titleClassName,\n  descriptionClassName,\n  bulletClassName,\n  textClassName,\n  iconClassName,\n  badgeClassName,\n  shortcutClassName,\n  trailingClassName,\n  subListClassName,\n  separatorClassName,\n  chevronClassName,\n  externalIconClassName,\n  emptyStateClassName,\n  style,\n  headerStyle,\n  listStyle,\n  itemStyle,\n  itemContentStyle,\n  titleStyle,\n  descriptionStyle,\n  bulletStyle,\n  textStyle,\n  iconStyle,\n  badgeStyle,\n  shortcutStyle,\n  trailingStyle,\n  subListStyle,\n  separatorStyle,\n}) => {\n  const isOrdered = type === \"ordered\";\n  const isInline = type === \"inline\";\n  const ListTag = isOrdered ? \"ol\" : \"ul\";\n  const [internalActiveId, setInternalActiveId] = useState<\n    string | number | undefined\n  >(defaultActiveItemId);\n  const [internalExpandedIds, setInternalExpandedIds] = useState<\n    Array<string | number>\n  >(defaultExpandedIds);\n\n  const resolvedActiveId = activeItemId ?? internalActiveId;\n  const resolvedExpandedIds = expandedIds ?? internalExpandedIds;\n  const expandedSet = useMemo(\n    () => new Set<string | number>(resolvedExpandedIds),\n    [resolvedExpandedIds],\n  );\n\n  const visibleItems = items.filter((item) => !item.hidden);\n\n  const updateExpanded = (id: string | number) => {\n    const next = expandedSet.has(id)\n      ? resolvedExpandedIds.filter((expandedId) => expandedId !== id)\n      : [...resolvedExpandedIds, id];\n\n    if (!expandedIds) setInternalExpandedIds(next);\n    onExpandedChange?.(next);\n  };\n\n  const selectItem = (id: string | number, item: ListItemType) => {\n    if (activeItemId === undefined) setInternalActiveId(id);\n    onActiveChange?.(id, item);\n  };\n\n  return (\n    <div\n      className={clsx(\n        \"text-foreground\",\n        fullWidth ? \"w-full\" : \"inline-block\",\n        className,\n      )}\n      style={style}\n    >\n      {(title || description) && (\n        <div\n          className={clsx(\"mb-3 flex items-start gap-2\", headerClassName)}\n          style={headerStyle}\n        >\n          {titleIcon && (\n            <span\n              className={clsx(\n                \"mt-0.5 shrink-0 text-foreground/70\",\n                iconClassName,\n              )}\n              style={iconStyle}\n            >\n              {titleIcon}\n            </span>\n          )}\n\n          <div className=\"min-w-0\">\n            {title && (\n              <div\n                className={clsx(\n                  \"truncate text-base font-semibold text-foreground\",\n                  titleClassName,\n                )}\n                style={titleStyle}\n              >\n                {title}\n              </div>\n            )}\n\n            {description && (\n              <p\n                className={clsx(\n                  \"mt-0.5 text-sm text-foreground/70\",\n                  descriptionClassName,\n                )}\n                style={descriptionStyle}\n              >\n                {description}\n              </p>\n            )}\n          </div>\n        </div>\n      )}\n\n      {visibleItems.length === 0 ? (\n        <div\n          className={clsx(\n            \"rounded-md border border-dashed border-border px-3 py-4 text-sm text-foreground/70\",\n            emptyStateClassName,\n          )}\n        >\n          {emptyState ?? \"No items to show.\"}\n        </div>\n      ) : (\n        <ListTag\n          role={role}\n          aria-label={ariaLabel}\n          className={clsx(\n            isInline\n              ? \"flex list-none flex-wrap gap-2 p-0\"\n              : isOrdered\n                ? \"list-decimal space-y-1 pl-5\"\n                : \"list-none space-y-1 p-0\",\n            variant === \"menu\" && \"rounded-lg border border-border bg-popover p-1\",\n            variant === \"card\" && !isOrdered && !isInline && \"space-y-2\",\n            listClassName,\n          )}\n          style={listStyle}\n        >\n          {visibleItems.map((item, index) => (\n            <ListItem\n              key={getItemId(item, index, 0)}\n              item={item}\n              index={index}\n              depth={0}\n              isInline={isInline}\n              isOrdered={isOrdered}\n              showTree={showTree}\n              showBullets={showBullets}\n              showDividers={showDividers}\n              interactive={interactive}\n              disabled={disabled}\n              variant={variant}\n              size={size}\n              density={density}\n              nestedMode={nestedMode}\n              bulletVariant={bulletVariant}\n              activeItemId={resolvedActiveId}\n              expandedIds={expandedSet}\n              toggleExpanded={updateExpanded}\n              selectItem={selectItem}\n              linkComponent={linkComponent}\n              renderItem={renderItem}\n              itemClassName={itemClassName}\n              itemContentClassName={itemContentClassName}\n              bulletClassName={bulletClassName}\n              textClassName={textClassName}\n              iconClassName={iconClassName}\n              badgeClassName={badgeClassName}\n              shortcutClassName={shortcutClassName}\n              trailingClassName={trailingClassName}\n              subListClassName={subListClassName}\n              separatorClassName={separatorClassName}\n              chevronClassName={chevronClassName}\n              externalIconClassName={externalIconClassName}\n              itemStyle={itemStyle}\n              itemContentStyle={itemContentStyle}\n              bulletStyle={bulletStyle}\n              textStyle={textStyle}\n              iconStyle={iconStyle}\n              badgeStyle={badgeStyle}\n              shortcutStyle={shortcutStyle}\n              trailingStyle={trailingStyle}\n              subListStyle={subListStyle}\n              separatorStyle={separatorStyle}\n            />\n          ))}\n        </ListTag>\n      )}\n    </div>\n  );\n};\n","\"use client\";\nimport { createContext } from 'react';\n\nconst LayoutGroupContext = createContext({});\n\nexport { LayoutGroupContext };\n//# sourceMappingURL=LayoutGroupContext.mjs.map\n","\"use client\";\nimport { useRef } from 'react';\n\n/**\n * Creates a constant value over the lifecycle of a component.\n *\n * Even if `useMemo` is provided an empty array as its final argument, it doesn't offer\n * a guarantee that it won't re-run for performance reasons later on. By using `useConstant`\n * you can ensure that initialisers don't execute twice or more.\n */\nfunction useConstant(init) {\n    const ref = useRef(null);\n    if (ref.current === null) {\n        ref.current = init();\n    }\n    return ref.current;\n}\n\nexport { useConstant };\n//# sourceMappingURL=use-constant.mjs.map\n","const isBrowser = typeof window !== \"undefined\";\n\nexport { isBrowser };\n//# sourceMappingURL=is-browser.mjs.map\n","\"use client\";\nimport { useLayoutEffect, useEffect } from 'react';\nimport { isBrowser } from './is-browser.mjs';\n\nconst useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect };\n//# sourceMappingURL=use-isomorphic-effect.mjs.map\n","\"use client\";\nimport { createContext } from 'react';\n\n/**\n * @public\n */\nconst PresenceContext = \n/* @__PURE__ */ createContext(null);\n\nexport { PresenceContext };\n//# sourceMappingURL=PresenceContext.mjs.map\n","function addUniqueItem(arr, item) {\n    if (arr.indexOf(item) === -1)\n        arr.push(item);\n}\nfunction removeItem(arr, item) {\n    const index = arr.indexOf(item);\n    if (index > -1)\n        arr.splice(index, 1);\n}\n// Adapted from array-move\nfunction moveItem([...arr], fromIndex, toIndex) {\n    const startIndex = fromIndex < 0 ? arr.length + fromIndex : fromIndex;\n    if (startIndex >= 0 && startIndex < arr.length) {\n        const endIndex = toIndex < 0 ? arr.length + toIndex : toIndex;\n        const [item] = arr.splice(fromIndex, 1);\n        arr.splice(endIndex, 0, item);\n    }\n    return arr;\n}\n\nexport { addUniqueItem, moveItem, removeItem };\n//# sourceMappingURL=array.mjs.map\n","const clamp = (min, max, v) => {\n    if (v > max)\n        return max;\n    if (v < min)\n        return min;\n    return v;\n};\n\nexport { clamp };\n//# sourceMappingURL=clamp.mjs.map\n","function formatErrorMessage(message, errorCode) {\n    return errorCode\n        ? `${message}. For more information and steps for solving, visit https://motion.dev/troubleshooting/${errorCode}`\n        : message;\n}\n\nexport { formatErrorMessage };\n//# sourceMappingURL=format-error-message.mjs.map\n","import { formatErrorMessage } from './format-error-message.mjs';\n\nlet warning = () => { };\nlet invariant = () => { };\nif (typeof process !== \"undefined\" &&\n    process.env?.NODE_ENV !== \"production\") {\n    warning = (check, message, errorCode) => {\n        if (!check && typeof console !== \"undefined\") {\n            console.warn(formatErrorMessage(message, errorCode));\n        }\n    };\n    invariant = (check, message, errorCode) => {\n        if (!check) {\n            throw new Error(formatErrorMessage(message, errorCode));\n        }\n    };\n}\n\nexport { invariant, warning };\n//# sourceMappingURL=errors.mjs.map\n","const MotionGlobalConfig = {};\n\nexport { MotionGlobalConfig };\n//# sourceMappingURL=global-config.mjs.map\n","/**\n * Check if value is a numerical string, ie a string that is purely a number eg \"100\" or \"-100.1\"\n */\nconst isNumericalString = (v) => /^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)$/u.test(v);\n\nexport { isNumericalString };\n//# sourceMappingURL=is-numerical-string.mjs.map\n","function isObject(value) {\n    return typeof value === \"object\" && value !== null;\n}\n\nexport { isObject };\n//# sourceMappingURL=is-object.mjs.map\n","/**\n * Check if the value is a zero value string like \"0px\" or \"0%\"\n */\nconst isZeroValueString = (v) => /^0[^.\\s]+$/u.test(v);\n\nexport { isZeroValueString };\n//# sourceMappingURL=is-zero-value-string.mjs.map\n","/*#__NO_SIDE_EFFECTS__*/\nfunction memo(callback) {\n    let result;\n    return () => {\n        if (result === undefined)\n            result = callback();\n        return result;\n    };\n}\n\nexport { memo };\n//# sourceMappingURL=memo.mjs.map\n","/*#__NO_SIDE_EFFECTS__*/\nconst noop = (any) => any;\n\nexport { noop };\n//# sourceMappingURL=noop.mjs.map\n","/**\n * Pipe\n * Compose other transformers to run linearily\n * pipe(min(20), max(40))\n * @param  {...functions} transformers\n * @return {function}\n */\nconst combineFunctions = (a, b) => (v) => b(a(v));\nconst pipe = (...transformers) => transformers.reduce(combineFunctions);\n\nexport { pipe };\n//# sourceMappingURL=pipe.mjs.map\n","/*\n  Progress within given range\n\n  Given a lower limit and an upper limit, we return the progress\n  (expressed as a number 0-1) represented by the given value, and\n  limit that progress to within 0-1.\n\n  @param [number]: Lower limit\n  @param [number]: Upper limit\n  @param [number]: Value to find progress within given range\n  @return [number]: Progress of value within range as expressed 0-1\n*/\n/*#__NO_SIDE_EFFECTS__*/\nconst progress = (from, to, value) => {\n    const toFromDifference = to - from;\n    return toFromDifference === 0 ? 1 : (value - from) / toFromDifference;\n};\n\nexport { progress };\n//# sourceMappingURL=progress.mjs.map\n","import { addUniqueItem, removeItem } from './array.mjs';\n\nclass SubscriptionManager {\n    constructor() {\n        this.subscriptions = [];\n    }\n    add(handler) {\n        addUniqueItem(this.subscriptions, handler);\n        return () => removeItem(this.subscriptions, handler);\n    }\n    notify(a, b, c) {\n        const numSubscriptions = this.subscriptions.length;\n        if (!numSubscriptions)\n            return;\n        if (numSubscriptions === 1) {\n            /**\n             * If there's only a single handler we can just call it without invoking a loop.\n             */\n            this.subscriptions[0](a, b, c);\n        }\n        else {\n            for (let i = 0; i < numSubscriptions; i++) {\n                /**\n                 * Check whether the handler exists before firing as it's possible\n                 * the subscriptions were modified during this loop running.\n                 */\n                const handler = this.subscriptions[i];\n                handler && handler(a, b, c);\n            }\n        }\n    }\n    getSize() {\n        return this.subscriptions.length;\n    }\n    clear() {\n        this.subscriptions.length = 0;\n    }\n}\n\nexport { SubscriptionManager };\n//# sourceMappingURL=subscription-manager.mjs.map\n","/**\n * Converts seconds to milliseconds\n *\n * @param seconds - Time in seconds.\n * @return milliseconds - Converted time in milliseconds.\n */\n/*#__NO_SIDE_EFFECTS__*/\nconst secondsToMilliseconds = (seconds) => seconds * 1000;\n/*#__NO_SIDE_EFFECTS__*/\nconst millisecondsToSeconds = (milliseconds) => milliseconds / 1000;\n\nexport { millisecondsToSeconds, secondsToMilliseconds };\n//# sourceMappingURL=time-conversion.mjs.map\n","/*\n  Convert velocity into velocity per second\n\n  @param [number]: Unit per frame\n  @param [number]: Frame duration in ms\n*/\nfunction velocityPerSecond(velocity, frameDuration) {\n    return frameDuration ? velocity * (1000 / frameDuration) : 0;\n}\n\nexport { velocityPerSecond };\n//# sourceMappingURL=velocity-per-second.mjs.map\n","import { formatErrorMessage } from './format-error-message.mjs';\n\nconst warned = new Set();\nfunction hasWarned(message) {\n    return warned.has(message);\n}\nfunction warnOnce(condition, message, errorCode) {\n    if (condition || warned.has(message))\n        return;\n    console.warn(formatErrorMessage(message, errorCode));\n    warned.add(message);\n}\n\nexport { hasWarned, warnOnce };\n//# sourceMappingURL=warn-once.mjs.map\n","import { noop } from '../noop.mjs';\n\n/*\n  Bezier function generator\n  This has been modified from Gaëtan Renaudeau's BezierEasing\n  https://github.com/gre/bezier-easing/blob/master/src/index.js\n  https://github.com/gre/bezier-easing/blob/master/LICENSE\n  \n  I've removed the newtonRaphsonIterate algo because in benchmarking it\n  wasn't noticeably faster than binarySubdivision, indeed removing it\n  usually improved times, depending on the curve.\n  I also removed the lookup table, as for the added bundle size and loop we're\n  only cutting ~4 or so subdivision iterations. I bumped the max iterations up\n  to 12 to compensate and this still tended to be faster for no perceivable\n  loss in accuracy.\n  Usage\n    const easeOut = cubicBezier(.17,.67,.83,.67);\n    const x = easeOut(0.5); // returns 0.627...\n*/\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nconst calcBezier = (t, a1, a2) => (((1.0 - 3.0 * a2 + 3.0 * a1) * t + (3.0 * a2 - 6.0 * a1)) * t + 3.0 * a1) *\n    t;\nconst subdivisionPrecision = 0.0000001;\nconst subdivisionMaxIterations = 12;\nfunction binarySubdivide(x, lowerBound, upperBound, mX1, mX2) {\n    let currentX;\n    let currentT;\n    let i = 0;\n    do {\n        currentT = lowerBound + (upperBound - lowerBound) / 2.0;\n        currentX = calcBezier(currentT, mX1, mX2) - x;\n        if (currentX > 0.0) {\n            upperBound = currentT;\n        }\n        else {\n            lowerBound = currentT;\n        }\n    } while (Math.abs(currentX) > subdivisionPrecision &&\n        ++i < subdivisionMaxIterations);\n    return currentT;\n}\nfunction cubicBezier(mX1, mY1, mX2, mY2) {\n    // If this is a linear gradient, return linear easing\n    if (mX1 === mY1 && mX2 === mY2)\n        return noop;\n    const getTForX = (aX) => binarySubdivide(aX, 0, 1, mX1, mX2);\n    // If animation is at start/end, return t without easing\n    return (t) => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2);\n}\n\nexport { cubicBezier };\n//# sourceMappingURL=cubic-bezier.mjs.map\n","// Accepts an easing function and returns a new one that outputs mirrored values for\n// the second half of the animation. Turns easeIn into easeInOut.\nconst mirrorEasing = (easing) => (p) => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2;\n\nexport { mirrorEasing };\n//# sourceMappingURL=mirror.mjs.map\n","// Accepts an easing function and returns a new one that outputs reversed values.\n// Turns easeIn into easeOut.\nconst reverseEasing = (easing) => (p) => 1 - easing(1 - p);\n\nexport { reverseEasing };\n//# sourceMappingURL=reverse.mjs.map\n","import { cubicBezier } from './cubic-bezier.mjs';\nimport { mirrorEasing } from './modifiers/mirror.mjs';\nimport { reverseEasing } from './modifiers/reverse.mjs';\n\nconst backOut = /*@__PURE__*/ cubicBezier(0.33, 1.53, 0.69, 0.99);\nconst backIn = /*@__PURE__*/ reverseEasing(backOut);\nconst backInOut = /*@__PURE__*/ mirrorEasing(backIn);\n\nexport { backIn, backInOut, backOut };\n//# sourceMappingURL=back.mjs.map\n","import { backIn } from './back.mjs';\n\nconst anticipate = (p) => p >= 1\n    ? 1\n    : (p *= 2) < 1\n        ? 0.5 * backIn(p)\n        : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));\n\nexport { anticipate };\n//# sourceMappingURL=anticipate.mjs.map\n","import { mirrorEasing } from './modifiers/mirror.mjs';\nimport { reverseEasing } from './modifiers/reverse.mjs';\n\nconst circIn = (p) => 1 - Math.sin(Math.acos(p));\nconst circOut = reverseEasing(circIn);\nconst circInOut = mirrorEasing(circIn);\n\nexport { circIn, circInOut, circOut };\n//# sourceMappingURL=circ.mjs.map\n","import { cubicBezier } from './cubic-bezier.mjs';\n\nconst easeIn = /*@__PURE__*/ cubicBezier(0.42, 0, 1, 1);\nconst easeOut = /*@__PURE__*/ cubicBezier(0, 0, 0.58, 1);\nconst easeInOut = /*@__PURE__*/ cubicBezier(0.42, 0, 0.58, 1);\n\nexport { easeIn, easeInOut, easeOut };\n//# sourceMappingURL=ease.mjs.map\n","const isEasingArray = (ease) => {\n    return Array.isArray(ease) && typeof ease[0] !== \"number\";\n};\n\nexport { isEasingArray };\n//# sourceMappingURL=is-easing-array.mjs.map\n","const isBezierDefinition = (easing) => Array.isArray(easing) && typeof easing[0] === \"number\";\n\nexport { isBezierDefinition };\n//# sourceMappingURL=is-bezier-definition.mjs.map\n","import { invariant } from '../../errors.mjs';\nimport { noop } from '../../noop.mjs';\nimport { anticipate } from '../anticipate.mjs';\nimport { backOut, backInOut, backIn } from '../back.mjs';\nimport { circOut, circInOut, circIn } from '../circ.mjs';\nimport { cubicBezier } from '../cubic-bezier.mjs';\nimport { easeOut, easeInOut, easeIn } from '../ease.mjs';\nimport { isBezierDefinition } from './is-bezier-definition.mjs';\n\nconst easingLookup = {\n    linear: noop,\n    easeIn,\n    easeInOut,\n    easeOut,\n    circIn,\n    circInOut,\n    circOut,\n    backIn,\n    backInOut,\n    backOut,\n    anticipate,\n};\nconst isValidEasing = (easing) => {\n    return typeof easing === \"string\";\n};\nconst easingDefinitionToFunction = (definition) => {\n    if (isBezierDefinition(definition)) {\n        // If cubic bezier definition, create bezier curve\n        invariant(definition.length === 4, `Cubic bezier arrays must contain four numerical values.`, \"cubic-bezier-length\");\n        const [x1, y1, x2, y2] = definition;\n        return cubicBezier(x1, y1, x2, y2);\n    }\n    else if (isValidEasing(definition)) {\n        // Else lookup from table\n        invariant(easingLookup[definition] !== undefined, `Invalid easing type '${definition}'`, \"invalid-easing-type\");\n        return easingLookup[definition];\n    }\n    return definition;\n};\n\nexport { easingDefinitionToFunction };\n//# sourceMappingURL=map.mjs.map\n","const stepsOrder = [\n    \"setup\", // Compute\n    \"read\", // Read\n    \"resolveKeyframes\", // Write/Read/Write/Read\n    \"preUpdate\", // Compute\n    \"update\", // Compute\n    \"preRender\", // Compute\n    \"render\", // Write\n    \"postRender\", // Compute\n];\n\nexport { stepsOrder };\n//# sourceMappingURL=order.mjs.map\n","import { statsBuffer } from '../stats/buffer.mjs';\n\nfunction createRenderStep(runNextFrame, stepName) {\n    /**\n     * We create and reuse two queues, one to queue jobs for the current frame\n     * and one for the next. We reuse to avoid triggering GC after x frames.\n     */\n    let thisFrame = new Set();\n    let nextFrame = new Set();\n    /**\n     * Track whether we're currently processing jobs in this step. This way\n     * we can decide whether to schedule new jobs for this frame or next.\n     */\n    let isProcessing = false;\n    let flushNextFrame = false;\n    /**\n     * A set of processes which were marked keepAlive when scheduled.\n     */\n    const toKeepAlive = new WeakSet();\n    let latestFrameData = {\n        delta: 0.0,\n        timestamp: 0.0,\n        isProcessing: false,\n    };\n    let numCalls = 0;\n    function triggerCallback(callback) {\n        if (toKeepAlive.has(callback)) {\n            step.schedule(callback);\n            runNextFrame();\n        }\n        numCalls++;\n        callback(latestFrameData);\n    }\n    const step = {\n        /**\n         * Schedule a process to run on the next frame.\n         */\n        schedule: (callback, keepAlive = false, immediate = false) => {\n            const addToCurrentFrame = immediate && isProcessing;\n            const queue = addToCurrentFrame ? thisFrame : nextFrame;\n            if (keepAlive)\n                toKeepAlive.add(callback);\n            queue.add(callback);\n            return callback;\n        },\n        /**\n         * Cancel the provided callback from running on the next frame.\n         */\n        cancel: (callback) => {\n            nextFrame.delete(callback);\n            toKeepAlive.delete(callback);\n        },\n        /**\n         * Execute all schedule callbacks.\n         */\n        process: (frameData) => {\n            latestFrameData = frameData;\n            /**\n             * If we're already processing we've probably been triggered by a flushSync\n             * inside an existing process. Instead of executing, mark flushNextFrame\n             * as true and ensure we flush the following frame at the end of this one.\n             */\n            if (isProcessing) {\n                flushNextFrame = true;\n                return;\n            }\n            isProcessing = true;\n            // Swap this frame and the next to avoid GC\n            const prevFrame = thisFrame;\n            thisFrame = nextFrame;\n            nextFrame = prevFrame;\n            // Execute this frame\n            thisFrame.forEach(triggerCallback);\n            /**\n             * If we're recording stats then\n             */\n            if (stepName && statsBuffer.value) {\n                statsBuffer.value.frameloop[stepName].push(numCalls);\n            }\n            numCalls = 0;\n            // Clear the frame so no callbacks remain. This is to avoid\n            // memory leaks should this render step not run for a while.\n            thisFrame.clear();\n            isProcessing = false;\n            if (flushNextFrame) {\n                flushNextFrame = false;\n                step.process(frameData);\n            }\n        },\n    };\n    return step;\n}\n\nexport { createRenderStep };\n//# sourceMappingURL=render-step.mjs.map\n","import { MotionGlobalConfig } from 'motion-utils';\nimport { stepsOrder } from './order.mjs';\nimport { createRenderStep } from './render-step.mjs';\n\nconst maxElapsed = 40;\nfunction createRenderBatcher(scheduleNextBatch, allowKeepAlive) {\n    let runNextFrame = false;\n    let useDefaultElapsed = true;\n    const state = {\n        delta: 0.0,\n        timestamp: 0.0,\n        isProcessing: false,\n    };\n    const flagRunNextFrame = () => (runNextFrame = true);\n    const steps = stepsOrder.reduce((acc, key) => {\n        acc[key] = createRenderStep(flagRunNextFrame, allowKeepAlive ? key : undefined);\n        return acc;\n    }, {});\n    const { setup, read, resolveKeyframes, preUpdate, update, preRender, render, postRender, } = steps;\n    const processBatch = () => {\n        const useManualTiming = MotionGlobalConfig.useManualTiming;\n        const timestamp = useManualTiming\n            ? state.timestamp\n            : performance.now();\n        runNextFrame = false;\n        if (!useManualTiming) {\n            state.delta = useDefaultElapsed\n                ? 1000 / 60\n                : Math.max(Math.min(timestamp - state.timestamp, maxElapsed), 1);\n        }\n        state.timestamp = timestamp;\n        state.isProcessing = true;\n        // Unrolled render loop for better per-frame performance\n        setup.process(state);\n        read.process(state);\n        resolveKeyframes.process(state);\n        preUpdate.process(state);\n        update.process(state);\n        preRender.process(state);\n        render.process(state);\n        postRender.process(state);\n        state.isProcessing = false;\n        if (runNextFrame && allowKeepAlive) {\n            useDefaultElapsed = false;\n            scheduleNextBatch(processBatch);\n        }\n    };\n    const wake = () => {\n        runNextFrame = true;\n        useDefaultElapsed = true;\n        if (!state.isProcessing) {\n            scheduleNextBatch(processBatch);\n        }\n    };\n    const schedule = stepsOrder.reduce((acc, key) => {\n        const step = steps[key];\n        acc[key] = (process, keepAlive = false, immediate = false) => {\n            if (!runNextFrame)\n                wake();\n            return step.schedule(process, keepAlive, immediate);\n        };\n        return acc;\n    }, {});\n    const cancel = (process) => {\n        for (let i = 0; i < stepsOrder.length; i++) {\n            steps[stepsOrder[i]].cancel(process);\n        }\n    };\n    return { schedule, cancel, state, steps };\n}\n\nexport { createRenderBatcher };\n//# sourceMappingURL=batcher.mjs.map\n","import { noop } from 'motion-utils';\nimport { createRenderBatcher } from './batcher.mjs';\n\nconst { schedule: frame, cancel: cancelFrame, state: frameData, steps: frameSteps, } = /* @__PURE__ */ createRenderBatcher(typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : noop, true);\n\nexport { cancelFrame, frame, frameData, frameSteps };\n//# sourceMappingURL=frame.mjs.map\n","import { MotionGlobalConfig } from 'motion-utils';\nimport { frameData } from './frame.mjs';\n\nlet now;\nfunction clearTime() {\n    now = undefined;\n}\n/**\n * An eventloop-synchronous alternative to performance.now().\n *\n * Ensures that time measurements remain consistent within a synchronous context.\n * Usually calling performance.now() twice within the same synchronous context\n * will return different values which isn't useful for animations when we're usually\n * trying to sync animations to the same frame.\n */\nconst time = {\n    now: () => {\n        if (now === undefined) {\n            time.set(frameData.isProcessing || MotionGlobalConfig.useManualTiming\n                ? frameData.timestamp\n                : performance.now());\n        }\n        return now;\n    },\n    set: (newTime) => {\n        now = newTime;\n        queueMicrotask(clearTime);\n    },\n};\n\nexport { time };\n//# sourceMappingURL=sync-time.mjs.map\n","const checkStringStartsWith = (token) => (key) => typeof key === \"string\" && key.startsWith(token);\nconst isCSSVariableName = \n/*@__PURE__*/ checkStringStartsWith(\"--\");\nconst startsAsVariableToken = \n/*@__PURE__*/ checkStringStartsWith(\"var(--\");\nconst isCSSVariableToken = (value) => {\n    const startsWithToken = startsAsVariableToken(value);\n    if (!startsWithToken)\n        return false;\n    // Ensure any comments are stripped from the value as this can harm performance of the regex.\n    return singleCssVariableRegex.test(value.split(\"/*\")[0].trim());\n};\nconst singleCssVariableRegex = /var\\(--(?:[\\w-]+\\s*|[\\w-]+\\s*,(?:\\s*[^)(\\s]|\\s*\\((?:[^)(]|\\([^)(]*\\))*\\))+\\s*)\\)$/iu;\n/**\n * Check if a value contains a CSS variable anywhere (e.g. inside calc()).\n * Unlike isCSSVariableToken which checks if the value IS a var() token,\n * this checks if the value CONTAINS var() somewhere in the string.\n */\nfunction containsCSSVariable(value) {\n    if (typeof value !== \"string\")\n        return false;\n    // Strip comments to avoid false positives\n    return value.split(\"/*\")[0].includes(\"var(--\");\n}\n\nexport { containsCSSVariable, isCSSVariableName, isCSSVariableToken };\n//# sourceMappingURL=is-css-variable.mjs.map\n","import { clamp } from 'motion-utils';\n\nconst number = {\n    test: (v) => typeof v === \"number\",\n    parse: parseFloat,\n    transform: (v) => v,\n};\nconst alpha = {\n    ...number,\n    transform: (v) => clamp(0, 1, v),\n};\nconst scale = {\n    ...number,\n    default: 1,\n};\n\nexport { alpha, number, scale };\n//# sourceMappingURL=index.mjs.map\n","// If this number is a decimal, make it just five decimal places\n// to avoid exponents\nconst sanitize = (v) => Math.round(v * 100000) / 100000;\n\nexport { sanitize };\n//# sourceMappingURL=sanitize.mjs.map\n","const floatRegex = /-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/gu;\n\nexport { floatRegex };\n//# sourceMappingURL=float-regex.mjs.map\n","function isNullish(v) {\n    return v == null;\n}\n\nexport { isNullish };\n//# sourceMappingURL=is-nullish.mjs.map\n","const singleColorRegex = /^(?:#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\))$/iu;\n\nexport { singleColorRegex };\n//# sourceMappingURL=single-color-regex.mjs.map\n","import { floatRegex } from '../utils/float-regex.mjs';\nimport { isNullish } from '../utils/is-nullish.mjs';\nimport { singleColorRegex } from '../utils/single-color-regex.mjs';\n\n/**\n * Returns true if the provided string is a color, ie rgba(0,0,0,0) or #000,\n * but false if a number or multiple colors\n */\nconst isColorString = (type, testProp) => (v) => {\n    return Boolean((typeof v === \"string\" &&\n        singleColorRegex.test(v) &&\n        v.startsWith(type)) ||\n        (testProp &&\n            !isNullish(v) &&\n            Object.prototype.hasOwnProperty.call(v, testProp)));\n};\nconst splitColor = (aName, bName, cName) => (v) => {\n    if (typeof v !== \"string\")\n        return v;\n    const [a, b, c, alpha] = v.match(floatRegex);\n    return {\n        [aName]: parseFloat(a),\n        [bName]: parseFloat(b),\n        [cName]: parseFloat(c),\n        alpha: alpha !== undefined ? parseFloat(alpha) : 1,\n    };\n};\n\nexport { isColorString, splitColor };\n//# sourceMappingURL=utils.mjs.map\n","import { clamp } from 'motion-utils';\nimport { number, alpha } from '../numbers/index.mjs';\nimport { sanitize } from '../utils/sanitize.mjs';\nimport { splitColor, isColorString } from './utils.mjs';\n\nconst clampRgbUnit = (v) => clamp(0, 255, v);\nconst rgbUnit = {\n    ...number,\n    transform: (v) => Math.round(clampRgbUnit(v)),\n};\nconst rgba = {\n    test: /*@__PURE__*/ isColorString(\"rgb\", \"red\"),\n    parse: /*@__PURE__*/ splitColor(\"red\", \"green\", \"blue\"),\n    transform: ({ red, green, blue, alpha: alpha$1 = 1 }) => \"rgba(\" +\n        rgbUnit.transform(red) +\n        \", \" +\n        rgbUnit.transform(green) +\n        \", \" +\n        rgbUnit.transform(blue) +\n        \", \" +\n        sanitize(alpha.transform(alpha$1)) +\n        \")\",\n};\n\nexport { rgbUnit, rgba };\n//# sourceMappingURL=rgba.mjs.map\n","import { rgba } from './rgba.mjs';\nimport { isColorString } from './utils.mjs';\n\nfunction parseHex(v) {\n    let r = \"\";\n    let g = \"\";\n    let b = \"\";\n    let a = \"\";\n    // If we have 6 characters, ie #FF0000\n    if (v.length > 5) {\n        r = v.substring(1, 3);\n        g = v.substring(3, 5);\n        b = v.substring(5, 7);\n        a = v.substring(7, 9);\n        // Or we have 3 characters, ie #F00\n    }\n    else {\n        r = v.substring(1, 2);\n        g = v.substring(2, 3);\n        b = v.substring(3, 4);\n        a = v.substring(4, 5);\n        r += r;\n        g += g;\n        b += b;\n        a += a;\n    }\n    return {\n        red: parseInt(r, 16),\n        green: parseInt(g, 16),\n        blue: parseInt(b, 16),\n        alpha: a ? parseInt(a, 16) / 255 : 1,\n    };\n}\nconst hex = {\n    test: /*@__PURE__*/ isColorString(\"#\"),\n    parse: parseHex,\n    transform: rgba.transform,\n};\n\nexport { hex };\n//# sourceMappingURL=hex.mjs.map\n","/*#__NO_SIDE_EFFECTS__*/\nconst createUnitType = (unit) => ({\n    test: (v) => typeof v === \"string\" && v.endsWith(unit) && v.split(\" \").length === 1,\n    parse: parseFloat,\n    transform: (v) => `${v}${unit}`,\n});\nconst degrees = /*@__PURE__*/ createUnitType(\"deg\");\nconst percent = /*@__PURE__*/ createUnitType(\"%\");\nconst px = /*@__PURE__*/ createUnitType(\"px\");\nconst vh = /*@__PURE__*/ createUnitType(\"vh\");\nconst vw = /*@__PURE__*/ createUnitType(\"vw\");\nconst progressPercentage = /*@__PURE__*/ (() => ({\n    ...percent,\n    parse: (v) => percent.parse(v) / 100,\n    transform: (v) => percent.transform(v * 100),\n}))();\n\nexport { degrees, percent, progressPercentage, px, vh, vw };\n//# sourceMappingURL=units.mjs.map\n","import { alpha } from '../numbers/index.mjs';\nimport { percent } from '../numbers/units.mjs';\nimport { sanitize } from '../utils/sanitize.mjs';\nimport { splitColor, isColorString } from './utils.mjs';\n\nconst hsla = {\n    test: /*@__PURE__*/ isColorString(\"hsl\", \"hue\"),\n    parse: /*@__PURE__*/ splitColor(\"hue\", \"saturation\", \"lightness\"),\n    transform: ({ hue, saturation, lightness, alpha: alpha$1 = 1 }) => {\n        return (\"hsla(\" +\n            Math.round(hue) +\n            \", \" +\n            percent.transform(sanitize(saturation)) +\n            \", \" +\n            percent.transform(sanitize(lightness)) +\n            \", \" +\n            sanitize(alpha.transform(alpha$1)) +\n            \")\");\n    },\n};\n\nexport { hsla };\n//# sourceMappingURL=hsla.mjs.map\n","import { hex } from './hex.mjs';\nimport { hsla } from './hsla.mjs';\nimport { rgba } from './rgba.mjs';\n\nconst color = {\n    test: (v) => rgba.test(v) || hex.test(v) || hsla.test(v),\n    parse: (v) => {\n        if (rgba.test(v)) {\n            return rgba.parse(v);\n        }\n        else if (hsla.test(v)) {\n            return hsla.parse(v);\n        }\n        else {\n            return hex.parse(v);\n        }\n    },\n    transform: (v) => {\n        return typeof v === \"string\"\n            ? v\n            : v.hasOwnProperty(\"red\")\n                ? rgba.transform(v)\n                : hsla.transform(v);\n    },\n    getAnimatableNone: (v) => {\n        const parsed = color.parse(v);\n        parsed.alpha = 0;\n        return color.transform(parsed);\n    },\n};\n\nexport { color };\n//# sourceMappingURL=index.mjs.map\n","const colorRegex = /(?:#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\))/giu;\n\nexport { colorRegex };\n//# sourceMappingURL=color-regex.mjs.map\n","import { color } from '../color/index.mjs';\nimport { colorRegex } from '../utils/color-regex.mjs';\nimport { floatRegex } from '../utils/float-regex.mjs';\nimport { sanitize } from '../utils/sanitize.mjs';\n\nfunction test(v) {\n    return (isNaN(v) &&\n        typeof v === \"string\" &&\n        (v.match(floatRegex)?.length || 0) +\n            (v.match(colorRegex)?.length || 0) >\n            0);\n}\nconst NUMBER_TOKEN = \"number\";\nconst COLOR_TOKEN = \"color\";\nconst VAR_TOKEN = \"var\";\nconst VAR_FUNCTION_TOKEN = \"var(\";\nconst SPLIT_TOKEN = \"${}\";\n// this regex consists of the `singleCssVariableRegex|rgbHSLValueRegex|digitRegex`\nconst complexRegex = /var\\s*\\(\\s*--(?:[\\w-]+\\s*|[\\w-]+\\s*,(?:\\s*[^)(\\s]|\\s*\\((?:[^)(]|\\([^)(]*\\))*\\))+\\s*)\\)|#[\\da-f]{3,8}|(?:rgb|hsl)a?\\((?:-?[\\d.]+%?[,\\s]+){2}-?[\\d.]+%?\\s*(?:[,/]\\s*)?(?:\\b\\d+(?:\\.\\d+)?|\\.\\d+)?%?\\)|-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)/giu;\nfunction analyseComplexValue(value) {\n    const originalValue = value.toString();\n    const values = [];\n    const indexes = {\n        color: [],\n        number: [],\n        var: [],\n    };\n    const types = [];\n    let i = 0;\n    const tokenised = originalValue.replace(complexRegex, (parsedValue) => {\n        if (color.test(parsedValue)) {\n            indexes.color.push(i);\n            types.push(COLOR_TOKEN);\n            values.push(color.parse(parsedValue));\n        }\n        else if (parsedValue.startsWith(VAR_FUNCTION_TOKEN)) {\n            indexes.var.push(i);\n            types.push(VAR_TOKEN);\n            values.push(parsedValue);\n        }\n        else {\n            indexes.number.push(i);\n            types.push(NUMBER_TOKEN);\n            values.push(parseFloat(parsedValue));\n        }\n        ++i;\n        return SPLIT_TOKEN;\n    });\n    const split = tokenised.split(SPLIT_TOKEN);\n    return { values, split, indexes, types };\n}\nfunction parseComplexValue(v) {\n    return analyseComplexValue(v).values;\n}\nfunction buildTransformer({ split, types }) {\n    const numSections = split.length;\n    return (v) => {\n        let output = \"\";\n        for (let i = 0; i < numSections; i++) {\n            output += split[i];\n            if (v[i] !== undefined) {\n                const type = types[i];\n                if (type === NUMBER_TOKEN) {\n                    output += sanitize(v[i]);\n                }\n                else if (type === COLOR_TOKEN) {\n                    output += color.transform(v[i]);\n                }\n                else {\n                    output += v[i];\n                }\n            }\n        }\n        return output;\n    };\n}\nfunction createTransformer(source) {\n    return buildTransformer(analyseComplexValue(source));\n}\nconst convertNumbersToZero = (v) => typeof v === \"number\" ? 0 : color.test(v) ? color.getAnimatableNone(v) : v;\n/**\n * Convert a parsed value to its zero equivalent, but preserve numbers\n * that act as divisors in CSS calc() expressions.\n *\n * analyseComplexValue extracts numbers from CSS strings and puts the\n * surrounding text into a `split` template array. For example:\n *   \"calc(var(--gap) / 5)\"  →  values: [var(--gap), 5]\n *                               split:  [\"calc(\", \" / \", \")\"]\n *\n * When building a zero-equivalent for animation, naively zeroing all\n * numbers turns the divisor into 0 → \"calc(var(--gap) / 0)\" → NaN.\n * We detect this by checking whether the text preceding a number\n * (split[i]) ends with \"/\" — the CSS calc division operator.\n */\nconst convertToZero = (value, splitBefore) => {\n    if (typeof value === \"number\") {\n        return splitBefore?.trim().endsWith(\"/\") ? value : 0;\n    }\n    return convertNumbersToZero(value);\n};\nfunction getAnimatableNone(v) {\n    const info = analyseComplexValue(v);\n    const transformer = buildTransformer(info);\n    return transformer(info.values.map((value, i) => convertToZero(value, info.split[i])));\n}\nconst complex = {\n    test,\n    parse: parseComplexValue,\n    createTransformer,\n    getAnimatableNone,\n};\n\nexport { analyseComplexValue, complex };\n//# sourceMappingURL=index.mjs.map\n","// Adapted from https://gist.github.com/mjackson/5311256\nfunction hueToRgb(p, q, t) {\n    if (t < 0)\n        t += 1;\n    if (t > 1)\n        t -= 1;\n    if (t < 1 / 6)\n        return p + (q - p) * 6 * t;\n    if (t < 1 / 2)\n        return q;\n    if (t < 2 / 3)\n        return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n}\nfunction hslaToRgba({ hue, saturation, lightness, alpha }) {\n    hue /= 360;\n    saturation /= 100;\n    lightness /= 100;\n    let red = 0;\n    let green = 0;\n    let blue = 0;\n    if (!saturation) {\n        red = green = blue = lightness;\n    }\n    else {\n        const q = lightness < 0.5\n            ? lightness * (1 + saturation)\n            : lightness + saturation - lightness * saturation;\n        const p = 2 * lightness - q;\n        red = hueToRgb(p, q, hue + 1 / 3);\n        green = hueToRgb(p, q, hue);\n        blue = hueToRgb(p, q, hue - 1 / 3);\n    }\n    return {\n        red: Math.round(red * 255),\n        green: Math.round(green * 255),\n        blue: Math.round(blue * 255),\n        alpha,\n    };\n}\n\nexport { hslaToRgba };\n//# sourceMappingURL=hsla-to-rgba.mjs.map\n","function mixImmediate(a, b) {\n    return (p) => (p > 0 ? b : a);\n}\n\nexport { mixImmediate };\n//# sourceMappingURL=immediate.mjs.map\n","/*\n  Value in range from progress\n\n  Given a lower limit and an upper limit, we return the value within\n  that range as expressed by progress (usually a number from 0 to 1)\n\n  So progress = 0.5 would change\n\n  from -------- to\n\n  to\n\n  from ---- to\n\n  E.g. from = 10, to = 20, progress = 0.5 => 15\n\n  @param [number]: Lower limit of range\n  @param [number]: Upper limit of range\n  @param [number]: The progress between lower and upper limits expressed 0-1\n  @return [number]: Value as calculated from progress within range (not limited within range)\n*/\nconst mixNumber = (from, to, progress) => {\n    return from + (to - from) * progress;\n};\n\nexport { mixNumber };\n//# sourceMappingURL=number.mjs.map\n","import { warning } from 'motion-utils';\nimport { hex } from '../../value/types/color/hex.mjs';\nimport { hsla } from '../../value/types/color/hsla.mjs';\nimport { hslaToRgba } from '../../value/types/color/hsla-to-rgba.mjs';\nimport { rgba } from '../../value/types/color/rgba.mjs';\nimport { mixImmediate } from './immediate.mjs';\nimport { mixNumber } from './number.mjs';\n\n// Linear color space blending\n// Explained https://www.youtube.com/watch?v=LKnqECcg6Gw\n// Demonstrated http://codepen.io/osublake/pen/xGVVaN\nconst mixLinearColor = (from, to, v) => {\n    const fromExpo = from * from;\n    const expo = v * (to * to - fromExpo) + fromExpo;\n    return expo < 0 ? 0 : Math.sqrt(expo);\n};\nconst colorTypes = [hex, rgba, hsla];\nconst getColorType = (v) => colorTypes.find((type) => type.test(v));\nfunction asRGBA(color) {\n    const type = getColorType(color);\n    warning(Boolean(type), `'${color}' is not an animatable color. Use the equivalent color code instead.`, \"color-not-animatable\");\n    if (!Boolean(type))\n        return false;\n    let model = type.parse(color);\n    if (type === hsla) {\n        // TODO Remove this cast - needed since Motion's stricter typing\n        model = hslaToRgba(model);\n    }\n    return model;\n}\nconst mixColor = (from, to) => {\n    const fromRGBA = asRGBA(from);\n    const toRGBA = asRGBA(to);\n    if (!fromRGBA || !toRGBA) {\n        return mixImmediate(from, to);\n    }\n    const blended = { ...fromRGBA };\n    return (v) => {\n        blended.red = mixLinearColor(fromRGBA.red, toRGBA.red, v);\n        blended.green = mixLinearColor(fromRGBA.green, toRGBA.green, v);\n        blended.blue = mixLinearColor(fromRGBA.blue, toRGBA.blue, v);\n        blended.alpha = mixNumber(fromRGBA.alpha, toRGBA.alpha, v);\n        return rgba.transform(blended);\n    };\n};\n\nexport { mixColor, mixLinearColor };\n//# sourceMappingURL=color.mjs.map\n","const invisibleValues = new Set([\"none\", \"hidden\"]);\n/**\n * Returns a function that, when provided a progress value between 0 and 1,\n * will return the \"none\" or \"hidden\" string only when the progress is that of\n * the origin or target.\n */\nfunction mixVisibility(origin, target) {\n    if (invisibleValues.has(origin)) {\n        return (p) => (p <= 0 ? origin : target);\n    }\n    else {\n        return (p) => (p >= 1 ? target : origin);\n    }\n}\n\nexport { invisibleValues, mixVisibility };\n//# sourceMappingURL=visibility.mjs.map\n","import { pipe, warning } from 'motion-utils';\nimport { isCSSVariableToken } from '../../animation/utils/is-css-variable.mjs';\nimport { color } from '../../value/types/color/index.mjs';\nimport { complex, analyseComplexValue } from '../../value/types/complex/index.mjs';\nimport { mixColor } from './color.mjs';\nimport { mixImmediate } from './immediate.mjs';\nimport { mixNumber as mixNumber$1 } from './number.mjs';\nimport { invisibleValues, mixVisibility } from './visibility.mjs';\n\nfunction mixNumber(a, b) {\n    return (p) => mixNumber$1(a, b, p);\n}\nfunction getMixer(a) {\n    if (typeof a === \"number\") {\n        return mixNumber;\n    }\n    else if (typeof a === \"string\") {\n        return isCSSVariableToken(a)\n            ? mixImmediate\n            : color.test(a)\n                ? mixColor\n                : mixComplex;\n    }\n    else if (Array.isArray(a)) {\n        return mixArray;\n    }\n    else if (typeof a === \"object\") {\n        return color.test(a) ? mixColor : mixObject;\n    }\n    return mixImmediate;\n}\nfunction mixArray(a, b) {\n    const output = [...a];\n    const numValues = output.length;\n    const blendValue = a.map((v, i) => getMixer(v)(v, b[i]));\n    return (p) => {\n        for (let i = 0; i < numValues; i++) {\n            output[i] = blendValue[i](p);\n        }\n        return output;\n    };\n}\nfunction mixObject(a, b) {\n    const output = { ...a, ...b };\n    const blendValue = {};\n    for (const key in output) {\n        if (a[key] !== undefined && b[key] !== undefined) {\n            blendValue[key] = getMixer(a[key])(a[key], b[key]);\n        }\n    }\n    return (v) => {\n        for (const key in blendValue) {\n            output[key] = blendValue[key](v);\n        }\n        return output;\n    };\n}\nfunction matchOrder(origin, target) {\n    const orderedOrigin = [];\n    const pointers = { color: 0, var: 0, number: 0 };\n    for (let i = 0; i < target.values.length; i++) {\n        const type = target.types[i];\n        const originIndex = origin.indexes[type][pointers[type]];\n        const originValue = origin.values[originIndex] ?? 0;\n        orderedOrigin[i] = originValue;\n        pointers[type]++;\n    }\n    return orderedOrigin;\n}\nconst mixComplex = (origin, target) => {\n    const template = complex.createTransformer(target);\n    const originStats = analyseComplexValue(origin);\n    const targetStats = analyseComplexValue(target);\n    const canInterpolate = originStats.indexes.var.length === targetStats.indexes.var.length &&\n        originStats.indexes.color.length === targetStats.indexes.color.length &&\n        originStats.indexes.number.length >= targetStats.indexes.number.length;\n    if (canInterpolate) {\n        if ((invisibleValues.has(origin) &&\n            !targetStats.values.length) ||\n            (invisibleValues.has(target) &&\n                !originStats.values.length)) {\n            return mixVisibility(origin, target);\n        }\n        return pipe(mixArray(matchOrder(originStats, targetStats), targetStats.values), template);\n    }\n    else {\n        warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`, \"complex-values-different\");\n        return mixImmediate(origin, target);\n    }\n};\n\nexport { getMixer, mixArray, mixComplex, mixObject };\n//# sourceMappingURL=complex.mjs.map\n","import { getMixer } from './complex.mjs';\nimport { mixNumber } from './number.mjs';\n\nfunction mix(from, to, p) {\n    if (typeof from === \"number\" &&\n        typeof to === \"number\" &&\n        typeof p === \"number\") {\n        return mixNumber(from, to, p);\n    }\n    const mixer = getMixer(from);\n    return mixer(from, to);\n}\n\nexport { mix };\n//# sourceMappingURL=index.mjs.map\n","import { time } from '../../frameloop/sync-time.mjs';\nimport { frameData, cancelFrame, frame } from '../../frameloop/frame.mjs';\n\nconst frameloopDriver = (update) => {\n    const passTimestamp = ({ timestamp }) => update(timestamp);\n    return {\n        start: (keepAlive = true) => frame.update(passTimestamp, keepAlive),\n        stop: () => cancelFrame(passTimestamp),\n        /**\n         * If we're processing this frame we can use the\n         * framelocked timestamp to keep things in sync.\n         */\n        now: () => (frameData.isProcessing ? frameData.timestamp : time.now()),\n    };\n};\n\nexport { frameloopDriver };\n//# sourceMappingURL=frame.mjs.map\n","const generateLinearEasing = (easing, duration, // as milliseconds\nresolution = 10 // as milliseconds\n) => {\n    let points = \"\";\n    const numPoints = Math.max(Math.round(duration / resolution), 2);\n    for (let i = 0; i < numPoints; i++) {\n        points += Math.round(easing(i / (numPoints - 1)) * 10000) / 10000 + \", \";\n    }\n    return `linear(${points.substring(0, points.length - 2)})`;\n};\n\nexport { generateLinearEasing };\n//# sourceMappingURL=linear.mjs.map\n","/**\n * Implement a practical max duration for keyframe generation\n * to prevent infinite loops\n */\nconst maxGeneratorDuration = 20000;\nfunction calcGeneratorDuration(generator) {\n    let duration = 0;\n    const timeStep = 50;\n    let state = generator.next(duration);\n    while (!state.done && duration < maxGeneratorDuration) {\n        duration += timeStep;\n        state = generator.next(duration);\n    }\n    return duration >= maxGeneratorDuration ? Infinity : duration;\n}\n\nexport { calcGeneratorDuration, maxGeneratorDuration };\n//# sourceMappingURL=calc-duration.mjs.map\n","import { millisecondsToSeconds } from 'motion-utils';\nimport { calcGeneratorDuration, maxGeneratorDuration } from './calc-duration.mjs';\n\n/**\n * Create a progress => progress easing function from a generator.\n */\nfunction createGeneratorEasing(options, scale = 100, createGenerator) {\n    const generator = createGenerator({ ...options, keyframes: [0, scale] });\n    const duration = Math.min(calcGeneratorDuration(generator), maxGeneratorDuration);\n    return {\n        type: \"keyframes\",\n        ease: (progress) => {\n            return generator.next(duration * progress).value / scale;\n        },\n        duration: millisecondsToSeconds(duration),\n    };\n}\n\nexport { createGeneratorEasing };\n//# sourceMappingURL=create-generator-easing.mjs.map\n","import { millisecondsToSeconds, clamp, secondsToMilliseconds, warning } from 'motion-utils';\nimport { generateLinearEasing } from '../waapi/utils/linear.mjs';\nimport { calcGeneratorDuration, maxGeneratorDuration } from './utils/calc-duration.mjs';\nimport { createGeneratorEasing } from './utils/create-generator-easing.mjs';\n\nconst springDefaults = {\n    // Default spring physics\n    stiffness: 100,\n    damping: 10,\n    mass: 1.0,\n    velocity: 0.0,\n    // Default duration/bounce-based options\n    duration: 800, // in ms\n    bounce: 0.3,\n    visualDuration: 0.3, // in seconds\n    // Rest thresholds\n    restSpeed: {\n        granular: 0.01,\n        default: 2,\n    },\n    restDelta: {\n        granular: 0.005,\n        default: 0.5,\n    },\n    // Limits\n    minDuration: 0.01, // in seconds\n    maxDuration: 10.0, // in seconds\n    minDamping: 0.05,\n    maxDamping: 1,\n};\nfunction calcAngularFreq(undampedFreq, dampingRatio) {\n    return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio);\n}\nconst rootIterations = 12;\nfunction approximateRoot(envelope, derivative, initialGuess) {\n    let result = initialGuess;\n    for (let i = 1; i < rootIterations; i++) {\n        result = result - envelope(result) / derivative(result);\n    }\n    return result;\n}\n/**\n * This is ported from the Framer implementation of duration-based spring resolution.\n */\nconst safeMin = 0.001;\nfunction findSpring({ duration = springDefaults.duration, bounce = springDefaults.bounce, velocity = springDefaults.velocity, mass = springDefaults.mass, }) {\n    let envelope;\n    let derivative;\n    warning(duration <= secondsToMilliseconds(springDefaults.maxDuration), \"Spring duration must be 10 seconds or less\", \"spring-duration-limit\");\n    let dampingRatio = 1 - bounce;\n    /**\n     * Restrict dampingRatio and duration to within acceptable ranges.\n     */\n    dampingRatio = clamp(springDefaults.minDamping, springDefaults.maxDamping, dampingRatio);\n    duration = clamp(springDefaults.minDuration, springDefaults.maxDuration, millisecondsToSeconds(duration));\n    if (dampingRatio < 1) {\n        /**\n         * Underdamped spring\n         */\n        envelope = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio;\n            const delta = exponentialDecay * duration;\n            const a = exponentialDecay - velocity;\n            const b = calcAngularFreq(undampedFreq, dampingRatio);\n            const c = Math.exp(-delta);\n            return safeMin - (a / b) * c;\n        };\n        derivative = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio;\n            const delta = exponentialDecay * duration;\n            const d = delta * velocity + velocity;\n            const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration;\n            const f = Math.exp(-delta);\n            const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio);\n            const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1;\n            return (factor * ((d - e) * f)) / g;\n        };\n    }\n    else {\n        /**\n         * Critically-damped spring\n         */\n        envelope = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration);\n            const b = (undampedFreq - velocity) * duration + 1;\n            return -safeMin + a * b;\n        };\n        derivative = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration);\n            const b = (velocity - undampedFreq) * (duration * duration);\n            return a * b;\n        };\n    }\n    const initialGuess = 5 / duration;\n    const undampedFreq = approximateRoot(envelope, derivative, initialGuess);\n    duration = secondsToMilliseconds(duration);\n    if (isNaN(undampedFreq)) {\n        return {\n            stiffness: springDefaults.stiffness,\n            damping: springDefaults.damping,\n            duration,\n        };\n    }\n    else {\n        const stiffness = Math.pow(undampedFreq, 2) * mass;\n        return {\n            stiffness,\n            damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n            duration,\n        };\n    }\n}\nconst durationKeys = [\"duration\", \"bounce\"];\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"];\nfunction isSpringType(options, keys) {\n    return keys.some((key) => options[key] !== undefined);\n}\nfunction getSpringOptions(options) {\n    let springOptions = {\n        velocity: springDefaults.velocity,\n        stiffness: springDefaults.stiffness,\n        damping: springDefaults.damping,\n        mass: springDefaults.mass,\n        isResolvedFromDuration: false,\n        ...options,\n    };\n    // stiffness/damping/mass overrides duration/bounce\n    if (!isSpringType(options, physicsKeys) &&\n        isSpringType(options, durationKeys)) {\n        // Time-defined springs should ignore inherited velocity.\n        // Velocity from interrupted animations can cause findSpring()\n        // to compute wildly different spring parameters, leading to\n        // massive oscillation on small-range animations.\n        springOptions.velocity = 0;\n        if (options.visualDuration) {\n            const visualDuration = options.visualDuration;\n            const root = (2 * Math.PI) / (visualDuration * 1.2);\n            const stiffness = root * root;\n            const damping = 2 *\n                clamp(0.05, 1, 1 - (options.bounce || 0)) *\n                Math.sqrt(stiffness);\n            springOptions = {\n                ...springOptions,\n                mass: springDefaults.mass,\n                stiffness,\n                damping,\n            };\n        }\n        else {\n            const derived = findSpring({ ...options, velocity: 0 });\n            springOptions = {\n                ...springOptions,\n                ...derived,\n                mass: springDefaults.mass,\n            };\n            springOptions.isResolvedFromDuration = true;\n        }\n    }\n    return springOptions;\n}\nfunction spring(optionsOrVisualDuration = springDefaults.visualDuration, bounce = springDefaults.bounce) {\n    const options = typeof optionsOrVisualDuration !== \"object\"\n        ? {\n            visualDuration: optionsOrVisualDuration,\n            keyframes: [0, 1],\n            bounce,\n        }\n        : optionsOrVisualDuration;\n    let { restSpeed, restDelta } = options;\n    const origin = options.keyframes[0];\n    const target = options.keyframes[options.keyframes.length - 1];\n    /**\n     * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n     * to reduce GC during animation.\n     */\n    const state = { done: false, value: origin };\n    const { stiffness, damping, mass, duration, velocity, isResolvedFromDuration, } = getSpringOptions({\n        ...options,\n        velocity: -millisecondsToSeconds(options.velocity || 0),\n    });\n    const initialVelocity = velocity || 0.0;\n    const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass));\n    const initialDelta = target - origin;\n    const undampedAngularFreq = millisecondsToSeconds(Math.sqrt(stiffness / mass));\n    /**\n     * If we're working on a granular scale, use smaller defaults for determining\n     * when the spring is finished.\n     *\n     * These defaults have been selected emprically based on what strikes a good\n     * ratio between feeling good and finishing as soon as changes are imperceptible.\n     */\n    const isGranularScale = Math.abs(initialDelta) < 5;\n    restSpeed || (restSpeed = isGranularScale\n        ? springDefaults.restSpeed.granular\n        : springDefaults.restSpeed.default);\n    restDelta || (restDelta = isGranularScale\n        ? springDefaults.restDelta.granular\n        : springDefaults.restDelta.default);\n    let resolveSpring;\n    let resolveVelocity;\n    // Underdamped coefficients, hoisted for use in the inlined next() hot path\n    let angularFreq;\n    let A;\n    let sinCoeff;\n    let cosCoeff;\n    if (dampingRatio < 1) {\n        angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio);\n        A =\n            (initialVelocity +\n                dampingRatio * undampedAngularFreq * initialDelta) /\n                angularFreq;\n        // Underdamped spring\n        resolveSpring = (t) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n            return (target -\n                envelope *\n                    (A * Math.sin(angularFreq * t) +\n                        initialDelta * Math.cos(angularFreq * t)));\n        };\n        // Analytical derivative of underdamped spring (px/ms)\n        sinCoeff =\n            dampingRatio * undampedAngularFreq * A + initialDelta * angularFreq;\n        cosCoeff =\n            dampingRatio * undampedAngularFreq * initialDelta - A * angularFreq;\n        resolveVelocity = (t) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n            return envelope *\n                (sinCoeff * Math.sin(angularFreq * t) +\n                    cosCoeff * Math.cos(angularFreq * t));\n        };\n    }\n    else if (dampingRatio === 1) {\n        // Critically damped spring\n        resolveSpring = (t) => target -\n            Math.exp(-undampedAngularFreq * t) *\n                (initialDelta +\n                    (initialVelocity + undampedAngularFreq * initialDelta) * t);\n        // Analytical derivative of critically damped spring (px/ms)\n        const C = initialVelocity + undampedAngularFreq * initialDelta;\n        resolveVelocity = (t) => Math.exp(-undampedAngularFreq * t) *\n            (undampedAngularFreq * C * t - initialVelocity);\n    }\n    else {\n        // Overdamped spring\n        const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1);\n        resolveSpring = (t) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n            // When performing sinh or cosh values can hit Infinity so we cap them here\n            const freqForT = Math.min(dampedAngularFreq * t, 300);\n            return (target -\n                (envelope *\n                    ((initialVelocity +\n                        dampingRatio * undampedAngularFreq * initialDelta) *\n                        Math.sinh(freqForT) +\n                        dampedAngularFreq *\n                            initialDelta *\n                            Math.cosh(freqForT))) /\n                    dampedAngularFreq);\n        };\n        // Analytical derivative of overdamped spring (px/ms)\n        const P = (initialVelocity +\n            dampingRatio * undampedAngularFreq * initialDelta) /\n            dampedAngularFreq;\n        const sinhCoeff = dampingRatio * undampedAngularFreq * P - initialDelta * dampedAngularFreq;\n        const coshCoeff = dampingRatio * undampedAngularFreq * initialDelta - P * dampedAngularFreq;\n        resolveVelocity = (t) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n            const freqForT = Math.min(dampedAngularFreq * t, 300);\n            return envelope *\n                (sinhCoeff * Math.sinh(freqForT) +\n                    coshCoeff * Math.cosh(freqForT));\n        };\n    }\n    const generator = {\n        calculatedDuration: isResolvedFromDuration ? duration || null : null,\n        velocity: (t) => secondsToMilliseconds(resolveVelocity(t)),\n        next: (t) => {\n            /**\n             * For underdamped physics springs we need both position and\n             * velocity each tick. Compute shared trig values once to avoid\n             * duplicate Math.exp/sin/cos calls on the hot path.\n             */\n            if (!isResolvedFromDuration && dampingRatio < 1) {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                const sin = Math.sin(angularFreq * t);\n                const cos = Math.cos(angularFreq * t);\n                const current = target -\n                    envelope *\n                        (A * sin + initialDelta * cos);\n                const currentVelocity = secondsToMilliseconds(envelope *\n                    (sinCoeff * sin + cosCoeff * cos));\n                state.done =\n                    Math.abs(currentVelocity) <= restSpeed &&\n                        Math.abs(target - current) <= restDelta;\n                state.value = state.done ? target : current;\n                return state;\n            }\n            const current = resolveSpring(t);\n            if (!isResolvedFromDuration) {\n                const currentVelocity = secondsToMilliseconds(resolveVelocity(t));\n                state.done =\n                    Math.abs(currentVelocity) <= restSpeed &&\n                        Math.abs(target - current) <= restDelta;\n            }\n            else {\n                state.done = t >= duration;\n            }\n            state.value = state.done ? target : current;\n            return state;\n        },\n        toString: () => {\n            const calculatedDuration = Math.min(calcGeneratorDuration(generator), maxGeneratorDuration);\n            const easing = generateLinearEasing((progress) => generator.next(calculatedDuration * progress).value, calculatedDuration, 30);\n            return calculatedDuration + \"ms \" + easing;\n        },\n        toTransition: () => { },\n    };\n    return generator;\n}\nspring.applyToOptions = (options) => {\n    const generatorOptions = createGeneratorEasing(options, 100, spring);\n    options.ease = generatorOptions.ease;\n    options.duration = secondsToMilliseconds(generatorOptions.duration);\n    options.type = \"keyframes\";\n    return options;\n};\n\nexport { spring };\n//# sourceMappingURL=spring.mjs.map\n","import { velocityPerSecond } from 'motion-utils';\n\nconst velocitySampleDuration = 5; // ms\nfunction getGeneratorVelocity(resolveValue, t, current) {\n    const prevT = Math.max(t - velocitySampleDuration, 0);\n    return velocityPerSecond(current - resolveValue(prevT), t - prevT);\n}\n\nexport { getGeneratorVelocity };\n//# sourceMappingURL=velocity.mjs.map\n","import { spring } from './spring.mjs';\nimport { getGeneratorVelocity } from './utils/velocity.mjs';\n\nfunction inertia({ keyframes, velocity = 0.0, power = 0.8, timeConstant = 325, bounceDamping = 10, bounceStiffness = 500, modifyTarget, min, max, restDelta = 0.5, restSpeed, }) {\n    const origin = keyframes[0];\n    const state = {\n        done: false,\n        value: origin,\n    };\n    const isOutOfBounds = (v) => (min !== undefined && v < min) || (max !== undefined && v > max);\n    const nearestBoundary = (v) => {\n        if (min === undefined)\n            return max;\n        if (max === undefined)\n            return min;\n        return Math.abs(min - v) < Math.abs(max - v) ? min : max;\n    };\n    let amplitude = power * velocity;\n    const ideal = origin + amplitude;\n    const target = modifyTarget === undefined ? ideal : modifyTarget(ideal);\n    /**\n     * If the target has changed we need to re-calculate the amplitude, otherwise\n     * the animation will start from the wrong position.\n     */\n    if (target !== ideal)\n        amplitude = target - origin;\n    const calcDelta = (t) => -amplitude * Math.exp(-t / timeConstant);\n    const calcLatest = (t) => target + calcDelta(t);\n    const applyFriction = (t) => {\n        const delta = calcDelta(t);\n        const latest = calcLatest(t);\n        state.done = Math.abs(delta) <= restDelta;\n        state.value = state.done ? target : latest;\n    };\n    /**\n     * Ideally this would resolve for t in a stateless way, we could\n     * do that by always precalculating the animation but as we know\n     * this will be done anyway we can assume that spring will\n     * be discovered during that.\n     */\n    let timeReachedBoundary;\n    let spring$1;\n    const checkCatchBoundary = (t) => {\n        if (!isOutOfBounds(state.value))\n            return;\n        timeReachedBoundary = t;\n        spring$1 = spring({\n            keyframes: [state.value, nearestBoundary(state.value)],\n            velocity: getGeneratorVelocity(calcLatest, t, state.value), // TODO: This should be passing * 1000\n            damping: bounceDamping,\n            stiffness: bounceStiffness,\n            restDelta,\n            restSpeed,\n        });\n    };\n    checkCatchBoundary(0);\n    return {\n        calculatedDuration: null,\n        next: (t) => {\n            /**\n             * We need to resolve the friction to figure out if we need a\n             * spring but we don't want to do this twice per frame. So here\n             * we flag if we updated for this frame and later if we did\n             * we can skip doing it again.\n             */\n            let hasUpdatedFrame = false;\n            if (!spring$1 && timeReachedBoundary === undefined) {\n                hasUpdatedFrame = true;\n                applyFriction(t);\n                checkCatchBoundary(t);\n            }\n            /**\n             * If we have a spring and the provided t is beyond the moment the friction\n             * animation crossed the min/max boundary, use the spring.\n             */\n            if (timeReachedBoundary !== undefined && t >= timeReachedBoundary) {\n                return spring$1.next(t - timeReachedBoundary);\n            }\n            else {\n                !hasUpdatedFrame && applyFriction(t);\n                return state;\n            }\n        },\n    };\n}\n\nexport { inertia };\n//# sourceMappingURL=inertia.mjs.map\n","import { invariant, clamp, MotionGlobalConfig, noop, pipe, progress } from 'motion-utils';\nimport { mix } from './mix/index.mjs';\n\nfunction createMixers(output, ease, customMixer) {\n    const mixers = [];\n    const mixerFactory = customMixer || MotionGlobalConfig.mix || mix;\n    const numMixers = output.length - 1;\n    for (let i = 0; i < numMixers; i++) {\n        let mixer = mixerFactory(output[i], output[i + 1]);\n        if (ease) {\n            const easingFunction = Array.isArray(ease) ? ease[i] || noop : ease;\n            mixer = pipe(easingFunction, mixer);\n        }\n        mixers.push(mixer);\n    }\n    return mixers;\n}\n/**\n * Create a function that maps from a numerical input array to a generic output array.\n *\n * Accepts:\n *   - Numbers\n *   - Colors (hex, hsl, hsla, rgb, rgba)\n *   - Complex (combinations of one or more numbers or strings)\n *\n * ```jsx\n * const mixColor = interpolate([0, 1], ['#fff', '#000'])\n *\n * mixColor(0.5) // 'rgba(128, 128, 128, 1)'\n * ```\n *\n * TODO Revisit this approach once we've moved to data models for values,\n * probably not needed to pregenerate mixer functions.\n *\n * @public\n */\nfunction interpolate(input, output, { clamp: isClamp = true, ease, mixer } = {}) {\n    const inputLength = input.length;\n    invariant(inputLength === output.length, \"Both input and output ranges must be the same length\", \"range-length\");\n    /**\n     * If we're only provided a single input, we can just make a function\n     * that returns the output.\n     */\n    if (inputLength === 1)\n        return () => output[0];\n    if (inputLength === 2 && output[0] === output[1])\n        return () => output[1];\n    const isZeroDeltaRange = input[0] === input[1];\n    // If input runs highest -> lowest, reverse both arrays\n    if (input[0] > input[inputLength - 1]) {\n        input = [...input].reverse();\n        output = [...output].reverse();\n    }\n    const mixers = createMixers(output, ease, mixer);\n    const numMixers = mixers.length;\n    const interpolator = (v) => {\n        if (isZeroDeltaRange && v < input[0])\n            return output[0];\n        let i = 0;\n        if (numMixers > 1) {\n            for (; i < input.length - 2; i++) {\n                if (v < input[i + 1])\n                    break;\n            }\n        }\n        const progressInRange = progress(input[i], input[i + 1], v);\n        return mixers[i](progressInRange);\n    };\n    return isClamp\n        ? (v) => interpolator(clamp(input[0], input[inputLength - 1], v))\n        : interpolator;\n}\n\nexport { interpolate };\n//# sourceMappingURL=interpolate.mjs.map\n","import { progress } from 'motion-utils';\nimport { mixNumber } from '../../../utils/mix/number.mjs';\n\nfunction fillOffset(offset, remaining) {\n    const min = offset[offset.length - 1];\n    for (let i = 1; i <= remaining; i++) {\n        const offsetProgress = progress(0, remaining, i);\n        offset.push(mixNumber(min, 1, offsetProgress));\n    }\n}\n\nexport { fillOffset };\n//# sourceMappingURL=fill.mjs.map\n","import { fillOffset } from './fill.mjs';\n\nfunction defaultOffset(arr) {\n    const offset = [0];\n    fillOffset(offset, arr.length - 1);\n    return offset;\n}\n\nexport { defaultOffset };\n//# sourceMappingURL=default.mjs.map\n","function convertOffsetToTimes(offset, duration) {\n    return offset.map((o) => o * duration);\n}\n\nexport { convertOffsetToTimes };\n//# sourceMappingURL=time.mjs.map\n","import { easeInOut, isEasingArray, easingDefinitionToFunction } from 'motion-utils';\nimport { interpolate } from '../../utils/interpolate.mjs';\nimport { defaultOffset } from '../keyframes/offsets/default.mjs';\nimport { convertOffsetToTimes } from '../keyframes/offsets/time.mjs';\n\nfunction defaultEasing(values, easing) {\n    return values.map(() => easing || easeInOut).splice(0, values.length - 1);\n}\nfunction keyframes({ duration = 300, keyframes: keyframeValues, times, ease = \"easeInOut\", }) {\n    /**\n     * Easing functions can be externally defined as strings. Here we convert them\n     * into actual functions.\n     */\n    const easingFunctions = isEasingArray(ease)\n        ? ease.map(easingDefinitionToFunction)\n        : easingDefinitionToFunction(ease);\n    /**\n     * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n     * to reduce GC during animation.\n     */\n    const state = {\n        done: false,\n        value: keyframeValues[0],\n    };\n    /**\n     * Create a times array based on the provided 0-1 offsets\n     */\n    const absoluteTimes = convertOffsetToTimes(\n    // Only use the provided offsets if they're the correct length\n    // TODO Maybe we should warn here if there's a length mismatch\n    times && times.length === keyframeValues.length\n        ? times\n        : defaultOffset(keyframeValues), duration);\n    const mapTimeToKeyframe = interpolate(absoluteTimes, keyframeValues, {\n        ease: Array.isArray(easingFunctions)\n            ? easingFunctions\n            : defaultEasing(keyframeValues, easingFunctions),\n    });\n    return {\n        calculatedDuration: duration,\n        next: (t) => {\n            state.value = mapTimeToKeyframe(t);\n            state.done = t >= duration;\n            return state;\n        },\n    };\n}\n\nexport { defaultEasing, keyframes };\n//# sourceMappingURL=keyframes.mjs.map\n","const isNotNull = (value) => value !== null;\nfunction getFinalKeyframe(keyframes, { repeat, repeatType = \"loop\" }, finalKeyframe, speed = 1) {\n    const resolvedKeyframes = keyframes.filter(isNotNull);\n    const useFirstKeyframe = speed < 0 || (repeat && repeatType !== \"loop\" && repeat % 2 === 1);\n    const index = useFirstKeyframe ? 0 : resolvedKeyframes.length - 1;\n    return !index || finalKeyframe === undefined\n        ? resolvedKeyframes[index]\n        : finalKeyframe;\n}\n\nexport { getFinalKeyframe };\n//# sourceMappingURL=get-final.mjs.map\n","import { inertia } from '../generators/inertia.mjs';\nimport { keyframes } from '../generators/keyframes.mjs';\nimport { spring } from '../generators/spring.mjs';\n\nconst transitionTypeMap = {\n    decay: inertia,\n    inertia,\n    tween: keyframes,\n    keyframes: keyframes,\n    spring,\n};\nfunction replaceTransitionType(transition) {\n    if (typeof transition.type === \"string\") {\n        transition.type = transitionTypeMap[transition.type];\n    }\n}\n\nexport { replaceTransitionType };\n//# sourceMappingURL=replace-transition-type.mjs.map\n","class WithPromise {\n    constructor() {\n        this.updateFinished();\n    }\n    get finished() {\n        return this._finished;\n    }\n    updateFinished() {\n        this._finished = new Promise((resolve) => {\n            this.resolve = resolve;\n        });\n    }\n    notifyFinished() {\n        this.resolve();\n    }\n    /**\n     * Allows the animation to be awaited.\n     *\n     * @deprecated Use `finished` instead.\n     */\n    then(onResolve, onReject) {\n        return this.finished.then(onResolve, onReject);\n    }\n}\n\nexport { WithPromise };\n//# sourceMappingURL=WithPromise.mjs.map\n","import { invariant, pipe, clamp, millisecondsToSeconds, secondsToMilliseconds } from 'motion-utils';\nimport { time } from '../frameloop/sync-time.mjs';\nimport { activeAnimations } from '../stats/animation-count.mjs';\nimport { mix } from '../utils/mix/index.mjs';\nimport { frameloopDriver } from './drivers/frame.mjs';\nimport { inertia } from './generators/inertia.mjs';\nimport { keyframes } from './generators/keyframes.mjs';\nimport { calcGeneratorDuration } from './generators/utils/calc-duration.mjs';\nimport { getGeneratorVelocity } from './generators/utils/velocity.mjs';\nimport { getFinalKeyframe } from './keyframes/get-final.mjs';\nimport { replaceTransitionType } from './utils/replace-transition-type.mjs';\nimport { WithPromise } from './utils/WithPromise.mjs';\n\nconst percentToProgress = (percent) => percent / 100;\nclass JSAnimation extends WithPromise {\n    constructor(options) {\n        super();\n        this.state = \"idle\";\n        this.startTime = null;\n        this.isStopped = false;\n        /**\n         * The current time of the animation.\n         */\n        this.currentTime = 0;\n        /**\n         * The time at which the animation was paused.\n         */\n        this.holdTime = null;\n        /**\n         * Playback speed as a factor. 0 would be stopped, -1 reverse and 2 double speed.\n         */\n        this.playbackSpeed = 1;\n        /**\n         * Reusable state object for the delay phase to avoid\n         * allocating a new object every frame.\n         */\n        this.delayState = {\n            done: false,\n            value: undefined,\n        };\n        /**\n         * This method is bound to the instance to fix a pattern where\n         * animation.stop is returned as a reference from a useEffect.\n         */\n        this.stop = () => {\n            const { motionValue } = this.options;\n            if (motionValue && motionValue.updatedAt !== time.now()) {\n                this.tick(time.now());\n            }\n            this.isStopped = true;\n            if (this.state === \"idle\")\n                return;\n            this.teardown();\n            this.options.onStop?.();\n        };\n        activeAnimations.mainThread++;\n        this.options = options;\n        this.initAnimation();\n        this.play();\n        if (options.autoplay === false)\n            this.pause();\n    }\n    initAnimation() {\n        const { options } = this;\n        replaceTransitionType(options);\n        const { type = keyframes, repeat = 0, repeatDelay = 0, repeatType, velocity = 0, } = options;\n        let { keyframes: keyframes$1 } = options;\n        const generatorFactory = type || keyframes;\n        if (process.env.NODE_ENV !== \"production\" &&\n            generatorFactory !== keyframes) {\n            invariant(keyframes$1.length <= 2, `Only two keyframes currently supported with spring and inertia animations. Trying to animate ${keyframes$1}`, \"spring-two-frames\");\n        }\n        if (generatorFactory !== keyframes &&\n            typeof keyframes$1[0] !== \"number\") {\n            this.mixKeyframes = pipe(percentToProgress, mix(keyframes$1[0], keyframes$1[1]));\n            keyframes$1 = [0, 100];\n        }\n        const generator = generatorFactory({ ...options, keyframes: keyframes$1 });\n        /**\n         * If we have a mirror repeat type we need to create a second generator that outputs the\n         * mirrored (not reversed) animation and later ping pong between the two generators.\n         */\n        if (repeatType === \"mirror\") {\n            this.mirroredGenerator = generatorFactory({\n                ...options,\n                keyframes: [...keyframes$1].reverse(),\n                velocity: -velocity,\n            });\n        }\n        /**\n         * If duration is undefined and we have repeat options,\n         * we need to calculate a duration from the generator.\n         *\n         * We set it to the generator itself to cache the duration.\n         * Any timeline resolver will need to have already precalculated\n         * the duration by this step.\n         */\n        if (generator.calculatedDuration === null) {\n            generator.calculatedDuration = calcGeneratorDuration(generator);\n        }\n        const { calculatedDuration } = generator;\n        this.calculatedDuration = calculatedDuration;\n        this.resolvedDuration = calculatedDuration + repeatDelay;\n        this.totalDuration = this.resolvedDuration * (repeat + 1) - repeatDelay;\n        this.generator = generator;\n    }\n    updateTime(timestamp) {\n        const animationTime = Math.round(timestamp - this.startTime) * this.playbackSpeed;\n        // Update currentTime\n        if (this.holdTime !== null) {\n            this.currentTime = this.holdTime;\n        }\n        else {\n            // Rounding the time because floating point arithmetic is not always accurate, e.g. 3000.367 - 1000.367 =\n            // 2000.0000000000002. This is a problem when we are comparing the currentTime with the duration, for\n            // example.\n            this.currentTime = animationTime;\n        }\n    }\n    tick(timestamp, sample = false) {\n        const { generator, totalDuration, mixKeyframes, mirroredGenerator, resolvedDuration, calculatedDuration, } = this;\n        if (this.startTime === null)\n            return generator.next(0);\n        const { delay = 0, keyframes, repeat, repeatType, repeatDelay, type, onUpdate, finalKeyframe, } = this.options;\n        /**\n         * requestAnimationFrame timestamps can come through as lower than\n         * the startTime as set by performance.now(). Here we prevent this,\n         * though in the future it could be possible to make setting startTime\n         * a pending operation that gets resolved here.\n         */\n        if (this.speed > 0) {\n            this.startTime = Math.min(this.startTime, timestamp);\n        }\n        else if (this.speed < 0) {\n            this.startTime = Math.min(timestamp - totalDuration / this.speed, this.startTime);\n        }\n        if (sample) {\n            this.currentTime = timestamp;\n        }\n        else {\n            this.updateTime(timestamp);\n        }\n        // Rebase on delay\n        const timeWithoutDelay = this.currentTime - delay * (this.playbackSpeed >= 0 ? 1 : -1);\n        const isInDelayPhase = this.playbackSpeed >= 0\n            ? timeWithoutDelay < 0\n            : timeWithoutDelay > totalDuration;\n        this.currentTime = Math.max(timeWithoutDelay, 0);\n        // If this animation has finished, set the current time  to the total duration.\n        if (this.state === \"finished\" && this.holdTime === null) {\n            this.currentTime = totalDuration;\n        }\n        let elapsed = this.currentTime;\n        let frameGenerator = generator;\n        if (repeat) {\n            /**\n             * Get the current progress (0-1) of the animation. If t is >\n             * than duration we'll get values like 2.5 (midway through the\n             * third iteration)\n             */\n            const progress = Math.min(this.currentTime, totalDuration) / resolvedDuration;\n            /**\n             * Get the current iteration (0 indexed). For instance the floor of\n             * 2.5 is 2.\n             */\n            let currentIteration = Math.floor(progress);\n            /**\n             * Get the current progress of the iteration by taking the remainder\n             * so 2.5 is 0.5 through iteration 2\n             */\n            let iterationProgress = progress % 1.0;\n            /**\n             * If iteration progress is 1 we count that as the end\n             * of the previous iteration.\n             */\n            if (!iterationProgress && progress >= 1) {\n                iterationProgress = 1;\n            }\n            iterationProgress === 1 && currentIteration--;\n            currentIteration = Math.min(currentIteration, repeat + 1);\n            /**\n             * Reverse progress if we're not running in \"normal\" direction\n             */\n            const isOddIteration = Boolean(currentIteration % 2);\n            if (isOddIteration) {\n                if (repeatType === \"reverse\") {\n                    iterationProgress = 1 - iterationProgress;\n                    if (repeatDelay) {\n                        iterationProgress -= repeatDelay / resolvedDuration;\n                    }\n                }\n                else if (repeatType === \"mirror\") {\n                    frameGenerator = mirroredGenerator;\n                }\n            }\n            elapsed = clamp(0, 1, iterationProgress) * resolvedDuration;\n        }\n        /**\n         * If we're in negative time, set state as the initial keyframe.\n         * This prevents delay: x, duration: 0 animations from finishing\n         * instantly.\n         */\n        let state;\n        if (isInDelayPhase) {\n            this.delayState.value = keyframes[0];\n            state = this.delayState;\n        }\n        else {\n            state = frameGenerator.next(elapsed);\n        }\n        if (mixKeyframes && !isInDelayPhase) {\n            state.value = mixKeyframes(state.value);\n        }\n        let { done } = state;\n        if (!isInDelayPhase && calculatedDuration !== null) {\n            done =\n                this.playbackSpeed >= 0\n                    ? this.currentTime >= totalDuration\n                    : this.currentTime <= 0;\n        }\n        const isAnimationFinished = this.holdTime === null &&\n            (this.state === \"finished\" || (this.state === \"running\" && done));\n        // TODO: The exception for inertia could be cleaner here\n        if (isAnimationFinished && type !== inertia) {\n            state.value = getFinalKeyframe(keyframes, this.options, finalKeyframe, this.speed);\n        }\n        if (onUpdate) {\n            onUpdate(state.value);\n        }\n        if (isAnimationFinished) {\n            this.finish();\n        }\n        return state;\n    }\n    /**\n     * Allows the returned animation to be awaited or promise-chained. Currently\n     * resolves when the animation finishes at all but in a future update could/should\n     * reject if its cancels.\n     */\n    then(resolve, reject) {\n        return this.finished.then(resolve, reject);\n    }\n    get duration() {\n        return millisecondsToSeconds(this.calculatedDuration);\n    }\n    get iterationDuration() {\n        const { delay = 0 } = this.options || {};\n        return this.duration + millisecondsToSeconds(delay);\n    }\n    get time() {\n        return millisecondsToSeconds(this.currentTime);\n    }\n    set time(newTime) {\n        newTime = secondsToMilliseconds(newTime);\n        this.currentTime = newTime;\n        if (this.startTime === null ||\n            this.holdTime !== null ||\n            this.playbackSpeed === 0) {\n            this.holdTime = newTime;\n        }\n        else if (this.driver) {\n            this.startTime = this.driver.now() - newTime / this.playbackSpeed;\n        }\n        if (this.driver) {\n            this.driver.start(false);\n        }\n        else {\n            this.startTime = 0;\n            this.state = \"paused\";\n            this.holdTime = newTime;\n            this.tick(newTime);\n        }\n    }\n    /**\n     * Returns the generator's velocity at the current time in units/second.\n     * Uses the analytical derivative when available (springs), avoiding\n     * the MotionValue's frame-dependent velocity estimation.\n     */\n    getGeneratorVelocity() {\n        const t = this.currentTime;\n        if (t <= 0)\n            return this.options.velocity || 0;\n        if (this.generator.velocity) {\n            return this.generator.velocity(t);\n        }\n        // Fallback: finite difference\n        const current = this.generator.next(t).value;\n        return getGeneratorVelocity((s) => this.generator.next(s).value, t, current);\n    }\n    get speed() {\n        return this.playbackSpeed;\n    }\n    set speed(newSpeed) {\n        const hasChanged = this.playbackSpeed !== newSpeed;\n        if (hasChanged && this.driver) {\n            this.updateTime(time.now());\n        }\n        this.playbackSpeed = newSpeed;\n        if (hasChanged && this.driver) {\n            this.time = millisecondsToSeconds(this.currentTime);\n        }\n    }\n    play() {\n        if (this.isStopped)\n            return;\n        const { driver = frameloopDriver, startTime } = this.options;\n        if (!this.driver) {\n            this.driver = driver((timestamp) => this.tick(timestamp));\n        }\n        this.options.onPlay?.();\n        const now = this.driver.now();\n        if (this.state === \"finished\") {\n            this.updateFinished();\n            this.startTime = now;\n        }\n        else if (this.holdTime !== null) {\n            this.startTime = now - this.holdTime;\n        }\n        else if (!this.startTime) {\n            this.startTime = startTime ?? now;\n        }\n        if (this.state === \"finished\" && this.speed < 0) {\n            this.startTime += this.calculatedDuration;\n        }\n        this.holdTime = null;\n        /**\n         * Set playState to running only after we've used it in\n         * the previous logic.\n         */\n        this.state = \"running\";\n        this.driver.start();\n    }\n    pause() {\n        this.state = \"paused\";\n        this.updateTime(time.now());\n        this.holdTime = this.currentTime;\n    }\n    complete() {\n        if (this.state !== \"running\") {\n            this.play();\n        }\n        this.state = \"finished\";\n        this.holdTime = null;\n    }\n    finish() {\n        this.notifyFinished();\n        this.teardown();\n        this.state = \"finished\";\n        this.options.onComplete?.();\n    }\n    cancel() {\n        this.holdTime = null;\n        this.startTime = 0;\n        this.tick(0);\n        this.teardown();\n        this.options.onCancel?.();\n    }\n    teardown() {\n        this.state = \"idle\";\n        this.stopDriver();\n        this.startTime = this.holdTime = null;\n        activeAnimations.mainThread--;\n    }\n    stopDriver() {\n        if (!this.driver)\n            return;\n        this.driver.stop();\n        this.driver = undefined;\n    }\n    sample(sampleTime) {\n        this.startTime = 0;\n        return this.tick(sampleTime, true);\n    }\n    attachTimeline(timeline) {\n        if (this.options.allowFlatten) {\n            this.options.type = \"keyframes\";\n            this.options.ease = \"linear\";\n            this.initAnimation();\n        }\n        this.driver?.stop();\n        return timeline.observe(this);\n    }\n}\n// Legacy function support\nfunction animateValue(options) {\n    return new JSAnimation(options);\n}\n\nexport { JSAnimation, animateValue };\n//# sourceMappingURL=JSAnimation.mjs.map\n","function fillWildcards(keyframes) {\n    for (let i = 1; i < keyframes.length; i++) {\n        keyframes[i] ?? (keyframes[i] = keyframes[i - 1]);\n    }\n}\n\nexport { fillWildcards };\n//# sourceMappingURL=fill-wildcards.mjs.map\n","const radToDeg = (rad) => (rad * 180) / Math.PI;\nconst rotate = (v) => {\n    const angle = radToDeg(Math.atan2(v[1], v[0]));\n    return rebaseAngle(angle);\n};\nconst matrix2dParsers = {\n    x: 4,\n    y: 5,\n    translateX: 4,\n    translateY: 5,\n    scaleX: 0,\n    scaleY: 3,\n    scale: (v) => (Math.abs(v[0]) + Math.abs(v[3])) / 2,\n    rotate,\n    rotateZ: rotate,\n    skewX: (v) => radToDeg(Math.atan(v[1])),\n    skewY: (v) => radToDeg(Math.atan(v[2])),\n    skew: (v) => (Math.abs(v[1]) + Math.abs(v[2])) / 2,\n};\nconst rebaseAngle = (angle) => {\n    angle = angle % 360;\n    if (angle < 0)\n        angle += 360;\n    return angle;\n};\nconst rotateZ = rotate;\nconst scaleX = (v) => Math.sqrt(v[0] * v[0] + v[1] * v[1]);\nconst scaleY = (v) => Math.sqrt(v[4] * v[4] + v[5] * v[5]);\nconst matrix3dParsers = {\n    x: 12,\n    y: 13,\n    z: 14,\n    translateX: 12,\n    translateY: 13,\n    translateZ: 14,\n    scaleX,\n    scaleY,\n    scale: (v) => (scaleX(v) + scaleY(v)) / 2,\n    rotateX: (v) => rebaseAngle(radToDeg(Math.atan2(v[6], v[5]))),\n    rotateY: (v) => rebaseAngle(radToDeg(Math.atan2(-v[2], v[0]))),\n    rotateZ,\n    rotate: rotateZ,\n    skewX: (v) => radToDeg(Math.atan(v[4])),\n    skewY: (v) => radToDeg(Math.atan(v[1])),\n    skew: (v) => (Math.abs(v[1]) + Math.abs(v[4])) / 2,\n};\nfunction defaultTransformValue(name) {\n    return name.includes(\"scale\") ? 1 : 0;\n}\nfunction parseValueFromTransform(transform, name) {\n    if (!transform || transform === \"none\") {\n        return defaultTransformValue(name);\n    }\n    const matrix3dMatch = transform.match(/^matrix3d\\(([-\\d.e\\s,]+)\\)$/u);\n    let parsers;\n    let match;\n    if (matrix3dMatch) {\n        parsers = matrix3dParsers;\n        match = matrix3dMatch;\n    }\n    else {\n        const matrix2dMatch = transform.match(/^matrix\\(([-\\d.e\\s,]+)\\)$/u);\n        parsers = matrix2dParsers;\n        match = matrix2dMatch;\n    }\n    if (!match) {\n        return defaultTransformValue(name);\n    }\n    const valueParser = parsers[name];\n    const values = match[1].split(\",\").map(convertTransformToNumber);\n    return typeof valueParser === \"function\"\n        ? valueParser(values)\n        : values[valueParser];\n}\nconst readTransformValue = (instance, name) => {\n    const { transform = \"none\" } = getComputedStyle(instance);\n    return parseValueFromTransform(transform, name);\n};\nfunction convertTransformToNumber(value) {\n    return parseFloat(value.trim());\n}\n\nexport { defaultTransformValue, parseValueFromTransform, readTransformValue };\n//# sourceMappingURL=parse-transform.mjs.map\n","/**\n * Generate a list of every possible transform key.\n */\nconst transformPropOrder = [\n    \"transformPerspective\",\n    \"x\",\n    \"y\",\n    \"z\",\n    \"translateX\",\n    \"translateY\",\n    \"translateZ\",\n    \"scale\",\n    \"scaleX\",\n    \"scaleY\",\n    \"rotate\",\n    \"rotateX\",\n    \"rotateY\",\n    \"rotateZ\",\n    \"skew\",\n    \"skewX\",\n    \"skewY\",\n];\n/**\n * A quick lookup for transform props.\n */\nconst transformProps = /*@__PURE__*/ (() => new Set(transformPropOrder))();\n\nexport { transformPropOrder, transformProps };\n//# sourceMappingURL=keys-transform.mjs.map\n","import { parseValueFromTransform } from '../../../render/dom/parse-transform.mjs';\nimport { transformPropOrder } from '../../../render/utils/keys-transform.mjs';\nimport { number } from '../../../value/types/numbers/index.mjs';\nimport { px } from '../../../value/types/numbers/units.mjs';\n\nconst isNumOrPxType = (v) => v === number || v === px;\nconst transformKeys = new Set([\"x\", \"y\", \"z\"]);\nconst nonTranslationalTransformKeys = transformPropOrder.filter((key) => !transformKeys.has(key));\nfunction removeNonTranslationalTransform(visualElement) {\n    const removedTransforms = [];\n    nonTranslationalTransformKeys.forEach((key) => {\n        const value = visualElement.getValue(key);\n        if (value !== undefined) {\n            removedTransforms.push([key, value.get()]);\n            value.set(key.startsWith(\"scale\") ? 1 : 0);\n        }\n    });\n    return removedTransforms;\n}\nconst positionalValues = {\n    // Dimensions\n    width: ({ x }, { paddingLeft = \"0\", paddingRight = \"0\", boxSizing }) => {\n        const width = x.max - x.min;\n        return boxSizing === \"border-box\"\n            ? width\n            : width - parseFloat(paddingLeft) - parseFloat(paddingRight);\n    },\n    height: ({ y }, { paddingTop = \"0\", paddingBottom = \"0\", boxSizing }) => {\n        const height = y.max - y.min;\n        return boxSizing === \"border-box\"\n            ? height\n            : height - parseFloat(paddingTop) - parseFloat(paddingBottom);\n    },\n    top: (_bbox, { top }) => parseFloat(top),\n    left: (_bbox, { left }) => parseFloat(left),\n    bottom: ({ y }, { top }) => parseFloat(top) + (y.max - y.min),\n    right: ({ x }, { left }) => parseFloat(left) + (x.max - x.min),\n    // Transform\n    x: (_bbox, { transform }) => parseValueFromTransform(transform, \"x\"),\n    y: (_bbox, { transform }) => parseValueFromTransform(transform, \"y\"),\n};\n// Alias translate longform names\npositionalValues.translateX = positionalValues.x;\npositionalValues.translateY = positionalValues.y;\n\nexport { isNumOrPxType, positionalValues, removeNonTranslationalTransform };\n//# sourceMappingURL=unit-conversion.mjs.map\n","import { fillWildcards } from './utils/fill-wildcards.mjs';\nimport { removeNonTranslationalTransform } from './utils/unit-conversion.mjs';\nimport { frame } from '../../frameloop/frame.mjs';\n\nconst toResolve = new Set();\nlet isScheduled = false;\nlet anyNeedsMeasurement = false;\nlet isForced = false;\nfunction measureAllKeyframes() {\n    if (anyNeedsMeasurement) {\n        const resolversToMeasure = Array.from(toResolve).filter((resolver) => resolver.needsMeasurement);\n        const elementsToMeasure = new Set(resolversToMeasure.map((resolver) => resolver.element));\n        const transformsToRestore = new Map();\n        /**\n         * Write pass\n         * If we're measuring elements we want to remove bounding box-changing transforms.\n         */\n        elementsToMeasure.forEach((element) => {\n            const removedTransforms = removeNonTranslationalTransform(element);\n            if (!removedTransforms.length)\n                return;\n            transformsToRestore.set(element, removedTransforms);\n            element.render();\n        });\n        // Read\n        resolversToMeasure.forEach((resolver) => resolver.measureInitialState());\n        // Write\n        elementsToMeasure.forEach((element) => {\n            element.render();\n            const restore = transformsToRestore.get(element);\n            if (restore) {\n                restore.forEach(([key, value]) => {\n                    element.getValue(key)?.set(value);\n                });\n            }\n        });\n        // Read\n        resolversToMeasure.forEach((resolver) => resolver.measureEndState());\n        // Write\n        resolversToMeasure.forEach((resolver) => {\n            if (resolver.suspendedScrollY !== undefined) {\n                window.scrollTo(0, resolver.suspendedScrollY);\n            }\n        });\n    }\n    anyNeedsMeasurement = false;\n    isScheduled = false;\n    toResolve.forEach((resolver) => resolver.complete(isForced));\n    toResolve.clear();\n}\nfunction readAllKeyframes() {\n    toResolve.forEach((resolver) => {\n        resolver.readKeyframes();\n        if (resolver.needsMeasurement) {\n            anyNeedsMeasurement = true;\n        }\n    });\n}\nfunction flushKeyframeResolvers() {\n    isForced = true;\n    readAllKeyframes();\n    measureAllKeyframes();\n    isForced = false;\n}\nclass KeyframeResolver {\n    constructor(unresolvedKeyframes, onComplete, name, motionValue, element, isAsync = false) {\n        this.state = \"pending\";\n        /**\n         * Track whether this resolver is async. If it is, it'll be added to the\n         * resolver queue and flushed in the next frame. Resolvers that aren't going\n         * to trigger read/write thrashing don't need to be async.\n         */\n        this.isAsync = false;\n        /**\n         * Track whether this resolver needs to perform a measurement\n         * to resolve its keyframes.\n         */\n        this.needsMeasurement = false;\n        this.unresolvedKeyframes = [...unresolvedKeyframes];\n        this.onComplete = onComplete;\n        this.name = name;\n        this.motionValue = motionValue;\n        this.element = element;\n        this.isAsync = isAsync;\n    }\n    scheduleResolve() {\n        this.state = \"scheduled\";\n        if (this.isAsync) {\n            toResolve.add(this);\n            if (!isScheduled) {\n                isScheduled = true;\n                frame.read(readAllKeyframes);\n                frame.resolveKeyframes(measureAllKeyframes);\n            }\n        }\n        else {\n            this.readKeyframes();\n            this.complete();\n        }\n    }\n    readKeyframes() {\n        const { unresolvedKeyframes, name, element, motionValue } = this;\n        // If initial keyframe is null we need to read it from the DOM\n        if (unresolvedKeyframes[0] === null) {\n            const currentValue = motionValue?.get();\n            // TODO: This doesn't work if the final keyframe is a wildcard\n            const finalKeyframe = unresolvedKeyframes[unresolvedKeyframes.length - 1];\n            if (currentValue !== undefined) {\n                unresolvedKeyframes[0] = currentValue;\n            }\n            else if (element && name) {\n                const valueAsRead = element.readValue(name, finalKeyframe);\n                if (valueAsRead !== undefined && valueAsRead !== null) {\n                    unresolvedKeyframes[0] = valueAsRead;\n                }\n            }\n            if (unresolvedKeyframes[0] === undefined) {\n                unresolvedKeyframes[0] = finalKeyframe;\n            }\n            if (motionValue && currentValue === undefined) {\n                motionValue.set(unresolvedKeyframes[0]);\n            }\n        }\n        fillWildcards(unresolvedKeyframes);\n    }\n    setFinalKeyframe() { }\n    measureInitialState() { }\n    renderEndStyles() { }\n    measureEndState() { }\n    complete(isForcedComplete = false) {\n        this.state = \"complete\";\n        this.onComplete(this.unresolvedKeyframes, this.finalKeyframe, isForcedComplete);\n        toResolve.delete(this);\n    }\n    cancel() {\n        if (this.state === \"scheduled\") {\n            toResolve.delete(this);\n            this.state = \"pending\";\n        }\n    }\n    resume() {\n        if (this.state === \"pending\")\n            this.scheduleResolve();\n    }\n}\n\nexport { KeyframeResolver, flushKeyframeResolvers };\n//# sourceMappingURL=KeyframesResolver.mjs.map\n","const isCSSVar = (name) => name.startsWith(\"--\");\n\nexport { isCSSVar };\n//# sourceMappingURL=is-css-var.mjs.map\n","import { isCSSVar } from './is-css-var.mjs';\n\nfunction setStyle(element, name, value) {\n    isCSSVar(name)\n        ? element.style.setProperty(name, value)\n        : (element.style[name] = value);\n}\n\nexport { setStyle };\n//# sourceMappingURL=style-set.mjs.map\n","/**\n * Add the ability for test suites to manually set support flags\n * to better test more environments.\n */\nconst supportsFlags = {};\n\nexport { supportsFlags };\n//# sourceMappingURL=flags.mjs.map\n","import { memo } from 'motion-utils';\nimport { supportsFlags } from './flags.mjs';\n\nfunction memoSupports(callback, supportsFlag) {\n    const memoized = memo(callback);\n    return () => supportsFlags[supportsFlag] ?? memoized();\n}\n\nexport { memoSupports };\n//# sourceMappingURL=memo.mjs.map\n","import { memoSupports } from './memo.mjs';\n\nconst supportsScrollTimeline = /* @__PURE__ */ memoSupports(() => window.ScrollTimeline !== undefined, \"scrollTimeline\");\nconst supportsViewTimeline = /* @__PURE__ */ memoSupports(() => window.ViewTimeline !== undefined, \"viewTimeline\");\n\nexport { supportsScrollTimeline, supportsViewTimeline };\n//# sourceMappingURL=scroll-timeline.mjs.map\n","import { memoSupports } from './memo.mjs';\n\nconst supportsLinearEasing = /*@__PURE__*/ memoSupports(() => {\n    try {\n        document\n            .createElement(\"div\")\n            .animate({ opacity: 0 }, { easing: \"linear(0, 1)\" });\n    }\n    catch (e) {\n        return false;\n    }\n    return true;\n}, \"linearEasing\");\n\nexport { supportsLinearEasing };\n//# sourceMappingURL=linear-easing.mjs.map\n","const cubicBezierAsString = ([a, b, c, d]) => `cubic-bezier(${a}, ${b}, ${c}, ${d})`;\n\nexport { cubicBezierAsString };\n//# sourceMappingURL=cubic-bezier.mjs.map\n","import { cubicBezierAsString } from './cubic-bezier.mjs';\n\nconst supportedWaapiEasing = {\n    linear: \"linear\",\n    ease: \"ease\",\n    easeIn: \"ease-in\",\n    easeOut: \"ease-out\",\n    easeInOut: \"ease-in-out\",\n    circIn: /*@__PURE__*/ cubicBezierAsString([0, 0.65, 0.55, 1]),\n    circOut: /*@__PURE__*/ cubicBezierAsString([0.55, 0, 1, 0.45]),\n    backIn: /*@__PURE__*/ cubicBezierAsString([0.31, 0.01, 0.66, -0.59]),\n    backOut: /*@__PURE__*/ cubicBezierAsString([0.33, 1.53, 0.69, 0.99]),\n};\n\nexport { supportedWaapiEasing };\n//# sourceMappingURL=supported.mjs.map\n","import { isBezierDefinition } from 'motion-utils';\nimport { supportsLinearEasing } from '../../../utils/supports/linear-easing.mjs';\nimport { generateLinearEasing } from '../utils/linear.mjs';\nimport { cubicBezierAsString } from './cubic-bezier.mjs';\nimport { supportedWaapiEasing } from './supported.mjs';\n\nfunction mapEasingToNativeEasing(easing, duration) {\n    if (!easing) {\n        return undefined;\n    }\n    else if (typeof easing === \"function\") {\n        return supportsLinearEasing()\n            ? generateLinearEasing(easing, duration)\n            : \"ease-out\";\n    }\n    else if (isBezierDefinition(easing)) {\n        return cubicBezierAsString(easing);\n    }\n    else if (Array.isArray(easing)) {\n        return easing.map((segmentEasing) => mapEasingToNativeEasing(segmentEasing, duration) ||\n            supportedWaapiEasing.easeOut);\n    }\n    else {\n        return supportedWaapiEasing[easing];\n    }\n}\n\nexport { mapEasingToNativeEasing };\n//# sourceMappingURL=map-easing.mjs.map\n","import { activeAnimations } from '../../stats/animation-count.mjs';\nimport { statsBuffer } from '../../stats/buffer.mjs';\nimport { mapEasingToNativeEasing } from './easing/map-easing.mjs';\n\nfunction startWaapiAnimation(element, valueName, keyframes, { delay = 0, duration = 300, repeat = 0, repeatType = \"loop\", ease = \"easeOut\", times, } = {}, pseudoElement = undefined) {\n    const keyframeOptions = {\n        [valueName]: keyframes,\n    };\n    if (times)\n        keyframeOptions.offset = times;\n    const easing = mapEasingToNativeEasing(ease, duration);\n    /**\n     * If this is an easing array, apply to keyframes, not animation as a whole\n     */\n    if (Array.isArray(easing))\n        keyframeOptions.easing = easing;\n    if (statsBuffer.value) {\n        activeAnimations.waapi++;\n    }\n    const options = {\n        delay,\n        duration,\n        easing: !Array.isArray(easing) ? easing : \"linear\",\n        fill: \"both\",\n        iterations: repeat + 1,\n        direction: repeatType === \"reverse\" ? \"alternate\" : \"normal\",\n    };\n    if (pseudoElement)\n        options.pseudoElement = pseudoElement;\n    const animation = element.animate(keyframeOptions, options);\n    if (statsBuffer.value) {\n        animation.finished.finally(() => {\n            activeAnimations.waapi--;\n        });\n    }\n    return animation;\n}\n\nexport { startWaapiAnimation };\n//# sourceMappingURL=start-waapi-animation.mjs.map\n","function isGenerator(type) {\n    return typeof type === \"function\" && \"applyToOptions\" in type;\n}\n\nexport { isGenerator };\n//# sourceMappingURL=is-generator.mjs.map\n","import { supportsLinearEasing } from '../../../utils/supports/linear-easing.mjs';\nimport { isGenerator } from '../../generators/utils/is-generator.mjs';\n\nfunction applyGeneratorOptions({ type, ...options }) {\n    if (isGenerator(type) && supportsLinearEasing()) {\n        return type.applyToOptions(options);\n    }\n    else {\n        options.duration ?? (options.duration = 300);\n        options.ease ?? (options.ease = \"easeOut\");\n    }\n    return options;\n}\n\nexport { applyGeneratorOptions };\n//# sourceMappingURL=apply-generator.mjs.map\n","import { invariant, millisecondsToSeconds, secondsToMilliseconds, noop } from 'motion-utils';\nimport { setStyle } from '../render/dom/style-set.mjs';\nimport { supportsScrollTimeline } from '../utils/supports/scroll-timeline.mjs';\nimport { getFinalKeyframe } from './keyframes/get-final.mjs';\nimport { WithPromise } from './utils/WithPromise.mjs';\nimport { startWaapiAnimation } from './waapi/start-waapi-animation.mjs';\nimport { applyGeneratorOptions } from './waapi/utils/apply-generator.mjs';\n\n/**\n * NativeAnimation implements AnimationPlaybackControls for the browser's Web Animations API.\n */\nclass NativeAnimation extends WithPromise {\n    constructor(options) {\n        super();\n        this.finishedTime = null;\n        this.isStopped = false;\n        /**\n         * Tracks a manually-set start time that takes precedence over WAAPI's\n         * dynamic startTime. This is cleared when play() or time setter is called,\n         * allowing WAAPI to take over timing.\n         */\n        this.manualStartTime = null;\n        if (!options)\n            return;\n        const { element, name, keyframes, pseudoElement, allowFlatten = false, finalKeyframe, onComplete, } = options;\n        this.isPseudoElement = Boolean(pseudoElement);\n        this.allowFlatten = allowFlatten;\n        this.options = options;\n        invariant(typeof options.type !== \"string\", `Mini animate() doesn't support \"type\" as a string.`, \"mini-spring\");\n        const transition = applyGeneratorOptions(options);\n        this.animation = startWaapiAnimation(element, name, keyframes, transition, pseudoElement);\n        if (transition.autoplay === false) {\n            this.animation.pause();\n        }\n        this.animation.onfinish = () => {\n            this.finishedTime = this.time;\n            if (!pseudoElement) {\n                const keyframe = getFinalKeyframe(keyframes, this.options, finalKeyframe, this.speed);\n                if (this.updateMotionValue) {\n                    this.updateMotionValue(keyframe);\n                }\n                /**\n                 * If we can, we want to commit the final style as set by the user,\n                 * rather than the computed keyframe value supplied by the animation.\n                 * We always do this, even when a motion value is present, to prevent\n                 * a visual flash in Firefox where the WAAPI animation's fill is removed\n                 * during cancel() before the scheduled render can apply the correct value.\n                 */\n                setStyle(element, name, keyframe);\n                this.animation.cancel();\n            }\n            onComplete?.();\n            this.notifyFinished();\n        };\n    }\n    play() {\n        if (this.isStopped)\n            return;\n        this.manualStartTime = null;\n        this.animation.play();\n        if (this.state === \"finished\") {\n            this.updateFinished();\n        }\n    }\n    pause() {\n        this.animation.pause();\n    }\n    complete() {\n        this.animation.finish?.();\n    }\n    cancel() {\n        try {\n            this.animation.cancel();\n        }\n        catch (e) { }\n    }\n    stop() {\n        if (this.isStopped)\n            return;\n        this.isStopped = true;\n        const { state } = this;\n        if (state === \"idle\" || state === \"finished\") {\n            return;\n        }\n        if (this.updateMotionValue) {\n            this.updateMotionValue();\n        }\n        else {\n            this.commitStyles();\n        }\n        if (!this.isPseudoElement)\n            this.cancel();\n    }\n    /**\n     * WAAPI doesn't natively have any interruption capabilities.\n     *\n     * In this method, we commit styles back to the DOM before cancelling\n     * the animation.\n     *\n     * This is designed to be overridden by NativeAnimationExtended, which\n     * will create a renderless JS animation and sample it twice to calculate\n     * its current value, \"previous\" value, and therefore allow\n     * Motion to also correctly calculate velocity for any subsequent animation\n     * while deferring the commit until the next animation frame.\n     */\n    commitStyles() {\n        const element = this.options?.element;\n        if (!this.isPseudoElement && element?.isConnected) {\n            this.animation.commitStyles?.();\n        }\n    }\n    get duration() {\n        const duration = this.animation.effect?.getComputedTiming?.().duration || 0;\n        return millisecondsToSeconds(Number(duration));\n    }\n    get iterationDuration() {\n        const { delay = 0 } = this.options || {};\n        return this.duration + millisecondsToSeconds(delay);\n    }\n    get time() {\n        return millisecondsToSeconds(Number(this.animation.currentTime) || 0);\n    }\n    set time(newTime) {\n        const wasFinished = this.finishedTime !== null;\n        this.manualStartTime = null;\n        this.finishedTime = null;\n        this.animation.currentTime = secondsToMilliseconds(newTime);\n        if (wasFinished) {\n            this.animation.pause();\n        }\n    }\n    /**\n     * The playback speed of the animation.\n     * 1 = normal speed, 2 = double speed, 0.5 = half speed.\n     */\n    get speed() {\n        return this.animation.playbackRate;\n    }\n    set speed(newSpeed) {\n        // Allow backwards playback after finishing\n        if (newSpeed < 0)\n            this.finishedTime = null;\n        this.animation.playbackRate = newSpeed;\n    }\n    get state() {\n        return this.finishedTime !== null\n            ? \"finished\"\n            : this.animation.playState;\n    }\n    get startTime() {\n        return this.manualStartTime ?? Number(this.animation.startTime);\n    }\n    set startTime(newStartTime) {\n        this.manualStartTime = this.animation.startTime = newStartTime;\n    }\n    /**\n     * Attaches a timeline to the animation, for instance the `ScrollTimeline`.\n     */\n    attachTimeline({ timeline, rangeStart, rangeEnd, observe, }) {\n        if (this.allowFlatten) {\n            this.animation.effect?.updateTiming({ easing: \"linear\" });\n        }\n        this.animation.onfinish = null;\n        if (timeline && supportsScrollTimeline()) {\n            this.animation.timeline = timeline;\n            if (rangeStart)\n                this.animation.rangeStart = rangeStart;\n            if (rangeEnd)\n                this.animation.rangeEnd = rangeEnd;\n            return noop;\n        }\n        else {\n            return observe(this);\n        }\n    }\n}\n\nexport { NativeAnimation };\n//# sourceMappingURL=NativeAnimation.mjs.map\n","import { circInOut, backInOut, anticipate } from 'motion-utils';\n\nconst unsupportedEasingFunctions = {\n    anticipate,\n    backInOut,\n    circInOut,\n};\nfunction isUnsupportedEase(key) {\n    return key in unsupportedEasingFunctions;\n}\nfunction replaceStringEasing(transition) {\n    if (typeof transition.ease === \"string\" &&\n        isUnsupportedEase(transition.ease)) {\n        transition.ease = unsupportedEasingFunctions[transition.ease];\n    }\n}\n\nexport { replaceStringEasing };\n//# sourceMappingURL=unsupported-easing.mjs.map\n","import { clamp } from 'motion-utils';\nimport { time } from '../frameloop/sync-time.mjs';\nimport { setStyle } from '../render/dom/style-set.mjs';\nimport { JSAnimation } from './JSAnimation.mjs';\nimport { NativeAnimation } from './NativeAnimation.mjs';\nimport { replaceTransitionType } from './utils/replace-transition-type.mjs';\nimport { replaceStringEasing } from './waapi/utils/unsupported-easing.mjs';\n\n/**\n * 10ms is chosen here as it strikes a balance between smooth\n * results (more than one keyframe per frame at 60fps) and\n * keyframe quantity.\n */\nconst sampleDelta = 10; //ms\nclass NativeAnimationExtended extends NativeAnimation {\n    constructor(options) {\n        /**\n         * The base NativeAnimation function only supports a subset\n         * of Motion easings, and WAAPI also only supports some\n         * easing functions via string/cubic-bezier definitions.\n         *\n         * This function replaces those unsupported easing functions\n         * with a JS easing function. This will later get compiled\n         * to a linear() easing function.\n         */\n        replaceStringEasing(options);\n        /**\n         * Ensure we replace the transition type with a generator function\n         * before passing to WAAPI.\n         *\n         * TODO: Does this have a better home? It could be shared with\n         * JSAnimation.\n         */\n        replaceTransitionType(options);\n        super(options);\n        /**\n         * Only set startTime when the animation should autoplay.\n         * Setting startTime on a paused WAAPI animation unpauses it\n         * (per the WAAPI spec), which breaks autoplay: false.\n         */\n        if (options.startTime !== undefined && options.autoplay !== false) {\n            this.startTime = options.startTime;\n        }\n        this.options = options;\n    }\n    /**\n     * WAAPI doesn't natively have any interruption capabilities.\n     *\n     * Rather than read committed styles back out of the DOM, we can\n     * create a renderless JS animation and sample it twice to calculate\n     * its current value, \"previous\" value, and therefore allow\n     * Motion to calculate velocity for any subsequent animation.\n     */\n    updateMotionValue(value) {\n        const { motionValue, onUpdate, onComplete, element, ...options } = this.options;\n        if (!motionValue)\n            return;\n        if (value !== undefined) {\n            motionValue.set(value);\n            return;\n        }\n        const sampleAnimation = new JSAnimation({\n            ...options,\n            autoplay: false,\n        });\n        /**\n         * Use wall-clock elapsed time for sampling.\n         * Under CPU load, WAAPI's currentTime may not reflect actual\n         * elapsed time, causing incorrect sampling and visual jumps.\n         */\n        const sampleTime = Math.max(sampleDelta, time.now() - this.startTime);\n        const delta = clamp(0, sampleDelta, sampleTime - sampleDelta);\n        const current = sampleAnimation.sample(sampleTime).value;\n        /**\n         * Write the estimated value to inline style so it persists\n         * after cancel(), covering the async gap before the next\n         * animation starts.\n         */\n        const { name } = this.options;\n        if (element && name)\n            setStyle(element, name, current);\n        motionValue.setWithVelocity(sampleAnimation.sample(Math.max(0, sampleTime - delta)).value, current, delta);\n        sampleAnimation.stop();\n    }\n}\n\nexport { NativeAnimationExtended };\n//# sourceMappingURL=NativeAnimationExtended.mjs.map\n","import { complex } from '../../value/types/complex/index.mjs';\n\n/**\n * Check if a value is animatable. Examples:\n *\n * ✅: 100, \"100px\", \"#fff\"\n * ❌: \"block\", \"url(2.jpg)\"\n * @param value\n *\n * @internal\n */\nconst isAnimatable = (value, name) => {\n    // If the list of keys that might be non-animatable grows, replace with Set\n    if (name === \"zIndex\")\n        return false;\n    // If it's a number or a keyframes array, we can animate it. We might at some point\n    // need to do a deep isAnimatable check of keyframes, or let Popmotion handle this,\n    // but for now lets leave it like this for performance reasons\n    if (typeof value === \"number\" || Array.isArray(value))\n        return true;\n    if (typeof value === \"string\" && // It's animatable if we have a string\n        (complex.test(value) || value === \"0\") && // And it contains numbers and/or colors\n        !value.startsWith(\"url(\") // Unless it starts with \"url(\"\n    ) {\n        return true;\n    }\n    return false;\n};\n\nexport { isAnimatable };\n//# sourceMappingURL=is-animatable.mjs.map\n","import { warning } from 'motion-utils';\nimport { isGenerator } from '../generators/utils/is-generator.mjs';\nimport { isAnimatable } from './is-animatable.mjs';\n\nfunction hasKeyframesChanged(keyframes) {\n    const current = keyframes[0];\n    if (keyframes.length === 1)\n        return true;\n    for (let i = 0; i < keyframes.length; i++) {\n        if (keyframes[i] !== current)\n            return true;\n    }\n}\nfunction canAnimate(keyframes, name, type, velocity) {\n    /**\n     * Check if we're able to animate between the start and end keyframes,\n     * and throw a warning if we're attempting to animate between one that's\n     * animatable and another that isn't.\n     */\n    const originKeyframe = keyframes[0];\n    if (originKeyframe === null) {\n        return false;\n    }\n    /**\n     * These aren't traditionally animatable but we do support them.\n     * In future we could look into making this more generic or replacing\n     * this function with mix() === mixImmediate\n     */\n    if (name === \"display\" || name === \"visibility\")\n        return true;\n    const targetKeyframe = keyframes[keyframes.length - 1];\n    const isOriginAnimatable = isAnimatable(originKeyframe, name);\n    const isTargetAnimatable = isAnimatable(targetKeyframe, name);\n    warning(isOriginAnimatable === isTargetAnimatable, `You are trying to animate ${name} from \"${originKeyframe}\" to \"${targetKeyframe}\". \"${isOriginAnimatable ? targetKeyframe : originKeyframe}\" is not an animatable value.`, \"value-not-animatable\");\n    // Always skip if any of these are true\n    if (!isOriginAnimatable || !isTargetAnimatable) {\n        return false;\n    }\n    return (hasKeyframesChanged(keyframes) ||\n        ((type === \"spring\" || isGenerator(type)) && velocity));\n}\n\nexport { canAnimate };\n//# sourceMappingURL=can-animate.mjs.map\n","function makeAnimationInstant(options) {\n    options.duration = 0;\n    options.type = \"keyframes\";\n}\n\nexport { makeAnimationInstant };\n//# sourceMappingURL=make-animation-instant.mjs.map\n","/**\n * A list of values that can be hardware-accelerated.\n */\nconst acceleratedValues = new Set([\n    \"opacity\",\n    \"clipPath\",\n    \"filter\",\n    \"transform\",\n    // TODO: Can be accelerated but currently disabled until https://issues.chromium.org/issues/41491098 is resolved\n    // or until we implement support for linear() easing.\n    // \"background-color\"\n]);\n\nexport { acceleratedValues };\n//# sourceMappingURL=accelerated-values.mjs.map\n","const browserColorFunctions = /^(?:oklch|oklab|lab|lch|color|color-mix|light-dark)\\(/;\nfunction hasBrowserOnlyColors(keyframes) {\n    for (let i = 0; i < keyframes.length; i++) {\n        if (typeof keyframes[i] === \"string\" &&\n            browserColorFunctions.test(keyframes[i])) {\n            return true;\n        }\n    }\n    return false;\n}\n\nexport { hasBrowserOnlyColors };\n//# sourceMappingURL=is-browser-color.mjs.map\n","import { memo } from 'motion-utils';\nimport { acceleratedValues } from '../utils/accelerated-values.mjs';\nimport { hasBrowserOnlyColors } from '../utils/is-browser-color.mjs';\n\nconst colorProperties = new Set([\n    \"color\",\n    \"backgroundColor\",\n    \"outlineColor\",\n    \"fill\",\n    \"stroke\",\n    \"borderColor\",\n    \"borderTopColor\",\n    \"borderRightColor\",\n    \"borderBottomColor\",\n    \"borderLeftColor\",\n]);\nconst supportsWaapi = /*@__PURE__*/ memo(() => Object.hasOwnProperty.call(Element.prototype, \"animate\"));\nfunction supportsBrowserAnimation(options) {\n    const { motionValue, name, repeatDelay, repeatType, damping, type, keyframes, } = options;\n    const subject = motionValue?.owner?.current;\n    /**\n     * We use this check instead of isHTMLElement() because we explicitly\n     * **don't** want elements in different timing contexts (i.e. popups)\n     * to be accelerated, as it's not possible to sync these animations\n     * properly with those driven from the main window frameloop.\n     */\n    if (!(subject instanceof HTMLElement)) {\n        return false;\n    }\n    const { onUpdate, transformTemplate } = motionValue.owner.getProps();\n    return (supportsWaapi() &&\n        name &&\n        /**\n         * Force WAAPI for color properties with browser-only color formats\n         * (oklch, oklab, lab, lch, etc.) that the JS animation path can't parse.\n         */\n        (acceleratedValues.has(name) ||\n            (colorProperties.has(name) &&\n                hasBrowserOnlyColors(keyframes))) &&\n        (name !== \"transform\" || !transformTemplate) &&\n        /**\n         * If we're outputting values to onUpdate then we can't use WAAPI as there's\n         * no way to read the value from WAAPI every frame.\n         */\n        !onUpdate &&\n        !repeatDelay &&\n        repeatType !== \"mirror\" &&\n        damping !== 0 &&\n        type !== \"inertia\");\n}\n\nexport { supportsBrowserAnimation };\n//# sourceMappingURL=waapi.mjs.map\n","import { MotionGlobalConfig, noop } from 'motion-utils';\nimport { time } from '../frameloop/sync-time.mjs';\nimport { JSAnimation } from './JSAnimation.mjs';\nimport { getFinalKeyframe } from './keyframes/get-final.mjs';\nimport { KeyframeResolver, flushKeyframeResolvers } from './keyframes/KeyframesResolver.mjs';\nimport { NativeAnimationExtended } from './NativeAnimationExtended.mjs';\nimport { canAnimate } from './utils/can-animate.mjs';\nimport { makeAnimationInstant } from './utils/make-animation-instant.mjs';\nimport { WithPromise } from './utils/WithPromise.mjs';\nimport { supportsBrowserAnimation } from './waapi/supports/waapi.mjs';\n\n/**\n * Maximum time allowed between an animation being created and it being\n * resolved for us to use the latter as the start time.\n *\n * This is to ensure that while we prefer to \"start\" an animation as soon\n * as it's triggered, we also want to avoid a visual jump if there's a big delay\n * between these two moments.\n */\nconst MAX_RESOLVE_DELAY = 40;\nclass AsyncMotionValueAnimation extends WithPromise {\n    constructor({ autoplay = true, delay = 0, type = \"keyframes\", repeat = 0, repeatDelay = 0, repeatType = \"loop\", keyframes, name, motionValue, element, ...options }) {\n        super();\n        /**\n         * Bound to support return animation.stop pattern\n         */\n        this.stop = () => {\n            if (this._animation) {\n                this._animation.stop();\n                this.stopTimeline?.();\n            }\n            this.keyframeResolver?.cancel();\n        };\n        this.createdAt = time.now();\n        const optionsWithDefaults = {\n            autoplay,\n            delay,\n            type,\n            repeat,\n            repeatDelay,\n            repeatType,\n            name,\n            motionValue,\n            element,\n            ...options,\n        };\n        const KeyframeResolver$1 = element?.KeyframeResolver || KeyframeResolver;\n        this.keyframeResolver = new KeyframeResolver$1(keyframes, (resolvedKeyframes, finalKeyframe, forced) => this.onKeyframesResolved(resolvedKeyframes, finalKeyframe, optionsWithDefaults, !forced), name, motionValue, element);\n        this.keyframeResolver?.scheduleResolve();\n    }\n    onKeyframesResolved(keyframes, finalKeyframe, options, sync) {\n        this.keyframeResolver = undefined;\n        const { name, type, velocity, delay, isHandoff, onUpdate } = options;\n        this.resolvedAt = time.now();\n        /**\n         * If we can't animate this value with the resolved keyframes\n         * then we should complete it immediately.\n         */\n        let canAnimateValue = true;\n        if (!canAnimate(keyframes, name, type, velocity)) {\n            canAnimateValue = false;\n            if (MotionGlobalConfig.instantAnimations || !delay) {\n                onUpdate?.(getFinalKeyframe(keyframes, options, finalKeyframe));\n            }\n            keyframes[0] = keyframes[keyframes.length - 1];\n            makeAnimationInstant(options);\n            options.repeat = 0;\n        }\n        /**\n         * Resolve startTime for the animation.\n         *\n         * This method uses the createdAt and resolvedAt to calculate the\n         * animation startTime. *Ideally*, we would use the createdAt time as t=0\n         * as the following frame would then be the first frame of the animation in\n         * progress, which would feel snappier.\n         *\n         * However, if there's a delay (main thread work) between the creation of\n         * the animation and the first committed frame, we prefer to use resolvedAt\n         * to avoid a sudden jump into the animation.\n         */\n        const startTime = sync\n            ? !this.resolvedAt\n                ? this.createdAt\n                : this.resolvedAt - this.createdAt > MAX_RESOLVE_DELAY\n                    ? this.resolvedAt\n                    : this.createdAt\n            : undefined;\n        const resolvedOptions = {\n            startTime,\n            finalKeyframe,\n            ...options,\n            keyframes,\n        };\n        /**\n         * Animate via WAAPI if possible. If this is a handoff animation, the optimised animation will be running via\n         * WAAPI. Therefore, this animation must be JS to ensure it runs \"under\" the\n         * optimised animation.\n         *\n         * Also skip WAAPI when keyframes aren't animatable, as the resolved\n         * values may not be valid CSS and would trigger browser warnings.\n         */\n        const useWaapi = canAnimateValue &&\n            !isHandoff &&\n            supportsBrowserAnimation(resolvedOptions);\n        const element = resolvedOptions.motionValue?.owner?.current;\n        let animation;\n        if (useWaapi) {\n            try {\n                animation = new NativeAnimationExtended({\n                    ...resolvedOptions,\n                    element,\n                });\n            }\n            catch {\n                animation = new JSAnimation(resolvedOptions);\n            }\n        }\n        else {\n            animation = new JSAnimation(resolvedOptions);\n        }\n        animation.finished.then(() => {\n            this.notifyFinished();\n        }).catch(noop);\n        if (this.pendingTimeline) {\n            this.stopTimeline = animation.attachTimeline(this.pendingTimeline);\n            this.pendingTimeline = undefined;\n        }\n        this._animation = animation;\n    }\n    get finished() {\n        if (!this._animation) {\n            return this._finished;\n        }\n        else {\n            return this.animation.finished;\n        }\n    }\n    then(onResolve, _onReject) {\n        return this.finished.finally(onResolve).then(() => { });\n    }\n    get animation() {\n        if (!this._animation) {\n            this.keyframeResolver?.resume();\n            flushKeyframeResolvers();\n        }\n        return this._animation;\n    }\n    get duration() {\n        return this.animation.duration;\n    }\n    get iterationDuration() {\n        return this.animation.iterationDuration;\n    }\n    get time() {\n        return this.animation.time;\n    }\n    set time(newTime) {\n        this.animation.time = newTime;\n    }\n    get speed() {\n        return this.animation.speed;\n    }\n    get state() {\n        return this.animation.state;\n    }\n    set speed(newSpeed) {\n        this.animation.speed = newSpeed;\n    }\n    get startTime() {\n        return this.animation.startTime;\n    }\n    attachTimeline(timeline) {\n        if (this._animation) {\n            this.stopTimeline = this.animation.attachTimeline(timeline);\n        }\n        else {\n            this.pendingTimeline = timeline;\n        }\n        return () => this.stop();\n    }\n    play() {\n        this.animation.play();\n    }\n    pause() {\n        this.animation.pause();\n    }\n    complete() {\n        this.animation.complete();\n    }\n    cancel() {\n        if (this._animation) {\n            this.animation.cancel();\n        }\n        this.keyframeResolver?.cancel();\n    }\n}\n\nexport { AsyncMotionValueAnimation };\n//# sourceMappingURL=AsyncMotionValueAnimation.mjs.map\n","function calcChildStagger(children, child, delayChildren, staggerChildren = 0, staggerDirection = 1) {\n    const index = Array.from(children)\n        .sort((a, b) => a.sortNodePosition(b))\n        .indexOf(child);\n    const numChildren = children.size;\n    const maxStaggerDuration = (numChildren - 1) * staggerChildren;\n    const delayIsFunction = typeof delayChildren === \"function\";\n    return delayIsFunction\n        ? delayChildren(index, numChildren)\n        : staggerDirection === 1\n            ? index * staggerChildren\n            : maxStaggerDuration - index * staggerChildren;\n}\n\nexport { calcChildStagger };\n//# sourceMappingURL=calc-child-stagger.mjs.map\n","import { invariant, isNumericalString } from 'motion-utils';\nimport { isCSSVariableToken } from './is-css-variable.mjs';\n\n/**\n * Parse Framer's special CSS variable format into a CSS token and a fallback.\n *\n * ```\n * `var(--foo, #fff)` => [`--foo`, '#fff']\n * ```\n *\n * @param current\n */\nconst splitCSSVariableRegex = \n// eslint-disable-next-line redos-detector/no-unsafe-regex -- false positive, as it can match a lot of words\n/^var\\(--(?:([\\w-]+)|([\\w-]+), ?([a-zA-Z\\d ()%#.,-]+))\\)/u;\nfunction parseCSSVariable(current) {\n    const match = splitCSSVariableRegex.exec(current);\n    if (!match)\n        return [,];\n    const [, token1, token2, fallback] = match;\n    return [`--${token1 ?? token2}`, fallback];\n}\nconst maxDepth = 4;\nfunction getVariableValue(current, element, depth = 1) {\n    invariant(depth <= maxDepth, `Max CSS variable fallback depth detected in property \"${current}\". This may indicate a circular fallback dependency.`, \"max-css-var-depth\");\n    const [token, fallback] = parseCSSVariable(current);\n    // No CSS variable detected\n    if (!token)\n        return;\n    // Attempt to read this CSS variable off the element\n    const resolved = window.getComputedStyle(element).getPropertyValue(token);\n    if (resolved) {\n        const trimmed = resolved.trim();\n        return isNumericalString(trimmed) ? parseFloat(trimmed) : trimmed;\n    }\n    return isCSSVariableToken(fallback)\n        ? getVariableValue(fallback, element, depth + 1)\n        : fallback;\n}\n\nexport { getVariableValue, parseCSSVariable };\n//# sourceMappingURL=css-variables-conversion.mjs.map\n","import { transformProps } from '../../render/utils/keys-transform.mjs';\n\nconst underDampedSpring = {\n    type: \"spring\",\n    stiffness: 500,\n    damping: 25,\n    restSpeed: 10,\n};\nconst criticallyDampedSpring = (target) => ({\n    type: \"spring\",\n    stiffness: 550,\n    damping: target === 0 ? 2 * Math.sqrt(550) : 30,\n    restSpeed: 10,\n});\nconst keyframesTransition = {\n    type: \"keyframes\",\n    duration: 0.8,\n};\n/**\n * Default easing curve is a slightly shallower version of\n * the default browser easing curve.\n */\nconst ease = {\n    type: \"keyframes\",\n    ease: [0.25, 0.1, 0.35, 1],\n    duration: 0.3,\n};\nconst getDefaultTransition = (valueKey, { keyframes }) => {\n    if (keyframes.length > 2) {\n        return keyframesTransition;\n    }\n    else if (transformProps.has(valueKey)) {\n        return valueKey.startsWith(\"scale\")\n            ? criticallyDampedSpring(keyframes[1])\n            : underDampedSpring;\n    }\n    return ease;\n};\n\nexport { getDefaultTransition };\n//# sourceMappingURL=default-transitions.mjs.map\n","/**\n * If `transition` has `inherit: true`, shallow-merge it with\n * `parentTransition` (child keys win) and strip the `inherit` key.\n * Otherwise return `transition` unchanged.\n */\nfunction resolveTransition(transition, parentTransition) {\n    if (transition?.inherit && parentTransition) {\n        const { inherit: _, ...rest } = transition;\n        return { ...parentTransition, ...rest };\n    }\n    return transition;\n}\n\nexport { resolveTransition };\n//# sourceMappingURL=resolve-transition.mjs.map\n","import { resolveTransition } from './resolve-transition.mjs';\n\nfunction getValueTransition(transition, key) {\n    const valueTransition = transition?.[key] ??\n        transition?.[\"default\"] ??\n        transition;\n    if (valueTransition !== transition) {\n        return resolveTransition(valueTransition, transition);\n    }\n    return valueTransition;\n}\n\nexport { getValueTransition };\n//# sourceMappingURL=get-value-transition.mjs.map\n","const orchestrationKeys = new Set([\n    \"when\",\n    \"delay\",\n    \"delayChildren\",\n    \"staggerChildren\",\n    \"staggerDirection\",\n    \"repeat\",\n    \"repeatType\",\n    \"repeatDelay\",\n    \"from\",\n    \"elapsed\",\n]);\n/**\n * Decide whether a transition is defined on a given Transition.\n * This filters out orchestration options and returns true\n * if any options are left.\n */\nfunction isTransitionDefined(transition) {\n    for (const key in transition) {\n        if (!orchestrationKeys.has(key))\n            return true;\n    }\n    return false;\n}\n\nexport { isTransitionDefined };\n//# sourceMappingURL=is-transition-defined.mjs.map\n","import { secondsToMilliseconds, MotionGlobalConfig } from 'motion-utils';\nimport { AsyncMotionValueAnimation } from '../AsyncMotionValueAnimation.mjs';\nimport { JSAnimation } from '../JSAnimation.mjs';\nimport { getValueTransition } from '../utils/get-value-transition.mjs';\nimport { makeAnimationInstant } from '../utils/make-animation-instant.mjs';\nimport { getDefaultTransition } from '../utils/default-transitions.mjs';\nimport { getFinalKeyframe } from '../keyframes/get-final.mjs';\nimport { isTransitionDefined } from '../utils/is-transition-defined.mjs';\nimport { frame } from '../../frameloop/frame.mjs';\n\nconst animateMotionValue = (name, value, target, transition = {}, element, isHandoff) => (onComplete) => {\n    const valueTransition = getValueTransition(transition, name) || {};\n    /**\n     * Most transition values are currently completely overwritten by value-specific\n     * transitions. In the future it'd be nicer to blend these transitions. But for now\n     * delay actually does inherit from the root transition if not value-specific.\n     */\n    const delay = valueTransition.delay || transition.delay || 0;\n    /**\n     * Elapsed isn't a public transition option but can be passed through from\n     * optimized appear effects in milliseconds.\n     */\n    let { elapsed = 0 } = transition;\n    elapsed = elapsed - secondsToMilliseconds(delay);\n    const options = {\n        keyframes: Array.isArray(target) ? target : [null, target],\n        ease: \"easeOut\",\n        velocity: value.getVelocity(),\n        ...valueTransition,\n        delay: -elapsed,\n        onUpdate: (v) => {\n            value.set(v);\n            valueTransition.onUpdate && valueTransition.onUpdate(v);\n        },\n        onComplete: () => {\n            onComplete();\n            valueTransition.onComplete && valueTransition.onComplete();\n        },\n        name,\n        motionValue: value,\n        element: isHandoff ? undefined : element,\n    };\n    /**\n     * If there's no transition defined for this value, we can generate\n     * unique transition settings for this value.\n     */\n    if (!isTransitionDefined(valueTransition)) {\n        Object.assign(options, getDefaultTransition(name, options));\n    }\n    /**\n     * Both WAAPI and our internal animation functions use durations\n     * as defined by milliseconds, while our external API defines them\n     * as seconds.\n     */\n    options.duration && (options.duration = secondsToMilliseconds(options.duration));\n    options.repeatDelay && (options.repeatDelay = secondsToMilliseconds(options.repeatDelay));\n    /**\n     * Support deprecated way to set initial value. Prefer keyframe syntax.\n     */\n    if (options.from !== undefined) {\n        options.keyframes[0] = options.from;\n    }\n    let shouldSkip = false;\n    if (options.type === false ||\n        (options.duration === 0 && !options.repeatDelay)) {\n        makeAnimationInstant(options);\n        if (options.delay === 0) {\n            shouldSkip = true;\n        }\n    }\n    if (MotionGlobalConfig.instantAnimations ||\n        MotionGlobalConfig.skipAnimations ||\n        element?.shouldSkipAnimations) {\n        shouldSkip = true;\n        makeAnimationInstant(options);\n        options.delay = 0;\n    }\n    /**\n     * If the transition type or easing has been explicitly set by the user\n     * then we don't want to allow flattening the animation.\n     */\n    options.allowFlatten = !valueTransition.type && !valueTransition.ease;\n    /**\n     * If we can or must skip creating the animation, and apply only\n     * the final keyframe, do so. We also check once keyframes are resolved but\n     * this early check prevents the need to create an animation at all.\n     */\n    if (shouldSkip && !isHandoff && value.get() !== undefined) {\n        const finalKeyframe = getFinalKeyframe(options.keyframes, valueTransition);\n        if (finalKeyframe !== undefined) {\n            frame.update(() => {\n                options.onUpdate(finalKeyframe);\n                options.onComplete();\n            });\n            return;\n        }\n    }\n    return valueTransition.isSync\n        ? new JSAnimation(options)\n        : new AsyncMotionValueAnimation(options);\n};\n\nexport { animateMotionValue };\n//# sourceMappingURL=motion-value.mjs.map\n","function getValueState(visualElement) {\n    const state = [{}, {}];\n    visualElement?.values.forEach((value, key) => {\n        state[0][key] = value.get();\n        state[1][key] = value.getVelocity();\n    });\n    return state;\n}\nfunction resolveVariantFromProps(props, definition, custom, visualElement) {\n    /**\n     * If the variant definition is a function, resolve.\n     */\n    if (typeof definition === \"function\") {\n        const [current, velocity] = getValueState(visualElement);\n        definition = definition(custom !== undefined ? custom : props.custom, current, velocity);\n    }\n    /**\n     * If the variant definition is a variant label, or\n     * the function returned a variant label, resolve.\n     */\n    if (typeof definition === \"string\") {\n        definition = props.variants && props.variants[definition];\n    }\n    /**\n     * At this point we've resolved both functions and variant labels,\n     * but the resolved variant label might itself have been a function.\n     * If so, resolve. This can only have returned a valid target object.\n     */\n    if (typeof definition === \"function\") {\n        const [current, velocity] = getValueState(visualElement);\n        definition = definition(custom !== undefined ? custom : props.custom, current, velocity);\n    }\n    return definition;\n}\n\nexport { resolveVariantFromProps };\n//# sourceMappingURL=resolve-variants.mjs.map\n","import { resolveVariantFromProps } from './resolve-variants.mjs';\n\nfunction resolveVariant(visualElement, definition, custom) {\n    const props = visualElement.getProps();\n    return resolveVariantFromProps(props, definition, custom !== undefined ? custom : props.custom, visualElement);\n}\n\nexport { resolveVariant };\n//# sourceMappingURL=resolve-dynamic-variants.mjs.map\n","import { transformPropOrder } from './keys-transform.mjs';\n\nconst positionalKeys = new Set([\n    \"width\",\n    \"height\",\n    \"top\",\n    \"left\",\n    \"right\",\n    \"bottom\",\n    ...transformPropOrder,\n]);\n\nexport { positionalKeys };\n//# sourceMappingURL=keys-position.mjs.map\n","import { warnOnce, SubscriptionManager, velocityPerSecond } from 'motion-utils';\nimport { time } from '../frameloop/sync-time.mjs';\nimport { frame } from '../frameloop/frame.mjs';\n\n/**\n * Maximum time between the value of two frames, beyond which we\n * assume the velocity has since been 0.\n */\nconst MAX_VELOCITY_DELTA = 30;\nconst isFloat = (value) => {\n    return !isNaN(parseFloat(value));\n};\nconst collectMotionValues = {\n    current: undefined,\n};\n/**\n * `MotionValue` is used to track the state and velocity of motion values.\n *\n * @public\n */\nclass MotionValue {\n    /**\n     * @param init - The initiating value\n     * @param config - Optional configuration options\n     *\n     * -  `transformer`: A function to transform incoming values with.\n     */\n    constructor(init, options = {}) {\n        /**\n         * Tracks whether this value can output a velocity. Currently this is only true\n         * if the value is numerical, but we might be able to widen the scope here and support\n         * other value types.\n         *\n         * @internal\n         */\n        this.canTrackVelocity = null;\n        /**\n         * An object containing a SubscriptionManager for each active event.\n         */\n        this.events = {};\n        this.updateAndNotify = (v) => {\n            const currentTime = time.now();\n            /**\n             * If we're updating the value during another frame or eventloop\n             * than the previous frame, then the we set the previous frame value\n             * to current.\n             */\n            if (this.updatedAt !== currentTime) {\n                this.setPrevFrameValue();\n            }\n            this.prev = this.current;\n            this.setCurrent(v);\n            // Update update subscribers\n            if (this.current !== this.prev) {\n                this.events.change?.notify(this.current);\n                if (this.dependents) {\n                    for (const dependent of this.dependents) {\n                        dependent.dirty();\n                    }\n                }\n            }\n        };\n        this.hasAnimated = false;\n        this.setCurrent(init);\n        this.owner = options.owner;\n    }\n    setCurrent(current) {\n        this.current = current;\n        this.updatedAt = time.now();\n        if (this.canTrackVelocity === null && current !== undefined) {\n            this.canTrackVelocity = isFloat(this.current);\n        }\n    }\n    setPrevFrameValue(prevFrameValue = this.current) {\n        this.prevFrameValue = prevFrameValue;\n        this.prevUpdatedAt = this.updatedAt;\n    }\n    /**\n     * Adds a function that will be notified when the `MotionValue` is updated.\n     *\n     * It returns a function that, when called, will cancel the subscription.\n     *\n     * When calling `onChange` inside a React component, it should be wrapped with the\n     * `useEffect` hook. As it returns an unsubscribe function, this should be returned\n     * from the `useEffect` function to ensure you don't add duplicate subscribers..\n     *\n     * ```jsx\n     * export const MyComponent = () => {\n     *   const x = useMotionValue(0)\n     *   const y = useMotionValue(0)\n     *   const opacity = useMotionValue(1)\n     *\n     *   useEffect(() => {\n     *     function updateOpacity() {\n     *       const maxXY = Math.max(x.get(), y.get())\n     *       const newOpacity = transform(maxXY, [0, 100], [1, 0])\n     *       opacity.set(newOpacity)\n     *     }\n     *\n     *     const unsubscribeX = x.on(\"change\", updateOpacity)\n     *     const unsubscribeY = y.on(\"change\", updateOpacity)\n     *\n     *     return () => {\n     *       unsubscribeX()\n     *       unsubscribeY()\n     *     }\n     *   }, [])\n     *\n     *   return <motion.div style={{ x }} />\n     * }\n     * ```\n     *\n     * @param subscriber - A function that receives the latest value.\n     * @returns A function that, when called, will cancel this subscription.\n     *\n     * @deprecated\n     */\n    onChange(subscription) {\n        if (process.env.NODE_ENV !== \"production\") {\n            warnOnce(false, `value.onChange(callback) is deprecated. Switch to value.on(\"change\", callback).`);\n        }\n        return this.on(\"change\", subscription);\n    }\n    on(eventName, callback) {\n        if (!this.events[eventName]) {\n            this.events[eventName] = new SubscriptionManager();\n        }\n        const unsubscribe = this.events[eventName].add(callback);\n        if (eventName === \"change\") {\n            return () => {\n                unsubscribe();\n                /**\n                 * If we have no more change listeners by the start\n                 * of the next frame, stop active animations.\n                 */\n                frame.read(() => {\n                    if (!this.events.change.getSize()) {\n                        this.stop();\n                    }\n                });\n            };\n        }\n        return unsubscribe;\n    }\n    clearListeners() {\n        for (const eventManagers in this.events) {\n            this.events[eventManagers].clear();\n        }\n    }\n    /**\n     * Attaches a passive effect to the `MotionValue`.\n     */\n    attach(passiveEffect, stopPassiveEffect) {\n        this.passiveEffect = passiveEffect;\n        this.stopPassiveEffect = stopPassiveEffect;\n    }\n    /**\n     * Sets the state of the `MotionValue`.\n     *\n     * @remarks\n     *\n     * ```jsx\n     * const x = useMotionValue(0)\n     * x.set(10)\n     * ```\n     *\n     * @param latest - Latest value to set.\n     * @param render - Whether to notify render subscribers. Defaults to `true`\n     *\n     * @public\n     */\n    set(v) {\n        if (!this.passiveEffect) {\n            this.updateAndNotify(v);\n        }\n        else {\n            this.passiveEffect(v, this.updateAndNotify);\n        }\n    }\n    setWithVelocity(prev, current, delta) {\n        this.set(current);\n        this.prev = undefined;\n        this.prevFrameValue = prev;\n        this.prevUpdatedAt = this.updatedAt - delta;\n    }\n    /**\n     * Set the state of the `MotionValue`, stopping any active animations,\n     * effects, and resets velocity to `0`.\n     */\n    jump(v, endAnimation = true) {\n        this.updateAndNotify(v);\n        this.prev = v;\n        this.prevUpdatedAt = this.prevFrameValue = undefined;\n        endAnimation && this.stop();\n        if (this.stopPassiveEffect)\n            this.stopPassiveEffect();\n    }\n    dirty() {\n        this.events.change?.notify(this.current);\n    }\n    addDependent(dependent) {\n        if (!this.dependents) {\n            this.dependents = new Set();\n        }\n        this.dependents.add(dependent);\n    }\n    removeDependent(dependent) {\n        if (this.dependents) {\n            this.dependents.delete(dependent);\n        }\n    }\n    /**\n     * Returns the latest state of `MotionValue`\n     *\n     * @returns - The latest state of `MotionValue`\n     *\n     * @public\n     */\n    get() {\n        if (collectMotionValues.current) {\n            collectMotionValues.current.push(this);\n        }\n        return this.current;\n    }\n    /**\n     * @public\n     */\n    getPrevious() {\n        return this.prev;\n    }\n    /**\n     * Returns the latest velocity of `MotionValue`\n     *\n     * @returns - The latest velocity of `MotionValue`. Returns `0` if the state is non-numerical.\n     *\n     * @public\n     */\n    getVelocity() {\n        const currentTime = time.now();\n        if (!this.canTrackVelocity ||\n            this.prevFrameValue === undefined ||\n            currentTime - this.updatedAt > MAX_VELOCITY_DELTA) {\n            return 0;\n        }\n        const delta = Math.min(this.updatedAt - this.prevUpdatedAt, MAX_VELOCITY_DELTA);\n        // Casts because of parseFloat's poor typing\n        return velocityPerSecond(parseFloat(this.current) -\n            parseFloat(this.prevFrameValue), delta);\n    }\n    /**\n     * Registers a new animation to control this `MotionValue`. Only one\n     * animation can drive a `MotionValue` at one time.\n     *\n     * ```jsx\n     * value.start()\n     * ```\n     *\n     * @param animation - A function that starts the provided animation\n     */\n    start(startAnimation) {\n        this.stop();\n        return new Promise((resolve) => {\n            this.hasAnimated = true;\n            this.animation = startAnimation(resolve);\n            if (this.events.animationStart) {\n                this.events.animationStart.notify();\n            }\n        }).then(() => {\n            if (this.events.animationComplete) {\n                this.events.animationComplete.notify();\n            }\n            this.clearAnimation();\n        });\n    }\n    /**\n     * Stop the currently active animation.\n     *\n     * @public\n     */\n    stop() {\n        if (this.animation) {\n            this.animation.stop();\n            if (this.events.animationCancel) {\n                this.events.animationCancel.notify();\n            }\n        }\n        this.clearAnimation();\n    }\n    /**\n     * Returns `true` if this value is currently animating.\n     *\n     * @public\n     */\n    isAnimating() {\n        return !!this.animation;\n    }\n    clearAnimation() {\n        delete this.animation;\n    }\n    /**\n     * Destroy and clean up subscribers to this `MotionValue`.\n     *\n     * The `MotionValue` hooks like `useMotionValue` and `useTransform` automatically\n     * handle the lifecycle of the returned `MotionValue`, so this method is only necessary if you've manually\n     * created a `MotionValue` via the `motionValue` function.\n     *\n     * @public\n     */\n    destroy() {\n        this.dependents?.clear();\n        this.events.destroy?.notify();\n        this.clearListeners();\n        this.stop();\n        if (this.stopPassiveEffect) {\n            this.stopPassiveEffect();\n        }\n    }\n}\nfunction motionValue(init, options) {\n    return new MotionValue(init, options);\n}\n\nexport { MotionValue, collectMotionValues, motionValue };\n//# sourceMappingURL=index.mjs.map\n","const isKeyframesTarget = (v) => {\n    return Array.isArray(v);\n};\n\nexport { isKeyframesTarget };\n//# sourceMappingURL=is-keyframes-target.mjs.map\n","import { motionValue } from '../../value/index.mjs';\nimport { resolveVariant } from './resolve-dynamic-variants.mjs';\nimport { isKeyframesTarget } from './is-keyframes-target.mjs';\n\n/**\n * Set VisualElement's MotionValue, creating a new MotionValue for it if\n * it doesn't exist.\n */\nfunction setMotionValue(visualElement, key, value) {\n    if (visualElement.hasValue(key)) {\n        visualElement.getValue(key).set(value);\n    }\n    else {\n        visualElement.addValue(key, motionValue(value));\n    }\n}\nfunction resolveFinalValueInKeyframes(v) {\n    // TODO maybe throw if v.length - 1 is placeholder token?\n    return isKeyframesTarget(v) ? v[v.length - 1] || 0 : v;\n}\nfunction setTarget(visualElement, definition) {\n    const resolved = resolveVariant(visualElement, definition);\n    let { transitionEnd = {}, transition = {}, ...target } = resolved || {};\n    target = { ...target, ...transitionEnd };\n    for (const key in target) {\n        const value = resolveFinalValueInKeyframes(target[key]);\n        setMotionValue(visualElement, key, value);\n    }\n}\n\nexport { setTarget };\n//# sourceMappingURL=setters.mjs.map\n","const isMotionValue = (value) => Boolean(value && value.getVelocity);\n\nexport { isMotionValue };\n//# sourceMappingURL=is-motion-value.mjs.map\n","import { isMotionValue } from '../utils/is-motion-value.mjs';\n\nfunction isWillChangeMotionValue(value) {\n    return Boolean(isMotionValue(value) && value.add);\n}\n\nexport { isWillChangeMotionValue };\n//# sourceMappingURL=is.mjs.map\n","import { MotionGlobalConfig } from 'motion-utils';\nimport { isWillChangeMotionValue } from './is.mjs';\n\nfunction addValueToWillChange(visualElement, key) {\n    const willChange = visualElement.getValue(\"willChange\");\n    /**\n     * It could be that a user has set willChange to a regular MotionValue,\n     * in which case we can't add the value to it.\n     */\n    if (isWillChangeMotionValue(willChange)) {\n        return willChange.add(key);\n    }\n    else if (!willChange && MotionGlobalConfig.WillChange) {\n        const newWillChange = new MotionGlobalConfig.WillChange(\"auto\");\n        visualElement.addValue(\"willChange\", newWillChange);\n        newWillChange.add(key);\n    }\n}\n\nexport { addValueToWillChange };\n//# sourceMappingURL=add-will-change.mjs.map\n","function camelToDash(str) {\n    return str.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`);\n}\n\nexport { camelToDash };\n//# sourceMappingURL=camel-to-dash.mjs.map\n","import { camelToDash } from '../../render/dom/utils/camel-to-dash.mjs';\n\nconst optimizedAppearDataId = \"framerAppearId\";\nconst optimizedAppearDataAttribute = \"data-\" + camelToDash(optimizedAppearDataId);\n\nexport { optimizedAppearDataAttribute, optimizedAppearDataId };\n//# sourceMappingURL=data-id.mjs.map\n","import { optimizedAppearDataAttribute } from './data-id.mjs';\n\nfunction getOptimisedAppearId(visualElement) {\n    return visualElement.props[optimizedAppearDataAttribute];\n}\n\nexport { getOptimisedAppearId };\n//# sourceMappingURL=get-appear-id.mjs.map\n","import { getValueTransition } from '../utils/get-value-transition.mjs';\nimport { resolveTransition } from '../utils/resolve-transition.mjs';\nimport { positionalKeys } from '../../render/utils/keys-position.mjs';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { addValueToWillChange } from '../../value/will-change/add-will-change.mjs';\nimport { getOptimisedAppearId } from '../optimized-appear/get-appear-id.mjs';\nimport { animateMotionValue } from './motion-value.mjs';\nimport { frame } from '../../frameloop/frame.mjs';\n\n/**\n * Decide whether we should block this animation. Previously, we achieved this\n * just by checking whether the key was listed in protectedKeys, but this\n * posed problems if an animation was triggered by afterChildren and protectedKeys\n * had been set to true in the meantime.\n */\nfunction shouldBlockAnimation({ protectedKeys, needsAnimating }, key) {\n    const shouldBlock = protectedKeys.hasOwnProperty(key) && needsAnimating[key] !== true;\n    needsAnimating[key] = false;\n    return shouldBlock;\n}\nfunction animateTarget(visualElement, targetAndTransition, { delay = 0, transitionOverride, type } = {}) {\n    let { transition, transitionEnd, ...target } = targetAndTransition;\n    const defaultTransition = visualElement.getDefaultTransition();\n    transition = transition\n        ? resolveTransition(transition, defaultTransition)\n        : defaultTransition;\n    const reduceMotion = transition?.reduceMotion;\n    if (transitionOverride)\n        transition = transitionOverride;\n    const animations = [];\n    const animationTypeState = type &&\n        visualElement.animationState &&\n        visualElement.animationState.getState()[type];\n    for (const key in target) {\n        const value = visualElement.getValue(key, visualElement.latestValues[key] ?? null);\n        const valueTarget = target[key];\n        if (valueTarget === undefined ||\n            (animationTypeState &&\n                shouldBlockAnimation(animationTypeState, key))) {\n            continue;\n        }\n        const valueTransition = {\n            delay,\n            ...getValueTransition(transition || {}, key),\n        };\n        /**\n         * If the value is already at the defined target, skip the animation.\n         * We still re-assert the value via frame.update to take precedence\n         * over any stale transitionEnd callbacks from previous animations.\n         */\n        const currentValue = value.get();\n        if (currentValue !== undefined &&\n            !value.isAnimating() &&\n            !Array.isArray(valueTarget) &&\n            valueTarget === currentValue &&\n            !valueTransition.velocity) {\n            frame.update(() => value.set(valueTarget));\n            continue;\n        }\n        /**\n         * If this is the first time a value is being animated, check\n         * to see if we're handling off from an existing animation.\n         */\n        let isHandoff = false;\n        if (window.MotionHandoffAnimation) {\n            const appearId = getOptimisedAppearId(visualElement);\n            if (appearId) {\n                const startTime = window.MotionHandoffAnimation(appearId, key, frame);\n                if (startTime !== null) {\n                    valueTransition.startTime = startTime;\n                    isHandoff = true;\n                }\n            }\n        }\n        addValueToWillChange(visualElement, key);\n        const shouldReduceMotion = reduceMotion ?? visualElement.shouldReduceMotion;\n        value.start(animateMotionValue(key, value, valueTarget, shouldReduceMotion && positionalKeys.has(key)\n            ? { type: false }\n            : valueTransition, visualElement, isHandoff));\n        const animation = value.animation;\n        if (animation) {\n            animations.push(animation);\n        }\n    }\n    if (transitionEnd) {\n        const applyTransitionEnd = () => frame.update(() => {\n            transitionEnd && setTarget(visualElement, transitionEnd);\n        });\n        if (animations.length) {\n            Promise.all(animations).then(applyTransitionEnd);\n        }\n        else {\n            applyTransitionEnd();\n        }\n    }\n    return animations;\n}\n\nexport { animateTarget };\n//# sourceMappingURL=visual-element-target.mjs.map\n","import { resolveVariant } from '../../render/utils/resolve-dynamic-variants.mjs';\nimport { calcChildStagger } from '../utils/calc-child-stagger.mjs';\nimport { animateTarget } from './visual-element-target.mjs';\n\nfunction animateVariant(visualElement, variant, options = {}) {\n    const resolved = resolveVariant(visualElement, variant, options.type === \"exit\"\n        ? visualElement.presenceContext?.custom\n        : undefined);\n    let { transition = visualElement.getDefaultTransition() || {} } = resolved || {};\n    if (options.transitionOverride) {\n        transition = options.transitionOverride;\n    }\n    /**\n     * If we have a variant, create a callback that runs it as an animation.\n     * Otherwise, we resolve a Promise immediately for a composable no-op.\n     */\n    const getAnimation = resolved\n        ? () => Promise.all(animateTarget(visualElement, resolved, options))\n        : () => Promise.resolve();\n    /**\n     * If we have children, create a callback that runs all their animations.\n     * Otherwise, we resolve a Promise immediately for a composable no-op.\n     */\n    const getChildAnimations = visualElement.variantChildren && visualElement.variantChildren.size\n        ? (forwardDelay = 0) => {\n            const { delayChildren = 0, staggerChildren, staggerDirection, } = transition;\n            return animateChildren(visualElement, variant, forwardDelay, delayChildren, staggerChildren, staggerDirection, options);\n        }\n        : () => Promise.resolve();\n    /**\n     * If the transition explicitly defines a \"when\" option, we need to resolve either\n     * this animation or all children animations before playing the other.\n     */\n    const { when } = transition;\n    if (when) {\n        const [first, last] = when === \"beforeChildren\"\n            ? [getAnimation, getChildAnimations]\n            : [getChildAnimations, getAnimation];\n        return first().then(() => last());\n    }\n    else {\n        return Promise.all([getAnimation(), getChildAnimations(options.delay)]);\n    }\n}\nfunction animateChildren(visualElement, variant, delay = 0, delayChildren = 0, staggerChildren = 0, staggerDirection = 1, options) {\n    const animations = [];\n    for (const child of visualElement.variantChildren) {\n        child.notify(\"AnimationStart\", variant);\n        animations.push(animateVariant(child, variant, {\n            ...options,\n            delay: delay +\n                (typeof delayChildren === \"function\" ? 0 : delayChildren) +\n                calcChildStagger(visualElement.variantChildren, child, delayChildren, staggerChildren, staggerDirection),\n        }).then(() => child.notify(\"AnimationComplete\", variant)));\n    }\n    return Promise.all(animations);\n}\n\nexport { animateVariant };\n//# sourceMappingURL=visual-element-variant.mjs.map\n","import { resolveVariant } from '../../render/utils/resolve-dynamic-variants.mjs';\nimport { animateTarget } from './visual-element-target.mjs';\nimport { animateVariant } from './visual-element-variant.mjs';\n\nfunction animateVisualElement(visualElement, definition, options = {}) {\n    visualElement.notify(\"AnimationStart\", definition);\n    let animation;\n    if (Array.isArray(definition)) {\n        const animations = definition.map((variant) => animateVariant(visualElement, variant, options));\n        animation = Promise.all(animations);\n    }\n    else if (typeof definition === \"string\") {\n        animation = animateVariant(visualElement, definition, options);\n    }\n    else {\n        const resolvedDefinition = typeof definition === \"function\"\n            ? resolveVariant(visualElement, definition, options.custom)\n            : definition;\n        animation = Promise.all(animateTarget(visualElement, resolvedDefinition, options));\n    }\n    return animation.then(() => {\n        visualElement.notify(\"AnimationComplete\", definition);\n    });\n}\n\nexport { animateVisualElement };\n//# sourceMappingURL=visual-element.mjs.map\n","/**\n * ValueType for \"auto\"\n */\nconst auto = {\n    test: (v) => v === \"auto\",\n    parse: (v) => v,\n};\n\nexport { auto };\n//# sourceMappingURL=auto.mjs.map\n","/**\n * Tests a provided value against a ValueType\n */\nconst testValueType = (v) => (type) => type.test(v);\n\nexport { testValueType };\n//# sourceMappingURL=test.mjs.map\n","import { auto } from './auto.mjs';\nimport { number } from './numbers/index.mjs';\nimport { px, percent, degrees, vw, vh } from './numbers/units.mjs';\nimport { testValueType } from './test.mjs';\n\n/**\n * A list of value types commonly used for dimensions\n */\nconst dimensionValueTypes = [number, px, percent, degrees, vw, vh, auto];\n/**\n * Tests a dimensional value against the list of dimension ValueTypes\n */\nconst findDimensionValueType = (v) => dimensionValueTypes.find(testValueType(v));\n\nexport { dimensionValueTypes, findDimensionValueType };\n//# sourceMappingURL=dimensions.mjs.map\n","import { isZeroValueString } from 'motion-utils';\n\nfunction isNone(value) {\n    if (typeof value === \"number\") {\n        return value === 0;\n    }\n    else if (value !== null) {\n        return value === \"none\" || value === \"0\" || isZeroValueString(value);\n    }\n    else {\n        return true;\n    }\n}\n\nexport { isNone };\n//# sourceMappingURL=is-none.mjs.map\n","import { complex } from './index.mjs';\nimport { floatRegex } from '../utils/float-regex.mjs';\n\n/**\n * Properties that should default to 1 or 100%\n */\nconst maxDefaults = new Set([\"brightness\", \"contrast\", \"saturate\", \"opacity\"]);\nfunction applyDefaultFilter(v) {\n    const [name, value] = v.slice(0, -1).split(\"(\");\n    if (name === \"drop-shadow\")\n        return v;\n    const [number] = value.match(floatRegex) || [];\n    if (!number)\n        return v;\n    const unit = value.replace(number, \"\");\n    let defaultValue = maxDefaults.has(name) ? 1 : 0;\n    if (number !== value)\n        defaultValue *= 100;\n    return name + \"(\" + defaultValue + unit + \")\";\n}\nconst functionRegex = /\\b([a-z-]*)\\(.*?\\)/gu;\nconst filter = {\n    ...complex,\n    getAnimatableNone: (v) => {\n        const functions = v.match(functionRegex);\n        return functions ? functions.map(applyDefaultFilter).join(\" \") : v;\n    },\n};\n\nexport { filter };\n//# sourceMappingURL=filter.mjs.map\n","import { complex } from './index.mjs';\n\nconst mask = {\n    ...complex,\n    getAnimatableNone: (v) => {\n        const parsed = complex.parse(v);\n        const transformer = complex.createTransformer(v);\n        return transformer(parsed.map((v) => typeof v === \"number\" ? 0 : typeof v === \"object\" ? { ...v, alpha: 1 } : v));\n    },\n};\n\nexport { mask };\n//# sourceMappingURL=mask.mjs.map\n","import { number } from './numbers/index.mjs';\n\nconst int = {\n    ...number,\n    transform: Math.round,\n};\n\nexport { int };\n//# sourceMappingURL=int.mjs.map\n","import { alpha, scale } from '../numbers/index.mjs';\nimport { px, progressPercentage, degrees } from '../numbers/units.mjs';\n\nconst transformValueTypes = {\n    rotate: degrees,\n    rotateX: degrees,\n    rotateY: degrees,\n    rotateZ: degrees,\n    scale,\n    scaleX: scale,\n    scaleY: scale,\n    scaleZ: scale,\n    skew: degrees,\n    skewX: degrees,\n    skewY: degrees,\n    distance: px,\n    translateX: px,\n    translateY: px,\n    translateZ: px,\n    x: px,\n    y: px,\n    z: px,\n    perspective: px,\n    transformPerspective: px,\n    opacity: alpha,\n    originX: progressPercentage,\n    originY: progressPercentage,\n    originZ: px,\n};\n\nexport { transformValueTypes };\n//# sourceMappingURL=transform.mjs.map\n","import { int } from '../int.mjs';\nimport { alpha } from '../numbers/index.mjs';\nimport { px } from '../numbers/units.mjs';\nimport { transformValueTypes } from './transform.mjs';\n\nconst numberValueTypes = {\n    // Border props\n    borderWidth: px,\n    borderTopWidth: px,\n    borderRightWidth: px,\n    borderBottomWidth: px,\n    borderLeftWidth: px,\n    borderRadius: px,\n    borderTopLeftRadius: px,\n    borderTopRightRadius: px,\n    borderBottomRightRadius: px,\n    borderBottomLeftRadius: px,\n    // Positioning props\n    width: px,\n    maxWidth: px,\n    height: px,\n    maxHeight: px,\n    top: px,\n    right: px,\n    bottom: px,\n    left: px,\n    inset: px,\n    insetBlock: px,\n    insetBlockStart: px,\n    insetBlockEnd: px,\n    insetInline: px,\n    insetInlineStart: px,\n    insetInlineEnd: px,\n    // Spacing props\n    padding: px,\n    paddingTop: px,\n    paddingRight: px,\n    paddingBottom: px,\n    paddingLeft: px,\n    paddingBlock: px,\n    paddingBlockStart: px,\n    paddingBlockEnd: px,\n    paddingInline: px,\n    paddingInlineStart: px,\n    paddingInlineEnd: px,\n    margin: px,\n    marginTop: px,\n    marginRight: px,\n    marginBottom: px,\n    marginLeft: px,\n    marginBlock: px,\n    marginBlockStart: px,\n    marginBlockEnd: px,\n    marginInline: px,\n    marginInlineStart: px,\n    marginInlineEnd: px,\n    // Typography\n    fontSize: px,\n    // Misc\n    backgroundPositionX: px,\n    backgroundPositionY: px,\n    ...transformValueTypes,\n    zIndex: int,\n    // SVG\n    fillOpacity: alpha,\n    strokeOpacity: alpha,\n    numOctaves: int,\n};\n\nexport { numberValueTypes };\n//# sourceMappingURL=number.mjs.map\n","import { color } from '../color/index.mjs';\nimport { filter } from '../complex/filter.mjs';\nimport { mask } from '../complex/mask.mjs';\nimport { numberValueTypes } from './number.mjs';\n\n/**\n * A map of default value types for common values\n */\nconst defaultValueTypes = {\n    ...numberValueTypes,\n    // Color props\n    color,\n    backgroundColor: color,\n    outlineColor: color,\n    fill: color,\n    stroke: color,\n    // Border props\n    borderColor: color,\n    borderTopColor: color,\n    borderRightColor: color,\n    borderBottomColor: color,\n    borderLeftColor: color,\n    filter,\n    WebkitFilter: filter,\n    mask,\n    WebkitMask: mask,\n};\n/**\n * Gets the default ValueType for the provided value key\n */\nconst getDefaultValueType = (key) => defaultValueTypes[key];\n\nexport { defaultValueTypes, getDefaultValueType };\n//# sourceMappingURL=defaults.mjs.map\n","import { complex } from '../complex/index.mjs';\nimport { filter } from '../complex/filter.mjs';\nimport { mask } from '../complex/mask.mjs';\nimport { getDefaultValueType } from '../maps/defaults.mjs';\n\nconst customTypes = /*@__PURE__*/ new Set([filter, mask]);\nfunction getAnimatableNone(key, value) {\n    let defaultValueType = getDefaultValueType(key);\n    if (!customTypes.has(defaultValueType))\n        defaultValueType = complex;\n    // If value is not recognised as animatable, ie \"none\", create an animatable version origin based on the target\n    return defaultValueType.getAnimatableNone\n        ? defaultValueType.getAnimatableNone(value)\n        : undefined;\n}\n\nexport { getAnimatableNone };\n//# sourceMappingURL=animatable-none.mjs.map\n","import { analyseComplexValue } from '../../../value/types/complex/index.mjs';\nimport { getAnimatableNone } from '../../../value/types/utils/animatable-none.mjs';\n\n/**\n * If we encounter keyframes like \"none\" or \"0\" and we also have keyframes like\n * \"#fff\" or \"200px 200px\" we want to find a keyframe to serve as a template for\n * the \"none\" keyframes. In this case \"#fff\" or \"200px 200px\" - then these get turned into\n * zero equivalents, i.e. \"#fff0\" or \"0px 0px\".\n */\nconst invalidTemplates = new Set([\"auto\", \"none\", \"0\"]);\nfunction makeNoneKeyframesAnimatable(unresolvedKeyframes, noneKeyframeIndexes, name) {\n    let i = 0;\n    let animatableTemplate = undefined;\n    while (i < unresolvedKeyframes.length && !animatableTemplate) {\n        const keyframe = unresolvedKeyframes[i];\n        if (typeof keyframe === \"string\" &&\n            !invalidTemplates.has(keyframe) &&\n            analyseComplexValue(keyframe).values.length) {\n            animatableTemplate = unresolvedKeyframes[i];\n        }\n        i++;\n    }\n    if (animatableTemplate && name) {\n        for (const noneIndex of noneKeyframeIndexes) {\n            unresolvedKeyframes[noneIndex] = getAnimatableNone(name, animatableTemplate);\n        }\n    }\n}\n\nexport { makeNoneKeyframesAnimatable };\n//# sourceMappingURL=make-none-animatable.mjs.map\n","import { positionalKeys } from '../../render/utils/keys-position.mjs';\nimport { findDimensionValueType } from '../../value/types/dimensions.mjs';\nimport { getVariableValue } from '../utils/css-variables-conversion.mjs';\nimport { isCSSVariableToken, containsCSSVariable } from '../utils/is-css-variable.mjs';\nimport { KeyframeResolver } from './KeyframesResolver.mjs';\nimport { isNone } from './utils/is-none.mjs';\nimport { makeNoneKeyframesAnimatable } from './utils/make-none-animatable.mjs';\nimport { positionalValues, isNumOrPxType } from './utils/unit-conversion.mjs';\n\nclass DOMKeyframesResolver extends KeyframeResolver {\n    constructor(unresolvedKeyframes, onComplete, name, motionValue, element) {\n        super(unresolvedKeyframes, onComplete, name, motionValue, element, true);\n    }\n    readKeyframes() {\n        const { unresolvedKeyframes, element, name } = this;\n        if (!element || !element.current)\n            return;\n        super.readKeyframes();\n        /**\n         * If any keyframe is a CSS variable, we need to find its value by sampling the element\n         */\n        for (let i = 0; i < unresolvedKeyframes.length; i++) {\n            let keyframe = unresolvedKeyframes[i];\n            if (typeof keyframe === \"string\") {\n                keyframe = keyframe.trim();\n                if (isCSSVariableToken(keyframe)) {\n                    const resolved = getVariableValue(keyframe, element.current);\n                    if (resolved !== undefined) {\n                        unresolvedKeyframes[i] = resolved;\n                    }\n                    if (i === unresolvedKeyframes.length - 1) {\n                        this.finalKeyframe = keyframe;\n                    }\n                }\n            }\n        }\n        /**\n         * Resolve \"none\" values. We do this potentially twice - once before and once after measuring keyframes.\n         * This could be seen as inefficient but it's a trade-off to avoid measurements in more situations, which\n         * have a far bigger performance impact.\n         */\n        this.resolveNoneKeyframes();\n        /**\n         * Check to see if unit type has changed. If so schedule jobs that will\n         * temporarily set styles to the destination keyframes.\n         * Skip if we have more than two keyframes or this isn't a positional value.\n         * TODO: We can throw if there are multiple keyframes and the value type changes.\n         */\n        if (!positionalKeys.has(name) || unresolvedKeyframes.length !== 2) {\n            return;\n        }\n        const [origin, target] = unresolvedKeyframes;\n        const originType = findDimensionValueType(origin);\n        const targetType = findDimensionValueType(target);\n        /**\n         * If one keyframe contains embedded CSS variables (e.g. in calc()) and the other\n         * doesn't, we need to measure to convert to pixels. This handles GitHub issue #3410.\n         */\n        const originHasVar = containsCSSVariable(origin);\n        const targetHasVar = containsCSSVariable(target);\n        if (originHasVar !== targetHasVar && positionalValues[name]) {\n            this.needsMeasurement = true;\n            return;\n        }\n        /**\n         * Either we don't recognise these value types or we can animate between them.\n         */\n        if (originType === targetType)\n            return;\n        /**\n         * If both values are numbers or pixels, we can animate between them by\n         * converting them to numbers.\n         */\n        if (isNumOrPxType(originType) && isNumOrPxType(targetType)) {\n            for (let i = 0; i < unresolvedKeyframes.length; i++) {\n                const value = unresolvedKeyframes[i];\n                if (typeof value === \"string\") {\n                    unresolvedKeyframes[i] = parseFloat(value);\n                }\n            }\n        }\n        else if (positionalValues[name]) {\n            /**\n             * Else, the only way to resolve this is by measuring the element.\n             */\n            this.needsMeasurement = true;\n        }\n    }\n    resolveNoneKeyframes() {\n        const { unresolvedKeyframes, name } = this;\n        const noneKeyframeIndexes = [];\n        for (let i = 0; i < unresolvedKeyframes.length; i++) {\n            if (unresolvedKeyframes[i] === null ||\n                isNone(unresolvedKeyframes[i])) {\n                noneKeyframeIndexes.push(i);\n            }\n        }\n        if (noneKeyframeIndexes.length) {\n            makeNoneKeyframesAnimatable(unresolvedKeyframes, noneKeyframeIndexes, name);\n        }\n    }\n    measureInitialState() {\n        const { element, unresolvedKeyframes, name } = this;\n        if (!element || !element.current)\n            return;\n        if (name === \"height\") {\n            this.suspendedScrollY = window.pageYOffset;\n        }\n        this.measuredOrigin = positionalValues[name](element.measureViewportBox(), window.getComputedStyle(element.current));\n        unresolvedKeyframes[0] = this.measuredOrigin;\n        // Set final key frame to measure after next render\n        const measureKeyframe = unresolvedKeyframes[unresolvedKeyframes.length - 1];\n        if (measureKeyframe !== undefined) {\n            element.getValue(name, measureKeyframe).jump(measureKeyframe, false);\n        }\n    }\n    measureEndState() {\n        const { element, name, unresolvedKeyframes } = this;\n        if (!element || !element.current)\n            return;\n        const value = element.getValue(name);\n        value && value.jump(this.measuredOrigin, false);\n        const finalKeyframeIndex = unresolvedKeyframes.length - 1;\n        const finalKeyframe = unresolvedKeyframes[finalKeyframeIndex];\n        unresolvedKeyframes[finalKeyframeIndex] = positionalValues[name](element.measureViewportBox(), window.getComputedStyle(element.current));\n        if (finalKeyframe !== null && this.finalKeyframe === undefined) {\n            this.finalKeyframe = finalKeyframe;\n        }\n        // If we removed transform values, reapply them before the next render\n        if (this.removedTransforms?.length) {\n            this.removedTransforms.forEach(([unsetTransformName, unsetTransformValue]) => {\n                element\n                    .getValue(unsetTransformName)\n                    .set(unsetTransformValue);\n            });\n        }\n        this.resolveNoneKeyframes();\n    }\n}\n\nexport { DOMKeyframesResolver };\n//# sourceMappingURL=DOMKeyframesResolver.mjs.map\n","function resolveElements(elementOrSelector, scope, selectorCache) {\n    if (elementOrSelector == null) {\n        return [];\n    }\n    if (elementOrSelector instanceof EventTarget) {\n        return [elementOrSelector];\n    }\n    else if (typeof elementOrSelector === \"string\") {\n        let root = document;\n        if (scope) {\n            root = scope.current;\n        }\n        const elements = selectorCache?.[elementOrSelector] ??\n            root.querySelectorAll(elementOrSelector);\n        return elements ? Array.from(elements) : [];\n    }\n    return Array.from(elementOrSelector).filter((element) => element != null);\n}\n\nexport { resolveElements };\n//# sourceMappingURL=resolve-elements.mjs.map\n","/**\n * Provided a value and a ValueType, returns the value as that value type.\n */\nconst getValueAsType = (value, type) => {\n    return type && typeof value === \"number\"\n        ? type.transform(value)\n        : value;\n};\n\nexport { getValueAsType };\n//# sourceMappingURL=get-as-type.mjs.map\n","import { isObject } from 'motion-utils';\n\n/**\n * Checks if an element is an HTML element in a way\n * that works across iframes\n */\nfunction isHTMLElement(element) {\n    return (isObject(element) &&\n        \"offsetHeight\" in element &&\n        !(\"ownerSVGElement\" in element));\n}\n\nexport { isHTMLElement };\n//# sourceMappingURL=is-html-element.mjs.map\n","import { createRenderBatcher } from './batcher.mjs';\n\nconst { schedule: microtask, cancel: cancelMicrotask } = \n/* @__PURE__ */ createRenderBatcher(queueMicrotask, false);\n\nexport { cancelMicrotask, microtask };\n//# sourceMappingURL=microtask.mjs.map\n","const isDragging = {\n    x: false,\n    y: false,\n};\nfunction isDragActive() {\n    return isDragging.x || isDragging.y;\n}\n\nexport { isDragActive, isDragging };\n//# sourceMappingURL=is-active.mjs.map\n","import { isDragging } from './is-active.mjs';\n\nfunction setDragLock(axis) {\n    if (axis === \"x\" || axis === \"y\") {\n        if (isDragging[axis]) {\n            return null;\n        }\n        else {\n            isDragging[axis] = true;\n            return () => {\n                isDragging[axis] = false;\n            };\n        }\n    }\n    else {\n        if (isDragging.x || isDragging.y) {\n            return null;\n        }\n        else {\n            isDragging.x = isDragging.y = true;\n            return () => {\n                isDragging.x = isDragging.y = false;\n            };\n        }\n    }\n}\n\nexport { setDragLock };\n//# sourceMappingURL=set-active.mjs.map\n","import { resolveElements } from '../../utils/resolve-elements.mjs';\n\nfunction setupGesture(elementOrSelector, options) {\n    const elements = resolveElements(elementOrSelector);\n    const gestureAbortController = new AbortController();\n    const eventOptions = {\n        passive: true,\n        ...options,\n        signal: gestureAbortController.signal,\n    };\n    const cancel = () => gestureAbortController.abort();\n    return [elements, eventOptions, cancel];\n}\n\nexport { setupGesture };\n//# sourceMappingURL=setup.mjs.map\n","import { isDragActive } from './drag/state/is-active.mjs';\nimport { setupGesture } from './utils/setup.mjs';\n\nfunction isValidHover(event) {\n    return !(event.pointerType === \"touch\" || isDragActive());\n}\n/**\n * Create a hover gesture. hover() is different to .addEventListener(\"pointerenter\")\n * in that it has an easier syntax, filters out polyfilled touch events, interoperates\n * with drag gestures, and automatically removes the \"pointerennd\" event listener when the hover ends.\n *\n * @public\n */\nfunction hover(elementOrSelector, onHoverStart, options = {}) {\n    const [elements, eventOptions, cancel] = setupGesture(elementOrSelector, options);\n    elements.forEach((element) => {\n        let isPressed = false;\n        let deferredHoverEnd = false;\n        let hoverEndCallback;\n        const removePointerLeave = () => {\n            element.removeEventListener(\"pointerleave\", onPointerLeave);\n        };\n        const endHover = (event) => {\n            if (hoverEndCallback) {\n                hoverEndCallback(event);\n                hoverEndCallback = undefined;\n            }\n            removePointerLeave();\n        };\n        const onPointerUp = (event) => {\n            isPressed = false;\n            window.removeEventListener(\"pointerup\", onPointerUp);\n            window.removeEventListener(\"pointercancel\", onPointerUp);\n            if (deferredHoverEnd) {\n                deferredHoverEnd = false;\n                endHover(event);\n            }\n        };\n        const onPointerDown = () => {\n            isPressed = true;\n            window.addEventListener(\"pointerup\", onPointerUp, eventOptions);\n            window.addEventListener(\"pointercancel\", onPointerUp, eventOptions);\n        };\n        const onPointerLeave = (leaveEvent) => {\n            if (leaveEvent.pointerType === \"touch\")\n                return;\n            if (isPressed) {\n                deferredHoverEnd = true;\n                return;\n            }\n            endHover(leaveEvent);\n        };\n        const onPointerEnter = (enterEvent) => {\n            if (!isValidHover(enterEvent))\n                return;\n            deferredHoverEnd = false;\n            const onHoverEnd = onHoverStart(element, enterEvent);\n            if (typeof onHoverEnd !== \"function\")\n                return;\n            hoverEndCallback = onHoverEnd;\n            element.addEventListener(\"pointerleave\", onPointerLeave, eventOptions);\n        };\n        element.addEventListener(\"pointerenter\", onPointerEnter, eventOptions);\n        element.addEventListener(\"pointerdown\", onPointerDown, eventOptions);\n    });\n    return cancel;\n}\n\nexport { hover };\n//# sourceMappingURL=hover.mjs.map\n","/**\n * Recursively traverse up the tree to check whether the provided child node\n * is the parent or a descendant of it.\n *\n * @param parent - Element to find\n * @param child - Element to test against parent\n */\nconst isNodeOrChild = (parent, child) => {\n    if (!child) {\n        return false;\n    }\n    else if (parent === child) {\n        return true;\n    }\n    else {\n        return isNodeOrChild(parent, child.parentElement);\n    }\n};\n\nexport { isNodeOrChild };\n//# sourceMappingURL=is-node-or-child.mjs.map\n","const isPrimaryPointer = (event) => {\n    if (event.pointerType === \"mouse\") {\n        return typeof event.button !== \"number\" || event.button <= 0;\n    }\n    else {\n        /**\n         * isPrimary is true for all mice buttons, whereas every touch point\n         * is regarded as its own input. So subsequent concurrent touch points\n         * will be false.\n         *\n         * Specifically match against false here as incomplete versions of\n         * PointerEvents in very old browser might have it set as undefined.\n         */\n        return event.isPrimary !== false;\n    }\n};\n\nexport { isPrimaryPointer };\n//# sourceMappingURL=is-primary-pointer.mjs.map\n","const keyboardAccessibleElements = new Set([\n    \"BUTTON\",\n    \"INPUT\",\n    \"SELECT\",\n    \"TEXTAREA\",\n    \"A\",\n]);\n/**\n * Checks if an element is natively keyboard accessible (focusable).\n * Used by the press gesture to determine if we need to add tabIndex.\n */\nfunction isElementKeyboardAccessible(element) {\n    return (keyboardAccessibleElements.has(element.tagName) ||\n        element.isContentEditable === true);\n}\nconst textInputElements = new Set([\"INPUT\", \"SELECT\", \"TEXTAREA\"]);\n/**\n * Checks if an element has text selection or direct interaction behavior\n * that should block drag gestures from starting.\n *\n * This specifically targets form controls where the user might want to select\n * text or interact with the control (e.g., sliders, dropdowns).\n *\n * Buttons and links are NOT included because they don't have click-and-move\n * actions of their own - they only respond to click events, so dragging\n * should still work when initiated from these elements.\n */\nfunction isElementTextInput(element) {\n    return (textInputElements.has(element.tagName) ||\n        element.isContentEditable === true);\n}\n\nexport { isElementKeyboardAccessible, isElementTextInput };\n//# sourceMappingURL=is-keyboard-accessible.mjs.map\n","const isPressing = new WeakSet();\n\nexport { isPressing };\n//# sourceMappingURL=state.mjs.map\n","import { isPressing } from './state.mjs';\n\n/**\n * Filter out events that are not \"Enter\" keys.\n */\nfunction filterEvents(callback) {\n    return (event) => {\n        if (event.key !== \"Enter\")\n            return;\n        callback(event);\n    };\n}\nfunction firePointerEvent(target, type) {\n    target.dispatchEvent(new PointerEvent(\"pointer\" + type, { isPrimary: true, bubbles: true }));\n}\nconst enableKeyboardPress = (focusEvent, eventOptions) => {\n    const element = focusEvent.currentTarget;\n    if (!element)\n        return;\n    const handleKeydown = filterEvents(() => {\n        if (isPressing.has(element))\n            return;\n        firePointerEvent(element, \"down\");\n        const handleKeyup = filterEvents(() => {\n            firePointerEvent(element, \"up\");\n        });\n        const handleBlur = () => firePointerEvent(element, \"cancel\");\n        element.addEventListener(\"keyup\", handleKeyup, eventOptions);\n        element.addEventListener(\"blur\", handleBlur, eventOptions);\n    });\n    element.addEventListener(\"keydown\", handleKeydown, eventOptions);\n    /**\n     * Add an event listener that fires on blur to remove the keydown events.\n     */\n    element.addEventListener(\"blur\", () => element.removeEventListener(\"keydown\", handleKeydown), eventOptions);\n};\n\nexport { enableKeyboardPress };\n//# sourceMappingURL=keyboard.mjs.map\n","import { isHTMLElement } from '../../utils/is-html-element.mjs';\nimport { isDragActive } from '../drag/state/is-active.mjs';\nimport { isNodeOrChild } from '../utils/is-node-or-child.mjs';\nimport { isPrimaryPointer } from '../utils/is-primary-pointer.mjs';\nimport { setupGesture } from '../utils/setup.mjs';\nimport { isElementKeyboardAccessible } from './utils/is-keyboard-accessible.mjs';\nimport { enableKeyboardPress } from './utils/keyboard.mjs';\nimport { isPressing } from './utils/state.mjs';\n\n/**\n * Filter out events that are not primary pointer events, or are triggering\n * while a Motion gesture is active.\n */\nfunction isValidPressEvent(event) {\n    return isPrimaryPointer(event) && !isDragActive();\n}\nconst claimedPointerDownEvents = new WeakSet();\n/**\n * Create a press gesture.\n *\n * Press is different to `\"pointerdown\"`, `\"pointerup\"` in that it\n * automatically filters out secondary pointer events like right\n * click and multitouch.\n *\n * It also adds accessibility support for keyboards, where\n * an element with a press gesture will receive focus and\n *  trigger on Enter `\"keydown\"` and `\"keyup\"` events.\n *\n * This is different to a browser's `\"click\"` event, which does\n * respond to keyboards but only for the `\"click\"` itself, rather\n * than the press start and end/cancel. The element also needs\n * to be focusable for this to work, whereas a press gesture will\n * make an element focusable by default.\n *\n * @public\n */\nfunction press(targetOrSelector, onPressStart, options = {}) {\n    const [targets, eventOptions, cancelEvents] = setupGesture(targetOrSelector, options);\n    const startPress = (startEvent) => {\n        const target = startEvent.currentTarget;\n        if (!isValidPressEvent(startEvent))\n            return;\n        if (claimedPointerDownEvents.has(startEvent))\n            return;\n        isPressing.add(target);\n        if (options.stopPropagation) {\n            claimedPointerDownEvents.add(startEvent);\n        }\n        const onPressEnd = onPressStart(target, startEvent);\n        const onPointerEnd = (endEvent, success) => {\n            window.removeEventListener(\"pointerup\", onPointerUp);\n            window.removeEventListener(\"pointercancel\", onPointerCancel);\n            if (isPressing.has(target)) {\n                isPressing.delete(target);\n            }\n            if (!isValidPressEvent(endEvent)) {\n                return;\n            }\n            if (typeof onPressEnd === \"function\") {\n                onPressEnd(endEvent, { success });\n            }\n        };\n        const onPointerUp = (upEvent) => {\n            onPointerEnd(upEvent, target === window ||\n                target === document ||\n                options.useGlobalTarget ||\n                isNodeOrChild(target, upEvent.target));\n        };\n        const onPointerCancel = (cancelEvent) => {\n            onPointerEnd(cancelEvent, false);\n        };\n        window.addEventListener(\"pointerup\", onPointerUp, eventOptions);\n        window.addEventListener(\"pointercancel\", onPointerCancel, eventOptions);\n    };\n    targets.forEach((target) => {\n        const pointerDownTarget = options.useGlobalTarget ? window : target;\n        pointerDownTarget.addEventListener(\"pointerdown\", startPress, eventOptions);\n        if (isHTMLElement(target)) {\n            target.addEventListener(\"focus\", (event) => enableKeyboardPress(event, eventOptions));\n            if (!isElementKeyboardAccessible(target) &&\n                !target.hasAttribute(\"tabindex\")) {\n                target.tabIndex = 0;\n            }\n        }\n    });\n    return cancelEvents;\n}\n\nexport { press };\n//# sourceMappingURL=index.mjs.map\n","import { isObject } from 'motion-utils';\n\n/**\n * Checks if an element is an SVG element in a way\n * that works across iframes\n */\nfunction isSVGElement(element) {\n    return isObject(element) && \"ownerSVGElement\" in element;\n}\n\nexport { isSVGElement };\n//# sourceMappingURL=is-svg-element.mjs.map\n","import { isSVGElement } from '../utils/is-svg-element.mjs';\nimport { resolveElements } from '../utils/resolve-elements.mjs';\n\nconst resizeHandlers = new WeakMap();\nlet observer;\nconst getSize = (borderBoxAxis, svgAxis, htmlAxis) => (target, borderBoxSize) => {\n    if (borderBoxSize && borderBoxSize[0]) {\n        return borderBoxSize[0][(borderBoxAxis + \"Size\")];\n    }\n    else if (isSVGElement(target) && \"getBBox\" in target) {\n        return target.getBBox()[svgAxis];\n    }\n    else {\n        return target[htmlAxis];\n    }\n};\nconst getWidth = /*@__PURE__*/ getSize(\"inline\", \"width\", \"offsetWidth\");\nconst getHeight = /*@__PURE__*/ getSize(\"block\", \"height\", \"offsetHeight\");\nfunction notifyTarget({ target, borderBoxSize }) {\n    resizeHandlers.get(target)?.forEach((handler) => {\n        handler(target, {\n            get width() {\n                return getWidth(target, borderBoxSize);\n            },\n            get height() {\n                return getHeight(target, borderBoxSize);\n            },\n        });\n    });\n}\nfunction notifyAll(entries) {\n    entries.forEach(notifyTarget);\n}\nfunction createResizeObserver() {\n    if (typeof ResizeObserver === \"undefined\")\n        return;\n    observer = new ResizeObserver(notifyAll);\n}\nfunction resizeElement(target, handler) {\n    if (!observer)\n        createResizeObserver();\n    const elements = resolveElements(target);\n    elements.forEach((element) => {\n        let elementHandlers = resizeHandlers.get(element);\n        if (!elementHandlers) {\n            elementHandlers = new Set();\n            resizeHandlers.set(element, elementHandlers);\n        }\n        elementHandlers.add(handler);\n        observer?.observe(element);\n    });\n    return () => {\n        elements.forEach((element) => {\n            const elementHandlers = resizeHandlers.get(element);\n            elementHandlers?.delete(handler);\n            if (!elementHandlers?.size) {\n                observer?.unobserve(element);\n            }\n        });\n    };\n}\n\nexport { resizeElement };\n//# sourceMappingURL=handle-element.mjs.map\n","const windowCallbacks = new Set();\nlet windowResizeHandler;\nfunction createWindowResizeHandler() {\n    windowResizeHandler = () => {\n        const info = {\n            get width() {\n                return window.innerWidth;\n            },\n            get height() {\n                return window.innerHeight;\n            },\n        };\n        windowCallbacks.forEach((callback) => callback(info));\n    };\n    window.addEventListener(\"resize\", windowResizeHandler);\n}\nfunction resizeWindow(callback) {\n    windowCallbacks.add(callback);\n    if (!windowResizeHandler)\n        createWindowResizeHandler();\n    return () => {\n        windowCallbacks.delete(callback);\n        if (!windowCallbacks.size &&\n            typeof windowResizeHandler === \"function\") {\n            window.removeEventListener(\"resize\", windowResizeHandler);\n            windowResizeHandler = undefined;\n        }\n    };\n}\n\nexport { resizeWindow };\n//# sourceMappingURL=handle-window.mjs.map\n","import { resizeElement } from './handle-element.mjs';\nimport { resizeWindow } from './handle-window.mjs';\n\nfunction resize(a, b) {\n    return typeof a === \"function\" ? resizeWindow(a) : resizeElement(a, b);\n}\n\nexport { resize };\n//# sourceMappingURL=index.mjs.map\n","import { isSVGElement } from './is-svg-element.mjs';\n\n/**\n * Checks if an element is specifically an SVGSVGElement (the root SVG element)\n * in a way that works across iframes\n */\nfunction isSVGSVGElement(element) {\n    return isSVGElement(element) && element.tagName === \"svg\";\n}\n\nexport { isSVGSVGElement };\n//# sourceMappingURL=is-svg-svg-element.mjs.map\n","import { color } from '../color/index.mjs';\nimport { complex } from '../complex/index.mjs';\nimport { dimensionValueTypes } from '../dimensions.mjs';\nimport { testValueType } from '../test.mjs';\n\n/**\n * A list of all ValueTypes\n */\nconst valueTypes = [...dimensionValueTypes, color, complex];\n/**\n * Tests a value against the list of ValueTypes\n */\nconst findValueType = (v) => valueTypes.find(testValueType(v));\n\nexport { findValueType };\n//# sourceMappingURL=find.mjs.map\n","const createAxisDelta = () => ({\n    translate: 0,\n    scale: 1,\n    origin: 0,\n    originPoint: 0,\n});\nconst createDelta = () => ({\n    x: createAxisDelta(),\n    y: createAxisDelta(),\n});\nconst createAxis = () => ({ min: 0, max: 0 });\nconst createBox = () => ({\n    x: createAxis(),\n    y: createAxis(),\n});\n\nexport { createAxis, createAxisDelta, createBox, createDelta };\n//# sourceMappingURL=models.mjs.map\n","const visualElementStore = new WeakMap();\n\nexport { visualElementStore };\n//# sourceMappingURL=store.mjs.map\n","function isAnimationControls(v) {\n    return (v !== null &&\n        typeof v === \"object\" &&\n        typeof v.start === \"function\");\n}\n\nexport { isAnimationControls };\n//# sourceMappingURL=is-animation-controls.mjs.map\n","/**\n * Decides if the supplied variable is variant label\n */\nfunction isVariantLabel(v) {\n    return typeof v === \"string\" || Array.isArray(v);\n}\n\nexport { isVariantLabel };\n//# sourceMappingURL=is-variant-label.mjs.map\n","const variantPriorityOrder = [\n    \"animate\",\n    \"whileInView\",\n    \"whileFocus\",\n    \"whileHover\",\n    \"whileTap\",\n    \"whileDrag\",\n    \"exit\",\n];\nconst variantProps = [\"initial\", ...variantPriorityOrder];\n\nexport { variantPriorityOrder, variantProps };\n//# sourceMappingURL=variant-props.mjs.map\n","import { isAnimationControls } from './is-animation-controls.mjs';\nimport { isVariantLabel } from './is-variant-label.mjs';\nimport { variantProps } from './variant-props.mjs';\n\nfunction isControllingVariants(props) {\n    return (isAnimationControls(props.animate) ||\n        variantProps.some((name) => isVariantLabel(props[name])));\n}\nfunction isVariantNode(props) {\n    return Boolean(isControllingVariants(props) || props.variants);\n}\n\nexport { isControllingVariants, isVariantNode };\n//# sourceMappingURL=is-controlling-variants.mjs.map\n","import { motionValue } from '../../value/index.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\n\n/**\n * Updates motion values from props changes.\n * Uses `any` type for element to avoid circular dependencies with VisualElement.\n */\nfunction updateMotionValuesFromProps(element, next, prev) {\n    for (const key in next) {\n        const nextValue = next[key];\n        const prevValue = prev[key];\n        if (isMotionValue(nextValue)) {\n            /**\n             * If this is a motion value found in props or style, we want to add it\n             * to our visual element's motion value map.\n             */\n            element.addValue(key, nextValue);\n        }\n        else if (isMotionValue(prevValue)) {\n            /**\n             * If we're swapping from a motion value to a static value,\n             * create a new motion value from that\n             */\n            element.addValue(key, motionValue(nextValue, { owner: element }));\n        }\n        else if (prevValue !== nextValue) {\n            /**\n             * If this is a flat value that has changed, update the motion value\n             * or create one if it doesn't exist. We only want to do this if we're\n             * not handling the value with our animation state.\n             */\n            if (element.hasValue(key)) {\n                const existingValue = element.getValue(key);\n                if (existingValue.liveStyle === true) {\n                    existingValue.jump(nextValue);\n                }\n                else if (!existingValue.hasAnimated) {\n                    existingValue.set(nextValue);\n                }\n            }\n            else {\n                const latestValue = element.getStaticValue(key);\n                element.addValue(key, motionValue(latestValue !== undefined ? latestValue : nextValue, { owner: element }));\n            }\n        }\n    }\n    // Handle removed values\n    for (const key in prev) {\n        if (next[key] === undefined)\n            element.removeValue(key);\n    }\n    return next;\n}\n\nexport { updateMotionValuesFromProps };\n//# sourceMappingURL=motion-values.mjs.map\n","// Does this device prefer reduced motion? Returns `null` server-side.\nconst prefersReducedMotion = { current: null };\nconst hasReducedMotionListener = { current: false };\n\nexport { hasReducedMotionListener, prefersReducedMotion };\n//# sourceMappingURL=state.mjs.map\n","import { hasReducedMotionListener, prefersReducedMotion } from './state.mjs';\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction initPrefersReducedMotion() {\n    hasReducedMotionListener.current = true;\n    if (!isBrowser)\n        return;\n    if (window.matchMedia) {\n        const motionMediaQuery = window.matchMedia(\"(prefers-reduced-motion)\");\n        const setReducedMotionPreferences = () => (prefersReducedMotion.current = motionMediaQuery.matches);\n        motionMediaQuery.addEventListener(\"change\", setReducedMotionPreferences);\n        setReducedMotionPreferences();\n    }\n    else {\n        prefersReducedMotion.current = false;\n    }\n}\n\nexport { hasReducedMotionListener, initPrefersReducedMotion, prefersReducedMotion };\n//# sourceMappingURL=index.mjs.map\n","import { warnOnce, secondsToMilliseconds, isNumericalString, isZeroValueString, SubscriptionManager } from 'motion-utils';\nimport { KeyframeResolver } from '../animation/keyframes/KeyframesResolver.mjs';\nimport { NativeAnimation } from '../animation/NativeAnimation.mjs';\nimport { acceleratedValues } from '../animation/waapi/utils/accelerated-values.mjs';\nimport { microtask } from '../frameloop/microtask.mjs';\nimport { time } from '../frameloop/sync-time.mjs';\nimport { createBox } from '../projection/geometry/models.mjs';\nimport { motionValue } from '../value/index.mjs';\nimport { complex } from '../value/types/complex/index.mjs';\nimport { getAnimatableNone } from '../value/types/utils/animatable-none.mjs';\nimport { findValueType } from '../value/types/utils/find.mjs';\nimport { isMotionValue } from '../value/utils/is-motion-value.mjs';\nimport { visualElementStore } from './store.mjs';\nimport { isControllingVariants, isVariantNode } from './utils/is-controlling-variants.mjs';\nimport { transformProps } from './utils/keys-transform.mjs';\nimport { updateMotionValuesFromProps } from './utils/motion-values.mjs';\nimport { initPrefersReducedMotion } from './utils/reduced-motion/index.mjs';\nimport { resolveVariantFromProps } from './utils/resolve-variants.mjs';\nimport { hasReducedMotionListener, prefersReducedMotion } from './utils/reduced-motion/state.mjs';\nimport { frame, cancelFrame } from '../frameloop/frame.mjs';\n\nconst propEventHandlers = [\n    \"AnimationStart\",\n    \"AnimationComplete\",\n    \"Update\",\n    \"BeforeLayoutMeasure\",\n    \"LayoutMeasure\",\n    \"LayoutAnimationStart\",\n    \"LayoutAnimationComplete\",\n];\n/**\n * Static feature definitions - can be injected by framework layer\n */\nlet featureDefinitions = {};\n/**\n * Set feature definitions for all VisualElements.\n * This should be called by the framework layer (e.g., framer-motion) during initialization.\n */\nfunction setFeatureDefinitions(definitions) {\n    featureDefinitions = definitions;\n}\n/**\n * Get the current feature definitions\n */\nfunction getFeatureDefinitions() {\n    return featureDefinitions;\n}\n/**\n * A VisualElement is an imperative abstraction around UI elements such as\n * HTMLElement, SVGElement, Three.Object3D etc.\n */\nclass VisualElement {\n    /**\n     * This method takes React props and returns found MotionValues. For example, HTML\n     * MotionValues will be found within the style prop, whereas for Three.js within attribute arrays.\n     *\n     * This isn't an abstract method as it needs calling in the constructor, but it is\n     * intended to be one.\n     */\n    scrapeMotionValuesFromProps(_props, _prevProps, _visualElement) {\n        return {};\n    }\n    constructor({ parent, props, presenceContext, reducedMotionConfig, skipAnimations, blockInitialAnimation, visualState, }, options = {}) {\n        /**\n         * A reference to the current underlying Instance, e.g. a HTMLElement\n         * or Three.Mesh etc.\n         */\n        this.current = null;\n        /**\n         * A set containing references to this VisualElement's children.\n         */\n        this.children = new Set();\n        /**\n         * Determine what role this visual element should take in the variant tree.\n         */\n        this.isVariantNode = false;\n        this.isControllingVariants = false;\n        /**\n         * Decides whether this VisualElement should animate in reduced motion\n         * mode.\n         *\n         * TODO: This is currently set on every individual VisualElement but feels\n         * like it could be set globally.\n         */\n        this.shouldReduceMotion = null;\n        /**\n         * Decides whether animations should be skipped for this VisualElement.\n         * Useful for E2E tests and visual regression testing.\n         */\n        this.shouldSkipAnimations = false;\n        /**\n         * A map of all motion values attached to this visual element. Motion\n         * values are source of truth for any given animated value. A motion\n         * value might be provided externally by the component via props.\n         */\n        this.values = new Map();\n        this.KeyframeResolver = KeyframeResolver;\n        /**\n         * Cleanup functions for active features (hover/tap/exit etc)\n         */\n        this.features = {};\n        /**\n         * A map of every subscription that binds the provided or generated\n         * motion values onChange listeners to this visual element.\n         */\n        this.valueSubscriptions = new Map();\n        /**\n         * A reference to the previously-provided motion values as returned\n         * from scrapeMotionValuesFromProps. We use the keys in here to determine\n         * if any motion values need to be removed after props are updated.\n         */\n        this.prevMotionValues = {};\n        /**\n         * Track whether this element has been mounted before, to detect\n         * remounts after Suspense unmount/remount cycles.\n         */\n        this.hasBeenMounted = false;\n        /**\n         * An object containing a SubscriptionManager for each active event.\n         */\n        this.events = {};\n        /**\n         * An object containing an unsubscribe function for each prop event subscription.\n         * For example, every \"Update\" event can have multiple subscribers via\n         * VisualElement.on(), but only one of those can be defined via the onUpdate prop.\n         */\n        this.propEventSubscriptions = {};\n        this.notifyUpdate = () => this.notify(\"Update\", this.latestValues);\n        this.render = () => {\n            if (!this.current)\n                return;\n            this.triggerBuild();\n            this.renderInstance(this.current, this.renderState, this.props.style, this.projection);\n        };\n        this.renderScheduledAt = 0.0;\n        this.scheduleRender = () => {\n            const now = time.now();\n            if (this.renderScheduledAt < now) {\n                this.renderScheduledAt = now;\n                frame.render(this.render, false, true);\n            }\n        };\n        const { latestValues, renderState } = visualState;\n        this.latestValues = latestValues;\n        this.baseTarget = { ...latestValues };\n        this.initialValues = props.initial ? { ...latestValues } : {};\n        this.renderState = renderState;\n        this.parent = parent;\n        this.props = props;\n        this.presenceContext = presenceContext;\n        this.depth = parent ? parent.depth + 1 : 0;\n        this.reducedMotionConfig = reducedMotionConfig;\n        this.skipAnimationsConfig = skipAnimations;\n        this.options = options;\n        this.blockInitialAnimation = Boolean(blockInitialAnimation);\n        this.isControllingVariants = isControllingVariants(props);\n        this.isVariantNode = isVariantNode(props);\n        if (this.isVariantNode) {\n            this.variantChildren = new Set();\n        }\n        this.manuallyAnimateOnMount = Boolean(parent && parent.current);\n        /**\n         * Any motion values that are provided to the element when created\n         * aren't yet bound to the element, as this would technically be impure.\n         * However, we iterate through the motion values and set them to the\n         * initial values for this component.\n         *\n         * TODO: This is impure and we should look at changing this to run on mount.\n         * Doing so will break some tests but this isn't necessarily a breaking change,\n         * more a reflection of the test.\n         */\n        const { willChange, ...initialMotionValues } = this.scrapeMotionValuesFromProps(props, {}, this);\n        for (const key in initialMotionValues) {\n            const value = initialMotionValues[key];\n            if (latestValues[key] !== undefined && isMotionValue(value)) {\n                value.set(latestValues[key]);\n            }\n        }\n    }\n    mount(instance) {\n        /**\n         * If this element has been mounted before (e.g. after a Suspense\n         * unmount/remount), reset motion values to their initial state\n         * so animations replay correctly from initial → animate.\n         */\n        if (this.hasBeenMounted) {\n            for (const key in this.initialValues) {\n                this.values.get(key)?.jump(this.initialValues[key]);\n                this.latestValues[key] = this.initialValues[key];\n            }\n        }\n        this.current = instance;\n        visualElementStore.set(instance, this);\n        if (this.projection && !this.projection.instance) {\n            this.projection.mount(instance);\n        }\n        if (this.parent && this.isVariantNode && !this.isControllingVariants) {\n            this.removeFromVariantTree = this.parent.addVariantChild(this);\n        }\n        this.values.forEach((value, key) => this.bindToMotionValue(key, value));\n        /**\n         * Determine reduced motion preference. Only initialize the matchMedia\n         * listener if we actually need the dynamic value (i.e., when config\n         * is neither \"never\" nor \"always\").\n         */\n        if (this.reducedMotionConfig === \"never\") {\n            this.shouldReduceMotion = false;\n        }\n        else if (this.reducedMotionConfig === \"always\") {\n            this.shouldReduceMotion = true;\n        }\n        else {\n            if (!hasReducedMotionListener.current) {\n                initPrefersReducedMotion();\n            }\n            this.shouldReduceMotion = prefersReducedMotion.current;\n        }\n        if (process.env.NODE_ENV !== \"production\") {\n            warnOnce(this.shouldReduceMotion !== true, \"You have Reduced Motion enabled on your device. Animations may not appear as expected.\", \"reduced-motion-disabled\");\n        }\n        /**\n         * Set whether animations should be skipped based on the config.\n         */\n        this.shouldSkipAnimations = this.skipAnimationsConfig ?? false;\n        this.parent?.addChild(this);\n        this.update(this.props, this.presenceContext);\n        this.hasBeenMounted = true;\n    }\n    unmount() {\n        this.projection && this.projection.unmount();\n        cancelFrame(this.notifyUpdate);\n        cancelFrame(this.render);\n        this.valueSubscriptions.forEach((remove) => remove());\n        this.valueSubscriptions.clear();\n        this.removeFromVariantTree && this.removeFromVariantTree();\n        this.parent?.removeChild(this);\n        for (const key in this.events) {\n            this.events[key].clear();\n        }\n        for (const key in this.features) {\n            const feature = this.features[key];\n            if (feature) {\n                feature.unmount();\n                feature.isMounted = false;\n            }\n        }\n        this.current = null;\n    }\n    addChild(child) {\n        this.children.add(child);\n        this.enteringChildren ?? (this.enteringChildren = new Set());\n        this.enteringChildren.add(child);\n    }\n    removeChild(child) {\n        this.children.delete(child);\n        this.enteringChildren && this.enteringChildren.delete(child);\n    }\n    bindToMotionValue(key, value) {\n        if (this.valueSubscriptions.has(key)) {\n            this.valueSubscriptions.get(key)();\n        }\n        if (value.accelerate &&\n            acceleratedValues.has(key) &&\n            this.current instanceof HTMLElement) {\n            const { factory, keyframes, times, ease, duration } = value.accelerate;\n            const animation = new NativeAnimation({\n                element: this.current,\n                name: key,\n                keyframes,\n                times,\n                ease,\n                duration: secondsToMilliseconds(duration),\n            });\n            const cleanup = factory(animation);\n            this.valueSubscriptions.set(key, () => {\n                cleanup();\n                animation.cancel();\n            });\n            return;\n        }\n        const valueIsTransform = transformProps.has(key);\n        if (valueIsTransform && this.onBindTransform) {\n            this.onBindTransform();\n        }\n        const removeOnChange = value.on(\"change\", (latestValue) => {\n            this.latestValues[key] = latestValue;\n            this.props.onUpdate && frame.preRender(this.notifyUpdate);\n            if (valueIsTransform && this.projection) {\n                this.projection.isTransformDirty = true;\n            }\n            this.scheduleRender();\n        });\n        let removeSyncCheck;\n        if (typeof window !== \"undefined\" &&\n            window.MotionCheckAppearSync) {\n            removeSyncCheck = window.MotionCheckAppearSync(this, key, value);\n        }\n        this.valueSubscriptions.set(key, () => {\n            removeOnChange();\n            if (removeSyncCheck)\n                removeSyncCheck();\n            if (value.owner)\n                value.stop();\n        });\n    }\n    sortNodePosition(other) {\n        /**\n         * If these nodes aren't even of the same type we can't compare their depth.\n         */\n        if (!this.current ||\n            !this.sortInstanceNodePosition ||\n            this.type !== other.type) {\n            return 0;\n        }\n        return this.sortInstanceNodePosition(this.current, other.current);\n    }\n    updateFeatures() {\n        let key = \"animation\";\n        for (key in featureDefinitions) {\n            const featureDefinition = featureDefinitions[key];\n            if (!featureDefinition)\n                continue;\n            const { isEnabled, Feature: FeatureConstructor } = featureDefinition;\n            /**\n             * If this feature is enabled but not active, make a new instance.\n             */\n            if (!this.features[key] &&\n                FeatureConstructor &&\n                isEnabled(this.props)) {\n                this.features[key] = new FeatureConstructor(this);\n            }\n            /**\n             * If we have a feature, mount or update it.\n             */\n            if (this.features[key]) {\n                const feature = this.features[key];\n                if (feature.isMounted) {\n                    feature.update();\n                }\n                else {\n                    feature.mount();\n                    feature.isMounted = true;\n                }\n            }\n        }\n    }\n    triggerBuild() {\n        this.build(this.renderState, this.latestValues, this.props);\n    }\n    /**\n     * Measure the current viewport box with or without transforms.\n     * Only measures axis-aligned boxes, rotate and skew must be manually\n     * removed with a re-render to work.\n     */\n    measureViewportBox() {\n        return this.current\n            ? this.measureInstanceViewportBox(this.current, this.props)\n            : createBox();\n    }\n    getStaticValue(key) {\n        return this.latestValues[key];\n    }\n    setStaticValue(key, value) {\n        this.latestValues[key] = value;\n    }\n    /**\n     * Update the provided props. Ensure any newly-added motion values are\n     * added to our map, old ones removed, and listeners updated.\n     */\n    update(props, presenceContext) {\n        if (props.transformTemplate || this.props.transformTemplate) {\n            this.scheduleRender();\n        }\n        this.prevProps = this.props;\n        this.props = props;\n        this.prevPresenceContext = this.presenceContext;\n        this.presenceContext = presenceContext;\n        /**\n         * Update prop event handlers ie onAnimationStart, onAnimationComplete\n         */\n        for (let i = 0; i < propEventHandlers.length; i++) {\n            const key = propEventHandlers[i];\n            if (this.propEventSubscriptions[key]) {\n                this.propEventSubscriptions[key]();\n                delete this.propEventSubscriptions[key];\n            }\n            const listenerName = (\"on\" + key);\n            const listener = props[listenerName];\n            if (listener) {\n                this.propEventSubscriptions[key] = this.on(key, listener);\n            }\n        }\n        this.prevMotionValues = updateMotionValuesFromProps(this, this.scrapeMotionValuesFromProps(props, this.prevProps || {}, this), this.prevMotionValues);\n        if (this.handleChildMotionValue) {\n            this.handleChildMotionValue();\n        }\n    }\n    getProps() {\n        return this.props;\n    }\n    /**\n     * Returns the variant definition with a given name.\n     */\n    getVariant(name) {\n        return this.props.variants ? this.props.variants[name] : undefined;\n    }\n    /**\n     * Returns the defined default transition on this component.\n     */\n    getDefaultTransition() {\n        return this.props.transition;\n    }\n    getTransformPagePoint() {\n        return this.props.transformPagePoint;\n    }\n    getClosestVariantNode() {\n        return this.isVariantNode\n            ? this\n            : this.parent\n                ? this.parent.getClosestVariantNode()\n                : undefined;\n    }\n    /**\n     * Add a child visual element to our set of children.\n     */\n    addVariantChild(child) {\n        const closestVariantNode = this.getClosestVariantNode();\n        if (closestVariantNode) {\n            closestVariantNode.variantChildren &&\n                closestVariantNode.variantChildren.add(child);\n            return () => closestVariantNode.variantChildren.delete(child);\n        }\n    }\n    /**\n     * Add a motion value and bind it to this visual element.\n     */\n    addValue(key, value) {\n        // Remove existing value if it exists\n        const existingValue = this.values.get(key);\n        if (value !== existingValue) {\n            if (existingValue)\n                this.removeValue(key);\n            this.bindToMotionValue(key, value);\n            this.values.set(key, value);\n            this.latestValues[key] = value.get();\n        }\n    }\n    /**\n     * Remove a motion value and unbind any active subscriptions.\n     */\n    removeValue(key) {\n        this.values.delete(key);\n        const unsubscribe = this.valueSubscriptions.get(key);\n        if (unsubscribe) {\n            unsubscribe();\n            this.valueSubscriptions.delete(key);\n        }\n        delete this.latestValues[key];\n        this.removeValueFromRenderState(key, this.renderState);\n    }\n    /**\n     * Check whether we have a motion value for this key\n     */\n    hasValue(key) {\n        return this.values.has(key);\n    }\n    getValue(key, defaultValue) {\n        if (this.props.values && this.props.values[key]) {\n            return this.props.values[key];\n        }\n        let value = this.values.get(key);\n        if (value === undefined && defaultValue !== undefined) {\n            value = motionValue(defaultValue === null ? undefined : defaultValue, { owner: this });\n            this.addValue(key, value);\n        }\n        return value;\n    }\n    /**\n     * If we're trying to animate to a previously unencountered value,\n     * we need to check for it in our state and as a last resort read it\n     * directly from the instance (which might have performance implications).\n     */\n    readValue(key, target) {\n        let value = this.latestValues[key] !== undefined || !this.current\n            ? this.latestValues[key]\n            : this.getBaseTargetFromProps(this.props, key) ??\n                this.readValueFromInstance(this.current, key, this.options);\n        if (value !== undefined && value !== null) {\n            if (typeof value === \"string\" &&\n                (isNumericalString(value) || isZeroValueString(value))) {\n                // If this is a number read as a string, ie \"0\" or \"200\", convert it to a number\n                value = parseFloat(value);\n            }\n            else if (!findValueType(value) && complex.test(target)) {\n                value = getAnimatableNone(key, target);\n            }\n            this.setBaseTarget(key, isMotionValue(value) ? value.get() : value);\n        }\n        return isMotionValue(value) ? value.get() : value;\n    }\n    /**\n     * Set the base target to later animate back to. This is currently\n     * only hydrated on creation and when we first read a value.\n     */\n    setBaseTarget(key, value) {\n        this.baseTarget[key] = value;\n    }\n    /**\n     * Find the base target for a value thats been removed from all animation\n     * props.\n     */\n    getBaseTarget(key) {\n        const { initial } = this.props;\n        let valueFromInitial;\n        if (typeof initial === \"string\" || typeof initial === \"object\") {\n            const variant = resolveVariantFromProps(this.props, initial, this.presenceContext?.custom);\n            if (variant) {\n                valueFromInitial = variant[key];\n            }\n        }\n        /**\n         * If this value still exists in the current initial variant, read that.\n         */\n        if (initial && valueFromInitial !== undefined) {\n            return valueFromInitial;\n        }\n        /**\n         * Alternatively, if this VisualElement config has defined a getBaseTarget\n         * so we can read the value from an alternative source, try that.\n         */\n        const target = this.getBaseTargetFromProps(this.props, key);\n        if (target !== undefined && !isMotionValue(target))\n            return target;\n        /**\n         * If the value was initially defined on initial, but it doesn't any more,\n         * return undefined. Otherwise return the value as initially read from the DOM.\n         */\n        return this.initialValues[key] !== undefined &&\n            valueFromInitial === undefined\n            ? undefined\n            : this.baseTarget[key];\n    }\n    on(eventName, callback) {\n        if (!this.events[eventName]) {\n            this.events[eventName] = new SubscriptionManager();\n        }\n        return this.events[eventName].add(callback);\n    }\n    notify(eventName, ...args) {\n        if (this.events[eventName]) {\n            this.events[eventName].notify(...args);\n        }\n    }\n    scheduleRenderMicrotask() {\n        microtask.render(this.render);\n    }\n}\n\nexport { VisualElement, getFeatureDefinitions, setFeatureDefinitions };\n//# sourceMappingURL=VisualElement.mjs.map\n","import { isMotionValue } from '../../value/utils/is-motion-value.mjs';\nimport { DOMKeyframesResolver } from '../../animation/keyframes/DOMKeyframesResolver.mjs';\nimport { VisualElement } from '../VisualElement.mjs';\n\nclass DOMVisualElement extends VisualElement {\n    constructor() {\n        super(...arguments);\n        this.KeyframeResolver = DOMKeyframesResolver;\n    }\n    sortInstanceNodePosition(a, b) {\n        /**\n         * compareDocumentPosition returns a bitmask, by using the bitwise &\n         * we're returning true if 2 in that bitmask is set to true. 2 is set\n         * to true if b preceeds a.\n         */\n        return a.compareDocumentPosition(b) & 2 ? 1 : -1;\n    }\n    getBaseTargetFromProps(props, key) {\n        const style = props.style;\n        return style ? style[key] : undefined;\n    }\n    removeValueFromRenderState(key, { vars, style }) {\n        delete vars[key];\n        delete style[key];\n    }\n    handleChildMotionValue() {\n        if (this.childSubscription) {\n            this.childSubscription();\n            delete this.childSubscription;\n        }\n        const { children } = this.props;\n        if (isMotionValue(children)) {\n            this.childSubscription = children.on(\"change\", (latest) => {\n                if (this.current) {\n                    this.current.textContent = `${latest}`;\n                }\n            });\n        }\n    }\n}\n\nexport { DOMVisualElement };\n//# sourceMappingURL=DOMVisualElement.mjs.map\n","/**\n * Feature base class for extending VisualElement functionality.\n * Features are plugins that can be mounted/unmounted to add behavior\n * like gestures, animations, or layout tracking.\n */\nclass Feature {\n    constructor(node) {\n        this.isMounted = false;\n        this.node = node;\n    }\n    update() { }\n}\n\nexport { Feature };\n//# sourceMappingURL=Feature.mjs.map\n","/**\n * Bounding boxes tend to be defined as top, left, right, bottom. For various operations\n * it's easier to consider each axis individually. This function returns a bounding box\n * as a map of single-axis min/max values.\n */\nfunction convertBoundingBoxToBox({ top, left, right, bottom, }) {\n    return {\n        x: { min: left, max: right },\n        y: { min: top, max: bottom },\n    };\n}\nfunction convertBoxToBoundingBox({ x, y }) {\n    return { top: y.min, right: x.max, bottom: y.max, left: x.min };\n}\n/**\n * Applies a TransformPoint function to a bounding box. TransformPoint is usually a function\n * provided by Framer to allow measured points to be corrected for device scaling. This is used\n * when measuring DOM elements and DOM event points.\n */\nfunction transformBoxPoints(point, transformPoint) {\n    if (!transformPoint)\n        return point;\n    const topLeft = transformPoint({ x: point.left, y: point.top });\n    const bottomRight = transformPoint({ x: point.right, y: point.bottom });\n    return {\n        top: topLeft.y,\n        left: topLeft.x,\n        bottom: bottomRight.y,\n        right: bottomRight.x,\n    };\n}\n\nexport { convertBoundingBoxToBox, convertBoxToBoundingBox, transformBoxPoints };\n//# sourceMappingURL=conversion.mjs.map\n","function isIdentityScale(scale) {\n    return scale === undefined || scale === 1;\n}\nfunction hasScale({ scale, scaleX, scaleY }) {\n    return (!isIdentityScale(scale) ||\n        !isIdentityScale(scaleX) ||\n        !isIdentityScale(scaleY));\n}\nfunction hasTransform(values) {\n    return (hasScale(values) ||\n        has2DTranslate(values) ||\n        values.z ||\n        values.rotate ||\n        values.rotateX ||\n        values.rotateY ||\n        values.skewX ||\n        values.skewY);\n}\nfunction has2DTranslate(values) {\n    return is2DTranslate(values.x) || is2DTranslate(values.y);\n}\nfunction is2DTranslate(value) {\n    return value && value !== \"0%\";\n}\n\nexport { has2DTranslate, hasScale, hasTransform };\n//# sourceMappingURL=has-transform.mjs.map\n","import { mixNumber } from '../../utils/mix/number.mjs';\nimport { hasTransform } from '../utils/has-transform.mjs';\n\n/**\n * Scales a point based on a factor and an originPoint\n */\nfunction scalePoint(point, scale, originPoint) {\n    const distanceFromOrigin = point - originPoint;\n    const scaled = scale * distanceFromOrigin;\n    return originPoint + scaled;\n}\n/**\n * Applies a translate/scale delta to a point\n */\nfunction applyPointDelta(point, translate, scale, originPoint, boxScale) {\n    if (boxScale !== undefined) {\n        point = scalePoint(point, boxScale, originPoint);\n    }\n    return scalePoint(point, scale, originPoint) + translate;\n}\n/**\n * Applies a translate/scale delta to an axis\n */\nfunction applyAxisDelta(axis, translate = 0, scale = 1, originPoint, boxScale) {\n    axis.min = applyPointDelta(axis.min, translate, scale, originPoint, boxScale);\n    axis.max = applyPointDelta(axis.max, translate, scale, originPoint, boxScale);\n}\n/**\n * Applies a translate/scale delta to a box\n */\nfunction applyBoxDelta(box, { x, y }) {\n    applyAxisDelta(box.x, x.translate, x.scale, x.originPoint);\n    applyAxisDelta(box.y, y.translate, y.scale, y.originPoint);\n}\nconst TREE_SCALE_SNAP_MIN = 0.999999999999;\nconst TREE_SCALE_SNAP_MAX = 1.0000000000001;\n/**\n * Apply a tree of deltas to a box. We do this to calculate the effect of all the transforms\n * in a tree upon our box before then calculating how to project it into our desired viewport-relative box\n *\n * This is the final nested loop within updateLayoutDelta for future refactoring\n */\nfunction applyTreeDeltas(box, treeScale, treePath, isSharedTransition = false) {\n    const treeLength = treePath.length;\n    if (!treeLength)\n        return;\n    // Reset the treeScale\n    treeScale.x = treeScale.y = 1;\n    let node;\n    let delta;\n    for (let i = 0; i < treeLength; i++) {\n        node = treePath[i];\n        delta = node.projectionDelta;\n        /**\n         * TODO: Prefer to remove this, but currently we have motion components with\n         * display: contents in Framer.\n         */\n        const { visualElement } = node.options;\n        if (visualElement &&\n            visualElement.props.style &&\n            visualElement.props.style.display === \"contents\") {\n            continue;\n        }\n        if (isSharedTransition &&\n            node.options.layoutScroll &&\n            node.scroll &&\n            node !== node.root) {\n            translateAxis(box.x, -node.scroll.offset.x);\n            translateAxis(box.y, -node.scroll.offset.y);\n        }\n        if (delta) {\n            // Incoporate each ancestor's scale into a cumulative treeScale for this component\n            treeScale.x *= delta.x.scale;\n            treeScale.y *= delta.y.scale;\n            // Apply each ancestor's calculated delta into this component's recorded layout box\n            applyBoxDelta(box, delta);\n        }\n        if (isSharedTransition && hasTransform(node.latestValues)) {\n            transformBox(box, node.latestValues, node.layout?.layoutBox);\n        }\n    }\n    /**\n     * Snap tree scale back to 1 if it's within a non-perceivable threshold.\n     * This will help reduce useless scales getting rendered.\n     */\n    if (treeScale.x < TREE_SCALE_SNAP_MAX &&\n        treeScale.x > TREE_SCALE_SNAP_MIN) {\n        treeScale.x = 1.0;\n    }\n    if (treeScale.y < TREE_SCALE_SNAP_MAX &&\n        treeScale.y > TREE_SCALE_SNAP_MIN) {\n        treeScale.y = 1.0;\n    }\n}\nfunction translateAxis(axis, distance) {\n    axis.min += distance;\n    axis.max += distance;\n}\n/**\n * Apply a transform to an axis from the latest resolved motion values.\n * This function basically acts as a bridge between a flat motion value map\n * and applyAxisDelta\n */\nfunction transformAxis(axis, axisTranslate, axisScale, boxScale, axisOrigin = 0.5) {\n    const originPoint = mixNumber(axis.min, axis.max, axisOrigin);\n    // Apply the axis delta to the final axis\n    applyAxisDelta(axis, axisTranslate, axisScale, originPoint, boxScale);\n}\nfunction resolveAxisTranslate(value, axis) {\n    if (typeof value === \"string\") {\n        return (parseFloat(value) / 100) * (axis.max - axis.min);\n    }\n    return value;\n}\n/**\n * Apply a transform to a box from the latest resolved motion values.\n */\nfunction transformBox(box, transform, sourceBox) {\n    const resolveBox = sourceBox ?? box;\n    transformAxis(box.x, resolveAxisTranslate(transform.x, resolveBox.x), transform.scaleX, transform.scale, transform.originX);\n    transformAxis(box.y, resolveAxisTranslate(transform.y, resolveBox.y), transform.scaleY, transform.scale, transform.originY);\n}\n\nexport { applyAxisDelta, applyBoxDelta, applyPointDelta, applyTreeDeltas, scalePoint, transformAxis, transformBox, translateAxis };\n//# sourceMappingURL=delta-apply.mjs.map\n","import { convertBoundingBoxToBox, transformBoxPoints } from '../geometry/conversion.mjs';\nimport { translateAxis } from '../geometry/delta-apply.mjs';\n\nfunction measureViewportBox(instance, transformPoint) {\n    return convertBoundingBoxToBox(transformBoxPoints(instance.getBoundingClientRect(), transformPoint));\n}\nfunction measurePageBox(element, rootProjectionNode, transformPagePoint) {\n    const viewportBox = measureViewportBox(element, transformPagePoint);\n    const { scroll } = rootProjectionNode;\n    if (scroll) {\n        translateAxis(viewportBox.x, scroll.offset.x);\n        translateAxis(viewportBox.y, scroll.offset.y);\n    }\n    return viewportBox;\n}\n\nexport { measurePageBox, measureViewportBox };\n//# sourceMappingURL=measure.mjs.map\n","import { getValueAsType } from '../../../value/types/utils/get-as-type.mjs';\nimport { numberValueTypes } from '../../../value/types/maps/number.mjs';\nimport { transformPropOrder } from '../../utils/keys-transform.mjs';\n\nconst translateAlias = {\n    x: \"translateX\",\n    y: \"translateY\",\n    z: \"translateZ\",\n    transformPerspective: \"perspective\",\n};\nconst numTransforms = transformPropOrder.length;\n/**\n * Build a CSS transform style from individual x/y/scale etc properties.\n *\n * This outputs with a default order of transforms/scales/rotations, this can be customised by\n * providing a transformTemplate function.\n */\nfunction buildTransform(latestValues, transform, transformTemplate) {\n    // The transform string we're going to build into.\n    let transformString = \"\";\n    let transformIsDefault = true;\n    /**\n     * Loop over all possible transforms in order, adding the ones that\n     * are present to the transform string.\n     */\n    for (let i = 0; i < numTransforms; i++) {\n        const key = transformPropOrder[i];\n        const value = latestValues[key];\n        if (value === undefined)\n            continue;\n        let valueIsDefault = true;\n        if (typeof value === \"number\") {\n            valueIsDefault = value === (key.startsWith(\"scale\") ? 1 : 0);\n        }\n        else {\n            const parsed = parseFloat(value);\n            valueIsDefault = key.startsWith(\"scale\") ? parsed === 1 : parsed === 0;\n        }\n        if (!valueIsDefault || transformTemplate) {\n            const valueAsType = getValueAsType(value, numberValueTypes[key]);\n            if (!valueIsDefault) {\n                transformIsDefault = false;\n                const transformName = translateAlias[key] || key;\n                transformString += `${transformName}(${valueAsType}) `;\n            }\n            if (transformTemplate) {\n                transform[key] = valueAsType;\n            }\n        }\n    }\n    transformString = transformString.trim();\n    // If we have a custom `transform` template, pass our transform values and\n    // generated transformString to that before returning\n    if (transformTemplate) {\n        transformString = transformTemplate(transform, transformIsDefault ? \"\" : transformString);\n    }\n    else if (transformIsDefault) {\n        transformString = \"none\";\n    }\n    return transformString;\n}\n\nexport { buildTransform };\n//# sourceMappingURL=build-transform.mjs.map\n","import { getValueAsType } from '../../../value/types/utils/get-as-type.mjs';\nimport { numberValueTypes } from '../../../value/types/maps/number.mjs';\nimport { transformProps } from '../../utils/keys-transform.mjs';\nimport { isCSSVariableName } from '../../../animation/utils/is-css-variable.mjs';\nimport { buildTransform } from './build-transform.mjs';\n\nfunction buildHTMLStyles(state, latestValues, transformTemplate) {\n    const { style, vars, transformOrigin } = state;\n    // Track whether we encounter any transform or transformOrigin values.\n    let hasTransform = false;\n    let hasTransformOrigin = false;\n    /**\n     * Loop over all our latest animated values and decide whether to handle them\n     * as a style or CSS variable.\n     *\n     * Transforms and transform origins are kept separately for further processing.\n     */\n    for (const key in latestValues) {\n        const value = latestValues[key];\n        if (transformProps.has(key)) {\n            // If this is a transform, flag to enable further transform processing\n            hasTransform = true;\n            continue;\n        }\n        else if (isCSSVariableName(key)) {\n            vars[key] = value;\n            continue;\n        }\n        else {\n            // Convert the value to its default value type, ie 0 -> \"0px\"\n            const valueAsType = getValueAsType(value, numberValueTypes[key]);\n            if (key.startsWith(\"origin\")) {\n                // If this is a transform origin, flag and enable further transform-origin processing\n                hasTransformOrigin = true;\n                transformOrigin[key] =\n                    valueAsType;\n            }\n            else {\n                style[key] = valueAsType;\n            }\n        }\n    }\n    if (!latestValues.transform) {\n        if (hasTransform || transformTemplate) {\n            style.transform = buildTransform(latestValues, state.transform, transformTemplate);\n        }\n        else if (style.transform) {\n            /**\n             * If we have previously created a transform but currently don't have any,\n             * reset transform style to none.\n             */\n            style.transform = \"none\";\n        }\n    }\n    /**\n     * Build a transformOrigin style. Uses the same defaults as the browser for\n     * undefined origins.\n     */\n    if (hasTransformOrigin) {\n        const { originX = \"50%\", originY = \"50%\", originZ = 0, } = transformOrigin;\n        style.transformOrigin = `${originX} ${originY} ${originZ}`;\n    }\n}\n\nexport { buildHTMLStyles };\n//# sourceMappingURL=build-styles.mjs.map\n","function renderHTML(element, { style, vars }, styleProp, projection) {\n    const elementStyle = element.style;\n    let key;\n    for (key in style) {\n        // CSSStyleDeclaration has [index: number]: string; in the types, so we use that as key type.\n        elementStyle[key] = style[key];\n    }\n    // Write projection styles directly to element style\n    projection?.applyProjectionStyles(elementStyle, styleProp);\n    for (key in vars) {\n        // Loop over any CSS variables and assign those.\n        // They can only be assigned using `setProperty`.\n        elementStyle.setProperty(key, vars[key]);\n    }\n}\n\nexport { renderHTML };\n//# sourceMappingURL=render.mjs.map\n","import { px } from '../../value/types/numbers/units.mjs';\n\nfunction pixelsToPercent(pixels, axis) {\n    if (axis.max === axis.min)\n        return 0;\n    return (pixels / (axis.max - axis.min)) * 100;\n}\n/**\n * We always correct borderRadius as a percentage rather than pixels to reduce paints.\n * For example, if you are projecting a box that is 100px wide with a 10px borderRadius\n * into a box that is 200px wide with a 20px borderRadius, that is actually a 10%\n * borderRadius in both states. If we animate between the two in pixels that will trigger\n * a paint each time. If we animate between the two in percentage we'll avoid a paint.\n */\nconst correctBorderRadius = {\n    correct: (latest, node) => {\n        if (!node.target)\n            return latest;\n        /**\n         * If latest is a string, if it's a percentage we can return immediately as it's\n         * going to be stretched appropriately. Otherwise, if it's a pixel, convert it to a number.\n         */\n        if (typeof latest === \"string\") {\n            if (px.test(latest)) {\n                latest = parseFloat(latest);\n            }\n            else {\n                return latest;\n            }\n        }\n        /**\n         * If latest is a number, it's a pixel value. We use the current viewportBox to calculate that\n         * pixel value as a percentage of each axis\n         */\n        const x = pixelsToPercent(latest, node.target.x);\n        const y = pixelsToPercent(latest, node.target.y);\n        return `${x}% ${y}%`;\n    },\n};\n\nexport { correctBorderRadius, pixelsToPercent };\n//# sourceMappingURL=scale-border-radius.mjs.map\n","import { complex } from '../../value/types/complex/index.mjs';\nimport { mixNumber } from '../../utils/mix/number.mjs';\n\nconst correctBoxShadow = {\n    correct: (latest, { treeScale, projectionDelta }) => {\n        const original = latest;\n        const shadow = complex.parse(latest);\n        // TODO: Doesn't support multiple shadows\n        if (shadow.length > 5)\n            return original;\n        const template = complex.createTransformer(latest);\n        const offset = typeof shadow[0] !== \"number\" ? 1 : 0;\n        // Calculate the overall context scale\n        const xScale = projectionDelta.x.scale * treeScale.x;\n        const yScale = projectionDelta.y.scale * treeScale.y;\n        shadow[0 + offset] /= xScale;\n        shadow[1 + offset] /= yScale;\n        /**\n         * Ideally we'd correct x and y scales individually, but because blur and\n         * spread apply to both we have to take a scale average and apply that instead.\n         * We could potentially improve the outcome of this by incorporating the ratio between\n         * the two scales.\n         */\n        const averageScale = mixNumber(xScale, yScale, 0.5);\n        // Blur\n        if (typeof shadow[2 + offset] === \"number\")\n            shadow[2 + offset] /= averageScale;\n        // Spread\n        if (typeof shadow[3 + offset] === \"number\")\n            shadow[3 + offset] /= averageScale;\n        return template(shadow);\n    },\n};\n\nexport { correctBoxShadow };\n//# sourceMappingURL=scale-box-shadow.mjs.map\n","import { isCSSVariableName } from '../../animation/utils/is-css-variable.mjs';\nimport { correctBorderRadius } from './scale-border-radius.mjs';\nimport { correctBoxShadow } from './scale-box-shadow.mjs';\n\nconst scaleCorrectors = {\n    borderRadius: {\n        ...correctBorderRadius,\n        applyTo: [\n            \"borderTopLeftRadius\",\n            \"borderTopRightRadius\",\n            \"borderBottomLeftRadius\",\n            \"borderBottomRightRadius\",\n        ],\n    },\n    borderTopLeftRadius: correctBorderRadius,\n    borderTopRightRadius: correctBorderRadius,\n    borderBottomLeftRadius: correctBorderRadius,\n    borderBottomRightRadius: correctBorderRadius,\n    boxShadow: correctBoxShadow,\n};\nfunction addScaleCorrector(correctors) {\n    for (const key in correctors) {\n        scaleCorrectors[key] = correctors[key];\n        if (isCSSVariableName(key)) {\n            scaleCorrectors[key].isCSSVariable = true;\n        }\n    }\n}\n\nexport { addScaleCorrector, scaleCorrectors };\n//# sourceMappingURL=scale-correction.mjs.map\n","import { transformProps } from './keys-transform.mjs';\nimport { scaleCorrectors } from '../../projection/styles/scale-correction.mjs';\nexport { addScaleCorrector } from '../../projection/styles/scale-correction.mjs';\n\nfunction isForcedMotionValue(key, { layout, layoutId }) {\n    return (transformProps.has(key) ||\n        key.startsWith(\"origin\") ||\n        ((layout || layoutId !== undefined) &&\n            (!!scaleCorrectors[key] || key === \"opacity\")));\n}\n\nexport { isForcedMotionValue, scaleCorrectors };\n//# sourceMappingURL=is-forced-motion-value.mjs.map\n","import { isMotionValue } from '../../../value/utils/is-motion-value.mjs';\nimport { isForcedMotionValue } from '../../utils/is-forced-motion-value.mjs';\n\nfunction scrapeMotionValuesFromProps(props, prevProps, visualElement) {\n    const style = props.style;\n    const prevStyle = prevProps?.style;\n    const newValues = {};\n    if (!style)\n        return newValues;\n    for (const key in style) {\n        if (isMotionValue(style[key]) ||\n            (prevStyle && isMotionValue(prevStyle[key])) ||\n            isForcedMotionValue(key, props) ||\n            visualElement?.getValue(key)?.liveStyle !== undefined) {\n            newValues[key] = style[key];\n        }\n    }\n    return newValues;\n}\n\nexport { scrapeMotionValuesFromProps };\n//# sourceMappingURL=scrape-motion-values.mjs.map\n","import { isCSSVariableName } from '../../animation/utils/is-css-variable.mjs';\nimport { transformProps } from '../utils/keys-transform.mjs';\nimport { defaultTransformValue, readTransformValue } from '../dom/parse-transform.mjs';\nimport { measureViewportBox } from '../../projection/utils/measure.mjs';\nimport { DOMVisualElement } from '../dom/DOMVisualElement.mjs';\nimport { buildHTMLStyles } from './utils/build-styles.mjs';\nimport { renderHTML } from './utils/render.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\n\nfunction getComputedStyle(element) {\n    return window.getComputedStyle(element);\n}\nclass HTMLVisualElement extends DOMVisualElement {\n    constructor() {\n        super(...arguments);\n        this.type = \"html\";\n        this.renderInstance = renderHTML;\n    }\n    readValueFromInstance(instance, key) {\n        if (transformProps.has(key)) {\n            return this.projection?.isProjecting\n                ? defaultTransformValue(key)\n                : readTransformValue(instance, key);\n        }\n        else {\n            const computedStyle = getComputedStyle(instance);\n            const value = (isCSSVariableName(key)\n                ? computedStyle.getPropertyValue(key)\n                : computedStyle[key]) || 0;\n            return typeof value === \"string\" ? value.trim() : value;\n        }\n    }\n    measureInstanceViewportBox(instance, { transformPagePoint }) {\n        return measureViewportBox(instance, transformPagePoint);\n    }\n    build(renderState, latestValues, props) {\n        buildHTMLStyles(renderState, latestValues, props.transformTemplate);\n    }\n    scrapeMotionValuesFromProps(props, prevProps, visualElement) {\n        return scrapeMotionValuesFromProps(props, prevProps, visualElement);\n    }\n}\n\nexport { HTMLVisualElement, getComputedStyle };\n//# sourceMappingURL=HTMLVisualElement.mjs.map\n","const dashKeys = {\n    offset: \"stroke-dashoffset\",\n    array: \"stroke-dasharray\",\n};\nconst camelKeys = {\n    offset: \"strokeDashoffset\",\n    array: \"strokeDasharray\",\n};\n/**\n * Build SVG path properties. Uses the path's measured length to convert\n * our custom pathLength, pathSpacing and pathOffset into stroke-dashoffset\n * and stroke-dasharray attributes.\n *\n * This function is mutative to reduce per-frame GC.\n *\n * Note: We use unitless values for stroke-dasharray and stroke-dashoffset\n * because Safari incorrectly scales px values when the page is zoomed.\n */\nfunction buildSVGPath(attrs, length, spacing = 1, offset = 0, useDashCase = true) {\n    // Normalise path length by setting SVG attribute pathLength to 1\n    attrs.pathLength = 1;\n    // We use dash case when setting attributes directly to the DOM node and camel case\n    // when defining props on a React component.\n    const keys = useDashCase ? dashKeys : camelKeys;\n    // Build the dash offset (unitless to avoid Safari zoom bug)\n    attrs[keys.offset] = `${-offset}`;\n    // Build the dash array (unitless to avoid Safari zoom bug)\n    attrs[keys.array] = `${length} ${spacing}`;\n}\n\nexport { buildSVGPath };\n//# sourceMappingURL=path.mjs.map\n","import { buildHTMLStyles } from '../../html/utils/build-styles.mjs';\nimport { buildSVGPath } from './path.mjs';\n\n/**\n * CSS Motion Path properties that should remain as CSS styles on SVG elements.\n */\nconst cssMotionPathProperties = [\n    \"offsetDistance\",\n    \"offsetPath\",\n    \"offsetRotate\",\n    \"offsetAnchor\",\n];\n/**\n * Build SVG visual attributes, like cx and style.transform\n */\nfunction buildSVGAttrs(state, { attrX, attrY, attrScale, pathLength, pathSpacing = 1, pathOffset = 0, \n// This is object creation, which we try to avoid per-frame.\n...latest }, isSVGTag, transformTemplate, styleProp) {\n    buildHTMLStyles(state, latest, transformTemplate);\n    /**\n     * For svg tags we just want to make sure viewBox is animatable and treat all the styles\n     * as normal HTML tags.\n     */\n    if (isSVGTag) {\n        if (state.style.viewBox) {\n            state.attrs.viewBox = state.style.viewBox;\n        }\n        return;\n    }\n    state.attrs = state.style;\n    state.style = {};\n    const { attrs, style } = state;\n    /**\n     * However, we apply transforms as CSS transforms.\n     * So if we detect a transform, transformOrigin we take it from attrs and copy it into style.\n     */\n    if (attrs.transform) {\n        style.transform = attrs.transform;\n        delete attrs.transform;\n    }\n    if (style.transform || attrs.transformOrigin) {\n        style.transformOrigin = attrs.transformOrigin ?? \"50% 50%\";\n        delete attrs.transformOrigin;\n    }\n    if (style.transform) {\n        /**\n         * SVG's element transform-origin uses its own median as a reference.\n         * Therefore, transformBox becomes a fill-box\n         */\n        style.transformBox = styleProp?.transformBox ?? \"fill-box\";\n        delete attrs.transformBox;\n    }\n    for (const key of cssMotionPathProperties) {\n        if (attrs[key] !== undefined) {\n            style[key] = attrs[key];\n            delete attrs[key];\n        }\n    }\n    // Render attrX/attrY/attrScale as attributes\n    if (attrX !== undefined)\n        attrs.x = attrX;\n    if (attrY !== undefined)\n        attrs.y = attrY;\n    if (attrScale !== undefined)\n        attrs.scale = attrScale;\n    // Build SVG path if one has been defined\n    if (pathLength !== undefined) {\n        buildSVGPath(attrs, pathLength, pathSpacing, pathOffset, false);\n    }\n}\n\nexport { buildSVGAttrs };\n//# sourceMappingURL=build-attrs.mjs.map\n","/**\n * A set of attribute names that are always read/written as camel case.\n */\nconst camelCaseAttributes = new Set([\n    \"baseFrequency\",\n    \"diffuseConstant\",\n    \"kernelMatrix\",\n    \"kernelUnitLength\",\n    \"keySplines\",\n    \"keyTimes\",\n    \"limitingConeAngle\",\n    \"markerHeight\",\n    \"markerWidth\",\n    \"numOctaves\",\n    \"targetX\",\n    \"targetY\",\n    \"surfaceScale\",\n    \"specularConstant\",\n    \"specularExponent\",\n    \"stdDeviation\",\n    \"tableValues\",\n    \"viewBox\",\n    \"gradientTransform\",\n    \"pathLength\",\n    \"startOffset\",\n    \"textLength\",\n    \"lengthAdjust\",\n]);\n\nexport { camelCaseAttributes };\n//# sourceMappingURL=camel-case-attrs.mjs.map\n","const isSVGTag = (tag) => typeof tag === \"string\" && tag.toLowerCase() === \"svg\";\n\nexport { isSVGTag };\n//# sourceMappingURL=is-svg-tag.mjs.map\n","import { camelToDash } from '../../dom/utils/camel-to-dash.mjs';\nimport { renderHTML } from '../../html/utils/render.mjs';\nimport { camelCaseAttributes } from './camel-case-attrs.mjs';\n\nfunction renderSVG(element, renderState, _styleProp, projection) {\n    renderHTML(element, renderState, undefined, projection);\n    for (const key in renderState.attrs) {\n        element.setAttribute(!camelCaseAttributes.has(key) ? camelToDash(key) : key, renderState.attrs[key]);\n    }\n}\n\nexport { renderSVG };\n//# sourceMappingURL=render.mjs.map\n","import { isMotionValue } from '../../../value/utils/is-motion-value.mjs';\nimport { transformPropOrder } from '../../utils/keys-transform.mjs';\nimport { scrapeMotionValuesFromProps as scrapeMotionValuesFromProps$1 } from '../../html/utils/scrape-motion-values.mjs';\n\nfunction scrapeMotionValuesFromProps(props, prevProps, visualElement) {\n    const newValues = scrapeMotionValuesFromProps$1(props, prevProps, visualElement);\n    for (const key in props) {\n        if (isMotionValue(props[key]) ||\n            isMotionValue(prevProps[key])) {\n            const targetKey = transformPropOrder.indexOf(key) !== -1\n                ? \"attr\" + key.charAt(0).toUpperCase() + key.substring(1)\n                : key;\n            newValues[targetKey] = props[key];\n        }\n    }\n    return newValues;\n}\n\nexport { scrapeMotionValuesFromProps };\n//# sourceMappingURL=scrape-motion-values.mjs.map\n","import { transformProps } from '../utils/keys-transform.mjs';\nimport { getDefaultValueType } from '../../value/types/maps/defaults.mjs';\nimport { createBox } from '../../projection/geometry/models.mjs';\nimport { DOMVisualElement } from '../dom/DOMVisualElement.mjs';\nimport { camelToDash } from '../dom/utils/camel-to-dash.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\nimport { camelCaseAttributes } from './utils/camel-case-attrs.mjs';\nimport { isSVGTag } from './utils/is-svg-tag.mjs';\nimport { renderSVG } from './utils/render.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\n\nclass SVGVisualElement extends DOMVisualElement {\n    constructor() {\n        super(...arguments);\n        this.type = \"svg\";\n        this.isSVGTag = false;\n        this.measureInstanceViewportBox = createBox;\n    }\n    getBaseTargetFromProps(props, key) {\n        return props[key];\n    }\n    readValueFromInstance(instance, key) {\n        if (transformProps.has(key)) {\n            const defaultType = getDefaultValueType(key);\n            return defaultType ? defaultType.default || 0 : 0;\n        }\n        key = !camelCaseAttributes.has(key) ? camelToDash(key) : key;\n        return instance.getAttribute(key);\n    }\n    scrapeMotionValuesFromProps(props, prevProps, visualElement) {\n        return scrapeMotionValuesFromProps(props, prevProps, visualElement);\n    }\n    build(renderState, latestValues, props) {\n        buildSVGAttrs(renderState, latestValues, this.isSVGTag, props.transformTemplate, props.style);\n    }\n    renderInstance(instance, renderState, styleProp, projection) {\n        renderSVG(instance, renderState, styleProp, projection);\n    }\n    mount(instance) {\n        this.isSVGTag = isSVGTag(instance.tagName);\n        super.mount(instance);\n    }\n}\n\nexport { SVGVisualElement };\n//# sourceMappingURL=SVGVisualElement.mjs.map\n","import { isVariantLabel } from './is-variant-label.mjs';\nimport { variantProps } from './variant-props.mjs';\n\nconst numVariantProps = variantProps.length;\n/**\n * Get variant context from a visual element's parent chain.\n * Uses `any` type for visualElement to avoid circular dependencies.\n */\nfunction getVariantContext(visualElement) {\n    if (!visualElement)\n        return undefined;\n    if (!visualElement.isControllingVariants) {\n        const context = visualElement.parent\n            ? getVariantContext(visualElement.parent) || {}\n            : {};\n        if (visualElement.props.initial !== undefined) {\n            context.initial = visualElement.props.initial;\n        }\n        return context;\n    }\n    const context = {};\n    for (let i = 0; i < numVariantProps; i++) {\n        const name = variantProps[i];\n        const prop = visualElement.props[name];\n        if (isVariantLabel(prop) || prop === false) {\n            context[name] = prop;\n        }\n    }\n    return context;\n}\n\nexport { getVariantContext };\n//# sourceMappingURL=get-variant-context.mjs.map\n","function shallowCompare(next, prev) {\n    if (!Array.isArray(prev))\n        return false;\n    const prevLength = prev.length;\n    if (prevLength !== next.length)\n        return false;\n    for (let i = 0; i < prevLength; i++) {\n        if (prev[i] !== next[i])\n            return false;\n    }\n    return true;\n}\n\nexport { shallowCompare };\n//# sourceMappingURL=shallow-compare.mjs.map\n","import { animateVisualElement } from '../../animation/interfaces/visual-element.mjs';\nimport { calcChildStagger } from '../../animation/utils/calc-child-stagger.mjs';\nimport { getVariantContext } from './get-variant-context.mjs';\nimport { isAnimationControls } from './is-animation-controls.mjs';\nimport { isKeyframesTarget } from './is-keyframes-target.mjs';\nimport { isVariantLabel } from './is-variant-label.mjs';\nimport { resolveVariant } from './resolve-dynamic-variants.mjs';\nimport { shallowCompare } from './shallow-compare.mjs';\nimport { variantPriorityOrder } from './variant-props.mjs';\n\nconst reversePriorityOrder = [...variantPriorityOrder].reverse();\nconst numAnimationTypes = variantPriorityOrder.length;\nfunction createAnimateFunction(visualElement) {\n    return (animations) => {\n        return Promise.all(animations.map(({ animation, options }) => animateVisualElement(visualElement, animation, options)));\n    };\n}\nfunction createAnimationState(visualElement) {\n    let animate = createAnimateFunction(visualElement);\n    let state = createState();\n    let isInitialRender = true;\n    /**\n     * Track whether the animation state has been reset (e.g. via StrictMode\n     * double-invocation or Suspense unmount/remount). On the first\n     * animateChanges() call after a reset we need to behave like the initial\n     * render for variant-inheritance checks, even though isInitialRender is\n     * already false.\n     */\n    let wasReset = false;\n    /**\n     * This function will be used to reduce the animation definitions for\n     * each active animation type into an object of resolved values for it.\n     */\n    const buildResolvedTypeValues = (type) => (acc, definition) => {\n        const resolved = resolveVariant(visualElement, definition, type === \"exit\"\n            ? visualElement.presenceContext?.custom\n            : undefined);\n        if (resolved) {\n            const { transition, transitionEnd, ...target } = resolved;\n            acc = { ...acc, ...target, ...transitionEnd };\n        }\n        return acc;\n    };\n    /**\n     * This just allows us to inject mocked animation functions\n     * @internal\n     */\n    function setAnimateFunction(makeAnimator) {\n        animate = makeAnimator(visualElement);\n    }\n    /**\n     * When we receive new props, we need to:\n     * 1. Create a list of protected keys for each type. This is a directory of\n     *    value keys that are currently being \"handled\" by types of a higher priority\n     *    so that whenever an animation is played of a given type, these values are\n     *    protected from being animated.\n     * 2. Determine if an animation type needs animating.\n     * 3. Determine if any values have been removed from a type and figure out\n     *    what to animate those to.\n     */\n    function animateChanges(changedActiveType) {\n        const { props } = visualElement;\n        const context = getVariantContext(visualElement.parent) || {};\n        /**\n         * A list of animations that we'll build into as we iterate through the animation\n         * types. This will get executed at the end of the function.\n         */\n        const animations = [];\n        /**\n         * Keep track of which values have been removed. Then, as we hit lower priority\n         * animation types, we can check if they contain removed values and animate to that.\n         */\n        const removedKeys = new Set();\n        /**\n         * A dictionary of all encountered keys. This is an object to let us build into and\n         * copy it without iteration. Each time we hit an animation type we set its protected\n         * keys - the keys its not allowed to animate - to the latest version of this object.\n         */\n        let encounteredKeys = {};\n        /**\n         * If a variant has been removed at a given index, and this component is controlling\n         * variant animations, we want to ensure lower-priority variants are forced to animate.\n         */\n        let removedVariantIndex = Infinity;\n        /**\n         * Iterate through all animation types in reverse priority order. For each, we want to\n         * detect which values it's handling and whether or not they've changed (and therefore\n         * need to be animated). If any values have been removed, we want to detect those in\n         * lower priority props and flag for animation.\n         */\n        for (let i = 0; i < numAnimationTypes; i++) {\n            const type = reversePriorityOrder[i];\n            const typeState = state[type];\n            const prop = props[type] !== undefined\n                ? props[type]\n                : context[type];\n            const propIsVariant = isVariantLabel(prop);\n            /**\n             * If this type has *just* changed isActive status, set activeDelta\n             * to that status. Otherwise set to null.\n             */\n            const activeDelta = type === changedActiveType ? typeState.isActive : null;\n            if (activeDelta === false)\n                removedVariantIndex = i;\n            /**\n             * If this prop is an inherited variant, rather than been set directly on the\n             * component itself, we want to make sure we allow the parent to trigger animations.\n             *\n             * TODO: Can probably change this to a !isControllingVariants check\n             */\n            let isInherited = prop === context[type] &&\n                prop !== props[type] &&\n                propIsVariant;\n            if (isInherited &&\n                (isInitialRender || wasReset) &&\n                visualElement.manuallyAnimateOnMount) {\n                isInherited = false;\n            }\n            /**\n             * Set all encountered keys so far as the protected keys for this type. This will\n             * be any key that has been animated or otherwise handled by active, higher-priortiy types.\n             */\n            typeState.protectedKeys = { ...encounteredKeys };\n            // Check if we can skip analysing this prop early\n            if (\n            // If it isn't active and hasn't *just* been set as inactive\n            (!typeState.isActive && activeDelta === null) ||\n                // If we didn't and don't have any defined prop for this animation type\n                (!prop && !typeState.prevProp) ||\n                // Or if the prop doesn't define an animation\n                isAnimationControls(prop) ||\n                typeof prop === \"boolean\") {\n                continue;\n            }\n            /**\n             * If exit is already active and wasn't just activated, skip\n             * re-processing to prevent interrupting running exit animations.\n             * Re-resolving exit with a changed custom value can start new\n             * value animations that stop the originals, leaving the exit\n             * animation promise unresolved and the component stuck in the DOM.\n             */\n            if (type === \"exit\" && typeState.isActive && activeDelta !== true) {\n                if (typeState.prevResolvedValues) {\n                    encounteredKeys = {\n                        ...encounteredKeys,\n                        ...typeState.prevResolvedValues,\n                    };\n                }\n                continue;\n            }\n            /**\n             * As we go look through the values defined on this type, if we detect\n             * a changed value or a value that was removed in a higher priority, we set\n             * this to true and add this prop to the animation list.\n             */\n            const variantDidChange = checkVariantsDidChange(typeState.prevProp, prop);\n            let shouldAnimateType = variantDidChange ||\n                // If we're making this variant active, we want to always make it active\n                (type === changedActiveType &&\n                    typeState.isActive &&\n                    !isInherited &&\n                    propIsVariant) ||\n                // If we removed a higher-priority variant (i is in reverse order)\n                (i > removedVariantIndex && propIsVariant);\n            let handledRemovedValues = false;\n            /**\n             * As animations can be set as variant lists, variants or target objects, we\n             * coerce everything to an array if it isn't one already\n             */\n            const definitionList = Array.isArray(prop) ? prop : [prop];\n            /**\n             * Build an object of all the resolved values. We'll use this in the subsequent\n             * animateChanges calls to determine whether a value has changed.\n             */\n            let resolvedValues = definitionList.reduce(buildResolvedTypeValues(type), {});\n            if (activeDelta === false)\n                resolvedValues = {};\n            /**\n             * Now we need to loop through all the keys in the prev prop and this prop,\n             * and decide:\n             * 1. If the value has changed, and needs animating\n             * 2. If it has been removed, and needs adding to the removedKeys set\n             * 3. If it has been removed in a higher priority type and needs animating\n             * 4. If it hasn't been removed in a higher priority but hasn't changed, and\n             *    needs adding to the type's protectedKeys list.\n             */\n            const { prevResolvedValues = {} } = typeState;\n            const allKeys = {\n                ...prevResolvedValues,\n                ...resolvedValues,\n            };\n            const markToAnimate = (key) => {\n                shouldAnimateType = true;\n                if (removedKeys.has(key)) {\n                    handledRemovedValues = true;\n                    removedKeys.delete(key);\n                }\n                typeState.needsAnimating[key] = true;\n                const motionValue = visualElement.getValue(key);\n                if (motionValue)\n                    motionValue.liveStyle = false;\n            };\n            for (const key in allKeys) {\n                const next = resolvedValues[key];\n                const prev = prevResolvedValues[key];\n                // If we've already handled this we can just skip ahead\n                if (encounteredKeys.hasOwnProperty(key))\n                    continue;\n                /**\n                 * If the value has changed, we probably want to animate it.\n                 */\n                let valueHasChanged = false;\n                if (isKeyframesTarget(next) && isKeyframesTarget(prev)) {\n                    valueHasChanged = !shallowCompare(next, prev);\n                }\n                else {\n                    valueHasChanged = next !== prev;\n                }\n                if (valueHasChanged) {\n                    if (next !== undefined && next !== null) {\n                        // If next is defined and doesn't equal prev, it needs animating\n                        markToAnimate(key);\n                    }\n                    else {\n                        // If it's undefined, it's been removed.\n                        removedKeys.add(key);\n                    }\n                }\n                else if (next !== undefined && removedKeys.has(key)) {\n                    /**\n                     * If next hasn't changed and it isn't undefined, we want to check if it's\n                     * been removed by a higher priority\n                     */\n                    markToAnimate(key);\n                }\n                else {\n                    /**\n                     * If it hasn't changed, we add it to the list of protected values\n                     * to ensure it doesn't get animated.\n                     */\n                    typeState.protectedKeys[key] = true;\n                }\n            }\n            /**\n             * Update the typeState so next time animateChanges is called we can compare the\n             * latest prop and resolvedValues to these.\n             */\n            typeState.prevProp = prop;\n            typeState.prevResolvedValues = resolvedValues;\n            if (typeState.isActive) {\n                encounteredKeys = { ...encounteredKeys, ...resolvedValues };\n            }\n            if ((isInitialRender || wasReset) &&\n                visualElement.blockInitialAnimation) {\n                shouldAnimateType = false;\n            }\n            /**\n             * If this is an inherited prop we want to skip this animation\n             * unless the inherited variants haven't changed on this render.\n             */\n            const willAnimateViaParent = isInherited && variantDidChange;\n            const needsAnimating = !willAnimateViaParent || handledRemovedValues;\n            if (shouldAnimateType && needsAnimating) {\n                animations.push(...definitionList.map((animation) => {\n                    const options = { type };\n                    /**\n                     * If we're performing the initial animation, but we're not\n                     * rendering at the same time as the variant-controlling parent,\n                     * we want to use the parent's transition to calculate the stagger.\n                     */\n                    if (typeof animation === \"string\" &&\n                        (isInitialRender || wasReset) &&\n                        !willAnimateViaParent &&\n                        visualElement.manuallyAnimateOnMount &&\n                        visualElement.parent) {\n                        const { parent } = visualElement;\n                        const parentVariant = resolveVariant(parent, animation);\n                        if (parent.enteringChildren && parentVariant) {\n                            const { delayChildren } = parentVariant.transition || {};\n                            options.delay = calcChildStagger(parent.enteringChildren, visualElement, delayChildren);\n                        }\n                    }\n                    return {\n                        animation: animation,\n                        options,\n                    };\n                }));\n            }\n        }\n        /**\n         * If there are some removed value that haven't been dealt with,\n         * we need to create a new animation that falls back either to the value\n         * defined in the style prop, or the last read value.\n         */\n        if (removedKeys.size) {\n            const fallbackAnimation = {};\n            /**\n             * If the initial prop contains a transition we can use that, otherwise\n             * allow the animation function to use the visual element's default.\n             */\n            if (typeof props.initial !== \"boolean\") {\n                const initialTransition = resolveVariant(visualElement, Array.isArray(props.initial)\n                    ? props.initial[0]\n                    : props.initial);\n                if (initialTransition && initialTransition.transition) {\n                    fallbackAnimation.transition = initialTransition.transition;\n                }\n            }\n            removedKeys.forEach((key) => {\n                const fallbackTarget = visualElement.getBaseTarget(key);\n                const motionValue = visualElement.getValue(key);\n                if (motionValue)\n                    motionValue.liveStyle = true;\n                // @ts-expect-error - @mattgperry to figure if we should do something here\n                fallbackAnimation[key] = fallbackTarget ?? null;\n            });\n            animations.push({ animation: fallbackAnimation });\n        }\n        let shouldAnimate = Boolean(animations.length);\n        if (isInitialRender &&\n            (props.initial === false || props.initial === props.animate) &&\n            !visualElement.manuallyAnimateOnMount) {\n            shouldAnimate = false;\n        }\n        isInitialRender = false;\n        wasReset = false;\n        return shouldAnimate ? animate(animations) : Promise.resolve();\n    }\n    /**\n     * Change whether a certain animation type is active.\n     */\n    function setActive(type, isActive) {\n        // If the active state hasn't changed, we can safely do nothing here\n        if (state[type].isActive === isActive)\n            return Promise.resolve();\n        // Propagate active change to children\n        visualElement.variantChildren?.forEach((child) => child.animationState?.setActive(type, isActive));\n        state[type].isActive = isActive;\n        const animations = animateChanges(type);\n        for (const key in state) {\n            state[key].protectedKeys = {};\n        }\n        return animations;\n    }\n    return {\n        animateChanges,\n        setActive,\n        setAnimateFunction,\n        getState: () => state,\n        reset: () => {\n            state = createState();\n            wasReset = true;\n        },\n    };\n}\nfunction checkVariantsDidChange(prev, next) {\n    if (typeof next === \"string\") {\n        return next !== prev;\n    }\n    else if (Array.isArray(next)) {\n        return !shallowCompare(next, prev);\n    }\n    return false;\n}\nfunction createTypeState(isActive = false) {\n    return {\n        isActive,\n        protectedKeys: {},\n        needsAnimating: {},\n        prevResolvedValues: {},\n    };\n}\nfunction createState() {\n    return {\n        animate: createTypeState(true),\n        whileInView: createTypeState(),\n        whileHover: createTypeState(),\n        whileTap: createTypeState(),\n        whileDrag: createTypeState(),\n        whileFocus: createTypeState(),\n        exit: createTypeState(),\n    };\n}\n\nexport { checkVariantsDidChange, createAnimationState };\n//# sourceMappingURL=animation-state.mjs.map\n","/**\n * Reset an axis to the provided origin box.\n *\n * This is a mutative operation.\n */\nfunction copyAxisInto(axis, originAxis) {\n    axis.min = originAxis.min;\n    axis.max = originAxis.max;\n}\n/**\n * Reset a box to the provided origin box.\n *\n * This is a mutative operation.\n */\nfunction copyBoxInto(box, originBox) {\n    copyAxisInto(box.x, originBox.x);\n    copyAxisInto(box.y, originBox.y);\n}\n/**\n * Reset a delta to the provided origin box.\n *\n * This is a mutative operation.\n */\nfunction copyAxisDeltaInto(delta, originDelta) {\n    delta.translate = originDelta.translate;\n    delta.scale = originDelta.scale;\n    delta.originPoint = originDelta.originPoint;\n    delta.origin = originDelta.origin;\n}\n\nexport { copyAxisDeltaInto, copyAxisInto, copyBoxInto };\n//# sourceMappingURL=copy.mjs.map\n","import { mixNumber } from '../../utils/mix/number.mjs';\n\nconst SCALE_PRECISION = 0.0001;\nconst SCALE_MIN = 1 - SCALE_PRECISION;\nconst SCALE_MAX = 1 + SCALE_PRECISION;\nconst TRANSLATE_PRECISION = 0.01;\nconst TRANSLATE_MIN = 0 - TRANSLATE_PRECISION;\nconst TRANSLATE_MAX = 0 + TRANSLATE_PRECISION;\nfunction calcLength(axis) {\n    return axis.max - axis.min;\n}\nfunction isNear(value, target, maxDistance) {\n    return Math.abs(value - target) <= maxDistance;\n}\nfunction calcAxisDelta(delta, source, target, origin = 0.5) {\n    delta.origin = origin;\n    delta.originPoint = mixNumber(source.min, source.max, delta.origin);\n    delta.scale = calcLength(target) / calcLength(source);\n    delta.translate =\n        mixNumber(target.min, target.max, delta.origin) - delta.originPoint;\n    if ((delta.scale >= SCALE_MIN && delta.scale <= SCALE_MAX) ||\n        isNaN(delta.scale)) {\n        delta.scale = 1.0;\n    }\n    if ((delta.translate >= TRANSLATE_MIN &&\n        delta.translate <= TRANSLATE_MAX) ||\n        isNaN(delta.translate)) {\n        delta.translate = 0.0;\n    }\n}\nfunction calcBoxDelta(delta, source, target, origin) {\n    calcAxisDelta(delta.x, source.x, target.x, origin ? origin.originX : undefined);\n    calcAxisDelta(delta.y, source.y, target.y, origin ? origin.originY : undefined);\n}\nfunction calcRelativeAxis(target, relative, parent, anchor = 0) {\n    const anchorPoint = anchor\n        ? mixNumber(parent.min, parent.max, anchor)\n        : parent.min;\n    target.min = anchorPoint + relative.min;\n    target.max = target.min + calcLength(relative);\n}\nfunction calcRelativeBox(target, relative, parent, anchor) {\n    calcRelativeAxis(target.x, relative.x, parent.x, anchor?.x);\n    calcRelativeAxis(target.y, relative.y, parent.y, anchor?.y);\n}\nfunction calcRelativeAxisPosition(target, layout, parent, anchor = 0) {\n    const anchorPoint = anchor\n        ? mixNumber(parent.min, parent.max, anchor)\n        : parent.min;\n    target.min = layout.min - anchorPoint;\n    target.max = target.min + calcLength(layout);\n}\nfunction calcRelativePosition(target, layout, parent, anchor) {\n    calcRelativeAxisPosition(target.x, layout.x, parent.x, anchor?.x);\n    calcRelativeAxisPosition(target.y, layout.y, parent.y, anchor?.y);\n}\n\nexport { calcAxisDelta, calcBoxDelta, calcLength, calcRelativeAxis, calcRelativeAxisPosition, calcRelativeBox, calcRelativePosition, isNear };\n//# sourceMappingURL=delta-calc.mjs.map\n","import { mixNumber } from '../../utils/mix/number.mjs';\nimport { percent } from '../../value/types/numbers/units.mjs';\nimport { scalePoint } from './delta-apply.mjs';\n\n/**\n * Remove a delta from a point. This is essentially the steps of applyPointDelta in reverse\n */\nfunction removePointDelta(point, translate, scale, originPoint, boxScale) {\n    point -= translate;\n    point = scalePoint(point, 1 / scale, originPoint);\n    if (boxScale !== undefined) {\n        point = scalePoint(point, 1 / boxScale, originPoint);\n    }\n    return point;\n}\n/**\n * Remove a delta from an axis. This is essentially the steps of applyAxisDelta in reverse\n */\nfunction removeAxisDelta(axis, translate = 0, scale = 1, origin = 0.5, boxScale, originAxis = axis, sourceAxis = axis) {\n    if (percent.test(translate)) {\n        translate = parseFloat(translate);\n        const relativeProgress = mixNumber(sourceAxis.min, sourceAxis.max, translate / 100);\n        translate = relativeProgress - sourceAxis.min;\n    }\n    if (typeof translate !== \"number\")\n        return;\n    let originPoint = mixNumber(originAxis.min, originAxis.max, origin);\n    if (axis === originAxis)\n        originPoint -= translate;\n    axis.min = removePointDelta(axis.min, translate, scale, originPoint, boxScale);\n    axis.max = removePointDelta(axis.max, translate, scale, originPoint, boxScale);\n}\n/**\n * Remove a transforms from an axis. This is essentially the steps of applyAxisTransforms in reverse\n * and acts as a bridge between motion values and removeAxisDelta\n */\nfunction removeAxisTransforms(axis, transforms, [key, scaleKey, originKey], origin, sourceAxis) {\n    removeAxisDelta(axis, transforms[key], transforms[scaleKey], transforms[originKey], transforms.scale, origin, sourceAxis);\n}\n/**\n * The names of the motion values we want to apply as translation, scale and origin.\n */\nconst xKeys = [\"x\", \"scaleX\", \"originX\"];\nconst yKeys = [\"y\", \"scaleY\", \"originY\"];\n/**\n * Remove a transforms from an box. This is essentially the steps of applyAxisBox in reverse\n * and acts as a bridge between motion values and removeAxisDelta\n */\nfunction removeBoxTransforms(box, transforms, originBox, sourceBox) {\n    removeAxisTransforms(box.x, transforms, xKeys, originBox ? originBox.x : undefined, sourceBox ? sourceBox.x : undefined);\n    removeAxisTransforms(box.y, transforms, yKeys, originBox ? originBox.y : undefined, sourceBox ? sourceBox.y : undefined);\n}\n\nexport { removeAxisDelta, removeAxisTransforms, removeBoxTransforms, removePointDelta };\n//# sourceMappingURL=delta-remove.mjs.map\n","import { calcLength } from './delta-calc.mjs';\n\nfunction isAxisDeltaZero(delta) {\n    return delta.translate === 0 && delta.scale === 1;\n}\nfunction isDeltaZero(delta) {\n    return isAxisDeltaZero(delta.x) && isAxisDeltaZero(delta.y);\n}\nfunction axisEquals(a, b) {\n    return a.min === b.min && a.max === b.max;\n}\nfunction boxEquals(a, b) {\n    return axisEquals(a.x, b.x) && axisEquals(a.y, b.y);\n}\nfunction axisEqualsRounded(a, b) {\n    return (Math.round(a.min) === Math.round(b.min) &&\n        Math.round(a.max) === Math.round(b.max));\n}\nfunction boxEqualsRounded(a, b) {\n    return axisEqualsRounded(a.x, b.x) && axisEqualsRounded(a.y, b.y);\n}\nfunction aspectRatio(box) {\n    return calcLength(box.x) / calcLength(box.y);\n}\nfunction axisDeltaEquals(a, b) {\n    return (a.translate === b.translate &&\n        a.scale === b.scale &&\n        a.originPoint === b.originPoint);\n}\n\nexport { aspectRatio, axisDeltaEquals, axisEquals, axisEqualsRounded, boxEquals, boxEqualsRounded, isDeltaZero };\n//# sourceMappingURL=utils.mjs.map\n","function eachAxis(callback) {\n    return [callback(\"x\"), callback(\"y\")];\n}\n\nexport { eachAxis };\n//# sourceMappingURL=each-axis.mjs.map\n","function buildProjectionTransform(delta, treeScale, latestTransform) {\n    let transform = \"\";\n    /**\n     * The translations we use to calculate are always relative to the viewport coordinate space.\n     * But when we apply scales, we also scale the coordinate space of an element and its children.\n     * For instance if we have a treeScale (the culmination of all parent scales) of 0.5 and we need\n     * to move an element 100 pixels, we actually need to move it 200 in within that scaled space.\n     */\n    const xTranslate = delta.x.translate / treeScale.x;\n    const yTranslate = delta.y.translate / treeScale.y;\n    const zTranslate = latestTransform?.z || 0;\n    if (xTranslate || yTranslate || zTranslate) {\n        transform = `translate3d(${xTranslate}px, ${yTranslate}px, ${zTranslate}px) `;\n    }\n    /**\n     * Apply scale correction for the tree transform.\n     * This will apply scale to the screen-orientated axes.\n     */\n    if (treeScale.x !== 1 || treeScale.y !== 1) {\n        transform += `scale(${1 / treeScale.x}, ${1 / treeScale.y}) `;\n    }\n    if (latestTransform) {\n        const { transformPerspective, rotate, rotateX, rotateY, skewX, skewY } = latestTransform;\n        if (transformPerspective)\n            transform = `perspective(${transformPerspective}px) ${transform}`;\n        if (rotate)\n            transform += `rotate(${rotate}deg) `;\n        if (rotateX)\n            transform += `rotateX(${rotateX}deg) `;\n        if (rotateY)\n            transform += `rotateY(${rotateY}deg) `;\n        if (skewX)\n            transform += `skewX(${skewX}deg) `;\n        if (skewY)\n            transform += `skewY(${skewY}deg) `;\n    }\n    /**\n     * Apply scale to match the size of the element to the size we want it.\n     * This will apply scale to the element-orientated axes.\n     */\n    const elementScaleX = delta.x.scale * treeScale.x;\n    const elementScaleY = delta.y.scale * treeScale.y;\n    if (elementScaleX !== 1 || elementScaleY !== 1) {\n        transform += `scale(${elementScaleX}, ${elementScaleY})`;\n    }\n    return transform || \"none\";\n}\n\nexport { buildProjectionTransform };\n//# sourceMappingURL=transform.mjs.map\n","import { mixNumber } from '../../utils/mix/number.mjs';\nimport { percent, px } from '../../value/types/numbers/units.mjs';\nimport { progress, circOut, noop } from 'motion-utils';\n\nconst borderLabels = [\n    \"borderTopLeftRadius\",\n    \"borderTopRightRadius\",\n    \"borderBottomLeftRadius\",\n    \"borderBottomRightRadius\",\n];\nconst numBorders = borderLabels.length;\nconst asNumber = (value) => typeof value === \"string\" ? parseFloat(value) : value;\nconst isPx = (value) => typeof value === \"number\" || px.test(value);\nfunction mixValues(target, follow, lead, progress, shouldCrossfadeOpacity, isOnlyMember) {\n    if (shouldCrossfadeOpacity) {\n        target.opacity = mixNumber(0, lead.opacity ?? 1, easeCrossfadeIn(progress));\n        target.opacityExit = mixNumber(follow.opacity ?? 1, 0, easeCrossfadeOut(progress));\n    }\n    else if (isOnlyMember) {\n        target.opacity = mixNumber(follow.opacity ?? 1, lead.opacity ?? 1, progress);\n    }\n    /**\n     * Mix border radius\n     */\n    for (let i = 0; i < numBorders; i++) {\n        const borderLabel = borderLabels[i];\n        let followRadius = getRadius(follow, borderLabel);\n        let leadRadius = getRadius(lead, borderLabel);\n        if (followRadius === undefined && leadRadius === undefined)\n            continue;\n        followRadius || (followRadius = 0);\n        leadRadius || (leadRadius = 0);\n        const canMix = followRadius === 0 ||\n            leadRadius === 0 ||\n            isPx(followRadius) === isPx(leadRadius);\n        if (canMix) {\n            target[borderLabel] = Math.max(mixNumber(asNumber(followRadius), asNumber(leadRadius), progress), 0);\n            if (percent.test(leadRadius) || percent.test(followRadius)) {\n                target[borderLabel] += \"%\";\n            }\n        }\n        else {\n            target[borderLabel] = leadRadius;\n        }\n    }\n    /**\n     * Mix rotation\n     */\n    if (follow.rotate || lead.rotate) {\n        target.rotate = mixNumber(follow.rotate || 0, lead.rotate || 0, progress);\n    }\n}\nfunction getRadius(values, radiusName) {\n    return values[radiusName] !== undefined\n        ? values[radiusName]\n        : values.borderRadius;\n}\nconst easeCrossfadeIn = /*@__PURE__*/ compress(0, 0.5, circOut);\nconst easeCrossfadeOut = /*@__PURE__*/ compress(0.5, 0.95, noop);\nfunction compress(min, max, easing) {\n    return (p) => {\n        // Could replace ifs with clamp\n        if (p < min)\n            return 0;\n        if (p > max)\n            return 1;\n        return easing(progress(min, max, p));\n    };\n}\n\nexport { mixValues };\n//# sourceMappingURL=mix-values.mjs.map\n","import { animateMotionValue } from '../interfaces/motion-value.mjs';\nimport { motionValue } from '../../value/index.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\n\nfunction animateSingleValue(value, keyframes, options) {\n    const motionValue$1 = isMotionValue(value) ? value : motionValue(value);\n    motionValue$1.start(animateMotionValue(\"\", motionValue$1, keyframes, options));\n    return motionValue$1.animation;\n}\n\nexport { animateSingleValue };\n//# sourceMappingURL=single-value.mjs.map\n","function addDomEvent(target, eventName, handler, options = { passive: true }) {\n    target.addEventListener(eventName, handler, options);\n    return () => target.removeEventListener(eventName, handler);\n}\n\nexport { addDomEvent };\n//# sourceMappingURL=add-dom-event.mjs.map\n","const compareByDepth = (a, b) => a.depth - b.depth;\n\nexport { compareByDepth };\n//# sourceMappingURL=compare-by-depth.mjs.map\n","import { addUniqueItem, removeItem } from 'motion-utils';\nimport { compareByDepth } from './compare-by-depth.mjs';\n\nclass FlatTree {\n    constructor() {\n        this.children = [];\n        this.isDirty = false;\n    }\n    add(child) {\n        addUniqueItem(this.children, child);\n        this.isDirty = true;\n    }\n    remove(child) {\n        removeItem(this.children, child);\n        this.isDirty = true;\n    }\n    forEach(callback) {\n        this.isDirty && this.children.sort(compareByDepth);\n        this.isDirty = false;\n        this.children.forEach(callback);\n    }\n}\n\nexport { FlatTree };\n//# sourceMappingURL=flat-tree.mjs.map\n","import { time } from '../frameloop/sync-time.mjs';\nimport { secondsToMilliseconds } from 'motion-utils';\nimport { frame, cancelFrame } from '../frameloop/frame.mjs';\n\n/**\n * Timeout defined in ms\n */\nfunction delay(callback, timeout) {\n    const start = time.now();\n    const checkElapsed = ({ timestamp }) => {\n        const elapsed = timestamp - start;\n        if (elapsed >= timeout) {\n            cancelFrame(checkElapsed);\n            callback(elapsed - timeout);\n        }\n    };\n    frame.setup(checkElapsed, true);\n    return () => cancelFrame(checkElapsed);\n}\nfunction delayInSeconds(callback, timeout) {\n    return delay(callback, secondsToMilliseconds(timeout));\n}\n\nexport { delay, delayInSeconds };\n//# sourceMappingURL=delay.mjs.map\n","import { isMotionValue } from './is-motion-value.mjs';\n\n/**\n * If the provided value is a MotionValue, this returns the actual value, otherwise just the value itself\n */\nfunction resolveMotionValue(value) {\n    return isMotionValue(value) ? value.get() : value;\n}\n\nexport { resolveMotionValue };\n//# sourceMappingURL=resolve-motion-value.mjs.map\n","import { addUniqueItem, removeItem } from 'motion-utils';\n\nclass NodeStack {\n    constructor() {\n        this.members = [];\n    }\n    add(node) {\n        addUniqueItem(this.members, node);\n        for (let i = this.members.length - 1; i >= 0; i--) {\n            const member = this.members[i];\n            if (member === node || member === this.lead || member === this.prevLead)\n                continue;\n            const inst = member.instance;\n            if ((!inst || inst.isConnected === false) && !member.snapshot) {\n                removeItem(this.members, member);\n                member.unmount();\n            }\n        }\n        node.scheduleRender();\n    }\n    remove(node) {\n        removeItem(this.members, node);\n        if (node === this.prevLead)\n            this.prevLead = undefined;\n        if (node === this.lead) {\n            const prevLead = this.members[this.members.length - 1];\n            if (prevLead)\n                this.promote(prevLead);\n        }\n    }\n    relegate(node) {\n        for (let i = this.members.indexOf(node) - 1; i >= 0; i--) {\n            const member = this.members[i];\n            if (member.isPresent !== false && member.instance?.isConnected !== false) {\n                this.promote(member);\n                return true;\n            }\n        }\n        return false;\n    }\n    promote(node, preserveFollowOpacity) {\n        const prevLead = this.lead;\n        if (node === prevLead)\n            return;\n        this.prevLead = prevLead;\n        this.lead = node;\n        node.show();\n        if (prevLead) {\n            prevLead.updateSnapshot();\n            node.scheduleRender();\n            const { layoutDependency: prevDep } = prevLead.options;\n            const { layoutDependency: nextDep } = node.options;\n            if (prevDep === undefined || prevDep !== nextDep) {\n                node.resumeFrom = prevLead;\n                if (preserveFollowOpacity)\n                    prevLead.preserveOpacity = true;\n                if (prevLead.snapshot) {\n                    node.snapshot = prevLead.snapshot;\n                    node.snapshot.latestValues =\n                        prevLead.animationValues || prevLead.latestValues;\n                }\n                if (node.root?.isUpdating)\n                    node.isLayoutDirty = true;\n            }\n            if (node.options.crossfade === false)\n                prevLead.hide();\n        }\n    }\n    exitAnimationComplete() {\n        this.members.forEach((member) => {\n            member.options.onExitComplete?.();\n            member.resumingFrom?.options.onExitComplete?.();\n        });\n    }\n    scheduleRender() {\n        this.members.forEach((member) => member.instance && member.scheduleRender(false));\n    }\n    removeLeadSnapshot() {\n        if (this.lead?.snapshot)\n            this.lead.snapshot = undefined;\n    }\n}\n\nexport { NodeStack };\n//# sourceMappingURL=stack.mjs.map\n","/**\n * This should only ever be modified on the client otherwise it'll\n * persist through server requests. If we need instanced states we\n * could lazy-init via root.\n */\nconst globalProjectionState = {\n    /**\n     * Global flag as to whether the tree has animated since the last time\n     * we resized the window\n     */\n    hasAnimatedSinceResize: true,\n    /**\n     * We set this to true once, on the first update. Any nodes added to the tree beyond that\n     * update will be given a `data-projection-id` attribute.\n     */\n    hasEverUpdated: false,\n};\n\nexport { globalProjectionState };\n//# sourceMappingURL=state.mjs.map\n","import { SubscriptionManager, clamp, noop } from 'motion-utils';\nimport { animateSingleValue } from '../../animation/animate/single-value.mjs';\nimport { getOptimisedAppearId } from '../../animation/optimized-appear/get-appear-id.mjs';\nimport { getValueTransition } from '../../animation/utils/get-value-transition.mjs';\nimport { microtask } from '../../frameloop/microtask.mjs';\nimport { time } from '../../frameloop/sync-time.mjs';\nimport { scaleCorrectors } from '../styles/scale-correction.mjs';\nimport { activeAnimations } from '../../stats/animation-count.mjs';\nimport { statsBuffer } from '../../stats/buffer.mjs';\nimport { delay } from '../../utils/delay.mjs';\nimport { isSVGElement } from '../../utils/is-svg-element.mjs';\nimport { isSVGSVGElement } from '../../utils/is-svg-svg-element.mjs';\nimport { mixNumber } from '../../utils/mix/number.mjs';\nimport { motionValue } from '../../value/index.mjs';\nimport { resolveMotionValue } from '../../value/utils/resolve-motion-value.mjs';\nimport { mixValues } from '../animation/mix-values.mjs';\nimport { copyBoxInto, copyAxisDeltaInto, copyAxisInto } from '../geometry/copy.mjs';\nimport { translateAxis, transformBox, applyBoxDelta, applyTreeDeltas } from '../geometry/delta-apply.mjs';\nimport { calcLength, calcRelativeBox, calcRelativePosition, calcBoxDelta, isNear } from '../geometry/delta-calc.mjs';\nimport { removeBoxTransforms } from '../geometry/delta-remove.mjs';\nimport { createBox, createDelta } from '../geometry/models.mjs';\nimport { boxEqualsRounded, isDeltaZero, axisDeltaEquals, boxEquals, aspectRatio } from '../geometry/utils.mjs';\nimport { NodeStack } from '../shared/stack.mjs';\nimport { buildProjectionTransform } from '../styles/transform.mjs';\nimport { eachAxis } from '../utils/each-axis.mjs';\nimport { FlatTree } from '../utils/flat-tree.mjs';\nimport { hasTransform, hasScale, has2DTranslate } from '../utils/has-transform.mjs';\nimport { globalProjectionState } from './state.mjs';\nimport { frame, cancelFrame, frameData, frameSteps } from '../../frameloop/frame.mjs';\n\nconst metrics = {\n    nodes: 0,\n    calculatedTargetDeltas: 0,\n    calculatedProjections: 0,\n};\nconst transformAxes = [\"\", \"X\", \"Y\", \"Z\"];\n/**\n * We use 1000 as the animation target as 0-1000 maps better to pixels than 0-1\n * which has a noticeable difference in spring animations\n */\nconst animationTarget = 1000;\nlet id = 0;\nfunction resetDistortingTransform(key, visualElement, values, sharedAnimationValues) {\n    const { latestValues } = visualElement;\n    // Record the distorting transform and then temporarily set it to 0\n    if (latestValues[key]) {\n        values[key] = latestValues[key];\n        visualElement.setStaticValue(key, 0);\n        if (sharedAnimationValues) {\n            sharedAnimationValues[key] = 0;\n        }\n    }\n}\nfunction cancelTreeOptimisedTransformAnimations(projectionNode) {\n    projectionNode.hasCheckedOptimisedAppear = true;\n    if (projectionNode.root === projectionNode)\n        return;\n    const { visualElement } = projectionNode.options;\n    if (!visualElement)\n        return;\n    const appearId = getOptimisedAppearId(visualElement);\n    if (window.MotionHasOptimisedAnimation(appearId, \"transform\")) {\n        const { layout, layoutId } = projectionNode.options;\n        window.MotionCancelOptimisedAnimation(appearId, \"transform\", frame, !(layout || layoutId));\n    }\n    const { parent } = projectionNode;\n    if (parent && !parent.hasCheckedOptimisedAppear) {\n        cancelTreeOptimisedTransformAnimations(parent);\n    }\n}\nfunction createProjectionNode({ attachResizeListener, defaultParent, measureScroll, checkIsScrollRoot, resetTransform, }) {\n    return class ProjectionNode {\n        constructor(latestValues = {}, parent = defaultParent?.()) {\n            /**\n             * A unique ID generated for every projection node.\n             */\n            this.id = id++;\n            /**\n             * An id that represents a unique session instigated by startUpdate.\n             */\n            this.animationId = 0;\n            this.animationCommitId = 0;\n            /**\n             * A Set containing all this component's children. This is used to iterate\n             * through the children.\n             *\n             * TODO: This could be faster to iterate as a flat array stored on the root node.\n             */\n            this.children = new Set();\n            /**\n             * Options for the node. We use this to configure what kind of layout animations\n             * we should perform (if any).\n             */\n            this.options = {};\n            /**\n             * We use this to detect when its safe to shut down part of a projection tree.\n             * We have to keep projecting children for scale correction and relative projection\n             * until all their parents stop performing layout animations.\n             */\n            this.isTreeAnimating = false;\n            this.isAnimationBlocked = false;\n            /**\n             * Flag to true if we think this layout has been changed. We can't always know this,\n             * currently we set it to true every time a component renders, or if it has a layoutDependency\n             * if that has changed between renders. Additionally, components can be grouped by LayoutGroup\n             * and if one node is dirtied, they all are.\n             */\n            this.isLayoutDirty = false;\n            /**\n             * Flag to true if we think the projection calculations for this node needs\n             * recalculating as a result of an updated transform or layout animation.\n             */\n            this.isProjectionDirty = false;\n            /**\n             * Flag to true if the layout *or* transform has changed. This then gets propagated\n             * throughout the projection tree, forcing any element below to recalculate on the next frame.\n             */\n            this.isSharedProjectionDirty = false;\n            /**\n             * Flag transform dirty. This gets propagated throughout the whole tree but is only\n             * respected by shared nodes.\n             */\n            this.isTransformDirty = false;\n            /**\n             * Block layout updates for instant layout transitions throughout the tree.\n             */\n            this.updateManuallyBlocked = false;\n            this.updateBlockedByResize = false;\n            /**\n             * Set to true between the start of the first `willUpdate` call and the end of the `didUpdate`\n             * call.\n             */\n            this.isUpdating = false;\n            /**\n             * If this is an SVG element we currently disable projection transforms\n             */\n            this.isSVG = false;\n            /**\n             * Flag to true (during promotion) if a node doing an instant layout transition needs to reset\n             * its projection styles.\n             */\n            this.needsReset = false;\n            /**\n             * Flags whether this node should have its transform reset prior to measuring.\n             */\n            this.shouldResetTransform = false;\n            /**\n             * Store whether this node has been checked for optimised appear animations. As\n             * effects fire bottom-up, and we want to look up the tree for appear animations,\n             * this makes sure we only check each path once, stopping at nodes that\n             * have already been checked.\n             */\n            this.hasCheckedOptimisedAppear = false;\n            /**\n             * An object representing the calculated contextual/accumulated/tree scale.\n             * This will be used to scale calculcated projection transforms, as these are\n             * calculated in screen-space but need to be scaled for elements to layoutly\n             * make it to their calculated destinations.\n             *\n             * TODO: Lazy-init\n             */\n            this.treeScale = { x: 1, y: 1 };\n            /**\n             *\n             */\n            this.eventHandlers = new Map();\n            this.hasTreeAnimated = false;\n            this.layoutVersion = 0;\n            // Note: Currently only running on root node\n            this.updateScheduled = false;\n            this.scheduleUpdate = () => this.update();\n            this.projectionUpdateScheduled = false;\n            this.checkUpdateFailed = () => {\n                if (this.isUpdating) {\n                    this.isUpdating = false;\n                    this.clearAllSnapshots();\n                }\n            };\n            /**\n             * This is a multi-step process as shared nodes might be of different depths. Nodes\n             * are sorted by depth order, so we need to resolve the entire tree before moving to\n             * the next step.\n             */\n            this.updateProjection = () => {\n                this.projectionUpdateScheduled = false;\n                /**\n                 * Reset debug counts. Manually resetting rather than creating a new\n                 * object each frame.\n                 */\n                if (statsBuffer.value) {\n                    metrics.nodes =\n                        metrics.calculatedTargetDeltas =\n                            metrics.calculatedProjections =\n                                0;\n                }\n                this.nodes.forEach(propagateDirtyNodes);\n                this.nodes.forEach(resolveTargetDelta);\n                this.nodes.forEach(calcProjection);\n                this.nodes.forEach(cleanDirtyNodes);\n                if (statsBuffer.addProjectionMetrics) {\n                    statsBuffer.addProjectionMetrics(metrics);\n                }\n            };\n            /**\n             * Frame calculations\n             */\n            this.resolvedRelativeTargetAt = 0.0;\n            this.linkedParentVersion = 0;\n            this.hasProjected = false;\n            this.isVisible = true;\n            this.animationProgress = 0;\n            /**\n             * Shared layout\n             */\n            // TODO Only running on root node\n            this.sharedNodes = new Map();\n            this.latestValues = latestValues;\n            this.root = parent ? parent.root || parent : this;\n            this.path = parent ? [...parent.path, parent] : [];\n            this.parent = parent;\n            this.depth = parent ? parent.depth + 1 : 0;\n            for (let i = 0; i < this.path.length; i++) {\n                this.path[i].shouldResetTransform = true;\n            }\n            if (this.root === this)\n                this.nodes = new FlatTree();\n        }\n        addEventListener(name, handler) {\n            if (!this.eventHandlers.has(name)) {\n                this.eventHandlers.set(name, new SubscriptionManager());\n            }\n            return this.eventHandlers.get(name).add(handler);\n        }\n        notifyListeners(name, ...args) {\n            const subscriptionManager = this.eventHandlers.get(name);\n            subscriptionManager && subscriptionManager.notify(...args);\n        }\n        hasListeners(name) {\n            return this.eventHandlers.has(name);\n        }\n        /**\n         * Lifecycles\n         */\n        mount(instance) {\n            if (this.instance)\n                return;\n            this.isSVG = isSVGElement(instance) && !isSVGSVGElement(instance);\n            this.instance = instance;\n            const { layoutId, layout, visualElement } = this.options;\n            if (visualElement && !visualElement.current) {\n                visualElement.mount(instance);\n            }\n            this.root.nodes.add(this);\n            this.parent && this.parent.children.add(this);\n            if (this.root.hasTreeAnimated && (layout || layoutId)) {\n                this.isLayoutDirty = true;\n            }\n            if (attachResizeListener) {\n                let cancelDelay;\n                let innerWidth = 0;\n                const resizeUnblockUpdate = () => (this.root.updateBlockedByResize = false);\n                // Set initial innerWidth in a frame.read callback to batch the read\n                frame.read(() => {\n                    innerWidth = window.innerWidth;\n                });\n                attachResizeListener(instance, () => {\n                    const newInnerWidth = window.innerWidth;\n                    if (newInnerWidth === innerWidth)\n                        return;\n                    innerWidth = newInnerWidth;\n                    this.root.updateBlockedByResize = true;\n                    cancelDelay && cancelDelay();\n                    cancelDelay = delay(resizeUnblockUpdate, 250);\n                    if (globalProjectionState.hasAnimatedSinceResize) {\n                        globalProjectionState.hasAnimatedSinceResize = false;\n                        this.nodes.forEach(finishAnimation);\n                    }\n                });\n            }\n            if (layoutId) {\n                this.root.registerSharedNode(layoutId, this);\n            }\n            // Only register the handler if it requires layout animation\n            if (this.options.animate !== false &&\n                visualElement &&\n                (layoutId || layout)) {\n                this.addEventListener(\"didUpdate\", ({ delta, hasLayoutChanged, hasRelativeLayoutChanged, layout: newLayout, }) => {\n                    if (this.isTreeAnimationBlocked()) {\n                        this.target = undefined;\n                        this.relativeTarget = undefined;\n                        return;\n                    }\n                    // TODO: Check here if an animation exists\n                    const layoutTransition = this.options.transition ||\n                        visualElement.getDefaultTransition() ||\n                        defaultLayoutTransition;\n                    const { onLayoutAnimationStart, onLayoutAnimationComplete, } = visualElement.getProps();\n                    /**\n                     * The target layout of the element might stay the same,\n                     * but its position relative to its parent has changed.\n                     */\n                    const hasTargetChanged = !this.targetLayout ||\n                        !boxEqualsRounded(this.targetLayout, newLayout);\n                    /*\n                     * Note: Disabled to fix relative animations always triggering new\n                     * layout animations. If this causes further issues, we can try\n                     * a different approach to detecting relative target changes.\n                     */\n                    // || hasRelativeLayoutChanged\n                    /**\n                     * If the layout hasn't seemed to have changed, it might be that the\n                     * element is visually in the same place in the document but its position\n                     * relative to its parent has indeed changed. So here we check for that.\n                     */\n                    const hasOnlyRelativeTargetChanged = !hasLayoutChanged && hasRelativeLayoutChanged;\n                    if (this.options.layoutRoot ||\n                        this.resumeFrom ||\n                        hasOnlyRelativeTargetChanged ||\n                        (hasLayoutChanged &&\n                            (hasTargetChanged || !this.currentAnimation))) {\n                        if (this.resumeFrom) {\n                            this.resumingFrom = this.resumeFrom;\n                            this.resumingFrom.resumingFrom = undefined;\n                        }\n                        const animationOptions = {\n                            ...getValueTransition(layoutTransition, \"layout\"),\n                            onPlay: onLayoutAnimationStart,\n                            onComplete: onLayoutAnimationComplete,\n                        };\n                        if (visualElement.shouldReduceMotion ||\n                            this.options.layoutRoot) {\n                            animationOptions.delay = 0;\n                            animationOptions.type = false;\n                        }\n                        this.startAnimation(animationOptions);\n                        /**\n                         * Set animation origin after starting animation to avoid layout jump\n                         * caused by stopping previous layout animation\n                         */\n                        this.setAnimationOrigin(delta, hasOnlyRelativeTargetChanged);\n                    }\n                    else {\n                        /**\n                         * If the layout hasn't changed and we have an animation that hasn't started yet,\n                         * finish it immediately. Otherwise it will be animating from a location\n                         * that was probably never committed to screen and look like a jumpy box.\n                         */\n                        if (!hasLayoutChanged) {\n                            finishAnimation(this);\n                        }\n                        if (this.isLead() && this.options.onExitComplete) {\n                            this.options.onExitComplete();\n                        }\n                    }\n                    this.targetLayout = newLayout;\n                });\n            }\n        }\n        unmount() {\n            this.options.layoutId && this.willUpdate();\n            this.root.nodes.remove(this);\n            const stack = this.getStack();\n            stack && stack.remove(this);\n            this.parent && this.parent.children.delete(this);\n            this.instance = undefined;\n            this.eventHandlers.clear();\n            cancelFrame(this.updateProjection);\n        }\n        // only on the root\n        blockUpdate() {\n            this.updateManuallyBlocked = true;\n        }\n        unblockUpdate() {\n            this.updateManuallyBlocked = false;\n        }\n        isUpdateBlocked() {\n            return this.updateManuallyBlocked || this.updateBlockedByResize;\n        }\n        isTreeAnimationBlocked() {\n            return (this.isAnimationBlocked ||\n                (this.parent && this.parent.isTreeAnimationBlocked()) ||\n                false);\n        }\n        // Note: currently only running on root node\n        startUpdate() {\n            if (this.isUpdateBlocked())\n                return;\n            this.isUpdating = true;\n            this.nodes && this.nodes.forEach(resetSkewAndRotation);\n            this.animationId++;\n        }\n        getTransformTemplate() {\n            const { visualElement } = this.options;\n            return visualElement && visualElement.getProps().transformTemplate;\n        }\n        willUpdate(shouldNotifyListeners = true) {\n            this.root.hasTreeAnimated = true;\n            if (this.root.isUpdateBlocked()) {\n                this.options.onExitComplete && this.options.onExitComplete();\n                return;\n            }\n            /**\n             * If we're running optimised appear animations then these must be\n             * cancelled before measuring the DOM. This is so we can measure\n             * the true layout of the element rather than the WAAPI animation\n             * which will be unaffected by the resetSkewAndRotate step.\n             *\n             * Note: This is a DOM write. Worst case scenario is this is sandwiched\n             * between other snapshot reads which will cause unnecessary style recalculations.\n             * This has to happen here though, as we don't yet know which nodes will need\n             * snapshots in startUpdate(), but we only want to cancel optimised animations\n             * if a layout animation measurement is actually going to be affected by them.\n             */\n            if (window.MotionCancelOptimisedAnimation &&\n                !this.hasCheckedOptimisedAppear) {\n                cancelTreeOptimisedTransformAnimations(this);\n            }\n            !this.root.isUpdating && this.root.startUpdate();\n            if (this.isLayoutDirty)\n                return;\n            this.isLayoutDirty = true;\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i];\n                node.shouldResetTransform = true;\n                /**\n                 * Percentage translates resolve against layoutBox dimensions,\n                 * so ancestors with them must be re-measured after transform reset.\n                 */\n                if (typeof node.latestValues.x === \"string\" ||\n                    typeof node.latestValues.y === \"string\") {\n                    node.isLayoutDirty = true;\n                }\n                node.updateScroll(\"snapshot\");\n                if (node.options.layoutRoot) {\n                    node.willUpdate(false);\n                }\n            }\n            const { layoutId, layout } = this.options;\n            if (layoutId === undefined && !layout)\n                return;\n            const transformTemplate = this.getTransformTemplate();\n            this.prevTransformTemplateValue = transformTemplate\n                ? transformTemplate(this.latestValues, \"\")\n                : undefined;\n            this.updateSnapshot();\n            shouldNotifyListeners && this.notifyListeners(\"willUpdate\");\n        }\n        update() {\n            this.updateScheduled = false;\n            const updateWasBlocked = this.isUpdateBlocked();\n            // When doing an instant transition, we skip the layout update,\n            // but should still clean up the measurements so that the next\n            // snapshot could be taken correctly.\n            if (updateWasBlocked) {\n                const wasBlockedByResize = this.updateBlockedByResize;\n                this.unblockUpdate();\n                this.updateBlockedByResize = false;\n                this.clearAllSnapshots();\n                /**\n                 * When blocked by resize, still measure layouts so\n                 * callbacks like onLayoutMeasure fire (e.g. Reorder).\n                 * Skip notifyLayoutUpdate to prevent animations.\n                 */\n                if (wasBlockedByResize) {\n                    this.nodes.forEach(forceLayoutMeasure);\n                }\n                this.nodes.forEach(clearMeasurements);\n                return;\n            }\n            /**\n             * If this is a repeat of didUpdate then ignore the animation.\n             */\n            if (this.animationId <= this.animationCommitId) {\n                this.nodes.forEach(clearIsLayoutDirty);\n                return;\n            }\n            this.animationCommitId = this.animationId;\n            if (!this.isUpdating) {\n                this.nodes.forEach(clearIsLayoutDirty);\n            }\n            else {\n                this.isUpdating = false;\n                /**\n                 * Ensure animation-blocked nodes (e.g. during drag)\n                 * get measured even when memoized (willUpdate skipped).\n                 */\n                this.nodes.forEach(ensureDraggedNodesSnapshotted);\n                /**\n                 * Write\n                 */\n                this.nodes.forEach(resetTransformStyle);\n                /**\n                 * Read ==================\n                 */\n                // Update layout measurements of updated children\n                this.nodes.forEach(updateLayout);\n                /**\n                 * Write\n                 */\n                // Notify listeners that the layout is updated\n                this.nodes.forEach(notifyLayoutUpdate);\n            }\n            this.clearAllSnapshots();\n            /**\n             * Manually flush any pending updates. Ideally\n             * we could leave this to the following requestAnimationFrame but this seems\n             * to leave a flash of incorrectly styled content.\n             */\n            const now = time.now();\n            frameData.delta = clamp(0, 1000 / 60, now - frameData.timestamp);\n            frameData.timestamp = now;\n            frameData.isProcessing = true;\n            frameSteps.update.process(frameData);\n            frameSteps.preRender.process(frameData);\n            frameSteps.render.process(frameData);\n            frameData.isProcessing = false;\n        }\n        didUpdate() {\n            if (!this.updateScheduled) {\n                this.updateScheduled = true;\n                microtask.read(this.scheduleUpdate);\n            }\n        }\n        clearAllSnapshots() {\n            this.nodes.forEach(clearSnapshot);\n            this.sharedNodes.forEach(removeLeadSnapshots);\n        }\n        scheduleUpdateProjection() {\n            if (!this.projectionUpdateScheduled) {\n                this.projectionUpdateScheduled = true;\n                frame.preRender(this.updateProjection, false, true);\n            }\n        }\n        scheduleCheckAfterUnmount() {\n            /**\n             * If the unmounting node is in a layoutGroup and did trigger a willUpdate,\n             * we manually call didUpdate to give a chance to the siblings to animate.\n             * Otherwise, cleanup all snapshots to prevents future nodes from reusing them.\n             */\n            frame.postRender(() => {\n                if (this.isLayoutDirty) {\n                    this.root.didUpdate();\n                }\n                else {\n                    this.root.checkUpdateFailed();\n                }\n            });\n        }\n        /**\n         * Update measurements\n         */\n        updateSnapshot() {\n            if (this.snapshot || !this.instance)\n                return;\n            this.snapshot = this.measure();\n            if (this.snapshot &&\n                !calcLength(this.snapshot.measuredBox.x) &&\n                !calcLength(this.snapshot.measuredBox.y)) {\n                this.snapshot = undefined;\n            }\n        }\n        updateLayout() {\n            if (!this.instance)\n                return;\n            this.updateScroll();\n            if (!(this.options.alwaysMeasureLayout && this.isLead()) &&\n                !this.isLayoutDirty) {\n                return;\n            }\n            /**\n             * When a node is mounted, it simply resumes from the prevLead's\n             * snapshot instead of taking a new one, but the ancestors scroll\n             * might have updated while the prevLead is unmounted. We need to\n             * update the scroll again to make sure the layout we measure is\n             * up to date.\n             */\n            if (this.resumeFrom && !this.resumeFrom.instance) {\n                for (let i = 0; i < this.path.length; i++) {\n                    const node = this.path[i];\n                    node.updateScroll();\n                }\n            }\n            const prevLayout = this.layout;\n            this.layout = this.measure(false);\n            this.layoutVersion++;\n            if (!this.layoutCorrected)\n                this.layoutCorrected = createBox();\n            this.isLayoutDirty = false;\n            this.projectionDelta = undefined;\n            this.notifyListeners(\"measure\", this.layout.layoutBox);\n            const { visualElement } = this.options;\n            visualElement &&\n                visualElement.notify(\"LayoutMeasure\", this.layout.layoutBox, prevLayout ? prevLayout.layoutBox : undefined);\n        }\n        updateScroll(phase = \"measure\") {\n            let needsMeasurement = Boolean(this.options.layoutScroll && this.instance);\n            if (this.scroll &&\n                this.scroll.animationId === this.root.animationId &&\n                this.scroll.phase === phase) {\n                needsMeasurement = false;\n            }\n            if (needsMeasurement && this.instance) {\n                const isRoot = checkIsScrollRoot(this.instance);\n                this.scroll = {\n                    animationId: this.root.animationId,\n                    phase,\n                    isRoot,\n                    offset: measureScroll(this.instance),\n                    wasRoot: this.scroll ? this.scroll.isRoot : isRoot,\n                };\n            }\n        }\n        resetTransform() {\n            if (!resetTransform)\n                return;\n            const isResetRequested = this.isLayoutDirty ||\n                this.shouldResetTransform ||\n                this.options.alwaysMeasureLayout;\n            const hasProjection = this.projectionDelta && !isDeltaZero(this.projectionDelta);\n            const transformTemplate = this.getTransformTemplate();\n            const transformTemplateValue = transformTemplate\n                ? transformTemplate(this.latestValues, \"\")\n                : undefined;\n            const transformTemplateHasChanged = transformTemplateValue !== this.prevTransformTemplateValue;\n            if (isResetRequested &&\n                this.instance &&\n                (hasProjection ||\n                    hasTransform(this.latestValues) ||\n                    transformTemplateHasChanged)) {\n                resetTransform(this.instance, transformTemplateValue);\n                this.shouldResetTransform = false;\n                this.scheduleRender();\n            }\n        }\n        measure(removeTransform = true) {\n            const pageBox = this.measurePageBox();\n            let layoutBox = this.removeElementScroll(pageBox);\n            /**\n             * Measurements taken during the pre-render stage\n             * still have transforms applied so we remove them\n             * via calculation.\n             */\n            if (removeTransform) {\n                layoutBox = this.removeTransform(layoutBox);\n            }\n            roundBox(layoutBox);\n            return {\n                animationId: this.root.animationId,\n                measuredBox: pageBox,\n                layoutBox,\n                latestValues: {},\n                source: this.id,\n            };\n        }\n        measurePageBox() {\n            const { visualElement } = this.options;\n            if (!visualElement)\n                return createBox();\n            const box = visualElement.measureViewportBox();\n            const wasInScrollRoot = this.scroll?.wasRoot || this.path.some(checkNodeWasScrollRoot);\n            if (!wasInScrollRoot) {\n                // Remove viewport scroll to give page-relative coordinates\n                const { scroll } = this.root;\n                if (scroll) {\n                    translateAxis(box.x, scroll.offset.x);\n                    translateAxis(box.y, scroll.offset.y);\n                }\n            }\n            return box;\n        }\n        removeElementScroll(box) {\n            const boxWithoutScroll = createBox();\n            copyBoxInto(boxWithoutScroll, box);\n            if (this.scroll?.wasRoot) {\n                return boxWithoutScroll;\n            }\n            /**\n             * Performance TODO: Keep a cumulative scroll offset down the tree\n             * rather than loop back up the path.\n             */\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i];\n                const { scroll, options } = node;\n                if (node !== this.root && scroll && options.layoutScroll) {\n                    /**\n                     * If this is a new scroll root, we want to remove all previous scrolls\n                     * from the viewport box.\n                     */\n                    if (scroll.wasRoot) {\n                        copyBoxInto(boxWithoutScroll, box);\n                    }\n                    translateAxis(boxWithoutScroll.x, scroll.offset.x);\n                    translateAxis(boxWithoutScroll.y, scroll.offset.y);\n                }\n            }\n            return boxWithoutScroll;\n        }\n        applyTransform(box, transformOnly = false, output) {\n            const withTransforms = output || createBox();\n            copyBoxInto(withTransforms, box);\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i];\n                if (!transformOnly &&\n                    node.options.layoutScroll &&\n                    node.scroll &&\n                    node !== node.root) {\n                    translateAxis(withTransforms.x, -node.scroll.offset.x);\n                    translateAxis(withTransforms.y, -node.scroll.offset.y);\n                }\n                if (!hasTransform(node.latestValues))\n                    continue;\n                transformBox(withTransforms, node.latestValues, node.layout?.layoutBox);\n            }\n            if (hasTransform(this.latestValues)) {\n                transformBox(withTransforms, this.latestValues, this.layout?.layoutBox);\n            }\n            return withTransforms;\n        }\n        removeTransform(box) {\n            const boxWithoutTransform = createBox();\n            copyBoxInto(boxWithoutTransform, box);\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i];\n                if (!hasTransform(node.latestValues))\n                    continue;\n                let sourceBox;\n                if (node.instance) {\n                    hasScale(node.latestValues) && node.updateSnapshot();\n                    sourceBox = createBox();\n                    copyBoxInto(sourceBox, node.measurePageBox());\n                }\n                removeBoxTransforms(boxWithoutTransform, node.latestValues, node.snapshot?.layoutBox, sourceBox);\n            }\n            if (hasTransform(this.latestValues)) {\n                removeBoxTransforms(boxWithoutTransform, this.latestValues);\n            }\n            return boxWithoutTransform;\n        }\n        setTargetDelta(delta) {\n            this.targetDelta = delta;\n            this.root.scheduleUpdateProjection();\n            this.isProjectionDirty = true;\n        }\n        setOptions(options) {\n            this.options = {\n                ...this.options,\n                ...options,\n                crossfade: options.crossfade !== undefined ? options.crossfade : true,\n            };\n        }\n        clearMeasurements() {\n            this.scroll = undefined;\n            this.layout = undefined;\n            this.snapshot = undefined;\n            this.prevTransformTemplateValue = undefined;\n            this.targetDelta = undefined;\n            this.target = undefined;\n            this.isLayoutDirty = false;\n        }\n        forceRelativeParentToResolveTarget() {\n            if (!this.relativeParent)\n                return;\n            /**\n             * If the parent target isn't up-to-date, force it to update.\n             * This is an unfortunate de-optimisation as it means any updating relative\n             * projection will cause all the relative parents to recalculate back\n             * up the tree.\n             */\n            if (this.relativeParent.resolvedRelativeTargetAt !==\n                frameData.timestamp) {\n                this.relativeParent.resolveTargetDelta(true);\n            }\n        }\n        resolveTargetDelta(forceRecalculation = false) {\n            /**\n             * Once the dirty status of nodes has been spread through the tree, we also\n             * need to check if we have a shared node of a different depth that has itself\n             * been dirtied.\n             */\n            const lead = this.getLead();\n            this.isProjectionDirty || (this.isProjectionDirty = lead.isProjectionDirty);\n            this.isTransformDirty || (this.isTransformDirty = lead.isTransformDirty);\n            this.isSharedProjectionDirty || (this.isSharedProjectionDirty = lead.isSharedProjectionDirty);\n            const isShared = Boolean(this.resumingFrom) || this !== lead;\n            /**\n             * We don't use transform for this step of processing so we don't\n             * need to check whether any nodes have changed transform.\n             */\n            const canSkip = !(forceRecalculation ||\n                (isShared && this.isSharedProjectionDirty) ||\n                this.isProjectionDirty ||\n                this.parent?.isProjectionDirty ||\n                this.attemptToResolveRelativeTarget ||\n                this.root.updateBlockedByResize);\n            if (canSkip)\n                return;\n            const { layout, layoutId } = this.options;\n            /**\n             * If we have no layout, we can't perform projection, so early return\n             */\n            if (!this.layout || !(layout || layoutId))\n                return;\n            this.resolvedRelativeTargetAt = frameData.timestamp;\n            const relativeParent = this.getClosestProjectingParent();\n            if (relativeParent &&\n                this.linkedParentVersion !== relativeParent.layoutVersion &&\n                !relativeParent.options.layoutRoot) {\n                this.removeRelativeTarget();\n            }\n            /**\n             * If we don't have a targetDelta but do have a layout, we can attempt to resolve\n             * a relativeParent. This will allow a component to perform scale correction\n             * even if no animation has started.\n             */\n            if (!this.targetDelta && !this.relativeTarget) {\n                if (this.options.layoutAnchor !== false &&\n                    relativeParent &&\n                    relativeParent.layout) {\n                    this.createRelativeTarget(relativeParent, this.layout.layoutBox, relativeParent.layout.layoutBox);\n                }\n                else {\n                    this.removeRelativeTarget();\n                }\n            }\n            /**\n             * If we have no relative target or no target delta our target isn't valid\n             * for this frame.\n             */\n            if (!this.relativeTarget && !this.targetDelta)\n                return;\n            /**\n             * Lazy-init target data structure\n             */\n            if (!this.target) {\n                this.target = createBox();\n                this.targetWithTransforms = createBox();\n            }\n            /**\n             * If we've got a relative box for this component, resolve it into a target relative to the parent.\n             */\n            if (this.relativeTarget &&\n                this.relativeTargetOrigin &&\n                this.relativeParent &&\n                this.relativeParent.target) {\n                this.forceRelativeParentToResolveTarget();\n                calcRelativeBox(this.target, this.relativeTarget, this.relativeParent.target, this.options.layoutAnchor || undefined);\n                /**\n                 * If we've only got a targetDelta, resolve it into a target\n                 */\n            }\n            else if (this.targetDelta) {\n                if (Boolean(this.resumingFrom)) {\n                    this.applyTransform(this.layout.layoutBox, false, this.target);\n                }\n                else {\n                    copyBoxInto(this.target, this.layout.layoutBox);\n                }\n                applyBoxDelta(this.target, this.targetDelta);\n            }\n            else {\n                /**\n                 * If no target, use own layout as target\n                 */\n                copyBoxInto(this.target, this.layout.layoutBox);\n            }\n            /**\n             * If we've been told to attempt to resolve a relative target, do so.\n             */\n            if (this.attemptToResolveRelativeTarget) {\n                this.attemptToResolveRelativeTarget = false;\n                if (this.options.layoutAnchor !== false &&\n                    relativeParent &&\n                    Boolean(relativeParent.resumingFrom) ===\n                        Boolean(this.resumingFrom) &&\n                    !relativeParent.options.layoutScroll &&\n                    relativeParent.target &&\n                    this.animationProgress !== 1) {\n                    this.createRelativeTarget(relativeParent, this.target, relativeParent.target);\n                }\n                else {\n                    this.relativeParent = this.relativeTarget = undefined;\n                }\n            }\n            /**\n             * Increase debug counter for resolved target deltas\n             */\n            if (statsBuffer.value) {\n                metrics.calculatedTargetDeltas++;\n            }\n        }\n        getClosestProjectingParent() {\n            if (!this.parent ||\n                hasScale(this.parent.latestValues) ||\n                has2DTranslate(this.parent.latestValues)) {\n                return undefined;\n            }\n            if (this.parent.isProjecting()) {\n                return this.parent;\n            }\n            else {\n                return this.parent.getClosestProjectingParent();\n            }\n        }\n        isProjecting() {\n            return Boolean((this.relativeTarget ||\n                this.targetDelta ||\n                this.options.layoutRoot) &&\n                this.layout);\n        }\n        createRelativeTarget(relativeParent, layout, parentLayout) {\n            this.relativeParent = relativeParent;\n            this.linkedParentVersion = relativeParent.layoutVersion;\n            this.forceRelativeParentToResolveTarget();\n            this.relativeTarget = createBox();\n            this.relativeTargetOrigin = createBox();\n            calcRelativePosition(this.relativeTargetOrigin, layout, parentLayout, this.options.layoutAnchor || undefined);\n            copyBoxInto(this.relativeTarget, this.relativeTargetOrigin);\n        }\n        removeRelativeTarget() {\n            this.relativeParent = this.relativeTarget = undefined;\n        }\n        calcProjection() {\n            const lead = this.getLead();\n            const isShared = Boolean(this.resumingFrom) || this !== lead;\n            let canSkip = true;\n            /**\n             * If this is a normal layout animation and neither this node nor its nearest projecting\n             * is dirty then we can't skip.\n             */\n            if (this.isProjectionDirty || this.parent?.isProjectionDirty) {\n                canSkip = false;\n            }\n            /**\n             * If this is a shared layout animation and this node's shared projection is dirty then\n             * we can't skip.\n             */\n            if (isShared &&\n                (this.isSharedProjectionDirty || this.isTransformDirty)) {\n                canSkip = false;\n            }\n            /**\n             * If we have resolved the target this frame we must recalculate the\n             * projection to ensure it visually represents the internal calculations.\n             */\n            if (this.resolvedRelativeTargetAt === frameData.timestamp) {\n                canSkip = false;\n            }\n            if (canSkip)\n                return;\n            const { layout, layoutId } = this.options;\n            /**\n             * If this section of the tree isn't animating we can\n             * delete our target sources for the following frame.\n             */\n            this.isTreeAnimating = Boolean((this.parent && this.parent.isTreeAnimating) ||\n                this.currentAnimation ||\n                this.pendingAnimation);\n            if (!this.isTreeAnimating) {\n                this.targetDelta = this.relativeTarget = undefined;\n            }\n            if (!this.layout || !(layout || layoutId))\n                return;\n            /**\n             * Reset the corrected box with the latest values from box, as we're then going\n             * to perform mutative operations on it.\n             */\n            copyBoxInto(this.layoutCorrected, this.layout.layoutBox);\n            /**\n             * Record previous tree scales before updating.\n             */\n            const prevTreeScaleX = this.treeScale.x;\n            const prevTreeScaleY = this.treeScale.y;\n            /**\n             * Apply all the parent deltas to this box to produce the corrected box. This\n             * is the layout box, as it will appear on screen as a result of the transforms of its parents.\n             */\n            applyTreeDeltas(this.layoutCorrected, this.treeScale, this.path, isShared);\n            /**\n             * If this layer needs to perform scale correction but doesn't have a target,\n             * use the layout as the target.\n             */\n            if (lead.layout &&\n                !lead.target &&\n                (this.treeScale.x !== 1 || this.treeScale.y !== 1)) {\n                lead.target = lead.layout.layoutBox;\n                lead.targetWithTransforms = createBox();\n            }\n            const { target } = lead;\n            if (!target) {\n                /**\n                 * If we don't have a target to project into, but we were previously\n                 * projecting, we want to remove the stored transform and schedule\n                 * a render to ensure the elements reflect the removed transform.\n                 */\n                if (this.prevProjectionDelta) {\n                    this.createProjectionDeltas();\n                    this.scheduleRender();\n                }\n                return;\n            }\n            if (!this.projectionDelta || !this.prevProjectionDelta) {\n                this.createProjectionDeltas();\n            }\n            else {\n                copyAxisDeltaInto(this.prevProjectionDelta.x, this.projectionDelta.x);\n                copyAxisDeltaInto(this.prevProjectionDelta.y, this.projectionDelta.y);\n            }\n            /**\n             * Update the delta between the corrected box and the target box before user-set transforms were applied.\n             * This will allow us to calculate the corrected borderRadius and boxShadow to compensate\n             * for our layout reprojection, but still allow them to be scaled correctly by the user.\n             * It might be that to simplify this we may want to accept that user-set scale is also corrected\n             * and we wouldn't have to keep and calc both deltas, OR we could support a user setting\n             * to allow people to choose whether these styles are corrected based on just the\n             * layout reprojection or the final bounding box.\n             */\n            calcBoxDelta(this.projectionDelta, this.layoutCorrected, target, this.latestValues);\n            if (this.treeScale.x !== prevTreeScaleX ||\n                this.treeScale.y !== prevTreeScaleY ||\n                !axisDeltaEquals(this.projectionDelta.x, this.prevProjectionDelta.x) ||\n                !axisDeltaEquals(this.projectionDelta.y, this.prevProjectionDelta.y)) {\n                this.hasProjected = true;\n                this.scheduleRender();\n                this.notifyListeners(\"projectionUpdate\", target);\n            }\n            /**\n             * Increase debug counter for recalculated projections\n             */\n            if (statsBuffer.value) {\n                metrics.calculatedProjections++;\n            }\n        }\n        hide() {\n            this.isVisible = false;\n            // TODO: Schedule render\n        }\n        show() {\n            this.isVisible = true;\n            // TODO: Schedule render\n        }\n        scheduleRender(notifyAll = true) {\n            this.options.visualElement?.scheduleRender();\n            if (notifyAll) {\n                const stack = this.getStack();\n                stack && stack.scheduleRender();\n            }\n            if (this.resumingFrom && !this.resumingFrom.instance) {\n                this.resumingFrom = undefined;\n            }\n        }\n        createProjectionDeltas() {\n            this.prevProjectionDelta = createDelta();\n            this.projectionDelta = createDelta();\n            this.projectionDeltaWithTransform = createDelta();\n        }\n        setAnimationOrigin(delta, hasOnlyRelativeTargetChanged = false) {\n            const snapshot = this.snapshot;\n            const snapshotLatestValues = snapshot ? snapshot.latestValues : {};\n            const mixedValues = { ...this.latestValues };\n            const targetDelta = createDelta();\n            if (!this.relativeParent ||\n                !this.relativeParent.options.layoutRoot) {\n                this.relativeTarget = this.relativeTargetOrigin = undefined;\n            }\n            this.attemptToResolveRelativeTarget = !hasOnlyRelativeTargetChanged;\n            const relativeLayout = createBox();\n            const snapshotSource = snapshot ? snapshot.source : undefined;\n            const layoutSource = this.layout ? this.layout.source : undefined;\n            const isSharedLayoutAnimation = snapshotSource !== layoutSource;\n            const stack = this.getStack();\n            const isOnlyMember = !stack || stack.members.length <= 1;\n            const shouldCrossfadeOpacity = Boolean(isSharedLayoutAnimation &&\n                !isOnlyMember &&\n                this.options.crossfade === true &&\n                !this.path.some(hasOpacityCrossfade));\n            this.animationProgress = 0;\n            let prevRelativeTarget;\n            this.mixTargetDelta = (latest) => {\n                const progress = latest / 1000;\n                mixAxisDelta(targetDelta.x, delta.x, progress);\n                mixAxisDelta(targetDelta.y, delta.y, progress);\n                this.setTargetDelta(targetDelta);\n                if (this.relativeTarget &&\n                    this.relativeTargetOrigin &&\n                    this.layout &&\n                    this.relativeParent &&\n                    this.relativeParent.layout) {\n                    calcRelativePosition(relativeLayout, this.layout.layoutBox, this.relativeParent.layout.layoutBox, this.options.layoutAnchor || undefined);\n                    mixBox(this.relativeTarget, this.relativeTargetOrigin, relativeLayout, progress);\n                    /**\n                     * If this is an unchanged relative target we can consider the\n                     * projection not dirty.\n                     */\n                    if (prevRelativeTarget &&\n                        boxEquals(this.relativeTarget, prevRelativeTarget)) {\n                        this.isProjectionDirty = false;\n                    }\n                    if (!prevRelativeTarget)\n                        prevRelativeTarget = createBox();\n                    copyBoxInto(prevRelativeTarget, this.relativeTarget);\n                }\n                if (isSharedLayoutAnimation) {\n                    this.animationValues = mixedValues;\n                    mixValues(mixedValues, snapshotLatestValues, this.latestValues, progress, shouldCrossfadeOpacity, isOnlyMember);\n                }\n                this.root.scheduleUpdateProjection();\n                this.scheduleRender();\n                this.animationProgress = progress;\n            };\n            this.mixTargetDelta(this.options.layoutRoot ? 1000 : 0);\n        }\n        startAnimation(options) {\n            this.notifyListeners(\"animationStart\");\n            this.currentAnimation?.stop();\n            this.resumingFrom?.currentAnimation?.stop();\n            if (this.pendingAnimation) {\n                cancelFrame(this.pendingAnimation);\n                this.pendingAnimation = undefined;\n            }\n            /**\n             * Start the animation in the next frame to have a frame with progress 0,\n             * where the target is the same as when the animation started, so we can\n             * calculate the relative positions correctly for instant transitions.\n             */\n            this.pendingAnimation = frame.update(() => {\n                globalProjectionState.hasAnimatedSinceResize = true;\n                activeAnimations.layout++;\n                this.motionValue || (this.motionValue = motionValue(0));\n                this.motionValue.jump(0, false);\n                this.currentAnimation = animateSingleValue(this.motionValue, [0, 1000], {\n                    ...options,\n                    velocity: 0,\n                    isSync: true,\n                    onUpdate: (latest) => {\n                        this.mixTargetDelta(latest);\n                        options.onUpdate && options.onUpdate(latest);\n                    },\n                    onStop: () => {\n                        activeAnimations.layout--;\n                    },\n                    onComplete: () => {\n                        activeAnimations.layout--;\n                        options.onComplete && options.onComplete();\n                        this.completeAnimation();\n                    },\n                });\n                if (this.resumingFrom) {\n                    this.resumingFrom.currentAnimation = this.currentAnimation;\n                }\n                this.pendingAnimation = undefined;\n            });\n        }\n        completeAnimation() {\n            if (this.resumingFrom) {\n                this.resumingFrom.currentAnimation = undefined;\n                this.resumingFrom.preserveOpacity = undefined;\n            }\n            const stack = this.getStack();\n            stack && stack.exitAnimationComplete();\n            this.resumingFrom =\n                this.currentAnimation =\n                    this.animationValues =\n                        undefined;\n            this.notifyListeners(\"animationComplete\");\n        }\n        finishAnimation() {\n            if (this.currentAnimation) {\n                this.mixTargetDelta && this.mixTargetDelta(animationTarget);\n                this.currentAnimation.stop();\n            }\n            this.completeAnimation();\n        }\n        applyTransformsToTarget() {\n            const lead = this.getLead();\n            let { targetWithTransforms, target, layout, latestValues } = lead;\n            if (!targetWithTransforms || !target || !layout)\n                return;\n            /**\n             * If we're only animating position, and this element isn't the lead element,\n             * then instead of projecting into the lead box we instead want to calculate\n             * a new target that aligns the two boxes but maintains the layout shape.\n             */\n            if (this !== lead &&\n                this.layout &&\n                layout &&\n                shouldAnimatePositionOnly(this.options.animationType, this.layout.layoutBox, layout.layoutBox)) {\n                target = this.target || createBox();\n                const xLength = calcLength(this.layout.layoutBox.x);\n                target.x.min = lead.target.x.min;\n                target.x.max = target.x.min + xLength;\n                const yLength = calcLength(this.layout.layoutBox.y);\n                target.y.min = lead.target.y.min;\n                target.y.max = target.y.min + yLength;\n            }\n            copyBoxInto(targetWithTransforms, target);\n            /**\n             * Apply the latest user-set transforms to the targetBox to produce the targetBoxFinal.\n             * This is the final box that we will then project into by calculating a transform delta and\n             * applying it to the corrected box.\n             */\n            transformBox(targetWithTransforms, latestValues);\n            /**\n             * Update the delta between the corrected box and the final target box, after\n             * user-set transforms are applied to it. This will be used by the renderer to\n             * create a transform style that will reproject the element from its layout layout\n             * into the desired bounding box.\n             */\n            calcBoxDelta(this.projectionDeltaWithTransform, this.layoutCorrected, targetWithTransforms, latestValues);\n        }\n        registerSharedNode(layoutId, node) {\n            if (!this.sharedNodes.has(layoutId)) {\n                this.sharedNodes.set(layoutId, new NodeStack());\n            }\n            const stack = this.sharedNodes.get(layoutId);\n            stack.add(node);\n            const config = node.options.initialPromotionConfig;\n            node.promote({\n                transition: config ? config.transition : undefined,\n                preserveFollowOpacity: config && config.shouldPreserveFollowOpacity\n                    ? config.shouldPreserveFollowOpacity(node)\n                    : undefined,\n            });\n        }\n        isLead() {\n            const stack = this.getStack();\n            return stack ? stack.lead === this : true;\n        }\n        getLead() {\n            const { layoutId } = this.options;\n            return layoutId ? this.getStack()?.lead || this : this;\n        }\n        getPrevLead() {\n            const { layoutId } = this.options;\n            return layoutId ? this.getStack()?.prevLead : undefined;\n        }\n        getStack() {\n            const { layoutId } = this.options;\n            if (layoutId)\n                return this.root.sharedNodes.get(layoutId);\n        }\n        promote({ needsReset, transition, preserveFollowOpacity, } = {}) {\n            const stack = this.getStack();\n            if (stack)\n                stack.promote(this, preserveFollowOpacity);\n            if (needsReset) {\n                this.projectionDelta = undefined;\n                this.needsReset = true;\n            }\n            if (transition)\n                this.setOptions({ transition });\n        }\n        relegate() {\n            const stack = this.getStack();\n            if (stack) {\n                return stack.relegate(this);\n            }\n            else {\n                return false;\n            }\n        }\n        resetSkewAndRotation() {\n            const { visualElement } = this.options;\n            if (!visualElement)\n                return;\n            // If there's no detected skew or rotation values, we can early return without a forced render.\n            let hasDistortingTransform = false;\n            /**\n             * An unrolled check for rotation values. Most elements don't have any rotation and\n             * skipping the nested loop and new object creation is 50% faster.\n             */\n            const { latestValues } = visualElement;\n            if (latestValues.z ||\n                latestValues.rotate ||\n                latestValues.rotateX ||\n                latestValues.rotateY ||\n                latestValues.rotateZ ||\n                latestValues.skewX ||\n                latestValues.skewY) {\n                hasDistortingTransform = true;\n            }\n            // If there's no distorting values, we don't need to do any more.\n            if (!hasDistortingTransform)\n                return;\n            const resetValues = {};\n            if (latestValues.z) {\n                resetDistortingTransform(\"z\", visualElement, resetValues, this.animationValues);\n            }\n            // Check the skew and rotate value of all axes and reset to 0\n            for (let i = 0; i < transformAxes.length; i++) {\n                resetDistortingTransform(`rotate${transformAxes[i]}`, visualElement, resetValues, this.animationValues);\n                resetDistortingTransform(`skew${transformAxes[i]}`, visualElement, resetValues, this.animationValues);\n            }\n            // Force a render of this element to apply the transform with all skews and rotations\n            // set to 0.\n            visualElement.render();\n            // Put back all the values we reset\n            for (const key in resetValues) {\n                visualElement.setStaticValue(key, resetValues[key]);\n                if (this.animationValues) {\n                    this.animationValues[key] = resetValues[key];\n                }\n            }\n            // Schedule a render for the next frame. This ensures we won't visually\n            // see the element with the reset rotate value applied.\n            visualElement.scheduleRender();\n        }\n        applyProjectionStyles(targetStyle, // CSSStyleDeclaration - doesn't allow numbers to be assigned to properties\n        styleProp) {\n            if (!this.instance || this.isSVG)\n                return;\n            if (!this.isVisible) {\n                targetStyle.visibility = \"hidden\";\n                return;\n            }\n            const transformTemplate = this.getTransformTemplate();\n            if (this.needsReset) {\n                this.needsReset = false;\n                targetStyle.visibility = \"\";\n                targetStyle.opacity = \"\";\n                targetStyle.pointerEvents =\n                    resolveMotionValue(styleProp?.pointerEvents) || \"\";\n                targetStyle.transform = transformTemplate\n                    ? transformTemplate(this.latestValues, \"\")\n                    : \"none\";\n                return;\n            }\n            const lead = this.getLead();\n            if (!this.projectionDelta || !this.layout || !lead.target) {\n                if (this.options.layoutId) {\n                    targetStyle.opacity =\n                        this.latestValues.opacity !== undefined\n                            ? this.latestValues.opacity\n                            : 1;\n                    targetStyle.pointerEvents =\n                        resolveMotionValue(styleProp?.pointerEvents) || \"\";\n                }\n                if (this.hasProjected && !hasTransform(this.latestValues)) {\n                    targetStyle.transform = transformTemplate\n                        ? transformTemplate({}, \"\")\n                        : \"none\";\n                    this.hasProjected = false;\n                }\n                return;\n            }\n            targetStyle.visibility = \"\";\n            const valuesToRender = lead.animationValues || lead.latestValues;\n            this.applyTransformsToTarget();\n            let transform = buildProjectionTransform(this.projectionDeltaWithTransform, this.treeScale, valuesToRender);\n            if (transformTemplate) {\n                transform = transformTemplate(valuesToRender, transform);\n            }\n            targetStyle.transform = transform;\n            const { x, y } = this.projectionDelta;\n            targetStyle.transformOrigin = `${x.origin * 100}% ${y.origin * 100}% 0`;\n            if (lead.animationValues) {\n                /**\n                 * If the lead component is animating, assign this either the entering/leaving\n                 * opacity\n                 */\n                targetStyle.opacity =\n                    lead === this\n                        ? valuesToRender.opacity ??\n                            this.latestValues.opacity ??\n                            1\n                        : this.preserveOpacity\n                            ? this.latestValues.opacity\n                            : valuesToRender.opacityExit;\n            }\n            else {\n                /**\n                 * Or we're not animating at all, set the lead component to its layout\n                 * opacity and other components to hidden.\n                 */\n                targetStyle.opacity =\n                    lead === this\n                        ? valuesToRender.opacity !== undefined\n                            ? valuesToRender.opacity\n                            : \"\"\n                        : valuesToRender.opacityExit !== undefined\n                            ? valuesToRender.opacityExit\n                            : 0;\n            }\n            /**\n             * Apply scale correction\n             */\n            for (const key in scaleCorrectors) {\n                if (valuesToRender[key] === undefined)\n                    continue;\n                const { correct, applyTo, isCSSVariable } = scaleCorrectors[key];\n                /**\n                 * Only apply scale correction to the value if we have an\n                 * active projection transform. Otherwise these values become\n                 * vulnerable to distortion if the element changes size without\n                 * a corresponding layout animation.\n                 */\n                const corrected = transform === \"none\"\n                    ? valuesToRender[key]\n                    : correct(valuesToRender[key], lead);\n                if (applyTo) {\n                    const num = applyTo.length;\n                    for (let i = 0; i < num; i++) {\n                        targetStyle[applyTo[i]] = corrected;\n                    }\n                }\n                else {\n                    // If this is a CSS variable, set it directly on the instance.\n                    // Replacing this function from creating styles to setting them\n                    // would be a good place to remove per frame object creation\n                    if (isCSSVariable) {\n                        this.options.visualElement.renderState.vars[key] = corrected;\n                    }\n                    else {\n                        targetStyle[key] = corrected;\n                    }\n                }\n            }\n            /**\n             * Disable pointer events on follow components. This is to ensure\n             * that if a follow component covers a lead component it doesn't block\n             * pointer events on the lead.\n             */\n            if (this.options.layoutId) {\n                targetStyle.pointerEvents =\n                    lead === this\n                        ? resolveMotionValue(styleProp?.pointerEvents) || \"\"\n                        : \"none\";\n            }\n        }\n        clearSnapshot() {\n            this.resumeFrom = this.snapshot = undefined;\n        }\n        // Only run on root\n        resetTree() {\n            this.root.nodes.forEach((node) => node.currentAnimation?.stop());\n            this.root.nodes.forEach(clearMeasurements);\n            this.root.sharedNodes.clear();\n        }\n    };\n}\nfunction updateLayout(node) {\n    node.updateLayout();\n}\nfunction notifyLayoutUpdate(node) {\n    const snapshot = node.resumeFrom?.snapshot || node.snapshot;\n    if (node.isLead() &&\n        node.layout &&\n        snapshot &&\n        node.hasListeners(\"didUpdate\")) {\n        const { layoutBox: layout, measuredBox: measuredLayout } = node.layout;\n        const { animationType } = node.options;\n        const isShared = snapshot.source !== node.layout.source;\n        // TODO Maybe we want to also resize the layout snapshot so we don't trigger\n        // animations for instance if layout=\"size\" and an element has only changed position\n        if (animationType === \"size\") {\n            eachAxis((axis) => {\n                const axisSnapshot = isShared\n                    ? snapshot.measuredBox[axis]\n                    : snapshot.layoutBox[axis];\n                const length = calcLength(axisSnapshot);\n                axisSnapshot.min = layout[axis].min;\n                axisSnapshot.max = axisSnapshot.min + length;\n            });\n        }\n        else if (animationType === \"x\" || animationType === \"y\") {\n            const snapAxis = animationType === \"x\" ? \"y\" : \"x\";\n            copyAxisInto(isShared\n                ? snapshot.measuredBox[snapAxis]\n                : snapshot.layoutBox[snapAxis], layout[snapAxis]);\n        }\n        else if (shouldAnimatePositionOnly(animationType, snapshot.layoutBox, layout)) {\n            eachAxis((axis) => {\n                const axisSnapshot = isShared\n                    ? snapshot.measuredBox[axis]\n                    : snapshot.layoutBox[axis];\n                const length = calcLength(layout[axis]);\n                axisSnapshot.max = axisSnapshot.min + length;\n                /**\n                 * Ensure relative target gets resized and rerendererd\n                 */\n                if (node.relativeTarget && !node.currentAnimation) {\n                    node.isProjectionDirty = true;\n                    node.relativeTarget[axis].max =\n                        node.relativeTarget[axis].min + length;\n                }\n            });\n        }\n        const layoutDelta = createDelta();\n        calcBoxDelta(layoutDelta, layout, snapshot.layoutBox);\n        const visualDelta = createDelta();\n        if (isShared) {\n            calcBoxDelta(visualDelta, node.applyTransform(measuredLayout, true), snapshot.measuredBox);\n        }\n        else {\n            calcBoxDelta(visualDelta, layout, snapshot.layoutBox);\n        }\n        const hasLayoutChanged = !isDeltaZero(layoutDelta);\n        let hasRelativeLayoutChanged = false;\n        if (!node.resumeFrom) {\n            const relativeParent = node.getClosestProjectingParent();\n            /**\n             * If the relativeParent is itself resuming from a different element then\n             * the relative snapshot is not relavent\n             */\n            if (relativeParent && !relativeParent.resumeFrom) {\n                const { snapshot: parentSnapshot, layout: parentLayout } = relativeParent;\n                if (parentSnapshot && parentLayout) {\n                    const anchor = node.options.layoutAnchor || undefined;\n                    const relativeSnapshot = createBox();\n                    calcRelativePosition(relativeSnapshot, snapshot.layoutBox, parentSnapshot.layoutBox, anchor);\n                    const relativeLayout = createBox();\n                    calcRelativePosition(relativeLayout, layout, parentLayout.layoutBox, anchor);\n                    if (!boxEqualsRounded(relativeSnapshot, relativeLayout)) {\n                        hasRelativeLayoutChanged = true;\n                    }\n                    if (relativeParent.options.layoutRoot) {\n                        node.relativeTarget = relativeLayout;\n                        node.relativeTargetOrigin = relativeSnapshot;\n                        node.relativeParent = relativeParent;\n                    }\n                }\n            }\n        }\n        node.notifyListeners(\"didUpdate\", {\n            layout,\n            snapshot,\n            delta: visualDelta,\n            layoutDelta,\n            hasLayoutChanged,\n            hasRelativeLayoutChanged,\n        });\n    }\n    else if (node.isLead()) {\n        const { onExitComplete } = node.options;\n        onExitComplete && onExitComplete();\n    }\n    /**\n     * Clearing transition\n     * TODO: Investigate why this transition is being passed in as {type: false } from Framer\n     * and why we need it at all\n     */\n    node.options.transition = undefined;\n}\nfunction propagateDirtyNodes(node) {\n    /**\n     * Increase debug counter for nodes encountered this frame\n     */\n    if (statsBuffer.value) {\n        metrics.nodes++;\n    }\n    if (!node.parent)\n        return;\n    /**\n     * If this node isn't projecting, propagate isProjectionDirty. It will have\n     * no performance impact but it will allow the next child that *is* projecting\n     * but *isn't* dirty to just check its parent to see if *any* ancestor needs\n     * correcting.\n     */\n    if (!node.isProjecting()) {\n        node.isProjectionDirty = node.parent.isProjectionDirty;\n    }\n    /**\n     * Propagate isSharedProjectionDirty and isTransformDirty\n     * throughout the whole tree. A future revision can take another look at\n     * this but for safety we still recalcualte shared nodes.\n     */\n    node.isSharedProjectionDirty || (node.isSharedProjectionDirty = Boolean(node.isProjectionDirty ||\n        node.parent.isProjectionDirty ||\n        node.parent.isSharedProjectionDirty));\n    node.isTransformDirty || (node.isTransformDirty = node.parent.isTransformDirty);\n}\nfunction cleanDirtyNodes(node) {\n    node.isProjectionDirty =\n        node.isSharedProjectionDirty =\n            node.isTransformDirty =\n                false;\n}\nfunction clearSnapshot(node) {\n    node.clearSnapshot();\n}\nfunction clearMeasurements(node) {\n    node.clearMeasurements();\n}\nfunction forceLayoutMeasure(node) {\n    node.isLayoutDirty = true;\n    node.updateLayout();\n}\nfunction clearIsLayoutDirty(node) {\n    node.isLayoutDirty = false;\n}\n/**\n * When a node is animation-blocked (e.g. during drag) and its component\n * didn't re-render (memoized), willUpdate() is never called so there's\n * no snapshot. Use the previous layout as a snapshot and mark dirty so\n * resetTransform/updateLayout/notifyLayoutUpdate process it normally.\n */\nfunction ensureDraggedNodesSnapshotted(node) {\n    if (node.isAnimationBlocked && node.layout && !node.isLayoutDirty) {\n        node.snapshot = node.layout;\n        node.isLayoutDirty = true;\n    }\n}\nfunction resetTransformStyle(node) {\n    const { visualElement } = node.options;\n    if (visualElement && visualElement.getProps().onBeforeLayoutMeasure) {\n        visualElement.notify(\"BeforeLayoutMeasure\");\n    }\n    node.resetTransform();\n}\nfunction finishAnimation(node) {\n    node.finishAnimation();\n    node.targetDelta = node.relativeTarget = node.target = undefined;\n    node.isProjectionDirty = true;\n}\nfunction resolveTargetDelta(node) {\n    node.resolveTargetDelta();\n}\nfunction calcProjection(node) {\n    node.calcProjection();\n}\nfunction resetSkewAndRotation(node) {\n    node.resetSkewAndRotation();\n}\nfunction removeLeadSnapshots(stack) {\n    stack.removeLeadSnapshot();\n}\nfunction mixAxisDelta(output, delta, p) {\n    output.translate = mixNumber(delta.translate, 0, p);\n    output.scale = mixNumber(delta.scale, 1, p);\n    output.origin = delta.origin;\n    output.originPoint = delta.originPoint;\n}\nfunction mixAxis(output, from, to, p) {\n    output.min = mixNumber(from.min, to.min, p);\n    output.max = mixNumber(from.max, to.max, p);\n}\nfunction mixBox(output, from, to, p) {\n    mixAxis(output.x, from.x, to.x, p);\n    mixAxis(output.y, from.y, to.y, p);\n}\nfunction hasOpacityCrossfade(node) {\n    return (node.animationValues && node.animationValues.opacityExit !== undefined);\n}\nconst defaultLayoutTransition = {\n    duration: 0.45,\n    ease: [0.4, 0, 0.1, 1],\n};\nconst userAgentContains = (string) => typeof navigator !== \"undefined\" &&\n    navigator.userAgent &&\n    navigator.userAgent.toLowerCase().includes(string);\n/**\n * Measured bounding boxes must be rounded in Safari and\n * left untouched in Chrome, otherwise non-integer layouts within scaled-up elements\n * can appear to jump.\n */\nconst roundPoint = userAgentContains(\"applewebkit/\") && !userAgentContains(\"chrome/\")\n    ? Math.round\n    : noop;\nfunction roundAxis(axis) {\n    // Round to the nearest .5 pixels to support subpixel layouts\n    axis.min = roundPoint(axis.min);\n    axis.max = roundPoint(axis.max);\n}\nfunction roundBox(box) {\n    roundAxis(box.x);\n    roundAxis(box.y);\n}\nfunction shouldAnimatePositionOnly(animationType, snapshot, layout) {\n    return (animationType === \"position\" ||\n        (animationType === \"preserve-aspect\" &&\n            !isNear(aspectRatio(snapshot), aspectRatio(layout), 0.2)));\n}\nfunction checkNodeWasScrollRoot(node) {\n    return node !== node.root && node.scroll?.wasRoot;\n}\n\nexport { cleanDirtyNodes, createProjectionNode, mixAxis, mixAxisDelta, mixBox, propagateDirtyNodes };\n//# sourceMappingURL=create-projection-node.mjs.map\n","import { addDomEvent } from '../../events/add-dom-event.mjs';\nimport { createProjectionNode } from './create-projection-node.mjs';\n\nconst DocumentProjectionNode = createProjectionNode({\n    attachResizeListener: (ref, notify) => addDomEvent(ref, \"resize\", notify),\n    measureScroll: () => ({\n        x: document.documentElement.scrollLeft || document.body?.scrollLeft || 0,\n        y: document.documentElement.scrollTop || document.body?.scrollTop || 0,\n    }),\n    checkIsScrollRoot: () => true,\n});\n\nexport { DocumentProjectionNode };\n//# sourceMappingURL=DocumentProjectionNode.mjs.map\n","import { createProjectionNode } from './create-projection-node.mjs';\nimport { DocumentProjectionNode } from './DocumentProjectionNode.mjs';\n\nconst rootProjectionNode = {\n    current: undefined,\n};\nconst HTMLProjectionNode = createProjectionNode({\n    measureScroll: (instance) => ({\n        x: instance.scrollLeft,\n        y: instance.scrollTop,\n    }),\n    defaultParent: () => {\n        if (!rootProjectionNode.current) {\n            const documentNode = new DocumentProjectionNode({});\n            documentNode.mount(window);\n            documentNode.setOptions({ layoutScroll: true });\n            rootProjectionNode.current = documentNode;\n        }\n        return rootProjectionNode.current;\n    },\n    resetTransform: (instance, value) => {\n        instance.style.transform = value !== undefined ? value : \"none\";\n    },\n    checkIsScrollRoot: (instance) => Boolean(window.getComputedStyle(instance).position === \"fixed\"),\n});\n\nexport { HTMLProjectionNode, rootProjectionNode };\n//# sourceMappingURL=HTMLProjectionNode.mjs.map\n","\"use client\";\nimport { createContext } from 'react';\n\n/**\n * @public\n */\nconst MotionConfigContext = createContext({\n    transformPagePoint: (p) => p,\n    isStatic: false,\n    reducedMotion: \"never\",\n});\n\nexport { MotionConfigContext };\n//# sourceMappingURL=MotionConfigContext.mjs.map\n","import * as React from 'react';\n\n/**\n * Taken from https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx\n */\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef(ref, value) {\n    if (typeof ref === \"function\") {\n        return ref(value);\n    }\n    else if (ref !== null && ref !== undefined) {\n        ref.current = value;\n    }\n}\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs(...refs) {\n    return (node) => {\n        let hasCleanup = false;\n        const cleanups = refs.map((ref) => {\n            const cleanup = setRef(ref, node);\n            if (!hasCleanup && typeof cleanup === \"function\") {\n                hasCleanup = true;\n            }\n            return cleanup;\n        });\n        // React <19 will log an error to the console if a callback ref returns a\n        // value. We don't use ref cleanups internally so this will only happen if a\n        // user's ref callback returns a value, which we only expect if they are\n        // using the cleanup functionality added in React 19.\n        if (hasCleanup) {\n            return () => {\n                for (let i = 0; i < cleanups.length; i++) {\n                    const cleanup = cleanups[i];\n                    if (typeof cleanup === \"function\") {\n                        cleanup();\n                    }\n                    else {\n                        setRef(refs[i], null);\n                    }\n                }\n            };\n        }\n    };\n}\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs(...refs) {\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { useComposedRefs };\n//# sourceMappingURL=use-composed-ref.mjs.map\n","\"use client\";\nimport { jsx } from 'react/jsx-runtime';\nimport { isHTMLElement } from 'motion-dom';\nimport * as React from 'react';\nimport { useId, useRef, useContext, useInsertionEffect } from 'react';\nimport { MotionConfigContext } from '../../context/MotionConfigContext.mjs';\nimport { useComposedRefs } from '../../utils/use-composed-ref.mjs';\n\n/**\n * Measurement functionality has to be within a separate component\n * to leverage snapshot lifecycle.\n */\nclass PopChildMeasure extends React.Component {\n    getSnapshotBeforeUpdate(prevProps) {\n        const element = this.props.childRef.current;\n        if (isHTMLElement(element) && prevProps.isPresent && !this.props.isPresent && this.props.pop !== false) {\n            const parent = element.offsetParent;\n            const parentWidth = isHTMLElement(parent)\n                ? parent.offsetWidth || 0\n                : 0;\n            const parentHeight = isHTMLElement(parent)\n                ? parent.offsetHeight || 0\n                : 0;\n            const computedStyle = getComputedStyle(element);\n            const size = this.props.sizeRef.current;\n            size.height = parseFloat(computedStyle.height);\n            size.width = parseFloat(computedStyle.width);\n            size.top = element.offsetTop;\n            size.left = element.offsetLeft;\n            size.right = parentWidth - size.width - size.left;\n            size.bottom = parentHeight - size.height - size.top;\n        }\n        return null;\n    }\n    /**\n     * Required with getSnapshotBeforeUpdate to stop React complaining.\n     */\n    componentDidUpdate() { }\n    render() {\n        return this.props.children;\n    }\n}\nfunction PopChild({ children, isPresent, anchorX, anchorY, root, pop }) {\n    const id = useId();\n    const ref = useRef(null);\n    const size = useRef({\n        width: 0,\n        height: 0,\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n    });\n    const { nonce } = useContext(MotionConfigContext);\n    /**\n     * In React 19, refs are passed via props.ref instead of element.ref.\n     * We check props.ref first (React 19) and fall back to element.ref (React 18).\n     */\n    const childRef = children.props?.ref ??\n        children?.ref;\n    const composedRef = useComposedRefs(ref, childRef);\n    /**\n     * We create and inject a style block so we can apply this explicit\n     * sizing in a non-destructive manner by just deleting the style block.\n     *\n     * We can't apply size via render as the measurement happens\n     * in getSnapshotBeforeUpdate (post-render), likewise if we apply the\n     * styles directly on the DOM node, we might be overwriting\n     * styles set via the style prop.\n     */\n    useInsertionEffect(() => {\n        const { width, height, top, left, right, bottom } = size.current;\n        if (isPresent || pop === false || !ref.current || !width || !height)\n            return;\n        const x = anchorX === \"left\" ? `left: ${left}` : `right: ${right}`;\n        const y = anchorY === \"bottom\" ? `bottom: ${bottom}` : `top: ${top}`;\n        ref.current.dataset.motionPopId = id;\n        const style = document.createElement(\"style\");\n        if (nonce)\n            style.nonce = nonce;\n        const parent = root ?? document.head;\n        parent.appendChild(style);\n        if (style.sheet) {\n            style.sheet.insertRule(`\n          [data-motion-pop-id=\"${id}\"] {\n            position: absolute !important;\n            width: ${width}px !important;\n            height: ${height}px !important;\n            ${x}px !important;\n            ${y}px !important;\n          }\n        `);\n        }\n        return () => {\n            ref.current?.removeAttribute(\"data-motion-pop-id\");\n            if (parent.contains(style)) {\n                parent.removeChild(style);\n            }\n        };\n    }, [isPresent]);\n    return (jsx(PopChildMeasure, { isPresent: isPresent, childRef: ref, sizeRef: size, pop: pop, children: pop === false\n            ? children\n            : React.cloneElement(children, { ref: composedRef }) }));\n}\n\nexport { PopChild };\n//# sourceMappingURL=PopChild.mjs.map\n","\"use client\";\nimport { jsx } from 'react/jsx-runtime';\nimport * as React from 'react';\nimport { useId, useMemo } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { PopChild } from './PopChild.mjs';\n\nconst PresenceChild = ({ children, initial, isPresent, onExitComplete, custom, presenceAffectsLayout, mode, anchorX, anchorY, root }) => {\n    const presenceChildren = useConstant(newChildrenMap);\n    const id = useId();\n    let isReusedContext = true;\n    let context = useMemo(() => {\n        isReusedContext = false;\n        return {\n            id,\n            initial,\n            isPresent,\n            custom,\n            onExitComplete: (childId) => {\n                presenceChildren.set(childId, true);\n                for (const isComplete of presenceChildren.values()) {\n                    if (!isComplete)\n                        return; // can stop searching when any is incomplete\n                }\n                onExitComplete && onExitComplete();\n            },\n            register: (childId) => {\n                presenceChildren.set(childId, false);\n                return () => presenceChildren.delete(childId);\n            },\n        };\n    }, [isPresent, presenceChildren, onExitComplete]);\n    /**\n     * If the presence of a child affects the layout of the components around it,\n     * we want to make a new context value to ensure they get re-rendered\n     * so they can detect that layout change.\n     */\n    if (presenceAffectsLayout && isReusedContext) {\n        context = { ...context };\n    }\n    useMemo(() => {\n        presenceChildren.forEach((_, key) => presenceChildren.set(key, false));\n    }, [isPresent]);\n    /**\n     * If there's no `motion` components to fire exit animations, we want to remove this\n     * component immediately.\n     */\n    React.useEffect(() => {\n        !isPresent &&\n            !presenceChildren.size &&\n            onExitComplete &&\n            onExitComplete();\n    }, [isPresent]);\n    children = (jsx(PopChild, { pop: mode === \"popLayout\", isPresent: isPresent, anchorX: anchorX, anchorY: anchorY, root: root, children: children }));\n    return (jsx(PresenceContext.Provider, { value: context, children: children }));\n};\nfunction newChildrenMap() {\n    return new Map();\n}\n\nexport { PresenceChild };\n//# sourceMappingURL=PresenceChild.mjs.map\n","\"use client\";\nimport { useContext, useId, useEffect, useCallback } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\n\n/**\n * When a component is the child of `AnimatePresence`, it can use `usePresence`\n * to access information about whether it's still present in the React tree.\n *\n * ```jsx\n * import { usePresence } from \"framer-motion\"\n *\n * export const Component = () => {\n *   const [isPresent, safeToRemove] = usePresence()\n *\n *   useEffect(() => {\n *     !isPresent && setTimeout(safeToRemove, 1000)\n *   }, [isPresent])\n *\n *   return <div />\n * }\n * ```\n *\n * If `isPresent` is `false`, it means that a component has been removed from the tree,\n * but `AnimatePresence` won't really remove it until `safeToRemove` has been called.\n *\n * @public\n */\nfunction usePresence(subscribe = true) {\n    const context = useContext(PresenceContext);\n    if (context === null)\n        return [true, null];\n    const { isPresent, onExitComplete, register } = context;\n    // It's safe to call the following hooks conditionally (after an early return) because the context will always\n    // either be null or non-null for the lifespan of the component.\n    const id = useId();\n    useEffect(() => {\n        if (subscribe) {\n            return register(id);\n        }\n    }, [subscribe]);\n    const safeToRemove = useCallback(() => subscribe && onExitComplete && onExitComplete(id), [id, onExitComplete, subscribe]);\n    return !isPresent && onExitComplete ? [false, safeToRemove] : [true];\n}\n/**\n * Similar to `usePresence`, except `useIsPresent` simply returns whether or not the component is present.\n * There is no `safeToRemove` function.\n *\n * ```jsx\n * import { useIsPresent } from \"framer-motion\"\n *\n * export const Component = () => {\n *   const isPresent = useIsPresent()\n *\n *   useEffect(() => {\n *     !isPresent && console.log(\"I've been removed!\")\n *   }, [isPresent])\n *\n *   return <div />\n * }\n * ```\n *\n * @public\n */\nfunction useIsPresent() {\n    return isPresent(useContext(PresenceContext));\n}\nfunction isPresent(context) {\n    return context === null ? true : context.isPresent;\n}\n\nexport { isPresent, useIsPresent, usePresence };\n//# sourceMappingURL=use-presence.mjs.map\n","import { Children, isValidElement } from 'react';\n\nconst getChildKey = (child) => child.key || \"\";\nfunction onlyElements(children) {\n    const filtered = [];\n    // We use forEach here instead of map as map mutates the component key by preprending `.$`\n    Children.forEach(children, (child) => {\n        if (isValidElement(child))\n            filtered.push(child);\n    });\n    return filtered;\n}\n\nexport { getChildKey, onlyElements };\n//# sourceMappingURL=utils.mjs.map\n","\"use client\";\nimport { jsx, Fragment } from 'react/jsx-runtime';\nimport { useMemo, useRef, useState, useContext } from 'react';\nimport { LayoutGroupContext } from '../../context/LayoutGroupContext.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { PresenceChild } from './PresenceChild.mjs';\nimport { usePresence } from './use-presence.mjs';\nimport { onlyElements, getChildKey } from './utils.mjs';\n\n/**\n * `AnimatePresence` enables the animation of components that have been removed from the tree.\n *\n * When adding/removing more than a single child, every child **must** be given a unique `key` prop.\n *\n * Any `motion` components that have an `exit` property defined will animate out when removed from\n * the tree.\n *\n * ```jsx\n * import { motion, AnimatePresence } from 'framer-motion'\n *\n * export const Items = ({ items }) => (\n *   <AnimatePresence>\n *     {items.map(item => (\n *       <motion.div\n *         key={item.id}\n *         initial={{ opacity: 0 }}\n *         animate={{ opacity: 1 }}\n *         exit={{ opacity: 0 }}\n *       />\n *     ))}\n *   </AnimatePresence>\n * )\n * ```\n *\n * You can sequence exit animations throughout a tree using variants.\n *\n * If a child contains multiple `motion` components with `exit` props, it will only unmount the child\n * once all `motion` components have finished animating out. Likewise, any components using\n * `usePresence` all need to call `safeToRemove`.\n *\n * @public\n */\nconst AnimatePresence = ({ children, custom, initial = true, onExitComplete, presenceAffectsLayout = true, mode = \"sync\", propagate = false, anchorX = \"left\", anchorY = \"top\", root }) => {\n    const [isParentPresent, safeToRemove] = usePresence(propagate);\n    /**\n     * Filter any children that aren't ReactElements. We can only track components\n     * between renders with a props.key.\n     */\n    const presentChildren = useMemo(() => onlyElements(children), [children]);\n    /**\n     * Track the keys of the currently rendered children. This is used to\n     * determine which children are exiting.\n     */\n    const presentKeys = propagate && !isParentPresent ? [] : presentChildren.map(getChildKey);\n    /**\n     * If `initial={false}` we only want to pass this to components in the first render.\n     */\n    const isInitialRender = useRef(true);\n    /**\n     * A ref containing the currently present children. When all exit animations\n     * are complete, we use this to re-render the component with the latest children\n     * *committed* rather than the latest children *rendered*.\n     */\n    const pendingPresentChildren = useRef(presentChildren);\n    /**\n     * Track which exiting children have finished animating out.\n     */\n    const exitComplete = useConstant(() => new Map());\n    /**\n     * Track which components are currently processing exit to prevent duplicate processing.\n     */\n    const exitingComponents = useRef(new Set());\n    /**\n     * Save children to render as React state. To ensure this component is concurrent-safe,\n     * we check for exiting children via an effect.\n     */\n    const [diffedChildren, setDiffedChildren] = useState(presentChildren);\n    const [renderedChildren, setRenderedChildren] = useState(presentChildren);\n    useIsomorphicLayoutEffect(() => {\n        isInitialRender.current = false;\n        pendingPresentChildren.current = presentChildren;\n        /**\n         * Update complete status of exiting children.\n         */\n        for (let i = 0; i < renderedChildren.length; i++) {\n            const key = getChildKey(renderedChildren[i]);\n            if (!presentKeys.includes(key)) {\n                if (exitComplete.get(key) !== true) {\n                    exitComplete.set(key, false);\n                }\n            }\n            else {\n                exitComplete.delete(key);\n                exitingComponents.current.delete(key);\n            }\n        }\n    }, [renderedChildren, presentKeys.length, presentKeys.join(\"-\")]);\n    const exitingChildren = [];\n    if (presentChildren !== diffedChildren) {\n        let nextChildren = [...presentChildren];\n        /**\n         * Loop through all the currently rendered components and decide which\n         * are exiting.\n         */\n        for (let i = 0; i < renderedChildren.length; i++) {\n            const child = renderedChildren[i];\n            const key = getChildKey(child);\n            if (!presentKeys.includes(key)) {\n                nextChildren.splice(i, 0, child);\n                exitingChildren.push(child);\n            }\n        }\n        /**\n         * If we're in \"wait\" mode, and we have exiting children, we want to\n         * only render these until they've all exited.\n         */\n        if (mode === \"wait\" && exitingChildren.length) {\n            nextChildren = exitingChildren;\n        }\n        setRenderedChildren(onlyElements(nextChildren));\n        setDiffedChildren(presentChildren);\n        /**\n         * Early return to ensure once we've set state with the latest diffed\n         * children, we can immediately re-render.\n         */\n        return null;\n    }\n    if (process.env.NODE_ENV !== \"production\" &&\n        mode === \"wait\" &&\n        renderedChildren.length > 1) {\n        console.warn(`You're attempting to animate multiple children within AnimatePresence, but its mode is set to \"wait\". This will lead to odd visual behaviour.`);\n    }\n    /**\n     * If we've been provided a forceRender function by the LayoutGroupContext,\n     * we can use it to force a re-render amongst all surrounding components once\n     * all components have finished animating out.\n     */\n    const { forceRender } = useContext(LayoutGroupContext);\n    return (jsx(Fragment, { children: renderedChildren.map((child) => {\n            const key = getChildKey(child);\n            const isPresent = propagate && !isParentPresent\n                ? false\n                : presentChildren === renderedChildren ||\n                    presentKeys.includes(key);\n            const onExit = () => {\n                if (exitingComponents.current.has(key)) {\n                    return;\n                }\n                if (exitComplete.has(key)) {\n                    exitingComponents.current.add(key);\n                    exitComplete.set(key, true);\n                }\n                else {\n                    return;\n                }\n                let isEveryExitComplete = true;\n                exitComplete.forEach((isExitComplete) => {\n                    if (!isExitComplete)\n                        isEveryExitComplete = false;\n                });\n                if (isEveryExitComplete) {\n                    forceRender?.();\n                    setRenderedChildren(pendingPresentChildren.current);\n                    propagate && safeToRemove?.();\n                    onExitComplete && onExitComplete();\n                }\n            };\n            return (jsx(PresenceChild, { isPresent: isPresent, initial: !isInitialRender.current || initial\n                    ? undefined\n                    : false, custom: custom, presenceAffectsLayout: presenceAffectsLayout, mode: mode, root: root, onExitComplete: isPresent ? undefined : onExit, anchorX: anchorX, anchorY: anchorY, children: child }, key));\n        }) }));\n};\n\nexport { AnimatePresence };\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\nimport { createContext } from 'react';\n\nconst LazyContext = createContext({ strict: false });\n\nexport { LazyContext };\n//# sourceMappingURL=LazyContext.mjs.map\n","import { getFeatureDefinitions, setFeatureDefinitions } from 'motion-dom';\n\nconst featureProps = {\n    animation: [\n        \"animate\",\n        \"variants\",\n        \"whileHover\",\n        \"whileTap\",\n        \"exit\",\n        \"whileInView\",\n        \"whileFocus\",\n        \"whileDrag\",\n    ],\n    exit: [\"exit\"],\n    drag: [\"drag\", \"dragControls\"],\n    focus: [\"whileFocus\"],\n    hover: [\"whileHover\", \"onHoverStart\", \"onHoverEnd\"],\n    tap: [\"whileTap\", \"onTap\", \"onTapStart\", \"onTapCancel\"],\n    pan: [\"onPan\", \"onPanStart\", \"onPanSessionStart\", \"onPanEnd\"],\n    inView: [\"whileInView\", \"onViewportEnter\", \"onViewportLeave\"],\n    layout: [\"layout\", \"layoutId\"],\n};\nlet isInitialized = false;\n/**\n * Initialize feature definitions with isEnabled checks.\n * This must be called before any motion components are rendered.\n */\nfunction initFeatureDefinitions() {\n    if (isInitialized)\n        return;\n    const initialFeatureDefinitions = {};\n    for (const key in featureProps) {\n        initialFeatureDefinitions[key] = {\n            isEnabled: (props) => featureProps[key].some((name) => !!props[name]),\n        };\n    }\n    setFeatureDefinitions(initialFeatureDefinitions);\n    isInitialized = true;\n}\n/**\n * Get the current feature definitions, initializing if needed.\n */\nfunction getInitializedFeatureDefinitions() {\n    initFeatureDefinitions();\n    return getFeatureDefinitions();\n}\n\nexport { getInitializedFeatureDefinitions, initFeatureDefinitions };\n//# sourceMappingURL=definitions.mjs.map\n","import { setFeatureDefinitions } from 'motion-dom';\nimport { getInitializedFeatureDefinitions } from './definitions.mjs';\n\nfunction loadFeatures(features) {\n    const featureDefinitions = getInitializedFeatureDefinitions();\n    for (const key in features) {\n        featureDefinitions[key] = {\n            ...featureDefinitions[key],\n            ...features[key],\n        };\n    }\n    setFeatureDefinitions(featureDefinitions);\n}\n\nexport { loadFeatures };\n//# sourceMappingURL=load-features.mjs.map\n","/**\n * A list of all valid MotionProps.\n *\n * @privateRemarks\n * This doesn't throw if a `MotionProp` name is missing - it should.\n */\nconst validMotionProps = new Set([\n    \"animate\",\n    \"exit\",\n    \"variants\",\n    \"initial\",\n    \"style\",\n    \"values\",\n    \"variants\",\n    \"transition\",\n    \"transformTemplate\",\n    \"custom\",\n    \"inherit\",\n    \"onBeforeLayoutMeasure\",\n    \"onAnimationStart\",\n    \"onAnimationComplete\",\n    \"onUpdate\",\n    \"onDragStart\",\n    \"onDrag\",\n    \"onDragEnd\",\n    \"onMeasureDragConstraints\",\n    \"onDirectionLock\",\n    \"onDragTransitionEnd\",\n    \"_dragX\",\n    \"_dragY\",\n    \"onHoverStart\",\n    \"onHoverEnd\",\n    \"onViewportEnter\",\n    \"onViewportLeave\",\n    \"globalTapTarget\",\n    \"propagate\",\n    \"ignoreStrict\",\n    \"viewport\",\n]);\n/**\n * Check whether a prop name is a valid `MotionProp` key.\n *\n * @param key - Name of the property to check\n * @returns `true` is key is a valid `MotionProp`.\n *\n * @public\n */\nfunction isValidMotionProp(key) {\n    return (key.startsWith(\"while\") ||\n        (key.startsWith(\"drag\") && key !== \"draggable\") ||\n        key.startsWith(\"layout\") ||\n        key.startsWith(\"onTap\") ||\n        key.startsWith(\"onPan\") ||\n        key.startsWith(\"onLayout\") ||\n        validMotionProps.has(key));\n}\n\nexport { isValidMotionProp };\n//# sourceMappingURL=valid-prop.mjs.map\n","import { isMotionValue } from 'motion-dom';\nimport { isValidMotionProp } from '../../../motion/utils/valid-prop.mjs';\n\nlet shouldForward = (key) => !isValidMotionProp(key);\nfunction loadExternalIsValidProp(isValidProp) {\n    if (typeof isValidProp !== \"function\")\n        return;\n    // Explicitly filter our events\n    shouldForward = (key) => key.startsWith(\"on\") ? !isValidMotionProp(key) : isValidProp(key);\n}\n/**\n * Emotion and Styled Components both allow users to pass through arbitrary props to their components\n * to dynamically generate CSS. They both use the `@emotion/is-prop-valid` package to determine which\n * of these should be passed to the underlying DOM node.\n *\n * However, when styling a Motion component `styled(motion.div)`, both packages pass through *all* props\n * as it's seen as an arbitrary component rather than a DOM node. Motion only allows arbitrary props\n * passed through the `custom` prop so it doesn't *need* the payload or computational overhead of\n * `@emotion/is-prop-valid`, however to fix this problem we need to use it.\n *\n * By making it an optionalDependency we can offer this functionality only in the situations where it's\n * actually required.\n */\ntry {\n    /**\n     * We attempt to import this package but require won't be defined in esm environments, in that case\n     * isPropValid will have to be provided via `MotionContext`. In a 6.0.0 this should probably be removed\n     * in favour of explicit injection.\n     *\n     * String concatenation prevents bundlers like webpack (e.g. Storybook)\n     * from statically resolving this optional dependency at build time.\n     */\n    const emotionPkg = \"@emotion/is-prop-\" + \"valid\";\n    loadExternalIsValidProp(require(emotionPkg).default);\n}\ncatch {\n    // We don't need to actually do anything here - the fallback is the existing `isPropValid`.\n}\nfunction filterProps(props, isDom, forwardMotionProps) {\n    const filteredProps = {};\n    for (const key in props) {\n        /**\n         * values is considered a valid prop by Emotion, so if it's present\n         * this will be rendered out to the DOM unless explicitly filtered.\n         *\n         * We check the type as it could be used with the `feColorMatrix`\n         * element, which we support.\n         */\n        if (key === \"values\" && typeof props.values === \"object\")\n            continue;\n        if (isMotionValue(props[key]))\n            continue;\n        if (shouldForward(key) ||\n            (forwardMotionProps === true && isValidMotionProp(key)) ||\n            (!isDom && !isValidMotionProp(key)) ||\n            // If trying to use native HTML drag events, forward drag listeners\n            (props[\"draggable\"] &&\n                key.startsWith(\"onDrag\"))) {\n            filteredProps[key] =\n                props[key];\n        }\n    }\n    return filteredProps;\n}\n\nexport { filterProps, loadExternalIsValidProp };\n//# sourceMappingURL=filter-props.mjs.map\n","\"use client\";\nimport { createContext } from 'react';\n\nconst MotionContext = /* @__PURE__ */ createContext({});\n\nexport { MotionContext };\n//# sourceMappingURL=index.mjs.map\n","import { isControllingVariants, isVariantLabel } from 'motion-dom';\n\nfunction getCurrentTreeVariants(props, context) {\n    if (isControllingVariants(props)) {\n        const { initial, animate } = props;\n        return {\n            initial: initial === false || isVariantLabel(initial)\n                ? initial\n                : undefined,\n            animate: isVariantLabel(animate) ? animate : undefined,\n        };\n    }\n    return props.inherit !== false ? context : {};\n}\n\nexport { getCurrentTreeVariants };\n//# sourceMappingURL=utils.mjs.map\n","\"use client\";\nimport { useContext, useMemo } from 'react';\nimport { MotionContext } from './index.mjs';\nimport { getCurrentTreeVariants } from './utils.mjs';\n\nfunction useCreateMotionContext(props) {\n    const { initial, animate } = getCurrentTreeVariants(props, useContext(MotionContext));\n    return useMemo(() => ({ initial, animate }), [variantLabelsAsDependency(initial), variantLabelsAsDependency(animate)]);\n}\nfunction variantLabelsAsDependency(prop) {\n    return Array.isArray(prop) ? prop.join(\" \") : prop;\n}\n\nexport { useCreateMotionContext };\n//# sourceMappingURL=create.mjs.map\n","const createHtmlRenderState = () => ({\n    style: {},\n    transform: {},\n    transformOrigin: {},\n    vars: {},\n});\n\nexport { createHtmlRenderState };\n//# sourceMappingURL=create-render-state.mjs.map\n","\"use client\";\nimport { isMotionValue, isForcedMotionValue, buildHTMLStyles } from 'motion-dom';\nimport { useMemo } from 'react';\nimport { createHtmlRenderState } from './utils/create-render-state.mjs';\n\nfunction copyRawValuesOnly(target, source, props) {\n    for (const key in source) {\n        if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) {\n            target[key] = source[key];\n        }\n    }\n}\nfunction useInitialMotionValues({ transformTemplate }, visualState) {\n    return useMemo(() => {\n        const state = createHtmlRenderState();\n        buildHTMLStyles(state, visualState, transformTemplate);\n        return Object.assign({}, state.vars, state.style);\n    }, [visualState]);\n}\nfunction useStyle(props, visualState) {\n    const styleProp = props.style || {};\n    const style = {};\n    /**\n     * Copy non-Motion Values straight into style\n     */\n    copyRawValuesOnly(style, styleProp, props);\n    Object.assign(style, useInitialMotionValues(props, visualState));\n    return style;\n}\nfunction useHTMLProps(props, visualState) {\n    // The `any` isn't ideal but it is the type of createElement props argument\n    const htmlProps = {};\n    const style = useStyle(props, visualState);\n    if (props.drag && props.dragListener !== false) {\n        // Disable the ghost element when a user drags\n        htmlProps.draggable = false;\n        // Disable text selection\n        style.userSelect =\n            style.WebkitUserSelect =\n                style.WebkitTouchCallout =\n                    \"none\";\n        // Disable scrolling on the draggable direction\n        style.touchAction =\n            props.drag === true\n                ? \"none\"\n                : `pan-${props.drag === \"x\" ? \"y\" : \"x\"}`;\n    }\n    if (props.tabIndex === undefined &&\n        (props.onTap || props.onTapStart || props.whileTap)) {\n        htmlProps.tabIndex = 0;\n    }\n    htmlProps.style = style;\n    return htmlProps;\n}\n\nexport { copyRawValuesOnly, useHTMLProps };\n//# sourceMappingURL=use-props.mjs.map\n","import { createHtmlRenderState } from '../../html/utils/create-render-state.mjs';\n\nconst createSvgRenderState = () => ({\n    ...createHtmlRenderState(),\n    attrs: {},\n});\n\nexport { createSvgRenderState };\n//# sourceMappingURL=create-render-state.mjs.map\n","\"use client\";\nimport { buildSVGAttrs, isSVGTag } from 'motion-dom';\nimport { useMemo } from 'react';\nimport { copyRawValuesOnly } from '../html/use-props.mjs';\nimport { createSvgRenderState } from './utils/create-render-state.mjs';\n\nfunction useSVGProps(props, visualState, _isStatic, Component) {\n    const visualProps = useMemo(() => {\n        const state = createSvgRenderState();\n        buildSVGAttrs(state, visualState, isSVGTag(Component), props.transformTemplate, props.style);\n        return {\n            ...state.attrs,\n            style: { ...state.style },\n        };\n    }, [visualState]);\n    if (props.style) {\n        const rawStyles = {};\n        copyRawValuesOnly(rawStyles, props.style, props);\n        visualProps.style = { ...rawStyles, ...visualProps.style };\n    }\n    return visualProps;\n}\n\nexport { useSVGProps };\n//# sourceMappingURL=use-props.mjs.map\n","/**\n * We keep these listed separately as we use the lowercase tag names as part\n * of the runtime bundle to detect SVG components\n */\nconst lowercaseSVGElements = [\n    \"animate\",\n    \"circle\",\n    \"defs\",\n    \"desc\",\n    \"ellipse\",\n    \"g\",\n    \"image\",\n    \"line\",\n    \"filter\",\n    \"marker\",\n    \"mask\",\n    \"metadata\",\n    \"path\",\n    \"pattern\",\n    \"polygon\",\n    \"polyline\",\n    \"rect\",\n    \"stop\",\n    \"switch\",\n    \"symbol\",\n    \"svg\",\n    \"text\",\n    \"tspan\",\n    \"use\",\n    \"view\",\n];\n\nexport { lowercaseSVGElements };\n//# sourceMappingURL=lowercase-elements.mjs.map\n","import { lowercaseSVGElements } from '../../svg/lowercase-elements.mjs';\n\nfunction isSVGComponent(Component) {\n    if (\n    /**\n     * If it's not a string, it's a custom React component. Currently we only support\n     * HTML custom React components.\n     */\n    typeof Component !== \"string\" ||\n        /**\n         * If it contains a dash, the element is a custom HTML webcomponent.\n         */\n        Component.includes(\"-\")) {\n        return false;\n    }\n    else if (\n    /**\n     * If it's in our list of lowercase SVG tags, it's an SVG component\n     */\n    lowercaseSVGElements.indexOf(Component) > -1 ||\n        /**\n         * If it contains a capital letter, it's an SVG component\n         */\n        /[A-Z]/u.test(Component)) {\n        return true;\n    }\n    return false;\n}\n\nexport { isSVGComponent };\n//# sourceMappingURL=is-svg-component.mjs.map\n","\"use client\";\nimport { isMotionValue } from 'motion-dom';\nimport { Fragment, useMemo, createElement } from 'react';\nimport { useHTMLProps } from '../html/use-props.mjs';\nimport { useSVGProps } from '../svg/use-props.mjs';\nimport { filterProps } from './utils/filter-props.mjs';\nimport { isSVGComponent } from './utils/is-svg-component.mjs';\n\nfunction useRender(Component, props, ref, { latestValues, }, isStatic, forwardMotionProps = false, isSVG) {\n    const useVisualProps = (isSVG ?? isSVGComponent(Component)) ? useSVGProps : useHTMLProps;\n    const visualProps = useVisualProps(props, latestValues, isStatic, Component);\n    const filteredProps = filterProps(props, typeof Component === \"string\", forwardMotionProps);\n    const elementProps = Component !== Fragment ? { ...filteredProps, ...visualProps, ref } : {};\n    /**\n     * If component has been handed a motion value as its child,\n     * memoise its initial value and render that. Subsequent updates\n     * will be handled by the onChange handler\n     */\n    const { children } = props;\n    const renderedChildren = useMemo(() => (isMotionValue(children) ? children.get() : children), [children]);\n    return createElement(Component, {\n        ...elementProps,\n        children: renderedChildren,\n    });\n}\n\nexport { useRender };\n//# sourceMappingURL=use-render.mjs.map\n","\"use client\";\nimport { resolveMotionValue, isControllingVariants, isVariantNode, isAnimationControls, resolveVariantFromProps } from 'motion-dom';\nimport { useContext } from 'react';\nimport { MotionContext } from '../../context/MotionContext/index.mjs';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\n\nfunction makeState({ scrapeMotionValuesFromProps, createRenderState, }, props, context, presenceContext) {\n    const state = {\n        latestValues: makeLatestValues(props, context, presenceContext, scrapeMotionValuesFromProps),\n        renderState: createRenderState(),\n    };\n    return state;\n}\nfunction makeLatestValues(props, context, presenceContext, scrapeMotionValues) {\n    const values = {};\n    const motionValues = scrapeMotionValues(props, {});\n    for (const key in motionValues) {\n        values[key] = resolveMotionValue(motionValues[key]);\n    }\n    let { initial, animate } = props;\n    const isControllingVariants$1 = isControllingVariants(props);\n    const isVariantNode$1 = isVariantNode(props);\n    if (context &&\n        isVariantNode$1 &&\n        !isControllingVariants$1 &&\n        props.inherit !== false) {\n        if (initial === undefined)\n            initial = context.initial;\n        if (animate === undefined)\n            animate = context.animate;\n    }\n    let isInitialAnimationBlocked = presenceContext\n        ? presenceContext.initial === false\n        : false;\n    isInitialAnimationBlocked = isInitialAnimationBlocked || initial === false;\n    const variantToSet = isInitialAnimationBlocked ? animate : initial;\n    if (variantToSet &&\n        typeof variantToSet !== \"boolean\" &&\n        !isAnimationControls(variantToSet)) {\n        const list = Array.isArray(variantToSet) ? variantToSet : [variantToSet];\n        for (let i = 0; i < list.length; i++) {\n            const resolved = resolveVariantFromProps(props, list[i]);\n            if (resolved) {\n                const { transitionEnd, transition, ...target } = resolved;\n                for (const key in target) {\n                    let valueTarget = target[key];\n                    if (Array.isArray(valueTarget)) {\n                        /**\n                         * Take final keyframe if the initial animation is blocked because\n                         * we want to initialise at the end of that blocked animation.\n                         */\n                        const index = isInitialAnimationBlocked\n                            ? valueTarget.length - 1\n                            : 0;\n                        valueTarget = valueTarget[index];\n                    }\n                    if (valueTarget !== null) {\n                        values[key] = valueTarget;\n                    }\n                }\n                for (const key in transitionEnd) {\n                    values[key] = transitionEnd[key];\n                }\n            }\n        }\n    }\n    return values;\n}\nconst makeUseVisualState = (config) => (props, isStatic) => {\n    const context = useContext(MotionContext);\n    const presenceContext = useContext(PresenceContext);\n    const make = () => makeState(config, props, context, presenceContext);\n    return isStatic ? make() : useConstant(make);\n};\n\nexport { makeUseVisualState };\n//# sourceMappingURL=use-visual-state.mjs.map\n","\"use client\";\nimport { scrapeHTMLMotionValuesFromProps } from 'motion-dom';\nimport { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';\nimport { createHtmlRenderState } from './utils/create-render-state.mjs';\n\nconst useHTMLVisualState = /*@__PURE__*/ makeUseVisualState({\n    scrapeMotionValuesFromProps: scrapeHTMLMotionValuesFromProps,\n    createRenderState: createHtmlRenderState,\n});\n\nexport { useHTMLVisualState };\n//# sourceMappingURL=use-html-visual-state.mjs.map\n","\"use client\";\nimport { scrapeSVGMotionValuesFromProps } from 'motion-dom';\nimport { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';\nimport { createSvgRenderState } from './utils/create-render-state.mjs';\n\nconst useSVGVisualState = /*@__PURE__*/ makeUseVisualState({\n    scrapeMotionValuesFromProps: scrapeSVGMotionValuesFromProps,\n    createRenderState: createSvgRenderState,\n});\n\nexport { useSVGVisualState };\n//# sourceMappingURL=use-svg-visual-state.mjs.map\n","const motionComponentSymbol = Symbol.for(\"motionComponentSymbol\");\n\nexport { motionComponentSymbol };\n//# sourceMappingURL=symbol.mjs.map\n","\"use client\";\nimport { useRef, useInsertionEffect, useCallback } from 'react';\n\n/**\n * Creates a ref function that, when called, hydrates the provided\n * external ref and VisualElement.\n */\nfunction useMotionRef(visualState, visualElement, externalRef) {\n    /**\n     * Store externalRef in a ref to avoid including it in the useCallback\n     * dependency array. Including externalRef in dependencies causes issues\n     * with libraries like Radix UI that create new callback refs on each render\n     * when using asChild - this would cause the callback to be recreated,\n     * triggering element remounts and breaking AnimatePresence exit animations.\n     */\n    const externalRefContainer = useRef(externalRef);\n    useInsertionEffect(() => {\n        externalRefContainer.current = externalRef;\n    });\n    // Store cleanup function returned by callback refs (React 19 feature)\n    const refCleanup = useRef(null);\n    return useCallback((instance) => {\n        if (instance) {\n            visualState.onMount?.(instance);\n        }\n        const ref = externalRefContainer.current;\n        if (typeof ref === \"function\") {\n            if (instance) {\n                const cleanup = ref(instance);\n                if (typeof cleanup === \"function\") {\n                    refCleanup.current = cleanup;\n                }\n            }\n            else if (refCleanup.current) {\n                refCleanup.current();\n                refCleanup.current = null;\n            }\n            else {\n                ref(instance);\n            }\n        }\n        else if (ref) {\n            ref.current = instance;\n        }\n        if (visualElement) {\n            instance ? visualElement.mount(instance) : visualElement.unmount();\n        }\n    }, [visualElement]);\n}\n\nexport { useMotionRef };\n//# sourceMappingURL=use-motion-ref.mjs.map\n","\"use client\";\nimport { createContext } from 'react';\n\n/**\n * Internal, exported only for usage in Framer\n */\nconst SwitchLayoutGroupContext = createContext({});\n\nexport { SwitchLayoutGroupContext };\n//# sourceMappingURL=SwitchLayoutGroupContext.mjs.map\n","function isRefObject(ref) {\n    return (ref &&\n        typeof ref === \"object\" &&\n        Object.prototype.hasOwnProperty.call(ref, \"current\"));\n}\n\nexport { isRefObject };\n//# sourceMappingURL=is-ref-object.mjs.map\n","\"use client\";\nimport { optimizedAppearDataAttribute } from 'motion-dom';\nimport { useContext, useRef, useInsertionEffect, useEffect } from 'react';\nimport { LazyContext } from '../../context/LazyContext.mjs';\nimport { MotionConfigContext } from '../../context/MotionConfigContext.mjs';\nimport { MotionContext } from '../../context/MotionContext/index.mjs';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { SwitchLayoutGroupContext } from '../../context/SwitchLayoutGroupContext.mjs';\nimport { isRefObject } from '../../utils/is-ref-object.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\n\nfunction useVisualElement(Component, visualState, props, createVisualElement, ProjectionNodeConstructor, isSVG) {\n    const { visualElement: parent } = useContext(MotionContext);\n    const lazyContext = useContext(LazyContext);\n    const presenceContext = useContext(PresenceContext);\n    const motionConfig = useContext(MotionConfigContext);\n    const reducedMotionConfig = motionConfig.reducedMotion;\n    const skipAnimations = motionConfig.skipAnimations;\n    const visualElementRef = useRef(null);\n    /**\n     * Track whether the component has been through React's commit phase.\n     * Used to detect when LazyMotion features load after the component has mounted.\n     */\n    const hasMountedOnce = useRef(false);\n    /**\n     * If we haven't preloaded a renderer, check to see if we have one lazy-loaded\n     */\n    createVisualElement =\n        createVisualElement ||\n            lazyContext.renderer;\n    if (!visualElementRef.current && createVisualElement) {\n        visualElementRef.current = createVisualElement(Component, {\n            visualState,\n            parent,\n            props,\n            presenceContext,\n            blockInitialAnimation: presenceContext\n                ? presenceContext.initial === false\n                : false,\n            reducedMotionConfig,\n            skipAnimations,\n            isSVG,\n        });\n        /**\n         * If the component has already mounted before features loaded (e.g. via\n         * LazyMotion with async feature loading), we need to force the initial\n         * animation to run. Otherwise state changes that occurred before features\n         * loaded will be lost and the element will snap to its final state.\n         */\n        if (hasMountedOnce.current && visualElementRef.current) {\n            visualElementRef.current.manuallyAnimateOnMount = true;\n        }\n    }\n    const visualElement = visualElementRef.current;\n    /**\n     * Load Motion gesture and animation features. These are rendered as renderless\n     * components so each feature can optionally make use of React lifecycle methods.\n     */\n    const initialLayoutGroupConfig = useContext(SwitchLayoutGroupContext);\n    if (visualElement &&\n        !visualElement.projection &&\n        ProjectionNodeConstructor &&\n        (visualElement.type === \"html\" || visualElement.type === \"svg\")) {\n        createProjectionNode(visualElementRef.current, props, ProjectionNodeConstructor, initialLayoutGroupConfig);\n    }\n    const isMounted = useRef(false);\n    useInsertionEffect(() => {\n        /**\n         * Check the component has already mounted before calling\n         * `update` unnecessarily. This ensures we skip the initial update.\n         */\n        if (visualElement && isMounted.current) {\n            visualElement.update(props, presenceContext);\n        }\n    });\n    /**\n     * Cache this value as we want to know whether HandoffAppearAnimations\n     * was present on initial render - it will be deleted after this.\n     */\n    const optimisedAppearId = props[optimizedAppearDataAttribute];\n    const wantsHandoff = useRef(Boolean(optimisedAppearId) &&\n        typeof window !== \"undefined\" &&\n        !window.MotionHandoffIsComplete?.(optimisedAppearId) &&\n        window.MotionHasOptimisedAnimation?.(optimisedAppearId));\n    useIsomorphicLayoutEffect(() => {\n        /**\n         * Track that this component has mounted. This is used to detect when\n         * LazyMotion features load after the component has already committed.\n         */\n        hasMountedOnce.current = true;\n        if (!visualElement)\n            return;\n        isMounted.current = true;\n        window.MotionIsMounted = true;\n        visualElement.updateFeatures();\n        visualElement.scheduleRenderMicrotask();\n        /**\n         * Ideally this function would always run in a useEffect.\n         *\n         * However, if we have optimised appear animations to handoff from,\n         * it needs to happen synchronously to ensure there's no flash of\n         * incorrect styles in the event of a hydration error.\n         *\n         * So if we detect a situtation where optimised appear animations\n         * are running, we use useLayoutEffect to trigger animations.\n         */\n        if (wantsHandoff.current && visualElement.animationState) {\n            visualElement.animationState.animateChanges();\n        }\n    });\n    useEffect(() => {\n        if (!visualElement)\n            return;\n        if (!wantsHandoff.current && visualElement.animationState) {\n            visualElement.animationState.animateChanges();\n        }\n        if (wantsHandoff.current) {\n            // This ensures all future calls to animateChanges() in this component will run in useEffect\n            queueMicrotask(() => {\n                window.MotionHandoffMarkAsComplete?.(optimisedAppearId);\n            });\n            wantsHandoff.current = false;\n        }\n        /**\n         * Now we've finished triggering animations for this element we\n         * can wipe the enteringChildren set for the next render.\n         */\n        visualElement.enteringChildren = undefined;\n    });\n    return visualElement;\n}\nfunction createProjectionNode(visualElement, props, ProjectionNodeConstructor, initialPromotionConfig) {\n    const { layoutId, layout, drag, dragConstraints, layoutScroll, layoutRoot, layoutAnchor, layoutCrossfade, } = props;\n    visualElement.projection = new ProjectionNodeConstructor(visualElement.latestValues, props[\"data-framer-portal-id\"]\n        ? undefined\n        : getClosestProjectingNode(visualElement.parent));\n    visualElement.projection.setOptions({\n        layoutId,\n        layout,\n        alwaysMeasureLayout: Boolean(drag) || (dragConstraints && isRefObject(dragConstraints)),\n        visualElement,\n        /**\n         * TODO: Update options in an effect. This could be tricky as it'll be too late\n         * to update by the time layout animations run.\n         * We also need to fix this safeToRemove by linking it up to the one returned by usePresence,\n         * ensuring it gets called if there's no potential layout animations.\n         *\n         */\n        animationType: typeof layout === \"string\" ? layout : \"both\",\n        initialPromotionConfig,\n        crossfade: layoutCrossfade,\n        layoutScroll,\n        layoutRoot,\n        layoutAnchor,\n    });\n}\nfunction getClosestProjectingNode(visualElement) {\n    if (!visualElement)\n        return undefined;\n    return visualElement.options.allowProjection !== false\n        ? visualElement.projection\n        : getClosestProjectingNode(visualElement.parent);\n}\n\nexport { useVisualElement };\n//# sourceMappingURL=use-visual-element.mjs.map\n","\"use client\";\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { warning, invariant } from 'motion-utils';\nimport { forwardRef, useContext } from 'react';\nimport { LayoutGroupContext } from '../context/LayoutGroupContext.mjs';\nimport { LazyContext } from '../context/LazyContext.mjs';\nimport { MotionConfigContext } from '../context/MotionConfigContext.mjs';\nimport { MotionContext } from '../context/MotionContext/index.mjs';\nimport { useCreateMotionContext } from '../context/MotionContext/create.mjs';\nimport { useRender } from '../render/dom/use-render.mjs';\nimport { isSVGComponent } from '../render/dom/utils/is-svg-component.mjs';\nimport { useHTMLVisualState } from '../render/html/use-html-visual-state.mjs';\nimport { useSVGVisualState } from '../render/svg/use-svg-visual-state.mjs';\nimport { getInitializedFeatureDefinitions } from './features/definitions.mjs';\nimport { loadFeatures } from './features/load-features.mjs';\nimport { motionComponentSymbol } from './utils/symbol.mjs';\nimport { useMotionRef } from './utils/use-motion-ref.mjs';\nimport { useVisualElement } from './utils/use-visual-element.mjs';\n\n/**\n * Create a `motion` component.\n *\n * This function accepts a Component argument, which can be either a string (ie \"div\"\n * for `motion.div`), or an actual React component.\n *\n * Alongside this is a config option which provides a way of rendering the provided\n * component \"offline\", or outside the React render cycle.\n */\nfunction createMotionComponent(Component, { forwardMotionProps = false, type } = {}, preloadedFeatures, createVisualElement) {\n    preloadedFeatures && loadFeatures(preloadedFeatures);\n    /**\n     * Determine whether to use SVG or HTML rendering based on:\n     * 1. Explicit `type` option (highest priority)\n     * 2. Auto-detection via `isSVGComponent`\n     */\n    const isSVG = type ? type === \"svg\" : isSVGComponent(Component);\n    const useVisualState = isSVG ? useSVGVisualState : useHTMLVisualState;\n    function MotionDOMComponent(props, externalRef) {\n        /**\n         * If we need to measure the element we load this functionality in a\n         * separate class component in order to gain access to getSnapshotBeforeUpdate.\n         */\n        let MeasureLayout;\n        const configAndProps = {\n            ...useContext(MotionConfigContext),\n            ...props,\n            layoutId: useLayoutId(props),\n        };\n        const { isStatic } = configAndProps;\n        const context = useCreateMotionContext(props);\n        const visualState = useVisualState(props, isStatic);\n        if (!isStatic && typeof window !== \"undefined\") {\n            useStrictMode(configAndProps, preloadedFeatures);\n            const layoutProjection = getProjectionFunctionality(configAndProps);\n            MeasureLayout = layoutProjection.MeasureLayout;\n            /**\n             * Create a VisualElement for this component. A VisualElement provides a common\n             * interface to renderer-specific APIs (ie DOM/Three.js etc) as well as\n             * providing a way of rendering to these APIs outside of the React render loop\n             * for more performant animations and interactions\n             */\n            context.visualElement = useVisualElement(Component, visualState, configAndProps, createVisualElement, layoutProjection.ProjectionNode, isSVG);\n        }\n        /**\n         * The mount order and hierarchy is specific to ensure our element ref\n         * is hydrated by the time features fire their effects.\n         */\n        return (jsxs(MotionContext.Provider, { value: context, children: [MeasureLayout && context.visualElement ? (jsx(MeasureLayout, { visualElement: context.visualElement, ...configAndProps })) : null, useRender(Component, props, useMotionRef(visualState, context.visualElement, externalRef), visualState, isStatic, forwardMotionProps, isSVG)] }));\n    }\n    MotionDOMComponent.displayName = `motion.${typeof Component === \"string\"\n        ? Component\n        : `create(${Component.displayName ?? Component.name ?? \"\"})`}`;\n    const ForwardRefMotionComponent = forwardRef(MotionDOMComponent);\n    ForwardRefMotionComponent[motionComponentSymbol] = Component;\n    return ForwardRefMotionComponent;\n}\nfunction useLayoutId({ layoutId }) {\n    const layoutGroupId = useContext(LayoutGroupContext).id;\n    return layoutGroupId && layoutId !== undefined\n        ? layoutGroupId + \"-\" + layoutId\n        : layoutId;\n}\nfunction useStrictMode(configAndProps, preloadedFeatures) {\n    const isStrict = useContext(LazyContext).strict;\n    /**\n     * If we're in development mode, check to make sure we're not rendering a motion component\n     * as a child of LazyMotion, as this will break the file-size benefits of using it.\n     */\n    if (process.env.NODE_ENV !== \"production\" &&\n        preloadedFeatures &&\n        isStrict) {\n        const strictMessage = \"You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.\";\n        configAndProps.ignoreStrict\n            ? warning(false, strictMessage, \"lazy-strict-mode\")\n            : invariant(false, strictMessage, \"lazy-strict-mode\");\n    }\n}\nfunction getProjectionFunctionality(props) {\n    const featureDefinitions = getInitializedFeatureDefinitions();\n    const { drag, layout } = featureDefinitions;\n    if (!drag && !layout)\n        return {};\n    const combined = { ...drag, ...layout };\n    return {\n        MeasureLayout: drag?.isEnabled(props) || layout?.isEnabled(props)\n            ? combined.MeasureLayout\n            : undefined,\n        ProjectionNode: combined.ProjectionNode,\n    };\n}\n\nexport { createMotionComponent };\n//# sourceMappingURL=index.mjs.map\n","import { warnOnce } from 'motion-utils';\nimport { createMotionComponent } from '../../motion/index.mjs';\n\nfunction createMotionProxy(preloadedFeatures, createVisualElement) {\n    if (typeof Proxy === \"undefined\") {\n        return createMotionComponent;\n    }\n    /**\n     * A cache of generated `motion` components, e.g `motion.div`, `motion.input` etc.\n     * Rather than generating them anew every render.\n     */\n    const componentCache = new Map();\n    const factory = (Component, options) => {\n        return createMotionComponent(Component, options, preloadedFeatures, createVisualElement);\n    };\n    /**\n     * Support for deprecated`motion(Component)` pattern\n     */\n    const deprecatedFactoryFunction = (Component, options) => {\n        if (process.env.NODE_ENV !== \"production\") {\n            warnOnce(false, \"motion() is deprecated. Use motion.create() instead.\");\n        }\n        return factory(Component, options);\n    };\n    return new Proxy(deprecatedFactoryFunction, {\n        /**\n         * Called when `motion` is referenced with a prop: `motion.div`, `motion.input` etc.\n         * The prop name is passed through as `key` and we can use that to generate a `motion`\n         * DOM component with that name.\n         */\n        get: (_target, key) => {\n            if (key === \"create\")\n                return factory;\n            /**\n             * If this element doesn't exist in the component cache, create it and cache.\n             */\n            if (!componentCache.has(key)) {\n                componentCache.set(key, createMotionComponent(key, undefined, preloadedFeatures, createVisualElement));\n            }\n            return componentCache.get(key);\n        },\n    });\n}\n\nexport { createMotionProxy };\n//# sourceMappingURL=create-proxy.mjs.map\n","import { SVGVisualElement, HTMLVisualElement } from 'motion-dom';\nimport { Fragment } from 'react';\nimport { isSVGComponent } from './utils/is-svg-component.mjs';\n\nconst createDomVisualElement = (Component, options) => {\n    /**\n     * Use explicit isSVG override if provided, otherwise auto-detect\n     */\n    const isSVG = options.isSVG ?? isSVGComponent(Component);\n    return isSVG\n        ? new SVGVisualElement(options)\n        : new HTMLVisualElement(options, {\n            allowProjection: Component !== Fragment,\n        });\n};\n\nexport { createDomVisualElement };\n//# sourceMappingURL=create-visual-element.mjs.map\n","import { Feature, createAnimationState, isAnimationControls } from 'motion-dom';\n\nclass AnimationFeature extends Feature {\n    /**\n     * We dynamically generate the AnimationState manager as it contains a reference\n     * to the underlying animation library. We only want to load that if we load this,\n     * so people can optionally code split it out using the `m` component.\n     */\n    constructor(node) {\n        super(node);\n        node.animationState || (node.animationState = createAnimationState(node));\n    }\n    updateAnimationControlsSubscription() {\n        const { animate } = this.node.getProps();\n        if (isAnimationControls(animate)) {\n            this.unmountControls = animate.subscribe(this.node);\n        }\n    }\n    /**\n     * Subscribe any provided AnimationControls to the component's VisualElement\n     */\n    mount() {\n        this.updateAnimationControlsSubscription();\n    }\n    update() {\n        const { animate } = this.node.getProps();\n        const { animate: prevAnimate } = this.node.prevProps || {};\n        if (animate !== prevAnimate) {\n            this.updateAnimationControlsSubscription();\n        }\n    }\n    unmount() {\n        this.node.animationState.reset();\n        this.unmountControls?.();\n    }\n}\n\nexport { AnimationFeature };\n//# sourceMappingURL=index.mjs.map\n","import { Feature, resolveVariant } from 'motion-dom';\n\nlet id = 0;\nclass ExitAnimationFeature extends Feature {\n    constructor() {\n        super(...arguments);\n        this.id = id++;\n        this.isExitComplete = false;\n    }\n    update() {\n        if (!this.node.presenceContext)\n            return;\n        const { isPresent, onExitComplete } = this.node.presenceContext;\n        const { isPresent: prevIsPresent } = this.node.prevPresenceContext || {};\n        if (!this.node.animationState || isPresent === prevIsPresent) {\n            return;\n        }\n        if (isPresent && prevIsPresent === false) {\n            /**\n             * When re-entering, if the exit animation already completed\n             * (element is at rest), reset to initial values so the enter\n             * animation replays from the correct position.\n             */\n            if (this.isExitComplete) {\n                const { initial, custom } = this.node.getProps();\n                if (typeof initial === \"string\") {\n                    const resolved = resolveVariant(this.node, initial, custom);\n                    if (resolved) {\n                        const { transition, transitionEnd, ...target } = resolved;\n                        for (const key in target) {\n                            this.node\n                                .getValue(key)\n                                ?.jump(target[key]);\n                        }\n                    }\n                }\n                this.node.animationState.reset();\n                this.node.animationState.animateChanges();\n            }\n            else {\n                this.node.animationState.setActive(\"exit\", false);\n            }\n            this.isExitComplete = false;\n            return;\n        }\n        const exitAnimation = this.node.animationState.setActive(\"exit\", !isPresent);\n        if (onExitComplete && !isPresent) {\n            exitAnimation.then(() => {\n                this.isExitComplete = true;\n                onExitComplete(this.id);\n            });\n        }\n    }\n    mount() {\n        const { register, onExitComplete } = this.node.presenceContext || {};\n        if (onExitComplete) {\n            onExitComplete(this.id);\n        }\n        if (register) {\n            this.unmount = register(this.id);\n        }\n    }\n    unmount() { }\n}\n\nexport { ExitAnimationFeature };\n//# sourceMappingURL=exit.mjs.map\n","import { AnimationFeature } from './animation/index.mjs';\nimport { ExitAnimationFeature } from './animation/exit.mjs';\n\nconst animations = {\n    animation: {\n        Feature: AnimationFeature,\n    },\n    exit: {\n        Feature: ExitAnimationFeature,\n    },\n};\n\nexport { animations };\n//# sourceMappingURL=animations.mjs.map\n","import { isPrimaryPointer } from 'motion-dom';\n\nfunction extractEventInfo(event) {\n    return {\n        point: {\n            x: event.pageX,\n            y: event.pageY,\n        },\n    };\n}\nconst addPointerInfo = (handler) => (event) => isPrimaryPointer(event) && handler(event, extractEventInfo(event));\n\nexport { addPointerInfo, extractEventInfo };\n//# sourceMappingURL=event-info.mjs.map\n","import { addDomEvent } from 'motion-dom';\nimport { addPointerInfo } from './event-info.mjs';\n\nfunction addPointerEvent(target, eventName, handler, options) {\n    return addDomEvent(target, eventName, addPointerInfo(handler), options);\n}\n\nexport { addPointerEvent };\n//# sourceMappingURL=add-pointer-event.mjs.map\n","// Fixes https://github.com/motiondivision/motion/issues/2270\nconst getContextWindow = ({ current }) => {\n    return current ? current.ownerDocument.defaultView : null;\n};\n\nexport { getContextWindow };\n//# sourceMappingURL=get-context-window.mjs.map\n","const distance = (a, b) => Math.abs(a - b);\nfunction distance2D(a, b) {\n    // Multi-dimensional\n    const xDelta = distance(a.x, b.x);\n    const yDelta = distance(a.y, b.y);\n    return Math.sqrt(xDelta ** 2 + yDelta ** 2);\n}\n\nexport { distance, distance2D };\n//# sourceMappingURL=distance.mjs.map\n","import { frameData, frame, isPrimaryPointer, cancelFrame } from 'motion-dom';\nimport { pipe, secondsToMilliseconds, millisecondsToSeconds } from 'motion-utils';\nimport { addPointerEvent } from '../../events/add-pointer-event.mjs';\nimport { extractEventInfo } from '../../events/event-info.mjs';\nimport { distance2D } from '../../utils/distance.mjs';\n\nconst overflowStyles = /*#__PURE__*/ new Set([\"auto\", \"scroll\"]);\n/**\n * @internal\n */\nclass PanSession {\n    constructor(event, handlers, { transformPagePoint, contextWindow = window, dragSnapToOrigin = false, distanceThreshold = 3, element, } = {}) {\n        /**\n         * @internal\n         */\n        this.startEvent = null;\n        /**\n         * @internal\n         */\n        this.lastMoveEvent = null;\n        /**\n         * @internal\n         */\n        this.lastMoveEventInfo = null;\n        /**\n         * Raw (untransformed) event info, re-transformed each frame\n         * so transformPagePoint sees the current parent matrix.\n         * @internal\n         */\n        this.lastRawMoveEventInfo = null;\n        /**\n         * @internal\n         */\n        this.handlers = {};\n        /**\n         * @internal\n         */\n        this.contextWindow = window;\n        /**\n         * Scroll positions of scrollable ancestors and window.\n         * @internal\n         */\n        this.scrollPositions = new Map();\n        /**\n         * Cleanup function for scroll listeners.\n         * @internal\n         */\n        this.removeScrollListeners = null;\n        this.onElementScroll = (event) => {\n            this.handleScroll(event.target);\n        };\n        this.onWindowScroll = () => {\n            this.handleScroll(window);\n        };\n        this.updatePoint = () => {\n            if (!(this.lastMoveEvent && this.lastMoveEventInfo))\n                return;\n            // Re-transform raw point through current transformPagePoint so\n            // animated parent transforms (e.g. rotation) are picked up each frame\n            if (this.lastRawMoveEventInfo) {\n                this.lastMoveEventInfo = transformPoint(this.lastRawMoveEventInfo, this.transformPagePoint);\n            }\n            const info = getPanInfo(this.lastMoveEventInfo, this.history);\n            const isPanStarted = this.startEvent !== null;\n            // Only start panning if the offset is larger than 3 pixels. If we make it\n            // any larger than this we'll want to reset the pointer history\n            // on the first update to avoid visual snapping to the cursor.\n            const isDistancePastThreshold = distance2D(info.offset, { x: 0, y: 0 }) >= this.distanceThreshold;\n            if (!isPanStarted && !isDistancePastThreshold)\n                return;\n            const { point } = info;\n            const { timestamp } = frameData;\n            this.history.push({ ...point, timestamp });\n            const { onStart, onMove } = this.handlers;\n            if (!isPanStarted) {\n                onStart && onStart(this.lastMoveEvent, info);\n                this.startEvent = this.lastMoveEvent;\n            }\n            onMove && onMove(this.lastMoveEvent, info);\n        };\n        this.handlePointerMove = (event, info) => {\n            this.lastMoveEvent = event;\n            this.lastRawMoveEventInfo = info;\n            this.lastMoveEventInfo = transformPoint(info, this.transformPagePoint);\n            // Throttle mouse move event to once per frame\n            frame.update(this.updatePoint, true);\n        };\n        this.handlePointerUp = (event, info) => {\n            this.end();\n            const { onEnd, onSessionEnd, resumeAnimation } = this.handlers;\n            // Resume animation if dragSnapToOrigin is set OR if no drag started (user just clicked)\n            // This ensures constraint animations continue when interrupted by a click\n            if (this.dragSnapToOrigin || !this.startEvent) {\n                resumeAnimation && resumeAnimation();\n            }\n            if (!(this.lastMoveEvent && this.lastMoveEventInfo))\n                return;\n            const panInfo = getPanInfo(event.type === \"pointercancel\"\n                ? this.lastMoveEventInfo\n                : transformPoint(info, this.transformPagePoint), this.history);\n            if (this.startEvent && onEnd) {\n                onEnd(event, panInfo);\n            }\n            onSessionEnd && onSessionEnd(event, panInfo);\n        };\n        // If we have more than one touch, don't start detecting this gesture\n        if (!isPrimaryPointer(event))\n            return;\n        this.dragSnapToOrigin = dragSnapToOrigin;\n        this.handlers = handlers;\n        this.transformPagePoint = transformPagePoint;\n        this.distanceThreshold = distanceThreshold;\n        this.contextWindow = contextWindow || window;\n        const info = extractEventInfo(event);\n        const initialInfo = transformPoint(info, this.transformPagePoint);\n        const { point } = initialInfo;\n        const { timestamp } = frameData;\n        this.history = [{ ...point, timestamp }];\n        const { onSessionStart } = handlers;\n        onSessionStart &&\n            onSessionStart(event, getPanInfo(initialInfo, this.history));\n        this.removeListeners = pipe(addPointerEvent(this.contextWindow, \"pointermove\", this.handlePointerMove), addPointerEvent(this.contextWindow, \"pointerup\", this.handlePointerUp), addPointerEvent(this.contextWindow, \"pointercancel\", this.handlePointerUp));\n        // Start scroll tracking if element provided\n        if (element) {\n            this.startScrollTracking(element);\n        }\n    }\n    /**\n     * Start tracking scroll on ancestors and window.\n     */\n    startScrollTracking(element) {\n        // Store initial scroll positions for scrollable ancestors\n        let current = element.parentElement;\n        while (current) {\n            const style = getComputedStyle(current);\n            if (overflowStyles.has(style.overflowX) ||\n                overflowStyles.has(style.overflowY)) {\n                this.scrollPositions.set(current, {\n                    x: current.scrollLeft,\n                    y: current.scrollTop,\n                });\n            }\n            current = current.parentElement;\n        }\n        // Track window scroll\n        this.scrollPositions.set(window, {\n            x: window.scrollX,\n            y: window.scrollY,\n        });\n        // Capture listener catches element scroll events as they bubble\n        window.addEventListener(\"scroll\", this.onElementScroll, {\n            capture: true,\n        });\n        // Direct window scroll listener (window scroll doesn't bubble)\n        window.addEventListener(\"scroll\", this.onWindowScroll);\n        this.removeScrollListeners = () => {\n            window.removeEventListener(\"scroll\", this.onElementScroll, {\n                capture: true,\n            });\n            window.removeEventListener(\"scroll\", this.onWindowScroll);\n        };\n    }\n    /**\n     * Handle scroll compensation during drag.\n     *\n     * For element scroll: adjusts history origin since pageX/pageY doesn't change.\n     * For window scroll: adjusts lastMoveEventInfo since pageX/pageY would change.\n     */\n    handleScroll(target) {\n        const initial = this.scrollPositions.get(target);\n        if (!initial)\n            return;\n        const isWindow = target === window;\n        const current = isWindow\n            ? { x: window.scrollX, y: window.scrollY }\n            : {\n                x: target.scrollLeft,\n                y: target.scrollTop,\n            };\n        const delta = { x: current.x - initial.x, y: current.y - initial.y };\n        if (delta.x === 0 && delta.y === 0)\n            return;\n        if (isWindow) {\n            // Window scroll: pageX/pageY changes, so update lastMoveEventInfo\n            if (this.lastMoveEventInfo) {\n                this.lastMoveEventInfo.point.x += delta.x;\n                this.lastMoveEventInfo.point.y += delta.y;\n            }\n        }\n        else {\n            // Element scroll: pageX/pageY unchanged, so adjust history origin\n            if (this.history.length > 0) {\n                this.history[0].x -= delta.x;\n                this.history[0].y -= delta.y;\n            }\n        }\n        this.scrollPositions.set(target, current);\n        frame.update(this.updatePoint, true);\n    }\n    updateHandlers(handlers) {\n        this.handlers = handlers;\n    }\n    end() {\n        this.removeListeners && this.removeListeners();\n        this.removeScrollListeners && this.removeScrollListeners();\n        this.scrollPositions.clear();\n        cancelFrame(this.updatePoint);\n    }\n}\nfunction transformPoint(info, transformPagePoint) {\n    return transformPagePoint ? { point: transformPagePoint(info.point) } : info;\n}\nfunction subtractPoint(a, b) {\n    return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction getPanInfo({ point }, history) {\n    return {\n        point,\n        delta: subtractPoint(point, lastDevicePoint(history)),\n        offset: subtractPoint(point, startDevicePoint(history)),\n        velocity: getVelocity(history, 0.1),\n    };\n}\nfunction startDevicePoint(history) {\n    return history[0];\n}\nfunction lastDevicePoint(history) {\n    return history[history.length - 1];\n}\nfunction getVelocity(history, timeDelta) {\n    if (history.length < 2) {\n        return { x: 0, y: 0 };\n    }\n    let i = history.length - 1;\n    let timestampedPoint = null;\n    const lastPoint = lastDevicePoint(history);\n    while (i >= 0) {\n        timestampedPoint = history[i];\n        if (lastPoint.timestamp - timestampedPoint.timestamp >\n            secondsToMilliseconds(timeDelta)) {\n            break;\n        }\n        i--;\n    }\n    if (!timestampedPoint) {\n        return { x: 0, y: 0 };\n    }\n    /**\n     * If the selected point is the pointer-down origin (history[0]),\n     * there are better movement points available, and the time gap\n     * is suspiciously large (>2x timeDelta), use the next point instead.\n     * This prevents stale pointer-down points from diluting velocity\n     * in hold-then-flick gestures.\n     */\n    if (timestampedPoint === history[0] &&\n        history.length > 2 &&\n        lastPoint.timestamp - timestampedPoint.timestamp >\n            secondsToMilliseconds(timeDelta) * 2) {\n        timestampedPoint = history[1];\n    }\n    const time = millisecondsToSeconds(lastPoint.timestamp - timestampedPoint.timestamp);\n    if (time === 0) {\n        return { x: 0, y: 0 };\n    }\n    const currentVelocity = {\n        x: (lastPoint.x - timestampedPoint.x) / time,\n        y: (lastPoint.y - timestampedPoint.y) / time,\n    };\n    if (currentVelocity.x === Infinity) {\n        currentVelocity.x = 0;\n    }\n    if (currentVelocity.y === Infinity) {\n        currentVelocity.y = 0;\n    }\n    return currentVelocity;\n}\n\nexport { PanSession };\n//# sourceMappingURL=PanSession.mjs.map\n","import { mixNumber, calcLength } from 'motion-dom';\nimport { progress, clamp } from 'motion-utils';\n\n/**\n * Apply constraints to a point. These constraints are both physical along an\n * axis, and an elastic factor that determines how much to constrain the point\n * by if it does lie outside the defined parameters.\n */\nfunction applyConstraints(point, { min, max }, elastic) {\n    if (min !== undefined && point < min) {\n        // If we have a min point defined, and this is outside of that, constrain\n        point = elastic\n            ? mixNumber(min, point, elastic.min)\n            : Math.max(point, min);\n    }\n    else if (max !== undefined && point > max) {\n        // If we have a max point defined, and this is outside of that, constrain\n        point = elastic\n            ? mixNumber(max, point, elastic.max)\n            : Math.min(point, max);\n    }\n    return point;\n}\n/**\n * Calculate constraints in terms of the viewport when defined relatively to the\n * measured axis. This is measured from the nearest edge, so a max constraint of 200\n * on an axis with a max value of 300 would return a constraint of 500 - axis length\n */\nfunction calcRelativeAxisConstraints(axis, min, max) {\n    return {\n        min: min !== undefined ? axis.min + min : undefined,\n        max: max !== undefined\n            ? axis.max + max - (axis.max - axis.min)\n            : undefined,\n    };\n}\n/**\n * Calculate constraints in terms of the viewport when\n * defined relatively to the measured bounding box.\n */\nfunction calcRelativeConstraints(layoutBox, { top, left, bottom, right }) {\n    return {\n        x: calcRelativeAxisConstraints(layoutBox.x, left, right),\n        y: calcRelativeAxisConstraints(layoutBox.y, top, bottom),\n    };\n}\n/**\n * Calculate viewport constraints when defined as another viewport-relative axis\n */\nfunction calcViewportAxisConstraints(layoutAxis, constraintsAxis) {\n    let min = constraintsAxis.min - layoutAxis.min;\n    let max = constraintsAxis.max - layoutAxis.max;\n    // If the constraints axis is actually smaller than the layout axis then we can\n    // flip the constraints\n    if (constraintsAxis.max - constraintsAxis.min <\n        layoutAxis.max - layoutAxis.min) {\n        [min, max] = [max, min];\n    }\n    return { min, max };\n}\n/**\n * Calculate viewport constraints when defined as another viewport-relative box\n */\nfunction calcViewportConstraints(layoutBox, constraintsBox) {\n    return {\n        x: calcViewportAxisConstraints(layoutBox.x, constraintsBox.x),\n        y: calcViewportAxisConstraints(layoutBox.y, constraintsBox.y),\n    };\n}\n/**\n * Calculate a transform origin relative to the source axis, between 0-1, that results\n * in an asthetically pleasing scale/transform needed to project from source to target.\n */\nfunction calcOrigin(source, target) {\n    let origin = 0.5;\n    const sourceLength = calcLength(source);\n    const targetLength = calcLength(target);\n    if (targetLength > sourceLength) {\n        origin = progress(target.min, target.max - sourceLength, source.min);\n    }\n    else if (sourceLength > targetLength) {\n        origin = progress(source.min, source.max - targetLength, target.min);\n    }\n    return clamp(0, 1, origin);\n}\n/**\n * Rebase the calculated viewport constraints relative to the layout.min point.\n */\nfunction rebaseAxisConstraints(layout, constraints) {\n    const relativeConstraints = {};\n    if (constraints.min !== undefined) {\n        relativeConstraints.min = constraints.min - layout.min;\n    }\n    if (constraints.max !== undefined) {\n        relativeConstraints.max = constraints.max - layout.min;\n    }\n    return relativeConstraints;\n}\nconst defaultElastic = 0.35;\n/**\n * Accepts a dragElastic prop and returns resolved elastic values for each axis.\n */\nfunction resolveDragElastic(dragElastic = defaultElastic) {\n    if (dragElastic === false) {\n        dragElastic = 0;\n    }\n    else if (dragElastic === true) {\n        dragElastic = defaultElastic;\n    }\n    return {\n        x: resolveAxisElastic(dragElastic, \"left\", \"right\"),\n        y: resolveAxisElastic(dragElastic, \"top\", \"bottom\"),\n    };\n}\nfunction resolveAxisElastic(dragElastic, minLabel, maxLabel) {\n    return {\n        min: resolvePointElastic(dragElastic, minLabel),\n        max: resolvePointElastic(dragElastic, maxLabel),\n    };\n}\nfunction resolvePointElastic(dragElastic, label) {\n    return typeof dragElastic === \"number\"\n        ? dragElastic\n        : dragElastic[label] || 0;\n}\n\nexport { applyConstraints, calcOrigin, calcRelativeAxisConstraints, calcRelativeConstraints, calcViewportAxisConstraints, calcViewportConstraints, defaultElastic, rebaseAxisConstraints, resolveAxisElastic, resolveDragElastic, resolvePointElastic };\n//# sourceMappingURL=constraints.mjs.map\n","import { createBox, frame, eachAxis, measurePageBox, convertBoxToBoundingBox, convertBoundingBoxToBox, addValueToWillChange, animateMotionValue, mixNumber, addDomEvent, setDragLock, percent, calcLength, resize, isElementTextInput } from 'motion-dom';\nimport { invariant } from 'motion-utils';\nimport { addPointerEvent } from '../../events/add-pointer-event.mjs';\nimport { extractEventInfo } from '../../events/event-info.mjs';\nimport { getContextWindow } from '../../utils/get-context-window.mjs';\nimport { isRefObject } from '../../utils/is-ref-object.mjs';\nimport { PanSession } from '../pan/PanSession.mjs';\nimport { applyConstraints, calcRelativeConstraints, resolveDragElastic, rebaseAxisConstraints, calcViewportConstraints, calcOrigin, defaultElastic } from './utils/constraints.mjs';\n\nconst elementDragControls = new WeakMap();\nclass VisualElementDragControls {\n    constructor(visualElement) {\n        this.openDragLock = null;\n        this.isDragging = false;\n        this.currentDirection = null;\n        this.originPoint = { x: 0, y: 0 };\n        /**\n         * The permitted boundaries of travel, in pixels.\n         */\n        this.constraints = false;\n        this.hasMutatedConstraints = false;\n        /**\n         * The per-axis resolved elastic values.\n         */\n        this.elastic = createBox();\n        /**\n         * The latest pointer event. Used as fallback when the `cancel` and `stop` functions are called without arguments.\n         */\n        this.latestPointerEvent = null;\n        /**\n         * The latest pan info. Used as fallback when the `cancel` and `stop` functions are called without arguments.\n         */\n        this.latestPanInfo = null;\n        this.visualElement = visualElement;\n    }\n    start(originEvent, { snapToCursor = false, distanceThreshold } = {}) {\n        /**\n         * Don't start dragging if this component is exiting\n         */\n        const { presenceContext } = this.visualElement;\n        if (presenceContext && presenceContext.isPresent === false)\n            return;\n        const onSessionStart = (event) => {\n            if (snapToCursor) {\n                this.snapToCursor(extractEventInfo(event).point);\n            }\n            this.stopAnimation();\n        };\n        const onStart = (event, info) => {\n            // Attempt to grab the global drag gesture lock - maybe make this part of PanSession\n            const { drag, dragPropagation, onDragStart } = this.getProps();\n            if (drag && !dragPropagation) {\n                if (this.openDragLock)\n                    this.openDragLock();\n                this.openDragLock = setDragLock(drag);\n                // If we don 't have the lock, don't start dragging\n                if (!this.openDragLock)\n                    return;\n            }\n            this.latestPointerEvent = event;\n            this.latestPanInfo = info;\n            this.isDragging = true;\n            this.currentDirection = null;\n            this.resolveConstraints();\n            if (this.visualElement.projection) {\n                this.visualElement.projection.isAnimationBlocked = true;\n                this.visualElement.projection.target = undefined;\n            }\n            /**\n             * Record gesture origin and pointer offset\n             */\n            eachAxis((axis) => {\n                let current = this.getAxisMotionValue(axis).get() || 0;\n                /**\n                 * If the MotionValue is a percentage value convert to px\n                 */\n                if (percent.test(current)) {\n                    const { projection } = this.visualElement;\n                    if (projection && projection.layout) {\n                        const measuredAxis = projection.layout.layoutBox[axis];\n                        if (measuredAxis) {\n                            const length = calcLength(measuredAxis);\n                            current = length * (parseFloat(current) / 100);\n                        }\n                    }\n                }\n                this.originPoint[axis] = current;\n            });\n            // Fire onDragStart event\n            if (onDragStart) {\n                frame.update(() => onDragStart(event, info), false, true);\n            }\n            addValueToWillChange(this.visualElement, \"transform\");\n            const { animationState } = this.visualElement;\n            animationState && animationState.setActive(\"whileDrag\", true);\n        };\n        const onMove = (event, info) => {\n            this.latestPointerEvent = event;\n            this.latestPanInfo = info;\n            const { dragPropagation, dragDirectionLock, onDirectionLock, onDrag, } = this.getProps();\n            // If we didn't successfully receive the gesture lock, early return.\n            if (!dragPropagation && !this.openDragLock)\n                return;\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                // If we've successfully set a direction, notify listener\n                if (this.currentDirection !== null) {\n                    onDirectionLock && onDirectionLock(this.currentDirection);\n                }\n                return;\n            }\n            // Update each point with the latest position\n            this.updateAxis(\"x\", info.point, offset);\n            this.updateAxis(\"y\", info.point, offset);\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             * 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        const onSessionEnd = (event, info) => {\n            this.latestPointerEvent = event;\n            this.latestPanInfo = info;\n            this.stop(event, info);\n            this.latestPointerEvent = null;\n            this.latestPanInfo = null;\n        };\n        const resumeAnimation = () => {\n            const { dragSnapToOrigin: snap } = this.getProps();\n            if (snap || this.constraints) {\n                this.startAnimation({ x: 0, y: 0 });\n            }\n        };\n        const { dragSnapToOrigin } = this.getProps();\n        this.panSession = new PanSession(originEvent, {\n            onSessionStart,\n            onStart,\n            onMove,\n            onSessionEnd,\n            resumeAnimation,\n        }, {\n            transformPagePoint: this.visualElement.getTransformPagePoint(),\n            dragSnapToOrigin,\n            distanceThreshold,\n            contextWindow: getContextWindow(this.visualElement),\n            element: this.visualElement.current,\n        });\n    }\n    /**\n     * @internal\n     */\n    stop(event, panInfo) {\n        const finalEvent = event || this.latestPointerEvent;\n        const finalPanInfo = panInfo || this.latestPanInfo;\n        const isDragging = this.isDragging;\n        this.cancel();\n        if (!isDragging || !finalPanInfo || !finalEvent)\n            return;\n        const { velocity } = finalPanInfo;\n        this.startAnimation(velocity);\n        const { onDragEnd } = this.getProps();\n        if (onDragEnd) {\n            frame.postRender(() => onDragEnd(finalEvent, finalPanInfo));\n        }\n    }\n    /**\n     * @internal\n     */\n    cancel() {\n        this.isDragging = false;\n        const { projection, animationState } = this.visualElement;\n        if (projection) {\n            projection.isAnimationBlocked = false;\n        }\n        this.endPanSession();\n        const { dragPropagation } = this.getProps();\n        if (!dragPropagation && this.openDragLock) {\n            this.openDragLock();\n            this.openDragLock = null;\n        }\n        animationState && animationState.setActive(\"whileDrag\", false);\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     * @internal\n     */\n    endPanSession() {\n        this.panSession && this.panSession.end();\n        this.panSession = undefined;\n    }\n    updateAxis(axis, _point, offset) {\n        const { drag } = this.getProps();\n        // If we're not dragging this axis, do an early return.\n        if (!offset || !shouldDrag(axis, drag, this.currentDirection))\n            return;\n        const axisValue = this.getAxisMotionValue(axis);\n        let next = this.originPoint[axis] + offset[axis];\n        // Apply constraints\n        if (this.constraints && this.constraints[axis]) {\n            next = applyConstraints(next, this.constraints[axis], this.elastic[axis]);\n        }\n        axisValue.set(next);\n    }\n    resolveConstraints() {\n        const { dragConstraints, dragElastic } = this.getProps();\n        const layout = this.visualElement.projection &&\n            !this.visualElement.projection.layout\n            ? this.visualElement.projection.measure(false)\n            : this.visualElement.projection?.layout;\n        const prevConstraints = this.constraints;\n        if (dragConstraints && isRefObject(dragConstraints)) {\n            if (!this.constraints) {\n                this.constraints = this.resolveRefConstraints();\n            }\n        }\n        else {\n            if (dragConstraints && layout) {\n                this.constraints = calcRelativeConstraints(layout.layoutBox, dragConstraints);\n            }\n            else {\n                this.constraints = false;\n            }\n        }\n        this.elastic = resolveDragElastic(dragElastic);\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 (prevConstraints !== this.constraints &&\n            !isRefObject(dragConstraints) &&\n            layout &&\n            this.constraints &&\n            !this.hasMutatedConstraints) {\n            eachAxis((axis) => {\n                if (this.constraints !== false &&\n                    this.getAxisMotionValue(axis)) {\n                    this.constraints[axis] = rebaseAxisConstraints(layout.layoutBox[axis], this.constraints[axis]);\n                }\n            });\n        }\n    }\n    resolveRefConstraints() {\n        const { dragConstraints: constraints, onMeasureDragConstraints } = this.getProps();\n        if (!constraints || !isRefObject(constraints))\n            return false;\n        const constraintsElement = constraints.current;\n        invariant(constraintsElement !== null, \"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.\", \"drag-constraints-ref\");\n        const { projection } = this.visualElement;\n        // TODO\n        if (!projection || !projection.layout)\n            return false;\n        const constraintsBox = measurePageBox(constraintsElement, projection.root, this.visualElement.getTransformPagePoint());\n        let measuredConstraints = calcViewportConstraints(projection.layout.layoutBox, constraintsBox);\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(convertBoxToBoundingBox(measuredConstraints));\n            this.hasMutatedConstraints = !!userConstraints;\n            if (userConstraints) {\n                measuredConstraints = convertBoundingBoxToBox(userConstraints);\n            }\n        }\n        return measuredConstraints;\n    }\n    startAnimation(velocity) {\n        const { drag, dragMomentum, dragElastic, dragTransition, dragSnapToOrigin, onDragTransitionEnd, } = this.getProps();\n        const constraints = this.constraints || {};\n        const momentumAnimations = eachAxis((axis) => {\n            if (!shouldDrag(axis, drag, this.currentDirection)) {\n                return;\n            }\n            let transition = (constraints && constraints[axis]) || {};\n            if (dragSnapToOrigin === true ||\n                dragSnapToOrigin === axis)\n                transition = { min: 0, max: 0 };\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 bounceStiffness = dragElastic ? 200 : 1000000;\n            const bounceDamping = dragElastic ? 40 : 10000000;\n            const inertia = {\n                type: \"inertia\",\n                velocity: dragMomentum ? velocity[axis] : 0,\n                bounceStiffness,\n                bounceDamping,\n                timeConstant: 750,\n                restDelta: 1,\n                restSpeed: 10,\n                ...dragTransition,\n                ...transition,\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        // Run all animations and then resolve the new drag constraints.\n        return Promise.all(momentumAnimations).then(onDragTransitionEnd);\n    }\n    startAxisValueAnimation(axis, transition) {\n        const axisValue = this.getAxisMotionValue(axis);\n        addValueToWillChange(this.visualElement, axis);\n        return axisValue.start(animateMotionValue(axis, axisValue, 0, transition, this.visualElement, false));\n    }\n    stopAnimation() {\n        eachAxis((axis) => this.getAxisMotionValue(axis).stop());\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) {\n        const dragKey = `_drag${axis.toUpperCase()}`;\n        const props = this.visualElement.getProps();\n        const externalMotionValue = props[dragKey];\n        return externalMotionValue\n            ? externalMotionValue\n            : this.visualElement.getValue(axis, (props.initial\n                ? props.initial[axis]\n                : undefined) || 0);\n    }\n    snapToCursor(point) {\n        eachAxis((axis) => {\n            const { drag } = this.getProps();\n            // If we're not dragging this axis, do an early return.\n            if (!shouldDrag(axis, drag, this.currentDirection))\n                return;\n            const { projection } = this.visualElement;\n            const axisValue = this.getAxisMotionValue(axis);\n            if (projection && projection.layout) {\n                const { min, max } = projection.layout.layoutBox[axis];\n                /**\n                 * The layout measurement includes the current transform value,\n                 * so we need to add it back to get the correct snap position.\n                 * This fixes an issue where elements with initial coordinates\n                 * would snap to the wrong position on the first drag.\n                 */\n                const current = axisValue.get() || 0;\n                axisValue.set(point[axis] - mixNumber(min, max, 0.5) + current);\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)\n            return;\n        const { drag, dragConstraints } = this.getProps();\n        const { projection } = this.visualElement;\n        if (!isRefObject(dragConstraints) || !projection || !this.constraints)\n            return;\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         * Record the relative position of the dragged element relative to the\n         * constraints box and save as a progress value.\n         */\n        const boxProgress = { x: 0, y: 0 };\n        eachAxis((axis) => {\n            const axisValue = this.getAxisMotionValue(axis);\n            if (axisValue && this.constraints !== false) {\n                const latest = axisValue.get();\n                boxProgress[axis] = calcOrigin({ min: latest, max: latest }, this.constraints[axis]);\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 && projection.root.updateScroll();\n        projection.updateLayout();\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         * For each axis, calculate the current progress of the layout axis\n         * within the new constraints.\n         */\n        eachAxis((axis) => {\n            if (!shouldDrag(axis, drag, null))\n                return;\n            /**\n             * Calculate a new transform based on the previous box progress\n             */\n            const axisValue = this.getAxisMotionValue(axis);\n            const { min, max } = this.constraints[axis];\n            axisValue.set(mixNumber(min, max, boxProgress[axis]));\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    addListeners() {\n        if (!this.visualElement.current)\n            return;\n        elementDragControls.set(this.visualElement, this);\n        const element = this.visualElement.current;\n        /**\n         * Attach a pointerdown event listener on this DOM element to initiate drag tracking.\n         */\n        const stopPointerListener = addPointerEvent(element, \"pointerdown\", (event) => {\n            const { drag, dragListener = true } = this.getProps();\n            const target = event.target;\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 = target !== element && isElementTextInput(target);\n            if (drag && dragListener && !isClickingTextInputChild) {\n                this.start(event);\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;\n        const measureDragConstraints = () => {\n            const { dragConstraints } = this.getProps();\n            if (isRefObject(dragConstraints) && dragConstraints.current) {\n                this.constraints = this.resolveRefConstraints();\n                if (!stopResizeObservers) {\n                    stopResizeObservers = startResizeObservers(element, dragConstraints.current, () => this.scalePositionWithinConstraints());\n                }\n            }\n        };\n        const { projection } = this.visualElement;\n        const stopMeasureLayoutListener = projection.addEventListener(\"measure\", measureDragConstraints);\n        if (projection && !projection.layout) {\n            projection.root && projection.root.updateScroll();\n            projection.updateLayout();\n        }\n        frame.read(measureDragConstraints);\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\", () => this.scalePositionWithinConstraints());\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(\"didUpdate\", (({ delta, hasLayoutChanged }) => {\n            if (this.isDragging && hasLayoutChanged) {\n                eachAxis((axis) => {\n                    const motionValue = this.getAxisMotionValue(axis);\n                    if (!motionValue)\n                        return;\n                    this.originPoint[axis] += delta[axis].translate;\n                    motionValue.set(motionValue.get() + delta[axis].translate);\n                });\n                this.visualElement.render();\n            }\n        }));\n        return () => {\n            stopResizeListener();\n            stopPointerListener();\n            stopMeasureLayoutListener();\n            stopLayoutUpdateListener && stopLayoutUpdateListener();\n            stopResizeObservers && stopResizeObservers();\n        };\n    }\n    getProps() {\n        const props = this.visualElement.getProps();\n        const { drag = false, dragDirectionLock = false, dragPropagation = false, dragConstraints = false, dragElastic = defaultElastic, dragMomentum = true, } = props;\n        return {\n            ...props,\n            drag,\n            dragDirectionLock,\n            dragPropagation,\n            dragConstraints,\n            dragElastic,\n            dragMomentum,\n        };\n    }\n}\nfunction skipFirstCall(callback) {\n    let isFirst = true;\n    return () => {\n        if (isFirst) {\n            isFirst = false;\n            return;\n        }\n        callback();\n    };\n}\nfunction startResizeObservers(element, constraintsElement, onResize) {\n    const stopElement = resize(element, skipFirstCall(onResize));\n    const stopContainer = resize(constraintsElement, skipFirstCall(onResize));\n    return () => {\n        stopElement();\n        stopContainer();\n    };\n}\nfunction shouldDrag(direction, drag, currentDirection) {\n    return ((drag === true || drag === direction) &&\n        (currentDirection === null || currentDirection === direction));\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(offset, lockThreshold = 10) {\n    let direction = null;\n    if (Math.abs(offset.y) > lockThreshold) {\n        direction = \"y\";\n    }\n    else if (Math.abs(offset.x) > lockThreshold) {\n        direction = \"x\";\n    }\n    return direction;\n}\n\nexport { VisualElementDragControls, elementDragControls };\n//# sourceMappingURL=VisualElementDragControls.mjs.map\n","import { Feature } from 'motion-dom';\nimport { noop } from 'motion-utils';\nimport { VisualElementDragControls } from './VisualElementDragControls.mjs';\n\nclass DragGesture extends Feature {\n    constructor(node) {\n        super(node);\n        this.removeGroupControls = noop;\n        this.removeListeners = noop;\n        this.controls = new VisualElementDragControls(node);\n    }\n    mount() {\n        // If we've been provided a DragControls for manual control over the drag gesture,\n        // subscribe this component to it on mount.\n        const { dragControls } = this.node.getProps();\n        if (dragControls) {\n            this.removeGroupControls = dragControls.subscribe(this.controls);\n        }\n        this.removeListeners = this.controls.addListeners() || noop;\n    }\n    update() {\n        const { dragControls } = this.node.getProps();\n        const { dragControls: prevDragControls } = this.node.prevProps || {};\n        if (dragControls !== prevDragControls) {\n            this.removeGroupControls();\n            if (dragControls) {\n                this.removeGroupControls = dragControls.subscribe(this.controls);\n            }\n        }\n    }\n    unmount() {\n        this.removeGroupControls();\n        this.removeListeners();\n        /**\n         * In React 19, during list reorder reconciliation, components may\n         * briefly unmount and remount while the drag is still active. If we're\n         * actively dragging, we should NOT end the pan session - it will\n         * continue tracking pointer events via its window-level listeners.\n         *\n         * The pan session will be properly cleaned up when:\n         * 1. The drag ends naturally (pointerup/pointercancel)\n         * 2. The component is truly removed from the DOM\n         */\n        if (!this.controls.isDragging) {\n            this.controls.endPanSession();\n        }\n    }\n}\n\nexport { DragGesture };\n//# sourceMappingURL=index.mjs.map\n","import { Feature, frame } from 'motion-dom';\nimport { noop } from 'motion-utils';\nimport { addPointerEvent } from '../../events/add-pointer-event.mjs';\nimport { getContextWindow } from '../../utils/get-context-window.mjs';\nimport { PanSession } from './PanSession.mjs';\n\nconst asyncHandler = (handler) => (event, info) => {\n    if (handler) {\n        frame.update(() => handler(event, info), false, true);\n    }\n};\nclass PanGesture extends Feature {\n    constructor() {\n        super(...arguments);\n        this.removePointerDownListener = noop;\n    }\n    onPointerDown(pointerDownEvent) {\n        this.session = new PanSession(pointerDownEvent, this.createPanHandlers(), {\n            transformPagePoint: this.node.getTransformPagePoint(),\n            contextWindow: getContextWindow(this.node),\n        });\n    }\n    createPanHandlers() {\n        const { onPanSessionStart, onPanStart, onPan, onPanEnd } = this.node.getProps();\n        return {\n            onSessionStart: asyncHandler(onPanSessionStart),\n            onStart: asyncHandler(onPanStart),\n            onMove: asyncHandler(onPan),\n            onEnd: (event, info) => {\n                delete this.session;\n                if (onPanEnd) {\n                    frame.postRender(() => onPanEnd(event, info));\n                }\n            },\n        };\n    }\n    mount() {\n        this.removePointerDownListener = addPointerEvent(this.node.current, \"pointerdown\", (event) => this.onPointerDown(event));\n    }\n    update() {\n        this.session && this.session.updateHandlers(this.createPanHandlers());\n    }\n    unmount() {\n        this.removePointerDownListener();\n        this.session && this.session.end();\n    }\n}\n\nexport { PanGesture };\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\nimport { jsx } from 'react/jsx-runtime';\nimport { globalProjectionState, frame, microtask } from 'motion-dom';\nimport { useContext, Component } from 'react';\nimport { usePresence } from '../../../components/AnimatePresence/use-presence.mjs';\nimport { LayoutGroupContext } from '../../../context/LayoutGroupContext.mjs';\nimport { SwitchLayoutGroupContext } from '../../../context/SwitchLayoutGroupContext.mjs';\n\n/**\n * Track whether we've taken any snapshots yet. If not,\n * we can safely skip notification of didUpdate.\n *\n * Difficult to capture in a test but to prevent flickering\n * we must set this to true either on update or unmount.\n * Running `next-env/layout-id` in Safari will show this behaviour if broken.\n */\nlet hasTakenAnySnapshot = false;\nclass MeasureLayoutWithContext extends Component {\n    /**\n     * This only mounts projection nodes for components that\n     * need measuring, we might want to do it for all components\n     * in order to incorporate transforms\n     */\n    componentDidMount() {\n        const { visualElement, layoutGroup, switchLayoutGroup, layoutId } = this.props;\n        const { projection } = visualElement;\n        if (projection) {\n            if (layoutGroup.group)\n                layoutGroup.group.add(projection);\n            if (switchLayoutGroup && switchLayoutGroup.register && layoutId) {\n                switchLayoutGroup.register(projection);\n            }\n            if (hasTakenAnySnapshot) {\n                projection.root.didUpdate();\n            }\n            projection.addEventListener(\"animationComplete\", () => {\n                this.safeToRemove();\n            });\n            projection.setOptions({\n                ...projection.options,\n                layoutDependency: this.props.layoutDependency,\n                onExitComplete: () => this.safeToRemove(),\n            });\n        }\n        globalProjectionState.hasEverUpdated = true;\n    }\n    getSnapshotBeforeUpdate(prevProps) {\n        const { layoutDependency, visualElement, drag, isPresent } = this.props;\n        const { projection } = visualElement;\n        if (!projection)\n            return null;\n        /**\n         * TODO: We use this data in relegate to determine whether to\n         * promote a previous element. There's no guarantee its presence data\n         * will have updated by this point - if a bug like this arises it will\n         * have to be that we markForRelegation and then find a new lead some other way,\n         * perhaps in didUpdate\n         */\n        projection.isPresent = isPresent;\n        if (prevProps.layoutDependency !== layoutDependency) {\n            projection.setOptions({\n                ...projection.options,\n                layoutDependency,\n            });\n        }\n        hasTakenAnySnapshot = true;\n        if (drag ||\n            prevProps.layoutDependency !== layoutDependency ||\n            layoutDependency === undefined ||\n            prevProps.isPresent !== isPresent) {\n            projection.willUpdate();\n        }\n        else {\n            this.safeToRemove();\n        }\n        if (prevProps.isPresent !== isPresent) {\n            if (isPresent) {\n                projection.promote();\n            }\n            else if (!projection.relegate()) {\n                /**\n                 * If there's another stack member taking over from this one,\n                 * it's in charge of the exit animation and therefore should\n                 * be in charge of the safe to remove. Otherwise we call it here.\n                 */\n                frame.postRender(() => {\n                    const stack = projection.getStack();\n                    if (!stack || !stack.members.length) {\n                        this.safeToRemove();\n                    }\n                });\n            }\n        }\n        return null;\n    }\n    componentDidUpdate() {\n        const { visualElement, layoutAnchor } = this.props;\n        const { projection } = visualElement;\n        if (projection) {\n            projection.options.layoutAnchor = layoutAnchor;\n            projection.root.didUpdate();\n            microtask.postRender(() => {\n                if (!projection.currentAnimation && projection.isLead()) {\n                    this.safeToRemove();\n                }\n            });\n        }\n    }\n    componentWillUnmount() {\n        const { visualElement, layoutGroup, switchLayoutGroup: promoteContext, } = this.props;\n        const { projection } = visualElement;\n        hasTakenAnySnapshot = true;\n        if (projection) {\n            projection.scheduleCheckAfterUnmount();\n            if (layoutGroup && layoutGroup.group)\n                layoutGroup.group.remove(projection);\n            if (promoteContext && promoteContext.deregister)\n                promoteContext.deregister(projection);\n        }\n    }\n    safeToRemove() {\n        const { safeToRemove } = this.props;\n        safeToRemove && safeToRemove();\n    }\n    render() {\n        return null;\n    }\n}\nfunction MeasureLayout(props) {\n    const [isPresent, safeToRemove] = usePresence();\n    const layoutGroup = useContext(LayoutGroupContext);\n    return (jsx(MeasureLayoutWithContext, { ...props, layoutGroup: layoutGroup, switchLayoutGroup: useContext(SwitchLayoutGroupContext), isPresent: isPresent, safeToRemove: safeToRemove }));\n}\n\nexport { MeasureLayout };\n//# sourceMappingURL=MeasureLayout.mjs.map\n","import { DragGesture } from '../../gestures/drag/index.mjs';\nimport { PanGesture } from '../../gestures/pan/index.mjs';\nimport { MeasureLayout } from './layout/MeasureLayout.mjs';\nimport { HTMLProjectionNode } from 'motion-dom';\n\nconst drag = {\n    pan: {\n        Feature: PanGesture,\n    },\n    drag: {\n        Feature: DragGesture,\n        ProjectionNode: HTMLProjectionNode,\n        MeasureLayout,\n    },\n};\n\nexport { drag };\n//# sourceMappingURL=drag.mjs.map\n","import { Feature, hover, frame } from 'motion-dom';\nimport { extractEventInfo } from '../events/event-info.mjs';\n\nfunction handleHoverEvent(node, event, lifecycle) {\n    const { props } = node;\n    if (node.animationState && props.whileHover) {\n        node.animationState.setActive(\"whileHover\", lifecycle === \"Start\");\n    }\n    const eventName = (\"onHover\" + lifecycle);\n    const callback = props[eventName];\n    if (callback) {\n        frame.postRender(() => callback(event, extractEventInfo(event)));\n    }\n}\nclass HoverGesture extends Feature {\n    mount() {\n        const { current } = this.node;\n        if (!current)\n            return;\n        this.unmount = hover(current, (_element, startEvent) => {\n            handleHoverEvent(this.node, startEvent, \"Start\");\n            return (endEvent) => handleHoverEvent(this.node, endEvent, \"End\");\n        });\n    }\n    unmount() { }\n}\n\nexport { HoverGesture };\n//# sourceMappingURL=hover.mjs.map\n","import { Feature, addDomEvent } from 'motion-dom';\nimport { pipe } from 'motion-utils';\n\nclass FocusGesture extends Feature {\n    constructor() {\n        super(...arguments);\n        this.isActive = false;\n    }\n    onFocus() {\n        let isFocusVisible = false;\n        /**\n         * If this element doesn't match focus-visible then don't\n         * apply whileHover. But, if matches throws that focus-visible\n         * is not a valid selector then in that browser outline styles will be applied\n         * to the element by default and we want to match that behaviour with whileFocus.\n         */\n        try {\n            isFocusVisible = this.node.current.matches(\":focus-visible\");\n        }\n        catch (e) {\n            isFocusVisible = true;\n        }\n        if (!isFocusVisible || !this.node.animationState)\n            return;\n        this.node.animationState.setActive(\"whileFocus\", true);\n        this.isActive = true;\n    }\n    onBlur() {\n        if (!this.isActive || !this.node.animationState)\n            return;\n        this.node.animationState.setActive(\"whileFocus\", false);\n        this.isActive = false;\n    }\n    mount() {\n        this.unmount = pipe(addDomEvent(this.node.current, \"focus\", () => this.onFocus()), addDomEvent(this.node.current, \"blur\", () => this.onBlur()));\n    }\n    unmount() { }\n}\n\nexport { FocusGesture };\n//# sourceMappingURL=focus.mjs.map\n","import { Feature, press, frame } from 'motion-dom';\nimport { extractEventInfo } from '../events/event-info.mjs';\n\nfunction handlePressEvent(node, event, lifecycle) {\n    const { props } = node;\n    if (node.current instanceof HTMLButtonElement && node.current.disabled) {\n        return;\n    }\n    if (node.animationState && props.whileTap) {\n        node.animationState.setActive(\"whileTap\", lifecycle === \"Start\");\n    }\n    const eventName = (\"onTap\" + (lifecycle === \"End\" ? \"\" : lifecycle));\n    const callback = props[eventName];\n    if (callback) {\n        frame.postRender(() => callback(event, extractEventInfo(event)));\n    }\n}\nclass PressGesture extends Feature {\n    mount() {\n        const { current } = this.node;\n        if (!current)\n            return;\n        const { globalTapTarget, propagate } = this.node.props;\n        this.unmount = press(current, (_element, startEvent) => {\n            handlePressEvent(this.node, startEvent, \"Start\");\n            return (endEvent, { success }) => handlePressEvent(this.node, endEvent, success ? \"End\" : \"Cancel\");\n        }, {\n            useGlobalTarget: globalTapTarget,\n            stopPropagation: propagate?.tap === false,\n        });\n    }\n    unmount() { }\n}\n\nexport { PressGesture };\n//# sourceMappingURL=press.mjs.map\n","/**\n * Map an IntersectionHandler callback to an element. We only ever make one handler for one\n * element, so even though these handlers might all be triggered by different\n * observers, we can keep them in the same map.\n */\nconst observerCallbacks = new WeakMap();\n/**\n * Multiple observers can be created for multiple element/document roots. Each with\n * different settings. So here we store dictionaries of observers to each root,\n * using serialised settings (threshold/margin) as lookup keys.\n */\nconst observers = new WeakMap();\nconst fireObserverCallback = (entry) => {\n    const callback = observerCallbacks.get(entry.target);\n    callback && callback(entry);\n};\nconst fireAllObserverCallbacks = (entries) => {\n    entries.forEach(fireObserverCallback);\n};\nfunction initIntersectionObserver({ root, ...options }) {\n    const lookupRoot = root || document;\n    /**\n     * If we don't have an observer lookup map for this root, create one.\n     */\n    if (!observers.has(lookupRoot)) {\n        observers.set(lookupRoot, {});\n    }\n    const rootObservers = observers.get(lookupRoot);\n    const key = JSON.stringify(options);\n    /**\n     * If we don't have an observer for this combination of root and settings,\n     * create one.\n     */\n    if (!rootObservers[key]) {\n        rootObservers[key] = new IntersectionObserver(fireAllObserverCallbacks, { root, ...options });\n    }\n    return rootObservers[key];\n}\nfunction observeIntersection(element, options, callback) {\n    const rootInteresectionObserver = initIntersectionObserver(options);\n    observerCallbacks.set(element, callback);\n    rootInteresectionObserver.observe(element);\n    return () => {\n        observerCallbacks.delete(element);\n        rootInteresectionObserver.unobserve(element);\n    };\n}\n\nexport { observeIntersection };\n//# sourceMappingURL=observers.mjs.map\n","import { Feature } from 'motion-dom';\nimport { observeIntersection } from './observers.mjs';\n\nconst thresholdNames = {\n    some: 0,\n    all: 1,\n};\nclass InViewFeature extends Feature {\n    constructor() {\n        super(...arguments);\n        this.hasEnteredView = false;\n        this.isInView = false;\n    }\n    startObserver() {\n        this.stopObserver?.();\n        const { viewport = {} } = this.node.getProps();\n        const { root, margin: rootMargin, amount = \"some\", once } = viewport;\n        const options = {\n            root: root ? root.current : undefined,\n            rootMargin,\n            threshold: typeof amount === \"number\" ? amount : thresholdNames[amount],\n        };\n        const onIntersectionUpdate = (entry) => {\n            const { isIntersecting } = entry;\n            /**\n             * If there's been no change in the viewport state, early return.\n             */\n            if (this.isInView === isIntersecting)\n                return;\n            this.isInView = isIntersecting;\n            /**\n             * Handle hasEnteredView. If this is only meant to run once, and\n             * element isn't visible, early return. Otherwise set hasEnteredView to true.\n             */\n            if (once && !isIntersecting && this.hasEnteredView) {\n                return;\n            }\n            else if (isIntersecting) {\n                this.hasEnteredView = true;\n            }\n            if (this.node.animationState) {\n                this.node.animationState.setActive(\"whileInView\", isIntersecting);\n            }\n            /**\n             * Use the latest committed props rather than the ones in scope\n             * when this observer is created\n             */\n            const { onViewportEnter, onViewportLeave } = this.node.getProps();\n            const callback = isIntersecting ? onViewportEnter : onViewportLeave;\n            callback && callback(entry);\n        };\n        this.stopObserver = observeIntersection(this.node.current, options, onIntersectionUpdate);\n    }\n    mount() {\n        this.startObserver();\n    }\n    update() {\n        if (typeof IntersectionObserver === \"undefined\")\n            return;\n        const { props, prevProps } = this.node;\n        const hasOptionsChanged = [\"amount\", \"margin\", \"root\"].some(hasViewportOptionChanged(props, prevProps));\n        if (hasOptionsChanged) {\n            this.startObserver();\n        }\n    }\n    unmount() {\n        this.stopObserver?.();\n        this.hasEnteredView = false;\n        this.isInView = false;\n    }\n}\nfunction hasViewportOptionChanged({ viewport = {} }, { viewport: prevViewport = {} } = {}) {\n    return (name) => viewport[name] !== prevViewport[name];\n}\n\nexport { InViewFeature };\n//# sourceMappingURL=index.mjs.map\n","import { HoverGesture } from '../../gestures/hover.mjs';\nimport { FocusGesture } from '../../gestures/focus.mjs';\nimport { PressGesture } from '../../gestures/press.mjs';\nimport { InViewFeature } from './viewport/index.mjs';\n\nconst gestureAnimations = {\n    inView: {\n        Feature: InViewFeature,\n    },\n    tap: {\n        Feature: PressGesture,\n    },\n    focus: {\n        Feature: FocusGesture,\n    },\n    hover: {\n        Feature: HoverGesture,\n    },\n};\n\nexport { gestureAnimations };\n//# sourceMappingURL=gestures.mjs.map\n","import { HTMLProjectionNode } from 'motion-dom';\nimport { MeasureLayout } from './layout/MeasureLayout.mjs';\n\nconst layout = {\n    layout: {\n        ProjectionNode: HTMLProjectionNode,\n        MeasureLayout,\n    },\n};\n\nexport { layout };\n//# sourceMappingURL=layout.mjs.map\n","import { animations } from '../../../motion/features/animations.mjs';\nimport { drag } from '../../../motion/features/drag.mjs';\nimport { gestureAnimations } from '../../../motion/features/gestures.mjs';\nimport { layout } from '../../../motion/features/layout.mjs';\n\nconst featureBundle = {\n    ...animations,\n    ...gestureAnimations,\n    ...drag,\n    ...layout,\n};\n\nexport { featureBundle };\n//# sourceMappingURL=feature-bundle.mjs.map\n","import { createDomVisualElement } from '../../dom/create-visual-element.mjs';\nimport { createMotionProxy } from '../create-proxy.mjs';\nimport { featureBundle } from './feature-bundle.mjs';\n\nconst motion = /*@__PURE__*/ createMotionProxy(featureBundle, createDomVisualElement);\n\nexport { motion };\n//# sourceMappingURL=proxy.mjs.map\n","\"use client\";\n\nimport React, {\n  useState,\n  useRef,\n  useEffect,\n  useId,\n  forwardRef,\n  useLayoutEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"framer-motion\";\n\n/* -------------------------------------------------------------------------- */\n/* 🧩 Types                                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport interface DropdownItem {\n  label?: React.ReactNode;\n  icon?: React.ReactNode;\n\n  onClick?: () => void;\n  href?: string;\n\n  danger?: boolean;\n  disabled?: boolean;\n\n  separator?: boolean;\n\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nexport interface DropdownProps {\n  trigger: React.ReactNode;\n  items: DropdownItem[];\n\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n\n  align?: \"left\" | \"right\";\n  width?: number;\n\n  closeOnClick?: boolean;\n\n  className?: string;\n  menuClassName?: string;\n  itemClassName?: string;\n\n  /** Applied to the wrapper around the `trigger` node. */\n  triggerClassName?: string;\n  /** Applied to the inner `role=\"menu\"` list container. */\n  menuListClassName?: string;\n  /** Applied to each separator row (`item.separator`). */\n  separatorClassName?: string;\n  /** Applied to an item's leading icon wrapper. */\n  itemIconClassName?: string;\n  /** Applied to an item's label text. */\n  itemLabelClassName?: string;\n\n  style?: React.CSSProperties;\n  menuStyle?: React.CSSProperties;\n}\n\n/* -------------------------------------------------------------------------- */\n/* 🔽 Dropdown                                                               */\n/* -------------------------------------------------------------------------- */\n\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\n  function Dropdown(\n    {\n      trigger,\n      items,\n\n      open: controlledOpen,\n      onOpenChange,\n\n      align = \"right\",\n      width = 220,\n      closeOnClick = true,\n\n      className,\n      menuClassName,\n      itemClassName,\n\n      triggerClassName,\n      menuListClassName,\n      separatorClassName,\n      itemIconClassName,\n      itemLabelClassName,\n\n      style,\n      menuStyle,\n    },\n    ref,\n  ) {\n    const [internalOpen, setInternalOpen] = useState(false);\n    const [coords, setCoords] = useState({ top: 0, left: 0 });\n\n    const [position, setPosition] = useState<\"top\" | \"bottom\">(\"bottom\");\n\n    const isControlled = controlledOpen !== undefined;\n\n    const open = isControlled ? controlledOpen : internalOpen;\n\n    const dropdownRef = useRef<HTMLDivElement | null>(null);\n    const menuRef = useRef<HTMLDivElement | null>(null);\n    const menuId = useId();\n\n    // Kept in a ref so the listener below can stay subscribed without going\n    // stale on onOpenChange, which consumers usually pass as an inline arrow.\n    const setOpenRef = useRef((val: boolean) => {\n      if (!isControlled) setInternalOpen(val);\n      onOpenChange?.(val);\n    });\n    setOpenRef.current = (val: boolean) => {\n      if (!isControlled) setInternalOpen(val);\n      onOpenChange?.(val);\n    };\n\n    const setOpen = (val: boolean) => setOpenRef.current(val);\n\n    /* ---------------------------------------------------------------------- */\n    /* 🔒 Outside Click                                                       */\n    /* ---------------------------------------------------------------------- */\n\n    useEffect(() => {\n      // Gate on `open`. Previously this was mounted for the component's whole\n      // life with `[]` deps, so in controlled mode every mousedown anywhere on\n      // the page called onOpenChange(false) — and the empty deps froze the\n      // first render's handler.\n      if (!open) return;\n\n      const handleOutside = (e: MouseEvent) => {\n        const target = e.target as Node;\n        if (\n          dropdownRef.current &&\n          !dropdownRef.current.contains(target) &&\n          !menuRef.current?.contains(target)\n        ) {\n          setOpenRef.current(false);\n        }\n      };\n\n      const handleEscape = (e: KeyboardEvent) => {\n        if (e.key === \"Escape\") setOpenRef.current(false);\n      };\n\n      document.addEventListener(\"mousedown\", handleOutside);\n      document.addEventListener(\"keydown\", handleEscape);\n\n      return () => {\n        document.removeEventListener(\"mousedown\", handleOutside);\n        document.removeEventListener(\"keydown\", handleEscape);\n      };\n    }, [open]);\n\n    /* ---------------------------------------------------------------------- */\n    /* 📍 Smart Positioning                                                   */\n    /* ---------------------------------------------------------------------- */\n\n    useLayoutEffect(() => {\n      if (!open || !dropdownRef.current || !menuRef.current) return;\n\n      const updatePosition = () => {\n        const triggerRect = dropdownRef.current!.getBoundingClientRect();\n        const menuHeight = menuRef.current!.offsetHeight;\n\n        const spaceBottom = window.innerHeight - triggerRect.bottom;\n        const spaceTop = triggerRect.top;\n\n        const shouldOpenTop =\n          spaceBottom < menuHeight + 10 && spaceTop > menuHeight;\n\n        const top = shouldOpenTop\n          ? triggerRect.top - menuHeight - 8\n          : triggerRect.bottom + 8;\n\n        let left =\n          align === \"right\" ? triggerRect.right - width : triggerRect.left;\n\n        // prevent overflow horizontally\n        const maxLeft = window.innerWidth - width - 8;\n        left = Math.max(8, Math.min(left, maxLeft));\n\n        setPosition(shouldOpenTop ? \"top\" : \"bottom\");\n        setCoords({ top, left });\n      };\n\n      updatePosition();\n\n      window.addEventListener(\"scroll\", updatePosition, true);\n      window.addEventListener(\"resize\", updatePosition);\n\n      return () => {\n        window.removeEventListener(\"scroll\", updatePosition, true);\n        window.removeEventListener(\"resize\", updatePosition);\n      };\n    }, [open, align, width]);\n\n    /* ---------------------------------------------------------------------- */\n    /* 🔗 Merge Refs                                                          */\n    /* ---------------------------------------------------------------------- */\n\n    const setRefs = (node: HTMLDivElement | null) => {\n      dropdownRef.current = node;\n\n      if (typeof ref === \"function\") {\n        ref(node);\n      } else if (ref) {\n        (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n      }\n    };\n\n    // Rendered via a portal to document.body (below), not as a child here:\n    // `position: fixed` is only viewport-relative when no ancestor has a\n    // transform/filter/perspective. A hover-lift card (`hover:-translate-y-*`\n    // and similar) around the trigger would otherwise make that card the\n    // menu's containing block instead of the viewport, misplacing it while\n    // hovered — which looks like \"the dropdown doesn't open.\"\n    const menu = (\n      <AnimatePresence>\n        {open && (\n            <motion.div\n              ref={menuRef}\n              initial={{\n                opacity: 0,\n                y: position === \"bottom\" ? 8 : -8,\n                scale: 0.96,\n              }}\n              animate={{\n                opacity: 1,\n                y: 0,\n                scale: 1,\n              }}\n              exit={{\n                opacity: 0,\n                y: position === \"bottom\" ? 8 : -8,\n                scale: 0.96,\n              }}\n              transition={{\n                duration: 0.16,\n                ease: \"easeOut\",\n              }}\n              onClick={(e) => e.stopPropagation()}\n              className={clsx(\n                \"fixed z-[9999] overflow-hidden rounded-2xl border border-border\",\n                \"bg-background shadow-2xl backdrop-blur-xl\",\n                \"min-w-[180px]\",\n                menuClassName,\n              )}\n              style={{\n                width,\n                top: coords.top,\n                left: coords.left,\n                ...menuStyle,\n              }}\n            >\n              <div\n                id={menuId}\n                role=\"menu\"\n                className={clsx(\"text-sm text-foreground\", menuListClassName)}\n              >\n                {items.map((item, i) => {\n                  if (item.separator) {\n                    return (\n                      <div\n                        key={`separator-${i}`}\n                        role=\"separator\"\n                        className={clsx(\"my-1 h-px bg-border\", separatorClassName)}\n                      />\n                    );\n                  }\n\n                  return (\n                    <button\n                      // Prefer a stable identity over the array index so\n                      // reordering or filtering `items` doesn't reuse the wrong\n                      // DOM node (and its hover/disabled state).\n                      key={typeof item.label === \"string\" ? item.label : i}\n                      type=\"button\"\n                      role=\"menuitem\"\n                      disabled={item.disabled}\n                      onClick={() => {\n                        if (item.disabled) return;\n\n                        item.onClick?.();\n\n                        if (closeOnClick) {\n                          setOpen(false);\n                        }\n                      }}\n                      className={clsx(\n                        \"flex w-full items-center gap-3 px-4 py-2.5 text-left\",\n                        \"transition-all duration-150\",\n                        \"hover:bg-accent\",\n                        // focus:outline-none with no replacement left keyboard\n                        // users with no visible focus at all.\n                        \"focus:outline-none focus-visible:bg-accent focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n                        item.danger &&\n                          \"text-destructive hover:bg-destructive/10\",\n                        item.disabled && \"opacity-50\",\n                        itemClassName,\n                        item.className,\n                      )}\n                      style={item.style}\n                    >\n                      {item.icon && (\n                        <span className={clsx(\"shrink-0 text-current\", itemIconClassName)}>\n                          {item.icon}\n                        </span>\n                      )}\n\n                      <span className={clsx(\"truncate\", itemLabelClassName)}>{item.label}</span>\n                    </button>\n                  );\n                })}\n              </div>\n            </motion.div>\n        )}\n      </AnimatePresence>\n    );\n\n    return (\n      <>\n        <div\n          ref={setRefs}\n          className={clsx(\"inline-flex\", className)}\n          style={style}\n        >\n          {/* -------------------------------------------------------------- */}\n          {/* 🔘 Trigger                                                     */}\n          {/* -------------------------------------------------------------- */}\n\n          <div\n            className={clsx(\"flex\", triggerClassName)}\n            // A plain <div> is not focusable and has no Enter/Space activation,\n            // so give it button semantics and the popup wiring screen readers\n            // need. (A real <button> would nest illegally if `trigger` is one.)\n            role=\"button\"\n            tabIndex={0}\n            aria-haspopup=\"menu\"\n            aria-expanded={open}\n            aria-controls={open ? menuId : undefined}\n            onKeyDown={(e) => {\n              if (e.key === \"Enter\" || e.key === \" \") {\n                e.preventDefault();\n                e.stopPropagation();\n                setOpen(!open);\n              }\n            }}\n            onClick={(e) => {\n              e.stopPropagation();\n              setOpen(!open);\n            }}\n          >\n            {trigger}\n          </div>\n        </div>\n\n        {/* -------------------------------------------------------------- */}\n        {/* 📦 Menu — portaled to <body>, see comment above `menu`          */}\n        {/* -------------------------------------------------------------- */}\n        {typeof document !== \"undefined\" && createPortal(menu, document.body)}\n      </>\n    );\n  },\n);\n\nDropdown.displayName = \"Dropdown\";\n","\"use client\";\n\nimport React, {\n  ReactNode,\n  useEffect,\n  useMemo,\n  useState,\n} from \"react\";\nimport {\n  X,\n  Info,\n  CheckCircle,\n  AlertCircle,\n  AlertTriangle,\n  Loader2,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type AlertType = \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\nexport type ToastVariant = \"soft\" | \"light\" | \"dark\";\nexport type ToastPosition =\n  | \"top-left\"\n  | \"top-center\"\n  | \"top-right\"\n  | \"bottom-left\"\n  | \"bottom-center\"\n  | \"bottom-right\";\n\nexport interface Toast {\n  id: string;\n  title?: string;\n  description?: string;\n  type?: AlertType;\n  variant?: ToastVariant;\n  duration?: number;\n  /** Overrides the default type icon (success/error/etc). Pass any node, or `null` to render no icon at all. */\n  icon?: ReactNode;\n\n  className?: string;\n  style?: React.CSSProperties;\n\n  titleClassName?: string;\n  descriptionClassName?: string;\n  iconClassName?: string;\n  contentClassName?: string;\n  closeButtonClassName?: string;\n}\n\nexport interface ToastContextProps {\n  toast: ToastFunction;\n  dismiss: (id?: string) => void;\n}\n\nexport type ToastFunction = {\n  /** Returns the toast's id, so it can be updated (pass the same `id` back in) or dismissed later. */\n  (input: Omit<Toast, \"id\"> | string): string;\n  success: (message: string, options?: Partial<Toast>) => string;\n  error: (message: string, options?: Partial<Toast>) => string;\n  warning: (message: string, options?: Partial<Toast>) => string;\n  info: (message: string, options?: Partial<Toast>) => string;\n  /** Persists until dismissed or replaced — pair with `.promise()` or dismiss it manually once the async work finishes. */\n  loading: (message: string, options?: Partial<Toast>) => string;\n  /**\n   * Shows a loading toast, then morphs it in place into a success or error\n   * toast once `promise` settles — the react-hot-toast async pattern.\n   */\n  promise: <T>(\n    promise: Promise<T>,\n    messages: {\n      loading: string;\n      success: string | ((data: T) => string);\n      error: string | ((error: unknown) => string);\n    },\n    options?: Partial<Toast>,\n  ) => Promise<T>;\n  dismiss: (id?: string) => void;\n};\n\n/* -------------------------------------------------------------------------- */\n/* 🌍 Global toast store                                                     */\n/*                                                                            */\n/* Toasts are NOT React context state — they live in a module-level store,   */\n/* the same architecture react-hot-toast uses. That's what makes `toast()`   */\n/* callable from anywhere (event handlers, API clients, utils outside any    */\n/* component) instead of only from inside a component that called a hook.   */\n/* `<ToastProvider>` just subscribes to this store and renders what's in it. */\n/* -------------------------------------------------------------------------- */\n\ntype Listener = (toasts: Toast[]) => void;\n\nclass ToastStore {\n  private toasts: Toast[] = [];\n  private listeners = new Set<Listener>();\n  private timers = new Map<string, ReturnType<typeof setTimeout>>();\n  private counter = 0;\n  private maxToasts = 5;\n\n  subscribe = (listener: Listener) => {\n    this.listeners.add(listener);\n    listener(this.toasts);\n    return () => {\n      this.listeners.delete(listener);\n    };\n  };\n\n  setMaxToasts(max: number) {\n    this.maxToasts = max;\n  }\n\n  private emit() {\n    this.listeners.forEach((listener) => listener(this.toasts));\n  }\n\n  private clearTimer(id: string) {\n    const handle = this.timers.get(id);\n    if (handle) {\n      clearTimeout(handle);\n      this.timers.delete(id);\n    }\n  }\n\n  dismiss = (id?: string) => {\n    if (id) {\n      this.clearTimer(id);\n      this.toasts = this.toasts.filter((t) => t.id !== id);\n    } else {\n      this.timers.forEach((handle) => clearTimeout(handle));\n      this.timers.clear();\n      this.toasts = [];\n    }\n    this.emit();\n  };\n\n  create(options: Omit<Toast, \"id\"> & { id?: string }) {\n    // A supplied id lets a caller update a toast in place (e.g. loading -> success),\n    // matching the same toast's position in the stack instead of appending a new one.\n    const id = options.id ?? `toast-${++this.counter}`;\n    this.clearTimer(id);\n\n    const toastData: Toast = {\n      ...options,\n      id,\n      type: options.type ?? \"info\",\n      variant: options.variant ?? \"light\",\n      duration: options.duration ?? 4000,\n    };\n\n    const existingIndex = this.toasts.findIndex((t) => t.id === id);\n    if (existingIndex >= 0) {\n      const next = [...this.toasts];\n      next[existingIndex] = toastData;\n      this.toasts = next;\n    } else {\n      const next = [...this.toasts, toastData];\n      // Cap the stack so a loop or a repeated click can't push toasts off-screen indefinitely.\n      this.toasts =\n        next.length > this.maxToasts ? next.slice(next.length - this.maxToasts) : next;\n    }\n\n    if (toastData.duration && toastData.duration > 0) {\n      this.timers.set(id, setTimeout(() => this.dismiss(id), toastData.duration));\n    }\n\n    this.emit();\n    return id;\n  }\n}\n\nconst store = new ToastStore();\n\nconst base = ((input: Omit<Toast, \"id\"> | string) => {\n  if (typeof input === \"string\") {\n    return store.create({ description: input });\n  }\n  return store.create(input);\n}) as ToastFunction;\n\nbase.success = (message, options) =>\n  store.create({ title: message, type: \"success\", ...options });\n\nbase.error = (message, options) =>\n  store.create({ title: message, type: \"error\", ...options });\n\nbase.warning = (message, options) =>\n  store.create({ title: message, type: \"warning\", ...options });\n\nbase.info = (message, options) =>\n  store.create({ title: message, type: \"info\", ...options });\n\nbase.loading = (message, options) =>\n  store.create({ title: message, type: \"loading\", duration: 0, ...options });\n\nbase.dismiss = (id) => store.dismiss(id);\n\nbase.promise = (promise, messages, options) => {\n  const id = store.create({\n    title: messages.loading,\n    type: \"loading\",\n    duration: 0,\n    ...options,\n  });\n\n  return promise.then(\n    (data) => {\n      const resolved =\n        typeof messages.success === \"function\" ? messages.success(data) : messages.success;\n      store.create({ id, title: resolved, type: \"success\", duration: 4000, ...options });\n      return data;\n    },\n    (error) => {\n      const resolved =\n        typeof messages.error === \"function\" ? messages.error(error) : messages.error;\n      store.create({ id, title: resolved, type: \"error\", duration: 4000, ...options });\n      throw error;\n    },\n  );\n};\n\n/** Standalone toast trigger — import and call from anywhere, no hook or provider lookup required. */\nexport const toast: ToastFunction = base;\n\n/**\n * Kept for consumers who prefer a hook — returns the exact same global\n * `toast`/`dismiss`, so mixing `useToast()` and the standalone `toast` import\n * in the same app is always in sync. No longer throws if called without a\n * mounted `<ToastProvider>` (matches react-hot-toast: toasts just won't be\n * visible until a provider is rendered somewhere in the tree).\n */\nexport const useToast = (): ToastContextProps =>\n  useMemo(() => ({ toast, dismiss: store.dismiss }), []);\n\nexport interface ToastProviderProps {\n  children: ReactNode;\n  /** Maximum toasts kept on screen at once. Oldest are dropped first. */\n  maxToasts?: number;\n  /** Customize the fixed toast viewport that hosts all toasts. */\n  containerClassName?: string;\n  /** Corner (or edge-center) the toast stack anchors to. */\n  position?: ToastPosition;\n}\n\nconst POSITION_CLASSES: Record<ToastPosition, string> = {\n  \"top-left\": \"top-4 left-4 sm:top-6 sm:left-6 items-start\",\n  \"top-center\": \"top-4 left-1/2 -translate-x-1/2 sm:top-6 items-center\",\n  \"top-right\": \"top-4 right-4 sm:top-6 sm:right-6 items-end\",\n  \"bottom-left\": \"bottom-4 left-4 sm:bottom-6 sm:left-6 items-start\",\n  \"bottom-center\": \"bottom-4 left-1/2 -translate-x-1/2 sm:bottom-6 items-center\",\n  \"bottom-right\": \"bottom-4 right-4 sm:bottom-6 sm:right-6 items-end\",\n};\n\n/**\n * Renders the toast viewport for the whole app. Mount this ONCE near your\n * root — every `toast()` call (standalone import or `useToast()`) renders\n * into whichever `<ToastProvider>` is mounted, the same way there should\n * only be one `<Toaster />` in a react-hot-toast app.\n */\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n  children,\n  maxToasts = 5,\n  containerClassName,\n  position = \"bottom-right\",\n}) => {\n  const [toasts, setToasts] = useState<Toast[]>([]);\n\n  useEffect(() => {\n    store.setMaxToasts(maxToasts);\n  }, [maxToasts]);\n\n  useEffect(() => store.subscribe(setToasts), []);\n\n  return (\n    <>\n      {children}\n      <div\n        // The container is the live region, established up-front — role=\"alert\"\n        // on a node inserted at the same moment is frequently missed by\n        // screen readers.\n        role=\"region\"\n        aria-label=\"Notifications\"\n        aria-live=\"polite\"\n        className={cn(\n          \"fixed z-60 flex flex-col gap-2\",\n          POSITION_CLASSES[position],\n          containerClassName,\n        )}\n      >\n        {toasts.map((t) => (\n          <ToastItem key={t.id} toast={t} onClose={() => store.dismiss(t.id)} />\n        ))}\n      </div>\n    </>\n  );\n};\n\n/*\n * All colors come from the theme's status tokens (--success / --destructive /\n * --warning / --info + their foregrounds), so toasts follow whatever palette\n * the consumer defines — in BOTH modes, with no dark: overrides needed: the\n * token values themselves change when .dark is active.\n *\n *   light → the default: a clean neutral card (like react-hot-toast) — only\n *           the icon carries the status color, title/description stay neutral\n *   soft  → tinted translucent surface, for when the whole toast should read\n *           as \"this status\" at a glance\n *   dark  → solid status surface, for high-emphasis alerts\n */\nconst variantStyles = {\n  light: {\n    success: { bg: \"bg-popover\", border: \"border-border\", text: \"text-popover-foreground\", icon: \"text-success\" },\n    error: { bg: \"bg-popover\", border: \"border-border\", text: \"text-popover-foreground\", icon: \"text-destructive\" },\n    warning: { bg: \"bg-popover\", border: \"border-border\", text: \"text-popover-foreground\", icon: \"text-warning\" },\n    info: { bg: \"bg-popover\", border: \"border-border\", text: \"text-popover-foreground\", icon: \"text-info\" },\n    loading: { bg: \"bg-popover\", border: \"border-border\", text: \"text-popover-foreground\", icon: \"text-muted-foreground\" },\n  },\n\n  soft: {\n    success: { bg: \"bg-success/10\", border: \"border-success/30\", text: \"text-success\", icon: \"text-success\" },\n    error: { bg: \"bg-destructive/10\", border: \"border-destructive/30\", text: \"text-destructive\", icon: \"text-destructive\" },\n    warning: { bg: \"bg-warning/10\", border: \"border-warning/30\", text: \"text-warning\", icon: \"text-warning\" },\n    info: { bg: \"bg-info/10\", border: \"border-info/30\", text: \"text-info\", icon: \"text-info\" },\n    loading: { bg: \"bg-muted\", border: \"border-border\", text: \"text-foreground\", icon: \"text-muted-foreground\" },\n  },\n\n  dark: {\n    success: { bg: \"bg-success text-success-foreground\", border: \"border-success\", text: \"text-success-foreground\", icon: \"text-success-foreground\" },\n    error: { bg: \"bg-destructive text-destructive-foreground\", border: \"border-destructive\", text: \"text-destructive-foreground\", icon: \"text-destructive-foreground\" },\n    warning: { bg: \"bg-warning text-warning-foreground\", border: \"border-warning\", text: \"text-warning-foreground\", icon: \"text-warning-foreground\" },\n    info: { bg: \"bg-info text-info-foreground\", border: \"border-info\", text: \"text-info-foreground\", icon: \"text-info-foreground\" },\n    loading: { bg: \"bg-muted text-foreground\", border: \"border-border\", text: \"text-foreground\", icon: \"text-muted-foreground\" },\n  },\n};\n\nconst IconMap = {\n  success: CheckCircle,\n  error: AlertCircle,\n  warning: AlertTriangle,\n  info: Info,\n  loading: Loader2,\n};\n\nconst ToastItem: React.FC<{ toast: Toast; onClose: () => void }> = ({\n  toast: t,\n  onClose,\n}) => {\n  const {\n    title,\n    description,\n    type = \"info\",\n    variant = \"light\",\n    icon,\n    className,\n    style,\n    titleClassName,\n    descriptionClassName,\n    iconClassName,\n    contentClassName,\n    closeButtonClassName,\n  } = t;\n\n  // Guard the double lookup — an unexpected variant/type used to throw\n  // \"Cannot read properties of undefined\" and take down the provider subtree.\n  const config = variantStyles[variant]?.[type] ?? variantStyles.light.info;\n\n  const DefaultIcon = IconMap[type] ?? Info;\n\n  return (\n    <div\n      className={cn(\n        \"group relative flex w-full sm:min-w-[200px] sm:max-w-sm md:max-w-md lg:max-w-lg items-start gap-2 rounded-xl\",\n        \"border p-4 pr-10\",\n        config.border,\n        config.bg,\n        \"shadow-md dark:shadow-black/40\",\n        \"transition-shadow duration-300 ease-out\",\n        // Only one animation-name class — `fade-in` and\n        // `slide-in-from-right-full` have the same specificity, so the later\n        // one in the stylesheet won and the slide never played.\n        \"animate-in slide-in-from-right-full\",\n        // hover:scale on a stacked flex column made toasts overlap their\n        // neighbours; a shadow change reads as interactive without reflowing.\n        \"hover:shadow-lg\",\n        className,\n      )}\n      style={style}\n      // Errors interrupt; everything else waits for a pause.\n      role={type === \"error\" ? \"alert\" : \"status\"}\n    >\n      {icon !== undefined ? (\n        icon !== null && (\n          <span\n            aria-hidden=\"true\"\n            className={cn(\"inline-flex h-5 w-5 shrink-0 items-center justify-center\", config.icon, iconClassName)}\n          >\n            {icon}\n          </span>\n        )\n      ) : (\n        <DefaultIcon\n          aria-hidden=\"true\"\n          className={cn(\"h-5 w-5 shrink-0\", config.icon, type === \"loading\" && \"animate-spin\", iconClassName)}\n        />\n      )}\n\n      <div className={cn(\"flex-1\", contentClassName)}>\n        {title && (\n          <div className={cn(\"text-sm font-medium\", config.text, titleClassName)}>\n            {title}\n          </div>\n        )}\n\n        {description && (\n          <div\n            className={cn(\n              \"text-sm text-muted-foreground\",\n              descriptionClassName,\n            )}\n          >\n            {description}\n          </div>\n        )}\n      </div>\n\n      {/* The container already reserved pr-10 for this button, but it was\n          never rendered — leaving a dead gutter and no way to dismiss by\n          pointer. */}\n      <button\n        type=\"button\"\n        aria-label=\"Dismiss notification\"\n        onClick={onClose}\n        className={cn(\n          // text-current: inherits the toast's own text color, so the button\n          // stays readable on soft, card and solid status surfaces alike.\n          \"absolute right-2 top-2 rounded-md p-1.5 transition-opacity\",\n          \"text-current opacity-60 hover:opacity-100\",\n          \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n          closeButtonClassName,\n        )}\n      >\n        <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n      </button>\n    </div>\n  );\n};\n\nexport default ToastItem;\n","\"use client\";\n\nimport React, { useState, useId, memo, ReactNode, CSSProperties } from \"react\";\nimport clsx from \"clsx\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\n/* ---------------- Types ---------------- */\nexport interface AccordionItem {\n  title: string | ReactNode;\n  content: ReactNode;\n}\n\nexport interface AccordionProps {\n  items: AccordionItem[];\n\n  allowMultiple?: boolean;\n  defaultOpen?: number[];\n\n  /* Root */\n  className?: string;\n  style?: CSSProperties;\n\n  /* Item */\n  itemClassName?: string;\n  itemStyle?: CSSProperties;\n\n  /* Header */\n  headerClassName?: string;\n  headerStyle?: CSSProperties;\n\n  /* Title */\n  titleClassName?: string;\n  titleStyle?: CSSProperties;\n\n  /* Icon */\n  iconClassName?: string;\n  iconStyle?: CSSProperties;\n\n  /* Content wrapper */\n  contentWrapperClassName?: string;\n  contentWrapperStyle?: CSSProperties;\n\n  /* Content */\n  contentClassName?: string;\n  contentStyle?: CSSProperties;\n\n  /* Hover (optional override) */\n  hoverClassName?: string;\n  hoverStyle?: CSSProperties;\n\n  /* Defaults (fallback design system) */\n  borderColor?: string;\n  radius?: string | number;\n  shadow?: string;\n\n  /* Motion */\n  duration?: number;\n\n  /* Icon */\n  iconOpen?: ReactNode;\n  iconClose?: ReactNode;\n\n  /* Render override */\n  renderItem?: (params: {\n    item: AccordionItem;\n    index: number;\n    open: boolean;\n    toggle: () => void;\n  }) => ReactNode;\n}\n\n/* ---------------- Component ---------------- */\nexport const Accordion: React.FC<AccordionProps> = memo(\n  ({\n    items,\n    allowMultiple = false,\n    defaultOpen = [],\n\n    className,\n    style,\n\n    itemClassName,\n    itemStyle,\n\n    headerClassName,\n    headerStyle,\n\n    titleClassName,\n    titleStyle,\n\n    iconClassName,\n    iconStyle,\n\n    contentWrapperClassName,\n    contentWrapperStyle,\n\n    contentClassName,\n    contentStyle,\n\n    hoverClassName,\n    hoverStyle,\n\n    borderColor = \"var(--border)\",\n    radius = \"0.5rem\",\n    shadow = \"none\",\n\n    duration = 300,\n\n    iconOpen,\n    iconClose,\n\n    renderItem,\n  }) => {\n    const [openIndexes, setOpenIndexes] = useState<number[]>(defaultOpen);\n    const accordionId = useId();\n\n    const toggle = (i: number) => {\n      setOpenIndexes((prev) =>\n        allowMultiple\n          ? prev.includes(i)\n            ? prev.filter((x) => x !== i)\n            : [...prev, i]\n          : prev.includes(i)\n            ? []\n            : [i],\n      );\n    };\n\n    return (\n      <div\n        className={clsx(className, \"w-full space-y-2 text-foreground\")}\n        style={style}\n      >\n        {items.map((item, index) => {\n          const open = openIndexes.includes(index);\n\n          if (renderItem) {\n            return (\n              <React.Fragment key={index}>\n                {renderItem({\n                  item,\n                  index,\n                  open,\n                  toggle: () => toggle(index),\n                })}\n              </React.Fragment>\n            );\n          }\n\n          return (\n            <div\n              key={index}\n              className={clsx(\n                itemClassName,\n                \"overflow-hidden transition-all bg-accent text-foreground\",\n                \"rounded-md\",\n              )}\n              style={{\n                ...itemStyle,\n              }}\n            >\n              {/* Header */}\n              <button\n                type=\"button\"\n                id={`${accordionId}-trigger-${index}`}\n                aria-expanded={open}\n                aria-controls={`${accordionId}-panel-${index}`}\n                onClick={() => toggle(index)}\n                className={cn(\n                  \"w-full flex items-center justify-between\",\n                  \"px-4 py-3.5 text-left transition-colors\",\n                  // The item wrapper is already bg-accent, so hover:bg-accent\n                  // was a guaranteed no-op — there was no hover feedback at all.\n                  \"hover:bg-accent-foreground/5\",\n                  \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n                  headerClassName,\n                  // hoverClassName is merged last so it can actually win, but\n                  // note it applies at rest too — see the note on hoverStyle.\n                  hoverClassName,\n                )}\n                style={{\n                  // hoverStyle is an inline style and so cannot express :hover;\n                  // it has always applied unconditionally. Kept for\n                  // compatibility, but prefer hoverClassName.\n                  ...headerStyle,\n                  ...hoverStyle,\n                }}\n              >\n                <span\n                  className={cn(\"text-sm text-foreground\", titleClassName)}\n                  style={titleStyle}\n                >\n                  {item.title}\n                </span>\n\n                <span\n                  aria-hidden=\"true\"\n                  className={cn(\"text-muted-foreground\", iconClassName)}\n                  style={iconStyle}\n                >\n                  {open\n                    ? iconOpen || <ChevronUp size={18} />\n                    : iconClose || <ChevronDown size={18} />}\n                </span>\n              </button>\n\n              {/* Content Wrapper.\n                  Uses a grid-rows 0fr→1fr transition instead of measuring\n                  scrollHeight. The old approach had two sources of truth (an\n                  effect writing el.style.maxHeight and a render reading the ref)\n                  which fought each other: defaultOpen items rendered collapsed,\n                  and any unrelated re-render snapped open panels shut. */}\n              <div\n                id={`${accordionId}-panel-${index}`}\n                role=\"region\"\n                aria-labelledby={`${accordionId}-trigger-${index}`}\n                className={cn(\n                  \"grid overflow-hidden\",\n                  open ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n                  contentWrapperClassName,\n                )}\n                style={{\n                  transition: `grid-template-rows ${duration}ms ease`,\n                  ...contentWrapperStyle,\n                }}\n              >\n                {/* min-h-0 lets the grid row actually collapse to 0fr. */}\n                <div className=\"min-h-0 overflow-hidden\">\n                  {/* Content — `inert` while collapsed so its links and buttons\n                      don't stay in the tab order behind a 0-height box. */}\n                  <div\n                    inert={!open ? true : undefined}\n                    className={cn(\n                      \"px-4 py-3.5 text-sm border-t border-border text-accent-foreground bg-background\",\n                      contentClassName,\n                    )}\n                    style={contentStyle}\n                  >\n                    {item.content}\n                  </div>\n                </div>\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    );\n  },\n);\n\nAccordion.displayName = \"Accordion\";\n","\"use client\";\n\nimport React, { useState, useId, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { cn } from \"../../lib/cn\";\n\n/* =========================\n   Types\n========================= */\nexport interface Option {\n  label: string;\n  value: string;\n  disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps {\n  mode?: \"single\" | \"group\";\n\n  name?: string;\n\n  /* ---------- GROUP MODE ---------- */\n  options?: Option[];\n  selectedValues?: string[];\n  onChange?: (values: string[]) => void;\n\n  /* ---------- SINGLE MODE ---------- */\n  label?: string;\n  checked?: boolean;\n  onCheckedChange?: (checked: boolean) => void;\n\n  disabled?: boolean;\n  readOnly?: boolean;\n  required?: boolean;\n  error?: string;\n\n  /* ---------- Styling ---------- */\n  className?: string;\n  containerClassName?: string;\n  itemClassName?: string;\n  labelClassName?: string;\n  textClassName?: string;\n  iconClassName?: string;\n  checkClassName?: string;\n  errorClassName?: string;\n\n  style?: React.CSSProperties;\n  containerStyle?: React.CSSProperties;\n  itemStyle?: React.CSSProperties;\n  labelStyle?: React.CSSProperties;\n  textStyle?: React.CSSProperties;\n  iconStyle?: React.CSSProperties;\n  errorStyle?: React.CSSProperties;\n\n  /* ---------- Icon ---------- */\n  customIcon?: (checked: boolean, option?: Option) => React.ReactNode;\n  iconSize?: number;\n\n  /* ---------- Advanced ---------- */\n  renderItem?: (params: {\n    option?: Option;\n    checked: boolean;\n    focused: boolean;\n    toggle: () => void;\n  }) => React.ReactNode;\n}\n\n/* =========================\n   Component\n========================= */\nexport const Checkbox: React.FC<CheckboxGroupProps> = ({\n  mode = \"single\",\n\n  name,\n\n  options = [],\n  selectedValues = [],\n  onChange,\n\n  label,\n  checked = false,\n  onCheckedChange,\n\n  disabled = false,\n  readOnly = false,\n  required = false,\n  error,\n\n  className,\n  containerClassName,\n  itemClassName,\n  labelClassName,\n  textClassName,\n  iconClassName,\n  checkClassName,\n  errorClassName,\n\n  style,\n  containerStyle,\n  itemStyle,\n  labelStyle,\n  textStyle,\n  iconStyle,\n  errorStyle,\n\n  customIcon,\n  iconSize = 20,\n\n  renderItem,\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n  const generatedId = useId();\n  const errorId = error ? `${generatedId}-error` : undefined;\n\n  /* =========================\n     Handlers\n  ========================= */\n  const handleGroupChange = (value: string) => {\n    if (!onChange || disabled || readOnly) return;\n    // The click path runs through the <label>, so a per-option `disabled` has\n    // to be re-checked here — the input's own `disabled` attribute alone let\n    // disabled options stay toggleable.\n    if (options.find((o) => o.value === value)?.disabled) return;\n\n    const updated = selectedValues.includes(value)\n      ? selectedValues.filter((v) => v !== value)\n      : [...selectedValues, value];\n\n    onChange(updated);\n  };\n\n  const handleSingleChange = () => {\n    if (!onCheckedChange || disabled || readOnly) return;\n    onCheckedChange(!checked);\n  };\n\n  /*\n   * The old group keyboard handler lived here. It was unreachable: it bailed on\n   * `focusedIndex === null`, and the only thing that set focusedIndex was\n   * onFocus on a <label> whose input was display:none — so nothing was ever\n   * focusable. Now that each input is `sr-only` rather than `hidden`, Tab and\n   * Space work natively, which is the expected behavior for a checkbox group\n   * (unlike radios, checkboxes are not arrow-navigable by spec).\n   */\n\n  /* =========================\n     Default Icon\n  ========================= */\n  const DefaultIcon = (isChecked: boolean) => (\n    <span\n      className={cn(\n        \"inline-flex items-center justify-center rounded border transition-colors shrink-0\",\n        isChecked\n          ? \"border-primary bg-primary\"\n          : \"border-border bg-transparent\",\n        // The real input is sr-only, so the focus ring has to be rendered here.\n        \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background\",\n        iconClassName,\n      )}\n      style={{\n        width: iconSize,\n        height: iconSize,\n        ...iconStyle,\n      }}\n    >\n      {isChecked && (\n        <svg\n          viewBox=\"0 0 24 24\"\n          // Pairs with bg-primary, so a light --primary keeps a readable tick.\n          className={cn(\"text-primary-foreground\", checkClassName)}\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth={3}\n          style={{ width: iconSize * 0.6, height: iconSize * 0.6 }}\n        >\n          <polyline points=\"20 6 9 17 4 12\" />\n        </svg>\n      )}\n    </span>\n  );\n\n  /* =========================\n     Render Single\n  ========================= */\n  if (mode === \"single\") {\n    const toggle = handleSingleChange;\n\n    if (renderItem) {\n      return (\n        <div className={className} style={style}>\n          {renderItem({\n            checked,\n            focused: false,\n            toggle,\n          })}\n        </div>\n      );\n    }\n\n    return (\n      <div className={className} style={style}>\n        <label\n          className={cn(\n            \"flex items-center justify-between\",\n            disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n            itemClassName,\n            labelClassName,\n          )}\n          style={{ ...itemStyle, ...labelStyle }}\n        >\n          <span\n            className={cn(\"text-sm text-foreground\", textClassName)}\n            style={textStyle}\n          >\n            {label}\n          </span>\n\n          <input\n            type=\"checkbox\"\n            // `hidden` (display:none) took this out of the tab order and the\n            // a11y tree, and made `required` block form submission. `sr-only`\n            // + `peer` keeps it invisible but focusable and announced.\n            className=\"sr-only peer\"\n            name={name}\n            checked={checked}\n            disabled={disabled || readOnly}\n            required={required}\n            aria-invalid={error ? true : undefined}\n            aria-describedby={errorId}\n            onChange={toggle}\n          />\n\n          {customIcon ? customIcon(checked) : DefaultIcon(checked)}\n        </label>\n\n        {error && (\n          <p\n            id={errorId}\n            role=\"alert\"\n            className={cn(\"text-sm text-destructive mt-1\", errorClassName)}\n            style={errorStyle}\n          >\n            {error}\n          </p>\n        )}\n      </div>\n    );\n  }\n\n  /* =========================\n     Render Group\n  ========================= */\n  return (\n    <div\n      ref={containerRef}\n      role=\"group\"\n      aria-invalid={error ? true : undefined}\n      aria-describedby={errorId}\n      className={cn(\"flex flex-col gap-2\", containerClassName || className)}\n      style={containerStyle || style}\n    >\n      {options.map((option, index) => {\n        const isChecked = selectedValues.includes(option.value);\n        const focused = focusedIndex === index;\n\n        const toggle = () => handleGroupChange(option.value);\n\n        if (renderItem) {\n          return (\n            <React.Fragment key={option.value}>\n              {renderItem({\n                option,\n                checked: isChecked,\n                focused,\n                toggle,\n              })}\n            </React.Fragment>\n          );\n        }\n\n        const itemDisabled = disabled || option.disabled;\n\n        return (\n          <label\n            key={option.value}\n            onFocus={() => setFocusedIndex(index)}\n            className={cn(\n              \"flex items-center justify-between\",\n              itemDisabled\n                ? \"opacity-50 cursor-not-allowed\"\n                : \"cursor-pointer\",\n              itemClassName,\n              labelClassName,\n            )}\n            style={{ ...itemStyle, ...labelStyle }}\n          >\n            <span\n              className={cn(\"text-sm text-foreground\", textClassName)}\n              style={textStyle}\n            >\n              {option.label}\n            </span>\n\n            <input\n              type=\"checkbox\"\n              className=\"sr-only peer\"\n              name={name}\n              value={option.value}\n              checked={isChecked}\n              disabled={itemDisabled || readOnly}\n              onChange={toggle}\n            />\n\n            {customIcon\n              ? customIcon(isChecked, option)\n              : DefaultIcon(isChecked)}\n          </label>\n        );\n      })}\n\n      {error && (\n        <p\n          id={errorId}\n          role=\"alert\"\n          className={cn(\"text-sm text-destructive mt-1\", errorClassName)}\n          style={errorStyle}\n        >\n          {error}\n        </p>\n      )}\n    </div>\n  );\n};","\"use client\";\n\nimport React, { useState, useId, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { cn } from \"../../lib/cn\";\n\n/* -------------------------------------------------------------------------- */\n/* 🧩 Types                                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport interface Option {\n  label: string;\n  value: string;\n  description?: string;\n  icon?: React.ReactNode;\n  disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n  name?: string;\n  options: Option[];\n  selectedValue?: string;\n  onChange?: (value: string) => void;\n\n  disabled?: boolean;\n  readOnly?: boolean;\n  required?: boolean;\n  error?: string;\n\n  /** 🎨 Root Container */\n  className?: string;\n  style?: React.CSSProperties;\n\n  /** 🎨 Item Container */\n  itemClassName?: string;\n  itemStyle?: React.CSSProperties;\n\n  /** 🎨 Label Text */\n  labelClassName?: string;\n  labelStyle?: React.CSSProperties;\n\n  /** 🎨 Description Text */\n  descriptionClassName?: string;\n  descriptionStyle?: React.CSSProperties;\n\n  /** 🎨 Icon Wrapper */\n  iconWrapperClassName?: string;\n  iconWrapperStyle?: React.CSSProperties;\n\n  /** 🎨 Radio Indicator */\n  indicatorClassName?: string;\n  indicatorStyle?: React.CSSProperties;\n\n  /** 🎨 Inner Dot */\n  dotClassName?: string;\n  dotStyle?: React.CSSProperties;\n\n  /** 🎨 Error Message */\n  errorClassName?: string;\n  errorStyle?: React.CSSProperties;\n\n  /** ⚙️ Configuration */\n  size?: \"sm\" | \"md\" | \"lg\";\n  orientation?: \"vertical\" | \"horizontal\";\n\n  animationDuration?: number;\n}\n\n/* -------------------------------------------------------------------------- */\n/* 🔘 RadioGroup                                                             */\n/* -------------------------------------------------------------------------- */\n\nexport const RadioGroup: React.FC<RadioGroupProps> = ({\n  name,\n  options,\n  selectedValue,\n  onChange,\n\n  disabled = false,\n  readOnly = false,\n  required = false,\n  error,\n\n  className,\n  style,\n\n  itemClassName,\n  itemStyle,\n\n  labelClassName,\n  labelStyle,\n\n  descriptionClassName,\n  descriptionStyle,\n\n  iconWrapperClassName,\n  iconWrapperStyle,\n\n  indicatorClassName,\n  indicatorStyle,\n\n  dotClassName,\n  dotStyle,\n\n  errorClassName,\n  errorStyle,\n\n  size = \"md\",\n  orientation = \"vertical\",\n\n  animationDuration = 0.2,\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n  /* 📏 Size configurations */\n  const sizeConfig = {\n    sm: {\n      item: \"px-3 py-2\",\n      indicator: \"w-4 h-4\",\n      dot: \"w-2 h-2\",\n      text: \"text-xs\",\n      desc: \"text-xs\",\n      icon: \"w-3.5 h-3.5\",\n      outerGap: \"gap-3\",\n      innerGap: \"gap-2\",\n    },\n    md: {\n      item: \"px-4 py-3\",\n      indicator: \"w-5 h-5\",\n      dot: \"w-2.5 h-2.5\",\n      text: \"text-sm\",\n      desc: \"text-xs\",\n      icon: \"w-4 h-4\",\n      outerGap: \"gap-4\",\n      innerGap: \"gap-3\",\n    },\n    lg: {\n      item: \"px-5 py-4\",\n      indicator: \"w-6 h-6\",\n      dot: \"w-3 h-3\",\n      text: \"text-base\",\n      desc: \"text-sm\",\n      icon: \"w-5 h-5\",\n      outerGap: \"gap-4\",\n      innerGap: \"gap-3\",\n    },\n  } as const;\n\n  const currentSize = sizeConfig[size];\n\n  const generatedId = useId();\n  const groupName = name ?? generatedId;\n  const errorId = error ? `${generatedId}-error` : undefined;\n\n  /*\n   * Keyboard navigation is intentionally NOT hand-rolled. Now that the radios\n   * are real focusable inputs sharing a `name`, the browser gives us arrow-key\n   * roving, disabled-option skipping and a single tab stop for free. The old\n   * hand-rolled handler ran off a `focusedIndex` that could never change (its\n   * only setter was onFocus on a non-focusable <label>), and would now\n   * double-fire against the native behavior.\n   */\n\n  return (\n    <div\n      ref={containerRef}\n      role=\"radiogroup\"\n      aria-required={required}\n      aria-invalid={!!error}\n      aria-describedby={errorId}\n      className={cn(\n        \"outline-none\",\n        orientation === \"vertical\"\n          ? \"flex flex-col gap-2\"\n          : \"flex flex-row gap-2 flex-wrap\",\n        className,\n      )}\n      style={style}\n    >\n      {options.map((option, i) => {\n        const checked = selectedValue === option.value;\n        const itemDisabled = disabled || option.disabled;\n\n        const handleSelect = () => {\n          if (itemDisabled || readOnly) return;\n          onChange?.(option.value);\n          setFocusedIndex(i);\n        };\n\n        return (\n          <label\n            key={option.value}\n            className={cn(\n              \"relative flex items-center justify-between rounded-xl border transition-all\",\n              currentSize.outerGap,\n              currentSize.item,\n              \"bg-background border-border\",\n              // Checked comes after hover so the selected tint isn't lost while\n              // the pointer is over the item.\n              !itemDisabled && \"hover:bg-accent/60 cursor-pointer\",\n              checked && \"border-primary bg-primary/5\",\n              itemDisabled && \"opacity-50 cursor-not-allowed\",\n              \"has-focus-visible:ring-2 has-focus-visible:ring-ring has-focus-visible:ring-offset-2 has-focus-visible:ring-offset-background\",\n              itemClassName,\n            )}\n            style={itemStyle}\n          >\n            {/* Left Content */}\n            <div\n              className={cn(\n                \"flex items-center min-w-0 flex-1\",\n                currentSize.innerGap,\n              )}\n            >\n              {option.icon && (\n                <div\n                  className={cn(\n                    \"text-muted-foreground shrink-0 [&_svg]:w-full [&_svg]:h-full\",\n                    currentSize.icon,\n                    iconWrapperClassName,\n                  )}\n                  style={iconWrapperStyle}\n                >\n                  {option.icon}\n                </div>\n              )}\n\n              <div className=\"min-w-0 flex-1\">\n                <p\n                  className={clsx(\n                    labelClassName,\n                    \"font-medium text-foreground truncate\",\n                    currentSize.text,\n                  )}\n                  style={labelStyle}\n                >\n                  {option.label}\n                </p>\n\n                {option.description && (\n                  <p\n                    className={clsx(\n                      descriptionClassName,\n                      \"text-muted-foreground truncate\",\n                      currentSize.desc,\n                    )}\n                    style={descriptionStyle}\n                  >\n                    {option.description}\n                  </p>\n                )}\n              </div>\n            </div>\n\n            {/* Hidden input for form compatibility */}\n            <input\n              type=\"radio\"\n              name={groupName}\n              value={option.value}\n              checked={checked}\n              onChange={handleSelect}\n              disabled={itemDisabled}\n              readOnly={readOnly}\n              required={required && i === 0} // Only first radio needs required\n              // `hidden`/`display:none` removed the control from the tab order\n              // AND the accessibility tree, and made `required` block form\n              // submission (\"invalid form control is not focusable\").\n              // sr-only keeps it invisible but real.\n              className=\"sr-only\"\n              aria-describedby={errorId}\n            />\n\n            {/* Radio Indicator */}\n            <div\n              className={clsx(\n                indicatorClassName,\n                \"relative flex items-center justify-center rounded-full border transition-all shrink-0\",\n                currentSize.indicator,\n                checked\n                  ? \"border-primary bg-primary\"\n                  : \"border-muted-foreground/40\",\n              )}\n              style={indicatorStyle}\n            >\n              <AnimatePresence>\n                {checked && (\n                  <motion.div\n                    initial={{ scale: 0 }}\n                    animate={{ scale: 1 }}\n                    exit={{ scale: 0 }}\n                    transition={{ duration: animationDuration }}\n                    className={clsx(\n                      dotClassName,\n                      \"rounded-full bg-background\",\n                      currentSize.dot,\n                    )}\n                    style={dotStyle}\n                  />\n                )}\n              </AnimatePresence>\n            </div>\n          </label>\n        );\n      })}\n\n      {/* Error Message */}\n      {error && (\n        <motion.p\n          initial={{ opacity: 0, y: -10 }}\n          animate={{ opacity: 1, y: 0 }}\n          className={clsx(\n            errorClassName,\n            \"text-destructive mt-1\",\n            currentSize.desc,\n          )}\n          style={errorStyle}\n          id={errorId}\n        >\n          {error}\n        </motion.p>\n      )}\n    </div>\n  );\n};\n","\"use client\";\nimport React, { useState, useId, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface Option {\n  label: string;\n  value: string;\n}\n\nexport interface SwitchGroupProps {\n  mode?: \"single\" | \"group\";\n  name?: string;\n  // For group mode\n  options?: Option[];\n  selectedValues?: string[];\n  onChange?: (values: string[]) => void;\n  // For single mode\n  label?: string;\n  checked?: boolean;\n  onCheckedChange?: (checked: boolean) => void;\n\n  disabled?: boolean;\n  readOnly?: boolean;\n  required?: boolean;\n  error?: string;\n\n  /** 🎨 Customization */\n  className?: string;\n  itemClassName?: string;\n  labelClassName?: string;\n  textClassName?: string;\n  switchClassName?: string;\n  thumbClassName?: string;\n  errorClassName?: string;\n\n  style?: React.CSSProperties;\n  itemStyle?: React.CSSProperties;\n  labelStyle?: React.CSSProperties;\n  textStyle?: React.CSSProperties;\n  switchStyle?: React.CSSProperties;\n  thumbStyle?: React.CSSProperties;\n  errorStyle?: React.CSSProperties;\n\n  /** ⚙️ Config */\n  iconSize?: number;\n}\n\nexport const Switch: React.FC<SwitchGroupProps> = ({\n  mode = \"single\",\n  name,\n  options,\n  selectedValues = [],\n  onChange,\n  label,\n  checked = false,\n  onCheckedChange,\n\n  disabled = false,\n  readOnly = false,\n  required = false,\n  error,\n\n  className,\n  itemClassName,\n  labelClassName,\n  textClassName,\n  switchClassName,\n  thumbClassName,\n  errorClassName,\n\n  style,\n  itemStyle,\n  labelStyle,\n  textStyle,\n  switchStyle,\n  thumbStyle,\n  errorStyle,\n\n  iconSize = 20,\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n  const generatedId = useId();\n  const errorId = error ? `${generatedId}-error` : undefined;\n\n  // Track/thumb geometry, derived once so the thumb stays centered and its\n  // travel always matches the track width.\n  const trackWidth = iconSize * 2;\n  const trackHeight = Math.round(iconSize * 1.1);\n  const thumbInset = 2;\n  const thumbSize = trackHeight - thumbInset * 2;\n\n  const handleGroupChange = (value: string) => {\n    if (!onChange || disabled || readOnly || !options) return;\n\n    const updated = selectedValues.includes(value)\n      ? selectedValues.filter((v) => v !== value)\n      : [...selectedValues, value];\n\n    onChange(updated);\n  };\n\n  const handleSingleChange = () => {\n    if (!onCheckedChange || disabled || readOnly) return;\n    onCheckedChange(!checked);\n  };\n\n  /*\n   * The group keyboard handler that lived here was unreachable — it bailed on\n   * `focusedIndex === null`, and focusedIndex was only ever set by onFocus on a\n   * <label> whose input was display:none, so nothing could focus. With the\n   * inputs now `sr-only`, Tab + Space work natively, which is the correct\n   * interaction model for a list of switches.\n   */\n\n  const renderSwitch = (\n    isChecked: boolean,\n    onToggle: () => void,\n    inputValue?: string,\n    isRequired = false,\n  ) => (\n    <>\n      <input\n        type=\"checkbox\"\n        // `hidden` removed this from the tab order and the a11y tree, so the\n        // switch was unreachable by keyboard and `required` blocked submits.\n        className=\"sr-only peer\"\n        role=\"switch\"\n        aria-checked={isChecked}\n        name={name}\n        value={inputValue}\n        checked={isChecked}\n        disabled={disabled || readOnly}\n        required={isRequired}\n        aria-describedby={errorId}\n        onChange={onToggle}\n      />\n\n      {/* SWITCH */}\n      <span\n        className={cn(\n          \"relative inline-flex shrink-0 rounded-full transition-colors\",\n          isChecked ? \"bg-primary\" : \"bg-muted\",\n          \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background\",\n          switchClassName,\n        )}\n        style={{\n          width: trackWidth,\n          height: trackHeight,\n          ...switchStyle,\n        }}\n      >\n        {/* THUMB */}\n        <span\n          className={cn(\n            \"absolute top-1/2 rounded-full shadow bg-background\",\n            thumbClassName,\n          )}\n          style={{\n            // Animate transform, not `left`, and keep the offsets symmetric so\n            // the thumb is actually centered in the track.\n            left: 0,\n            width: thumbSize,\n            height: thumbSize,\n            transform: `translate(${\n              isChecked ? trackWidth - thumbSize - thumbInset : thumbInset\n            }px, -50%)`,\n            transition: \"transform 0.25s ease\",\n            ...thumbStyle,\n          }}\n        />\n      </span>\n    </>\n  );\n\n  return (\n    <div\n      ref={containerRef}\n      // role=\"switch\" used to sit here, on a <div> wrapping the label, the\n      // control and the error text — and without aria-checked. The role now\n      // lives on the real input, where it belongs.\n      role={mode === \"group\" ? \"group\" : undefined}\n      aria-invalid={!!error}\n      aria-describedby={errorId}\n      className={cn(\"flex flex-col gap-2 text-foreground\", className)}\n      style={style}\n    >\n      {mode === \"single\" ? (\n        <label\n          className={clsx(\n            \"flex items-center justify-between cursor-pointer transition-colors\",\n            \"text-foreground\",\n            disabled && \"opacity-50 cursor-not-allowed\",\n            itemClassName,\n            labelClassName,\n          )}\n          style={{ ...itemStyle, ...labelStyle }}\n        >\n          {/* TEXT */}\n          <span\n            className={clsx(\"text-sm text-foreground\", textClassName)}\n            style={textStyle}\n          >\n            {label}\n          </span>\n\n          {renderSwitch(checked, handleSingleChange, undefined, required)}\n        </label>\n      ) : (\n        options?.map((option, index) => {\n          const isChecked = selectedValues.includes(option.value);\n\n          return (\n            <label\n              key={option.value}\n              onFocus={() => setFocusedIndex(index)}\n              className={clsx(\n                \"flex items-center justify-between cursor-pointer transition-colors\",\n                \"text-foreground\",\n                disabled && \"opacity-50 cursor-not-allowed\",\n                itemClassName,\n                labelClassName,\n              )}\n              style={{ ...itemStyle, ...labelStyle }}\n            >\n              {/* TEXT */}\n              <span\n                className={clsx(\"text-sm text-foreground\", textClassName)}\n                style={textStyle}\n              >\n                {option.label}\n              </span>\n\n              {renderSwitch(\n                isChecked,\n                () => handleGroupChange(option.value),\n                option.value,\n              )}\n            </label>\n          );\n        })\n      )}\n\n      {error && (\n        <p\n          id={errorId}\n          role=\"alert\"\n          className={cn(\"text-sm text-destructive\", errorClassName)}\n          style={errorStyle}\n        >\n          {error}\n        </p>\n      )}\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\n/*\n * Reference-counted body scroll lock, shared by every overlay in the library.\n *\n * A naive per-component implementation (\"save the current overflow, restore it\n * on unmount\") corrupts itself as soon as two overlays are open at once: the\n * second one saves `overflow: hidden` as the value to restore, so closing both\n * leaves the page permanently unscrollable. Counting locks fixes that — the\n * original value is captured once, by the first locker, and restored once, by\n * the last.\n */\nlet lockCount = 0;\nlet previousOverflow = \"\";\nlet previousPaddingRight = \"\";\n\nconst lock = () => {\n  if (typeof document === \"undefined\") return;\n\n  if (lockCount === 0) {\n    const { body, documentElement } = document;\n    previousOverflow = body.style.overflow;\n    previousPaddingRight = body.style.paddingRight;\n\n    // Removing the scrollbar reflows the page; pad by its width so the content\n    // behind the overlay doesn't visibly jump.\n    const scrollbarWidth = window.innerWidth - documentElement.clientWidth;\n    if (scrollbarWidth > 0) {\n      const current = parseFloat(getComputedStyle(body).paddingRight) || 0;\n      body.style.paddingRight = `${current + scrollbarWidth}px`;\n    }\n\n    body.style.overflow = \"hidden\";\n  }\n  lockCount += 1;\n};\n\nconst unlock = () => {\n  if (typeof document === \"undefined\") return;\n\n  lockCount = Math.max(0, lockCount - 1);\n  if (lockCount === 0) {\n    document.body.style.overflow = previousOverflow;\n    document.body.style.paddingRight = previousPaddingRight;\n  }\n};\n\n/** Locks body scroll while `active` is true. */\nexport const useScrollLock = (active: boolean) => {\n  useEffect(() => {\n    if (!active) return;\n    lock();\n    return unlock;\n  }, [active]);\n};\n","\"use client\";\n\nimport { useEffect, type RefObject } from \"react\";\n\nconst FOCUSABLE = [\n  \"a[href]\",\n  \"button:not([disabled])\",\n  \"input:not([disabled])\",\n  \"select:not([disabled])\",\n  \"textarea:not([disabled])\",\n  '[tabindex]:not([tabindex=\"-1\"])',\n].join(\",\");\n\n/*\n * Keeps Tab focus inside `containerRef` while `active`, moves focus into the\n * container on open, and returns it to whatever was focused before on close.\n *\n * Without this, Tab from inside a dialog walks straight out into the page\n * behind the overlay — the content is visually covered but still reachable.\n */\nexport const useFocusTrap = (\n  containerRef: RefObject<HTMLElement | null>,\n  active: boolean,\n) => {\n  useEffect(() => {\n    if (!active) return;\n\n    const container = containerRef.current;\n    const previouslyFocused = document.activeElement as HTMLElement | null;\n\n    const focusFirst = () => {\n      const node = containerRef.current;\n      if (!node) return;\n      const target =\n        node.querySelector<HTMLElement>(FOCUSABLE) ??\n        // Nothing focusable inside: focus the container itself so the dialog\n        // is at least the starting point for the next Tab.\n        node;\n      target.focus?.();\n    };\n\n    const frame = requestAnimationFrame(focusFirst);\n\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key !== \"Tab\") return;\n\n      const node = containerRef.current;\n      if (!node) return;\n\n      const focusable = Array.from(\n        node.querySelectorAll<HTMLElement>(FOCUSABLE),\n      ).filter((el) => el.offsetParent !== null || el === document.activeElement);\n\n      if (focusable.length === 0) {\n        e.preventDefault();\n        return;\n      }\n\n      const first = focusable[0];\n      const last = focusable[focusable.length - 1];\n      const activeEl = document.activeElement;\n\n      if (e.shiftKey && (activeEl === first || !node.contains(activeEl))) {\n        e.preventDefault();\n        last.focus();\n      } else if (!e.shiftKey && activeEl === last) {\n        e.preventDefault();\n        first.focus();\n      }\n    };\n\n    document.addEventListener(\"keydown\", handleKeyDown);\n\n    return () => {\n      cancelAnimationFrame(frame);\n      document.removeEventListener(\"keydown\", handleKeyDown);\n      // Only restore if focus is still somewhere inside the closing dialog —\n      // otherwise we'd steal it from wherever the user has since moved.\n      if (!container || container.contains(document.activeElement)) {\n        previouslyFocused?.focus?.();\n      }\n    };\n  }, [active, containerRef]);\n};\n","\"use client\";\n\nimport React, {\n  ReactNode,\n  CSSProperties,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport clsx from \"clsx\";\nimport { X } from \"lucide-react\";\nimport { Button, ButtonProps } from \"./Button\";\nimport { cn } from \"../../lib/cn\";\nimport { useScrollLock } from \"../../lib/useScrollLock\";\nimport { useFocusTrap } from \"../../lib/useFocusTrap\";\n\nexport interface DrawerProps {\n  isOpen: boolean;\n  onClose: () => void;\n  children?: ReactNode;\n  renderContent?: (close: () => void) => ReactNode;\n\n  position?: \"left\" | \"right\" | \"top\" | \"bottom\";\n  size?: string;\n\n  disableOverlayClose?: boolean;\n  /** Also block Escape. Defaults to `disableOverlayClose`. */\n  disableEscapeClose?: boolean;\n  /** Accessible name for the dialog when no DrawerHeader is used. */\n  ariaLabel?: string;\n\n  overlayClassName?: string;\n  overlayStyle?: CSSProperties;\n  /** Applied to the sliding panel that hosts the drawer content. */\n  panelClassName?: string;\n}\n\nexport function Drawer({\n  isOpen,\n  onClose,\n  children,\n  renderContent,\n  position = \"right\",\n  size = \"320px\",\n  disableOverlayClose = false,\n  disableEscapeClose,\n  ariaLabel,\n  overlayClassName,\n  overlayStyle,\n  panelClassName,\n}: DrawerProps) {\n  const panelRef = useRef<HTMLDivElement>(null);\n  const escapeDisabled = disableEscapeClose ?? disableOverlayClose;\n\n  const onCloseRef = useRef(onClose);\n  onCloseRef.current = onClose;\n\n  useEffect(() => {\n    if (!isOpen || escapeDisabled) return;\n    const handleEsc = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") onCloseRef.current();\n    };\n    document.addEventListener(\"keydown\", handleEsc);\n    return () => document.removeEventListener(\"keydown\", handleEsc);\n  }, [isOpen, escapeDisabled]);\n\n  // Drawer previously had no scroll lock at all, so the page scrolled behind it.\n  useScrollLock(isOpen);\n  useFocusTrap(panelRef, isOpen);\n\n  const getMotion = () => {\n    switch (position) {\n      case \"left\":\n        return {\n          initial: { x: \"-100%\" },\n          animate: { x: 0 },\n          exit: { x: \"-100%\" },\n        };\n      case \"right\":\n        return {\n          initial: { x: \"100%\" },\n          animate: { x: 0 },\n          exit: { x: \"100%\" },\n        };\n      case \"top\":\n        return {\n          initial: { y: \"-100%\" },\n          animate: { y: 0 },\n          exit: { y: \"-100%\" },\n        };\n      case \"bottom\":\n        return {\n          initial: { y: \"100%\" },\n          animate: { y: 0 },\n          exit: { y: \"100%\" },\n        };\n    }\n  };\n\n  const getSizeStyle = (): CSSProperties => {\n    switch (position) {\n      case \"left\":\n      case \"right\":\n        // Clamp to the viewport: an unclamped size=\"400px\" overflowed a 320px\n        // phone and created a horizontal scrollbar.\n        return { width: `min(${size}, 100vw)`, height: \"100%\" };\n      case \"top\":\n      case \"bottom\":\n        return { height: `min(${size}, 100vh)`, width: \"100%\" };\n      default:\n        return { width: `min(${size}, 100vw)`, height: \"100%\" };\n    }\n  };\n\n  const handleOverlayClick = () => {\n    if (!disableOverlayClose) onClose();\n  };\n\n  const motionProps = getMotion();\n\n  return (\n    <AnimatePresence>\n      {isOpen && (\n        <div key=\"drawer-root\" className=\"fixed inset-0 z-50\">\n          {/* Overlay */}\n          <motion.div\n            initial={{ opacity: 0 }}\n            animate={{ opacity: 1 }}\n            exit={{ opacity: 0 }}\n            onClick={handleOverlayClick}\n            className={cn(\n              \"absolute inset-0 bg-background/80 backdrop-blur-sm\",\n              overlayClassName,\n            )}\n            style={overlayStyle}\n          />\n\n          {/* Panel */}\n          <motion.div\n            {...motionProps}\n            ref={panelRef}\n            role=\"dialog\"\n            aria-modal=\"true\"\n            aria-label={ariaLabel}\n            tabIndex={-1}\n            transition={{ duration: 0.25 }}\n            className={cn(\n              // `absolute`, not `fixed`: the parent is already a fixed,\n              // full-viewport layer, and a nested fixed element competed with\n              // its own parent's z-50.\n              \"absolute flex flex-col bg-background border-border shadow-2xl outline-none\",\n              \"border\",\n              position === \"right\" && \"right-0 top-0\",\n              position === \"left\" && \"left-0 top-0\",\n              position === \"top\" && \"top-0 left-0 right-0\",\n              position === \"bottom\" && \"bottom-0 left-0 right-0\",\n              panelClassName,\n            )}\n            style={getSizeStyle()}\n          >\n            {renderContent ? renderContent(onClose) : children}\n          </motion.div>\n        </div>\n      )}\n    </AnimatePresence>\n  );\n}\n\nexport interface DrawerContentProps {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\nexport function DrawerContent({\n  children,\n  className,\n  style,\n}: DrawerContentProps) {\n  return (\n    <div className={clsx(\"flex flex-col h-full\", className)} style={style}>\n      {children}\n    </div>\n  );\n}\n\nexport function DrawerBody({\n  children,\n  className,\n  style,\n}: {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}) {\n  return (\n    <div className={cn(\"flex-1 p-6 overflow-auto\", className)} style={style}>\n      {children}\n    </div>\n  );\n}\n\nexport interface DrawerHeaderProps {\n  title?: string;\n  icon?: ReactNode;\n  onClose?: () => void;\n  className?: string;\n  style?: CSSProperties;\n  titleWrapperClassName?: string;\n  titleClassName?: string;\n  closeButtonClassName?: string;\n}\n\nexport function DrawerHeader({\n  title,\n  icon,\n  onClose,\n  className,\n  style,\n  titleWrapperClassName,\n  titleClassName,\n  closeButtonClassName,\n}: DrawerHeaderProps) {\n  return (\n    <div\n      className={cn(\n        \"flex items-center justify-between px-6 py-4 border-b border-border\",\n        className,\n      )}\n      style={style}\n    >\n      <div className={cn(\"flex items-center gap-2 font-semibold\", titleWrapperClassName)}>\n        {icon}\n        {title && <h3 className={cn(\"text-sm\", titleClassName)}>{title}</h3>}\n      </div>\n\n      {onClose && (\n        <button\n          type=\"button\"\n          aria-label=\"Close drawer\"\n          onClick={onClose}\n          className={cn(\n            \"p-2 rounded-lg hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n            closeButtonClassName,\n          )}\n        >\n          <X size={18} aria-hidden=\"true\" />\n        </button>\n      )}\n    </div>\n  );\n}\n\nexport function DrawerFooter({\n  children,\n  className,\n  style,\n}: {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}) {\n  return (\n    <div\n      className={cn(\n        \"flex justify-end gap-3 px-6 py-3 border-t border-border bg-accent/60\",\n        className,\n      )}\n      style={style}\n    >\n      {children}\n    </div>\n  );\n}\n\nexport interface DrawerTriggerProps extends ButtonProps {\n  children: React.ReactNode;\n  drawerContent: (props: { close: () => void }) => React.ReactNode;\n  /** Forwarded to the underlying <Drawer />. */\n  drawerProps?: Omit<DrawerProps, \"isOpen\" | \"onClose\" | \"children\">;\n}\n\nexport function DrawerTriggerButton({\n  children,\n  drawerContent,\n  drawerProps,\n  onClick,\n  ...props\n}: DrawerTriggerProps) {\n  const [open, setOpen] = useState(false);\n\n  return (\n    <>\n      <Button\n        {...props}\n        // Chain rather than replace — this used to drop a consumer's onClick.\n        onClick={(e) => {\n          onClick?.(e);\n          setOpen(true);\n        }}\n      >\n        {children}\n      </Button>\n\n      <Drawer {...drawerProps} isOpen={open} onClose={() => setOpen(false)}>\n        {drawerContent({ close: () => setOpen(false) })}\n      </Drawer>\n    </>\n  );\n}\n\n/* ---------------- 🧩 Drawer Button ---------------- */\nexport interface DrawerButtonProps {\n  label?: string;\n  icon?: ReactNode;\n  iconPosition?: \"left\" | \"right\";\n  onClick?: () => void;\n  className?: string;\n  style?: React.CSSProperties;\n  labelClassName?: string;\n  iconClassName?: string;\n}\n\nexport const DrawerButton: React.FC<DrawerButtonProps> = ({\n  label = \"\",\n  icon,\n  iconPosition = \"left\",\n  onClick,\n  className,\n  style,\n  labelClassName,\n  iconClassName,\n}) => (\n  <button\n    type=\"button\"\n    onClick={onClick}\n    style={style}\n    className={clsx(\n      // Missing space here fused these into \"justify-centertransition-all\",\n      // a class that doesn't exist — both utilities were silently lost.\n      \"inline-flex items-center justify-center transition-all\",\n      className,\n    )}\n  >\n    {icon && iconPosition === \"left\" && (\n      <span className={iconClassName}>{icon}</span>\n    )}\n    <span className={labelClassName}>{label}</span>\n    {icon && iconPosition === \"right\" && (\n      <span className={iconClassName}>{icon}</span>\n    )}\n  </button>\n);\n","\"use client\";\n\nimport React, {\n  useEffect,\n  useRef,\n  useState,\n  forwardRef,\n  useImperativeHandle,\n  useCallback,\n  useMemo,\n  useId,\n  useLayoutEffect,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { ChevronDown, Check } from \"lucide-react\";\n\nexport interface SelectOption {\n  label: string;\n  value: string;\n  icon?: React.ReactNode;\n  description?: string;\n  onClick?: (option: SelectOption, event: React.MouseEvent) => void;\n}\n\nexport interface SelectProps {\n  label?: string;\n  name?: string;\n  value?: string | string[];\n  showDescription?: boolean;\n  showCheckIcon?: boolean;\n  defaultValue?: string | string[];\n  onValueChange?: (value: string | string[], name?: string) => void;\n  options?: SelectOption[];\n  placeholder?: string;\n  required?: boolean;\n  disabled?: boolean;\n  error?: string | boolean;\n  success?: boolean;\n  helperText?: string;\n  multiple?: boolean;\n\n  /** Icons */\n  labelIcon?: React.ElementType;\n  prefixIcon?: React.ElementType;\n  dropdownIcon?: React.ElementType;\n\n  /** Configuration */\n  size?: \"sm\" | \"md\" | \"lg\";\n  maxDropdownHeight?: string | number;\n\n  searchable?: boolean;\n  searchPlaceholder?: string;\n  searchClassName?: string;\n  searchStyle?: React.CSSProperties;\n\n  /** Customization */\n  className?: string;\n  containerClassName?: string;\n  labelClassName?: string;\n  triggerClassName?: string;\n  valueClassName?: string;\n  dropdownClassName?: string;\n  itemClassName?: string;\n  iconClassName?: string;\n  helperClassName?: string;\n  /** The label icon rendered before `label`. */\n  labelIconClassName?: string;\n  /** The wrapper around the search input, when `searchable` is set. */\n  searchWrapperClassName?: string;\n  /** The \"No options available\" empty state. */\n  emptyClassName?: string;\n  /** An option's label text. */\n  itemLabelClassName?: string;\n  /** An option's description text, when `showDescription` is set. */\n  itemDescriptionClassName?: string;\n\n  /** Item Icon Styling */\n  itemIconClassName?: string;\n  itemIconStyle?: React.CSSProperties;\n\n  /** Check Icon Styling */\n  checkIconClassName?: string;\n  checkIconStyle?: React.CSSProperties;\n\n  style?: React.CSSProperties;\n  triggerStyle?: React.CSSProperties;\n  dropdownStyle?: React.CSSProperties;\n  itemStyle?: React.CSSProperties;\n}\n\nexport const Select = forwardRef<HTMLDivElement, SelectProps>((props, ref) => {\n  const {\n    label,\n    name,\n    value,\n    defaultValue,\n    onValueChange,\n    options = [],\n    placeholder = \"Select...\",\n    required,\n    disabled,\n    error,\n    success,\n    helperText,\n    multiple = false,\n    showDescription = false,\n    showCheckIcon = true,\n\n    labelIcon: LabelIcon,\n    prefixIcon: PrefixIcon,\n    dropdownIcon: DropdownIcon = ChevronDown,\n\n    searchClassName,\n    searchStyle,\n    searchPlaceholder,\n    searchable = false,\n\n    size = \"md\",\n    maxDropdownHeight = \"240px\",\n\n    className,\n    containerClassName,\n    labelClassName,\n    triggerClassName,\n    valueClassName,\n    dropdownClassName,\n    itemClassName,\n    iconClassName,\n    helperClassName,\n    labelIconClassName,\n    searchWrapperClassName,\n    emptyClassName,\n    itemLabelClassName,\n    itemDescriptionClassName,\n\n    itemIconClassName,\n    itemIconStyle,\n\n    checkIconClassName,\n    checkIconStyle,\n\n    style,\n    triggerStyle,\n    dropdownStyle,\n    itemStyle,\n  } = props;\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  useImperativeHandle(ref, () => containerRef.current!);\n  const generatedHelperTextId = useId();\n  const [coords, setCoords] = useState({ top: 0, left: 0, width: 0 });\n  const [position, setPosition] = useState<\"top\" | \"bottom\">(\"bottom\");\n\n  const [open, setOpen] = useState(false);\n  const [search, setSearch] = useState(\"\");\n  const [internalValue, setInternalValue] = useState<\n    string | string[] | undefined\n  >(defaultValue);\n  const [focusedIndex, setFocusedIndex] = useState(-1);\n\n  const isControlled = value !== undefined;\n  const currentValue = isControlled ? value : internalValue;\n\n  const triggerRef = useRef<HTMLButtonElement>(null);\n  const listRef = useRef<HTMLUListElement>(null);\n  const searchRef = useRef<HTMLInputElement>(null);\n\n  // Size configuration. `triggerWithPrefix` has to reserve exactly\n  // inset + icon width + gap, so it is defined per size alongside the icon it\n  // makes room for rather than as one fixed `pl-9` for every size.\n  const sizeConfig = {\n    sm: {\n      trigger: \"px-2.5 py-1.5 text-xs\",\n      triggerWithPrefix: \"pl-7 pr-2.5 py-1.5 text-xs\",\n      prefixInset: \"left-2\",\n      item: \"px-2.5 py-1.5 text-xs\",\n      icon: \"w-3 h-3\",\n      checkIcon: \"w-3 h-3\",\n      search: \"px-2 py-1 text-xs\",\n      empty: \"px-2.5 py-1.5 text-xs\",\n    },\n    md: {\n      trigger: \"px-3 py-2 text-sm\",\n      triggerWithPrefix: \"pl-9 pr-3 py-2 text-sm\",\n      prefixInset: \"left-3\",\n      item: \"px-3 py-2 text-sm\",\n      icon: \"w-4 h-4\",\n      checkIcon: \"w-4 h-4\",\n      search: \"px-2 py-1.5 text-sm\",\n      empty: \"px-3 py-2 text-sm\",\n    },\n    lg: {\n      trigger: \"px-4 py-3 text-base\",\n      triggerWithPrefix: \"pl-11 pr-4 py-3 text-base\",\n      prefixInset: \"left-3.5\",\n      item: \"px-4 py-3 text-base\",\n      icon: \"w-5 h-5\",\n      checkIcon: \"w-5 h-5\",\n      search: \"px-2.5 py-2 text-base\",\n      empty: \"px-4 py-3 text-base\",\n    },\n  } as const;\n\n  // Rebuilt every render if left inline, which re-fires the effects below that\n  // depend on it — including the one that calls trigger.focus().\n  const selectedValues: string[] = useMemo(\n    () =>\n      multiple\n        ? Array.isArray(currentValue)\n          ? currentValue\n          : currentValue\n            ? [currentValue]\n            : []\n        : currentValue\n          ? [currentValue as string]\n          : [],\n    [multiple, currentValue],\n  );\n\n  const filteredOptions = useMemo(\n    () =>\n      options.filter((opt) =>\n        opt.label.toLowerCase().includes(search.toLowerCase()),\n      ),\n    [options, search],\n  );\n\n  useLayoutEffect(() => {\n    if (!open || !triggerRef.current || !listRef.current) return;\n\n    const updatePosition = () => {\n      const rect = triggerRef.current!.getBoundingClientRect();\n      const menuHeight = listRef.current!.offsetHeight || 240;\n\n      const spaceBottom = window.innerHeight - rect.bottom;\n      const spaceTop = rect.top;\n\n      const shouldOpenTop =\n        spaceBottom < menuHeight + 10 && spaceTop > menuHeight;\n\n      const top = shouldOpenTop ? rect.top - menuHeight - 8 : rect.bottom + 8;\n\n      const left = rect.left;\n\n      const width = rect.width;\n\n      setPosition(shouldOpenTop ? \"top\" : \"bottom\");\n\n      setCoords({\n        top,\n        left,\n        width,\n      });\n    };\n\n    updatePosition();\n\n    window.addEventListener(\"scroll\", updatePosition, true);\n    window.addEventListener(\"resize\", updatePosition);\n\n    return () => {\n      window.removeEventListener(\"scroll\", updatePosition, true);\n      window.removeEventListener(\"resize\", updatePosition);\n    };\n  }, [open]);\n\n  // Close on outside click\n  useEffect(() => {\n    const handler = (e: MouseEvent) => {\n      if (\n        containerRef.current &&\n        !containerRef.current.contains(e.target as Node)\n      ) {\n        setOpen(false);\n      }\n    };\n    document.addEventListener(\"mousedown\", handler);\n    return () => document.removeEventListener(\"mousedown\", handler);\n  }, []);\n\n  useEffect(() => {\n    if (!open) return;\n\n    const selectedIndex = filteredOptions.findIndex((opt) =>\n      selectedValues.includes(opt.value),\n    );\n\n    setFocusedIndex(selectedIndex >= 0 ? selectedIndex : 0);\n\n    requestAnimationFrame(() => {\n      const el = listRef.current?.children?.[\n        selectedIndex >= 0 ? selectedIndex : 0\n      ] as HTMLElement;\n\n      el?.scrollIntoView({ block: \"nearest\" });\n    });\n  }, [open]);\n\n  useEffect(() => {\n    if (!open) return;\n\n    if (filteredOptions.length === 0) {\n      setFocusedIndex(-1);\n      return;\n    }\n\n    setFocusedIndex((prev) => {\n      if (prev < 0) return 0;\n      return prev >= filteredOptions.length ? filteredOptions.length - 1 : prev;\n    });\n  }, [filteredOptions, open]);\n\n  // NOTE: a third effect used to live here that called triggerRef.focus() with\n  // `selectedValues` in its deps. Because that array was rebuilt every render,\n  // the effect re-ran on every render while open and continuously yanked focus\n  // out of the search box, making `searchable` impossible to type in. The two\n  // effects above already cover setting and clamping focusedIndex.\n\n  // Move real focus into the search box when the menu opens, so typing works.\n  useEffect(() => {\n    if (!open || !searchable) return;\n    const id = requestAnimationFrame(() => searchRef.current?.focus());\n    return () => cancelAnimationFrame(id);\n  }, [open, searchable]);\n\n  const handleSelect = useCallback(\n    (opt: SelectOption, e?: React.MouseEvent) => {\n      if (disabled) return;\n\n      opt.onClick?.(opt, e!);\n\n      let newValue: string | string[];\n\n      if (multiple) {\n        const exists = selectedValues.includes(opt.value);\n        newValue = exists\n          ? selectedValues.filter((v) => v !== opt.value)\n          : [...selectedValues, opt.value];\n      } else {\n        newValue = opt.value;\n        setOpen(false);\n        setFocusedIndex(-1);\n      }\n\n      if (!isControlled) setInternalValue(newValue);\n      onValueChange?.(newValue, name);\n    },\n    [disabled, selectedValues, multiple, isControlled, name, onValueChange],\n  );\n\n  const handleKeyDown = useCallback(\n    // Shared by the trigger button and the search input.\n    (e: React.KeyboardEvent<HTMLButtonElement | HTMLInputElement>) => {\n      if (!open) {\n        if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n          e.preventDefault();\n          if (!disabled) {\n            setOpen(true);\n            setFocusedIndex(0);\n          }\n        }\n        return;\n      }\n\n      // Handle navigation when dropdown is open\n      if (filteredOptions.length === 0) {\n        if (e.key === \"Escape\") {\n          e.preventDefault();\n          setOpen(false);\n          setFocusedIndex(-1);\n        }\n        return;\n      }\n\n      switch (e.key) {\n        case \"Escape\":\n          e.preventDefault();\n          setOpen(false);\n          setFocusedIndex(-1);\n          break;\n        case \"Enter\":\n        case \" \":\n          e.preventDefault();\n          if (focusedIndex >= 0 && focusedIndex < filteredOptions.length) {\n            handleSelect(filteredOptions[focusedIndex]);\n          }\n          break;\n        case \"ArrowDown\":\n          e.preventDefault();\n          setFocusedIndex((prev) =>\n            prev < filteredOptions.length - 1 ? prev + 1 : prev,\n          );\n          break;\n        case \"ArrowUp\":\n          e.preventDefault();\n          setFocusedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n          break;\n        case \"Home\":\n          e.preventDefault();\n          setFocusedIndex(0);\n          break;\n        case \"End\":\n          e.preventDefault();\n          setFocusedIndex(filteredOptions.length - 1);\n          break;\n        case \"PageUp\":\n          e.preventDefault();\n          setFocusedIndex((prev) => Math.max(0, prev - 5));\n          break;\n        case \"PageDown\":\n          e.preventDefault();\n          setFocusedIndex((prev) =>\n            Math.min(filteredOptions.length - 1, prev + 5),\n          );\n          break;\n      }\n    },\n    [open, disabled, focusedIndex, filteredOptions, handleSelect],\n  );\n\n  const selectedLabels = useMemo(\n    () =>\n      options\n        .filter((o) => selectedValues.includes(o.value))\n        .map((o) => o.label),\n    [options, selectedValues],\n  );\n\n  const hasError = Boolean(error);\n  const hasValue = selectedLabels.length > 0;\n  // Derived from useId, never from `name` — two <Select name=\"country\" /> on one\n  // page would otherwise emit duplicate DOM ids.\n  const helperTextId =\n    helperText || error ? `${generatedHelperTextId}-description` : undefined;\n  const triggerId = `${generatedHelperTextId}-trigger`;\n  const labelId = `${generatedHelperTextId}-label`;\n\n  const dropdownListStyle = useMemo(() => {\n    if (typeof maxDropdownHeight === \"number\") {\n      return { maxHeight: `${maxDropdownHeight}px` };\n    }\n    return { maxHeight: maxDropdownHeight };\n  }, [maxDropdownHeight]);\n\n  return (\n    <div\n      ref={containerRef}\n      className={clsx(\"w-full space-y-1.5\", className, containerClassName)}\n      style={style}\n    >\n      {label && (\n        <label\n          id={labelId}\n          htmlFor={triggerId}\n          className={clsx(\n            \"flex items-center gap-1.5 text-[13px] font-medium leading-none text-foreground\",\n            labelClassName,\n          )}\n        >\n          {LabelIcon && (\n            <LabelIcon\n              className={clsx(sizeConfig[size].icon, \"shrink-0\", labelIconClassName)}\n            />\n          )}\n          {label}\n          {required && <span className=\"text-destructive\">*</span>}\n        </label>\n      )}\n\n      <div className=\"relative\">\n        {PrefixIcon && (\n          <div\n            className={clsx(\n              \"pointer-events-none absolute top-1/2 -translate-y-1/2 text-muted-foreground\",\n              sizeConfig[size].prefixInset,\n              iconClassName,\n            )}\n          >\n            <PrefixIcon className={sizeConfig[size].icon} />\n          </div>\n        )}\n\n        <button\n          type=\"button\"\n          ref={triggerRef}\n          id={triggerId}\n          disabled={disabled}\n          onClick={() => !disabled && setOpen((p) => !p)}\n          onKeyDown={handleKeyDown}\n          role=\"combobox\"\n          aria-expanded={open}\n          aria-haspopup=\"listbox\"\n          aria-required={required}\n          aria-invalid={hasError}\n          aria-describedby={helperTextId}\n          aria-labelledby={label ? labelId : undefined}\n          className={clsx(\n            \"w-full flex items-center justify-between gap-2\",\n            \"rounded-lg transition-all outline-none\",\n            \"border border-border bg-input/30 text-foreground\",\n            \"hover:bg-accent/10\",\n            // A ring color with no ring width renders nothing — set both.\n            \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\",\n            disabled && \"opacity-50 cursor-not-allowed\",\n            hasError &&\n              \"border-destructive focus-visible:ring-destructive/50\",\n            success && \"border-success focus-visible:ring-success/50\",\n            PrefixIcon\n              ? sizeConfig[size].triggerWithPrefix\n              : sizeConfig[size].trigger,\n            triggerClassName,\n          )}\n          style={{\n            ...triggerStyle,\n          }}\n        >\n          <span\n            className={clsx(\n              \"truncate flex-1 text-left\",\n              hasValue ? \"text-foreground\" : \"text-muted-foreground\",\n              valueClassName,\n            )}\n          >\n            {hasValue\n              ? multiple\n                ? selectedLabels.join(\", \")\n                : selectedLabels[0]\n              : placeholder}\n          </span>\n\n          <DropdownIcon\n            className={clsx(\n              \"transition-transform text-muted-foreground\",\n              open && \"rotate-180\",\n              sizeConfig[size].icon,\n              iconClassName,\n            )}\n          />\n        </button>\n\n        <AnimatePresence>\n          {open && (\n            <motion.div\n              initial={{\n                opacity: 0,\n                y: position === \"bottom\" ? -6 : 6,\n                scale: 0.98,\n              }}\n              animate={{\n                opacity: 1,\n                y: 0,\n                scale: 1,\n              }}\n              exit={{\n                opacity: 0,\n                y: position === \"bottom\" ? -6 : 6,\n                scale: 0.98,\n              }}\n              transition={{ duration: 0.12 }}\n              className={clsx(\n                dropdownClassName,\n                \"fixed z-[9999] rounded-lg p-[5px] overflow-hidden\",\n                \"bg-background border border-border\",\n              )}\n              style={{\n                top: coords.top,\n                left: coords.left,\n                width: coords.width,\n                ...dropdownStyle,\n              }}\n              role=\"listbox\"\n              aria-label=\"Options\"\n            >\n              {searchable && (\n                <div className={clsx(\"p-2 border-b border-border\", searchWrapperClassName)}>\n                  <input\n                    ref={searchRef}\n                    type=\"text\"\n                    value={search}\n                    onChange={(e) => {\n                      setSearch(e.target.value);\n                      setFocusedIndex(0);\n                    }}\n                    onKeyDown={handleKeyDown}\n                    placeholder={searchPlaceholder || \"Search...\"}\n                    aria-label={searchPlaceholder || \"Search options\"}\n                    className={clsx(\n                      \"w-full rounded-md outline-none\",\n                      \"bg-background border border-border text-foreground\",\n                      \"focus-visible:ring-2 focus-visible:ring-ring\",\n                      sizeConfig[size].search,\n                      searchClassName,\n                    )}\n                    style={searchStyle}\n                  />\n                </div>\n              )}\n\n              <ul\n                ref={listRef}\n                className=\"overflow-y-auto\"\n                style={dropdownListStyle}\n              >\n                {filteredOptions.length === 0 ? (\n                  <li\n                    role=\"option\"\n                    aria-disabled\n                    aria-selected={false}\n                    className={clsx(\n                      \"text-muted-foreground text-center\",\n                      sizeConfig[size].empty,\n                      emptyClassName,\n                    )}\n                  >\n                    No options available\n                  </li>\n                ) : (\n                  filteredOptions.map((opt, index) => {\n                    const active = selectedValues.includes(opt.value);\n\n                    return (\n                      <li\n                        key={opt.value}\n                        onClick={(e) => handleSelect(opt, e)}\n                        role=\"option\"\n                        aria-selected={active}\n                        className={clsx(\n                          itemClassName,\n                          \"flex items-center justify-between rounded-md cursor-pointer transition-all relative hover:bg-accent\",\n                          sizeConfig[size].item,\n                          active && \"bg-accent\",\n                        )}\n                        style={{\n                          ...itemStyle,\n                        }}\n                      >\n                        <div className=\"flex flex-col truncate\">\n                          <div className=\"flex items-center gap-2\">\n                            {opt.icon && (\n                              <span\n                                className={clsx(\n                                  sizeConfig[size].icon,\n                                  itemIconClassName,\n                                )}\n                                style={itemIconStyle}\n                              >\n                                {opt.icon}\n                              </span>\n                            )}\n\n                            <span className={clsx(\"font-medium\", itemLabelClassName)}>\n                              {opt.label}\n                            </span>\n                          </div>\n\n                          {showDescription && opt.description && (\n                            <span\n                              className={clsx(\n                                \"text-xs text-muted-foreground mt-0.5\",\n                                itemDescriptionClassName,\n                              )}\n                            >\n                              {opt.description}\n                            </span>\n                          )}\n                        </div>\n\n                        {showCheckIcon && active && (\n                          <div>\n                            <Check\n                              className={clsx(\n                                sizeConfig[size].checkIcon,\n                                checkIconClassName,\n                                \"text-primary\",\n                              )}\n                              style={{\n                                ...checkIconStyle,\n                              }}\n                            />\n                          </div>\n                        )}\n                      </li>\n                    );\n                  })\n                )}\n              </ul>\n            </motion.div>\n          )}\n        </AnimatePresence>\n      </div>\n\n      {(helperText || error) && (\n        <p\n          id={helperTextId}\n          className={clsx(\n            \"text-xs\",\n            hasError\n              ? \"text-destructive\"\n              : success\n                ? \"text-primary\"\n                : \"text-muted-foreground\",\n            helperClassName,\n          )}\n        >\n          {typeof error === \"string\" ? error : helperText}\n        </p>\n      )}\n    </div>\n  );\n});\n\nSelect.displayName = \"Select\";\n","\"use client\";\n\nimport React, {\n  forwardRef,\n  useState,\n  useId,\n  useImperativeHandle,\n  useRef,\n  CSSProperties,\n} from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * Per-size layout values. The prefix/suffix slots are absolutely positioned, so\n * the input's horizontal padding has to reserve exactly the space the icon\n * occupies at that size — inset + icon width + gap. Keeping all of it in one\n * table is what stops padding and icon size from drifting apart.\n *\n * Every class here is a complete literal so Tailwind's scanner still sees it.\n */\nconst SIZE_CONFIG = {\n  sm: {\n    base: \"py-1.5 text-xs\",\n    padLeft: { none: \"pl-3\", icon: \"pl-8\", text: \"pl-8\", both: \"pl-12\" },\n    padRight: { none: \"pr-3\", suffix: \"pr-8\" },\n    iconSize: 14,\n    prefixInset: \"left-2.5\",\n    suffixInset: \"right-2.5\",\n    gap: \"gap-1\",\n    labelIconSize: 14,\n    textSize: \"text-[11px]\",\n  },\n  md: {\n    base: \"py-2 text-sm\",\n    padLeft: { none: \"pl-4\", icon: \"pl-10\", text: \"pl-9\", both: \"pl-14\" },\n    padRight: { none: \"pr-4\", suffix: \"pr-10\" },\n    iconSize: 16,\n    prefixInset: \"left-3\",\n    suffixInset: \"right-3\",\n    gap: \"gap-1.5\",\n    labelIconSize: 16,\n    textSize: \"text-xs\",\n  },\n  lg: {\n    base: \"py-2.5 text-base\",\n    padLeft: { none: \"pl-4\", icon: \"pl-11\", text: \"pl-10\", both: \"pl-16\" },\n    padRight: { none: \"pr-4\", suffix: \"pr-11\" },\n    iconSize: 20,\n    prefixInset: \"left-3.5\",\n    suffixInset: \"right-3.5\",\n    gap: \"gap-2\",\n    labelIconSize: 18,\n    textSize: \"text-sm\",\n  },\n} as const;\n\nexport interface InputFieldProps {\n  label?: string;\n  name?: string;\n  id?: string;\n  type?:\n    | \"text\"\n    | \"password\"\n    | \"email\"\n    | \"number\"\n    | \"url\"\n    | \"tel\"\n    | \"search\"\n    | \"textarea\";\n  placeholder?: string;\n  description?: string;\n\n  value?: string;\n  defaultValue?: string;\n  onChange?: (\n    e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n  ) => void;\n  onFocus?: (\n    e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>,\n  ) => void;\n  onBlur?: (\n    e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>,\n  ) => void;\n\n  required?: boolean;\n  disabled?: boolean;\n  readOnly?: boolean;\n\n  error?: string | boolean;\n  success?: boolean;\n  helperText?: string;\n\n  icon?: React.ElementType;\n  prefix?: string;\n  prefixIcon?: React.ElementType;\n  suffixIcon?: React.ReactNode;\n\n  min?: number;\n  max?: number;\n  step?: number;\n  maxLength?: number;\n\n  rows?: number;\n  size?: \"sm\" | \"md\" | \"lg\";\n\n  wrapperClassName?: string;\n  labelClassName?: string;\n  inputClassName?: string;\n  textareaClassName?: string;\n  prefixClassName?: string;\n  suffixClassName?: string;\n  helperTextClassName?: string;\n  descriptionClassName?: string;\n\n  wrapperStyle?: CSSProperties;\n  inputStyle?: CSSProperties;\n  labelStyle?: CSSProperties;\n}\n\nexport const Input = forwardRef<\n  HTMLInputElement | HTMLTextAreaElement,\n  InputFieldProps\n>(function InputField(props, ref) {\n  const {\n    label,\n    name = \"\",\n    id,\n    type = \"text\",\n    placeholder = \"\",\n    description,\n    value,\n    defaultValue,\n    onChange,\n    onFocus,\n    onBlur,\n    required,\n    disabled,\n    readOnly,\n\n    error,\n    success,\n    helperText,\n\n    icon: LabelIcon,\n    prefix,\n    prefixIcon: PrefixIcon,\n    suffixIcon,\n\n    min,\n    max,\n    step,\n    maxLength,\n\n    rows = 4,\n    size = \"md\",\n\n    wrapperClassName = \"\",\n    labelClassName = \"\",\n    inputClassName = \"\",\n    textareaClassName = \"\",\n    prefixClassName = \"\",\n    suffixClassName = \"\",\n    helperTextClassName = \"\",\n    descriptionClassName = \"\",\n\n    wrapperStyle,\n    inputStyle,\n    labelStyle,\n  } = props;\n\n  const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n  useImperativeHandle(ref, () => inputRef.current as any);\n\n  // `id` is optional, but without one `htmlFor` points at nothing and clicking\n  // the label does nothing. Fall back to a generated id.\n  const generatedId = useId();\n  const fieldId = id ?? generatedId;\n  const describedBy = helperText || error ? `${fieldId}-description` : undefined;\n\n  const [localValue, setLocalValue] = useState(defaultValue || \"\");\n  const [visible, setVisible] = useState(false);\n\n  const hasPrefixIcon = Boolean(PrefixIcon);\n  const hasPrefixText = Boolean(prefix);\n  const hasPrefix = hasPrefixIcon || hasPrefixText;\n\n  const currentValue = value !== undefined ? value : localValue;\n\n  const handleChange = (\n    e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n  ) => {\n    if (value === undefined) setLocalValue(e.target.value);\n    onChange?.(e);\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (type === \"number\" && e.key === \"-\" && !e.metaKey && !e.ctrlKey) {\n      e.preventDefault();\n    }\n  };\n\n  const sizes = SIZE_CONFIG[size];\n\n  const hasSuffix = Boolean(suffixIcon) || type === \"password\";\n\n  // Every value that has to scale together lives in SIZE_CONFIG, so a size can\n  // never scale its padding without also scaling the icon it makes room for.\n  const getPadding = () => {\n    const left = !hasPrefix\n      ? sizes.padLeft.none\n      : hasPrefixIcon && hasPrefixText\n        ? sizes.padLeft.both\n        : hasPrefixText\n          ? sizes.padLeft.text\n          : sizes.padLeft.icon;\n    const right = hasSuffix ? sizes.padRight.suffix : sizes.padRight.none;\n    return `${sizes.base} ${left} ${right}`;\n  };\n\n  const baseInputStyles =\n    \"w-full min-w-0 rounded-lg border border-input bg-transparent \" +\n    \"text-foreground outline-none transition-colors \" +\n    \"placeholder:text-muted-foreground \" +\n    \"disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 \" +\n    \"dark:bg-input/30 dark:disabled:bg-input/80 \" +\n    \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:border-ring\";\n\n  return (\n    <div\n      className={cn(\"w-full space-y-1.5\", wrapperClassName)}\n      style={wrapperStyle}\n    >\n      {label && (\n        <div className=\"flex items-baseline justify-between gap-2\">\n          <label\n            htmlFor={fieldId}\n            className={cn(\n              \"flex items-center gap-1.5 text-[13px] font-medium leading-none\",\n              labelClassName,\n            )}\n            style={labelStyle}\n          >\n            {LabelIcon && (\n              <LabelIcon size={sizes.labelIconSize} strokeWidth={1.5} />\n            )}\n            {label}\n            {required && <span className=\"ml-1 text-destructive\">*</span>}\n          </label>\n\n          {description && (\n            <span className={cn(\"text-xs text-muted-foreground\", descriptionClassName)}>\n              {description}\n            </span>\n          )}\n        </div>\n      )}\n\n      <div className=\"relative\">\n        {hasPrefix && (\n          <div\n            className={cn(\n              \"absolute inset-y-0 flex items-center text-muted-foreground pointer-events-none\",\n              sizes.prefixInset,\n              sizes.gap,\n              prefixClassName,\n            )}\n          >\n            {PrefixIcon && (\n              <PrefixIcon size={sizes.iconSize} strokeWidth={1.5} />\n            )}\n            {hasPrefixText && (\n              <span className={cn(\"font-medium\", sizes.textSize)}>{prefix}</span>\n            )}\n          </div>\n        )}\n\n        {type === \"textarea\" ? (\n          <textarea\n            ref={inputRef as React.RefObject<HTMLTextAreaElement>}\n            id={fieldId}\n            name={name}\n            value={currentValue}\n            onChange={handleChange}\n            onFocus={onFocus}\n            onBlur={onBlur}\n            placeholder={placeholder}\n            rows={rows}\n            required={required}\n            disabled={disabled}\n            readOnly={readOnly}\n            maxLength={maxLength}\n            aria-invalid={error ? true : undefined}\n            aria-describedby={describedBy}\n            style={inputStyle}\n            className={cn(\n              baseInputStyles,\n              getPadding(),\n              \"resize-none\",\n              error && \"border-destructive focus-visible:ring-destructive/50\",\n              success && \"border-success focus-visible:ring-success/50\",\n              textareaClassName,\n            )}\n          />\n        ) : (\n          <input\n            ref={inputRef as React.RefObject<HTMLInputElement>}\n            id={fieldId}\n            type={type === \"password\" ? (visible ? \"text\" : \"password\") : type}\n            name={name}\n            value={currentValue}\n            onChange={handleChange}\n            onFocus={onFocus}\n            onBlur={onBlur}\n            onKeyDown={handleKeyDown}\n            placeholder={placeholder}\n            required={required}\n            disabled={disabled}\n            readOnly={readOnly}\n            min={type === \"number\" ? min : undefined}\n            max={type === \"number\" ? max : undefined}\n            step={type === \"number\" ? step : undefined}\n            maxLength={maxLength}\n            aria-invalid={error ? true : undefined}\n            aria-describedby={describedBy}\n            style={inputStyle}\n            className={cn(\n              baseInputStyles,\n              getPadding(),\n              error && \"border-destructive focus-visible:ring-destructive/50\",\n              success && \"border-success focus-visible:ring-success/50\",\n              inputClassName,\n            )}\n          />\n        )}\n\n        {type === \"password\" && (\n          <button\n            type=\"button\"\n            aria-label={visible ? \"Hide password\" : \"Show password\"}\n            aria-pressed={visible}\n            onClick={() => setVisible(!visible)}\n            disabled={disabled}\n            className={cn(\n              \"absolute top-1/2 -translate-y-1/2 rounded text-muted-foreground transition-colors\",\n              \"hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\",\n              sizes.suffixInset,\n              suffixClassName,\n            )}\n          >\n            {visible ? (\n              <EyeOff size={sizes.iconSize} />\n            ) : (\n              <Eye size={sizes.iconSize} />\n            )}\n          </button>\n        )}\n\n        {suffixIcon && type !== \"password\" && (\n          <span\n            className={cn(\n              \"absolute top-1/2 -translate-y-1/2 flex items-center text-muted-foreground pointer-events-none\",\n              sizes.suffixInset,\n              suffixClassName,\n            )}\n          >\n            {suffixIcon}\n          </span>\n        )}\n      </div>\n\n      {(helperText || error) && (\n        <p\n          id={describedBy}\n          role={error ? \"alert\" : undefined}\n          className={cn(\n            \"text-xs font-medium\",\n            error\n              ? \"text-destructive\"\n              : success\n                ? \"text-success\"\n                : \"text-muted-foreground\",\n            helperTextClassName,\n          )}\n        >\n          {error && typeof error === \"string\" ? error : helperText}\n        </p>\n      )}\n    </div>\n  );\n});\n","\"use client\";\n\nimport React, {\n  forwardRef,\n  useState,\n  useEffect,\n  useRef,\n  CSSProperties,\n} from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n  label?: string;\n  icon?: React.ElementType;\n  error?: boolean;\n  success?: boolean;\n  helperText?: string;\n  maxLength?: number;\n\n  /** Auto resize */\n  autoResize?: boolean;\n  minRows?: number;\n  maxRows?: number;\n\n  /** Chat-like behavior */\n  submitOnEnter?: boolean; // Enter submits\n  onSubmit?: () => void;\n\n  /** Customization */\n  className?: string;\n  containerClassName?: string;\n  labelClassName?: string;\n  iconClassName?: string;\n  helperClassName?: string;\n  countClassName?: string;\n\n  style?: CSSProperties;\n  containerStyle?: CSSProperties;\n  labelStyle?: CSSProperties;\n  helperStyle?: CSSProperties;\n  countStyle?: CSSProperties;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n  (\n    {\n      label,\n      name,\n      icon: Icon,\n      value,\n      onChange,\n      placeholder,\n      required,\n      disabled,\n      error,\n      success,\n      helperText,\n      maxLength,\n\n      autoResize = true,\n      minRows = 3,\n      maxRows = 6,\n\n      submitOnEnter,\n      onSubmit,\n\n      className = \"\",\n      containerClassName = \"\",\n      labelClassName = \"\",\n      iconClassName = \"\",\n      helperClassName = \"\",\n      countClassName = \"\",\n\n      style,\n      containerStyle,\n      labelStyle,\n      helperStyle,\n      countStyle,\n\n      ...props\n    },\n    ref,\n  ) => {\n    const innerRef = useRef<HTMLTextAreaElement | null>(null);\n\n    // Merge refs\n    const setRefs = (el: HTMLTextAreaElement) => {\n      innerRef.current = el;\n      if (typeof ref === \"function\") ref(el);\n      else if (ref) (ref as any).current = el;\n    };\n\n    /** 🔥 Auto resize logic */\n    const resizeTextarea = () => {\n      const el = innerRef.current;\n      if (!el || !autoResize) return;\n\n      el.style.height = \"auto\";\n\n      const lineHeight = 24; // approx\n      const minHeight = minRows * lineHeight;\n      const maxHeight = maxRows * lineHeight;\n\n      const newHeight = Math.min(\n        Math.max(el.scrollHeight, minHeight),\n        maxHeight,\n      );\n\n      el.style.height = newHeight + \"px\";\n      el.style.overflowY = el.scrollHeight > maxHeight ? \"auto\" : \"hidden\";\n    };\n\n    useEffect(() => {\n      resizeTextarea();\n    }, [value]);\n\n    /** ⌨️ ChatGPT-like enter behavior */\n    const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n      if (submitOnEnter && e.key === \"Enter\" && !e.shiftKey) {\n        e.preventDefault();\n        onSubmit?.();\n      }\n    };\n\n    const currentLength =\n      typeof value === \"string\"\n        ? value.length\n        : innerRef.current?.value?.length || 0;\n\n    const showCount = typeof maxLength === \"number\" && maxLength > 0;\n\n    return (\n      <div\n        className={`w-full space-y-1.5 ${containerClassName}`}\n        style={containerStyle}\n      >\n        {label && (\n          <label\n            htmlFor={name}\n            className={`flex items-center gap-2 text-[13px] leading-none font-medium ${labelClassName}`}\n            style={labelStyle}\n          >\n            {Icon && <Icon size={14} className={iconClassName || undefined} />}\n            {label}\n            {required && <span className=\"text-destructive\">*</span>}\n          </label>\n        )}\n\n        <div className=\"relative group\">\n          <textarea\n            ref={setRefs}\n            id={name}\n            name={name}\n            value={value}\n            onChange={(e) => {\n              onChange?.(e);\n              resizeTextarea();\n            }}\n            onKeyDown={handleKeyDown}\n            placeholder={placeholder}\n            required={required}\n            disabled={disabled}\n            maxLength={maxLength}\n            rows={minRows}\n            className={cn(\n              \"w-full px-4 py-3 text-sm rounded-lg\",\n              // Reserve room for the character counter so typed text never\n              // runs underneath it.\n              showCount && \"pb-8\",\n              \"resize-none transition-all duration-200 ease-out\",\n              \"outline-none border\",\n              \"bg-input/30 text-foreground\",\n              \"placeholder:text-muted-foreground\",\n              \"border-border\",\n              // A 1px ring in the border color was invisible — use the shared\n              // focus treatment so keyboard focus is actually indicated.\n              \"focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:border-ring\",\n              \"hover:border-muted-foreground/40\",\n              \"disabled:opacity-50 disabled:cursor-not-allowed\",\n              error &&\n                \"border-destructive focus-visible:ring-destructive/50\",\n              success && \"border-success\",\n              className,\n            )}\n            style={{\n              ...style,\n            }}\n            {...props}\n          />\n\n          {showCount && (\n            <span\n              // pointer-events-none: the counter must not block click-to-place\n              // in the corner of the field.\n              className={cn(\n                \"pointer-events-none absolute bottom-2.5 right-3 text-[11px] tabular-nums text-muted-foreground\",\n                countClassName,\n              )}\n              style={countStyle}\n            >\n              {currentLength}/{maxLength}\n            </span>\n          )}\n        </div>\n\n        {helperText && (\n          <p\n            className={`text-xs ${\n              error\n                ? \"text-destructive\"\n                : success\n                  ? \"text-primary\"\n                  : \"text-muted-foreground\"\n            } ${helperClassName}`}\n            style={helperStyle}\n          >\n            {helperText}\n          </p>\n        )}\n      </div>\n    );\n  },\n);\n\nTextarea.displayName = \"Textarea\";\n","\"use client\";\n\nimport React, {\n  useEffect,\n  useCallback,\n  useRef,\n  type ReactNode,\n  CSSProperties,\n  useState,\n} from \"react\";\nimport { X } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Button, type ButtonProps } from \"./Button\";\nimport { cn } from \"../../lib/cn\";\nimport { useScrollLock } from \"../../lib/useScrollLock\";\nimport { useFocusTrap } from \"../../lib/useFocusTrap\";\n\n/* =========================\n   Modal Root\n========================= */\nexport interface ModalProps {\n  isOpen: boolean;\n  onClose: () => void;\n  children: ReactNode;\n  disableOverlayClose?: boolean;\n  /** Also block Escape. Defaults to `disableOverlayClose`. */\n  disableEscapeClose?: boolean;\n  /** Accessible name for the dialog when no ModalHeader is used. */\n  ariaLabel?: string;\n\n  overlayClassName?: string;\n  overlayStyle?: CSSProperties;\n  style?: CSSProperties;\n  /** The `role=\"dialog\"` wrapper around `children`. */\n  dialogClassName?: string;\n}\n\nexport function Modal({\n  isOpen,\n  onClose,\n  children,\n  disableOverlayClose = false,\n  disableEscapeClose,\n  ariaLabel,\n  overlayClassName,\n  overlayStyle,\n  style,\n  dialogClassName,\n}: ModalProps) {\n  const dialogRef = useRef<HTMLDivElement>(null);\n  // A \"forced choice\" modal that blocks the overlay should not be dismissible\n  // with Escape either, unless the consumer says otherwise.\n  const escapeDisabled = disableEscapeClose ?? disableOverlayClose;\n\n  // Keep onClose in a ref so the listener doesn't resubscribe on every parent\n  // render — consumers almost always pass an inline arrow.\n  const onCloseRef = useRef(onClose);\n  onCloseRef.current = onClose;\n\n  useEffect(() => {\n    if (!isOpen || escapeDisabled) return;\n    const handleEsc = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") onCloseRef.current();\n    };\n    document.addEventListener(\"keydown\", handleEsc);\n    return () => document.removeEventListener(\"keydown\", handleEsc);\n  }, [isOpen, escapeDisabled]);\n\n  useScrollLock(isOpen);\n  useFocusTrap(dialogRef, isOpen);\n\n  // Compare the mousedown target with the click target: otherwise selecting\n  // text inside the modal and releasing over the overlay closes it.\n  const pressedOnOverlay = useRef(false);\n\n  const handleOverlayClick = useCallback(() => {\n    if (!disableOverlayClose && pressedOnOverlay.current) onClose();\n    pressedOnOverlay.current = false;\n  }, [disableOverlayClose, onClose]);\n\n  return (\n    <AnimatePresence>\n      {isOpen && (\n        <motion.div\n          key=\"modal-overlay\"\n          initial={{ opacity: 0 }}\n          animate={{ opacity: 1 }}\n          exit={{ opacity: 0 }}\n          onMouseDown={(e) => {\n            pressedOnOverlay.current = e.target === e.currentTarget;\n          }}\n          onClick={handleOverlayClick}\n          className={cn(\n            \"fixed inset-0 z-50 flex items-center justify-center\",\n            \"bg-background/80 backdrop-blur-sm p-4\",\n            overlayClassName,\n          )}\n          style={{ ...overlayStyle, ...style }}\n        >\n          <div\n            ref={dialogRef}\n            role=\"dialog\"\n            aria-modal=\"true\"\n            aria-label={ariaLabel}\n            tabIndex={-1}\n            className={cn(\"contents outline-none\", dialogClassName)}\n          >\n            {children}\n          </div>\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n}\n\n/* =========================\n   Modal Content (Card)\n========================= */\nexport interface ModalContentProps {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n  maxWidth?: string;\n  onClose?: () => void;\n  showCloseButton?: boolean;\n  closeButtonClassName?: string;\n  closeButtonStyle?: CSSProperties;\n}\n\nexport function ModalContent({\n  children,\n  className,\n  style,\n  maxWidth = \"max-w-md\",\n  onClose,\n  showCloseButton = false,\n  closeButtonClassName,\n  closeButtonStyle,\n}: ModalContentProps) {\n  const hasCloseButton = showCloseButton && typeof onClose === \"function\";\n\n  return (\n    <motion.div\n      initial={{ y: 20, scale: 0.96 }}\n      animate={{ y: 0, scale: 1 }}\n      exit={{ y: 20, scale: 0.96 }}\n      transition={{ duration: 0.2 }}\n      onClick={(e) => e.stopPropagation()}\n      className={clsx(\n        \"relative w-full rounded-2xl border border-border bg-background shadow-2xl overflow-hidden\",\n        maxWidth,\n        className,\n      )}\n      style={style}\n    >\n      {hasCloseButton && (\n        <button\n          type=\"button\"\n          onClick={onClose}\n          aria-label=\"Close modal\"\n          className={clsx(\n            \"absolute top-4 right-4 z-10 p-2 rounded-full transition-colors\",\n            \"hover:bg-accent/20 focus:outline-none \",\n            closeButtonClassName,\n          )}\n          style={closeButtonStyle}\n        >\n          <X size={18} />\n        </button>\n      )}\n\n      {children}\n    </motion.div>\n  );\n}\n\n/* =========================\n   Header\n========================= */\nexport interface ModalHeaderProps {\n  title?: string;\n  icon?: ReactNode;\n  onClose?: () => void;\n\n  className?: string;\n  style?: CSSProperties;\n\n  /** Wrapper around `icon` + `title`. */\n  titleWrapperClassName?: string;\n  iconClassName?: string;\n  titleClassName?: string;\n  closeButtonClassName?: string;\n}\n\nexport function ModalHeader({\n  title,\n  icon,\n  onClose,\n  className,\n  style,\n  titleWrapperClassName,\n  iconClassName,\n  titleClassName,\n  closeButtonClassName,\n}: ModalHeaderProps) {\n  return (\n    <div\n      className={clsx(\n        className,\n        \"flex items-center justify-between px-6 py-4 border-b border-border\",\n      )}\n      style={style}\n    >\n      <div\n        className={cn(\n          \"flex items-center gap-2 font-semibold text-foreground\",\n          titleWrapperClassName,\n        )}\n      >\n        {icon && <span className={iconClassName}>{icon}</span>}\n        {title && <h3 className={cn(\"text-sm\", titleClassName)}>{title}</h3>}\n      </div>\n\n      {onClose && (\n        <button\n          // Without type=\"button\" this submits any enclosing <form>, and with\n          // no aria-label screen readers announce an empty button.\n          type=\"button\"\n          aria-label=\"Close modal\"\n          onClick={onClose}\n          className={cn(\n            \"p-2 rounded-lg hover:bg-accent transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n            closeButtonClassName,\n          )}\n        >\n          <X size={18} aria-hidden=\"true\" />\n        </button>\n      )}\n    </div>\n  );\n}\n\n/* =========================\n   Body\n========================= */\nexport interface ModalBodyProps {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\nexport function ModalBody({ children, className, style }: ModalBodyProps) {\n  return (\n    <div className={clsx(className, \"p-6 text-foreground space-y-4\")} style={style}>\n      {children}\n    </div>\n  );\n}\n\n/* =========================\n   Footer\n========================= */\nexport interface ModalFooterProps {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n}\n\nexport function ModalFooter({ children, className, style }: ModalFooterProps) {\n  return (\n    <div\n      className={clsx(\n        \"flex justify-end gap-3 px-6 py-3 border-t border-border bg-accent/60\",\n        className,\n      )}\n      style={style}\n    >\n      {children}\n    </div>\n  );\n}\n\n/* =========================\n   Modal Button\n========================= */\nexport interface ModalButtonProps extends ButtonProps {\n  onClose?: () => void;\n  closeOnClick?: boolean;\n  action?: () => void | Promise<void>;\n}\n\nexport function ModalButton({\n  onClose,\n  closeOnClick,\n  action,\n  onClick,\n  disabled,\n  ...rest\n}: ModalButtonProps) {\n  const [pending, setPending] = useState(false);\n\n  const handleClick = async (e: React.MouseEvent<HTMLButtonElement>) => {\n    if (onClick) onClick(e);\n\n    if (action) {\n      setPending(true);\n      try {\n        await action();\n      } catch (err) {\n        // Surface the failure instead of leaving an unhandled rejection, and\n        // leave the modal open so the user can retry.\n        setPending(false);\n        throw err;\n      }\n      setPending(false);\n    }\n\n    if (closeOnClick && onClose) onClose();\n  };\n\n  return (\n    <Button\n      size=\"sm\"\n      {...rest}\n      // Guard against double-submit while `action` is in flight.\n      disabled={disabled || pending}\n      loading={rest.loading || pending}\n      onClick={handleClick}\n    />\n  );\n}\n\n/* =========================\n   Trigger\n========================= */\nexport interface ModalTriggerButtonProps extends ButtonProps {\n  children: React.ReactNode;\n  modalContent: (props: { close: () => void }) => React.ReactNode;\n  /** Forwarded to the underlying <Modal />. */\n  modalProps?: Omit<ModalProps, \"isOpen\" | \"onClose\" | \"children\">;\n}\n\nexport function ModalTriggerButton({\n  children,\n  modalContent,\n  modalProps,\n  onClick,\n  ...props\n}: ModalTriggerButtonProps) {\n  const [open, setOpen] = useState(false);\n\n  return (\n    <>\n      <Button\n        {...props}\n        // Chain rather than replace — placing this after {...props} used to\n        // silently drop a consumer-supplied onClick.\n        onClick={(e) => {\n          onClick?.(e);\n          setOpen(true);\n        }}\n      >\n        {children}\n      </Button>\n\n      <Modal {...modalProps} isOpen={open} onClose={() => setOpen(false)}>\n        {modalContent({ close: () => setOpen(false) })}\n      </Modal>\n    </>\n  );\n}\n","\"use client\";\n\nimport React, { ReactNode, CSSProperties } from \"react\";\nimport clsx from \"clsx\";\n\n/* =========================\n   Table Root\n========================= */\nexport interface TableProps {\n  children: ReactNode;\n\n  /** Wrapper */\n  className?: string;\n  style?: CSSProperties;\n\n  /** Table */\n  tableClassName?: string;\n  tableStyle?: CSSProperties;\n\n  /** Behavior */\n  responsive?: boolean;\n  striped?: boolean;\n  hoverable?: boolean;\n  bordered?: boolean;\n  dense?: boolean;\n}\n\nexport function Table({\n  children,\n  className,\n  style,\n  tableClassName,\n  tableStyle,\n  responsive = true,\n  striped = false,\n  hoverable = true,\n  bordered = false,\n  dense = false,\n}: TableProps) {\n  return (\n    <div\n      className={clsx(\n        \"w-full rounded-2xl border bg-background text-foreground shadow-sm\",\n        \"border-border\",\n        responsive && \"overflow-x-auto\",\n        className,\n      )}\n      style={style}\n    >\n      <table\n        className={clsx(\n          \"w-full border-collapse text-sm\",\n          dense ? \"text-xs\" : \"text-sm\",\n          tableClassName,\n        )}\n        style={{\n          borderSpacing: 0,\n          ...tableStyle,\n        }}\n      >\n        {React.Children.map(children, (child) =>\n          React.isValidElement(child)\n            ? React.cloneElement(child as any, {\n                striped,\n                hoverable,\n                bordered,\n                dense,\n              })\n            : child,\n        )}\n      </table>\n    </div>\n  );\n}\n\n/* =========================\n   Head\n========================= */\nexport interface TableSectionProps {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n\n  striped?: boolean;\n  hoverable?: boolean;\n  bordered?: boolean;\n  dense?: boolean;\n}\n\nexport function THead({\n  children,\n  className,\n  style,\n  bordered,\n}: TableSectionProps) {\n  return (\n    <thead\n      className={clsx(\n        \"bg-accent text-foreground\",\n        className,\n      )}\n      style={style}\n    >\n      {React.Children.map(children, (child) =>\n        React.isValidElement(child)\n          ? React.cloneElement(child as any, { bordered })\n          : child,\n      )}\n    </thead>\n  );\n}\n\n/* =========================\n   Body\n========================= */\nexport function TBody({\n  children,\n  className,\n  style,\n  striped,\n  hoverable,\n  bordered,\n}: TableSectionProps) {\n  return (\n    <tbody className={clsx(\"bg-background\", className)} style={style}>\n      {React.Children.map(children, (child, index) =>\n        React.isValidElement(child)\n          ? React.cloneElement(child as any, {\n              striped,\n              hoverable,\n              bordered,\n              index,\n            })\n          : child,\n      )}\n    </tbody>\n  );\n}\n\n/* =========================\n   Row\n========================= */\nexport interface TRowProps extends TableSectionProps {\n  onClick?: () => void;\n  index?: number;\n}\n\nexport function TRow({\n  children,\n  className,\n  style,\n  onClick,\n  striped,\n  hoverable,\n  bordered,\n  index = 0,\n}: TRowProps) {\n  return (\n    <tr\n      onClick={onClick}\n      className={clsx(\n        className,\n        bordered && \"border-b border-border\",\n        striped && index % 2 === 0 && \"bg-accent/30\",\n        hoverable && \"hover:bg-accent/60\",\n        onClick && \"cursor-pointer\",\n        \"transition-all duration-200\",\n      )}\n      style={style}\n    >\n      {children}\n    </tr>\n  );\n}\n\n/* =========================\n   Header Cell\n========================= */\nexport interface TableCellProps {\n  children: ReactNode;\n  className?: string;\n  style?: CSSProperties;\n\n  bordered?: boolean;\n  dense?: boolean;\n}\n\nexport function TH({\n  children,\n  className,\n  style,\n  bordered,\n  dense,\n}: TableCellProps) {\n  return (\n    <th\n      className={clsx(\n        className,\n        \"text-left font-medium text-foreground\",\n        dense ? \"px-3 py-2\" : \"px-5 py-3\",\n        bordered && \"border-b border-border\",\n      )}\n      style={style}\n    >\n      {children}\n    </th>\n  );\n}\n\n/* =========================\n   Data Cell\n========================= */\nexport function TD({ children, className, style, dense }: TableCellProps) {\n  return (\n    <td\n      className={clsx(\n        className,\n        \"text-accent-foreground\",\n        dense ? \"px-3 py-2\" : \"px-5 py-3\",\n      )}\n      style={style}\n    >\n      {children}\n    </td>\n  );\n}\n","\"use client\";\nimport React, {\n  ReactNode,\n  CSSProperties,\n  createContext,\n  useContext,\n  useState,\n  useEffect,\n  useRef,\n  KeyboardEvent,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { cn } from \"../../lib/cn\";\n\n/* ------------------------------------------------------------------ */\n/*  Responsive hook                                                     */\n/* ------------------------------------------------------------------ */\n\nfunction useBreakpoint(breakpoint = 768) {\n  const [isMobile, setIsMobile] = useState(false);\n  useEffect(() => {\n    const mq = window.matchMedia(`(max-width: ${breakpoint}px)`);\n    const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n    setIsMobile(mq.matches);\n    mq.addEventListener(\"change\", handler);\n    return () => mq.removeEventListener(\"change\", handler);\n  }, [breakpoint]);\n  return isMobile;\n}\n\n/* ------------------------------------------------------------------ */\n/*  Types                                                               */\n/* ------------------------------------------------------------------ */\n\ntype Position = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Variant = \"solid\" | \"outline\" | \"underline\" | \"pill\";\n\n/**\n * mobileVariant — how <TabList> behaves on small screens:\n *  \"drawer\"   → collapses into an animated dropdown (hamburger-style)\n *  \"scroll\"   → horizontal scrollable strip with snap (default)\n *  \"stack\"    → forced full-width vertical column\n *  \"collapse\" → left/right positions collapse to top row\n */\ntype MobileVariant = \"drawer\" | \"scroll\" | \"stack\" | \"collapse\";\n\ninterface TabsContextValue {\n  active: number;\n  setActive: (i: number) => void;\n  variant: Variant;\n  position: Position;\n  primaryColor: string;\n  activeColor: string;\n  textColor: string;\n  hoverColor: string;\n  borderColor: string;\n  disabledColor: string;\n  radius: number;\n  transitionDuration: number;\n  fullWidth: boolean;\n  tabCount: number;\n  isMobile: boolean;\n  mobileVariant: MobileVariant;\n  drawerOpen: boolean;\n  setDrawerOpen: (v: boolean) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabsContext() {\n  const ctx = useContext(TabsContext);\n  if (!ctx)\n    throw new Error(\"<Tab>, <TabList>, <TabPanel> must be inside <Tabs>\");\n  return ctx;\n}\n\n/* ------------------------------------------------------------------ */\n/*  <Tabs> — root provider                                              */\n/* ------------------------------------------------------------------ */\n\nexport interface TabsProps {\n  children: ReactNode;\n  defaultActive?: number;\n  position?: Position;\n  variant?: Variant;\n  fullWidth?: boolean;\n  radius?: number;\n  transitionDuration?: number;\n  bordered?: boolean;\n\n  /** Responsive */\n  mobileBreakpoint?: number;\n  mobileVariant?: MobileVariant;\n\n  /** Colors */\n  primaryColor?: string;\n  activeColor?: string;\n  textColor?: string;\n  hoverColor?: string;\n  borderColor?: string;\n  disabledColor?: string;\n  backgroundColor?: string;\n\n  onTabChange?: (index: number) => void;\n  tabCount?: number;\n  style?: CSSProperties;\n  className?: string;\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n  children,\n  defaultActive = 0,\n  position = \"top\",\n  variant = \"solid\",\n  fullWidth = false,\n  radius = 8,\n  transitionDuration = 200,\n  bordered = false,\n\n  mobileBreakpoint = 768,\n  mobileVariant = \"scroll\",\n\n  backgroundColor,\n\n  primaryColor = \"var(--primary)\",\n  activeColor = \"var(--foreground)\",\n  textColor = \"\",\n  hoverColor = \"var(--primary)\",\n  borderColor = \"var(--border)\",\n  disabledColor = \"var(--muted-foreground)\",\n\n  onTabChange,\n  tabCount = 0,\n  style,\n  className,\n}) => {\n  const [active, setActive] = useState(defaultActive);\n  const [resolvedCount, setResolvedCount] = useState(tabCount);\n  const [drawerOpen, setDrawerOpen] = useState(false);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const isMobile = useBreakpoint(mobileBreakpoint);\n\n  useEffect(() => {\n    if (!tabCount && containerRef.current) {\n      setResolvedCount(\n        containerRef.current.querySelectorAll(\"[data-tab-button]\").length,\n      );\n    }\n    // Previously had NO dependency array while calling setState, so it re-ran\n    // and re-queried the DOM after every render of the whole subtree.\n  }, [tabCount, children]);\n\n  useEffect(() => {\n    if (!isMobile) setDrawerOpen(false);\n  }, [isMobile]);\n\n  const handleSetActive = (i: number) => {\n    setActive(i);\n    onTabChange?.(i);\n    if (isMobile && mobileVariant === \"drawer\") setDrawerOpen(false);\n  };\n\n  const effectivePosition: Position =\n    isMobile && (position === \"left\" || position === \"right\")\n      ? \"top\"\n      : position;\n\n  const isVertical =\n    effectivePosition === \"left\" || effectivePosition === \"right\";\n\n  return (\n    <TabsContext.Provider\n      value={{\n        active,\n        setActive: handleSetActive,\n        variant,\n        position: effectivePosition,\n        primaryColor,\n        activeColor,\n        textColor,\n        hoverColor,\n        borderColor,\n        disabledColor,\n        radius,\n        transitionDuration,\n        fullWidth,\n        tabCount: resolvedCount,\n        isMobile,\n        mobileVariant,\n        drawerOpen,\n        setDrawerOpen,\n      }}\n    >\n      <div\n        ref={containerRef}\n        className={clsx(\n          \"modern-tabs\",\n          \"text-foreground\",\n          isVertical ? \"flex flex-row\" : \"flex flex-col\",\n          effectivePosition === \"right\" && \"flex-row-reverse\",\n          effectivePosition === \"bottom\" && \"flex-col-reverse\",\n          bordered && \"border border-border\",\n          className,\n        )}\n        style={{\n          // This was `background: \"bg-background\"` — a Tailwind class name in a\n          // CSS property, which the browser silently drops, so the root had no\n          // background at all. The `backgroundColor` prop belongs here.\n          background: backgroundColor ?? \"var(--background)\",\n          borderRadius: radius,\n          overflow: \"hidden\",\n          ...style,\n        }}\n      >\n        <style>{`\n          @keyframes tab-fade-in {\n            from { opacity: 0; transform: translateY(4px); }\n            to   { opacity: 1; transform: translateY(0); }\n          }\n          @keyframes tab-drawer-open {\n            from { opacity: 0; transform: translateY(-6px); }\n            to   { opacity: 1; transform: translateY(0); }\n          }\n          .tab-panel-active {\n            animation: tab-fade-in ${transitionDuration}ms ease;\n          }\n          .tab-drawer-menu {\n            animation: tab-drawer-open ${transitionDuration}ms ease;\n          }\n          .tab-scroll-strip {\n            overflow-x: auto;\n            scrollbar-width: none;\n            -ms-overflow-style: none;\n            scroll-snap-type: x mandatory;\n            -webkit-overflow-scrolling: touch;\n          }\n          .tab-scroll-strip::-webkit-scrollbar { display: none; }\n          .tab-scroll-strip [data-tab-button] {\n            scroll-snap-align: start;\n            flex-shrink: 0;\n          }\n        `}</style>\n        {children}\n      </div>\n    </TabsContext.Provider>\n  );\n};\n\n/* ------------------------------------------------------------------ */\n/*  <TabList>                                                           */\n/* ------------------------------------------------------------------ */\n\nexport interface TabListProps {\n  children: ReactNode;\n  gap?: number;\n  /** Label shown in drawer trigger when no tab is active (fallback) */\n  drawerLabel?: ReactNode;\n  /** Icon for the drawer chevron area */\n  drawerIcon?: ReactNode;\n  style?: CSSProperties;\n  className?: string;\n  /** The drawer trigger `<button>` (mobileVariant=\"drawer\" only). */\n  triggerClassName?: string;\n  /** The dropdown menu panel (mobileVariant=\"drawer\" only). */\n  menuClassName?: string;\n}\n\nconst ChevronIcon = ({ open }: { open: boolean }) => (\n  <svg\n    width=\"14\"\n    height=\"14\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2.5\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n    style={{\n      transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n      transition: \"transform 200ms ease\",\n      display: \"flex\",\n      flexShrink: 0,\n    }}\n  >\n    <polyline points=\"6 9 12 15 18 9\" />\n  </svg>\n);\n\nexport const TabList: React.FC<TabListProps> = ({\n  children,\n  gap = 8,\n  drawerLabel = \"Select tab\",\n  style,\n  className,\n  triggerClassName,\n  menuClassName,\n}) => {\n  const {\n    position,\n    isMobile,\n    mobileVariant,\n    drawerOpen,\n    setDrawerOpen,\n    radius,\n    active,\n  } = useTabsContext();\n\n  const isVertical = position === \"left\" || position === \"right\";\n\n  /* ---- MOBILE: Drawer ---- */\n  if (isMobile && mobileVariant === \"drawer\") {\n    const tabArray = React.Children.toArray(children);\n    const activeTabEl = tabArray[active] as\n      | React.ReactElement<TabProps>\n      | undefined;\n    const activeLabel = activeTabEl?.props?.children ?? drawerLabel;\n\n    return (\n      <div\n        className={clsx(\n          \"relative w-full bg-background text-foreground\",\n          className,\n        )}\n        style={{ padding: 8, ...style }}\n      >\n        {/* Trigger */}\n        <button\n          onClick={() => setDrawerOpen(!drawerOpen)}\n          className={cn(\n            \"flex items-center justify-between w-full font-medium border border-border bg-background text-foreground hover:bg-accent transition-colors\",\n            triggerClassName,\n          )}\n          style={{\n            padding: \"10px 16px\",\n            borderRadius: radius,\n            cursor: \"pointer\",\n            fontSize: 14,\n          }}\n        >\n          <span>{activeLabel}</span>\n          <ChevronIcon open={drawerOpen} />\n        </button>\n\n        {/* Dropdown */}\n        {drawerOpen && (\n          <div\n            className={cn(\n              \"tab-drawer-menu absolute left-0 right-0 z-50 flex flex-col bg-background text-foreground border border-border\",\n              menuClassName,\n            )}\n            style={{\n              top: \"calc(100% + 4px)\",\n              borderRadius: radius,\n              boxShadow: \"0 8px 24px rgba(0,0,0,0.12)\",\n              gap: 4,\n              padding: 6,\n            }}\n          >\n            {children}\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  /* ---- MOBILE: Horizontal scroll strip ---- */\n  if (isMobile && mobileVariant === \"scroll\") {\n    return (\n      <div\n        role=\"tablist\"\n        className={clsx(\n          \"tab-scroll-strip flex flex-row w-full bg-background text-foreground\",\n          className,\n        )}\n        style={{ gap, padding: 8, ...style }}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  /* ---- MOBILE: Stacked vertical ---- */\n  if (isMobile && mobileVariant === \"stack\") {\n    return (\n      <div\n        role=\"tablist\"\n        className={clsx(\n          \"flex flex-col w-full bg-background text-foreground\",\n          className,\n        )}\n        style={{ gap, padding: 8, ...style }}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  /* ---- MOBILE: Collapse (fix) ---- */\n  if (isMobile && mobileVariant === \"collapse\") {\n    return (\n      <div\n        role=\"tablist\"\n        className={clsx(\n          \"flex flex-row flex-wrap w-full bg-background text-foreground\",\n          className,\n        )}\n        style={{\n          gap,\n          padding: 8,\n          ...style,\n        }}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  /* ---- Default: desktop / collapse ---- */\n  return (\n    <div\n      role=\"tablist\"\n      className={clsx(\n        \"flex text-foreground\",\n        isVertical ? \"flex-col\" : \"flex-row\",\n        isVertical ? \"min-w-40\" : \"w-full\",\n        className,\n      )}\n      style={{ gap, padding: 8, ...style }}\n    >\n      {children}\n    </div>\n  );\n};\n\n/* ------------------------------------------------------------------ */\n/*  <Tab>                                                               */\n/* ------------------------------------------------------------------ */\n\nexport interface TabProps {\n  children: ReactNode;\n  index?: number;\n  icon?: ReactNode;\n  disabled?: boolean;\n  ariaLabel?: string;\n  style?: CSSProperties;\n  className?: string;\n  activeStyle?: CSSProperties;\n  inactiveStyle?: CSSProperties;\n  /** Wraps the `icon` node. */\n  iconClassName?: string;\n}\n\nexport const Tab: React.FC<TabProps> = ({\n  children,\n  index,\n  icon,\n  disabled = false,\n  ariaLabel,\n  className,\n  iconClassName,\n}) => {\n  const { active, setActive, variant, tabCount, isMobile, mobileVariant } =\n    useTabsContext();\n\n  const selfIndexRef = useRef<number | undefined>(index);\n  const buttonRef = useRef<HTMLButtonElement>(null);\n\n  const resolvedIndex = (): number => {\n    if (selfIndexRef.current !== undefined) return selfIndexRef.current;\n    if (!buttonRef.current) return 0;\n\n    const list = buttonRef.current\n      .closest(\"[role=tablist], .tab-drawer-menu\")\n      ?.querySelectorAll(\"[data-tab-button]\");\n\n    if (!list) return 0;\n    return Array.from(list).indexOf(buttonRef.current);\n  };\n\n  const isActive = resolvedIndex() === active;\n\n  const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n    const count = tabCount || 1;\n    const idx = resolvedIndex();\n\n    if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n      e.preventDefault();\n      setActive((idx + 1) % count);\n    } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n      e.preventDefault();\n      setActive((idx - 1 + count) % count);\n    }\n  };\n\n  const forceFullWidth =\n    isMobile &&\n    (mobileVariant === \"stack\" ||\n      mobileVariant === \"drawer\" ||\n      mobileVariant === \"collapse\");\n\n  // -----------------------------\n  // VARIANT CLASSES (TAILWIND ONLY)\n  // -----------------------------\n\n  const baseVariant =\n    variant === \"outline\"\n      ? \"border border-border bg-transparent\"\n      : variant === \"underline\"\n        ? \"!border-b-2 border-transparent rounded-none\"\n        : variant === \"pill\"\n          ? \"!rounded-full\"\n          : \"border-none\";\n\n  const activeVariant =\n    variant === \"solid\" || variant === \"pill\"\n      ? \"bg-primary text-primary-foreground\"\n      : variant === \"outline\"\n        ? \"border-primary text-primary !bg-primary/5\"\n        : variant === \"underline\"\n          ? \"!border-primary !text-primary\"\n          : \"\";\n\n  const hoverVariant =\n    variant === \"underline\"\n      ? \"hover:text-foreground\"\n      : \"hover:bg-accent hover:text-foreground\";\n\n  return (\n    <button\n      ref={buttonRef}\n      data-tab-button\n      role=\"tab\"\n      aria-selected={isActive}\n      aria-label={ariaLabel}\n      disabled={disabled}\n      onClick={() => !disabled && setActive(resolvedIndex())}\n      onKeyDown={handleKeyDown}\n      className={clsx(\n        \"flex items-center rounded-lg justify-center gap-2 font-medium select-none transition-all\",\n        \"text-muted-foreground text-sm whitespace-nowrap\",\n        !disabled && \"cursor-pointer\",\n        disabled && \"opacity-60 cursor-not-allowed\",\n        forceFullWidth && \"w-full\",\n\n        baseVariant,\n        !disabled && hoverVariant,\n        isActive && \"text-foreground\",\n        isActive && activeVariant,\n\n        className,\n      )}\n      style={{\n        padding: \"10px 16px\", // kept minimal inline (safe, not theme-related)\n      }}\n    >\n      {icon && <span className={cn(\"shrink-0\", iconClassName)}>{icon}</span>}\n      {children}\n    </button>\n  );\n};\n\n/* ------------------------------------------------------------------ */\n/*  <TabPanels>                                                         */\n/* ------------------------------------------------------------------ */\n\nexport interface TabPanelsProps {\n  children: ReactNode;\n  style?: CSSProperties;\n  className?: string;\n}\n\nexport const TabPanels: React.FC<TabPanelsProps> = ({\n  children,\n  style,\n  className,\n}) => {\n  return (\n    <div\n      className={clsx(\"flex-1 min-w-0 text-foreground\", className)}\n      style={{\n        ...style,\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n\n/* ------------------------------------------------------------------ */\n/*  <TabPanel>                                                          */\n/* ------------------------------------------------------------------ */\n\nexport interface TabPanelProps {\n  children: ReactNode;\n  index: number;\n  keepMounted?: boolean;\n  style?: CSSProperties;\n  className?: string;\n}\n\nexport const TabPanel: React.FC<TabPanelProps> = ({\n  children,\n  index,\n  keepMounted = false,\n  style,\n  className,\n}) => {\n  const { active } = useTabsContext();\n  const isActive = index === active;\n\n  if (!keepMounted && !isActive) return null;\n\n  return (\n    <div\n      role=\"tabpanel\"\n      hidden={!isActive}\n      className={clsx(\n        isActive && \"tab-panel-active\",\n        \"text-foreground\",\n        className,\n      )}\n      style={{ display: isActive ? undefined : \"none\", ...style }}\n    >\n      {children}\n    </div>\n  );\n};\n","\"use client\";\n\nimport React from \"react\";\nimport { Sun, Moon } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type ThemeToggleContext = {\n  isDark: boolean;\n  toggleTheme: () => void;\n};\n\nexport type ThemeToggleProps = {\n  context: ThemeToggleContext;\n  className?: string;\n  /** The sun icon (shown in dark mode). */\n  sunClassName?: string;\n  /** The moon icon (shown in light mode). */\n  moonClassName?: string;\n};\n\nexport const ThemeToggleButton: React.FC<ThemeToggleProps> = ({\n  context,\n  className = \"\",\n  sunClassName,\n  moonClassName,\n}) => {\n  const { isDark, toggleTheme } = context;\n\n  return (\n    <button\n      onClick={toggleTheme}\n      type=\"button\"\n      aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n      className={cn(\n        \"relative flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-full\",\n        \"text-foreground transition-colors duration-200 hover:bg-accent\",\n        \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n        className,\n      )}\n    >\n      {/* Only one icon is ever visible: it rotates and scales in as the other\n          rotates and scales out, instead of sliding a thumb along a track. */}\n      <Sun\n        size={18}\n        aria-hidden=\"true\"\n        className={cn(\n          \"absolute text-warning transition-all duration-300\",\n          isDark ? \"rotate-0 scale-100 opacity-100\" : \"-rotate-90 scale-0 opacity-0\",\n          sunClassName,\n        )}\n      />\n      <Moon\n        size={18}\n        aria-hidden=\"true\"\n        className={cn(\n          \"absolute text-info transition-all duration-300\",\n          isDark ? \"rotate-90 scale-0 opacity-0\" : \"rotate-0 scale-100 opacity-100\",\n          moonClassName,\n        )}\n      />\n    </button>\n  );\n};\n\nexport default ThemeToggleButton;\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/* -------------------------------------------------------------------------- */\n/* 🧩 Types                                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n  /** Visual style of the card surface. */\n  variant?: \"default\" | \"outline\" | \"elevated\" | \"ghost\";\n  /** Inner padding scale applied by the sub-components. */\n  padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n  /** Lift the card slightly on hover. */\n  hoverable?: boolean;\n}\n\nexport interface CardSectionProps\n  extends React.HTMLAttributes<HTMLDivElement> {\n  children?: React.ReactNode;\n}\n\nexport interface CardHeaderProps\n  // `title` here is a ReactNode slot, not the native tooltip attribute.\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n  title?: React.ReactNode;\n  description?: React.ReactNode;\n  icon?: React.ReactNode;\n  /** Slot rendered at the far right of the header (menu, action button…). */\n  action?: React.ReactNode;\n\n  /** 🔥 Full Customization */\n  iconClassName?: string;\n  titleClassName?: string;\n  descriptionClassName?: string;\n  actionClassName?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* 🃏 Card                                                                   */\n/* -------------------------------------------------------------------------- */\n\nconst paddingContext = React.createContext<\"none\" | \"sm\" | \"md\" | \"lg\">(\"md\");\n\nconst SECTION_PADDING = {\n  none: \"\",\n  sm: \"px-4 py-3\",\n  md: \"px-6 py-4\",\n  lg: \"px-8 py-6\",\n} as const;\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n  { variant = \"default\", padding = \"md\", hoverable = false, className, children, ...rest },\n  ref,\n) {\n  const variants = {\n    default: \"bg-card text-card-foreground border border-border\",\n    outline: \"bg-transparent text-foreground border border-border\",\n    elevated:\n      \"bg-card text-card-foreground border border-border shadow-lg shadow-black/5\",\n    ghost: \"bg-muted/50 text-foreground border border-transparent\",\n  } as const;\n\n  return (\n    <paddingContext.Provider value={padding}>\n      <div\n        ref={ref}\n        className={cn(\n          // No overflow-hidden: it clipped any Popover/Dropdown/DatePicker\n          // rendered inside the card. The footer rounds itself instead.\n          \"rounded-xl transition-shadow\",\n          variants[variant] ?? variants.default,\n          hoverable && \"hover:shadow-lg hover:shadow-black/10\",\n          className,\n        )}\n        {...rest}\n      >\n        {children}\n      </div>\n    </paddingContext.Provider>\n  );\n});\n\nCard.displayName = \"Card\";\n\n/* -------------------------------------------------------------------------- */\n/* Sub-components                                                            */\n/* -------------------------------------------------------------------------- */\n\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\n  function CardHeader(\n    {\n      title,\n      description,\n      icon,\n      action,\n      className,\n      iconClassName,\n      titleClassName,\n      descriptionClassName,\n      actionClassName,\n      children,\n      ...rest\n    },\n    ref,\n  ) {\n    const padding = React.useContext(paddingContext);\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex items-start justify-between gap-3 border-b border-border\",\n          SECTION_PADDING[padding],\n          className,\n        )}\n        {...rest}\n      >\n        <div className=\"flex min-w-0 items-start gap-3\">\n          {icon && (\n            <span\n              aria-hidden=\"true\"\n              // h-6 matches the title's leading-6, so the icon is optically\n              // centered on the title line whether or not a description exists\n              // (a fixed mt nudge previously left it visibly high).\n              className={cn(\n                \"flex h-6 shrink-0 items-center text-primary [&_svg]:h-5 [&_svg]:w-5\",\n                iconClassName,\n              )}\n            >\n              {icon}\n            </span>\n          )}\n          <div className=\"min-w-0\">\n            {title && (\n              <h3\n                className={cn(\n                  \"text-sm font-semibold leading-6 text-foreground\",\n                  titleClassName,\n                )}\n              >\n                {title}\n              </h3>\n            )}\n            {description && (\n              <p\n                className={cn(\n                  \"text-xs text-muted-foreground\",\n                  descriptionClassName,\n                )}\n              >\n                {description}\n              </p>\n            )}\n            {children}\n          </div>\n        </div>\n        {action && (\n          <div className={cn(\"shrink-0\", actionClassName)}>{action}</div>\n        )}\n      </div>\n    );\n  },\n);\n\nCardHeader.displayName = \"CardHeader\";\n\nexport const CardBody = forwardRef<HTMLDivElement, CardSectionProps>(\n  function CardBody({ className, children, ...rest }, ref) {\n    const padding = React.useContext(paddingContext);\n    return (\n      <div ref={ref} className={cn(SECTION_PADDING[padding], className)} {...rest}>\n        {children}\n      </div>\n    );\n  },\n);\n\nCardBody.displayName = \"CardBody\";\n\nexport const CardFooter = forwardRef<HTMLDivElement, CardSectionProps>(\n  function CardFooter({ className, children, ...rest }, ref) {\n    const padding = React.useContext(paddingContext);\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex items-center justify-end gap-3 border-t border-border bg-accent/40\",\n          // The card no longer clips its children, so the tinted footer\n          // rounds its own bottom corners to match the card radius.\n          \"rounded-b-[inherit]\",\n          SECTION_PADDING[padding],\n          className,\n        )}\n        {...rest}\n      >\n        {children}\n      </div>\n    );\n  },\n);\n\nCardFooter.displayName = \"CardFooter\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\n  orientation?: \"horizontal\" | \"vertical\";\n  /** Optional centered label — horizontal orientation only. */\n  label?: React.ReactNode;\n  dashed?: boolean;\n  /** Vertical spacing (horizontal) or horizontal spacing (vertical). */\n  spacing?: \"none\" | \"sm\" | \"md\" | \"lg\";\n\n  /** 🔥 Full Customization (labeled horizontal variant only) */\n  lineClassName?: string;\n  labelClassName?: string;\n}\n\nconst H_SPACING = { none: \"my-0\", sm: \"my-2\", md: \"my-4\", lg: \"my-8\" } as const;\nconst V_SPACING = { none: \"mx-0\", sm: \"mx-2\", md: \"mx-4\", lg: \"mx-8\" } as const;\n\nexport const Divider = forwardRef<HTMLDivElement, DividerProps>(\n  function Divider(\n    {\n      orientation = \"horizontal\",\n      label,\n      dashed = false,\n      spacing = \"md\",\n      className,\n      lineClassName,\n      labelClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    if (orientation === \"vertical\") {\n      return (\n        <div\n          ref={ref}\n          role=\"separator\"\n          aria-orientation=\"vertical\"\n          className={cn(\n            \"inline-block self-stretch w-px min-h-4 bg-border\",\n            dashed && \"bg-transparent border-l border-dashed border-border\",\n            V_SPACING[spacing],\n            className,\n          )}\n          {...rest}\n        />\n      );\n    }\n\n    if (label) {\n      return (\n        <div\n          ref={ref}\n          role=\"separator\"\n          aria-orientation=\"horizontal\"\n          className={cn(\n            \"flex items-center gap-3 text-xs text-muted-foreground\",\n            H_SPACING[spacing],\n            className,\n          )}\n          {...rest}\n        >\n          <span\n            aria-hidden=\"true\"\n            className={cn(\n              \"h-px flex-1 bg-border\",\n              dashed && \"bg-transparent border-t border-dashed border-border\",\n              lineClassName,\n            )}\n          />\n          <span className={cn(\"shrink-0\", labelClassName)}>{label}</span>\n          <span\n            aria-hidden=\"true\"\n            className={cn(\n              \"h-px flex-1 bg-border\",\n              dashed && \"bg-transparent border-t border-dashed border-border\",\n              lineClassName,\n            )}\n          />\n        </div>\n      );\n    }\n\n    return (\n      <div\n        ref={ref}\n        role=\"separator\"\n        aria-orientation=\"horizontal\"\n        className={cn(\n          \"h-px w-full bg-border\",\n          dashed && \"bg-transparent border-t border-dashed border-border\",\n          H_SPACING[spacing],\n          className,\n        )}\n        {...rest}\n      />\n    );\n  },\n);\n\nDivider.displayName = \"Divider\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface ChipProps\n  extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n  label: React.ReactNode;\n  variant?: \"solid\" | \"soft\" | \"outline\";\n  color?: \"primary\" | \"neutral\" | \"destructive\" | \"success\";\n  size?: \"sm\" | \"md\" | \"lg\";\n  icon?: React.ReactNode;\n  /** Renders a remove button and makes the chip dismissible. */\n  onRemove?: () => void;\n  disabled?: boolean;\n\n  /** 🔥 Full Customization */\n  iconClassName?: string;\n  labelClassName?: string;\n  removeButtonClassName?: string;\n  removeIconClassName?: string;\n}\n\nconst SIZES = {\n  sm: { root: \"h-6 px-2 text-[11px] gap-1\", icon: \"w-3 h-3\", remove: \"w-3 h-3\" },\n  md: { root: \"h-7 px-2.5 text-xs gap-1.5\", icon: \"w-3.5 h-3.5\", remove: \"w-3.5 h-3.5\" },\n  lg: { root: \"h-8 px-3 text-sm gap-2\", icon: \"w-4 h-4\", remove: \"w-4 h-4\" },\n} as const;\n\nconst COLORS = {\n  primary: {\n    solid: \"bg-primary text-primary-foreground\",\n    soft: \"bg-primary/10 text-primary\",\n    outline: \"border border-primary text-primary\",\n  },\n  neutral: {\n    solid: \"bg-foreground text-background\",\n    soft: \"bg-muted text-foreground\",\n    outline: \"border border-border text-foreground\",\n  },\n  destructive: {\n    solid: \"bg-destructive text-destructive-foreground\",\n    soft: \"bg-destructive/10 text-destructive\",\n    outline: \"border border-destructive text-destructive\",\n  },\n  success: {\n    solid: \"bg-success text-success-foreground\",\n    soft: \"bg-success/10 text-success\",\n    outline: \"border border-success text-success\",\n  },\n} as const;\n\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(\n  {\n    label,\n    variant = \"soft\",\n    color = \"primary\",\n    size = \"md\",\n    icon,\n    onRemove,\n    disabled = false,\n    className,\n    iconClassName,\n    labelClassName,\n    removeButtonClassName,\n    removeIconClassName,\n    ...rest\n  },\n  ref,\n) {\n  const sizes = SIZES[size] ?? SIZES.md;\n  const palette = COLORS[color] ?? COLORS.primary;\n\n  return (\n    <span\n      ref={ref}\n      className={cn(\n        // max-w-full lets the label actually truncate inside narrow parents.\n        \"inline-flex max-w-full items-center rounded-full font-medium select-none\",\n        sizes.root,\n        palette[variant] ?? palette.soft,\n        disabled && \"opacity-50\",\n        className,\n      )}\n      {...rest}\n    >\n      {icon && (\n        <span\n          aria-hidden=\"true\"\n          className={cn(\n            \"shrink-0 [&_svg]:w-full [&_svg]:h-full\",\n            sizes.icon,\n            iconClassName,\n          )}\n        >\n          {icon}\n        </span>\n      )}\n      <span className={cn(\"min-w-0 truncate\", labelClassName)}>{label}</span>\n      {onRemove && (\n        <button\n          type=\"button\"\n          aria-label={typeof label === \"string\" ? `Remove ${label}` : \"Remove\"}\n          disabled={disabled}\n          onClick={onRemove}\n          className={cn(\n            \"shrink-0 -mr-0.5 rounded-full opacity-70 transition-opacity\",\n            \"hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n            disabled && \"cursor-not-allowed\",\n            removeButtonClassName,\n          )}\n        >\n          <X aria-hidden=\"true\" className={cn(sizes.remove, removeIconClassName)} />\n        </button>\n      )}\n    </span>\n  );\n});\n\nChip.displayName = \"Chip\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n  children: React.ReactNode;\n  size?: \"sm\" | \"md\";\n}\n\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n  { children, size = \"md\", className, ...rest },\n  ref,\n) {\n  return (\n    <kbd\n      ref={ref}\n      className={cn(\n        // align-middle: an inline-flex box otherwise sits on the text\n        // baseline and hangs visibly low next to the surrounding words.\n        \"inline-flex items-center justify-center align-middle whitespace-nowrap select-none\",\n        \"rounded-md border border-border bg-muted font-mono font-medium leading-none text-muted-foreground\",\n        // Key-cap depth: a solid bottom shadow instead of border-b-2, which in\n        // the same color as the other borders just looked lopsided.\n        \"shadow-[0_2px_0_0_var(--border)]\",\n        size === \"sm\" ? \"min-w-5 h-5 px-1 text-[10px]\" : \"min-w-6 h-6 px-1.5 text-xs\",\n        className,\n      )}\n      {...rest}\n    >\n      {children}\n    </kbd>\n  );\n});\n\nKbd.displayName = \"Kbd\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n  variant?: \"text\" | \"circular\" | \"rectangular\";\n  width?: number | string;\n  height?: number | string;\n  /** For variant=\"text\": number of stacked lines (last one is shorter). */\n  lines?: number;\n  /** Disable the pulse animation. */\n  animated?: boolean;\n  /** Applied to each individual line when variant=\"text\" and lines > 1. */\n  lineClassName?: string;\n}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n  function Skeleton(\n    {\n      variant = \"text\",\n      width,\n      height,\n      lines = 1,\n      animated = true,\n      className,\n      lineClassName,\n      style,\n      ...rest\n    },\n    ref,\n  ) {\n    const base = cn(\n      \"bg-muted\",\n      animated && \"animate-pulse motion-reduce:animate-none\",\n    );\n\n    if (variant === \"text\" && lines > 1) {\n      return (\n        <div\n          ref={ref}\n          aria-hidden=\"true\"\n          className={cn(\"w-full space-y-2\", className)}\n          style={{ width, ...style }}\n          {...rest}\n        >\n          {Array.from({ length: lines }, (_, i) => (\n            <div\n              key={i}\n              className={cn(\n                base,\n                \"h-4 rounded\",\n                // Shorter last line reads as a paragraph, not a block.\n                i === lines - 1 ? \"w-3/5\" : \"w-full\",\n                lineClassName,\n              )}\n            />\n          ))}\n        </div>\n      );\n    }\n\n    return (\n      <div\n        ref={ref}\n        aria-hidden=\"true\"\n        className={cn(\n          base,\n          variant === \"circular\" && \"rounded-full\",\n          variant === \"rectangular\" && \"rounded-lg\",\n          variant === \"text\" && \"h-4 rounded\",\n          className,\n        )}\n        style={{\n          width: width ?? (variant === \"circular\" ? 40 : \"100%\"),\n          height:\n            height ?? (variant === \"circular\" ? 40 : variant === \"rectangular\" ? 96 : undefined),\n          ...style,\n        }}\n        {...rest}\n      />\n    );\n  },\n);\n\nSkeleton.displayName = \"Skeleton\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {\n  size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n  /** Accessible label announced to screen readers. */\n  label?: string;\n  /** Stroke color class; defaults to the current text color. */\n  colorClassName?: string;\n  /** Applied to the visually-hidden (sr-only) accessible label. */\n  labelClassName?: string;\n}\n\nconst SIZES = {\n  xs: \"w-3 h-3 border-2\",\n  sm: \"w-4 h-4 border-2\",\n  md: \"w-6 h-6 border-2\",\n  lg: \"w-8 h-8 border-[3px]\",\n  xl: \"w-12 h-12 border-4\",\n} as const;\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(\n  function Spinner(\n    {\n      size = \"md\",\n      label = \"Loading…\",\n      colorClassName,\n      labelClassName,\n      className,\n      ...rest\n    },\n    ref,\n  ) {\n    return (\n      <span\n        ref={ref}\n        role=\"status\"\n        className={cn(\"inline-flex items-center justify-center\", className)}\n        {...rest}\n      >\n        <span\n          aria-hidden=\"true\"\n          className={cn(\n            \"inline-block rounded-full border-current border-t-transparent animate-spin motion-reduce:animate-[spin_1.5s_linear_infinite]\",\n            SIZES[size] ?? SIZES.md,\n            colorClassName ?? \"text-primary\",\n          )}\n        />\n        <span className={cn(\"sr-only\", labelClassName)}>{label}</span>\n      </span>\n    );\n  },\n);\n\nSpinner.displayName = \"Spinner\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface ProgressProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n  /** 0–max. Omit (undefined) for an indeterminate bar. */\n  value?: number;\n  max?: number;\n  variant?: \"linear\" | \"circular\";\n  size?: \"sm\" | \"md\" | \"lg\";\n  /** Show the percentage next to (linear) or inside (circular) the track. */\n  showValue?: boolean;\n  /** Accessible label for the progress bar. */\n  label?: string;\n  colorClassName?: string;\n  /** The track behind the fill/indicator (the muted background). */\n  trackClassName?: string;\n  /** The filled portion (linear bar or circular arc), alongside `colorClassName`. */\n  fillClassName?: string;\n  /** The percentage text shown when `showValue` is set. */\n  valueClassName?: string;\n}\n\nconst LINEAR_SIZES = { sm: \"h-1\", md: \"h-2\", lg: \"h-3\" } as const;\nconst CIRCULAR_SIZES = { sm: 32, md: 48, lg: 64 } as const;\n\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(\n  function Progress(\n    {\n      value,\n      max = 100,\n      variant = \"linear\",\n      size = \"md\",\n      showValue = false,\n      label,\n      colorClassName,\n      trackClassName,\n      fillClassName,\n      valueClassName,\n      className,\n      ...rest\n    },\n    ref,\n  ) {\n    const indeterminate = value === undefined || value === null;\n    const clamped = indeterminate ? 0 : Math.min(Math.max(value, 0), max);\n    const percent = indeterminate ? 0 : Math.round((clamped / max) * 100);\n\n    const ariaProps = {\n      role: \"progressbar\" as const,\n      \"aria-label\": label,\n      \"aria-valuemin\": 0,\n      \"aria-valuemax\": max,\n      \"aria-valuenow\": indeterminate ? undefined : clamped,\n    };\n\n    if (variant === \"circular\") {\n      const box = CIRCULAR_SIZES[size] ?? CIRCULAR_SIZES.md;\n      const stroke = size === \"sm\" ? 3 : 4;\n      const radius = (box - stroke) / 2;\n      const circumference = 2 * Math.PI * radius;\n      const offset = circumference * (1 - percent / 100);\n\n      return (\n        <div\n          ref={ref}\n          {...ariaProps}\n          className={cn(\n            \"relative inline-flex items-center justify-center\",\n            className,\n          )}\n          {...rest}\n        >\n          <svg\n            width={box}\n            height={box}\n            viewBox={`0 0 ${box} ${box}`}\n            className={cn(indeterminate && \"animate-spin\")}\n            aria-hidden=\"true\"\n          >\n            <circle\n              cx={box / 2}\n              cy={box / 2}\n              r={radius}\n              fill=\"none\"\n              strokeWidth={stroke}\n              className={cn(\"stroke-muted\", trackClassName)}\n            />\n            <circle\n              cx={box / 2}\n              cy={box / 2}\n              r={radius}\n              fill=\"none\"\n              strokeWidth={stroke}\n              strokeLinecap=\"round\"\n              strokeDasharray={circumference}\n              strokeDashoffset={indeterminate ? circumference * 0.75 : offset}\n              transform={`rotate(-90 ${box / 2} ${box / 2})`}\n              className={cn(\n                \"transition-[stroke-dashoffset] duration-300\",\n                colorClassName ?? \"stroke-primary\",\n                fillClassName,\n              )}\n            />\n          </svg>\n          {showValue && !indeterminate && (\n            <span\n              className={cn(\n                \"absolute font-semibold tabular-nums text-foreground\",\n                size === \"lg\" ? \"text-xs\" : \"text-[10px]\",\n                valueClassName,\n              )}\n            >\n              {percent}%\n            </span>\n          )}\n        </div>\n      );\n    }\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\"flex w-full items-center gap-3\", className)}\n        {...rest}\n      >\n        <div\n          {...ariaProps}\n          className={cn(\n            \"w-full overflow-hidden rounded-full bg-muted\",\n            LINEAR_SIZES[size] ?? LINEAR_SIZES.md,\n            trackClassName,\n          )}\n        >\n          <div\n            className={cn(\n              \"h-full rounded-full transition-[width] duration-300\",\n              colorClassName ?? \"bg-primary\",\n              indeterminate &&\n                \"w-1/3 animate-[progress-indeterminate_1.2s_ease-in-out_infinite] motion-reduce:animate-none\",\n              fillClassName,\n            )}\n            style={indeterminate ? undefined : { width: `${percent}%` }}\n          />\n        </div>\n        {showValue && !indeterminate && (\n          <span\n            className={cn(\n              \"shrink-0 text-xs font-medium tabular-nums text-muted-foreground\",\n              valueClassName,\n            )}\n          >\n            {percent}%\n          </span>\n        )}\n      </div>\n    );\n  },\n);\n\nProgress.displayName = \"Progress\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { TrendingUp, TrendingDown, Minus } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface StatProps extends React.HTMLAttributes<HTMLDivElement> {\n  label: React.ReactNode;\n  value: React.ReactNode;\n  icon?: React.ReactNode;\n  /** Direction of the change indicator. */\n  trend?: \"up\" | \"down\" | \"neutral\";\n  /** e.g. \"+12.5%\" — rendered next to the trend arrow. */\n  trendValue?: React.ReactNode;\n  /** Small helper line under the value (e.g. \"vs last month\"). */\n  description?: React.ReactNode;\n  /** Renders the stat inside a bordered card surface. */\n  bordered?: boolean;\n\n  /** 🔥 Full Customization */\n  headerClassName?: string;\n  labelClassName?: string;\n  iconClassName?: string;\n  valueClassName?: string;\n  footerClassName?: string;\n  trendClassName?: string;\n  trendIconClassName?: string;\n  descriptionClassName?: string;\n}\n\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(function Stat(\n  {\n    label,\n    value,\n    icon,\n    trend,\n    trendValue,\n    description,\n    bordered = true,\n    className,\n    headerClassName,\n    labelClassName,\n    iconClassName,\n    valueClassName,\n    footerClassName,\n    trendClassName,\n    trendIconClassName,\n    descriptionClassName,\n    ...rest\n  },\n  ref,\n) {\n  const TrendIcon =\n    trend === \"up\" ? TrendingUp : trend === \"down\" ? TrendingDown : Minus;\n\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"min-w-0\",\n        bordered && \"rounded-xl border border-border bg-card p-5\",\n        className,\n      )}\n      {...rest}\n    >\n      <div className={cn(\"flex items-start justify-between gap-3\", headerClassName)}>\n        <p\n          className={cn(\n            \"text-xs font-medium uppercase tracking-wide text-muted-foreground\",\n            labelClassName,\n          )}\n        >\n          {label}\n        </p>\n        {icon && (\n          <span\n            aria-hidden=\"true\"\n            className={cn(\n              \"shrink-0 rounded-lg bg-primary/10 p-2 text-primary [&_svg]:h-4 [&_svg]:w-4\",\n              iconClassName,\n            )}\n          >\n            {icon}\n          </span>\n        )}\n      </div>\n\n      <p\n        className={cn(\n          \"mt-2 truncate text-2xl font-bold tabular-nums text-foreground\",\n          valueClassName,\n        )}\n      >\n        {value}\n      </p>\n\n      {(trend || description) && (\n        <div\n          className={cn(\n            \"mt-2 flex flex-wrap items-center gap-2 text-xs\",\n            footerClassName,\n          )}\n        >\n          {trend && (\n            <span\n              className={cn(\n                \"inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 font-medium\",\n                trend === \"up\" && \"bg-success/10 text-success\",\n                trend === \"down\" && \"bg-destructive/10 text-destructive\",\n                trend === \"neutral\" && \"bg-muted text-muted-foreground\",\n                trendClassName,\n              )}\n            >\n              <TrendIcon aria-hidden=\"true\" className={cn(\"h-3 w-3\", trendIconClassName)} />\n              {trendValue}\n            </span>\n          )}\n          {description && (\n            <span className={cn(\"text-muted-foreground\", descriptionClassName)}>\n              {description}\n            </span>\n          )}\n        </div>\n      )}\n    </div>\n  );\n});\n\nStat.displayName = \"Stat\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { Inbox } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface EmptyStateProps\n  // `title` here is a ReactNode slot, not the native tooltip attribute.\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n  icon?: React.ReactNode;\n  title: React.ReactNode;\n  description?: React.ReactNode;\n  /** Call-to-action slot (usually a <Button />). */\n  action?: React.ReactNode;\n  size?: \"sm\" | \"md\" | \"lg\";\n\n  iconClassName?: string;\n  titleClassName?: string;\n  descriptionClassName?: string;\n  actionClassName?: string;\n}\n\nconst SIZES = {\n  sm: { root: \"py-8 px-4\", icon: \"h-10 w-10 [&_svg]:h-5 [&_svg]:w-5\", title: \"text-sm\", desc: \"text-xs max-w-xs\" },\n  md: { root: \"py-12 px-6\", icon: \"h-12 w-12 [&_svg]:h-6 [&_svg]:w-6\", title: \"text-base\", desc: \"text-sm max-w-sm\" },\n  lg: { root: \"py-16 px-8\", icon: \"h-14 w-14 [&_svg]:h-7 [&_svg]:w-7\", title: \"text-lg\", desc: \"text-sm max-w-md\" },\n} as const;\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n  function EmptyState(\n    {\n      icon,\n      title,\n      description,\n      action,\n      size = \"md\",\n      className,\n      iconClassName,\n      titleClassName,\n      descriptionClassName,\n      actionClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const sizes = SIZES[size] ?? SIZES.md;\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex w-full flex-col items-center justify-center text-center\",\n          sizes.root,\n          className,\n        )}\n        {...rest}\n      >\n        <span\n          aria-hidden=\"true\"\n          className={cn(\n            \"mb-4 inline-flex items-center justify-center rounded-full bg-muted text-muted-foreground\",\n            sizes.icon,\n            iconClassName,\n          )}\n        >\n          {icon ?? <Inbox />}\n        </span>\n\n        <h3 className={cn(\"font-semibold text-foreground\", sizes.title, titleClassName)}>\n          {title}\n        </h3>\n\n        {description && (\n          <p className={cn(\"mt-1 text-muted-foreground\", sizes.desc, descriptionClassName)}>\n            {description}\n          </p>\n        )}\n\n        {action && <div className={cn(\"mt-5\", actionClassName)}>{action}</div>}\n      </div>\n    );\n  },\n);\n\nEmptyState.displayName = \"EmptyState\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TimelineItem {\n  title: React.ReactNode;\n  description?: React.ReactNode;\n  /** Timestamp or meta text shown next to the title. */\n  time?: React.ReactNode;\n  icon?: React.ReactNode;\n  status?: \"done\" | \"active\" | \"pending\";\n}\n\nexport interface TimelineProps\n  extends Omit<React.HTMLAttributes<HTMLOListElement>, \"children\"> {\n  items: TimelineItem[];\n  size?: \"sm\" | \"md\";\n\n  /** Each `<li>` row. */\n  itemClassName?: string;\n  /** The vertical connector line between dots. */\n  connectorClassName?: string;\n  /** The status dot/icon bubble. */\n  dotClassName?: string;\n  /** Wrapper around the title/time/description block. */\n  contentClassName?: string;\n  /** Item title. */\n  titleClassName?: string;\n  /** Timestamp/meta text next to the title. */\n  timeClassName?: string;\n  /** Item description. */\n  descriptionClassName?: string;\n}\n\nconst DOT = {\n  done: \"bg-primary text-primary-foreground border-primary\",\n  active: \"bg-primary/15 text-primary border-primary\",\n  pending: \"bg-muted text-muted-foreground border-border\",\n} as const;\n\nexport const Timeline = forwardRef<HTMLOListElement, TimelineProps>(\n  function Timeline(\n    {\n      items,\n      size = \"md\",\n      className,\n      itemClassName,\n      connectorClassName,\n      dotClassName,\n      contentClassName,\n      titleClassName,\n      timeClassName,\n      descriptionClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const compact = size === \"sm\";\n\n    return (\n      <ol ref={ref} className={cn(\"relative\", className)} {...rest}>\n        {items.map((item, i) => {\n          const status = item.status ?? \"pending\";\n          const isLast = i === items.length - 1;\n\n          return (\n            <li\n              key={i}\n              className={cn(\n                \"relative flex gap-4\",\n                !isLast && (compact ? \"pb-6\" : \"pb-8\"),\n                itemClassName,\n              )}\n            >\n              {/* Connector line */}\n              {!isLast && (\n                <span\n                  aria-hidden=\"true\"\n                  className={cn(\n                    \"absolute top-8 bottom-0 w-px bg-border\",\n                    // left = half the dot width, so the line runs through the\n                    // dot's center at both sizes.\n                    compact ? \"left-3.5 top-7\" : \"left-4\",\n                    connectorClassName,\n                  )}\n                />\n              )}\n\n              {/* Dot */}\n              <span\n                aria-hidden=\"true\"\n                className={cn(\n                  \"relative z-10 flex shrink-0 items-center justify-center rounded-full border\",\n                  compact ? \"h-7 w-7 [&_svg]:h-3 [&_svg]:w-3\" : \"h-8 w-8 [&_svg]:h-3.5 [&_svg]:w-3.5\",\n                  DOT[status],\n                  dotClassName,\n                )}\n              >\n                {item.icon ?? (status === \"done\" ? <Check /> : (\n                  <span\n                    className={cn(\n                      \"rounded-full\",\n                      compact ? \"h-1.5 w-1.5\" : \"h-2 w-2\",\n                      status === \"active\" ? \"bg-primary\" : \"bg-muted-foreground/50\",\n                    )}\n                  />\n                ))}\n              </span>\n\n              {/* Content */}\n              <div className={cn(\"min-w-0 flex-1 pt-1\", contentClassName)}>\n                <div className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n                  <h4\n                    className={cn(\n                      \"font-medium\",\n                      compact ? \"text-sm\" : \"text-sm\",\n                      status === \"pending\"\n                        ? \"text-muted-foreground\"\n                        : \"text-foreground\",\n                      titleClassName,\n                    )}\n                  >\n                    {item.title}\n                  </h4>\n                  {item.time && (\n                    <span\n                      className={cn(\n                        \"text-xs text-muted-foreground\",\n                        timeClassName,\n                      )}\n                    >\n                      {item.time}\n                    </span>\n                  )}\n                </div>\n                {item.description && (\n                  <p\n                    className={cn(\n                      \"mt-1 text-xs leading-relaxed text-muted-foreground\",\n                      descriptionClassName,\n                    )}\n                  >\n                    {item.description}\n                  </p>\n                )}\n              </div>\n            </li>\n          );\n        })}\n      </ol>\n    );\n  },\n);\n\nTimeline.displayName = \"Timeline\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface BreadcrumbItem {\n  label: React.ReactNode;\n  href?: string;\n  icon?: React.ReactNode;\n  /** SPA navigation hook — called instead of full page loads when provided. */\n  onClick?: (e: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => void;\n}\n\nexport interface BreadcrumbProps\n  extends Omit<React.HTMLAttributes<HTMLElement>, \"children\"> {\n  items: BreadcrumbItem[];\n  separator?: React.ReactNode;\n  /** Collapse the middle into an ellipsis when there are more items than this. */\n  maxItems?: number;\n  size?: \"sm\" | \"md\";\n\n  /** 🔥 Full Customization */\n  listClassName?: string;\n  itemClassName?: string;\n  activeItemClassName?: string;\n  triggerClassName?: string;\n  iconClassName?: string;\n  labelClassName?: string;\n  separatorClassName?: string;\n  ellipsisClassName?: string;\n}\n\nconst SIZES = {\n  sm: { text: \"text-xs\", icon: \"[&_svg]:h-3 [&_svg]:w-3\", sep: \"h-3 w-3\" },\n  md: { text: \"text-sm\", icon: \"[&_svg]:h-3.5 [&_svg]:w-3.5\", sep: \"h-3.5 w-3.5\" },\n} as const;\n\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n  function Breadcrumb(\n    {\n      items,\n      separator,\n      maxItems,\n      size = \"md\",\n      className,\n      listClassName,\n      itemClassName,\n      activeItemClassName,\n      triggerClassName,\n      iconClassName,\n      labelClassName,\n      separatorClassName,\n      ellipsisClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const sizes = SIZES[size] ?? SIZES.md;\n\n    // Keep the first item and the trailing (maxItems - 1); an ellipsis marks\n    // the collapsed middle.\n    let visible: (BreadcrumbItem | \"ellipsis\")[] = items;\n    if (maxItems && maxItems >= 2 && items.length > maxItems) {\n      visible = [\n        items[0],\n        \"ellipsis\",\n        ...items.slice(items.length - (maxItems - 1)),\n      ];\n    }\n\n    return (\n      <nav\n        ref={ref}\n        aria-label=\"Breadcrumb\"\n        className={cn(\"min-w-0\", className)}\n        {...rest}\n      >\n        <ol\n          className={cn(\n            \"flex flex-wrap items-center gap-1.5\",\n            sizes.text,\n            listClassName,\n          )}\n        >\n          {visible.map((item, i) => {\n            if (item === \"ellipsis\") {\n              return (\n                <li\n                  key=\"ellipsis\"\n                  className={cn(\n                    \"flex items-center gap-1.5 text-muted-foreground\",\n                    ellipsisClassName,\n                  )}\n                >\n                  <MoreHorizontal\n                    aria-hidden=\"true\"\n                    className={sizes.sep}\n                  />\n                  <ChevronRight aria-hidden=\"true\" className={cn(sizes.sep, \"opacity-60\")} />\n                </li>\n              );\n            }\n\n            const isLast = i === visible.length - 1;\n            const content = (\n              <>\n                {item.icon && (\n                  <span\n                    aria-hidden=\"true\"\n                    className={cn(\"shrink-0\", sizes.icon, iconClassName)}\n                  >\n                    {item.icon}\n                  </span>\n                )}\n                <span className={cn(\"truncate\", labelClassName)}>\n                  {item.label}\n                </span>\n              </>\n            );\n\n            return (\n              <li\n                key={`${i}-${typeof item.label === \"string\" ? item.label : \"item\"}`}\n                className={cn(\"flex min-w-0 items-center gap-1.5\", itemClassName)}\n              >\n                {isLast ? (\n                  <span\n                    aria-current=\"page\"\n                    className={cn(\n                      \"flex min-w-0 items-center gap-1.5 font-medium text-foreground\",\n                      activeItemClassName,\n                    )}\n                  >\n                    {content}\n                  </span>\n                ) : item.href ? (\n                  <a\n                    href={item.href}\n                    onClick={item.onClick}\n                    className={cn(\n                      \"flex min-w-0 items-center gap-1.5 rounded text-muted-foreground transition-colors\",\n                      \"hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                      triggerClassName,\n                    )}\n                  >\n                    {content}\n                  </a>\n                ) : (\n                  <button\n                    type=\"button\"\n                    onClick={item.onClick}\n                    className={cn(\n                      \"flex min-w-0 items-center gap-1.5 rounded text-muted-foreground transition-colors\",\n                      \"hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                      triggerClassName,\n                    )}\n                  >\n                    {content}\n                  </button>\n                )}\n\n                {!isLast && (\n                  <span\n                    aria-hidden=\"true\"\n                    className={cn(\n                      \"shrink-0 text-muted-foreground/60\",\n                      separatorClassName,\n                    )}\n                  >\n                    {separator ?? <ChevronRight className={sizes.sep} />}\n                  </span>\n                )}\n              </li>\n            );\n          })}\n        </ol>\n      </nav>\n    );\n  },\n);\n\nBreadcrumb.displayName = \"Breadcrumb\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface PaginationProps\n  extends Omit<React.HTMLAttributes<HTMLElement>, \"onChange\"> {\n  /** Current page, 1-based. */\n  page: number;\n  totalPages: number;\n  onPageChange?: (page: number) => void;\n  /** How many pages to show on each side of the current page. */\n  siblingCount?: number;\n  size?: \"sm\" | \"md\" | \"lg\";\n  disabled?: boolean;\n  prevButtonClassName?: string;\n  nextButtonClassName?: string;\n  /** Applied to every numbered page button, in addition to the active/inactive styling. */\n  pageButtonClassName?: string;\n  activePageButtonClassName?: string;\n  ellipsisClassName?: string;\n}\n\nconst SIZES = {\n  sm: \"h-7 min-w-7 px-1 text-xs [&_svg]:h-3.5 [&_svg]:w-3.5\",\n  md: \"h-9 min-w-9 px-1.5 text-sm [&_svg]:h-4 [&_svg]:w-4\",\n  lg: \"h-11 min-w-11 px-2 text-base [&_svg]:h-5 [&_svg]:w-5\",\n} as const;\n\n/** Builds the visible page list: 1 … siblings around current … last. */\nconst buildRange = (\n  page: number,\n  totalPages: number,\n  siblingCount: number,\n): (number | \"ellipsis-l\" | \"ellipsis-r\")[] => {\n  // Everything fits without ellipses.\n  const maxVisible = siblingCount * 2 + 5;\n  if (totalPages <= maxVisible) {\n    return Array.from({ length: totalPages }, (_, i) => i + 1);\n  }\n\n  const start = Math.max(page - siblingCount, 1);\n  const end = Math.min(page + siblingCount, totalPages);\n  const showLeftEllipsis = start > 2;\n  const showRightEllipsis = end < totalPages - 1;\n\n  const middle: number[] = [];\n  for (\n    let i = showLeftEllipsis ? start : 1;\n    i <= (showRightEllipsis ? end : totalPages);\n    i++\n  ) {\n    middle.push(i);\n  }\n\n  return [\n    ...(showLeftEllipsis ? [1, \"ellipsis-l\" as const] : []),\n    ...middle,\n    ...(showRightEllipsis ? [\"ellipsis-r\" as const, totalPages] : []),\n  ];\n};\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n  function Pagination(\n    {\n      page,\n      totalPages,\n      onPageChange,\n      siblingCount = 1,\n      size = \"md\",\n      disabled = false,\n      className,\n      prevButtonClassName,\n      nextButtonClassName,\n      pageButtonClassName,\n      activePageButtonClassName,\n      ellipsisClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    if (totalPages < 1) return null;\n\n    const clampedPage = Math.min(Math.max(page, 1), totalPages);\n    const items = buildRange(clampedPage, totalPages, Math.max(siblingCount, 0));\n    const sizeClasses = SIZES[size] ?? SIZES.md;\n\n    const go = (next: number) => {\n      if (disabled) return;\n      const target = Math.min(Math.max(next, 1), totalPages);\n      if (target !== clampedPage) onPageChange?.(target);\n    };\n\n    const baseButton = cn(\n      \"inline-flex items-center justify-center rounded-lg font-medium transition-colors\",\n      \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n      \"disabled:pointer-events-none disabled:opacity-40\",\n      sizeClasses,\n    );\n\n    return (\n      <nav\n        ref={ref}\n        aria-label=\"Pagination\"\n        // flex-wrap: long ranges fold to a second row on narrow screens\n        // instead of overflowing the container.\n        className={cn(\"flex flex-wrap items-center gap-1\", className)}\n        {...rest}\n      >\n        <button\n          type=\"button\"\n          aria-label=\"Previous page\"\n          disabled={disabled || clampedPage <= 1}\n          onClick={() => go(clampedPage - 1)}\n          className={cn(\n            baseButton,\n            \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n            prevButtonClassName,\n          )}\n        >\n          <ChevronLeft aria-hidden=\"true\" />\n        </button>\n\n        {items.map((item) =>\n          typeof item !== \"number\" ? (\n            <span\n              key={item}\n              aria-hidden=\"true\"\n              className={cn(\n                \"inline-flex items-center justify-center text-muted-foreground\",\n                sizeClasses,\n                ellipsisClassName,\n              )}\n            >\n              <MoreHorizontal />\n            </span>\n          ) : (\n            <button\n              key={item}\n              type=\"button\"\n              aria-label={`Page ${item}`}\n              aria-current={item === clampedPage ? \"page\" : undefined}\n              disabled={disabled}\n              onClick={() => go(item)}\n              className={cn(\n                baseButton,\n                \"tabular-nums\",\n                item === clampedPage\n                  ? \"bg-primary text-primary-foreground\"\n                  : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n                pageButtonClassName,\n                item === clampedPage && activePageButtonClassName,\n              )}\n            >\n              {item}\n            </button>\n          ),\n        )}\n\n        <button\n          type=\"button\"\n          aria-label=\"Next page\"\n          disabled={disabled || clampedPage >= totalPages}\n          onClick={() => go(clampedPage + 1)}\n          className={cn(\n            baseButton,\n            \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n            nextButtonClassName,\n          )}\n        >\n          <ChevronRight aria-hidden=\"true\" />\n        </button>\n      </nav>\n    );\n  },\n);\n\nPagination.displayName = \"Pagination\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface StepperStep {\n  label: React.ReactNode;\n  description?: React.ReactNode;\n  icon?: React.ReactNode;\n}\n\nexport interface StepperProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n  steps: StepperStep[];\n  /** Index of the current step (0-based). Steps before it render as done. */\n  activeStep: number;\n  /** Makes completed steps clickable for navigation. */\n  onStepClick?: (index: number) => void;\n  orientation?: \"horizontal\" | \"vertical\";\n  size?: \"sm\" | \"md\";\n\n  /** 🔥 Full Customization */\n  /** Wraps each individual step (indicator + content). */\n  itemClassName?: string;\n  /** The circular step indicator/dot. */\n  dotClassName?: string;\n  /** The `<button>` wrapping a clickable (completed) dot. */\n  dotButtonClassName?: string;\n  /** The connector line between steps. */\n  connectorClassName?: string;\n  /** Wraps a step's label + description. */\n  contentClassName?: string;\n  labelClassName?: string;\n  descriptionClassName?: string;\n}\n\nconst SIZES = {\n  sm: { dot: \"h-7 w-7 text-xs [&_svg]:h-3.5 [&_svg]:w-3.5\", label: \"text-xs\", desc: \"text-[11px]\" },\n  md: { dot: \"h-9 w-9 text-sm [&_svg]:h-4 [&_svg]:w-4\", label: \"text-sm\", desc: \"text-xs\" },\n} as const;\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n  function Stepper(\n    {\n      steps,\n      activeStep,\n      onStepClick,\n      orientation = \"horizontal\",\n      size = \"md\",\n      className,\n      itemClassName,\n      dotClassName,\n      dotButtonClassName,\n      connectorClassName,\n      contentClassName,\n      labelClassName,\n      descriptionClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const sizes = SIZES[size] ?? SIZES.md;\n    const vertical = orientation === \"vertical\";\n\n    const renderDot = (index: number, step: StepperStep) => {\n      const done = index < activeStep;\n      const active = index === activeStep;\n      const clickable = Boolean(onStepClick) && done;\n\n      const dot = (\n        <span\n          aria-hidden=\"true\"\n          className={cn(\n            \"flex shrink-0 items-center justify-center rounded-full border-2 font-semibold transition-colors\",\n            sizes.dot,\n            done && \"border-primary bg-primary text-primary-foreground\",\n            active && \"border-primary bg-primary/10 text-primary\",\n            !done && !active && \"border-border bg-transparent text-muted-foreground\",\n            dotClassName,\n          )}\n        >\n          {done ? <Check /> : step.icon ?? index + 1}\n        </span>\n      );\n\n      if (!clickable) return dot;\n      return (\n        <button\n          type=\"button\"\n          onClick={() => onStepClick?.(index)}\n          aria-label={\n            typeof step.label === \"string\" ? `Go to step: ${step.label}` : `Go to step ${index + 1}`\n          }\n          className={cn(\n            \"rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n            dotButtonClassName,\n          )}\n        >\n          {dot}\n        </button>\n      );\n    };\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          vertical ? \"flex flex-col\" : \"flex w-full items-start\",\n          className,\n        )}\n        {...rest}\n      >\n        {steps.map((step, i) => {\n          const done = i < activeStep;\n          const active = i === activeStep;\n          const isLast = i === steps.length - 1;\n\n          if (vertical) {\n            return (\n              <div key={i} className={cn(\"flex gap-3\", itemClassName)}>\n                <div className=\"flex flex-col items-center\">\n                  {renderDot(i, step)}\n                  {!isLast && (\n                    <span\n                      aria-hidden=\"true\"\n                      className={cn(\n                        \"my-1 w-0.5 flex-1 min-h-6 rounded-full\",\n                        done ? \"bg-primary\" : \"bg-border\",\n                        connectorClassName,\n                      )}\n                    />\n                  )}\n                </div>\n                <div\n                  className={cn(\n                    \"min-w-0 pb-6 pt-1\",\n                    isLast && \"pb-0\",\n                    contentClassName,\n                  )}\n                >\n                  <p\n                    aria-current={active ? \"step\" : undefined}\n                    className={cn(\n                      \"font-medium\",\n                      sizes.label,\n                      active || done ? \"text-foreground\" : \"text-muted-foreground\",\n                      labelClassName,\n                    )}\n                  >\n                    {step.label}\n                  </p>\n                  {step.description && (\n                    <p\n                      className={cn(\n                        \"mt-0.5 text-muted-foreground\",\n                        sizes.desc,\n                        descriptionClassName,\n                      )}\n                    >\n                      {step.description}\n                    </p>\n                  )}\n                </div>\n              </div>\n            );\n          }\n\n          return (\n            <React.Fragment key={i}>\n              <div\n                className={cn(\n                  \"flex min-w-0 flex-col items-center gap-2 text-center\",\n                  itemClassName,\n                )}\n              >\n                {renderDot(i, step)}\n                <div className={cn(\"min-w-0\", contentClassName)}>\n                  <p\n                    aria-current={active ? \"step\" : undefined}\n                    className={cn(\n                      \"font-medium\",\n                      sizes.label,\n                      active || done ? \"text-foreground\" : \"text-muted-foreground\",\n                      labelClassName,\n                    )}\n                  >\n                    {step.label}\n                  </p>\n                  {step.description && (\n                    <p\n                      className={cn(\n                        \"mt-0.5 text-muted-foreground\",\n                        sizes.desc,\n                        descriptionClassName,\n                      )}\n                    >\n                      {step.description}\n                    </p>\n                  )}\n                </div>\n              </div>\n\n              {!isLast && (\n                <span\n                  aria-hidden=\"true\"\n                  className={cn(\n                    \"mx-2 mt-4 h-0.5 flex-1 rounded-full\",\n                    size === \"sm\" && \"mt-3.5\",\n                    done ? \"bg-primary\" : \"bg-border\",\n                    connectorClassName,\n                  )}\n                />\n              )}\n            </React.Fragment>\n          );\n        })}\n      </div>\n    );\n  },\n);\n\nStepper.displayName = \"Stepper\";\n","\"use client\";\n\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TooltipProps {\n  /** Tooltip text/content. */\n  content: React.ReactNode;\n  children: React.ReactNode;\n  position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n  /** Delay before showing, in ms. */\n  delay?: number;\n  disabled?: boolean;\n  className?: string;\n  contentClassName?: string;\n  /** The small triangular pointer on the tooltip bubble. */\n  arrowClassName?: string;\n}\n\nconst POSITIONS = {\n  top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\n  bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\n  left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\n  right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\n} as const;\n\nconst ARROWS = {\n  top: \"top-full left-1/2 -translate-x-1/2 border-t-foreground border-x-transparent border-b-transparent\",\n  bottom: \"bottom-full left-1/2 -translate-x-1/2 border-b-foreground border-x-transparent border-t-transparent\",\n  left: \"left-full top-1/2 -translate-y-1/2 border-l-foreground border-y-transparent border-r-transparent\",\n  right: \"right-full top-1/2 -translate-y-1/2 border-r-foreground border-y-transparent border-l-transparent\",\n} as const;\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n  content,\n  children,\n  position = \"top\",\n  delay = 150,\n  disabled = false,\n  className,\n  contentClassName,\n  arrowClassName,\n}) => {\n  const tooltipId = useId();\n  const [visible, setVisible] = useState(false);\n  const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const show = () => {\n    if (disabled) return;\n    timer.current = setTimeout(() => setVisible(true), delay);\n  };\n\n  const hide = () => {\n    if (timer.current) clearTimeout(timer.current);\n    setVisible(false);\n  };\n\n  // Clear the pending show-timer on unmount, and let Escape dismiss an open\n  // tooltip (a WCAG 1.4.13 requirement).\n  useEffect(() => {\n    if (!visible) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") hide();\n    };\n    document.addEventListener(\"keydown\", onKey);\n    return () => document.removeEventListener(\"keydown\", onKey);\n  }, [visible]);\n\n  useEffect(\n    () => () => {\n      if (timer.current) clearTimeout(timer.current);\n    },\n    [],\n  );\n\n  return (\n    <span\n      className={cn(\"relative inline-flex\", className)}\n      onMouseEnter={show}\n      onMouseLeave={hide}\n      onFocus={show}\n      onBlur={hide}\n      aria-describedby={visible ? tooltipId : undefined}\n    >\n      {children}\n\n      {visible && !disabled && (\n        <span\n          id={tooltipId}\n          role=\"tooltip\"\n          className={cn(\n            \"pointer-events-none absolute z-50 w-max max-w-60 rounded-md px-2.5 py-1.5\",\n            // break-words: a long unbroken token (URL, hash) wraps instead of\n            // stretching the bubble past max-w.\n            \"bg-foreground text-background text-xs font-medium shadow-lg wrap-break-word\",\n            \"animate-in fade-in\",\n            POSITIONS[position] ?? POSITIONS.top,\n            contentClassName,\n          )}\n        >\n          {content}\n          <span\n            aria-hidden=\"true\"\n            className={cn(\n              \"absolute border-4\",\n              ARROWS[position] ?? ARROWS.top,\n              arrowClassName,\n            )}\n          />\n        </span>\n      )}\n    </span>\n  );\n};\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport React, {\n  forwardRef,\n  useEffect,\n  useId,\n  useRef,\n  useState,\n} from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface PopoverProps {\n  /** Element that toggles the popover. */\n  trigger: React.ReactNode;\n  children: React.ReactNode;\n  position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n  align?: \"start\" | \"center\" | \"end\";\n  open?: boolean;\n  defaultOpen?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  closeOnClickOutside?: boolean;\n  closeOnEscape?: boolean;\n  disabled?: boolean;\n  className?: string;\n  /** The wrapper around `trigger` that handles open/close interactions. */\n  triggerClassName?: string;\n  contentClassName?: string;\n  contentStyle?: React.CSSProperties;\n}\n\nconst POSITIONS = {\n  top: { start: \"bottom-full left-0 mb-2\", center: \"bottom-full left-1/2 -translate-x-1/2 mb-2\", end: \"bottom-full right-0 mb-2\" },\n  bottom: { start: \"top-full left-0 mt-2\", center: \"top-full left-1/2 -translate-x-1/2 mt-2\", end: \"top-full right-0 mt-2\" },\n  left: { start: \"right-full top-0 mr-2\", center: \"right-full top-1/2 -translate-y-1/2 mr-2\", end: \"right-full bottom-0 mr-2\" },\n  right: { start: \"left-full top-0 ml-2\", center: \"left-full top-1/2 -translate-y-1/2 ml-2\", end: \"left-full bottom-0 ml-2\" },\n} as const;\n\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(\n  function Popover(\n    {\n      trigger,\n      children,\n      position = \"bottom\",\n      align = \"center\",\n      open: controlledOpen,\n      defaultOpen = false,\n      onOpenChange,\n      closeOnClickOutside = true,\n      closeOnEscape = true,\n      disabled = false,\n      className,\n      triggerClassName,\n      contentClassName,\n      contentStyle,\n    },\n    ref,\n  ) {\n    const panelId = useId();\n    const rootRef = useRef<HTMLDivElement | null>(null);\n    const [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n    const isControlled = controlledOpen !== undefined;\n    const open = isControlled ? controlledOpen : internalOpen;\n\n    // Ref-routed setter so document listeners never hold a stale onOpenChange.\n    const setOpenRef = useRef((next: boolean) => {\n      if (!isControlled) setInternalOpen(next);\n      onOpenChange?.(next);\n    });\n    setOpenRef.current = (next: boolean) => {\n      if (!isControlled) setInternalOpen(next);\n      onOpenChange?.(next);\n    };\n\n    useEffect(() => {\n      if (!open) return;\n\n      const onMouseDown = (e: MouseEvent) => {\n        if (!closeOnClickOutside) return;\n        if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n          setOpenRef.current(false);\n        }\n      };\n      const onKeyDown = (e: KeyboardEvent) => {\n        if (closeOnEscape && e.key === \"Escape\") setOpenRef.current(false);\n      };\n\n      document.addEventListener(\"mousedown\", onMouseDown);\n      document.addEventListener(\"keydown\", onKeyDown);\n      return () => {\n        document.removeEventListener(\"mousedown\", onMouseDown);\n        document.removeEventListener(\"keydown\", onKeyDown);\n      };\n    }, [open, closeOnClickOutside, closeOnEscape]);\n\n    return (\n      <div\n        ref={(el) => {\n          rootRef.current = el;\n          if (typeof ref === \"function\") ref(el);\n          else if (ref) ref.current = el;\n        }}\n        className={cn(\"relative inline-flex\", className)}\n      >\n        <div\n          role=\"button\"\n          tabIndex={disabled ? -1 : 0}\n          aria-haspopup=\"dialog\"\n          aria-expanded={open}\n          aria-controls={open ? panelId : undefined}\n          onClick={() => !disabled && setOpenRef.current(!open)}\n          onKeyDown={(e) => {\n            if (disabled) return;\n            if (e.key === \"Enter\" || e.key === \" \") {\n              e.preventDefault();\n              setOpenRef.current(!open);\n            }\n          }}\n          className={cn(\n            \"inline-flex rounded-lg\",\n            disabled && \"cursor-not-allowed opacity-50\",\n            triggerClassName,\n          )}\n        >\n          {trigger}\n        </div>\n\n        {open && (\n          <div\n            id={panelId}\n            role=\"dialog\"\n            className={cn(\n              \"absolute z-50 min-w-48 rounded-xl border border-border bg-popover p-4\",\n              \"text-sm text-popover-foreground shadow-xl\",\n              \"animate-in fade-in\",\n              POSITIONS[position]?.[align] ?? POSITIONS.bottom.center,\n              contentClassName,\n            )}\n            style={contentStyle}\n          >\n            {children}\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n\nPopover.displayName = \"Popover\";\n","\"use client\";\n\nimport React, { forwardRef, useId, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface SliderProps\n  extends Omit<\n    React.InputHTMLAttributes<HTMLInputElement>,\n    \"value\" | \"defaultValue\" | \"onChange\" | \"size\" | \"type\"\n  > {\n  value?: number;\n  defaultValue?: number;\n  onChange?: (value: number) => void;\n  min?: number;\n  max?: number;\n  step?: number;\n  label?: string;\n  /** Show the current value at the right edge of the label row. */\n  showValue?: boolean;\n  /** Format the displayed value (e.g. v => `${v}%`). */\n  formatValue?: (value: number) => React.ReactNode;\n  /** Tick labels rendered under the track. */\n  marks?: { value: number; label?: React.ReactNode }[];\n  size?: \"sm\" | \"md\" | \"lg\";\n  wrapperClassName?: string;\n  /** Row wrapping the label and the current-value text. */\n  labelRowClassName?: string;\n  labelClassName?: string;\n  valueClassName?: string;\n  /** Wrapper around the tick marks rendered under the track. */\n  marksClassName?: string;\n  /** Applied to each individual tick mark. */\n  markClassName?: string;\n}\n\nconst TRACK = {\n  sm: \"h-1 [&::-webkit-slider-thumb]:h-3.5 [&::-webkit-slider-thumb]:w-3.5 [&::-moz-range-thumb]:h-3.5 [&::-moz-range-thumb]:w-3.5\",\n  md: \"h-1.5 [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:w-4\",\n  lg: \"h-2 [&::-webkit-slider-thumb]:h-5 [&::-webkit-slider-thumb]:w-5 [&::-moz-range-thumb]:h-5 [&::-moz-range-thumb]:w-5\",\n} as const;\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\n  function Slider(\n    {\n      value,\n      defaultValue,\n      onChange,\n      min = 0,\n      max = 100,\n      step = 1,\n      label,\n      showValue = false,\n      formatValue,\n      marks,\n      size = \"md\",\n      disabled,\n      id,\n      className,\n      wrapperClassName,\n      labelRowClassName,\n      labelClassName,\n      valueClassName,\n      marksClassName,\n      markClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const generatedId = useId();\n    const sliderId = id ?? generatedId;\n\n    const [internal, setInternal] = useState(defaultValue ?? min);\n    const current = value !== undefined ? value : internal;\n    const percent = max === min ? 0 : ((current - min) / (max - min)) * 100;\n\n    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n      const next = Number(e.target.value);\n      if (value === undefined) setInternal(next);\n      onChange?.(next);\n    };\n\n    return (\n      <div className={cn(\"w-full\", wrapperClassName)}>\n        {(label || showValue) && (\n          <div\n            className={cn(\n              \"mb-2 flex items-baseline justify-between gap-2\",\n              labelRowClassName,\n            )}\n          >\n            {label && (\n              <label\n                htmlFor={sliderId}\n                className={cn(\n                  \"text-[13px] font-medium leading-none text-foreground\",\n                  labelClassName,\n                )}\n              >\n                {label}\n              </label>\n            )}\n            {showValue && (\n              <span\n                className={cn(\n                  \"text-xs font-medium tabular-nums text-muted-foreground\",\n                  valueClassName,\n                )}\n              >\n                {formatValue ? formatValue(current) : current}\n              </span>\n            )}\n          </div>\n        )}\n\n        <input\n          ref={ref}\n          id={sliderId}\n          type=\"range\"\n          min={min}\n          max={max}\n          step={step}\n          value={current}\n          onChange={handleChange}\n          disabled={disabled}\n          // The filled part of the track is painted with a two-stop gradient;\n          // native range tracks can't otherwise show progress cross-browser.\n          style={{\n            background: `linear-gradient(to right, var(--primary) ${percent}%, var(--muted) ${percent}%)`,\n          }}\n          className={cn(\n            \"w-full cursor-pointer appearance-none rounded-full outline-none transition-opacity\",\n            TRACK[size] ?? TRACK.md,\n            // Thumb (WebKit + Firefox)\n            \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full\",\n            \"[&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-primary\",\n            \"[&::-webkit-slider-thumb]:bg-background [&::-webkit-slider-thumb]:shadow\",\n            \"[&::-webkit-slider-thumb]:transition-transform [&::-webkit-slider-thumb]:hover:scale-110\",\n            \"[&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full\",\n            \"[&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-primary\",\n            \"[&::-moz-range-thumb]:bg-background [&::-moz-range-thumb]:shadow\",\n            \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n            disabled && \"cursor-not-allowed opacity-50\",\n            className,\n          )}\n          {...rest}\n        />\n\n        {marks && marks.length > 0 && (\n          <div\n            className={cn(\n              \"relative mt-1.5 h-4 text-[10px] text-muted-foreground\",\n              marksClassName,\n            )}\n          >\n            {marks.map((mark) => {\n              const markPercent =\n                max === min ? 0 : ((mark.value - min) / (max - min)) * 100;\n              return (\n                <span\n                  key={mark.value}\n                  className={cn(\n                    \"absolute whitespace-nowrap\",\n                    // Edge marks align inward so they aren't half-clipped\n                    // outside the track.\n                    markPercent <= 0\n                      ? \"translate-x-0\"\n                      : markPercent >= 100\n                        ? \"-translate-x-full\"\n                        : \"-translate-x-1/2\",\n                    markClassName,\n                  )}\n                  style={{ left: `${markPercent}%` }}\n                >\n                  {mark.label ?? mark.value}\n                </span>\n              );\n            })}\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n\nSlider.displayName = \"Slider\";\n","\"use client\";\n\nimport React, { forwardRef, useId, useState } from \"react\";\nimport { Minus, Plus } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface NumberInputProps\n  extends Omit<\n    React.InputHTMLAttributes<HTMLInputElement>,\n    \"value\" | \"defaultValue\" | \"onChange\" | \"size\" | \"type\"\n  > {\n  value?: number | null;\n  defaultValue?: number;\n  /** Fired with the parsed number, or null when the field is empty. */\n  onChange?: (value: number | null) => void;\n  min?: number;\n  max?: number;\n  step?: number;\n  label?: string;\n  error?: string;\n  helperText?: string;\n  size?: \"sm\" | \"md\" | \"lg\";\n  wrapperClassName?: string;\n  labelClassName?: string;\n  /** The bordered control wrapping the decrement button, input, and increment button. */\n  inputWrapperClassName?: string;\n  decrementButtonClassName?: string;\n  incrementButtonClassName?: string;\n  helperTextClassName?: string;\n}\n\nconst SIZES = {\n  sm: { input: \"h-8 text-xs\", button: \"w-8 [&_svg]:h-3 [&_svg]:w-3\" },\n  md: { input: \"h-10 text-sm\", button: \"w-10 [&_svg]:h-3.5 [&_svg]:w-3.5\" },\n  lg: { input: \"h-12 text-base\", button: \"w-12 [&_svg]:h-4 [&_svg]:w-4\" },\n} as const;\n\nconst clamp = (n: number, min?: number, max?: number) => {\n  if (min !== undefined && n < min) return min;\n  if (max !== undefined && n > max) return max;\n  return n;\n};\n\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\n  function NumberInput(\n    {\n      value,\n      defaultValue,\n      onChange,\n      min,\n      max,\n      step = 1,\n      label,\n      error,\n      helperText,\n      size = \"md\",\n      disabled,\n      id,\n      className,\n      wrapperClassName,\n      labelClassName,\n      inputWrapperClassName,\n      decrementButtonClassName,\n      incrementButtonClassName,\n      helperTextClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const generatedId = useId();\n    const fieldId = id ?? generatedId;\n    const describedBy = helperText || error ? `${fieldId}-description` : undefined;\n    const sizes = SIZES[size] ?? SIZES.md;\n\n    // The raw string is kept so intermediate states (\"-\", \"1.\", \"\") don't get\n    // eaten while typing; the parsed number is what consumers receive.\n    const [raw, setRaw] = useState(\n      defaultValue !== undefined ? String(defaultValue) : \"\",\n    );\n    const isControlled = value !== undefined;\n    const displayed = isControlled ? (value === null ? \"\" : String(value)) : raw;\n    const parsed = displayed === \"\" ? null : Number(displayed);\n\n    const commit = (next: number | null) => {\n      if (!isControlled) setRaw(next === null ? \"\" : String(next));\n      onChange?.(next);\n    };\n\n    const nudge = (direction: 1 | -1) => {\n      const base = parsed !== null && !Number.isNaN(parsed) ? parsed : min ?? 0;\n      commit(clamp(base + direction * step, min, max));\n    };\n\n    const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n      const text = e.target.value;\n      if (!/^-?\\d*\\.?\\d*$/.test(text)) return;\n      if (!isControlled) setRaw(text);\n      const n = text === \"\" || text === \"-\" ? null : Number(text);\n      onChange?.(n !== null && Number.isNaN(n) ? null : n);\n    };\n\n    const handleBlur = () => {\n      if (parsed === null || Number.isNaN(parsed)) return;\n      const clamped = clamp(parsed, min, max);\n      if (clamped !== parsed) commit(clamped);\n    };\n\n    const stepperButton =\n      \"flex shrink-0 items-center justify-center text-muted-foreground transition-colors \" +\n      \"hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-40 \" +\n      \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\";\n\n    return (\n      <div className={cn(\"w-full\", wrapperClassName)}>\n        {label && (\n          <label\n            htmlFor={fieldId}\n            className={cn(\n              \"mb-1.5 block text-[13px] font-medium leading-none text-foreground\",\n              labelClassName,\n            )}\n          >\n            {label}\n          </label>\n        )}\n\n        <div\n          className={cn(\n            \"flex w-full items-stretch overflow-hidden rounded-lg border bg-transparent transition-colors\",\n            \"dark:bg-input/30\",\n            error ? \"border-destructive\" : \"border-input\",\n            \"focus-within:ring-2 focus-within:ring-ring/40 focus-within:border-ring\",\n            disabled && \"opacity-50\",\n            inputWrapperClassName,\n          )}\n        >\n          <button\n            type=\"button\"\n            tabIndex={-1}\n            aria-label=\"Decrease value\"\n            disabled={disabled || (parsed !== null && min !== undefined && parsed <= min)}\n            onClick={() => nudge(-1)}\n            className={cn(stepperButton, sizes.button, \"border-r border-input\", decrementButtonClassName)}\n          >\n            <Minus aria-hidden=\"true\" />\n          </button>\n\n          <input\n            ref={ref}\n            id={fieldId}\n            type=\"text\"\n            inputMode=\"decimal\"\n            role=\"spinbutton\"\n            aria-valuenow={parsed ?? undefined}\n            aria-valuemin={min}\n            aria-valuemax={max}\n            aria-invalid={error ? true : undefined}\n            aria-describedby={describedBy}\n            value={displayed}\n            onChange={handleInput}\n            onBlur={handleBlur}\n            onKeyDown={(e) => {\n              if (e.key === \"ArrowUp\") {\n                e.preventDefault();\n                nudge(1);\n              } else if (e.key === \"ArrowDown\") {\n                e.preventDefault();\n                nudge(-1);\n              }\n            }}\n            disabled={disabled}\n            className={cn(\n              \"w-full min-w-0 flex-1 bg-transparent text-center text-foreground outline-none\",\n              \"placeholder:text-muted-foreground disabled:cursor-not-allowed\",\n              sizes.input,\n              className,\n            )}\n            {...rest}\n          />\n\n          <button\n            type=\"button\"\n            tabIndex={-1}\n            aria-label=\"Increase value\"\n            disabled={disabled || (parsed !== null && max !== undefined && parsed >= max)}\n            onClick={() => nudge(1)}\n            className={cn(stepperButton, sizes.button, \"border-l border-input\", incrementButtonClassName)}\n          >\n            <Plus aria-hidden=\"true\" />\n          </button>\n        </div>\n\n        {(helperText || error) && (\n          <p\n            id={describedBy}\n            role={error ? \"alert\" : undefined}\n            className={cn(\n              \"mt-1.5 text-xs font-medium\",\n              error ? \"text-destructive\" : \"text-muted-foreground\",\n              helperTextClassName,\n            )}\n          >\n            {error || helperText}\n          </p>\n        )}\n      </div>\n    );\n  },\n);\n\nNumberInput.displayName = \"NumberInput\";\n","\"use client\";\n\nimport React, { forwardRef, useId, useState } from \"react\";\nimport { Star } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface RatingProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n  /** Current rating. Supports fractions when readOnly (e.g. 4.3). */\n  value?: number;\n  defaultValue?: number;\n  onChange?: (value: number) => void;\n  /** Number of stars. */\n  max?: number;\n  size?: \"sm\" | \"md\" | \"lg\";\n  readOnly?: boolean;\n  disabled?: boolean;\n  /** Clicking the current value again resets the rating to 0. */\n  allowClear?: boolean;\n  label?: string;\n  /** Show the numeric value next to the stars. */\n  showValue?: boolean;\n  /** Color class of filled stars; defaults to the theme's warning (amber). */\n  colorClassName?: string;\n  /** Applied to every star icon, in addition to size/color/state classes. */\n  starClassName?: string;\n  /** The unfilled star color/class. */\n  emptyStarClassName?: string;\n  /** The clickable wrapper around each star, in interactive mode. */\n  starWrapperClassName?: string;\n  /** The numeric value shown when `showValue` is set. */\n  valueClassName?: string;\n}\n\nconst SIZES = { sm: \"h-4 w-4\", md: \"h-5 w-5\", lg: \"h-6 w-6\" } as const;\n\nexport const Rating = forwardRef<HTMLDivElement, RatingProps>(function Rating(\n  {\n    value,\n    defaultValue = 0,\n    onChange,\n    max = 5,\n    size = \"md\",\n    readOnly = false,\n    disabled = false,\n    allowClear = true,\n    label = \"Rating\",\n    showValue = false,\n    colorClassName = \"text-warning\",\n    starClassName,\n    emptyStarClassName,\n    starWrapperClassName,\n    valueClassName,\n    className,\n    ...rest\n  },\n  ref,\n) {\n  const groupName = useId();\n  const [internal, setInternal] = useState(defaultValue);\n  const [hovered, setHovered] = useState<number | null>(null);\n\n  const current = value !== undefined ? value : internal;\n  const active = hovered ?? current;\n  const starSize = SIZES[size] ?? SIZES.md;\n\n  const select = (next: number) => {\n    if (readOnly || disabled) return;\n    const resolved = allowClear && next === current ? 0 : next;\n    if (value === undefined) setInternal(resolved);\n    onChange?.(resolved);\n  };\n\n  /* Read-only display supports fractional values via a clipped overlay. */\n  if (readOnly) {\n    const percent = Math.min(Math.max(current / max, 0), 1) * 100;\n    return (\n      <div\n        ref={ref}\n        role=\"img\"\n        aria-label={`${label}: ${current} out of ${max}`}\n        className={cn(\"inline-flex items-center gap-2\", className)}\n        {...rest}\n      >\n        <span className=\"relative inline-flex\" aria-hidden=\"true\">\n          <span className={cn(\"flex gap-0.5 text-muted-foreground/40\", emptyStarClassName)}>\n            {Array.from({ length: max }, (_, i) => (\n              <Star key={i} className={cn(starSize, starClassName)} fill=\"currentColor\" strokeWidth={0} />\n            ))}\n          </span>\n          <span\n            className={cn(\"absolute inset-0 flex gap-0.5 overflow-hidden\", colorClassName)}\n            style={{ width: `${percent}%` }}\n          >\n            {Array.from({ length: max }, (_, i) => (\n              <Star\n                key={i}\n                className={cn(starSize, \"shrink-0\", starClassName)}\n                fill=\"currentColor\"\n                strokeWidth={0}\n              />\n            ))}\n          </span>\n        </span>\n        {showValue && (\n          <span className={cn(\"text-sm font-medium tabular-nums text-foreground\", valueClassName)}>\n            {current}\n          </span>\n        )}\n      </div>\n    );\n  }\n\n  return (\n    <div\n      ref={ref}\n      role=\"radiogroup\"\n      aria-label={label}\n      onMouseLeave={() => setHovered(null)}\n      className={cn(\n        \"inline-flex items-center gap-2\",\n        disabled && \"opacity-50\",\n        className,\n      )}\n      {...rest}\n    >\n      <span className=\"flex gap-0.5\">\n        {Array.from({ length: max }, (_, i) => {\n          const starValue = i + 1;\n          const filled = starValue <= active;\n          return (\n            <label\n              key={starValue}\n              onMouseEnter={() => !disabled && setHovered(starValue)}\n              className={cn(!disabled && \"cursor-pointer\", starWrapperClassName)}\n            >\n              <input\n                type=\"radio\"\n                name={groupName}\n                value={starValue}\n                checked={current === starValue}\n                onChange={() => select(starValue)}\n                disabled={disabled}\n                className=\"sr-only peer\"\n                aria-label={`${starValue} of ${max}`}\n              />\n              <Star\n                aria-hidden=\"true\"\n                className={cn(\n                  starSize,\n                  \"transition-colors\",\n                  filled ? colorClassName : cn(\"text-muted-foreground/40\", emptyStarClassName),\n                  \"peer-focus-visible:rounded peer-focus-visible:ring-2 peer-focus-visible:ring-ring\",\n                  starClassName,\n                )}\n                fill={filled ? \"currentColor\" : \"none\"}\n                strokeWidth={filled ? 0 : 1.5}\n              />\n            </label>\n          );\n        })}\n      </span>\n      {showValue && (\n        <span className={cn(\"text-sm font-medium tabular-nums text-foreground\", valueClassName)}>\n          {current}\n        </span>\n      )}\n    </div>\n  );\n});\n\nRating.displayName = \"Rating\";\n","\"use client\";\n\nimport React, { forwardRef, useId, useRef, useState } from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface TagInputProps {\n  value?: string[];\n  defaultValue?: string[];\n  onChange?: (tags: string[]) => void;\n  label?: string;\n  placeholder?: string;\n  /** Maximum number of tags; further entries are ignored. */\n  maxTags?: number;\n  /** Return false to reject a tag before it is added. */\n  validate?: (tag: string) => boolean;\n  /** Also commit the pending text when the field loses focus. */\n  addOnBlur?: boolean;\n  error?: string;\n  helperText?: string;\n  size?: \"sm\" | \"md\" | \"lg\";\n  disabled?: boolean;\n  id?: string;\n  className?: string;\n  wrapperClassName?: string;\n  /** Field label. */\n  labelClassName?: string;\n  /** Tag chip wrapper. */\n  chipClassName?: string;\n  /** Remove (\"x\") button inside a chip. */\n  chipRemoveClassName?: string;\n  /** The text input itself. */\n  inputClassName?: string;\n  /** Helper text / error message. */\n  helperClassName?: string;\n  /** Tag count indicator (e.g. \"2/5\"). */\n  countClassName?: string;\n}\n\nconst SIZES = {\n  sm: { root: \"min-h-8 px-2 py-1 gap-1\", chip: \"h-5 px-1.5 text-[11px]\", input: \"text-xs h-5\" },\n  md: { root: \"min-h-10 px-2.5 py-1.5 gap-1.5\", chip: \"h-6 px-2 text-xs\", input: \"text-sm h-6\" },\n  lg: { root: \"min-h-12 px-3 py-2 gap-2\", chip: \"h-7 px-2.5 text-sm\", input: \"text-base h-7\" },\n} as const;\n\nexport const TagInput = forwardRef<HTMLInputElement, TagInputProps>(\n  function TagInput(\n    {\n      value,\n      defaultValue = [],\n      onChange,\n      label,\n      placeholder = \"Add a tag…\",\n      maxTags,\n      validate,\n      addOnBlur = true,\n      error,\n      helperText,\n      size = \"md\",\n      disabled = false,\n      id,\n      className,\n      wrapperClassName,\n      labelClassName,\n      chipClassName,\n      chipRemoveClassName,\n      inputClassName,\n      helperClassName,\n      countClassName,\n    },\n    ref,\n  ) {\n    const generatedId = useId();\n    const fieldId = id ?? generatedId;\n    const describedBy = helperText || error ? `${fieldId}-description` : undefined;\n    const sizes = SIZES[size] ?? SIZES.md;\n\n    const inputRef = useRef<HTMLInputElement | null>(null);\n    const [internal, setInternal] = useState<string[]>(defaultValue);\n    const [draft, setDraft] = useState(\"\");\n\n    const tags = value !== undefined ? value : internal;\n    const atLimit = maxTags !== undefined && tags.length >= maxTags;\n\n    const commit = (next: string[]) => {\n      if (value === undefined) setInternal(next);\n      onChange?.(next);\n    };\n\n    const addTag = (text: string) => {\n      const tag = text.trim();\n      if (!tag || disabled || atLimit) return;\n      if (tags.includes(tag)) {\n        setDraft(\"\");\n        return;\n      }\n      if (validate && !validate(tag)) return;\n      commit([...tags, tag]);\n      setDraft(\"\");\n    };\n\n    const removeTag = (index: number) => {\n      if (disabled) return;\n      commit(tags.filter((_, i) => i !== index));\n    };\n\n    const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n      if (e.key === \"Enter\" || e.key === \",\") {\n        e.preventDefault();\n        addTag(draft);\n      } else if (e.key === \"Backspace\" && draft === \"\" && tags.length > 0) {\n        removeTag(tags.length - 1);\n      }\n    };\n\n    return (\n      <div className={cn(\"w-full\", wrapperClassName)}>\n        {label && (\n          <label\n            htmlFor={fieldId}\n            className={cn(\n              \"mb-1.5 block text-[13px] font-medium leading-none text-foreground\",\n              labelClassName,\n            )}\n          >\n            {label}\n          </label>\n        )}\n\n        <div\n          onClick={() => inputRef.current?.focus()}\n          className={cn(\n            \"flex w-full cursor-text flex-wrap items-center rounded-lg border bg-transparent transition-colors\",\n            \"dark:bg-input/30\",\n            error ? \"border-destructive\" : \"border-input\",\n            \"focus-within:ring-2 focus-within:ring-ring/40 focus-within:border-ring\",\n            disabled && \"cursor-not-allowed opacity-50\",\n            sizes.root,\n            className,\n          )}\n        >\n          {tags.map((tag, i) => (\n            <span\n              key={`${tag}-${i}`}\n              className={cn(\n                \"inline-flex items-center gap-1 rounded-full bg-primary/10 font-medium text-primary\",\n                sizes.chip,\n                chipClassName,\n              )}\n            >\n              <span className=\"max-w-40 truncate\">{tag}</span>\n              <button\n                type=\"button\"\n                aria-label={`Remove ${tag}`}\n                disabled={disabled}\n                onClick={(e) => {\n                  e.stopPropagation();\n                  removeTag(i);\n                }}\n                className={cn(\n                  \"rounded-full opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                  chipRemoveClassName,\n                )}\n              >\n                <X aria-hidden=\"true\" className=\"h-3 w-3\" />\n              </button>\n            </span>\n          ))}\n\n          <input\n            ref={(el) => {\n              inputRef.current = el;\n              if (typeof ref === \"function\") ref(el);\n              else if (ref) ref.current = el;\n            }}\n            id={fieldId}\n            type=\"text\"\n            value={draft}\n            onChange={(e) => setDraft(e.target.value)}\n            onKeyDown={handleKeyDown}\n            onBlur={() => addOnBlur && addTag(draft)}\n            placeholder={atLimit ? \"\" : placeholder}\n            disabled={disabled || atLimit}\n            aria-invalid={error ? true : undefined}\n            aria-describedby={describedBy}\n            className={cn(\n              \"min-w-20 flex-1 bg-transparent text-foreground outline-none\",\n              \"placeholder:text-muted-foreground disabled:cursor-not-allowed\",\n              sizes.input,\n              inputClassName,\n            )}\n          />\n        </div>\n\n        {(helperText || error || maxTags !== undefined) && (\n          <div className=\"mt-1.5 flex items-baseline justify-between gap-2\">\n            <p\n              id={describedBy}\n              role={error ? \"alert\" : undefined}\n              className={cn(\n                \"text-xs font-medium\",\n                error ? \"text-destructive\" : \"text-muted-foreground\",\n                helperClassName,\n              )}\n            >\n              {error || helperText}\n            </p>\n            {maxTags !== undefined && (\n              <span\n                className={cn(\n                  \"shrink-0 text-[11px] tabular-nums text-muted-foreground\",\n                  countClassName,\n                )}\n              >\n                {tags.length}/{maxTags}\n              </span>\n            )}\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n\nTagInput.displayName = \"TagInput\";\n","\"use client\";\n\nimport React, { forwardRef, useId, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface PinInputProps {\n  /** Number of character boxes. */\n  length?: number;\n  value?: string;\n  defaultValue?: string;\n  onChange?: (value: string) => void;\n  /** Fired once every box is filled. */\n  onComplete?: (value: string) => void;\n  /** Restrict accepted characters. */\n  type?: \"numeric\" | \"alphanumeric\";\n  /** Render dots instead of the typed characters. */\n  mask?: boolean;\n  size?: \"sm\" | \"md\" | \"lg\";\n  disabled?: boolean;\n  error?: boolean;\n  autoFocus?: boolean;\n  label?: string;\n  id?: string;\n  className?: string;\n  /** Applied to each individual character box, in addition to the size/state styling. */\n  boxClassName?: string;\n}\n\nconst SIZES = {\n  sm: \"h-9 w-9 text-sm rounded-md\",\n  md: \"h-11 w-11 text-base rounded-lg\",\n  // h-12 keeps lg on the same height scale as the other form controls\n  // (and six lg boxes still fit a 360px viewport).\n  lg: \"h-12 w-12 text-lg rounded-lg\",\n} as const;\n\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(\n  function PinInput(\n    {\n      length = 4,\n      value,\n      defaultValue = \"\",\n      onChange,\n      onComplete,\n      type = \"numeric\",\n      mask = false,\n      size = \"md\",\n      disabled = false,\n      error = false,\n      autoFocus = false,\n      label = \"PIN input\",\n      id,\n      className,\n      boxClassName,\n    },\n    ref,\n  ) {\n    const generatedId = useId();\n    const groupId = id ?? generatedId;\n    const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n    const [internal, setInternal] = useState(defaultValue.slice(0, length));\n\n    const current = (value !== undefined ? value : internal).slice(0, length);\n    const chars = Array.from({ length }, (_, i) => current[i] ?? \"\");\n\n    const allowed = type === \"numeric\" ? /^[0-9]$/ : /^[a-zA-Z0-9]$/;\n\n    const commit = (next: string) => {\n      if (value === undefined) setInternal(next);\n      onChange?.(next);\n      if (next.length === length) onComplete?.(next);\n    };\n\n    const setChar = (index: number, char: string) => {\n      const next = chars.slice();\n      next[index] = char;\n      commit(next.join(\"\").slice(0, length));\n    };\n\n    const focusBox = (index: number) => {\n      inputsRef.current[Math.min(Math.max(index, 0), length - 1)]?.focus();\n    };\n\n    const handleChange = (\n      index: number,\n      e: React.ChangeEvent<HTMLInputElement>,\n    ) => {\n      // Take the last typed character so overwriting a filled box works.\n      const char = e.target.value.slice(-1);\n      if (char === \"\") {\n        setChar(index, \"\");\n        return;\n      }\n      if (!allowed.test(char)) return;\n      setChar(index, char);\n      focusBox(index + 1);\n    };\n\n    const handleKeyDown = (\n      index: number,\n      e: React.KeyboardEvent<HTMLInputElement>,\n    ) => {\n      if (e.key === \"Backspace\") {\n        if (chars[index]) {\n          setChar(index, \"\");\n        } else {\n          focusBox(index - 1);\n          setChar(index - 1, \"\");\n        }\n        e.preventDefault();\n      } else if (e.key === \"ArrowLeft\") {\n        e.preventDefault();\n        focusBox(index - 1);\n      } else if (e.key === \"ArrowRight\") {\n        e.preventDefault();\n        focusBox(index + 1);\n      }\n    };\n\n    const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n      e.preventDefault();\n      const text = e.clipboardData\n        .getData(\"text\")\n        .split(\"\")\n        .filter((c) => allowed.test(c))\n        .slice(0, length)\n        .join(\"\");\n      if (!text) return;\n      commit(text);\n      focusBox(text.length - 1);\n    };\n\n    return (\n      <div\n        ref={ref}\n        role=\"group\"\n        aria-label={label}\n        className={cn(\"inline-flex items-center gap-2\", className)}\n      >\n        {chars.map((char, i) => (\n          <input\n            key={i}\n            ref={(el) => {\n              inputsRef.current[i] = el;\n            }}\n            id={i === 0 ? groupId : undefined}\n            type={mask ? \"password\" : \"text\"}\n            inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n            autoComplete={i === 0 ? \"one-time-code\" : \"off\"}\n            aria-label={`Character ${i + 1} of ${length}`}\n            value={char}\n            onChange={(e) => handleChange(i, e)}\n            onKeyDown={(e) => handleKeyDown(i, e)}\n            onPaste={handlePaste}\n            onFocus={(e) => e.target.select()}\n            disabled={disabled}\n            autoFocus={autoFocus && i === 0}\n            className={cn(\n              \"border bg-transparent text-center font-semibold text-foreground outline-none transition-colors\",\n              \"dark:bg-input/30 caret-primary\",\n              SIZES[size] ?? SIZES.md,\n              error ? \"border-destructive\" : \"border-input\",\n              \"focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:border-ring\",\n              disabled && \"cursor-not-allowed opacity-50\",\n              boxClassName,\n            )}\n          />\n        ))}\n      </div>\n    );\n  },\n);\n\nPinInput.displayName = \"PinInput\";\n","\"use client\";\n\nimport React, { forwardRef, useId, useRef, useState } from \"react\";\nimport { UploadCloud, File as FileIcon, X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface FileUploadProps {\n  /** Fired with the full current file list on every change. */\n  onFilesChange?: (files: File[]) => void;\n  /** Fired for each rejected file with the reason. */\n  onError?: (message: string, file: File) => void;\n  multiple?: boolean;\n  /** Native accept string, e.g. \"image/*,.pdf\". */\n  accept?: string;\n  maxSizeMB?: number;\n  maxFiles?: number;\n  label?: string;\n  description?: string;\n  disabled?: boolean;\n  /** Hide the built-in selected-files list. */\n  hideFileList?: boolean;\n  id?: string;\n  className?: string;\n\n  dropzoneClassName?: string;\n  iconClassName?: string;\n  labelClassName?: string;\n  descriptionClassName?: string;\n  errorClassName?: string;\n  listClassName?: string;\n  fileItemClassName?: string;\n  fileIconClassName?: string;\n  fileNameClassName?: string;\n  fileSizeClassName?: string;\n  removeButtonClassName?: string;\n}\n\nconst formatBytes = (bytes: number) => {\n  if (bytes < 1024) return `${bytes} B`;\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport const FileUpload = forwardRef<HTMLInputElement, FileUploadProps>(\n  function FileUpload(\n    {\n      onFilesChange,\n      onError,\n      multiple = false,\n      accept,\n      maxSizeMB,\n      maxFiles,\n      label = \"Click to upload or drag and drop\",\n      description,\n      disabled = false,\n      hideFileList = false,\n      id,\n      className,\n\n      dropzoneClassName,\n      iconClassName,\n      labelClassName,\n      descriptionClassName,\n      errorClassName,\n      listClassName,\n      fileItemClassName,\n      fileIconClassName,\n      fileNameClassName,\n      fileSizeClassName,\n      removeButtonClassName,\n    },\n    ref,\n  ) {\n    const generatedId = useId();\n    const inputId = id ?? generatedId;\n    const inputRef = useRef<HTMLInputElement | null>(null);\n    const [files, setFiles] = useState<File[]>([]);\n    const [dragging, setDragging] = useState(false);\n    const [message, setMessage] = useState<string | null>(null);\n\n    const addFiles = (incoming: FileList | File[]) => {\n      if (disabled) return;\n      setMessage(null);\n\n      let next = multiple ? [...files] : [];\n      for (const file of Array.from(incoming)) {\n        if (maxSizeMB && file.size > maxSizeMB * 1024 * 1024) {\n          const msg = `\"${file.name}\" exceeds the ${maxSizeMB} MB limit`;\n          setMessage(msg);\n          onError?.(msg, file);\n          continue;\n        }\n        if (maxFiles && next.length >= maxFiles) {\n          const msg = `Maximum of ${maxFiles} files`;\n          setMessage(msg);\n          onError?.(msg, file);\n          break;\n        }\n        // Skip duplicates by name + size.\n        if (next.some((f) => f.name === file.name && f.size === file.size)) {\n          continue;\n        }\n        next.push(file);\n        if (!multiple) break;\n      }\n\n      setFiles(next);\n      onFilesChange?.(next);\n    };\n\n    const removeFile = (index: number) => {\n      const next = files.filter((_, i) => i !== index);\n      setFiles(next);\n      onFilesChange?.(next);\n    };\n\n    return (\n      <div className={cn(\"w-full\", className)}>\n        <label\n          htmlFor={inputId}\n          onDragOver={(e) => {\n            e.preventDefault();\n            if (!disabled) setDragging(true);\n          }}\n          onDragLeave={() => setDragging(false)}\n          onDrop={(e) => {\n            e.preventDefault();\n            setDragging(false);\n            addFiles(e.dataTransfer.files);\n          }}\n          className={cn(\n            \"flex w-full flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed px-6 py-10 text-center transition-colors\",\n            dragging\n              ? \"border-primary bg-primary/5\"\n              : \"border-border bg-transparent hover:border-muted-foreground/50 hover:bg-accent/30\",\n            disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n            \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n            dropzoneClassName,\n          )}\n        >\n          <input\n            ref={(el) => {\n              inputRef.current = el;\n              if (typeof ref === \"function\") ref(el);\n              else if (ref) ref.current = el;\n            }}\n            id={inputId}\n            type=\"file\"\n            multiple={multiple}\n            accept={accept}\n            disabled={disabled}\n            onChange={(e) => {\n              if (e.target.files) addFiles(e.target.files);\n              // Allow re-selecting the same file.\n              e.target.value = \"\";\n            }}\n            className=\"sr-only\"\n          />\n\n          <span\n            aria-hidden=\"true\"\n            className={cn(\"rounded-full bg-muted p-3 text-muted-foreground\", iconClassName)}\n          >\n            <UploadCloud className=\"h-6 w-6\" />\n          </span>\n\n          <p className={cn(\"text-sm font-medium text-foreground\", labelClassName)}>{label}</p>\n\n          <p className={cn(\"text-xs text-muted-foreground\", descriptionClassName)}>\n            {description ??\n              [\n                accept ? `Accepted: ${accept}` : null,\n                maxSizeMB ? `Max ${maxSizeMB} MB` : null,\n                maxFiles ? `Up to ${maxFiles} files` : null,\n              ]\n                .filter(Boolean)\n                .join(\" · \")}\n          </p>\n        </label>\n\n        {message && (\n          <p role=\"alert\" className={cn(\"mt-2 text-xs font-medium text-destructive\", errorClassName)}>\n            {message}\n          </p>\n        )}\n\n        {!hideFileList && files.length > 0 && (\n          <ul className={cn(\"mt-3 space-y-2\", listClassName)}>\n            {files.map((file, i) => (\n              <li\n                key={`${file.name}-${file.size}-${i}`}\n                className={cn(\n                  \"flex items-center gap-3 rounded-lg border border-border bg-card px-3 py-2\",\n                  fileItemClassName,\n                )}\n              >\n                <FileIcon\n                  aria-hidden=\"true\"\n                  className={cn(\"h-4 w-4 shrink-0 text-muted-foreground\", fileIconClassName)}\n                />\n                <div className=\"min-w-0 flex-1\">\n                  <p className={cn(\"truncate text-sm font-medium text-foreground\", fileNameClassName)}>\n                    {file.name}\n                  </p>\n                  <p className={cn(\"text-xs text-muted-foreground\", fileSizeClassName)}>\n                    {formatBytes(file.size)}\n                  </p>\n                </div>\n                <button\n                  type=\"button\"\n                  aria-label={`Remove ${file.name}`}\n                  onClick={() => removeFile(i)}\n                  className={cn(\n                    \"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                    removeButtonClassName,\n                  )}\n                >\n                  <X aria-hidden=\"true\" className=\"h-4 w-4\" />\n                </button>\n              </li>\n            ))}\n          </ul>\n        )}\n      </div>\n    );\n  },\n);\n\nFileUpload.displayName = \"FileUpload\";\n","\"use client\";\n\nimport React, { forwardRef, useState } from \"react\";\nimport {\n  Info,\n  CheckCircle,\n  AlertTriangle,\n  AlertCircle,\n  X,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\n/**\n * Static inline alert / banner. Unlike the toast system (ToastProvider),\n * a Callout lives in the page flow and stays until dismissed.\n */\nexport interface CalloutProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n  type?: \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n  variant?: \"soft\" | \"outline\";\n  title?: React.ReactNode;\n  children?: React.ReactNode;\n  /** Override the default type icon; pass null to hide it. */\n  icon?: React.ReactNode | null;\n  /** Renders a close button; the callout removes itself unless controlled. */\n  dismissible?: boolean;\n  onDismiss?: () => void;\n\n  /** 🔥 Full Customization */\n  iconClassName?: string;\n  contentClassName?: string;\n  titleClassName?: string;\n  descriptionClassName?: string;\n  closeButtonClassName?: string;\n}\n\n/* Every color is a theme status token, so callouts follow the user-defined\n   palette in both modes — no raw palette values, no dark: overrides. */\nconst STYLES = {\n  info: {\n    soft: \"border-info/30 bg-info/10 text-info\",\n    outline: \"border-info/50 text-info\",\n    icon: Info,\n  },\n  success: {\n    soft: \"border-success/30 bg-success/10 text-success\",\n    outline: \"border-success/50 text-success\",\n    icon: CheckCircle,\n  },\n  warning: {\n    soft: \"border-warning/30 bg-warning/10 text-warning\",\n    outline: \"border-warning/50 text-warning\",\n    icon: AlertTriangle,\n  },\n  error: {\n    soft: \"border-destructive/30 bg-destructive/10 text-destructive\",\n    outline: \"border-destructive/50 text-destructive\",\n    icon: AlertCircle,\n  },\n  neutral: {\n    soft: \"border-border bg-muted text-foreground\",\n    outline: \"border-border text-foreground\",\n    icon: Info,\n  },\n} as const;\n\nexport const Callout = forwardRef<HTMLDivElement, CalloutProps>(\n  function Callout(\n    {\n      type = \"info\",\n      variant = \"soft\",\n      title,\n      children,\n      icon,\n      dismissible = false,\n      onDismiss,\n      className,\n      iconClassName,\n      contentClassName,\n      titleClassName,\n      descriptionClassName,\n      closeButtonClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const [hidden, setHidden] = useState(false);\n    if (hidden) return null;\n\n    const config = STYLES[type] ?? STYLES.info;\n    const DefaultIcon = config.icon;\n\n    return (\n      <div\n        ref={ref}\n        // Errors interrupt; the rest is informational.\n        role={type === \"error\" ? \"alert\" : \"status\"}\n        className={cn(\n          \"flex w-full items-start gap-3 rounded-xl border p-4\",\n          config[variant] ?? config.soft,\n          className,\n        )}\n        {...rest}\n      >\n        {icon !== null && (\n          <span\n            aria-hidden=\"true\"\n            // h-5 matches the title's text-sm line-height, so the icon centers\n            // on the first line instead of hanging low from an mt nudge.\n            className={cn(\n              \"flex h-5 shrink-0 items-center [&_svg]:h-5 [&_svg]:w-5\",\n              iconClassName,\n            )}\n          >\n            {icon ?? <DefaultIcon />}\n          </span>\n        )}\n\n        <div className={cn(\"min-w-0 flex-1\", contentClassName)}>\n          {title && (\n            <p className={cn(\"text-sm font-semibold\", titleClassName)}>\n              {title}\n            </p>\n          )}\n          {children && (\n            <div\n              className={cn(\n                \"text-sm text-foreground/80\",\n                title && \"mt-1\",\n                descriptionClassName,\n              )}\n            >\n              {children}\n            </div>\n          )}\n        </div>\n\n        {dismissible && (\n          <button\n            type=\"button\"\n            aria-label=\"Dismiss\"\n            onClick={() => {\n              onDismiss?.();\n              setHidden(true);\n            }}\n            className={cn(\n              \"shrink-0 rounded-md p-1 opacity-70 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n              closeButtonClassName,\n            )}\n          >\n            <X aria-hidden=\"true\" className=\"h-4 w-4\" />\n          </button>\n        )}\n      </div>\n    );\n  },\n);\n\nCallout.displayName = \"Callout\";\n","\"use client\";\n\nimport React, { forwardRef, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface ToggleProps\n  extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n  pressed?: boolean;\n  defaultPressed?: boolean;\n  onPressedChange?: (pressed: boolean) => void;\n  variant?: \"default\" | \"outline\";\n  size?: \"sm\" | \"md\" | \"lg\";\n}\n\n// Heights match ToggleGroup, so a standalone Toggle sits flush next to a\n// group in the same toolbar.\nconst SIZES = {\n  sm: \"h-8 px-2.5 text-xs [&_svg]:h-3.5 [&_svg]:w-3.5\",\n  md: \"h-9 px-3 text-sm [&_svg]:h-4 [&_svg]:w-4\",\n  lg: \"h-11 px-4 text-base [&_svg]:h-5 [&_svg]:w-5\",\n} as const;\n\n/** Two-state button (e.g. bold in a text editor, filter chips). */\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(\n  function Toggle(\n    {\n      pressed,\n      defaultPressed = false,\n      onPressedChange,\n      variant = \"default\",\n      size = \"md\",\n      className,\n      children,\n      onClick,\n      disabled,\n      ...rest\n    },\n    ref,\n  ) {\n    const [internal, setInternal] = useState(defaultPressed);\n    const isPressed = pressed !== undefined ? pressed : internal;\n\n    return (\n      <button\n        ref={ref}\n        type=\"button\"\n        aria-pressed={isPressed}\n        disabled={disabled}\n        onClick={(e) => {\n          onClick?.(e);\n          if (pressed === undefined) setInternal(!isPressed);\n          onPressedChange?.(!isPressed);\n        }}\n        className={cn(\n          \"inline-flex items-center justify-center gap-2 rounded-lg font-medium transition-colors\",\n          \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n          \"disabled:pointer-events-none disabled:opacity-50\",\n          SIZES[size] ?? SIZES.md,\n          variant === \"outline\" && \"border border-border\",\n          isPressed\n            ? \"bg-accent text-foreground\"\n            : \"bg-transparent text-muted-foreground hover:bg-accent/60 hover:text-foreground\",\n          className,\n        )}\n        {...rest}\n      >\n        {children}\n      </button>\n    );\n  },\n);\n\nToggle.displayName = \"Toggle\";\n","\"use client\";\n\nimport React, { forwardRef, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface ToggleGroupOption {\n  value: string;\n  label?: React.ReactNode;\n  icon?: React.ReactNode;\n  disabled?: boolean;\n  /** Accessible name when the option is icon-only. */\n  ariaLabel?: string;\n}\n\nexport interface ToggleGroupProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\"> {\n  options: ToggleGroupOption[];\n  /** \"single\" behaves like a segmented control; \"multiple\" like toolbar toggles. */\n  type?: \"single\" | \"multiple\";\n  value?: string | string[];\n  defaultValue?: string | string[];\n  onChange?: (value: string | string[]) => void;\n  size?: \"sm\" | \"md\" | \"lg\";\n  fullWidth?: boolean;\n  disabled?: boolean;\n  /** Each option's `<button>`. */\n  itemClassName?: string;\n  /** Wrapper around an option's icon. */\n  iconClassName?: string;\n}\n\nconst SIZES = {\n  sm: \"h-8 px-2.5 text-xs [&_svg]:h-3.5 [&_svg]:w-3.5\",\n  md: \"h-9 px-3 text-sm [&_svg]:h-4 [&_svg]:w-4\",\n  lg: \"h-11 px-4 text-base [&_svg]:h-5 [&_svg]:w-5\",\n} as const;\n\nexport const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(\n  function ToggleGroup(\n    {\n      options,\n      type = \"single\",\n      value,\n      defaultValue,\n      onChange,\n      size = \"md\",\n      fullWidth = false,\n      disabled = false,\n      className,\n      itemClassName,\n      iconClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const [internal, setInternal] = useState<string | string[]>(\n      defaultValue ?? (type === \"multiple\" ? [] : \"\"),\n    );\n    const current = value !== undefined ? value : internal;\n\n    const isSelected = (v: string) =>\n      type === \"multiple\"\n        ? Array.isArray(current) && current.includes(v)\n        : current === v;\n\n    const select = (v: string) => {\n      let next: string | string[];\n      if (type === \"multiple\") {\n        const list = Array.isArray(current) ? current : [];\n        next = list.includes(v) ? list.filter((x) => x !== v) : [...list, v];\n      } else {\n        next = current === v ? \"\" : v;\n      }\n      if (value === undefined) setInternal(next);\n      onChange?.(next);\n    };\n\n    return (\n      <div\n        ref={ref}\n        role=\"group\"\n        className={cn(\n          \"inline-flex items-stretch overflow-hidden rounded-lg border border-border bg-transparent\",\n          fullWidth && \"flex w-full\",\n          disabled && \"opacity-50\",\n          className,\n        )}\n        {...rest}\n      >\n        {options.map((option, i) => {\n          const selected = isSelected(option.value);\n          const itemDisabled = disabled || option.disabled;\n\n          return (\n            <button\n              key={option.value}\n              type=\"button\"\n              aria-pressed={selected}\n              aria-label={option.ariaLabel}\n              disabled={itemDisabled}\n              onClick={() => select(option.value)}\n              className={cn(\n                \"inline-flex items-center justify-center gap-2 font-medium transition-colors\",\n                \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n                \"disabled:pointer-events-none disabled:opacity-50\",\n                SIZES[size] ?? SIZES.md,\n                fullWidth && \"flex-1\",\n                i > 0 && \"border-l border-border\",\n                selected\n                  ? \"bg-primary/10 text-primary\"\n                  : \"bg-transparent text-muted-foreground hover:bg-accent/60 hover:text-foreground\",\n                itemClassName,\n              )}\n            >\n              {option.icon && (\n                <span\n                  aria-hidden=\"true\"\n                  className={cn(\"shrink-0\", iconClassName)}\n                >\n                  {option.icon}\n                </span>\n              )}\n              {option.label}\n            </button>\n          );\n        })}\n      </div>\n    );\n  },\n);\n\nToggleGroup.displayName = \"ToggleGroup\";\n","\"use client\";\n\nimport React, { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { Copy, Check } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CopyButtonProps\n  extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\n  /** Text placed on the clipboard. */\n  value: string;\n  /** Optional visible label next to the icon. */\n  label?: React.ReactNode;\n  /** How long the \"copied\" state shows, in ms. */\n  feedbackDuration?: number;\n  size?: \"sm\" | \"md\" | \"lg\";\n  onCopied?: (value: string) => void;\n\n  /** 🔥 Full Customization */\n  iconClassName?: string;\n  labelClassName?: string;\n}\n\nconst SIZES = {\n  sm: \"h-7 px-1.5 text-xs [&_svg]:h-3.5 [&_svg]:w-3.5\",\n  md: \"h-9 px-2 text-sm [&_svg]:h-4 [&_svg]:w-4\",\n  lg: \"h-11 px-3 text-base [&_svg]:h-5 [&_svg]:w-5\",\n} as const;\n\n/* Icon-only buttons render as squares instead of narrow rectangles. */\nconst ICON_ONLY = {\n  sm: \"w-7 px-0 justify-center\",\n  md: \"w-9 px-0 justify-center\",\n  lg: \"w-11 px-0 justify-center\",\n} as const;\n\nexport const CopyButton = forwardRef<HTMLButtonElement, CopyButtonProps>(\n  function CopyButton(\n    {\n      value,\n      label,\n      feedbackDuration = 1500,\n      size = \"md\",\n      onCopied,\n      className,\n      iconClassName,\n      labelClassName,\n      onClick,\n      ...rest\n    },\n    ref,\n  ) {\n    const [copied, setCopied] = useState(false);\n    const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n    useEffect(\n      () => () => {\n        if (timer.current) clearTimeout(timer.current);\n      },\n      [],\n    );\n\n    const copy = async (e: React.MouseEvent<HTMLButtonElement>) => {\n      onClick?.(e);\n      try {\n        if (navigator.clipboard && window.isSecureContext) {\n          await navigator.clipboard.writeText(value);\n        } else {\n          // Fallback for non-secure contexts.\n          const textarea = document.createElement(\"textarea\");\n          textarea.value = value;\n          textarea.style.position = \"fixed\";\n          textarea.style.opacity = \"0\";\n          document.body.appendChild(textarea);\n          textarea.select();\n          document.execCommand(\"copy\");\n          document.body.removeChild(textarea);\n        }\n        setCopied(true);\n        onCopied?.(value);\n        if (timer.current) clearTimeout(timer.current);\n        timer.current = setTimeout(() => setCopied(false), feedbackDuration);\n      } catch {\n        // Clipboard access denied — leave the state unchanged.\n      }\n    };\n\n    return (\n      <button\n        ref={ref}\n        type=\"button\"\n        aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n        aria-live=\"polite\"\n        onClick={copy}\n        className={cn(\n          \"inline-flex items-center gap-1.5 rounded-lg font-medium transition-colors\",\n          \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n          \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n          \"disabled:pointer-events-none disabled:opacity-50\",\n          SIZES[size] ?? SIZES.md,\n          !label && (ICON_ONLY[size] ?? ICON_ONLY.md),\n          className,\n        )}\n        {...rest}\n      >\n        {copied ? (\n          <Check aria-hidden=\"true\" className={cn(\"text-success\", iconClassName)} />\n        ) : (\n          <Copy aria-hidden=\"true\" className={cn(iconClassName)} />\n        )}\n        {label && (\n          <span className={cn(labelClassName)}>{copied ? \"Copied\" : label}</span>\n        )}\n      </button>\n    );\n  },\n);\n\nCopyButton.displayName = \"CopyButton\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface AvatarGroupProps\n  extends React.HTMLAttributes<HTMLDivElement> {\n  /** Avatar elements (or any circular content). */\n  children: React.ReactNode;\n  /** Show at most this many; the rest collapse into a \"+N\" counter. */\n  max?: number;\n  size?: \"sm\" | \"md\" | \"lg\";\n  /** Overlap amount between items. */\n  spacing?: \"tight\" | \"normal\";\n  /** Customize the wrapper span around each visible avatar item. */\n  itemClassName?: string;\n  /** Customize the \"+N\" overflow counter. */\n  counterClassName?: string;\n}\n\nconst COUNTER_SIZES = {\n  sm: \"h-8 w-8 text-[10px]\",\n  md: \"h-10 w-10 text-xs\",\n  lg: \"h-12 w-12 text-sm\",\n} as const;\n\nexport const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(\n  function AvatarGroup(\n    {\n      children,\n      max,\n      size = \"md\",\n      spacing = \"normal\",\n      className,\n      itemClassName,\n      counterClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const items = React.Children.toArray(children);\n    const visible = max && max > 0 ? items.slice(0, max) : items;\n    const overflow = items.length - visible.length;\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex items-center\",\n          spacing === \"tight\" ? \"-space-x-3\" : \"-space-x-2\",\n          className,\n        )}\n        {...rest}\n      >\n        {visible.map((child, i) => (\n          <span\n            key={i}\n            // Ring separates overlapping avatars from each other.\n            className={cn(\n              \"relative inline-flex rounded-full ring-2 ring-background\",\n              itemClassName,\n            )}\n            style={{ zIndex: visible.length - i }}\n          >\n            {child}\n          </span>\n        ))}\n\n        {overflow > 0 && (\n          <span\n            aria-label={`${overflow} more`}\n            className={cn(\n              \"relative z-0 inline-flex items-center justify-center rounded-full\",\n              \"bg-muted font-semibold text-muted-foreground ring-2 ring-background\",\n              COUNTER_SIZES[size] ?? COUNTER_SIZES.md,\n              counterClassName,\n            )}\n          >\n            +{overflow}\n          </span>\n        )}\n      </div>\n    );\n  },\n);\n\nAvatarGroup.displayName = \"AvatarGroup\";\n","\"use client\";\n\nimport React, { forwardRef, useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CalendarProps\n  extends Omit<\n    React.HTMLAttributes<HTMLDivElement>,\n    \"onChange\" | \"defaultValue\"\n  > {\n  /** Selected day. */\n  value?: Date | null;\n  defaultValue?: Date | null;\n  onChange?: (date: Date) => void;\n  /** Month shown first (defaults to the selected day or today). */\n  defaultMonth?: Date;\n  minDate?: Date;\n  maxDate?: Date;\n  /** Return true to disable a specific day. */\n  isDateDisabled?: (date: Date) => boolean;\n  /** 0 = Sunday, 1 = Monday. */\n  weekStartsOn?: 0 | 1;\n  locale?: string;\n\n  /** 🔥 Full Customization */\n  headerClassName?: string;\n  navButtonClassName?: string;\n  monthLabelClassName?: string;\n  weekdaysClassName?: string;\n  weekdayClassName?: string;\n  daysClassName?: string;\n  dayClassName?: string;\n}\n\nconst isSameDay = (a: Date | null | undefined, b: Date | null | undefined) =>\n  !!a &&\n  !!b &&\n  a.getFullYear() === b.getFullYear() &&\n  a.getMonth() === b.getMonth() &&\n  a.getDate() === b.getDate();\n\nconst stripTime = (d: Date) =>\n  new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(\n  function Calendar(\n    {\n      value,\n      defaultValue = null,\n      onChange,\n      defaultMonth,\n      minDate,\n      maxDate,\n      isDateDisabled,\n      weekStartsOn = 1,\n      locale,\n      className,\n      headerClassName,\n      navButtonClassName,\n      monthLabelClassName,\n      weekdaysClassName,\n      weekdayClassName,\n      daysClassName,\n      dayClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const [internalValue, setInternalValue] = useState<Date | null>(defaultValue);\n    const selected = value !== undefined ? value : internalValue;\n\n    const [viewMonth, setViewMonth] = useState<Date>(() => {\n      const base = selected ?? defaultMonth ?? new Date();\n      return new Date(base.getFullYear(), base.getMonth(), 1);\n    });\n\n    const today = stripTime(new Date());\n    const min = minDate ? stripTime(minDate) : null;\n    const max = maxDate ? stripTime(maxDate) : null;\n\n    const isDisabled = (date: Date) => {\n      if (min && date < min) return true;\n      if (max && date > max) return true;\n      return isDateDisabled?.(date) ?? false;\n    };\n\n    const select = (date: Date) => {\n      if (value === undefined) setInternalValue(date);\n      onChange?.(date);\n      // Selecting an adjacent-month day snaps the view to that month.\n      if (date.getMonth() !== viewMonth.getMonth()) {\n        setViewMonth(new Date(date.getFullYear(), date.getMonth(), 1));\n      }\n    };\n\n    const shiftMonth = (delta: number) =>\n      setViewMonth(\n        (m) => new Date(m.getFullYear(), m.getMonth() + delta, 1),\n      );\n\n    /* 42 cells: always six rows, so the panel height never jumps. */\n    const firstOffset =\n      (viewMonth.getDay() - weekStartsOn + 7) % 7;\n    const cells = Array.from({ length: 42 }, (_, i) => {\n      const d = new Date(\n        viewMonth.getFullYear(),\n        viewMonth.getMonth(),\n        1 - firstOffset + i,\n      );\n      return stripTime(d);\n    });\n\n    // Localized weekday header, anchored on a known Sunday (2023-01-01).\n    const weekdays = Array.from({ length: 7 }, (_, i) =>\n      new Date(2023, 0, 1 + ((i + weekStartsOn) % 7)).toLocaleDateString(\n        locale,\n        { weekday: \"narrow\" },\n      ),\n    );\n\n    const monthLabel = viewMonth.toLocaleDateString(locale, {\n      month: \"long\",\n      year: \"numeric\",\n    });\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\"w-64 select-none\", className)}\n        {...rest}\n      >\n        {/* Month header */}\n        <div className={cn(\"mb-2 flex items-center justify-between\", headerClassName)}>\n          <button\n            type=\"button\"\n            aria-label=\"Previous month\"\n            onClick={() => shiftMonth(-1)}\n            className={cn(\n              \"rounded-lg p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n              navButtonClassName,\n            )}\n          >\n            <ChevronLeft aria-hidden=\"true\" className=\"h-4 w-4\" />\n          </button>\n\n          <span\n            aria-live=\"polite\"\n            className={cn(\"text-sm font-semibold text-foreground\", monthLabelClassName)}\n          >\n            {monthLabel}\n          </span>\n\n          <button\n            type=\"button\"\n            aria-label=\"Next month\"\n            onClick={() => shiftMonth(1)}\n            className={cn(\n              \"rounded-lg p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n              navButtonClassName,\n            )}\n          >\n            <ChevronRight aria-hidden=\"true\" className=\"h-4 w-4\" />\n          </button>\n        </div>\n\n        {/* Weekday header */}\n        <div className={cn(\"grid grid-cols-7 text-center\", weekdaysClassName)}>\n          {weekdays.map((day, i) => (\n            <span\n              key={i}\n              aria-hidden=\"true\"\n              className={cn(\n                \"py-1 text-[11px] font-medium text-muted-foreground\",\n                weekdayClassName,\n              )}\n            >\n              {day}\n            </span>\n          ))}\n        </div>\n\n        {/* Day grid */}\n        <div className={cn(\"grid grid-cols-7\", daysClassName)}>\n          {cells.map((date) => {\n            const outside = date.getMonth() !== viewMonth.getMonth();\n            const disabled = isDisabled(date);\n            const isSelected = isSameDay(date, selected);\n            const isToday = isSameDay(date, today);\n\n            return (\n              <button\n                key={date.toISOString()}\n                type=\"button\"\n                disabled={disabled}\n                aria-label={date.toLocaleDateString(locale, {\n                  weekday: \"long\",\n                  year: \"numeric\",\n                  month: \"long\",\n                  day: \"numeric\",\n                })}\n                aria-pressed={isSelected}\n                aria-current={isToday ? \"date\" : undefined}\n                onClick={() => select(date)}\n                className={cn(\n                  \"m-0.5 flex h-8 items-center justify-center rounded-lg text-xs tabular-nums transition-colors\",\n                  \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                  \"disabled:pointer-events-none disabled:opacity-30\",\n                  isSelected\n                    ? \"bg-primary font-semibold text-primary-foreground\"\n                    : cn(\n                        \"hover:bg-accent\",\n                        outside ? \"text-muted-foreground/50\" : \"text-foreground\",\n                        isToday && \"border border-primary/50 font-semibold text-primary\",\n                      ),\n                  dayClassName,\n                )}\n              >\n                {date.getDate()}\n              </button>\n            );\n          })}\n        </div>\n      </div>\n    );\n  },\n);\n\nCalendar.displayName = \"Calendar\";\n","\"use client\";\n\nimport React, {\n  forwardRef,\n  useEffect,\n  useId,\n  useRef,\n  useState,\n} from \"react\";\nimport { Calendar as CalendarIcon, X } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\nimport { Calendar, type CalendarProps } from \"./Calendar\";\n\nexport interface DatePickerProps {\n  value?: Date | null;\n  defaultValue?: Date | null;\n  onChange?: (date: Date | null) => void;\n  placeholder?: string;\n  /** Format the displayed date; defaults to the locale date string. */\n  formatDate?: (date: Date) => string;\n  label?: string;\n  error?: string;\n  helperText?: string;\n  size?: \"sm\" | \"md\" | \"lg\";\n  disabled?: boolean;\n  /** Show an inline clear button while a date is selected. */\n  clearable?: boolean;\n  /** Forwarded to the inner <Calendar />. */\n  calendarProps?: Omit<\n    CalendarProps,\n    \"value\" | \"defaultValue\" | \"onChange\" | \"className\"\n  >;\n  id?: string;\n  className?: string;\n  wrapperClassName?: string;\n\n  /** 🔥 Full Customization */\n  labelClassName?: string;\n  iconClassName?: string;\n  textClassName?: string;\n  clearButtonClassName?: string;\n  clearIconClassName?: string;\n  panelClassName?: string;\n  helperClassName?: string;\n}\n\nconst SIZES = {\n  sm: \"h-8 px-2.5 text-xs [&_svg]:h-3.5 [&_svg]:w-3.5\",\n  md: \"h-10 px-3 text-sm [&_svg]:h-4 [&_svg]:w-4\",\n  lg: \"h-12 px-4 text-base [&_svg]:h-5 [&_svg]:w-5\",\n} as const;\n\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(\n  function DatePicker(\n    {\n      value,\n      defaultValue = null,\n      onChange,\n      placeholder = \"Pick a date\",\n      formatDate,\n      label,\n      error,\n      helperText,\n      size = \"md\",\n      disabled = false,\n      clearable = false,\n      calendarProps,\n      id,\n      className,\n      wrapperClassName,\n      labelClassName,\n      iconClassName,\n      textClassName,\n      clearButtonClassName,\n      clearIconClassName,\n      panelClassName,\n      helperClassName,\n    },\n    ref,\n  ) {\n    const generatedId = useId();\n    const fieldId = id ?? generatedId;\n    const panelId = `${generatedId}-panel`;\n    const describedBy = helperText || error ? `${fieldId}-description` : undefined;\n\n    const rootRef = useRef<HTMLDivElement | null>(null);\n    const [open, setOpen] = useState(false);\n    const [internal, setInternal] = useState<Date | null>(defaultValue);\n    const selected = value !== undefined ? value : internal;\n\n    const commit = (next: Date | null) => {\n      if (value === undefined) setInternal(next);\n      onChange?.(next);\n    };\n\n    // Outside-click + Escape, attached only while open.\n    useEffect(() => {\n      if (!open) return;\n      const onMouseDown = (e: MouseEvent) => {\n        if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n          setOpen(false);\n        }\n      };\n      const onKeyDown = (e: KeyboardEvent) => {\n        if (e.key === \"Escape\") setOpen(false);\n      };\n      document.addEventListener(\"mousedown\", onMouseDown);\n      document.addEventListener(\"keydown\", onKeyDown);\n      return () => {\n        document.removeEventListener(\"mousedown\", onMouseDown);\n        document.removeEventListener(\"keydown\", onKeyDown);\n      };\n    }, [open]);\n\n    const display = selected\n      ? formatDate\n        ? formatDate(selected)\n        : selected.toLocaleDateString()\n      : null;\n\n    return (\n      <div ref={rootRef} className={cn(\"relative w-full\", wrapperClassName)}>\n        {label && (\n          <label\n            htmlFor={fieldId}\n            className={cn(\n              \"mb-1.5 block text-[13px] font-medium leading-none text-foreground\",\n              labelClassName,\n            )}\n          >\n            {label}\n          </label>\n        )}\n\n        <div className=\"relative\">\n          <button\n            ref={ref}\n            id={fieldId}\n            type=\"button\"\n            disabled={disabled}\n            aria-haspopup=\"dialog\"\n            aria-expanded={open}\n            aria-controls={open ? panelId : undefined}\n            aria-invalid={error ? true : undefined}\n            aria-describedby={describedBy}\n            onClick={() => setOpen((p) => !p)}\n            className={cn(\n              \"flex w-full items-center gap-2 rounded-lg border bg-transparent text-left transition-colors\",\n              \"dark:bg-input/30\",\n              error ? \"border-destructive\" : \"border-input\",\n              \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:border-ring\",\n              disabled && \"cursor-not-allowed opacity-50\",\n              SIZES[size] ?? SIZES.md,\n              // Reserve room for the clear button.\n              clearable && selected && \"pr-9\",\n              className,\n            )}\n          >\n            <CalendarIcon\n              aria-hidden=\"true\"\n              className={cn(\"shrink-0 text-muted-foreground\", iconClassName)}\n            />\n            <span\n              className={cn(\n                \"truncate\",\n                display ? \"text-foreground\" : \"text-muted-foreground\",\n                textClassName,\n              )}\n            >\n              {display ?? placeholder}\n            </span>\n          </button>\n\n          {clearable && selected && !disabled && (\n            <button\n              type=\"button\"\n              aria-label=\"Clear date\"\n              onClick={() => commit(null)}\n              className={cn(\n                \"absolute right-2 top-1/2 -translate-y-1/2 rounded-md p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                clearButtonClassName,\n              )}\n            >\n              <X aria-hidden=\"true\" className={cn(\"h-3.5 w-3.5\", clearIconClassName)} />\n            </button>\n          )}\n        </div>\n\n        {open && (\n          <div\n            id={panelId}\n            role=\"dialog\"\n            aria-label=\"Choose date\"\n            className={cn(\n              \"absolute left-0 z-50 mt-2 rounded-xl border border-border bg-popover p-3 shadow-xl\",\n              \"animate-in fade-in\",\n              panelClassName,\n            )}\n          >\n            <Calendar\n              {...calendarProps}\n              value={selected}\n              onChange={(date) => {\n                commit(date);\n                setOpen(false);\n              }}\n            />\n          </div>\n        )}\n\n        {(helperText || error) && (\n          <p\n            id={describedBy}\n            role={error ? \"alert\" : undefined}\n            className={cn(\n              \"mt-1.5 text-xs font-medium\",\n              error ? \"text-destructive\" : \"text-muted-foreground\",\n              helperClassName,\n            )}\n          >\n            {error || helperText}\n          </p>\n        )}\n      </div>\n    );\n  },\n);\n\nDatePicker.displayName = \"DatePicker\";\n","\"use client\";\n\nimport React, {\n  forwardRef,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CarouselProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n  children: React.ReactNode;\n  defaultIndex?: number;\n  onIndexChange?: (index: number) => void;\n  /** Auto-advance interval in ms; 0 disables. Pauses on hover/focus. */\n  autoPlay?: number;\n  /** Wrap from the last slide back to the first. */\n  loop?: boolean;\n  showArrows?: boolean;\n  showDots?: boolean;\n  /** Accessible name for the carousel region. */\n  label?: string;\n\n  /** 🔥 Full Customization */\n  trackClassName?: string;\n  slidesClassName?: string;\n  slideClassName?: string;\n  arrowClassName?: string;\n  prevArrowClassName?: string;\n  nextArrowClassName?: string;\n  arrowIconClassName?: string;\n  dotsClassName?: string;\n  dotClassName?: string;\n}\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n  function Carousel(\n    {\n      children,\n      defaultIndex = 0,\n      onIndexChange,\n      autoPlay = 0,\n      loop = true,\n      showArrows = true,\n      showDots = true,\n      label = \"Carousel\",\n      className,\n      trackClassName,\n      slidesClassName,\n      slideClassName,\n      arrowClassName,\n      prevArrowClassName,\n      nextArrowClassName,\n      arrowIconClassName,\n      dotsClassName,\n      dotClassName,\n      ...rest\n    },\n    ref,\n  ) {\n    const slides = React.Children.toArray(children);\n    const count = slides.length;\n\n    const [index, setIndex] = useState(() =>\n      Math.min(Math.max(defaultIndex, 0), Math.max(count - 1, 0)),\n    );\n    const [paused, setPaused] = useState(false);\n    const touchStartX = useRef<number | null>(null);\n\n    const goTo = (next: number) => {\n      let target = next;\n      if (loop) {\n        target = (next + count) % count;\n      } else {\n        target = Math.min(Math.max(next, 0), count - 1);\n      }\n      setIndex(target);\n      onIndexChange?.(target);\n    };\n\n    // Auto-play with cleanup; paused on hover/focus for readability and a11y.\n    useEffect(() => {\n      if (!autoPlay || paused || count <= 1) return;\n      const handle = setInterval(() => {\n        setIndex((prev) => {\n          const next = loop ? (prev + 1) % count : Math.min(prev + 1, count - 1);\n          onIndexChange?.(next);\n          return next;\n        });\n      }, autoPlay);\n      return () => clearInterval(handle);\n      // onIndexChange intentionally omitted — consumers pass inline arrows.\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [autoPlay, paused, count, loop]);\n\n    if (count === 0) return null;\n\n    const arrowClasses = cn(\n      \"absolute top-1/2 z-10 -translate-y-1/2 rounded-full border border-border bg-background/80 p-2\",\n      \"text-foreground backdrop-blur transition-colors hover:bg-accent\",\n      \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n      \"disabled:pointer-events-none disabled:opacity-40\",\n      arrowClassName,\n    );\n\n    return (\n      <div\n        ref={ref}\n        role=\"region\"\n        aria-roledescription=\"carousel\"\n        aria-label={label}\n        onMouseEnter={() => setPaused(true)}\n        onMouseLeave={() => setPaused(false)}\n        onFocus={() => setPaused(true)}\n        onBlur={() => setPaused(false)}\n        onKeyDown={(e) => {\n          if (e.key === \"ArrowLeft\") {\n            e.preventDefault();\n            goTo(index - 1);\n          } else if (e.key === \"ArrowRight\") {\n            e.preventDefault();\n            goTo(index + 1);\n          }\n        }}\n        className={cn(\"relative w-full\", className)}\n        {...rest}\n      >\n        {/* Track */}\n        <div\n          className={cn(\"overflow-hidden rounded-xl\", trackClassName)}\n          onTouchStart={(e) => {\n            touchStartX.current = e.touches[0].clientX;\n          }}\n          onTouchEnd={(e) => {\n            if (touchStartX.current === null) return;\n            const delta = e.changedTouches[0].clientX - touchStartX.current;\n            touchStartX.current = null;\n            if (Math.abs(delta) > 40) goTo(delta < 0 ? index + 1 : index - 1);\n          }}\n        >\n          <div\n            className={cn(\n              \"flex transition-transform duration-300 ease-out motion-reduce:transition-none\",\n              slidesClassName,\n            )}\n            style={{ transform: `translateX(-${index * 100}%)` }}\n          >\n            {slides.map((slide, i) => (\n              <div\n                key={i}\n                role=\"group\"\n                aria-roledescription=\"slide\"\n                aria-label={`Slide ${i + 1} of ${count}`}\n                aria-hidden={i !== index}\n                // Hidden slides shouldn't be tabbable.\n                inert={i !== index ? true : undefined}\n                className={cn(\"w-full shrink-0\", slideClassName)}\n              >\n                {slide}\n              </div>\n            ))}\n          </div>\n        </div>\n\n        {/* Arrows */}\n        {showArrows && count > 1 && (\n          <>\n            <button\n              type=\"button\"\n              aria-label=\"Previous slide\"\n              disabled={!loop && index === 0}\n              onClick={() => goTo(index - 1)}\n              className={cn(arrowClasses, \"left-3\", prevArrowClassName)}\n            >\n              <ChevronLeft\n                aria-hidden=\"true\"\n                className={cn(\"h-4 w-4\", arrowIconClassName)}\n              />\n            </button>\n            <button\n              type=\"button\"\n              aria-label=\"Next slide\"\n              disabled={!loop && index === count - 1}\n              onClick={() => goTo(index + 1)}\n              className={cn(arrowClasses, \"right-3\", nextArrowClassName)}\n            >\n              <ChevronRight\n                aria-hidden=\"true\"\n                className={cn(\"h-4 w-4\", arrowIconClassName)}\n              />\n            </button>\n          </>\n        )}\n\n        {/* Dots */}\n        {showDots && count > 1 && (\n          <div className={cn(\"mt-3 flex justify-center gap-1.5\", dotsClassName)}>\n            {slides.map((_, i) => (\n              <button\n                key={i}\n                type=\"button\"\n                aria-label={`Go to slide ${i + 1}`}\n                aria-current={i === index ? \"true\" : undefined}\n                onClick={() => goTo(i)}\n                className={cn(\n                  \"h-2 rounded-full transition-all\",\n                  \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n                  i === index\n                    ? \"w-5 bg-primary\"\n                    : \"w-2 bg-muted-foreground/40 hover:bg-muted-foreground/70\",\n                  dotClassName,\n                )}\n              />\n            ))}\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n\nCarousel.displayName = \"Carousel\";\n"],"names":["transformMap","colorMap","Text","as","children","transform","italic","underline","strikethrough","truncate","color","className","rest","Element","isAnchor","jsx","clsx","cn","inputs","twMerge","Button","forwardRef","iconBefore","iconAfter","loading","loadingText","fullWidth","variant","size","disabled","contentClassName","iconClassName","loaderClassName","textClassName","style","contentStyle","iconStyle","loaderStyle","textStyle","type","ref","isDisabled","sizeClasses","gapClasses","loaderBorder","variantClasses","iconSizes","jsxs","Fragment","resolveResponsive","value","Image","props","src","alt","title","width","height","aspectRatio","radius","border","shadow","opacity","objectFit","overlay","overlayColor","clickable","onClick","fallback","imageClassName","overlayClassName","fallbackClassName","imageStyle","overlayStyle","fallbackStyle","resolvedWidth","resolvedHeight","wrapperStyles","useMemo","imageStyles","overlayStyles","fallbackStyles","handleKeyDown","e","sizeMap","paddingMap","Container","React","padding","center","classes","fontSizeMap","dimensionMap","variantMap","statusPositionMap","getStatusDotSize","getStatusBorderWidth","Avatar","isOnline","isOffline","ring","statusPosition","statusClassName","statusStyle","imageError","setImageError","useState","resolvedSize","initials","n","statusColor","statusDotSize","statusBorderWidth","User","Badge","memo","text","icon","iconPosition","rounded","notificationDot","count","pulse","dotClassName","dotStyle","countClassName","countStyle","sizes","variants","isInteractive","paddingClasses","activeClasses","getItemId","item","index","depth","getChildren","getLabel","shouldUseRel","target","rel","ListItem","isInline","isOrdered","showTree","showBullets","showDividers","interactive","listDisabled","density","nestedMode","bulletVariant","activeItemId","expandedIds","toggleExpanded","selectItem","linkComponent","renderItem","itemClassName","itemContentClassName","bulletClassName","badgeClassName","shortcutClassName","trailingClassName","subListClassName","separatorClassName","chevronClassName","externalIconClassName","itemStyle","itemContentStyle","bulletStyle","badgeStyle","shortcutStyle","trailingStyle","subListStyle","separatorStyle","id","hasChildren","itemDisabled","itemActive","controlledExpanded","setExpanded","expanded","collapsible","label","LeadingIcon","LinkComponent","hasAction","isClickable","isExternal","toggle","handleSelect","event","marker","content","ExternalLink","ChevronDown","ChevronRight","sharedElementProps","defaultItem","child","childIndex","List","titleIcon","description","items","defaultActiveItemId","onActiveChange","defaultExpandedIds","onExpandedChange","role","ariaLabel","emptyState","headerClassName","listClassName","titleClassName","descriptionClassName","emptyStateClassName","headerStyle","listStyle","titleStyle","descriptionStyle","ListTag","internalActiveId","setInternalActiveId","internalExpandedIds","setInternalExpandedIds","resolvedActiveId","resolvedExpandedIds","expandedSet","visibleItems","updateExpanded","next","expandedId","LayoutGroupContext","createContext","useConstant","init","useRef","isBrowser","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","PresenceContext","addUniqueItem","arr","removeItem","clamp","min","max","v","formatErrorMessage","message","errorCode","warning","invariant","check","MotionGlobalConfig","isNumericalString","isObject","isZeroValueString","callback","result","noop","any","combineFunctions","a","b","pipe","transformers","progress","from","to","toFromDifference","SubscriptionManager","handler","c","numSubscriptions","i","secondsToMilliseconds","seconds","millisecondsToSeconds","milliseconds","velocityPerSecond","velocity","frameDuration","warned","warnOnce","condition","calcBezier","t","a1","a2","subdivisionPrecision","subdivisionMaxIterations","binarySubdivide","x","lowerBound","upperBound","mX1","mX2","currentX","currentT","cubicBezier","mY1","mY2","getTForX","aX","mirrorEasing","easing","p","reverseEasing","backOut","backIn","backInOut","anticipate","circIn","circOut","circInOut","easeIn","easeOut","easeInOut","isEasingArray","ease","isBezierDefinition","easingLookup","isValidEasing","easingDefinitionToFunction","definition","x1","y1","x2","y2","stepsOrder","createRenderStep","runNextFrame","stepName","thisFrame","nextFrame","isProcessing","flushNextFrame","toKeepAlive","latestFrameData","triggerCallback","step","keepAlive","immediate","queue","frameData","prevFrame","maxElapsed","createRenderBatcher","scheduleNextBatch","allowKeepAlive","useDefaultElapsed","state","flagRunNextFrame","steps","acc","key","setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender","processBatch","useManualTiming","timestamp","wake","process","frame","cancelFrame","frameSteps","now","clearTime","time","newTime","checkStringStartsWith","token","isCSSVariableName","startsAsVariableToken","isCSSVariableToken","singleCssVariableRegex","containsCSSVariable","number","alpha","scale","sanitize","floatRegex","isNullish","singleColorRegex","isColorString","testProp","splitColor","aName","bName","cName","clampRgbUnit","rgbUnit","rgba","red","green","blue","alpha$1","parseHex","r","g","hex","createUnitType","unit","degrees","percent","px","vh","vw","progressPercentage","hsla","hue","saturation","lightness","parsed","colorRegex","test","NUMBER_TOKEN","COLOR_TOKEN","VAR_TOKEN","VAR_FUNCTION_TOKEN","SPLIT_TOKEN","complexRegex","analyseComplexValue","originalValue","values","indexes","types","split","parsedValue","parseComplexValue","buildTransformer","numSections","output","createTransformer","source","convertNumbersToZero","convertToZero","splitBefore","getAnimatableNone","info","complex","hueToRgb","q","hslaToRgba","mixImmediate","mixNumber","mixLinearColor","fromExpo","expo","colorTypes","getColorType","asRGBA","model","mixColor","fromRGBA","toRGBA","blended","invisibleValues","mixVisibility","origin","mixNumber$1","getMixer","mixComplex","mixArray","mixObject","numValues","blendValue","matchOrder","orderedOrigin","pointers","originIndex","originValue","template","originStats","targetStats","mix","frameloopDriver","passTimestamp","generateLinearEasing","duration","resolution","points","numPoints","maxGeneratorDuration","calcGeneratorDuration","generator","timeStep","createGeneratorEasing","options","createGenerator","springDefaults","calcAngularFreq","undampedFreq","dampingRatio","rootIterations","approximateRoot","envelope","derivative","initialGuess","safeMin","findSpring","bounce","mass","exponentialDecay","delta","d","f","stiffness","durationKeys","physicsKeys","isSpringType","keys","getSpringOptions","springOptions","visualDuration","root","damping","derived","spring","optionsOrVisualDuration","restSpeed","restDelta","isResolvedFromDuration","initialVelocity","initialDelta","undampedAngularFreq","isGranularScale","resolveSpring","resolveVelocity","angularFreq","A","sinCoeff","cosCoeff","C","dampedAngularFreq","freqForT","P","sinhCoeff","coshCoeff","sin","cos","current","currentVelocity","calculatedDuration","generatorOptions","velocitySampleDuration","getGeneratorVelocity","resolveValue","prevT","inertia","keyframes","power","timeConstant","bounceDamping","bounceStiffness","modifyTarget","isOutOfBounds","nearestBoundary","amplitude","ideal","calcDelta","calcLatest","applyFriction","latest","timeReachedBoundary","spring$1","checkCatchBoundary","hasUpdatedFrame","createMixers","customMixer","mixers","mixerFactory","numMixers","mixer","easingFunction","interpolate","input","isClamp","inputLength","isZeroDeltaRange","interpolator","progressInRange","fillOffset","offset","remaining","offsetProgress","defaultOffset","convertOffsetToTimes","o","defaultEasing","keyframeValues","times","easingFunctions","absoluteTimes","mapTimeToKeyframe","isNotNull","getFinalKeyframe","repeat","repeatType","finalKeyframe","speed","resolvedKeyframes","transitionTypeMap","replaceTransitionType","transition","WithPromise","resolve","onResolve","onReject","percentToProgress","JSAnimation","motionValue","repeatDelay","keyframes$1","generatorFactory","animationTime","sample","totalDuration","mixKeyframes","mirroredGenerator","resolvedDuration","delay","onUpdate","timeWithoutDelay","isInDelayPhase","elapsed","frameGenerator","currentIteration","iterationProgress","done","isAnimationFinished","reject","newSpeed","hasChanged","driver","startTime","sampleTime","timeline","fillWildcards","radToDeg","rad","rotate","angle","rebaseAngle","matrix2dParsers","rotateZ","scaleX","scaleY","matrix3dParsers","defaultTransformValue","name","parseValueFromTransform","matrix3dMatch","parsers","match","matrix2dMatch","valueParser","convertTransformToNumber","readTransformValue","instance","transformPropOrder","transformProps","isNumOrPxType","transformKeys","nonTranslationalTransformKeys","removeNonTranslationalTransform","visualElement","removedTransforms","positionalValues","paddingLeft","paddingRight","boxSizing","y","paddingTop","paddingBottom","_bbox","top","left","toResolve","isScheduled","anyNeedsMeasurement","isForced","measureAllKeyframes","resolversToMeasure","resolver","elementsToMeasure","transformsToRestore","element","restore","readAllKeyframes","flushKeyframeResolvers","KeyframeResolver","unresolvedKeyframes","onComplete","isAsync","currentValue","valueAsRead","isForcedComplete","isCSSVar","setStyle","supportsFlags","memoSupports","supportsFlag","memoized","supportsScrollTimeline","supportsLinearEasing","cubicBezierAsString","supportedWaapiEasing","mapEasingToNativeEasing","segmentEasing","startWaapiAnimation","valueName","pseudoElement","keyframeOptions","isGenerator","applyGeneratorOptions","NativeAnimation","allowFlatten","keyframe","wasFinished","newStartTime","rangeStart","rangeEnd","observe","unsupportedEasingFunctions","isUnsupportedEase","replaceStringEasing","sampleDelta","NativeAnimationExtended","sampleAnimation","isAnimatable","hasKeyframesChanged","canAnimate","originKeyframe","targetKeyframe","isOriginAnimatable","isTargetAnimatable","makeAnimationInstant","acceleratedValues","browserColorFunctions","hasBrowserOnlyColors","colorProperties","supportsWaapi","supportsBrowserAnimation","transformTemplate","MAX_RESOLVE_DELAY","AsyncMotionValueAnimation","autoplay","optionsWithDefaults","KeyframeResolver$1","forced","sync","isHandoff","canAnimateValue","resolvedOptions","useWaapi","animation","_onReject","calcChildStagger","delayChildren","staggerChildren","staggerDirection","numChildren","maxStaggerDuration","splitCSSVariableRegex","parseCSSVariable","token1","token2","maxDepth","getVariableValue","resolved","trimmed","underDampedSpring","criticallyDampedSpring","keyframesTransition","getDefaultTransition","valueKey","resolveTransition","parentTransition","_","getValueTransition","valueTransition","orchestrationKeys","isTransitionDefined","animateMotionValue","shouldSkip","getValueState","resolveVariantFromProps","custom","resolveVariant","positionalKeys","MAX_VELOCITY_DELTA","isFloat","MotionValue","currentTime","dependent","prevFrameValue","subscription","eventName","unsubscribe","eventManagers","passiveEffect","stopPassiveEffect","prev","endAnimation","startAnimation","isKeyframesTarget","setMotionValue","resolveFinalValueInKeyframes","setTarget","transitionEnd","isMotionValue","isWillChangeMotionValue","addValueToWillChange","willChange","newWillChange","camelToDash","str","optimizedAppearDataId","optimizedAppearDataAttribute","getOptimisedAppearId","shouldBlockAnimation","protectedKeys","needsAnimating","shouldBlock","animateTarget","targetAndTransition","transitionOverride","defaultTransition","reduceMotion","animations","animationTypeState","valueTarget","appearId","shouldReduceMotion","applyTransitionEnd","animateVariant","getAnimation","getChildAnimations","forwardDelay","animateChildren","when","first","last","animateVisualElement","resolvedDefinition","auto","testValueType","dimensionValueTypes","findDimensionValueType","isNone","maxDefaults","applyDefaultFilter","defaultValue","functionRegex","filter","functions","mask","int","transformValueTypes","numberValueTypes","defaultValueTypes","getDefaultValueType","customTypes","defaultValueType","invalidTemplates","makeNoneKeyframesAnimatable","noneKeyframeIndexes","animatableTemplate","noneIndex","DOMKeyframesResolver","originType","targetType","originHasVar","targetHasVar","measureKeyframe","finalKeyframeIndex","unsetTransformName","unsetTransformValue","resolveElements","elementOrSelector","scope","selectorCache","elements","getValueAsType","isHTMLElement","microtask","isDragging","isDragActive","setDragLock","axis","setupGesture","gestureAbortController","eventOptions","isValidHover","hover","onHoverStart","cancel","isPressed","deferredHoverEnd","hoverEndCallback","removePointerLeave","onPointerLeave","endHover","onPointerUp","onPointerDown","leaveEvent","onPointerEnter","enterEvent","onHoverEnd","isNodeOrChild","parent","isPrimaryPointer","keyboardAccessibleElements","isElementKeyboardAccessible","textInputElements","isElementTextInput","isPressing","filterEvents","firePointerEvent","enableKeyboardPress","focusEvent","handleKeydown","handleKeyup","handleBlur","isValidPressEvent","claimedPointerDownEvents","press","targetOrSelector","onPressStart","targets","cancelEvents","startPress","startEvent","onPressEnd","onPointerEnd","endEvent","success","onPointerCancel","upEvent","cancelEvent","isSVGElement","resizeHandlers","observer","getSize","borderBoxAxis","svgAxis","htmlAxis","borderBoxSize","getWidth","getHeight","notifyTarget","notifyAll","entries","createResizeObserver","resizeElement","elementHandlers","windowCallbacks","windowResizeHandler","createWindowResizeHandler","resizeWindow","resize","isSVGSVGElement","valueTypes","findValueType","createAxisDelta","createDelta","createAxis","createBox","visualElementStore","isAnimationControls","isVariantLabel","variantPriorityOrder","variantProps","isControllingVariants","isVariantNode","updateMotionValuesFromProps","nextValue","prevValue","existingValue","latestValue","prefersReducedMotion","hasReducedMotionListener","initPrefersReducedMotion","motionMediaQuery","setReducedMotionPreferences","propEventHandlers","featureDefinitions","setFeatureDefinitions","definitions","getFeatureDefinitions","VisualElement","_props","_prevProps","_visualElement","presenceContext","reducedMotionConfig","skipAnimations","blockInitialAnimation","visualState","latestValues","renderState","initialMotionValues","remove","feature","factory","cleanup","valueIsTransform","removeOnChange","removeSyncCheck","other","featureDefinition","isEnabled","FeatureConstructor","listenerName","listener","closestVariantNode","initial","valueFromInitial","args","DOMVisualElement","vars","Feature","node","convertBoundingBoxToBox","right","bottom","convertBoxToBoundingBox","transformBoxPoints","point","transformPoint","topLeft","bottomRight","isIdentityScale","hasScale","hasTransform","has2DTranslate","is2DTranslate","scalePoint","originPoint","distanceFromOrigin","scaled","applyPointDelta","translate","boxScale","applyAxisDelta","applyBoxDelta","box","TREE_SCALE_SNAP_MIN","TREE_SCALE_SNAP_MAX","applyTreeDeltas","treeScale","treePath","isSharedTransition","treeLength","translateAxis","transformBox","distance","transformAxis","axisTranslate","axisScale","axisOrigin","resolveAxisTranslate","sourceBox","resolveBox","measureViewportBox","measurePageBox","rootProjectionNode","transformPagePoint","viewportBox","scroll","translateAlias","numTransforms","buildTransform","transformString","transformIsDefault","valueIsDefault","valueAsType","transformName","buildHTMLStyles","transformOrigin","hasTransformOrigin","originX","originY","originZ","renderHTML","styleProp","projection","elementStyle","pixelsToPercent","pixels","correctBorderRadius","correctBoxShadow","projectionDelta","original","xScale","yScale","averageScale","scaleCorrectors","isForcedMotionValue","layout","layoutId","scrapeMotionValuesFromProps","prevProps","prevStyle","newValues","getComputedStyle","HTMLVisualElement","computedStyle","dashKeys","camelKeys","buildSVGPath","attrs","length","spacing","useDashCase","cssMotionPathProperties","buildSVGAttrs","attrX","attrY","attrScale","pathLength","pathSpacing","pathOffset","isSVGTag","camelCaseAttributes","tag","renderSVG","_styleProp","scrapeMotionValuesFromProps$1","targetKey","SVGVisualElement","defaultType","numVariantProps","getVariantContext","context","prop","shallowCompare","prevLength","reversePriorityOrder","numAnimationTypes","createAnimateFunction","createAnimationState","animate","createState","isInitialRender","wasReset","buildResolvedTypeValues","setAnimateFunction","makeAnimator","animateChanges","changedActiveType","removedKeys","encounteredKeys","removedVariantIndex","typeState","propIsVariant","activeDelta","isInherited","variantDidChange","checkVariantsDidChange","shouldAnimateType","handledRemovedValues","definitionList","resolvedValues","prevResolvedValues","allKeys","markToAnimate","valueHasChanged","willAnimateViaParent","parentVariant","fallbackAnimation","initialTransition","fallbackTarget","shouldAnimate","setActive","isActive","createTypeState","copyAxisInto","originAxis","copyBoxInto","originBox","copyAxisDeltaInto","originDelta","SCALE_PRECISION","SCALE_MIN","SCALE_MAX","TRANSLATE_PRECISION","TRANSLATE_MIN","TRANSLATE_MAX","calcLength","isNear","maxDistance","calcAxisDelta","calcBoxDelta","calcRelativeAxis","relative","anchor","anchorPoint","calcRelativeBox","calcRelativeAxisPosition","calcRelativePosition","removePointDelta","removeAxisDelta","sourceAxis","removeAxisTransforms","transforms","scaleKey","originKey","xKeys","yKeys","removeBoxTransforms","isAxisDeltaZero","isDeltaZero","axisEquals","boxEquals","axisEqualsRounded","boxEqualsRounded","axisDeltaEquals","eachAxis","buildProjectionTransform","latestTransform","xTranslate","yTranslate","zTranslate","transformPerspective","rotateX","rotateY","skewX","skewY","elementScaleX","elementScaleY","borderLabels","numBorders","asNumber","isPx","mixValues","follow","lead","shouldCrossfadeOpacity","isOnlyMember","easeCrossfadeIn","easeCrossfadeOut","borderLabel","followRadius","getRadius","leadRadius","radiusName","compress","animateSingleValue","motionValue$1","addDomEvent","compareByDepth","FlatTree","timeout","start","checkElapsed","resolveMotionValue","NodeStack","member","inst","prevLead","preserveFollowOpacity","prevDep","nextDep","globalProjectionState","transformAxes","animationTarget","resetDistortingTransform","sharedAnimationValues","cancelTreeOptimisedTransformAnimations","projectionNode","createProjectionNode","attachResizeListener","defaultParent","measureScroll","checkIsScrollRoot","resetTransform","propagateDirtyNodes","resolveTargetDelta","calcProjection","cleanDirtyNodes","subscriptionManager","cancelDelay","innerWidth","resizeUnblockUpdate","newInnerWidth","finishAnimation","hasLayoutChanged","hasRelativeLayoutChanged","newLayout","layoutTransition","defaultLayoutTransition","onLayoutAnimationStart","onLayoutAnimationComplete","hasTargetChanged","hasOnlyRelativeTargetChanged","animationOptions","stack","resetSkewAndRotation","shouldNotifyListeners","wasBlockedByResize","forceLayoutMeasure","clearMeasurements","clearIsLayoutDirty","ensureDraggedNodesSnapshotted","resetTransformStyle","updateLayout","notifyLayoutUpdate","clearSnapshot","removeLeadSnapshots","prevLayout","phase","needsMeasurement","isRoot","isResetRequested","hasProjection","transformTemplateValue","transformTemplateHasChanged","removeTransform","pageBox","layoutBox","roundBox","checkNodeWasScrollRoot","boxWithoutScroll","transformOnly","withTransforms","boxWithoutTransform","forceRecalculation","isShared","relativeParent","parentLayout","canSkip","prevTreeScaleX","prevTreeScaleY","snapshot","snapshotLatestValues","mixedValues","targetDelta","relativeLayout","snapshotSource","layoutSource","isSharedLayoutAnimation","hasOpacityCrossfade","prevRelativeTarget","mixAxisDelta","mixBox","targetWithTransforms","shouldAnimatePositionOnly","xLength","yLength","config","needsReset","hasDistortingTransform","resetValues","targetStyle","valuesToRender","correct","applyTo","isCSSVariable","corrected","num","measuredLayout","animationType","axisSnapshot","snapAxis","layoutDelta","visualDelta","parentSnapshot","relativeSnapshot","onExitComplete","mixAxis","userAgentContains","string","roundPoint","roundAxis","DocumentProjectionNode","notify","HTMLProjectionNode","documentNode","MotionConfigContext","setRef","composeRefs","refs","hasCleanup","cleanups","useComposedRefs","PopChildMeasure","parentWidth","parentHeight","PopChild","isPresent","anchorX","anchorY","pop","useId","nonce","useContext","childRef","composedRef","useInsertionEffect","PresenceChild","presenceAffectsLayout","mode","presenceChildren","newChildrenMap","isReusedContext","childId","isComplete","usePresence","subscribe","register","safeToRemove","useCallback","getChildKey","onlyElements","filtered","Children","isValidElement","AnimatePresence","propagate","isParentPresent","presentChildren","presentKeys","pendingPresentChildren","exitComplete","exitingComponents","diffedChildren","setDiffedChildren","renderedChildren","setRenderedChildren","exitingChildren","nextChildren","forceRender","onExit","isEveryExitComplete","isExitComplete","LazyContext","featureProps","isInitialized","initFeatureDefinitions","initialFeatureDefinitions","getInitializedFeatureDefinitions","loadFeatures","features","validMotionProps","isValidMotionProp","shouldForward","loadExternalIsValidProp","isValidProp","filterProps","isDom","forwardMotionProps","filteredProps","MotionContext","getCurrentTreeVariants","useCreateMotionContext","variantLabelsAsDependency","createHtmlRenderState","copyRawValuesOnly","useInitialMotionValues","useStyle","useHTMLProps","htmlProps","createSvgRenderState","useSVGProps","_isStatic","Component","visualProps","rawStyles","lowercaseSVGElements","isSVGComponent","useRender","isStatic","isSVG","elementProps","createElement","makeState","createRenderState","makeLatestValues","scrapeMotionValues","motionValues","isControllingVariants$1","isVariantNode$1","isInitialAnimationBlocked","variantToSet","list","makeUseVisualState","make","useHTMLVisualState","scrapeHTMLMotionValuesFromProps","useSVGVisualState","scrapeSVGMotionValuesFromProps","motionComponentSymbol","useMotionRef","externalRef","externalRefContainer","refCleanup","SwitchLayoutGroupContext","isRefObject","useVisualElement","createVisualElement","ProjectionNodeConstructor","lazyContext","motionConfig","visualElementRef","hasMountedOnce","initialLayoutGroupConfig","isMounted","optimisedAppearId","wantsHandoff","initialPromotionConfig","drag","dragConstraints","layoutScroll","layoutRoot","layoutAnchor","layoutCrossfade","getClosestProjectingNode","createMotionComponent","preloadedFeatures","useVisualState","MotionDOMComponent","MeasureLayout","configAndProps","useLayoutId","useStrictMode","layoutProjection","getProjectionFunctionality","ForwardRefMotionComponent","layoutGroupId","isStrict","strictMessage","combined","createMotionProxy","componentCache","deprecatedFactoryFunction","_target","createDomVisualElement","AnimationFeature","prevAnimate","ExitAnimationFeature","prevIsPresent","exitAnimation","extractEventInfo","addPointerInfo","addPointerEvent","getContextWindow","distance2D","xDelta","yDelta","overflowStyles","PanSession","handlers","contextWindow","dragSnapToOrigin","distanceThreshold","getPanInfo","isPanStarted","isDistancePastThreshold","onStart","onMove","onEnd","onSessionEnd","resumeAnimation","panInfo","initialInfo","onSessionStart","isWindow","subtractPoint","history","lastDevicePoint","startDevicePoint","getVelocity","timeDelta","timestampedPoint","lastPoint","applyConstraints","elastic","calcRelativeAxisConstraints","calcRelativeConstraints","calcViewportAxisConstraints","layoutAxis","constraintsAxis","calcViewportConstraints","constraintsBox","calcOrigin","sourceLength","targetLength","rebaseAxisConstraints","constraints","relativeConstraints","defaultElastic","resolveDragElastic","dragElastic","resolveAxisElastic","minLabel","maxLabel","resolvePointElastic","elementDragControls","VisualElementDragControls","originEvent","snapToCursor","dragPropagation","onDragStart","measuredAxis","animationState","dragDirectionLock","onDirectionLock","onDrag","getCurrentDirection","snap","finalEvent","finalPanInfo","onDragEnd","_point","shouldDrag","axisValue","prevConstraints","onMeasureDragConstraints","constraintsElement","measuredConstraints","userConstraints","dragMomentum","dragTransition","onDragTransitionEnd","momentumAnimations","dragKey","externalMotionValue","boxProgress","stopPointerListener","dragListener","isClickingTextInputChild","stopResizeObservers","measureDragConstraints","startResizeObservers","stopMeasureLayoutListener","stopResizeListener","stopLayoutUpdateListener","skipFirstCall","isFirst","onResize","stopElement","stopContainer","direction","currentDirection","lockThreshold","DragGesture","dragControls","prevDragControls","asyncHandler","PanGesture","pointerDownEvent","onPanSessionStart","onPanStart","onPan","onPanEnd","hasTakenAnySnapshot","MeasureLayoutWithContext","layoutGroup","switchLayoutGroup","layoutDependency","promoteContext","handleHoverEvent","lifecycle","HoverGesture","_element","FocusGesture","isFocusVisible","handlePressEvent","PressGesture","globalTapTarget","observerCallbacks","observers","fireObserverCallback","entry","fireAllObserverCallbacks","initIntersectionObserver","lookupRoot","rootObservers","observeIntersection","rootInteresectionObserver","thresholdNames","InViewFeature","viewport","rootMargin","amount","once","onIntersectionUpdate","isIntersecting","onViewportEnter","onViewportLeave","hasViewportOptionChanged","prevViewport","gestureAnimations","featureBundle","motion","Dropdown","trigger","controlledOpen","onOpenChange","align","closeOnClick","menuClassName","triggerClassName","menuListClassName","itemIconClassName","itemLabelClassName","menuStyle","internalOpen","setInternalOpen","coords","setCoords","position","setPosition","isControlled","open","dropdownRef","menuRef","menuId","setOpenRef","val","setOpen","handleOutside","handleEscape","updatePosition","triggerRect","menuHeight","spaceBottom","spaceTop","shouldOpenTop","maxLeft","setRefs","menu","createPortal","ToastStore","handle","toastData","existingIndex","store","base","promise","messages","data","error","toast","useToast","POSITION_CLASSES","ToastProvider","maxToasts","containerClassName","toasts","setToasts","ToastItem","variantStyles","IconMap","CheckCircle","AlertCircle","AlertTriangle","Info","Loader2","onClose","closeButtonClassName","DefaultIcon","X","Accordion","allowMultiple","defaultOpen","contentWrapperClassName","contentWrapperStyle","hoverClassName","hoverStyle","borderColor","iconOpen","iconClose","openIndexes","setOpenIndexes","accordionId","ChevronUp","Checkbox","selectedValues","onChange","checked","onCheckedChange","readOnly","required","labelClassName","checkClassName","errorClassName","containerStyle","labelStyle","errorStyle","customIcon","iconSize","containerRef","focusedIndex","setFocusedIndex","generatedId","errorId","handleGroupChange","updated","handleSingleChange","isChecked","option","focused","RadioGroup","selectedValue","iconWrapperClassName","iconWrapperStyle","indicatorClassName","indicatorStyle","orientation","animationDuration","currentSize","groupName","Switch","switchClassName","thumbClassName","switchStyle","thumbStyle","trackWidth","trackHeight","thumbInset","thumbSize","renderSwitch","onToggle","inputValue","isRequired","lockCount","previousOverflow","previousPaddingRight","lock","body","documentElement","scrollbarWidth","unlock","useScrollLock","active","FOCUSABLE","useFocusTrap","container","previouslyFocused","focusable","el","activeEl","Drawer","isOpen","renderContent","disableOverlayClose","disableEscapeClose","panelClassName","panelRef","escapeDisabled","onCloseRef","handleEsc","getMotion","getSizeStyle","handleOverlayClick","motionProps","DrawerContent","DrawerBody","DrawerHeader","titleWrapperClassName","DrawerFooter","DrawerTriggerButton","drawerContent","drawerProps","DrawerButton","Select","onValueChange","placeholder","helperText","multiple","showDescription","showCheckIcon","LabelIcon","PrefixIcon","DropdownIcon","searchClassName","searchStyle","searchPlaceholder","searchable","maxDropdownHeight","valueClassName","dropdownClassName","helperClassName","labelIconClassName","searchWrapperClassName","emptyClassName","itemDescriptionClassName","itemIconStyle","checkIconClassName","checkIconStyle","triggerStyle","dropdownStyle","useImperativeHandle","generatedHelperTextId","search","setSearch","internalValue","setInternalValue","triggerRef","listRef","searchRef","sizeConfig","filteredOptions","opt","rect","selectedIndex","newValue","selectedLabels","hasError","hasValue","helperTextId","triggerId","labelId","dropdownListStyle","Check","SIZE_CONFIG","Input","onFocus","onBlur","prefix","suffixIcon","maxLength","rows","wrapperClassName","inputClassName","textareaClassName","prefixClassName","suffixClassName","helperTextClassName","wrapperStyle","inputStyle","inputRef","fieldId","describedBy","localValue","setLocalValue","visible","setVisible","hasPrefixIcon","hasPrefixText","hasPrefix","handleChange","hasSuffix","getPadding","baseInputStyles","EyeOff","Eye","Textarea","Icon","autoResize","minRows","maxRows","submitOnEnter","onSubmit","helperStyle","innerRef","resizeTextarea","lineHeight","minHeight","maxHeight","newHeight","currentLength","showCount","Modal","dialogClassName","dialogRef","pressedOnOverlay","ModalContent","maxWidth","showCloseButton","closeButtonStyle","hasCloseButton","ModalHeader","ModalBody","ModalFooter","ModalButton","action","pending","setPending","handleClick","err","ModalTriggerButton","modalContent","modalProps","Table","tableClassName","tableStyle","responsive","striped","hoverable","bordered","dense","THead","TBody","TRow","TH","TD","useBreakpoint","breakpoint","isMobile","setIsMobile","mq","TabsContext","useTabsContext","ctx","Tabs","defaultActive","transitionDuration","mobileBreakpoint","mobileVariant","backgroundColor","primaryColor","activeColor","textColor","hoverColor","disabledColor","onTabChange","tabCount","resolvedCount","setResolvedCount","drawerOpen","setDrawerOpen","handleSetActive","effectivePosition","isVertical","ChevronIcon","TabList","gap","drawerLabel","activeLabel","Tab","selfIndexRef","buttonRef","resolvedIndex","idx","forceFullWidth","baseVariant","activeVariant","hoverVariant","TabPanels","TabPanel","keepMounted","ThemeToggleButton","sunClassName","moonClassName","isDark","toggleTheme","Sun","Moon","paddingContext","SECTION_PADDING","Card","CardHeader","actionClassName","CardBody","CardFooter","H_SPACING","V_SPACING","Divider","dashed","lineClassName","SIZES","COLORS","Chip","onRemove","removeButtonClassName","removeIconClassName","palette","Kbd","Skeleton","lines","animated","Spinner","colorClassName","LINEAR_SIZES","CIRCULAR_SIZES","Progress","showValue","trackClassName","fillClassName","indeterminate","clamped","ariaProps","stroke","circumference","Stat","trend","trendValue","footerClassName","trendClassName","trendIconClassName","TrendIcon","TrendingUp","TrendingDown","Minus","EmptyState","Inbox","DOT","Timeline","connectorClassName","timeClassName","compact","status","isLast","Breadcrumb","separator","maxItems","activeItemClassName","ellipsisClassName","MoreHorizontal","buildRange","page","totalPages","siblingCount","maxVisible","end","showLeftEllipsis","showRightEllipsis","middle","Pagination","onPageChange","prevButtonClassName","nextButtonClassName","pageButtonClassName","activePageButtonClassName","clampedPage","go","baseButton","ChevronLeft","Stepper","activeStep","onStepClick","dotButtonClassName","vertical","renderDot","dot","POSITIONS","ARROWS","Tooltip","arrowClassName","tooltipId","timer","show","hide","onKey","Popover","closeOnClickOutside","closeOnEscape","panelId","rootRef","onMouseDown","onKeyDown","TRACK","Slider","formatValue","marks","labelRowClassName","marksClassName","markClassName","sliderId","internal","setInternal","mark","markPercent","NumberInput","inputWrapperClassName","decrementButtonClassName","incrementButtonClassName","raw","setRaw","displayed","commit","nudge","handleInput","stepperButton","Plus","Rating","allowClear","starClassName","emptyStarClassName","starWrapperClassName","hovered","setHovered","starSize","select","Star","starValue","filled","TagInput","maxTags","validate","addOnBlur","chipClassName","chipRemoveClassName","draft","setDraft","tags","atLimit","addTag","removeTag","PinInput","autoFocus","boxClassName","groupId","inputsRef","chars","allowed","setChar","char","focusBox","handlePaste","formatBytes","bytes","FileUpload","onFilesChange","onError","accept","maxSizeMB","maxFiles","hideFileList","dropzoneClassName","fileItemClassName","fileIconClassName","fileNameClassName","fileSizeClassName","inputId","files","setFiles","dragging","setDragging","setMessage","addFiles","incoming","file","msg","removeFile","UploadCloud","FileIcon","STYLES","Callout","dismissible","onDismiss","hidden","setHidden","Toggle","pressed","defaultPressed","onPressedChange","ToggleGroup","isSelected","selected","ICON_ONLY","CopyButton","feedbackDuration","onCopied","copied","setCopied","copy","textarea","Copy","COUNTER_SIZES","AvatarGroup","counterClassName","overflow","isSameDay","stripTime","Calendar","defaultMonth","minDate","maxDate","isDateDisabled","weekStartsOn","locale","navButtonClassName","monthLabelClassName","weekdaysClassName","weekdayClassName","daysClassName","dayClassName","viewMonth","setViewMonth","today","date","shiftMonth","m","firstOffset","cells","weekdays","monthLabel","day","outside","isToday","DatePicker","formatDate","clearable","calendarProps","clearButtonClassName","clearIconClassName","display","CalendarIcon","Carousel","defaultIndex","onIndexChange","autoPlay","loop","showArrows","showDots","slidesClassName","slideClassName","prevArrowClassName","nextArrowClassName","arrowIconClassName","dotsClassName","slides","setIndex","paused","setPaused","touchStartX","goTo","arrowClasses","slide"],"mappings":"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","x_google_ignoreList":[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271]}