@zyncat/ui 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/alert.js +5 -6
  2. package/dist/alert.js.map +1 -1
  3. package/dist/chunk-2QWJ6FAX.js +78 -0
  4. package/dist/chunk-2QWJ6FAX.js.map +1 -0
  5. package/dist/{chunk-MXOPCFWR.js → chunk-356HZMT4.js} +25 -4
  6. package/dist/chunk-356HZMT4.js.map +1 -0
  7. package/dist/{chunk-2HORSLXJ.js → chunk-7RNRLIKT.js} +16 -7
  8. package/dist/chunk-7RNRLIKT.js.map +1 -0
  9. package/dist/{chunk-4R2GQO43.js → chunk-FLO4A6BI.js} +4 -4
  10. package/dist/{chunk-4R2GQO43.js.map → chunk-FLO4A6BI.js.map} +1 -1
  11. package/dist/{chunk-XZAEIQDR.js → chunk-GLT5IKQY.js} +5 -5
  12. package/dist/{chunk-XZAEIQDR.js.map → chunk-GLT5IKQY.js.map} +1 -1
  13. package/dist/{chunk-QMSJZCK3.js → chunk-Q5B7JTSR.js} +5 -5
  14. package/dist/{chunk-QMSJZCK3.js.map → chunk-Q5B7JTSR.js.map} +1 -1
  15. package/dist/{chunk-O4N2OBTR.js → chunk-W5YM2FV4.js} +4 -4
  16. package/dist/{chunk-O4N2OBTR.js.map → chunk-W5YM2FV4.js.map} +1 -1
  17. package/dist/{chunk-MKIQFK7S.js → chunk-WM5J5TDI.js} +3 -3
  18. package/dist/{chunk-MKIQFK7S.js.map → chunk-WM5J5TDI.js.map} +1 -1
  19. package/dist/{chunk-W3SHPKSB.js → chunk-XWUWYSCT.js} +16 -6
  20. package/dist/chunk-XWUWYSCT.js.map +1 -0
  21. package/dist/{chunk-L3Q3VDIW.js → chunk-YGCVWGUG.js} +6 -32
  22. package/dist/chunk-YGCVWGUG.js.map +1 -0
  23. package/dist/date-field.js +7 -7
  24. package/dist/date-range-field.js +31 -12
  25. package/dist/date-range-field.js.map +1 -1
  26. package/dist/datetime-field.js +7 -7
  27. package/dist/dialog.js +4 -4
  28. package/dist/glide.js +2 -2
  29. package/dist/motion-devtools.js +1 -1
  30. package/dist/multi-select.js +5 -5
  31. package/dist/pagination.js +1 -1
  32. package/dist/popover.js +4 -4
  33. package/dist/radio-group.js +36 -9
  34. package/dist/radio-group.js.map +1 -1
  35. package/dist/select.js +5 -5
  36. package/dist/sheet.js +5 -5
  37. package/dist/table.js +6 -6
  38. package/dist/table.js.map +1 -1
  39. package/dist/tabs.js +2 -2
  40. package/dist/tag.js +7 -7
  41. package/dist/tag.js.map +1 -1
  42. package/dist/toast.js +4 -5
  43. package/dist/toast.js.map +1 -1
  44. package/dist/tooltip.js +3 -3
  45. package/llms.txt +6 -6
  46. package/package.json +2 -1
  47. package/src/components/composites/date-picker/calendar-panel.tsx +12 -3
  48. package/src/components/composites/date-picker/range-panel.tsx +19 -5
  49. package/src/components/composites/table/Table.tsx +4 -2
  50. package/src/components/primitives/radio-group/RadioGroup.tsx +26 -7
  51. package/src/components/primitives/tag/Tag.tsx +2 -1
  52. package/src/engine/ease.ts +7 -39
  53. package/src/engine/index.ts +1 -11
  54. package/src/motion/element.tsx +9 -9
  55. package/src/motion/flip.ts +61 -0
  56. package/src/motion/presence-context.ts +4 -3
  57. package/src/motion/presence.tsx +25 -1
  58. package/src/motion/use-motion.ts +13 -2
  59. package/dist/chunk-2HORSLXJ.js.map +0 -1
  60. package/dist/chunk-36WVAQKL.js +0 -40
  61. package/dist/chunk-36WVAQKL.js.map +0 -1
  62. package/dist/chunk-JSKXZMLH.js +0 -67
  63. package/dist/chunk-JSKXZMLH.js.map +0 -1
  64. package/dist/chunk-L3Q3VDIW.js.map +0 -1
  65. package/dist/chunk-MXOPCFWR.js.map +0 -1
  66. package/dist/chunk-W3SHPKSB.js.map +0 -1
  67. package/src/motion/flip.tsx +0 -87
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/select/core/types.ts","../src/components/composites/select/core/use-listbox.ts","../src/components/composites/select/core/trigger.tsx","../src/components/composites/select/core/menu.tsx","../src/components/composites/select/core/panel.tsx"],"names":["useRef","useLayoutEffect","jsx","jsxs","useMemo"],"mappings":"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","file":"chunk-QMSJZCK3.js","sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface SelectOption {\n /** The stored value - what `onChange` returns and `value` matches; must be unique. */\n value: string;\n /** Primary row text, and the trigger label once selected; also matched by `searchable`. */\n label: ReactNode;\n /** Optional secondary line under the label; also matched by `searchable`. */\n description?: string;\n /** Your own icon node shown before the label. */\n icon?: ReactNode;\n /** Not selectable - skipped by keyboard nav and typeahead, and marked `aria-disabled`. @default false */\n disabled?: boolean;\n}\nexport interface SelectGroup {\n /** Section heading rendered above the options; omit for an unlabeled group. */\n label?: string;\n /** The options in this section. */\n options: SelectOption[];\n}\n\nexport interface NormalizedGroup {\n label: string | null | undefined;\n options: SelectOption[];\n}\n\nexport function normalize(options: SelectOption[] | SelectGroup[]): {\n groups: NormalizedGroup[];\n flat: SelectOption[];\n} {\n const grouped = options.length > 0 && options[0] && Array.isArray((options[0] as SelectGroup).options);\n const groups: NormalizedGroup[] = grouped\n ? (options as SelectGroup[]).map((g) => ({ label: g.label, options: g.options || [] }))\n : [{ label: null, options: options as SelectOption[] }];\n return { groups, flat: groups.flatMap((g) => g.options) };\n}\n\nexport const matches = (o: SelectOption, q: string) =>\n !q || (o.label + ' ' + (o.description || '')).toLowerCase().includes(q.toLowerCase());\n","'use client';\n\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { useGlide } from '../../../../motion/glide';\nimport { normalize, matches, type SelectOption, type SelectGroup } from './types';\n\nexport interface UseListboxArgs {\n options: SelectOption[] | SelectGroup[];\n disabled: boolean;\n loading: boolean;\n searchable: boolean;\n id?: string;\n idPrefix: string;\n isSelected: (value: string) => boolean;\n onCommit: (opt: SelectOption) => void;\n closeOnCommit: boolean;\n}\n\nexport type ListboxState = ReturnType<typeof useListbox>;\n\nexport function useListbox({\n options,\n disabled,\n loading,\n searchable,\n id,\n idPrefix,\n isSelected,\n onCommit,\n closeOnCommit,\n}: UseListboxArgs) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIdx, setActiveIdx] = useState(-1);\n const typeahead = useRef<{ buf: string; t: ReturnType<typeof setTimeout> | number }>({ buf: '', t: 0 });\n\n const triggerRef = useRef<HTMLButtonElement>(null),\n listRef = useRef<HTMLDivElement>(null),\n searchRef = useRef<HTMLInputElement>(null);\n const autoId = useId();\n const baseId = id || idPrefix + autoId;\n const menuId = baseId + '-menu';\n const listId = baseId + '-list';\n const glide = useGlide(listRef);\n\n const { groups, flat } = useMemo(() => normalize(options), [options]);\n const navItems = useMemo(() => flat.filter((o) => matches(o, query)), [flat, query]);\n\n const show = () => {\n if (!disabled && !loading) setOpen(true);\n };\n const requestClose = () => setOpen(false);\n const returnFocus = () => triggerRef.current && triggerRef.current.focus();\n\n function commit(opt: SelectOption) {\n if (!opt || opt.disabled) return;\n onCommit(opt);\n if (closeOnCommit) {\n requestClose();\n returnFocus();\n }\n }\n\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const sel = navItems.findIndex((o) => isSelected(o.value) && !o.disabled);\n const first = navItems.findIndex((o) => !o.disabled);\n setActiveIdx(sel >= 0 ? sel : first);\n const ref = searchable ? searchRef : listRef;\n setTimeout(() => {\n if (ref.current) ref.current.focus();\n }, 0);\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const list = listRef.current;\n if (!open || activeIdx < 0 || !list) return;\n const el = list.querySelector('[data-idx=\"' + activeIdx + '\"]') as HTMLElement | null;\n if (!el) return;\n if (el.offsetTop < list.scrollTop) list.scrollTop = el.offsetTop;\n else if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)\n list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;\n }, [activeIdx, open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useLayoutEffect(() => {\n const list = listRef.current;\n const el = open && activeIdx >= 0 && list && list.querySelector<HTMLElement>('[data-idx=\"' + activeIdx + '\"]');\n if (el) glide.enter(el);\n else glide.leave();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, activeIdx, query]);\n\n function moveActive(dir: number) {\n if (!navItems.length) return;\n let i = activeIdx;\n for (let s = 0; s < navItems.length; s++) {\n i = (i + dir + navItems.length) % navItems.length;\n if (!navItems[i].disabled) return setActiveIdx(i);\n }\n }\n function edgeActive(toEnd: boolean) {\n const order = [...navItems.keys()];\n if (toEnd) order.reverse();\n for (const i of order) if (!navItems[i].disabled) return setActiveIdx(i);\n }\n function typeAhead(ch: string) {\n const ta = typeahead.current;\n clearTimeout(ta.t);\n ta.buf += ch.toLowerCase();\n ta.t = setTimeout(() => (ta.buf = ''), 600);\n const i = navItems.findIndex((o) => !o.disabled && o.value.toLowerCase().startsWith(ta.buf));\n if (i >= 0) setActiveIdx(i);\n }\n\n function onMenuKeyDown(e: KeyboardEvent) {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n requestClose();\n returnFocus();\n break;\n case 'ArrowDown':\n e.preventDefault();\n moveActive(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n moveActive(-1);\n break;\n case 'Home':\n e.preventDefault();\n edgeActive(false);\n break;\n case 'End':\n e.preventDefault();\n edgeActive(true);\n break;\n case 'Enter':\n e.preventDefault();\n if (activeIdx >= 0) commit(navItems[activeIdx]);\n break;\n case 'Tab':\n requestClose();\n break;\n default:\n if (!searchable && e.key.length === 1 && !e.metaKey && !e.ctrlKey) typeAhead(e.key);\n }\n }\n\n const optId = (value: string) => baseId + '-opt-' + encodeURIComponent(value);\n const active = activeIdx >= 0 ? navItems[activeIdx] : undefined;\n const adId = open && active ? optId(active.value) : undefined;\n\n return {\n open,\n query,\n setQuery,\n triggerRef,\n listRef,\n searchRef,\n baseId,\n menuId,\n listId,\n optId,\n adId,\n groups,\n flat,\n navItems,\n glide,\n isSelected,\n show,\n requestClose,\n commit,\n activeIdx,\n setActiveIdx,\n onMenuKeyDown,\n };\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { Icon } from '../../../internal/icon/Icon';\nimport { IconSlot } from '../../../internal/icon/IconSlot';\nimport type { ListboxState } from './use-listbox';\nimport { Button, ButtonProps } from '../../../primitives/button/Button';\n\nexport interface SelectTriggerProps extends ButtonProps {\n lb: ListboxState;\n invalid?: boolean;\n ariaLabel?: string;\n leading?: ReactNode;\n text?: ReactNode;\n isPlaceholder?: boolean;\n count?: number;\n}\n\nexport function SelectTrigger({\n lb,\n invalid,\n ariaLabel,\n leading,\n text,\n isPlaceholder,\n count,\n htmlProps,\n ...rest\n}: SelectTriggerProps) {\n const { triggerRef, baseId, open, adId, show, requestClose } = lb;\n return (\n <Button\n type=\"button\"\n ref={triggerRef}\n variant=\"ghost\"\n htmlProps={{\n id: baseId + '-trigger',\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-expanded': open,\n 'aria-controls': baseId + '-list',\n 'aria-activedescendant': adId,\n 'aria-label': ariaLabel,\n 'aria-invalid': invalid || undefined,\n onKeyDown: (e) => {\n if (!open && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault();\n show();\n }\n },\n ...htmlProps,\n }}\n onClick={() => (open ? requestClose() : show())}\n iconRight={\n <span className=\"select__caret\">\n <Icon name=\"caret-down\" size=\"sm\" />\n </span>\n }\n iconLeft={\n leading && (\n <span className=\"select__leading\">\n <IconSlot size=\"sm\">{leading}</IconSlot>\n </span>\n )\n }\n {...rest}\n >\n <span className=\"select__value\" data-placeholder={isPlaceholder ? 'true' : undefined}>\n {text}\n </span>\n {count != null && count > 0 && <span className=\"select__count\">+{count}</span>}\n </Button>\n );\n}\n","'use client';\n\nimport { useLayoutEffect, useRef, type ReactNode, type RefObject } from 'react';\nimport type { Layer } from '../../../../engine';\nimport { Presence } from '../../../../motion/presence';\nimport { useMotion, type MotionSpecs } from '../../../../motion/use-motion';\nimport { UIMotion, type MotionTransition } from '../../../../tokens/motion-tokens';\nimport { resolveMotionTiming } from '../../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../../motion/timing';\nimport { OverlayPortal, useOverlayEntry, useOutsidePress } from '../../../internal/overlay/layer';\nimport { useAnchorPosition } from '../../../internal/overlay/position';\n\nconst SELECT_MENU_TIMING = {\n open: { duration: 'base', ease: 'entrance' },\n close: { duration: 'base', ease: 'exit' },\n} as const;\n\nfunction selectMenuLayers(animation: DisableableAnimation | undefined, dir: 'open' | 'close'): Layer[] {\n const t = resolveMotionTiming(animation, SELECT_MENU_TIMING)[dir];\n const fade = (d: MotionTransition) => ({ duration: d.duration === 0 ? 0 : UIMotion.dur.fast, ease: d.ease });\n return dir === 'open'\n ? [\n { y: [-6, 0], scale: [0.96, 1], timing: t },\n { opacity: [0, 1], timing: fade(t) },\n ]\n : [\n { y: [-6], scale: [0.96], timing: t },\n { opacity: [0], timing: fade(t) },\n ];\n}\n\nexport interface SelectMenuProps {\n open: boolean;\n menuId: string;\n requestClose: () => void;\n triggerRef: RefObject<HTMLButtonElement | null>;\n multiple?: boolean;\n /** Open/close timing - motion tokens only, or `null` to disable. */\n animation?: DisableableAnimation;\n children?: ReactNode;\n}\n\nfunction MenuSurface({\n menuId,\n requestClose,\n triggerRef,\n multiple,\n animate,\n exit,\n children,\n}: Omit<SelectMenuProps, 'open' | 'animation'> & MotionSpecs) {\n const menuRef = useRef<HTMLDivElement>(null);\n const entry = useOverlayEntry({ nodeRef: menuRef, dismissible: true, requestClose });\n useMotion(menuRef, { animate, exit });\n useLayoutEffect(() => {\n const apply = () => {\n const t = triggerRef.current;\n if (t && menuRef.current) menuRef.current.style.minWidth = t.getBoundingClientRect().width + 'px';\n };\n apply();\n window.addEventListener('resize', apply);\n return () => window.removeEventListener('resize', apply);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n useAnchorPosition({ side: 'bottom', align: 'start', arrow: false, triggerRef, panelRef: menuRef });\n useOutsidePress({ entry, refs: [menuRef, triggerRef], enabled: true, onPress: requestClose });\n\n return (\n <div\n ref={menuRef}\n className=\"select__menu\"\n id={menuId}\n role=\"presentation\"\n data-multiple={multiple ? 'true' : undefined}\n >\n {children}\n </div>\n );\n}\n\nexport function SelectMenu({ open, menuId, requestClose, triggerRef, multiple, animation, children }: SelectMenuProps) {\n return (\n <OverlayPortal>\n <Presence>\n {open && (\n <MenuSurface\n key=\"menu\"\n animate={selectMenuLayers(animation, 'open')}\n exit={selectMenuLayers(animation, 'close')}\n menuId={menuId}\n requestClose={requestClose}\n triggerRef={triggerRef}\n multiple={multiple}\n >\n {children}\n </MenuSurface>\n )}\n </Presence>\n </OverlayPortal>\n );\n}\n","'use client';\n\nimport { Fragment, useMemo, type ReactNode } from 'react';\nimport { Icon } from '../../../internal/icon/Icon';\nimport { IconSlot } from '../../../internal/icon/IconSlot';\nimport { Collapse } from '../../../primitives/collapse/Collapse';\nimport { GlidePill } from '../../../../motion/glide';\nimport { SelectMenu } from './menu';\nimport type { ListboxState } from './use-listbox';\nimport type { DisableableAnimation } from '../../../../motion/timing';\nimport type { ButtonProps } from '../../../primitives/button/Button';\n\nexport interface ListboxPanelProps {\n lb: ListboxState;\n loading: boolean;\n searchable: boolean;\n searchPlaceholder?: string;\n ariaLabel?: string;\n multiple?: boolean;\n /** Menu open/close timing - motion tokens only, or `null` to disable. */\n animation?: DisableableAnimation;\n check?: (selected: boolean) => ReactNode;\n size?: ButtonProps['size'];\n}\n\nconst defaultCheck = (selected: boolean) => (selected ? <Icon key=\"on\" name=\"check\" size=\"sm\" weight=\"bold\" /> : null);\n\nfunction LoadingRows() {\n return (\n <div className=\"select__loading\" aria-busy=\"true\" aria-live=\"polite\">\n {[0, 1, 2].map((i) => (\n <div className=\"select__skeleton\" key={i}>\n <span className=\"select__skeleton-dot\" data-pulse></span>\n <span className=\"select__skeleton-bar\" data-pulse></span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction EmptyRow({ query }: { query: string }) {\n return <div className=\"select__empty\">{query ? 'No matches for \"' + query + '\"' : 'No options available'}</div>;\n}\n\nexport function ListboxPanel({\n lb,\n loading,\n searchable,\n searchPlaceholder,\n ariaLabel,\n multiple,\n animation,\n size = 'md',\n check = defaultCheck,\n}: ListboxPanelProps) {\n const navIndex = useMemo(() => new Map(lb.navItems.map((o, i) => [o.value, i] as const)), [lb.navItems]);\n return (\n <SelectMenu\n open={lb.open}\n menuId={lb.menuId}\n requestClose={lb.requestClose}\n triggerRef={lb.triggerRef}\n multiple={multiple}\n animation={animation}\n >\n {searchable && !loading && (\n <div className=\"select__search\">\n <Icon name=\"magnifying-glass\" size=\"sm\" />\n <input\n ref={lb.searchRef}\n className=\"select__search-input\"\n type=\"text\"\n value={lb.query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n aria-controls={lb.listId}\n aria-activedescendant={lb.adId}\n onChange={(e) => lb.setQuery(e.target.value)}\n onKeyDown={lb.onMenuKeyDown}\n />\n </div>\n )}\n\n <div\n className=\"select__list\"\n ref={lb.listRef}\n id={lb.listId}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n tabIndex={-1}\n aria-label={ariaLabel}\n onKeyDown={searchable ? undefined : lb.onMenuKeyDown}\n >\n <GlidePill className=\"select__glide\" glide={lb.glide} />\n {loading ? (\n <LoadingRows />\n ) : (\n <Fragment>\n {lb.groups.map((g, gi) => (\n <div className=\"select__group\" role=\"group\" aria-label={g.label || undefined} key={gi}>\n {g.label && g.options.some((o) => navIndex.has(o.value)) && (\n <div className=\"select__group-label\">{g.label}</div>\n )}\n {g.options.map((opt) => {\n const i = navIndex.get(opt.value) ?? -1;\n const visible = i !== -1;\n const isSel = lb.isSelected(opt.value);\n const row = (\n <div\n key={opt.value}\n id={visible ? lb.optId(opt.value) : undefined}\n data-idx={visible ? i : undefined}\n className=\"select__option\"\n role=\"option\"\n aria-selected={isSel}\n aria-hidden={!visible || undefined}\n aria-disabled={opt.disabled || undefined}\n data-selected={isSel ? 'true' : undefined}\n data-active={visible && i === lb.activeIdx ? 'true' : undefined}\n data-disabled={opt.disabled ? 'true' : undefined}\n onMouseEnter={() => visible && !opt.disabled && lb.setActiveIdx(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => visible && lb.commit(opt)}\n data-size={size}\n >\n {opt.icon && (\n <span className=\"select__option-icon\">\n <IconSlot size=\"sm\">{opt.icon}</IconSlot>\n </span>\n )}\n <span className=\"select__option-text\">\n <span className=\"select__option-label\">{opt.label}</span>\n {opt.description && <span className=\"select__option-desc\">{opt.description}</span>}\n </span>\n {check(isSel) ? <span className=\"select__option-check\">{check(isSel)}</span> : null}\n </div>\n );\n return searchable ? (\n <Collapse key={opt.value} open={visible} fade>\n {row}\n </Collapse>\n ) : (\n row\n );\n })}\n </div>\n ))}\n {lb.navItems.length === 0 && <EmptyRow query={lb.query} />}\n </Fragment>\n )}\n </div>\n </SelectMenu>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/composites/select/core/types.ts","../src/components/composites/select/core/use-listbox.ts","../src/components/composites/select/core/trigger.tsx","../src/components/composites/select/core/menu.tsx","../src/components/composites/select/core/panel.tsx"],"names":["useRef","useLayoutEffect","jsx","jsxs","useMemo"],"mappings":"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","file":"chunk-Q5B7JTSR.js","sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface SelectOption {\n /** The stored value - what `onChange` returns and `value` matches; must be unique. */\n value: string;\n /** Primary row text, and the trigger label once selected; also matched by `searchable`. */\n label: ReactNode;\n /** Optional secondary line under the label; also matched by `searchable`. */\n description?: string;\n /** Your own icon node shown before the label. */\n icon?: ReactNode;\n /** Not selectable - skipped by keyboard nav and typeahead, and marked `aria-disabled`. @default false */\n disabled?: boolean;\n}\nexport interface SelectGroup {\n /** Section heading rendered above the options; omit for an unlabeled group. */\n label?: string;\n /** The options in this section. */\n options: SelectOption[];\n}\n\nexport interface NormalizedGroup {\n label: string | null | undefined;\n options: SelectOption[];\n}\n\nexport function normalize(options: SelectOption[] | SelectGroup[]): {\n groups: NormalizedGroup[];\n flat: SelectOption[];\n} {\n const grouped = options.length > 0 && options[0] && Array.isArray((options[0] as SelectGroup).options);\n const groups: NormalizedGroup[] = grouped\n ? (options as SelectGroup[]).map((g) => ({ label: g.label, options: g.options || [] }))\n : [{ label: null, options: options as SelectOption[] }];\n return { groups, flat: groups.flatMap((g) => g.options) };\n}\n\nexport const matches = (o: SelectOption, q: string) =>\n !q || (o.label + ' ' + (o.description || '')).toLowerCase().includes(q.toLowerCase());\n","'use client';\n\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { useGlide } from '../../../../motion/glide';\nimport { normalize, matches, type SelectOption, type SelectGroup } from './types';\n\nexport interface UseListboxArgs {\n options: SelectOption[] | SelectGroup[];\n disabled: boolean;\n loading: boolean;\n searchable: boolean;\n id?: string;\n idPrefix: string;\n isSelected: (value: string) => boolean;\n onCommit: (opt: SelectOption) => void;\n closeOnCommit: boolean;\n}\n\nexport type ListboxState = ReturnType<typeof useListbox>;\n\nexport function useListbox({\n options,\n disabled,\n loading,\n searchable,\n id,\n idPrefix,\n isSelected,\n onCommit,\n closeOnCommit,\n}: UseListboxArgs) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIdx, setActiveIdx] = useState(-1);\n const typeahead = useRef<{ buf: string; t: ReturnType<typeof setTimeout> | number }>({ buf: '', t: 0 });\n\n const triggerRef = useRef<HTMLButtonElement>(null),\n listRef = useRef<HTMLDivElement>(null),\n searchRef = useRef<HTMLInputElement>(null);\n const autoId = useId();\n const baseId = id || idPrefix + autoId;\n const menuId = baseId + '-menu';\n const listId = baseId + '-list';\n const glide = useGlide(listRef);\n\n const { groups, flat } = useMemo(() => normalize(options), [options]);\n const navItems = useMemo(() => flat.filter((o) => matches(o, query)), [flat, query]);\n\n const show = () => {\n if (!disabled && !loading) setOpen(true);\n };\n const requestClose = () => setOpen(false);\n const returnFocus = () => triggerRef.current && triggerRef.current.focus();\n\n function commit(opt: SelectOption) {\n if (!opt || opt.disabled) return;\n onCommit(opt);\n if (closeOnCommit) {\n requestClose();\n returnFocus();\n }\n }\n\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const sel = navItems.findIndex((o) => isSelected(o.value) && !o.disabled);\n const first = navItems.findIndex((o) => !o.disabled);\n setActiveIdx(sel >= 0 ? sel : first);\n const ref = searchable ? searchRef : listRef;\n setTimeout(() => {\n if (ref.current) ref.current.focus();\n }, 0);\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const list = listRef.current;\n if (!open || activeIdx < 0 || !list) return;\n const el = list.querySelector('[data-idx=\"' + activeIdx + '\"]') as HTMLElement | null;\n if (!el) return;\n if (el.offsetTop < list.scrollTop) list.scrollTop = el.offsetTop;\n else if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)\n list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;\n }, [activeIdx, open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useLayoutEffect(() => {\n const list = listRef.current;\n const el = open && activeIdx >= 0 && list && list.querySelector<HTMLElement>('[data-idx=\"' + activeIdx + '\"]');\n if (el) glide.enter(el);\n else glide.leave();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, activeIdx, query]);\n\n function moveActive(dir: number) {\n if (!navItems.length) return;\n let i = activeIdx;\n for (let s = 0; s < navItems.length; s++) {\n i = (i + dir + navItems.length) % navItems.length;\n if (!navItems[i].disabled) return setActiveIdx(i);\n }\n }\n function edgeActive(toEnd: boolean) {\n const order = [...navItems.keys()];\n if (toEnd) order.reverse();\n for (const i of order) if (!navItems[i].disabled) return setActiveIdx(i);\n }\n function typeAhead(ch: string) {\n const ta = typeahead.current;\n clearTimeout(ta.t);\n ta.buf += ch.toLowerCase();\n ta.t = setTimeout(() => (ta.buf = ''), 600);\n const i = navItems.findIndex((o) => !o.disabled && o.value.toLowerCase().startsWith(ta.buf));\n if (i >= 0) setActiveIdx(i);\n }\n\n function onMenuKeyDown(e: KeyboardEvent) {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n requestClose();\n returnFocus();\n break;\n case 'ArrowDown':\n e.preventDefault();\n moveActive(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n moveActive(-1);\n break;\n case 'Home':\n e.preventDefault();\n edgeActive(false);\n break;\n case 'End':\n e.preventDefault();\n edgeActive(true);\n break;\n case 'Enter':\n e.preventDefault();\n if (activeIdx >= 0) commit(navItems[activeIdx]);\n break;\n case 'Tab':\n requestClose();\n break;\n default:\n if (!searchable && e.key.length === 1 && !e.metaKey && !e.ctrlKey) typeAhead(e.key);\n }\n }\n\n const optId = (value: string) => baseId + '-opt-' + encodeURIComponent(value);\n const active = activeIdx >= 0 ? navItems[activeIdx] : undefined;\n const adId = open && active ? optId(active.value) : undefined;\n\n return {\n open,\n query,\n setQuery,\n triggerRef,\n listRef,\n searchRef,\n baseId,\n menuId,\n listId,\n optId,\n adId,\n groups,\n flat,\n navItems,\n glide,\n isSelected,\n show,\n requestClose,\n commit,\n activeIdx,\n setActiveIdx,\n onMenuKeyDown,\n };\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { Icon } from '../../../internal/icon/Icon';\nimport { IconSlot } from '../../../internal/icon/IconSlot';\nimport type { ListboxState } from './use-listbox';\nimport { Button, ButtonProps } from '../../../primitives/button/Button';\n\nexport interface SelectTriggerProps extends ButtonProps {\n lb: ListboxState;\n invalid?: boolean;\n ariaLabel?: string;\n leading?: ReactNode;\n text?: ReactNode;\n isPlaceholder?: boolean;\n count?: number;\n}\n\nexport function SelectTrigger({\n lb,\n invalid,\n ariaLabel,\n leading,\n text,\n isPlaceholder,\n count,\n htmlProps,\n ...rest\n}: SelectTriggerProps) {\n const { triggerRef, baseId, open, adId, show, requestClose } = lb;\n return (\n <Button\n type=\"button\"\n ref={triggerRef}\n variant=\"ghost\"\n htmlProps={{\n id: baseId + '-trigger',\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-expanded': open,\n 'aria-controls': baseId + '-list',\n 'aria-activedescendant': adId,\n 'aria-label': ariaLabel,\n 'aria-invalid': invalid || undefined,\n onKeyDown: (e) => {\n if (!open && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault();\n show();\n }\n },\n ...htmlProps,\n }}\n onClick={() => (open ? requestClose() : show())}\n iconRight={\n <span className=\"select__caret\">\n <Icon name=\"caret-down\" size=\"sm\" />\n </span>\n }\n iconLeft={\n leading && (\n <span className=\"select__leading\">\n <IconSlot size=\"sm\">{leading}</IconSlot>\n </span>\n )\n }\n {...rest}\n >\n <span className=\"select__value\" data-placeholder={isPlaceholder ? 'true' : undefined}>\n {text}\n </span>\n {count != null && count > 0 && <span className=\"select__count\">+{count}</span>}\n </Button>\n );\n}\n","'use client';\n\nimport { useLayoutEffect, useRef, type ReactNode, type RefObject } from 'react';\nimport type { Layer } from '../../../../engine';\nimport { Presence } from '../../../../motion/presence';\nimport { useMotion, type MotionSpecs } from '../../../../motion/use-motion';\nimport { UIMotion, type MotionTransition } from '../../../../tokens/motion-tokens';\nimport { resolveMotionTiming } from '../../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../../motion/timing';\nimport { OverlayPortal, useOverlayEntry, useOutsidePress } from '../../../internal/overlay/layer';\nimport { useAnchorPosition } from '../../../internal/overlay/position';\n\nconst SELECT_MENU_TIMING = {\n open: { duration: 'base', ease: 'entrance' },\n close: { duration: 'base', ease: 'exit' },\n} as const;\n\nfunction selectMenuLayers(animation: DisableableAnimation | undefined, dir: 'open' | 'close'): Layer[] {\n const t = resolveMotionTiming(animation, SELECT_MENU_TIMING)[dir];\n const fade = (d: MotionTransition) => ({ duration: d.duration === 0 ? 0 : UIMotion.dur.fast, ease: d.ease });\n return dir === 'open'\n ? [\n { y: [-6, 0], scale: [0.96, 1], timing: t },\n { opacity: [0, 1], timing: fade(t) },\n ]\n : [\n { y: [-6], scale: [0.96], timing: t },\n { opacity: [0], timing: fade(t) },\n ];\n}\n\nexport interface SelectMenuProps {\n open: boolean;\n menuId: string;\n requestClose: () => void;\n triggerRef: RefObject<HTMLButtonElement | null>;\n multiple?: boolean;\n /** Open/close timing - motion tokens only, or `null` to disable. */\n animation?: DisableableAnimation;\n children?: ReactNode;\n}\n\nfunction MenuSurface({\n menuId,\n requestClose,\n triggerRef,\n multiple,\n animate,\n exit,\n children,\n}: Omit<SelectMenuProps, 'open' | 'animation'> & MotionSpecs) {\n const menuRef = useRef<HTMLDivElement>(null);\n const entry = useOverlayEntry({ nodeRef: menuRef, dismissible: true, requestClose });\n useMotion(menuRef, { animate, exit });\n useLayoutEffect(() => {\n const apply = () => {\n const t = triggerRef.current;\n if (t && menuRef.current) menuRef.current.style.minWidth = t.getBoundingClientRect().width + 'px';\n };\n apply();\n window.addEventListener('resize', apply);\n return () => window.removeEventListener('resize', apply);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n useAnchorPosition({ side: 'bottom', align: 'start', arrow: false, triggerRef, panelRef: menuRef });\n useOutsidePress({ entry, refs: [menuRef, triggerRef], enabled: true, onPress: requestClose });\n\n return (\n <div\n ref={menuRef}\n className=\"select__menu\"\n id={menuId}\n role=\"presentation\"\n data-multiple={multiple ? 'true' : undefined}\n >\n {children}\n </div>\n );\n}\n\nexport function SelectMenu({ open, menuId, requestClose, triggerRef, multiple, animation, children }: SelectMenuProps) {\n return (\n <OverlayPortal>\n <Presence>\n {open && (\n <MenuSurface\n key=\"menu\"\n animate={selectMenuLayers(animation, 'open')}\n exit={selectMenuLayers(animation, 'close')}\n menuId={menuId}\n requestClose={requestClose}\n triggerRef={triggerRef}\n multiple={multiple}\n >\n {children}\n </MenuSurface>\n )}\n </Presence>\n </OverlayPortal>\n );\n}\n","'use client';\n\nimport { Fragment, useMemo, type ReactNode } from 'react';\nimport { Icon } from '../../../internal/icon/Icon';\nimport { IconSlot } from '../../../internal/icon/IconSlot';\nimport { Collapse } from '../../../primitives/collapse/Collapse';\nimport { GlidePill } from '../../../../motion/glide';\nimport { SelectMenu } from './menu';\nimport type { ListboxState } from './use-listbox';\nimport type { DisableableAnimation } from '../../../../motion/timing';\nimport type { ButtonProps } from '../../../primitives/button/Button';\n\nexport interface ListboxPanelProps {\n lb: ListboxState;\n loading: boolean;\n searchable: boolean;\n searchPlaceholder?: string;\n ariaLabel?: string;\n multiple?: boolean;\n /** Menu open/close timing - motion tokens only, or `null` to disable. */\n animation?: DisableableAnimation;\n check?: (selected: boolean) => ReactNode;\n size?: ButtonProps['size'];\n}\n\nconst defaultCheck = (selected: boolean) => (selected ? <Icon key=\"on\" name=\"check\" size=\"sm\" weight=\"bold\" /> : null);\n\nfunction LoadingRows() {\n return (\n <div className=\"select__loading\" aria-busy=\"true\" aria-live=\"polite\">\n {[0, 1, 2].map((i) => (\n <div className=\"select__skeleton\" key={i}>\n <span className=\"select__skeleton-dot\" data-pulse></span>\n <span className=\"select__skeleton-bar\" data-pulse></span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction EmptyRow({ query }: { query: string }) {\n return <div className=\"select__empty\">{query ? 'No matches for \"' + query + '\"' : 'No options available'}</div>;\n}\n\nexport function ListboxPanel({\n lb,\n loading,\n searchable,\n searchPlaceholder,\n ariaLabel,\n multiple,\n animation,\n size = 'md',\n check = defaultCheck,\n}: ListboxPanelProps) {\n const navIndex = useMemo(() => new Map(lb.navItems.map((o, i) => [o.value, i] as const)), [lb.navItems]);\n return (\n <SelectMenu\n open={lb.open}\n menuId={lb.menuId}\n requestClose={lb.requestClose}\n triggerRef={lb.triggerRef}\n multiple={multiple}\n animation={animation}\n >\n {searchable && !loading && (\n <div className=\"select__search\">\n <Icon name=\"magnifying-glass\" size=\"sm\" />\n <input\n ref={lb.searchRef}\n className=\"select__search-input\"\n type=\"text\"\n value={lb.query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n aria-controls={lb.listId}\n aria-activedescendant={lb.adId}\n onChange={(e) => lb.setQuery(e.target.value)}\n onKeyDown={lb.onMenuKeyDown}\n />\n </div>\n )}\n\n <div\n className=\"select__list\"\n ref={lb.listRef}\n id={lb.listId}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n tabIndex={-1}\n aria-label={ariaLabel}\n onKeyDown={searchable ? undefined : lb.onMenuKeyDown}\n >\n <GlidePill className=\"select__glide\" glide={lb.glide} />\n {loading ? (\n <LoadingRows />\n ) : (\n <Fragment>\n {lb.groups.map((g, gi) => (\n <div className=\"select__group\" role=\"group\" aria-label={g.label || undefined} key={gi}>\n {g.label && g.options.some((o) => navIndex.has(o.value)) && (\n <div className=\"select__group-label\">{g.label}</div>\n )}\n {g.options.map((opt) => {\n const i = navIndex.get(opt.value) ?? -1;\n const visible = i !== -1;\n const isSel = lb.isSelected(opt.value);\n const row = (\n <div\n key={opt.value}\n id={visible ? lb.optId(opt.value) : undefined}\n data-idx={visible ? i : undefined}\n className=\"select__option\"\n role=\"option\"\n aria-selected={isSel}\n aria-hidden={!visible || undefined}\n aria-disabled={opt.disabled || undefined}\n data-selected={isSel ? 'true' : undefined}\n data-active={visible && i === lb.activeIdx ? 'true' : undefined}\n data-disabled={opt.disabled ? 'true' : undefined}\n onMouseEnter={() => visible && !opt.disabled && lb.setActiveIdx(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => visible && lb.commit(opt)}\n data-size={size}\n >\n {opt.icon && (\n <span className=\"select__option-icon\">\n <IconSlot size=\"sm\">{opt.icon}</IconSlot>\n </span>\n )}\n <span className=\"select__option-text\">\n <span className=\"select__option-label\">{opt.label}</span>\n {opt.description && <span className=\"select__option-desc\">{opt.description}</span>}\n </span>\n {check(isSel) ? <span className=\"select__option-check\">{check(isSel)}</span> : null}\n </div>\n );\n return searchable ? (\n <Collapse key={opt.value} open={visible} fade>\n {row}\n </Collapse>\n ) : (\n row\n );\n })}\n </div>\n ))}\n {lb.navItems.length === 0 && <EmptyRow query={lb.query} />}\n </Fragment>\n )}\n </div>\n </SelectMenu>\n );\n}\n"]}
@@ -2,8 +2,8 @@
2
2
  import { useReturnFocus } from './chunk-LDC3RIYA.js';
3
3
  import { ovCloneTrigger, OverlayPortal, useOverlayEntry, useOutsidePress } from './chunk-GY7JOPUQ.js';
4
4
  import { resolveMotionTiming } from './chunk-NEF5XAHG.js';
5
- import { Presence } from './chunk-MXOPCFWR.js';
6
- import { useMotion } from './chunk-W3SHPKSB.js';
5
+ import { Presence } from './chunk-356HZMT4.js';
6
+ import { useMotion } from './chunk-XWUWYSCT.js';
7
7
  import { useControllable } from './chunk-MMRIQNEN.js';
8
8
  import { cx } from './chunk-QGNC7LH5.js';
9
9
  import './popover.css';
@@ -90,5 +90,5 @@ function Popover({
90
90
  }
91
91
 
92
92
  export { Popover };
93
- //# sourceMappingURL=chunk-O4N2OBTR.js.map
94
- //# sourceMappingURL=chunk-O4N2OBTR.js.map
93
+ //# sourceMappingURL=chunk-W5YM2FV4.js.map
94
+ //# sourceMappingURL=chunk-W5YM2FV4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/popover/Popover.tsx"],"names":[],"mappings":"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","file":"chunk-O4N2OBTR.js","sourcesContent":["'use client';\n\nimport './popover.css';\nimport { Fragment, useId, useRef, type HTMLAttributes, type ReactElement, type ReactNode, type RefObject } from 'react';\nimport { Presence } from '../../../motion/presence';\nimport { useMotion, type MotionSpecs } from '../../../motion/use-motion';\nimport { resolveMotionTiming } from '../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport { ovCloneTrigger, useOverlayEntry, useOutsidePress, OverlayPortal } from '../../internal/overlay/layer';\nimport { useReturnFocus } from '../../internal/overlay/focus';\nimport { useAnchorPosition } from '../../internal/overlay/position';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst POPOVER_TIMING = {\n open: { duration: 'base', ease: 'entrance' },\n close: { duration: 'fast', ease: 'exit' },\n} as const;\n\nexport interface PopoverProps {\n /** Controlled open state. Omit to stay uncontrolled. */\n open?: boolean;\n /** Initial state when uncontrolled. Default false. */\n defaultOpen?: boolean;\n /** Fires whenever the open state changes. Pair with `open` for controlled use. */\n onOpenChange?: (open: boolean) => void;\n\n /** Cloned to toggle the panel; required as the anchor. */\n trigger?: ReactElement | null;\n\n /** Preferred side; flips to the opposite side when cramped. Default 'bottom'. */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Cross-axis alignment against the trigger. Default 'start'. */\n align?: 'start' | 'center' | 'end';\n /** Caret tracking the trigger center. Default false. */\n arrow?: boolean;\n\n /** Esc + outside-press dismissal. Default true. */\n dismissible?: boolean;\n\n /** Base id for the panel; drives the trigger's `aria-controls`. Auto-generated when omitted. */\n id?: string;\n /** Standard attributes (className, style, data-*, ...) forwarded to the popover panel. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Open/close timing - motion tokens only, or `null` to disable. @default open 'base'/'entrance', close 'fast'/'exit' */\n animation?: DisableableAnimation;\n /** The ENTIRE surface - paint AND semantics. Drive dismissal with `open`/`onOpenChange`. */\n children: ReactNode;\n}\n\nfunction PopoverPanel({\n panelId,\n side,\n align,\n arrow,\n dismissible,\n requestClose,\n triggerRef,\n htmlProps,\n animate,\n exit,\n children,\n}: {\n panelId: string;\n side: 'top' | 'bottom' | 'left' | 'right';\n align: 'start' | 'center' | 'end';\n arrow: boolean;\n dismissible: boolean;\n requestClose: () => void;\n triggerRef: RefObject<HTMLElement>;\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n children: ReactNode;\n} & MotionSpecs) {\n const panelRef = useRef<HTMLElement>(null);\n const entry = useOverlayEntry({ nodeRef: panelRef, dismissible, requestClose });\n useMotion(panelRef, { animate, exit });\n useReturnFocus(panelRef);\n useAnchorPosition({ side, align, arrow, triggerRef, panelRef });\n useOutsidePress({ entry, refs: [triggerRef, panelRef], enabled: dismissible, onPress: requestClose });\n return (\n <div\n {...htmlProps}\n id={panelId}\n ref={panelRef as RefObject<HTMLDivElement>}\n className={cx('overlay-popover', htmlProps?.className)}\n >\n {arrow && <span className=\"overlay-popover__arrow\" aria-hidden=\"true\"></span>}\n {children}\n </div>\n );\n}\n\nexport function Popover({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n trigger = null,\n side = 'bottom',\n align = 'start',\n arrow = false,\n dismissible = true,\n id,\n htmlProps,\n animation,\n children,\n}: PopoverProps) {\n const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement>(null);\n const autoId = useId();\n const panelId = id || 'popover-' + autoId;\n const close = () => setOpen(false);\n const timings = resolveMotionTiming(animation, POPOVER_TIMING);\n\n return (\n <Fragment>\n {ovCloneTrigger(trigger, { open, onPress: () => setOpen(!open), panelId, haspopup: 'true', triggerRef })}\n <OverlayPortal>\n <Presence>\n {open && (\n <PopoverPanel\n key=\"panel\"\n animate={{ opacity: [0, 1], scale: [0.96, 1], timing: timings.open }}\n exit={{ opacity: [0], scale: [0.96], timing: timings.close }}\n panelId={panelId}\n side={side}\n align={align}\n arrow={arrow}\n dismissible={dismissible}\n requestClose={close}\n triggerRef={triggerRef}\n htmlProps={htmlProps}\n >\n {children}\n </PopoverPanel>\n )}\n </Presence>\n </OverlayPortal>\n </Fragment>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/composites/popover/Popover.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAeA,IAAM,cAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,UAAA,EAAW;AAAA,EAC3C,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,MAAA;AACnC,CAAA;AAiCA,SAAS,YAAA,CAAa;AAAA,EACpB,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAUiB;AACf,EAAA,MAAM,QAAA,GAAW,OAAoB,IAAI,CAAA;AACzC,EAAA,MAAM,QAAQ,eAAA,CAAgB,EAAE,SAAS,QAAA,EAAU,WAAA,EAAa,cAAc,CAAA;AAC9E,EAAA,SAAA,CAAU,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AACrC,EAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,EAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,UAAU,CAAA;AAC9D,EAAA,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,EAAM,CAAC,UAAA,EAAY,QAAQ,CAAA,EAAG,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,YAAA,EAAc,CAAA;AACpG,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAA,EAAW,SAAS,CAAA;AAAA,MAEpD,QAAA,EAAA;AAAA,QAAA,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,eAAY,MAAA,EAAO,CAAA;AAAA,QACrE;AAAA;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd,YAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,KAAA,GAAQ,OAAA;AAAA,EACR,KAAA,GAAQ,KAAA;AAAA,EACR,WAAA,GAAc,IAAA;AAAA,EACd,EAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAI,eAAA,CAAgB,cAAA,EAAgB,aAAa,YAAY,CAAA;AACjF,EAAA,MAAM,UAAA,GAAa,OAAoB,IAAI,CAAA;AAC3C,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,GAAa,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,KAAK,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,SAAA,EAAW,cAAc,CAAA;AAE7D,EAAA,4BACG,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAA,EAAG,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AAAA,oBACvG,GAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA,IAAA,oBACC,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAC,GAAG,CAAC,CAAA,EAAG,KAAA,EAAO,CAAC,IAAA,EAAM,CAAC,CAAA,EAAG,MAAA,EAAQ,QAAQ,IAAA,EAAK;AAAA,QACnE,IAAA,EAAM,EAAE,OAAA,EAAS,CAAC,CAAC,CAAA,EAAG,KAAA,EAAO,CAAC,IAAI,CAAA,EAAG,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAM;AAAA,QAC3D,OAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA,EAAc,KAAA;AAAA,QACd,UAAA;AAAA,QACA,SAAA;AAAA,QAEC;AAAA,OAAA;AAAA,MAZG;AAAA,OAeV,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-W5YM2FV4.js","sourcesContent":["'use client';\n\nimport './popover.css';\nimport { Fragment, useId, useRef, type HTMLAttributes, type ReactElement, type ReactNode, type RefObject } from 'react';\nimport { Presence } from '../../../motion/presence';\nimport { useMotion, type MotionSpecs } from '../../../motion/use-motion';\nimport { resolveMotionTiming } from '../../../motion/motion-timing';\nimport type { DisableableAnimation } from '../../../motion/timing';\nimport { useControllable } from '../../internal/hooks/use-controllable';\nimport { ovCloneTrigger, useOverlayEntry, useOutsidePress, OverlayPortal } from '../../internal/overlay/layer';\nimport { useReturnFocus } from '../../internal/overlay/focus';\nimport { useAnchorPosition } from '../../internal/overlay/position';\nimport type { DataAttributes } from '../../../dom-props';\nimport { cx } from '../../internal/utils/cx';\n\nconst POPOVER_TIMING = {\n open: { duration: 'base', ease: 'entrance' },\n close: { duration: 'fast', ease: 'exit' },\n} as const;\n\nexport interface PopoverProps {\n /** Controlled open state. Omit to stay uncontrolled. */\n open?: boolean;\n /** Initial state when uncontrolled. Default false. */\n defaultOpen?: boolean;\n /** Fires whenever the open state changes. Pair with `open` for controlled use. */\n onOpenChange?: (open: boolean) => void;\n\n /** Cloned to toggle the panel; required as the anchor. */\n trigger?: ReactElement | null;\n\n /** Preferred side; flips to the opposite side when cramped. Default 'bottom'. */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Cross-axis alignment against the trigger. Default 'start'. */\n align?: 'start' | 'center' | 'end';\n /** Caret tracking the trigger center. Default false. */\n arrow?: boolean;\n\n /** Esc + outside-press dismissal. Default true. */\n dismissible?: boolean;\n\n /** Base id for the panel; drives the trigger's `aria-controls`. Auto-generated when omitted. */\n id?: string;\n /** Standard attributes (className, style, data-*, ...) forwarded to the popover panel. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Open/close timing - motion tokens only, or `null` to disable. @default open 'base'/'entrance', close 'fast'/'exit' */\n animation?: DisableableAnimation;\n /** The ENTIRE surface - paint AND semantics. Drive dismissal with `open`/`onOpenChange`. */\n children: ReactNode;\n}\n\nfunction PopoverPanel({\n panelId,\n side,\n align,\n arrow,\n dismissible,\n requestClose,\n triggerRef,\n htmlProps,\n animate,\n exit,\n children,\n}: {\n panelId: string;\n side: 'top' | 'bottom' | 'left' | 'right';\n align: 'start' | 'center' | 'end';\n arrow: boolean;\n dismissible: boolean;\n requestClose: () => void;\n triggerRef: RefObject<HTMLElement>;\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n children: ReactNode;\n} & MotionSpecs) {\n const panelRef = useRef<HTMLElement>(null);\n const entry = useOverlayEntry({ nodeRef: panelRef, dismissible, requestClose });\n useMotion(panelRef, { animate, exit });\n useReturnFocus(panelRef);\n useAnchorPosition({ side, align, arrow, triggerRef, panelRef });\n useOutsidePress({ entry, refs: [triggerRef, panelRef], enabled: dismissible, onPress: requestClose });\n return (\n <div\n {...htmlProps}\n id={panelId}\n ref={panelRef as RefObject<HTMLDivElement>}\n className={cx('overlay-popover', htmlProps?.className)}\n >\n {arrow && <span className=\"overlay-popover__arrow\" aria-hidden=\"true\"></span>}\n {children}\n </div>\n );\n}\n\nexport function Popover({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n trigger = null,\n side = 'bottom',\n align = 'start',\n arrow = false,\n dismissible = true,\n id,\n htmlProps,\n animation,\n children,\n}: PopoverProps) {\n const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement>(null);\n const autoId = useId();\n const panelId = id || 'popover-' + autoId;\n const close = () => setOpen(false);\n const timings = resolveMotionTiming(animation, POPOVER_TIMING);\n\n return (\n <Fragment>\n {ovCloneTrigger(trigger, { open, onPress: () => setOpen(!open), panelId, haspopup: 'true', triggerRef })}\n <OverlayPortal>\n <Presence>\n {open && (\n <PopoverPanel\n key=\"panel\"\n animate={{ opacity: [0, 1], scale: [0.96, 1], timing: timings.open }}\n exit={{ opacity: [0], scale: [0.96], timing: timings.close }}\n panelId={panelId}\n side={side}\n align={align}\n arrow={arrow}\n dismissible={dismissible}\n requestClose={close}\n triggerRef={triggerRef}\n htmlProps={htmlProps}\n >\n {children}\n </PopoverPanel>\n )}\n </Presence>\n </OverlayPortal>\n </Fragment>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- 'use client';import { animate } from './chunk-L3Q3VDIW.js';
1
+ 'use client';import { animate } from './chunk-YGCVWGUG.js';
2
2
  import { UIMotion } from './chunk-S5ZTZANS.js';
3
3
  import { useRef } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
@@ -39,5 +39,5 @@ function GlidePill({ className, glide }) {
39
39
  }
40
40
 
41
41
  export { GlidePill, useGlide };
42
- //# sourceMappingURL=chunk-MKIQFK7S.js.map
43
- //# sourceMappingURL=chunk-MKIQFK7S.js.map
42
+ //# sourceMappingURL=chunk-WM5J5TDI.js.map
43
+ //# sourceMappingURL=chunk-WM5J5TDI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/motion/glide.tsx"],"names":[],"mappings":"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","file":"chunk-MKIQFK7S.js","sourcesContent":["'use client';\n\nimport { useRef, type RefObject } from 'react';\nimport { animate } from '../engine';\nimport { UIMotion as SM } from '../tokens/motion-tokens';\n\nexport type GlideApi = ReturnType<typeof useGlide>;\n\nexport function useGlide<T extends HTMLElement>(containerRef: RefObject<T | null>) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const visible = useRef(false);\n\n function enter(target: HTMLElement | null) {\n const box = containerRef.current,\n pill = ref.current;\n if (!box || !pill || !target) return;\n const was = pill.getBoundingClientRect();\n const b = box.getBoundingClientRect();\n const t = target.getBoundingClientRect();\n const s = box.offsetWidth ? b.width / box.offsetWidth : 1;\n pill.style.translate = `${(t.left - b.left) / s + box.scrollLeft}px ${(t.top - b.top) / s + box.scrollTop}px`;\n pill.style.width = `${t.width / s}px`;\n pill.style.height = `${t.height / s}px`;\n const now = pill.getBoundingClientRect();\n animate(pill, { opacity: [1], timing: { duration: SM.dur.fast, ease: SM.ease.standard } });\n const glided = visible.current && !SM.reduced;\n visible.current = true;\n if (!glided) return;\n const timing = { ...SM.t.settle, fill: 'none' as const };\n animate(\n pill,\n { x: [was.left - now.left, 0], y: [was.top - now.top, 0], timing, composite: 'add' },\n { width: [was.width, now.width], height: [was.height, now.height], timing },\n );\n }\n\n function leave() {\n visible.current = false;\n if (ref.current) animate(ref.current, { opacity: [0], timing: { duration: SM.dur.fast, ease: SM.ease.exit } });\n }\n\n return { ref, enter, leave };\n}\n\nexport function GlidePill({ className, glide }: { className?: string; glide: GlideApi }) {\n return <span ref={glide.ref} className={className} aria-hidden=\"true\" />;\n}\n"]}
1
+ {"version":3,"sources":["../src/motion/glide.tsx"],"names":[],"mappings":"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","file":"chunk-WM5J5TDI.js","sourcesContent":["'use client';\n\nimport { useRef, type RefObject } from 'react';\nimport { animate } from '../engine';\nimport { UIMotion as SM } from '../tokens/motion-tokens';\n\nexport type GlideApi = ReturnType<typeof useGlide>;\n\nexport function useGlide<T extends HTMLElement>(containerRef: RefObject<T | null>) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const visible = useRef(false);\n\n function enter(target: HTMLElement | null) {\n const box = containerRef.current,\n pill = ref.current;\n if (!box || !pill || !target) return;\n const was = pill.getBoundingClientRect();\n const b = box.getBoundingClientRect();\n const t = target.getBoundingClientRect();\n const s = box.offsetWidth ? b.width / box.offsetWidth : 1;\n pill.style.translate = `${(t.left - b.left) / s + box.scrollLeft}px ${(t.top - b.top) / s + box.scrollTop}px`;\n pill.style.width = `${t.width / s}px`;\n pill.style.height = `${t.height / s}px`;\n const now = pill.getBoundingClientRect();\n animate(pill, { opacity: [1], timing: { duration: SM.dur.fast, ease: SM.ease.standard } });\n const glided = visible.current && !SM.reduced;\n visible.current = true;\n if (!glided) return;\n const timing = { ...SM.t.settle, fill: 'none' as const };\n animate(\n pill,\n { x: [was.left - now.left, 0], y: [was.top - now.top, 0], timing, composite: 'add' },\n { width: [was.width, now.width], height: [was.height, now.height], timing },\n );\n }\n\n function leave() {\n visible.current = false;\n if (ref.current) animate(ref.current, { opacity: [0], timing: { duration: SM.dur.fast, ease: SM.ease.exit } });\n }\n\n return { ref, enter, leave };\n}\n\nexport function GlidePill({ className, glide }: { className?: string; glide: GlideApi }) {\n return <span ref={glide.ref} className={className} aria-hidden=\"true\" />;\n}\n"]}
@@ -1,7 +1,7 @@
1
- 'use client';import { animate } from './chunk-L3Q3VDIW.js';
1
+ 'use client';import { animate } from './chunk-YGCVWGUG.js';
2
2
  import { createContext, useRef, useLayoutEffect, useContext } from 'react';
3
3
 
4
- var DETACHED = { isPresent: true, initial: true, safeToRemove: () => {
4
+ var DETACHED = { isPresent: true, initial: true, claimExit: () => () => {
5
5
  } };
6
6
  var PresenceContext = createContext(DETACHED);
7
7
  var usePresence = () => useContext(PresenceContext);
@@ -21,10 +21,20 @@ function useMotion(ref, { animate: animate2, exit, initial, deps }) {
21
21
  const mounted = useRef(false);
22
22
  const spec = useRef({ animate: animate2, exit, initial });
23
23
  spec.current = { animate: animate2, exit, initial };
24
+ const release = useRef(null);
25
+ const ownsExit = !!exit;
24
26
  const stop = () => {
25
27
  for (const play of playing.current) play.stop();
26
28
  playing.current = [];
27
29
  };
30
+ useLayoutEffect(() => {
31
+ if (!ownsExit) return;
32
+ release.current = presence.claimExit();
33
+ return () => {
34
+ release.current?.();
35
+ release.current = null;
36
+ };
37
+ }, [ownsExit]);
28
38
  useLayoutEffect(() => {
29
39
  const el = ref.current;
30
40
  const atMount = !mounted.current;
@@ -35,15 +45,15 @@ function useMotion(ref, { animate: animate2, exit, initial, deps }) {
35
45
  playing.current = run(spec.current.animate, el);
36
46
  }, deps ?? []);
37
47
  useLayoutEffect(() => {
38
- if (presence.isPresent) return;
48
+ if (presence.isPresent || !ownsExit) return;
39
49
  const el = ref.current;
40
50
  stop();
41
51
  playing.current = el ? run(spec.current.exit, el) : [];
42
- allSettled(playing.current).then(presence.safeToRemove);
52
+ allSettled(playing.current).then(() => release.current?.());
43
53
  }, [presence.isPresent]);
44
54
  useLayoutEffect(() => stop, []);
45
55
  }
46
56
 
47
57
  export { PresenceContext, run, useMotion };
48
- //# sourceMappingURL=chunk-W3SHPKSB.js.map
49
- //# sourceMappingURL=chunk-W3SHPKSB.js.map
58
+ //# sourceMappingURL=chunk-XWUWYSCT.js.map
59
+ //# sourceMappingURL=chunk-XWUWYSCT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/motion/presence-context.ts","../src/motion/use-motion.ts"],"names":["animate"],"mappings":"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","file":"chunk-XWUWYSCT.js","sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\n\nexport interface PresenceState {\n /** False once the child has been removed from `children` but is still mounted for its exit. */\n isPresent: boolean;\n /** False for children present at the Presence's own first paint when `initial={false}`. */\n initial: boolean;\n /** Claims responsibility for animating this child out; call the returned release once the\n * exit has finished. A child nobody claims is dropped as soon as it leaves `children`. */\n claimExit: () => () => void;\n}\n\nconst DETACHED: PresenceState = { isPresent: true, initial: true, claimExit: () => () => {} };\n\nexport const PresenceContext = createContext<PresenceState>(DETACHED);\n\nexport const usePresence = (): PresenceState => useContext(PresenceContext);\n","'use client';\n\nimport { useLayoutEffect, useRef, type RefObject } from 'react';\nimport { animate, type Layer, type Playback } from '../engine';\nimport { usePresence } from './presence-context';\n\nexport type Plays = Playback | Playback[] | null | undefined | void;\nexport type MotionSpec = Layer | Layer[] | ((el: HTMLElement) => Plays);\n\nconst toList = (plays: Plays): Playback[] => (!plays ? [] : Array.isArray(plays) ? plays : [plays]);\n\nexport function run(spec: MotionSpec | undefined, el: HTMLElement): Playback[] {\n if (!spec) return [];\n if (typeof spec === 'function') return toList(spec(el));\n return [Array.isArray(spec) ? animate(el, ...spec) : animate(el, spec)];\n}\n\nconst allSettled = (plays: Playback[]): Promise<void> =>\n plays.length ? Promise.all(plays.map((play) => play.finished)).then((): void => {}) : Promise.resolve();\n\nexport interface MotionSpecs {\n /** Plays on mount, and again whenever `deps` change. */\n animate?: MotionSpec;\n /** Plays when a parent `<Presence>` drops this child; it stays mounted until this finishes. */\n exit?: MotionSpec;\n /** Play `animate` on mount. Falls back to the parent Presence's own `initial`. @default true */\n initial?: boolean;\n /** Replay `animate` when these change. Must keep a stable length. @default [] */\n deps?: unknown[];\n}\n\n/** Drives `<Motion>`; use it directly on elements you hold a ref to but do not render. */\nexport function useMotion(ref: RefObject<HTMLElement | null>, { animate, exit, initial, deps }: MotionSpecs): void {\n const presence = usePresence();\n const playing = useRef<Playback[]>([]);\n const mounted = useRef(false);\n const spec = useRef({ animate, exit, initial });\n spec.current = { animate, exit, initial };\n const release = useRef<(() => void) | null>(null);\n const ownsExit = !!exit;\n\n const stop = () => {\n for (const play of playing.current) play.stop();\n playing.current = [];\n };\n\n useLayoutEffect(() => {\n if (!ownsExit) return;\n release.current = presence.claimExit();\n return () => {\n release.current?.();\n release.current = null;\n };\n }, [ownsExit]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useLayoutEffect(() => {\n const el = ref.current;\n const atMount = !mounted.current;\n mounted.current = true;\n if (!el) return;\n if (atMount && (spec.current.initial ?? presence.initial) === false) return;\n stop();\n playing.current = run(spec.current.animate, el);\n }, deps ?? []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useLayoutEffect(() => {\n if (presence.isPresent || !ownsExit) return;\n const el = ref.current;\n stop();\n playing.current = el ? run(spec.current.exit, el) : [];\n allSettled(playing.current).then(() => release.current?.());\n }, [presence.isPresent]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useLayoutEffect(() => stop, []);\n}\n"]}
@@ -12,29 +12,6 @@ var NAMED = {
12
12
  backInOut: [0.68, -0.6, 0.32, 1.6],
13
13
  anticipate: [0.38, -0.4, 0.88, 1.08]
14
14
  };
15
- var bezierCurve = (a, b, t) => {
16
- const u = 1 - t;
17
- return 3 * a * u * u * t + 3 * b * u * t * t + t * t * t;
18
- };
19
- var bezierSlope = (a, b, t) => {
20
- const u = 1 - t;
21
- return 3 * a * (u * u - 2 * t * u) + 3 * b * (2 * t * u - t * t) + 3 * t * t;
22
- };
23
- function bezierAt(b, x) {
24
- const [x1, y1, x2, y2] = b;
25
- if (x1 === y1 && x2 === y2) return x;
26
- if (x <= 0) return 0;
27
- if (x >= 1) return 1;
28
- let t = x;
29
- for (let i = 0; i < 8; i++) {
30
- const err = bezierCurve(x1, x2, t) - x;
31
- if (err < 1e-4 && err > -1e-4) break;
32
- const slope = bezierSlope(x1, x2, t);
33
- if (slope < 1e-6 && slope > -1e-6) break;
34
- t -= err / slope;
35
- }
36
- return bezierCurve(y1, y2, t);
37
- }
38
15
  var toBezier = (ease) => typeof ease === "string" ? NAMED[ease] ?? NAMED.easeInOut : ease;
39
16
  var cssBezier = (ease) => `cubic-bezier(${toBezier(ease).join(",")})`;
40
17
  var isSegmented = (ease) => Array.isArray(ease) && (Array.isArray(ease[0]) || typeof ease[0] === "string");
@@ -91,7 +68,7 @@ function springCurve(visual, bounce) {
91
68
  const seconds = settleSeconds(zeta, omega, visual);
92
69
  const duration = seconds * 1e3;
93
70
  const at = (progress) => progress >= 1 ? 1 : springAt(zeta, omega, progress * seconds);
94
- const curve = { duration, easing: toLinearEasing(at, duration), at };
71
+ const curve = { duration, easing: toLinearEasing(at, duration) };
95
72
  springCache.set(key, curve);
96
73
  return curve;
97
74
  }
@@ -101,16 +78,13 @@ function resolveTiming(timing = {}) {
101
78
  if (spring) {
102
79
  const visual = Math.max(timing.visualDuration ?? timing.duration ?? 0.3, 0.01);
103
80
  const curve = springCurve(visual, timing.bounce ?? 0);
104
- return { duration: curve.duration, delay, easing: curve.easing, segments: null, at: curve.at };
81
+ return { duration: curve.duration, delay, easing: curve.easing, segments: null };
105
82
  }
106
83
  const duration = (timing.duration ?? 0.3) * 1e3;
107
84
  const ease = timing.ease;
108
- if (isSegmented(ease)) {
109
- const first = toBezier(ease[0]);
110
- return { duration, delay, easing: "linear", segments: ease.map(cssBezier), at: (p) => bezierAt(first, p) };
111
- }
85
+ if (isSegmented(ease)) return { duration, delay, easing: "linear", segments: ease.map(cssBezier) };
112
86
  const bezier = ease === void 0 ? NAMED.easeInOut : toBezier(ease);
113
- return { duration, delay, easing: cssBezier(bezier), segments: null, at: (p) => bezierAt(bezier, p) };
87
+ return { duration, delay, easing: cssBezier(bezier), segments: null };
114
88
  }
115
89
 
116
90
  // src/engine/animate.ts
@@ -291,5 +265,5 @@ function flip(el, from, options = {}) {
291
265
  }
292
266
 
293
267
  export { animate, clock, dropShared, flip, keepShared, measure, readShared, startDrag };
294
- //# sourceMappingURL=chunk-L3Q3VDIW.js.map
295
- //# sourceMappingURL=chunk-L3Q3VDIW.js.map
268
+ //# sourceMappingURL=chunk-YGCVWGUG.js.map
269
+ //# sourceMappingURL=chunk-YGCVWGUG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/ease.ts","../src/engine/animate.ts","../src/engine/drag.ts","../src/engine/flip.ts"],"names":[],"mappings":";AAEA,IAAM,KAAA,GAAgC;AAAA,EACpC,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACnB,MAAA,EAAQ,CAAC,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACtB,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACvB,SAAA,EAAW,CAAC,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAC5B,MAAA,EAAQ,CAAC,IAAA,EAAM,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,EACzB,OAAA,EAAS,CAAC,CAAA,EAAG,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EAC1B,SAAA,EAAW,CAAC,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EAC5B,MAAA,EAAQ,CAAC,IAAA,EAAM,CAAA,EAAG,MAAM,KAAK,CAAA;AAAA,EAC7B,OAAA,EAAS,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EAC7B,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,EACjC,UAAA,EAAY,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI;AACrC,CAAA;AAIA,IAAM,QAAA,GAAW,CAAC,IAAA,KAA6B,OAAO,IAAA,KAAS,WAAY,KAAA,CAAM,IAAI,CAAA,IAAK,KAAA,CAAM,SAAA,GAAa,IAAA;AAE7G,IAAM,SAAA,GAAY,CAAC,IAAA,KAA4B,CAAA,aAAA,EAAgB,SAAS,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAEvF,IAAM,cAAc,CAAC,IAAA,KACnB,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,IAAK,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAA;AAEvE,IAAM,OAAA,GAAU,IAAA;AAChB,IAAM,WAAA,GAAc,IAAA;AACpB,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,cAAc,CAAA,GAAI,GAAA;AACxB,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,aAAA,GAAgB,GAAA;AAEtB,SAAS,QAAA,CAAS,IAAA,EAAc,KAAA,EAAe,CAAA,EAAmB;AAChE,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,GAAO,QAAQ,CAAC,CAAA;AACxC,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,SAAS,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,OAAO,IAAI,CAAA;AAChD,IAAA,OAAO,CAAA,GAAI,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAM,IAAA,GAAO,KAAA,GAAS,MAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO,CAAA,GAAI,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,CAAA;AAClC;AAEA,SAAS,eAAA,CAAgB,MAAc,MAAA,EAAwB;AAC7D,EAAA,IAAI,KAAK,WAAA,GAAc,MAAA;AACvB,EAAA,OAAO,EAAA,GAAK,iBAAiB,QAAA,CAAS,IAAA,EAAM,IAAI,MAAM,CAAA,GAAI,SAAS,EAAA,IAAM,CAAA;AACzE,EAAA,IAAI,KAAK,EAAA,GAAK,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,IAAA,IAAI,SAAS,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,EAAA,GAAK,GAAA;AAAA,SAC3C,EAAA,GAAK,GAAA;AAAA,EACZ;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,aAAA,CAAc,IAAA,EAAc,KAAA,EAAe,MAAA,EAAwB;AAC1E,EAAA,IAAI,IAAA,GAAO,WAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,WAAA,EAAa,CAAA,GAAI,kBAAA,EAAoB,KAAK,WAAA,EAAa;AAClE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,WAAA,EAAa,IAAA,GAAO,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,KAAK,GAAA,CAAI,kBAAA,EAAoB,MAAA,GAAS,YAAA,EAAc,OAAO,WAAW,CAAA;AAC/E;AAEA,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,OAAO,CAAC,CAAA,KAAc,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAElD,SAAS,cAAA,CAAe,IAAkC,UAAA,EAA4B;AACpF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,SAAS,CAAC,CAAC,CAAA;AAC7F,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,KAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,CAAA,GAAI,KAAK,CAAC,CAAC,CAAC,CAAA;AACxE,EAAA,OAAO,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACnC;AAOA,IAAM,WAAA,uBAAkB,GAAA,EAAyB;AAEjD,SAAS,WAAA,CAAY,QAAgB,MAAA,EAA6B;AAChE,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACjD,EAAA,MAAM,WAAW,OAAA,GAAU,GAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,CAAC,QAAA,KAAsB,QAAA,IAAY,CAAA,GAAI,IAAI,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,QAAA,GAAW,OAAO,CAAA;AAC9F,EAAA,MAAM,QAAqB,EAAE,QAAA,EAAU,QAAQ,cAAA,CAAe,EAAA,EAAI,QAAQ,CAAA,EAAE;AAC5E,EAAA,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,CAAA;AAC1B,EAAA,OAAO,KAAA;AACT;AAeO,SAAS,aAAA,CAAc,MAAA,GAAiB,EAAC,EAAmB;AACjE,EAAA,MAAM,KAAA,GAAA,CAAS,MAAA,CAAO,KAAA,IAAS,CAAA,IAAK,GAAA;AACpC,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAS,QAAA,IAAa,OAAO,cAAA,IAAkB,IAAA,IAAQ,CAAC,MAAA,CAAO,IAAA;AACrF,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,CAAO,kBAAkB,MAAA,CAAO,QAAA,IAAY,KAAK,IAAI,CAAA;AAC7E,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,EAAQ,MAAA,CAAO,UAAU,CAAC,CAAA;AACpD,IAAA,OAAO,EAAE,UAAU,KAAA,CAAM,QAAA,EAAU,OAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,EACjF;AACA,EAAA,MAAM,QAAA,GAAA,CAAY,MAAA,CAAO,QAAA,IAAY,GAAA,IAAO,GAAA;AAC5C,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,IAAI,WAAA,CAAY,IAAI,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAE;AACjG,EAAA,MAAM,SAAS,IAAA,KAAS,MAAA,GAAY,KAAA,CAAM,SAAA,GAAY,SAAS,IAAI,CAAA;AACnE,EAAA,OAAO,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQ,UAAU,MAAM,CAAA,EAAG,UAAU,IAAA,EAAK;AACtE;;;ACxHO,IAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,CAAA;AAqB9B,IAAM,KAAA,GAAgC,EAAE,SAAA,EAAW,SAAA,EAAW,OAAO,GAAA,EAAI;AACzE,IAAM,WAAA,GAAc,EAAE,KAAA,EAAO,aAAA,EAAe,QAAQ,cAAA,EAAe;AACnE,IAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,QAAQ,CAAA;AAEhC,SAAS,WAAA,CAAY,IAAiB,GAAA,EAAiC;AACrE,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,gBAAA,CAAiB,GAAG,CAAA;AAC3C,EAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,WAAA,CAAY,GAAG,CAAC,CAAA;AACpC,EAAA,IAAI,KAAA,EAAO,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,OACrC,EAAA,CAAG,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA;AAChC,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,IAAA,CAAK,MAAgB,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAC9C;AAEA,SAAS,YAAA,CAAa,IAAiB,GAAA,EAAqB;AAC1D,EAAA,MAAM,MAAM,gBAAA,CAAiB,EAAE,EAAE,gBAAA,CAAiB,GAAG,EAAE,IAAA,EAAK;AAC5D,EAAA,OAAO,GAAA,IAAO,GAAA,KAAQ,MAAA,GAAS,GAAA,GAAM,MAAM,GAAG,CAAA;AAChD;AAEA,SAAS,OAAA,CAAQ,IAAiB,KAAA,EAAc;AAC9C,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,KAAA,CAAM,CAAA,EAAG,MAAA,IAAU,KAAA,CAAM,GAAG,MAAA,EAAQ;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AACxC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACzC,IAAA,MAAA,CAAO,SAAA,GAAY,MAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,GAAG,IAAA,CAAK,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,KAAK,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAC9F;AACA,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,CAAO,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,CAAA,KAAM,WAAW,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAAG,CAAA;AAC9G,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,MAAM,CAAA;AAE5D,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,GAAG,CAAA;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,IAAA,CAAK,KAAK,MAAA,GAAS,CAAC,MAAM,MAAA,EAAQ,QAAA,CAAS,KAAK,GAAG,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,MAAM,IAAI,WAAA,CAAY,EAAA,EAAI,GAAG,CAAA,GAAI,CAAA;AAChE,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,KAAM,MAAA,GAAS,QAAA,GAAW,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAClE;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAM,CAAA,EAAG,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,CAAK,QAAQ,YAAA,CAAa,EAAA,EAAI,GAAG,CAAC,CAAA;AAC3G,EAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAC5B;AAEA,IAAM,KAAA,uBAAY,OAAA,EAA6C;AAE/D,SAAS,KAAA,CAAM,EAAA,EAAiB,IAAA,EAAgB,SAAA,EAAmC;AACjF,EAAA,MAAM,MAAM,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,wBAAS,GAAA,EAAuB;AACxD,EAAA,KAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA;AACjB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,QAAA,IAAY,QAAA,KAAa,SAAA,EAAW,QAAA,CAAS,MAAA,EAAO;AACxD,IAAA,IAAI,SAAA,EAAW,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AAAA,SAChC,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACrB;AACF;AAEA,SAAS,IAAA,CAAK,IAAiB,KAAA,EAA+B;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC/B,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAEzB,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AAErC,EAAA,IAAI,QAAA,CAAS,YAAY,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,EAAA,EAAI,MAAM,IAAI,CAAA;AACpB,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,aAAmB,GAAA,IAAO,IAAA,KAAS,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,CAAA;AAClH,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAmC,EAAE,GAAG,MAAA,EAAO;AACrD,EAAA,IAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,KAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,QAAA,EAAU,MAAA,CAAO,MAAA,GAAS,QAAA,CAAS,QAAA;AAEhD,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ;AAAA,IACnC,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,IACtB,WAAW,KAAA,CAAM;AAAA,GAClB,CAAA;AACD,EAAA,SAAA,CAAU,YAAA,GAAe,IAAI,KAAA,CAAM,KAAA;AACnC,EAAA,IAAI,MAAM,SAAA,KAAc,KAAA,EAAO,KAAA,CAAM,EAAA,EAAI,MAAM,SAAS,CAAA;AAExD,EAAA,MAAM,QAAA,GAAW,UAAU,QAAA,CAAS,IAAA;AAAA,IAClC,MAAY;AACV,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,MAAA,SAAA,CAAU,YAAA,EAAa;AACvB,MAAA,SAAA,CAAU,MAAA,EAAO;AACjB,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,MAAY;AAAA,IAAC;AAAA,GACf;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAM,SAAA,CAAU,MAAA,IAAU,QAAA,EAAS;AACpD;AAEA,IAAM,OAAA,GAAoB,EAAE,IAAA,GAAO;AAAC,CAAA,EAAG,QAAA,EAAU,OAAA,CAAQ,OAAA,EAAQ,EAAE;AAE5D,SAAS,OAAA,CAAQ,OAAoB,MAAA,EAA2B;AACrE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAC9B,IAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,OAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,MAAM,MAAM;AACV,MAAA,KAAA,MAAW,OAAA,IAAW,KAAA,EAAO,OAAA,CAAQ,IAAA,EAAK;AAAA,IAC5C,CAAA;AAAA,IACA,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,MAAY;AAAA,IAAC,CAAC;AAAA,GACrF;AACF;;;AC7HO,SAAS,SAAA,CAAU,QAA8C,QAAA,EAAoC;AAC1G,EAAA,MAAM,SAAS,MAAA,CAAO,OAAA;AACtB,EAAA,MAAM,SAAS,MAAA,CAAO,OAAA;AACtB,EAAA,IAAI,KAAA,GAAQ,MAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,MAAA;AACZ,EAAA,IAAI,QAAA,GAAW,YAAY,GAAA,EAAI;AAC/B,EAAA,IAAI,QAAA,GAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAElC,EAAA,MAAM,IAAA,GAAO,OAAgB,EAAE,MAAA,EAAQ,EAAE,CAAA,EAAG,KAAA,GAAQ,MAAA,EAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,EAAO,EAAG,QAAA,EAAS,CAAA;AAE1F,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAwB;AACpC,IAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,IAAA,MAAM,UAAU,GAAA,GAAM,QAAA;AACtB,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,QAAA,GAAW,EAAE,CAAA,EAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAA,IAAS,OAAA,GAAW,GAAA,EAAM,CAAA,EAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAA,IAAS,OAAA,GAAW,GAAA,EAAK;AAC1G,MAAA,QAAA,GAAW,GAAA;AAAA,IACb;AACA,IAAA,KAAA,GAAQ,KAAA,CAAM,OAAA;AACd,IAAA,KAAA,GAAQ,KAAA,CAAM,OAAA;AACd,IAAA,QAAA,CAAS,MAAA,GAAS,MAAM,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,IAAI,CAAA;AAC9C,IAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,GAAG,CAAA;AAC3C,IAAA,MAAA,CAAO,mBAAA,CAAoB,iBAAiB,GAAG,CAAA;AAAA,EACjD,CAAA;AAEA,EAAA,MAAM,MAAM,MAAM;AAChB,IAAA,MAAA,EAAO;AACP,IAAA,QAAA,CAAS,KAAA,GAAQ,MAAM,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,IAAI,CAAA;AAC3C,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,GAAG,CAAA;AACxC,EAAA,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,GAAG,CAAA;AAC5C,EAAA,OAAO,MAAA;AACT;;;AC1CA,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,aAAA,GAAgB,IAAA;AAEf,SAAS,QAAQ,EAAA,EAAsB;AAC5C,EAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,SAAS,GAAA,EAAK,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,SAAS,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AACpH;AAEA,IAAM,MAAA,uBAAa,GAAA,EAAiB;AAE7B,SAAS,UAAA,CAAW,KAAa,GAAA,EAAgB;AACtD,EAAA,MAAA,CAAO,GAAA,CAAI,KAAK,GAAG,CAAA;AACrB;AAEO,SAAS,WAAW,GAAA,EAAyB;AAClD,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAC5B;AAEO,SAAS,WAAW,GAAA,EAAmB;AAC5C,EAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AACnB;AAOO,SAAS,IAAA,CAAK,EAAA,EAAiB,IAAA,EAAW,OAAA,GAAuB,EAAC,EAAoB;AAC3F,EAAA,MAAM,EAAA,GAAK,QAAQ,EAAE,CAAA;AACrB,EAAA,IAAI,CAAC,EAAA,CAAG,KAAA,IAAS,CAAC,EAAA,CAAG,QAAQ,OAAO,IAAA;AAEpC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,GAAO,EAAA,CAAG,IAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,GAAM,EAAA,CAAG,GAAA;AACzB,EAAA,MAAM,KAAK,OAAA,CAAQ,KAAA,KAAU,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAA,CAAG,KAAA;AACzD,EAAA,MAAM,KAAK,OAAA,CAAQ,KAAA,KAAU,QAAQ,CAAA,GAAI,IAAA,CAAK,SAAS,EAAA,CAAG,MAAA;AAE1D,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,EAAE,IAAI,YAAA,IAAgB,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,YAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,CAAC,CAAA,GAAI,aAAA,IAAiB,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,CAAC,CAAA,GAAI,aAAA;AACtE,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ,OAAO,IAAA;AAE9B,EAAA,MAAM,QAAe,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,QAAQ,EAAE,GAAG,QAAQ,MAAA,EAAQ,IAAA,EAAM,QAAO,EAAE;AAC3F,EAAA,IAAI,MAAA;AACF,IAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,MACZ,CAAC,IAAI,EAAE,CAAA;AAAA,MACP,CAAC,GAAG,CAAC;AAAA,KACP;AAEF,EAAA,OAAO,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC1B","file":"chunk-YGCVWGUG.js","sourcesContent":["import type { Bezier, MotionTransition } from '../tokens/motion-tokens';\n\nconst NAMED: Record<string, Bezier> = {\n linear: [0, 0, 1, 1],\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easeInOut: [0.42, 0, 0.58, 1],\n circIn: [0.55, 0, 1, 0.45],\n circOut: [0, 0.55, 0.45, 1],\n circInOut: [0.85, 0, 0.15, 1],\n backIn: [0.36, 0, 0.66, -0.56],\n backOut: [0.34, 1.56, 0.64, 1],\n backInOut: [0.68, -0.6, 0.32, 1.6],\n anticipate: [0.38, -0.4, 0.88, 1.08],\n};\n\nexport type EaseValue = NonNullable<MotionTransition['ease']>;\n\nconst toBezier = (ease: EaseValue): Bezier => (typeof ease === 'string' ? (NAMED[ease] ?? NAMED.easeInOut) : ease);\n\nconst cssBezier = (ease: EaseValue): string => `cubic-bezier(${toBezier(ease).join(',')})`;\n\nconst isSegmented = (ease: unknown): ease is EaseValue[] =>\n Array.isArray(ease) && (Array.isArray(ease[0]) || typeof ease[0] === 'string');\n\nconst ARRIVAL = 0.99;\nconst SETTLE_BAND = 0.002;\nconst MAX_SPRING_SECONDS = 4;\nconst SETTLE_LIMIT = 2.5;\nconst SETTLE_STEP = 1 / 240;\nconst OMEGA_PROBE = 0.1;\nconst OMEGA_CEILING = 1e5;\n\nfunction springAt(zeta: number, omega: number, t: number): number {\n const decay = Math.exp(-zeta * omega * t);\n if (zeta < 1) {\n const damped = omega * Math.sqrt(1 - zeta * zeta);\n return 1 - decay * (Math.cos(damped * t) + ((zeta * omega) / damped) * Math.sin(damped * t));\n }\n return 1 - decay * (1 + omega * t);\n}\n\nfunction omegaForArrival(zeta: number, visual: number): number {\n let hi = OMEGA_PROBE / visual;\n while (hi < OMEGA_CEILING && springAt(zeta, hi, visual) < ARRIVAL) hi *= 2;\n let lo = hi / 2;\n for (let i = 0; i < 40; i++) {\n const mid = (lo + hi) / 2;\n if (springAt(zeta, mid, visual) < ARRIVAL) lo = mid;\n else hi = mid;\n }\n return hi;\n}\n\nfunction settleSeconds(zeta: number, omega: number, visual: number): number {\n let last = SETTLE_STEP;\n for (let t = SETTLE_STEP; t < MAX_SPRING_SECONDS; t += SETTLE_STEP) {\n if (Math.abs(springAt(zeta, omega, t) - 1) >= SETTLE_BAND) last = t;\n }\n return Math.min(MAX_SPRING_SECONDS, visual * SETTLE_LIMIT, last + SETTLE_STEP);\n}\n\nconst SAMPLE_MS = 4;\nconst MIN_SAMPLES = 24;\nconst MAX_SAMPLES = 120;\n\nconst trim = (n: number) => Math.round(n * 1e4) / 1e4;\n\nfunction toLinearEasing(at: (progress: number) => number, durationMs: number): string {\n const steps = Math.min(MAX_SAMPLES, Math.max(MIN_SAMPLES, Math.round(durationMs / SAMPLE_MS)));\n const points: string[] = [];\n for (let i = 0; i <= steps; i++) points.push(String(trim(at(i / steps))));\n return `linear(${points.join(',')})`;\n}\n\ninterface SpringCurve {\n duration: number;\n easing: string;\n}\n\nconst springCache = new Map<string, SpringCurve>();\n\nfunction springCurve(visual: number, bounce: number): SpringCurve {\n const key = `${visual}:${bounce}`;\n const cached = springCache.get(key);\n if (cached) return cached;\n const zeta = Math.min(1, Math.max(0.05, 1 - bounce));\n const omega = omegaForArrival(zeta, visual);\n const seconds = settleSeconds(zeta, omega, visual);\n const duration = seconds * 1000;\n const at = (progress: number) => (progress >= 1 ? 1 : springAt(zeta, omega, progress * seconds));\n const curve: SpringCurve = { duration, easing: toLinearEasing(at, duration) };\n springCache.set(key, curve);\n return curve;\n}\n\nexport interface Timing extends Omit<MotionTransition, 'ease'> {\n ease?: EaseValue | EaseValue[];\n times?: number[];\n fill?: FillMode;\n}\n\nexport interface ResolvedTiming {\n duration: number;\n delay: number;\n easing: string;\n segments: string[] | null;\n}\n\nexport function resolveTiming(timing: Timing = {}): ResolvedTiming {\n const delay = (timing.delay ?? 0) * 1000;\n const spring = timing.type === 'spring' || (timing.visualDuration != null && !timing.type);\n if (spring) {\n const visual = Math.max(timing.visualDuration ?? timing.duration ?? 0.3, 0.01);\n const curve = springCurve(visual, timing.bounce ?? 0);\n return { duration: curve.duration, delay, easing: curve.easing, segments: null };\n }\n const duration = (timing.duration ?? 0.3) * 1000;\n const ease = timing.ease;\n if (isSegmented(ease)) return { duration, delay, easing: 'linear', segments: ease.map(cssBezier) };\n const bezier = ease === undefined ? NAMED.easeInOut : toBezier(ease);\n return { duration, delay, easing: cssBezier(bezier), segments: null };\n}\n","import { resolveTiming, type Timing } from './ease';\n\nexport const clock = { scale: 1 };\n\nexport interface Playback {\n stop(): void;\n finished: Promise<void>;\n}\n\ntype Vec = [number, number];\nexport type Size = number | 'auto';\n\nexport interface Layer {\n x?: number[];\n y?: number[];\n scale?: number[] | Vec[];\n opacity?: number[];\n width?: Size[];\n height?: Size[];\n timing?: Timing;\n composite?: CompositeOperation;\n}\n\nconst RESET: Record<string, string> = { translate: '0px 0px', scale: '1' };\nconst AUTO_METRIC = { width: 'offsetWidth', height: 'offsetHeight' } as const;\nconst SIZES = ['width', 'height'] as const;\n\nfunction measureAuto(el: HTMLElement, key: 'width' | 'height'): number {\n const saved = el.style.getPropertyValue(key);\n el.style.setProperty(key, 'auto');\n const measured = el[AUTO_METRIC[key]];\n if (saved) el.style.setProperty(key, saved);\n else el.style.removeProperty(key);\n return measured;\n}\n\nfunction held(list: number[], index: number): number {\n return list[Math.min(index, list.length - 1)];\n}\n\nfunction currentValue(el: HTMLElement, key: string): string {\n const raw = getComputedStyle(el).getPropertyValue(key).trim();\n return raw && raw !== 'none' ? raw : RESET[key];\n}\n\nfunction compile(el: HTMLElement, layer: Layer) {\n const frames: Record<string, string[]> = {};\n const autoKeys: string[] = [];\n\n if (layer.x?.length || layer.y?.length) {\n const x = layer.x?.length ? layer.x : [0];\n const y = layer.y?.length ? layer.y : [0];\n const count = Math.max(x.length, y.length);\n frames.translate = Array.from({ length: count }, (_, i) => `${held(x, i)}px ${held(y, i)}px`);\n }\n if (layer.scale) frames.scale = layer.scale.map((v) => (typeof v === 'number' ? String(v) : `${v[0]} ${v[1]}`));\n if (layer.opacity) frames.opacity = layer.opacity.map(String);\n\n for (const key of SIZES) {\n const list = layer[key];\n if (!list) continue;\n if (list[list.length - 1] === 'auto') autoKeys.push(key);\n const measured = list.includes('auto') ? measureAuto(el, key) : 0;\n frames[key] = list.map((v) => `${v === 'auto' ? measured : v}px`);\n }\n\n for (const [key, list] of Object.entries(frames)) if (list.length === 1) list.unshift(currentValue(el, key));\n return { frames, autoKeys };\n}\n\nconst owned = new WeakMap<HTMLElement, Map<string, Animation>>();\n\nfunction claim(el: HTMLElement, keys: string[], animation: Animation | null): void {\n const map = owned.get(el) ?? new Map<string, Animation>();\n owned.set(el, map);\n for (const key of keys) {\n const previous = map.get(key);\n if (previous && previous !== animation) previous.cancel();\n if (animation) map.set(key, animation);\n else map.delete(key);\n }\n}\n\nfunction play(el: HTMLElement, layer: Layer): Playback | null {\n const { frames, autoKeys } = compile(el, layer);\n const keys = Object.keys(frames);\n if (!keys.length) return null;\n\n const timing = layer.timing;\n const resolved = resolveTiming(timing);\n\n if (resolved.duration <= 0) {\n claim(el, keys, null);\n if (timing?.fill !== 'none') for (const key of keys) el.style.setProperty(key, frames[key][frames[key].length - 1]);\n return null;\n }\n\n const shaped: PropertyIndexedKeyframes = { ...frames };\n if (timing?.times) shaped.offset = timing.times;\n if (resolved.segments) shaped.easing = resolved.segments;\n\n const animation = el.animate(shaped, {\n duration: resolved.duration,\n delay: resolved.delay,\n easing: resolved.easing,\n fill: timing?.fill ?? 'both',\n composite: layer.composite,\n });\n animation.playbackRate = 1 / clock.scale;\n if (layer.composite !== 'add') claim(el, keys, animation);\n\n const finished = animation.finished.then(\n (): void => {\n if (!autoKeys.length) return;\n animation.commitStyles();\n animation.cancel();\n for (const key of autoKeys) el.style.setProperty(key, 'auto');\n },\n (): void => {},\n );\n\n return { stop: () => animation.cancel(), finished };\n}\n\nconst settled: Playback = { stop() {}, finished: Promise.resolve() };\n\nexport function animate(el: HTMLElement, ...layers: Layer[]): Playback {\n const plays: Playback[] = [];\n for (const layer of layers) {\n const started = play(el, layer);\n if (started) plays.push(started);\n }\n if (!plays.length) return settled;\n if (plays.length === 1) return plays[0];\n return {\n stop: () => {\n for (const started of plays) started.stop();\n },\n finished: Promise.all(plays.map((started) => started.finished)).then((): void => {}),\n };\n}\n","interface Axes {\n x: number;\n y: number;\n}\n\nexport interface PanInfo {\n offset: Axes;\n velocity: Axes;\n}\n\ninterface DragHandlers {\n onMove?: (info: PanInfo) => void;\n onEnd?: (info: PanInfo) => void;\n}\n\nexport function startDrag(origin: { clientX: number; clientY: number }, handlers: DragHandlers): () => void {\n const startX = origin.clientX;\n const startY = origin.clientY;\n let lastX = startX;\n let lastY = startY;\n let lastTime = performance.now();\n let velocity: Axes = { x: 0, y: 0 };\n\n const info = (): PanInfo => ({ offset: { x: lastX - startX, y: lastY - startY }, velocity });\n\n const move = (event: PointerEvent) => {\n const now = performance.now();\n const elapsed = now - lastTime;\n if (elapsed > 0) {\n velocity = { x: ((event.clientX - lastX) / elapsed) * 1000, y: ((event.clientY - lastY) / elapsed) * 1000 };\n lastTime = now;\n }\n lastX = event.clientX;\n lastY = event.clientY;\n handlers.onMove?.(info());\n };\n\n const detach = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n };\n\n const end = () => {\n detach();\n handlers.onEnd?.(info());\n };\n\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', end);\n window.addEventListener('pointercancel', end);\n return detach;\n}\n","import { animate, type Layer, type Playback } from './animate';\nimport type { Timing } from './ease';\n\nexport interface Box {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nconst MOVE_EPSILON = 0.5;\nconst SCALE_EPSILON = 0.01;\n\nexport function measure(el: HTMLElement): Box {\n const rect = el.getBoundingClientRect();\n return { left: rect.left + window.scrollX, top: rect.top + window.scrollY, width: rect.width, height: rect.height };\n}\n\nconst shared = new Map<string, Box>();\n\nexport function keepShared(key: string, box: Box): void {\n shared.set(key, box);\n}\n\nexport function readShared(key: string): Box | null {\n return shared.get(key) ?? null;\n}\n\nexport function dropShared(key: string): void {\n shared.delete(key);\n}\n\nexport interface FlipOptions {\n scale?: boolean;\n timing?: Timing;\n}\n\nexport function flip(el: HTMLElement, from: Box, options: FlipOptions = {}): Playback | null {\n const to = measure(el);\n if (!to.width || !to.height) return null;\n\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n const sx = options.scale === false ? 1 : from.width / to.width;\n const sy = options.scale === false ? 1 : from.height / to.height;\n\n const moved = Math.abs(dx) > MOVE_EPSILON || Math.abs(dy) > MOVE_EPSILON;\n const scaled = Math.abs(sx - 1) > SCALE_EPSILON || Math.abs(sy - 1) > SCALE_EPSILON;\n if (!moved && !scaled) return null;\n\n const layer: Layer = { x: [dx, 0], y: [dy, 0], timing: { ...options.timing, fill: 'none' } };\n if (scaled)\n layer.scale = [\n [sx, sy],\n [1, 1],\n ];\n\n return animate(el, layer);\n}\n"]}
@@ -1,17 +1,17 @@
1
- 'use client';import { DtpPanel } from './chunk-2HORSLXJ.js';
1
+ 'use client';import { DtpPanel } from './chunk-7RNRLIKT.js';
2
2
  import './chunk-TCUCYFT7.js';
3
3
  import { FieldTrigger, displayDay, FieldShell } from './chunk-YGGCQNNU.js';
4
- import { Popover } from './chunk-O4N2OBTR.js';
4
+ import { Popover } from './chunk-W5YM2FV4.js';
5
5
  import './chunk-EQ32F2QJ.js';
6
6
  import './chunk-LDC3RIYA.js';
7
7
  import './chunk-GY7JOPUQ.js';
8
8
  import './chunk-UE63OOVG.js';
9
- import './chunk-MKIQFK7S.js';
9
+ import './chunk-WM5J5TDI.js';
10
10
  import './chunk-NEF5XAHG.js';
11
- import './chunk-MXOPCFWR.js';
12
- import './chunk-W3SHPKSB.js';
13
- import './chunk-JSKXZMLH.js';
14
- import './chunk-L3Q3VDIW.js';
11
+ import './chunk-356HZMT4.js';
12
+ import './chunk-2QWJ6FAX.js';
13
+ import './chunk-XWUWYSCT.js';
14
+ import './chunk-YGCVWGUG.js';
15
15
  import './chunk-I4XQ4PV2.js';
16
16
  import './chunk-3SBCBYB7.js';
17
17
  import { useControllable } from './chunk-MMRIQNEN.js';
@@ -1,18 +1,18 @@
1
- 'use client';import { Sheet } from './chunk-XZAEIQDR.js';
1
+ 'use client';import { Sheet } from './chunk-GLT5IKQY.js';
2
2
  import { useDayFocus } from './chunk-TCUCYFT7.js';
3
3
  import { FieldShell, FieldTrigger, parse, today, tzLabel, MONTHS, pad, toKey, add, grid, DOW, col, within } from './chunk-YGGCQNNU.js';
4
- import './chunk-4R2GQO43.js';
5
- import { Popover } from './chunk-O4N2OBTR.js';
4
+ import './chunk-FLO4A6BI.js';
5
+ import { Popover } from './chunk-W5YM2FV4.js';
6
6
  import './chunk-EQ32F2QJ.js';
7
7
  import './chunk-LDC3RIYA.js';
8
8
  import './chunk-GY7JOPUQ.js';
9
9
  import './chunk-UE63OOVG.js';
10
- import { useGlide, GlidePill } from './chunk-MKIQFK7S.js';
10
+ import { useGlide, GlidePill } from './chunk-WM5J5TDI.js';
11
11
  import './chunk-NEF5XAHG.js';
12
- import './chunk-MXOPCFWR.js';
13
- import './chunk-W3SHPKSB.js';
14
- import { useSharedFlip } from './chunk-JSKXZMLH.js';
15
- import './chunk-L3Q3VDIW.js';
12
+ import './chunk-356HZMT4.js';
13
+ import { Motion } from './chunk-2QWJ6FAX.js';
14
+ import './chunk-XWUWYSCT.js';
15
+ import './chunk-YGCVWGUG.js';
16
16
  import './chunk-I4XQ4PV2.js';
17
17
  import { Icon } from './chunk-3SBCBYB7.js';
18
18
  import { useControllable } from './chunk-MMRIQNEN.js';
@@ -25,6 +25,7 @@ import './date-picker.css';
25
25
  import { useState, useEffect, useRef, useId, Fragment } from 'react';
26
26
  import { jsx, jsxs } from 'react/jsx-runtime';
27
27
 
28
+ var CAP_FLIP = { timing: UIMotion.t.settle };
28
29
  function drpDisplay(key, withYear) {
29
30
  const d = parse(key);
30
31
  const mon = MONTHS[d.getMonth()].slice(0, 3);
@@ -70,8 +71,8 @@ function DrpPanel({ value, commit, close, min, max, timezone, label, months, lay
70
71
  const uid = useId();
71
72
  const gridGlide = useGlide(daysRef);
72
73
  const presetGlide = useGlide(presetsRef);
73
- const capLoRef = useSharedFlip("drp-cap-lo-" + uid, { timing: UIMotion.t.settle });
74
- const capHiRef = useSharedFlip("drp-cap-hi-" + uid, { timing: UIMotion.t.settle });
74
+ const capLoId = "drp-cap-lo-" + uid;
75
+ const capHiId = "drp-cap-hi-" + uid;
75
76
  const inBounds = (key) => within(key, min, max);
76
77
  let lo = null, hi = null, provisional = false;
77
78
  if (anchor) {
@@ -193,8 +194,26 @@ function DrpPanel({ value, commit, close, min, max, timezone, label, months, lay
193
194
  },
194
195
  children: [
195
196
  band ? /* @__PURE__ */ jsx("span", { className: bandCls.join(" "), "aria-hidden": "true" }) : null,
196
- loCap ? /* @__PURE__ */ jsx("span", { className: "drp__cap" + (loGhost ? " drp__cap--ghost" : ""), "aria-hidden": "true", ref: capLoRef }) : null,
197
- hiCap ? /* @__PURE__ */ jsx("span", { className: "drp__cap" + (hiGhost ? " drp__cap--ghost" : ""), "aria-hidden": "true", ref: capHiRef }) : null,
197
+ loCap ? /* @__PURE__ */ jsx(
198
+ Motion,
199
+ {
200
+ as: "span",
201
+ layoutId: capLoId,
202
+ layoutTransition: CAP_FLIP,
203
+ className: "drp__cap" + (loGhost ? " drp__cap--ghost" : ""),
204
+ "aria-hidden": "true"
205
+ }
206
+ ) : null,
207
+ hiCap ? /* @__PURE__ */ jsx(
208
+ Motion,
209
+ {
210
+ as: "span",
211
+ layoutId: capHiId,
212
+ layoutTransition: CAP_FLIP,
213
+ className: "drp__cap" + (hiGhost ? " drp__cap--ghost" : ""),
214
+ "aria-hidden": "true"
215
+ }
216
+ ) : null,
198
217
  /* @__PURE__ */ jsx("span", { className: "dtp__num", children: d.getDate() }),
199
218
  key === todayKey ? /* @__PURE__ */ jsx("span", { className: "dtp__dot", "aria-hidden": "true" }) : null
200
219
  ]