@zyncat/ui 0.8.0 → 0.9.1

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 (78) hide show
  1. package/README.md +2 -2
  2. package/dist/alert.js +6 -7
  3. package/dist/alert.js.map +1 -1
  4. package/dist/button.css +10 -2
  5. package/dist/button.d.ts +2 -6
  6. package/dist/button.js +1 -1
  7. package/dist/{chunk-U5QQZC3U.js → chunk-2F5PITAO.js} +2 -6
  8. package/dist/chunk-2F5PITAO.js.map +1 -0
  9. package/dist/chunk-2QWJ6FAX.js +78 -0
  10. package/dist/chunk-2QWJ6FAX.js.map +1 -0
  11. package/dist/{chunk-MXOPCFWR.js → chunk-356HZMT4.js} +25 -4
  12. package/dist/chunk-356HZMT4.js.map +1 -0
  13. package/dist/{chunk-QMSJZCK3.js → chunk-45XJ75GZ.js} +9 -9
  14. package/dist/chunk-45XJ75GZ.js.map +1 -0
  15. package/dist/{chunk-4R2GQO43.js → chunk-FLO4A6BI.js} +4 -4
  16. package/dist/{chunk-4R2GQO43.js.map → chunk-FLO4A6BI.js.map} +1 -1
  17. package/dist/{chunk-XZAEIQDR.js → chunk-GLT5IKQY.js} +5 -5
  18. package/dist/{chunk-XZAEIQDR.js.map → chunk-GLT5IKQY.js.map} +1 -1
  19. package/dist/{chunk-O4N2OBTR.js → chunk-W5YM2FV4.js} +4 -4
  20. package/dist/{chunk-O4N2OBTR.js.map → chunk-W5YM2FV4.js.map} +1 -1
  21. package/dist/{chunk-MKIQFK7S.js → chunk-WM5J5TDI.js} +3 -3
  22. package/dist/{chunk-MKIQFK7S.js.map → chunk-WM5J5TDI.js.map} +1 -1
  23. package/dist/{chunk-W3SHPKSB.js → chunk-XWUWYSCT.js} +16 -6
  24. package/dist/chunk-XWUWYSCT.js.map +1 -0
  25. package/dist/{chunk-2HORSLXJ.js → chunk-Y7AJQVWJ.js} +17 -8
  26. package/dist/chunk-Y7AJQVWJ.js.map +1 -0
  27. package/dist/{chunk-L3Q3VDIW.js → chunk-YGCVWGUG.js} +6 -32
  28. package/dist/chunk-YGCVWGUG.js.map +1 -0
  29. package/dist/date-field.js +8 -8
  30. package/dist/date-range-field.js +32 -13
  31. package/dist/date-range-field.js.map +1 -1
  32. package/dist/datetime-field.js +8 -8
  33. package/dist/dialog.js +4 -4
  34. package/dist/glide.js +2 -2
  35. package/dist/motion-devtools.js +2 -2
  36. package/dist/multi-select.js +6 -6
  37. package/dist/pagination.js +2 -2
  38. package/dist/popover.js +4 -4
  39. package/dist/radio-group.js +36 -9
  40. package/dist/radio-group.js.map +1 -1
  41. package/dist/select.js +6 -6
  42. package/dist/sheet.js +5 -5
  43. package/dist/table.js +7 -7
  44. package/dist/table.js.map +1 -1
  45. package/dist/tabs.js +2 -2
  46. package/dist/tag.js +7 -7
  47. package/dist/tag.js.map +1 -1
  48. package/dist/toast.js +5 -6
  49. package/dist/toast.js.map +1 -1
  50. package/dist/tooltip.js +3 -3
  51. package/llms.txt +9 -8
  52. package/package.json +11 -10
  53. package/src/components/composites/date-picker/calendar-panel.tsx +12 -3
  54. package/src/components/composites/date-picker/range-panel.tsx +19 -5
  55. package/src/components/composites/select/core/trigger.tsx +8 -12
  56. package/src/components/composites/table/Table.tsx +4 -2
  57. package/src/components/primitives/button/Button.tsx +0 -16
  58. package/src/components/primitives/button/button.css +10 -2
  59. package/src/components/primitives/radio-group/RadioGroup.tsx +26 -7
  60. package/src/components/primitives/tag/Tag.tsx +2 -1
  61. package/src/engine/ease.ts +7 -39
  62. package/src/engine/index.ts +1 -11
  63. package/src/motion/element.tsx +9 -9
  64. package/src/motion/flip.ts +61 -0
  65. package/src/motion/presence-context.ts +4 -3
  66. package/src/motion/presence.tsx +25 -1
  67. package/src/motion/use-motion.ts +13 -2
  68. package/dist/chunk-2HORSLXJ.js.map +0 -1
  69. package/dist/chunk-36WVAQKL.js +0 -40
  70. package/dist/chunk-36WVAQKL.js.map +0 -1
  71. package/dist/chunk-JSKXZMLH.js +0 -67
  72. package/dist/chunk-JSKXZMLH.js.map +0 -1
  73. package/dist/chunk-L3Q3VDIW.js.map +0 -1
  74. package/dist/chunk-MXOPCFWR.js.map +0 -1
  75. package/dist/chunk-QMSJZCK3.js.map +0 -1
  76. package/dist/chunk-U5QQZC3U.js.map +0 -1
  77. package/dist/chunk-W3SHPKSB.js.map +0 -1
  78. package/src/motion/flip.tsx +0 -87
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/sheet/use-sheet-drag.ts","../src/components/composites/sheet/Sheet.tsx"],"names":["animate","useRef"],"mappings":"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","file":"chunk-XZAEIQDR.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef, type PointerEvent as ReactPointerEvent, type RefObject } from 'react';\nimport { animate, startDrag, type PanInfo } from '../../../engine';\nimport { UIMotion } from '../../../tokens/motion-tokens';\n\nconst SM = UIMotion;\n\nconst DISMISS_RATIO = 0.4;\nconst DISMISS_VELOCITY = 500;\nconst INTENT_PX = 4;\nconst STRETCH_MAX = 0.06;\n\nfunction findScrollable(node: EventTarget | null, stop: HTMLElement | null): HTMLElement | null {\n let el = node instanceof Element ? node : null;\n while (el && el !== stop) {\n const s = getComputedStyle(el);\n if (\n /(auto|scroll)/.test(s.overflowY + s.overflowX) &&\n (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n )\n return el as HTMLElement;\n el = el.parentElement;\n }\n return null;\n}\n\nfunction sheetScrim(panel: HTMLElement | null): HTMLElement | null {\n return panel?.parentElement?.querySelector<HTMLElement>('.overlay-scrim') ?? null;\n}\n\nexport function sheetSpan(panel: HTMLElement, side: 'right' | 'bottom'): number {\n return side === 'bottom' ? panel.offsetHeight : panel.offsetWidth;\n}\n\nexport function useSheetDrag({\n side,\n panelRef,\n enabled,\n requestClose,\n}: {\n side: 'right' | 'bottom';\n panelRef: RefObject<HTMLElement>;\n enabled: boolean;\n requestClose: () => void;\n}) {\n const axis = side === 'bottom' ? 'y' : 'x';\n const savedUserSelect = useRef<string | null>(null);\n\n function suspendSelection() {\n const sel = window.getSelection();\n if (sel) sel.removeAllRanges();\n savedUserSelect.current = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n }\n function restoreSelection() {\n if (savedUserSelect.current === null) return;\n document.body.style.userSelect = savedUserSelect.current;\n savedUserSelect.current = null;\n }\n useEffect(() => restoreSelection, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function paint(el: HTMLElement, travel: number, stretch: number) {\n const span = sheetSpan(el, side);\n el.style.translate = axis === 'y' ? `0px ${travel}px` : `${travel}px 0px`;\n el.style.scale = axis === 'y' ? `1 ${stretch}` : `${stretch} 1`;\n const scrim = sheetScrim(el);\n if (scrim) scrim.style.opacity = String(1 - Math.min(Math.max(travel / span, 0), 1));\n }\n\n function onPointerDown(e: ReactPointerEvent) {\n if (e.button !== 0) return;\n const startX = e.clientX,\n startY = e.clientY;\n const scrollable = findScrollable(e.target, panelRef.current);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX,\n dy = ev.clientY - startY;\n if (Math.max(Math.abs(dx), Math.abs(dy)) < INTENT_PX) return;\n cleanup();\n const along = axis === 'y' ? dy : dx;\n const cross = axis === 'y' ? dx : dy;\n if (Math.abs(along) <= Math.abs(cross)) return;\n if (scrollable) {\n if (along < 0) return;\n if (axis === 'y' ? scrollable.scrollTop > 0 : scrollable.scrollLeft > 0) return;\n }\n suspendSelection();\n startDrag(ev, { onMove: onDrag, onEnd: onDragEnd });\n };\n\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', cleanup);\n window.removeEventListener('pointercancel', cleanup);\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', cleanup);\n window.addEventListener('pointercancel', cleanup);\n }\n\n function onDrag(info: PanInfo) {\n const el = panelRef.current;\n if (!el) return;\n const o = info.offset[axis];\n const span = sheetSpan(el, side);\n paint(el, Math.max(o, 0), o < 0 ? 1 + Math.min(-o / span, 1) * STRETCH_MAX : 1);\n }\n\n function onDragEnd(info: PanInfo) {\n restoreSelection();\n const el = panelRef.current;\n if (!el) return;\n const span = sheetSpan(el, side);\n if (info.offset[axis] > span * DISMISS_RATIO || info.velocity[axis] > DISMISS_VELOCITY) {\n requestClose();\n return;\n }\n animate(el, { x: [0], y: [0], scale: [[1, 1]], timing: SM.t.settle });\n const scrim = sheetScrim(el);\n if (scrim) animate(scrim, { opacity: [1], timing: SM.t.settle });\n }\n\n return enabled ? { onPointerDown } : {};\n}\n","'use client';\n\nimport './sheet.css';\nimport { Fragment, useId, useRef, type HTMLAttributes, type ReactElement, type ReactNode } from 'react';\nimport { animate, type Layer } from '../../../engine';\nimport { Presence } from '../../../motion/presence';\nimport 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, OverlayPortal } from '../../internal/overlay/layer';\nimport { ModalShell } from '../../internal/overlay/modal';\nimport { useSheetDrag, sheetSpan } from './use-sheet-drag';\nimport type { DataAttributes } from '../../../dom-props';\n\nconst SHEET_TIMING = {\n open: { duration: 'slow', ease: 'entrance' },\n close: { duration: 'base', ease: 'exit' },\n} as const;\n\nexport interface SheetProps {\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 open the sheet on click. */\n trigger?: ReactElement | null;\n\n /** Edge the sheet slides in from. Default 'right'. */\n side?: 'right' | 'bottom';\n\n /** Scrim/Esc dismissal + drag-to-edge. 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 sheet panel. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Open/close timing - motion tokens only, or `null` to disable. @default open 'slow'/'entrance', close 'base'/'exit' */\n animation?: DisableableAnimation;\n /** The ENTIRE surface - paint AND semantics. Drive dismissal with `open`/`onOpenChange`. */\n children: ReactNode;\n}\n\nfunction sheetSlide(slot: HTMLElement, side: 'right' | 'bottom', at: number[]): Layer {\n const frames = at.map((ratio) => ratio * sheetSpan(slot, side));\n return side === 'bottom' ? { y: frames } : { x: frames };\n}\n\nfunction SheetShell({\n side,\n panelId,\n dismissible,\n requestClose,\n htmlProps,\n animate,\n exit,\n children,\n}: {\n side: 'right' | 'bottom';\n panelId: string;\n dismissible: boolean;\n requestClose: () => void;\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n children: ReactNode;\n} & MotionSpecs) {\n const panelRef = useRef<HTMLElement>(null);\n const dragProps = useSheetDrag({ side, panelRef, enabled: dismissible, requestClose });\n return (\n <ModalShell\n animate={animate}\n exit={exit}\n layerClass={'overlay-layer--sheet-' + side}\n panelClass={'overlay-panel--sheet-' + side}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={requestClose}\n panelRef={panelRef}\n panelProps={{ ...htmlProps, ...dragProps }}\n >\n {children}\n </ModalShell>\n );\n}\n\nexport function Sheet({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n trigger = null,\n side = 'right',\n dismissible = true,\n id,\n htmlProps,\n animation,\n children,\n}: SheetProps) {\n const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement>(null);\n const autoId = useId();\n const panelId = id || 'sheet-' + autoId;\n const close = () => setOpen(false);\n const timings = resolveMotionTiming(animation, SHEET_TIMING);\n\n return (\n <Fragment>\n {ovCloneTrigger(trigger, { open, onPress: () => setOpen(true), panelId, haspopup: 'dialog', triggerRef })}\n <OverlayPortal>\n <Presence>\n {open && (\n <SheetShell\n key=\"sheet\"\n animate={(slot) => {\n const play = animate(slot, { ...sheetSlide(slot, side, [1, 0]), timing: timings.open });\n play.finished.then(() => play.stop());\n return play;\n }}\n exit={(slot) => animate(slot, { ...sheetSlide(slot, side, [1]), timing: timings.close })}\n side={side}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={close}\n htmlProps={htmlProps}\n >\n {children}\n </SheetShell>\n )}\n </Presence>\n </OverlayPortal>\n </Fragment>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/composites/sheet/use-sheet-drag.ts","../src/components/composites/sheet/Sheet.tsx"],"names":["animate","useRef"],"mappings":"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","file":"chunk-GLT5IKQY.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef, type PointerEvent as ReactPointerEvent, type RefObject } from 'react';\nimport { animate, startDrag, type PanInfo } from '../../../engine';\nimport { UIMotion } from '../../../tokens/motion-tokens';\n\nconst SM = UIMotion;\n\nconst DISMISS_RATIO = 0.4;\nconst DISMISS_VELOCITY = 500;\nconst INTENT_PX = 4;\nconst STRETCH_MAX = 0.06;\n\nfunction findScrollable(node: EventTarget | null, stop: HTMLElement | null): HTMLElement | null {\n let el = node instanceof Element ? node : null;\n while (el && el !== stop) {\n const s = getComputedStyle(el);\n if (\n /(auto|scroll)/.test(s.overflowY + s.overflowX) &&\n (el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n )\n return el as HTMLElement;\n el = el.parentElement;\n }\n return null;\n}\n\nfunction sheetScrim(panel: HTMLElement | null): HTMLElement | null {\n return panel?.parentElement?.querySelector<HTMLElement>('.overlay-scrim') ?? null;\n}\n\nexport function sheetSpan(panel: HTMLElement, side: 'right' | 'bottom'): number {\n return side === 'bottom' ? panel.offsetHeight : panel.offsetWidth;\n}\n\nexport function useSheetDrag({\n side,\n panelRef,\n enabled,\n requestClose,\n}: {\n side: 'right' | 'bottom';\n panelRef: RefObject<HTMLElement>;\n enabled: boolean;\n requestClose: () => void;\n}) {\n const axis = side === 'bottom' ? 'y' : 'x';\n const savedUserSelect = useRef<string | null>(null);\n\n function suspendSelection() {\n const sel = window.getSelection();\n if (sel) sel.removeAllRanges();\n savedUserSelect.current = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n }\n function restoreSelection() {\n if (savedUserSelect.current === null) return;\n document.body.style.userSelect = savedUserSelect.current;\n savedUserSelect.current = null;\n }\n useEffect(() => restoreSelection, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n function paint(el: HTMLElement, travel: number, stretch: number) {\n const span = sheetSpan(el, side);\n el.style.translate = axis === 'y' ? `0px ${travel}px` : `${travel}px 0px`;\n el.style.scale = axis === 'y' ? `1 ${stretch}` : `${stretch} 1`;\n const scrim = sheetScrim(el);\n if (scrim) scrim.style.opacity = String(1 - Math.min(Math.max(travel / span, 0), 1));\n }\n\n function onPointerDown(e: ReactPointerEvent) {\n if (e.button !== 0) return;\n const startX = e.clientX,\n startY = e.clientY;\n const scrollable = findScrollable(e.target, panelRef.current);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX,\n dy = ev.clientY - startY;\n if (Math.max(Math.abs(dx), Math.abs(dy)) < INTENT_PX) return;\n cleanup();\n const along = axis === 'y' ? dy : dx;\n const cross = axis === 'y' ? dx : dy;\n if (Math.abs(along) <= Math.abs(cross)) return;\n if (scrollable) {\n if (along < 0) return;\n if (axis === 'y' ? scrollable.scrollTop > 0 : scrollable.scrollLeft > 0) return;\n }\n suspendSelection();\n startDrag(ev, { onMove: onDrag, onEnd: onDragEnd });\n };\n\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', cleanup);\n window.removeEventListener('pointercancel', cleanup);\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', cleanup);\n window.addEventListener('pointercancel', cleanup);\n }\n\n function onDrag(info: PanInfo) {\n const el = panelRef.current;\n if (!el) return;\n const o = info.offset[axis];\n const span = sheetSpan(el, side);\n paint(el, Math.max(o, 0), o < 0 ? 1 + Math.min(-o / span, 1) * STRETCH_MAX : 1);\n }\n\n function onDragEnd(info: PanInfo) {\n restoreSelection();\n const el = panelRef.current;\n if (!el) return;\n const span = sheetSpan(el, side);\n if (info.offset[axis] > span * DISMISS_RATIO || info.velocity[axis] > DISMISS_VELOCITY) {\n requestClose();\n return;\n }\n animate(el, { x: [0], y: [0], scale: [[1, 1]], timing: SM.t.settle });\n const scrim = sheetScrim(el);\n if (scrim) animate(scrim, { opacity: [1], timing: SM.t.settle });\n }\n\n return enabled ? { onPointerDown } : {};\n}\n","'use client';\n\nimport './sheet.css';\nimport { Fragment, useId, useRef, type HTMLAttributes, type ReactElement, type ReactNode } from 'react';\nimport { animate, type Layer } from '../../../engine';\nimport { Presence } from '../../../motion/presence';\nimport 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, OverlayPortal } from '../../internal/overlay/layer';\nimport { ModalShell } from '../../internal/overlay/modal';\nimport { useSheetDrag, sheetSpan } from './use-sheet-drag';\nimport type { DataAttributes } from '../../../dom-props';\n\nconst SHEET_TIMING = {\n open: { duration: 'slow', ease: 'entrance' },\n close: { duration: 'base', ease: 'exit' },\n} as const;\n\nexport interface SheetProps {\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 open the sheet on click. */\n trigger?: ReactElement | null;\n\n /** Edge the sheet slides in from. Default 'right'. */\n side?: 'right' | 'bottom';\n\n /** Scrim/Esc dismissal + drag-to-edge. 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 sheet panel. */\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n /** Open/close timing - motion tokens only, or `null` to disable. @default open 'slow'/'entrance', close 'base'/'exit' */\n animation?: DisableableAnimation;\n /** The ENTIRE surface - paint AND semantics. Drive dismissal with `open`/`onOpenChange`. */\n children: ReactNode;\n}\n\nfunction sheetSlide(slot: HTMLElement, side: 'right' | 'bottom', at: number[]): Layer {\n const frames = at.map((ratio) => ratio * sheetSpan(slot, side));\n return side === 'bottom' ? { y: frames } : { x: frames };\n}\n\nfunction SheetShell({\n side,\n panelId,\n dismissible,\n requestClose,\n htmlProps,\n animate,\n exit,\n children,\n}: {\n side: 'right' | 'bottom';\n panelId: string;\n dismissible: boolean;\n requestClose: () => void;\n htmlProps?: HTMLAttributes<HTMLDivElement> & DataAttributes;\n children: ReactNode;\n} & MotionSpecs) {\n const panelRef = useRef<HTMLElement>(null);\n const dragProps = useSheetDrag({ side, panelRef, enabled: dismissible, requestClose });\n return (\n <ModalShell\n animate={animate}\n exit={exit}\n layerClass={'overlay-layer--sheet-' + side}\n panelClass={'overlay-panel--sheet-' + side}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={requestClose}\n panelRef={panelRef}\n panelProps={{ ...htmlProps, ...dragProps }}\n >\n {children}\n </ModalShell>\n );\n}\n\nexport function Sheet({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n trigger = null,\n side = 'right',\n dismissible = true,\n id,\n htmlProps,\n animation,\n children,\n}: SheetProps) {\n const [open, setOpen] = useControllable(controlledOpen, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement>(null);\n const autoId = useId();\n const panelId = id || 'sheet-' + autoId;\n const close = () => setOpen(false);\n const timings = resolveMotionTiming(animation, SHEET_TIMING);\n\n return (\n <Fragment>\n {ovCloneTrigger(trigger, { open, onPress: () => setOpen(true), panelId, haspopup: 'dialog', triggerRef })}\n <OverlayPortal>\n <Presence>\n {open && (\n <SheetShell\n key=\"sheet\"\n animate={(slot) => {\n const play = animate(slot, { ...sheetSlide(slot, side, [1, 0]), timing: timings.open });\n play.finished.then(() => play.stop());\n return play;\n }}\n exit={(slot) => animate(slot, { ...sheetSlide(slot, side, [1]), timing: timings.close })}\n side={side}\n panelId={panelId}\n dismissible={dismissible}\n requestClose={close}\n htmlProps={htmlProps}\n >\n {children}\n </SheetShell>\n )}\n </Presence>\n </OverlayPortal>\n </Fragment>\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":"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","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"]}
@@ -1,16 +1,17 @@
1
1
  'use client';import { useDayFocus } from './chunk-TCUCYFT7.js';
2
2
  import { parse, today, grid, toKey, MONTHS, DOW, tzLabel, within, col } from './chunk-YGGCQNNU.js';
3
- import { useGlide, GlidePill } from './chunk-MKIQFK7S.js';
4
- import { useSharedFlip } from './chunk-JSKXZMLH.js';
5
- import { animate } from './chunk-L3Q3VDIW.js';
3
+ import { useGlide, GlidePill } from './chunk-WM5J5TDI.js';
4
+ import { Motion } from './chunk-2QWJ6FAX.js';
5
+ import { animate } from './chunk-YGCVWGUG.js';
6
6
  import { Icon } from './chunk-3SBCBYB7.js';
7
7
  import { UIMotion } from './chunk-S5ZTZANS.js';
8
- import { Button } from './chunk-U5QQZC3U.js';
8
+ import { Button } from './chunk-2F5PITAO.js';
9
9
  import { cx } from './chunk-QGNC7LH5.js';
10
10
  import './date-picker.css';
11
11
  import { useState, useRef, useId, useEffect } from 'react';
12
12
  import { jsxs, jsx } from 'react/jsx-runtime';
13
13
 
14
+ var PILL_FLIP = { timing: UIMotion.t.settle };
14
15
  function DtpPanel({ val, commit, min, max, timezone, label, close, slot }) {
15
16
  const seed = val ? parse(val) : /* @__PURE__ */ new Date();
16
17
  const [view, setView] = useState({ y: seed.getFullYear(), m: seed.getMonth() });
@@ -20,7 +21,6 @@ function DtpPanel({ val, commit, min, max, timezone, label, close, slot }) {
20
21
  const uid = useId();
21
22
  const pillId = "dtp-pill-" + uid;
22
23
  const glide = useGlide(daysRef);
23
- const pillRef = useSharedFlip(pillId, { timing: UIMotion.t.settle });
24
24
  const inRange = (key) => within(key, min, max);
25
25
  function pickDay(key) {
26
26
  if (!inRange(key)) return;
@@ -164,7 +164,16 @@ function DtpPanel({ val, commit, min, max, timezone, label, close, slot }) {
164
164
  onClick: () => pickDay(key),
165
165
  onPointerEnter: (e) => glide.enter(e.currentTarget),
166
166
  children: [
167
- sel ? /* @__PURE__ */ jsx("span", { className: "dtp__pill", "aria-hidden": "true", ref: pillRef }) : null,
167
+ sel ? /* @__PURE__ */ jsx(
168
+ Motion,
169
+ {
170
+ as: "span",
171
+ layoutId: pillId,
172
+ layoutTransition: PILL_FLIP,
173
+ className: "dtp__pill",
174
+ "aria-hidden": "true"
175
+ }
176
+ ) : null,
168
177
  /* @__PURE__ */ jsx("span", { className: "dtp__num", children: d.getDate() }),
169
178
  key === todayKey ? /* @__PURE__ */ jsx("span", { className: "dtp__dot", "aria-hidden": "true" }) : null
170
179
  ]
@@ -187,5 +196,5 @@ function DtpPanel({ val, commit, min, max, timezone, label, close, slot }) {
187
196
  }
188
197
 
189
198
  export { DtpPanel };
190
- //# sourceMappingURL=chunk-2HORSLXJ.js.map
191
- //# sourceMappingURL=chunk-2HORSLXJ.js.map
199
+ //# sourceMappingURL=chunk-Y7AJQVWJ.js.map
200
+ //# sourceMappingURL=chunk-Y7AJQVWJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/composites/date-picker/calendar-panel.tsx"],"names":[],"mappings":"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","file":"chunk-Y7AJQVWJ.js","sourcesContent":["'use client';\n\nimport './date-picker.css';\nimport { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { animate } from '../../../engine';\nimport { UIMotion } from '../../../tokens/motion-tokens';\nimport { Icon } from '../../internal/icon/Icon';\nimport { Button } from '../../primitives/button/Button';\nimport { GlidePill, useGlide } from '../../../motion/glide';\nimport { Motion } from '../../../motion/element';\nimport { useDayFocus } from './use-day-focus';\nimport { MONTHS, DOW, toKey, parse, col, today, grid, tzLabel, within } from './date-utils';\nimport { cx } from '../../internal/utils/cx';\n\nconst PILL_FLIP = { timing: UIMotion.t.settle };\n\ninterface DtpPanelProps {\n val: string | null;\n commit: (key: string) => void;\n close: () => void;\n min?: string;\n max?: string;\n timezone?: string;\n label?: string;\n slot?: ReactNode;\n}\n\nexport function DtpPanel({ val, commit, min, max, timezone, label, close, slot }: DtpPanelProps) {\n const seed = val ? parse(val) : new Date();\n const [view, setView] = useState<{ y: number; m: number }>({ y: seed.getFullYear(), m: seed.getMonth() });\n const [focusKey, setFocusKey] = useState<string>(val || today());\n\n const daysRef = useRef<HTMLDivElement>(null);\n const prevViewRef = useRef<number | null>(null);\n const uid = useId();\n const pillId = 'dtp-pill-' + uid;\n\n const glide = useGlide(daysRef);\n\n const inRange = (key: string): boolean => within(key, min, max);\n\n function pickDay(key: string) {\n if (!inRange(key)) return;\n armFocus();\n setFocusKey(key);\n const d = parse(key);\n goToMonth(d.getFullYear(), d.getMonth());\n commit(key);\n }\n\n function goToMonth(y: number, m: number) {\n setView((v) => (v.y === y && v.m === m ? v : { y: y, m: m }));\n }\n function nav(dir: number) {\n const d = new Date(view.y, view.m + dir, 1);\n goToMonth(d.getFullYear(), d.getMonth());\n }\n const now = new Date();\n const viewIsCurrent = view.y === now.getFullYear() && view.m === now.getMonth();\n function goToToday() {\n const key = today();\n const d = parse(key);\n armFocus();\n setFocusKey(key);\n goToMonth(d.getFullYear(), d.getMonth());\n }\n const viewIdx = view.y * 12 + view.m;\n const armFocus = useDayFocus(daysRef, focusKey, viewIdx, '[tabindex=\"0\"]:not(:disabled)');\n useEffect(() => {\n const prev = prevViewRef.current;\n prevViewRef.current = viewIdx;\n const el = daysRef.current;\n if (prev == null || prev === viewIdx || !el) return;\n const dir = viewIdx > prev ? 1 : -1;\n animate(el, { x: [dir * 16, 0], opacity: [0, 1], timing: UIMotion.t.enter });\n }, [viewIdx]);\n\n function moveFocus(deltaDays: number, deltaMonths: number) {\n const d = parse(focusKey);\n if (deltaMonths) d.setMonth(d.getMonth() + deltaMonths);\n if (deltaDays) d.setDate(d.getDate() + deltaDays);\n const key = toKey(d);\n armFocus();\n setFocusKey(key);\n goToMonth(d.getFullYear(), d.getMonth());\n }\n function onGridKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n const k = e.key;\n if (k === 'ArrowLeft') moveFocus(-1, 0);\n else if (k === 'ArrowRight') moveFocus(1, 0);\n else if (k === 'ArrowUp') moveFocus(-7, 0);\n else if (k === 'ArrowDown') moveFocus(7, 0);\n else if (k === 'PageUp') moveFocus(0, -1);\n else if (k === 'PageDown') moveFocus(0, 1);\n else if (k === 'Home') moveFocus(-col(parse(focusKey)), 0);\n else if (k === 'End') moveFocus(6 - col(parse(focusKey)), 0);\n else if (k === 'Enter' || k === ' ') pickDay(focusKey);\n else return;\n e.preventDefault();\n }\n\n const days = grid(view.y, view.m);\n const todayKey = today();\n const selKey = val || null;\n const gridKeys = days.map(toKey);\n const tabKey =\n gridKeys.indexOf(focusKey) >= 0\n ? focusKey\n : selKey && gridKeys.indexOf(selKey) >= 0\n ? selKey\n : gridKeys.indexOf(todayKey) >= 0\n ? todayKey\n : toKey(new Date(view.y, view.m, 1));\n\n const prevEnd = toKey(new Date(view.y, view.m, 0));\n const nextStart = toKey(new Date(view.y, view.m + 1, 1));\n const canPrev = !min || prevEnd >= min;\n const canNext = !max || nextStart <= max;\n\n const weeks: Date[][] = [];\n for (let w = 0; w < 6; w++) weeks.push(days.slice(w * 7, w * 7 + 7));\n\n return (\n <div className=\"dtp\" role=\"dialog\" aria-label={label || 'Pick a date'}>\n <div className=\"dtp__cal\">\n <div className=\"dtp__head\">\n <span className=\"dtp__month\" aria-live=\"polite\">\n {MONTHS[view.m]} <span className=\"dtp__year\">{view.y}</span>\n </span>\n <div className=\"dtp__navs\">\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Previous month\"\n disabled={!canPrev}\n onClick={() => nav(-1)}\n >\n <Icon name=\"caret-left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Go to today\"\n disabled={viewIsCurrent}\n onClick={goToToday}\n >\n <Icon name=\"calendar-dot\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n className=\"dtp__nav\"\n aria-label=\"Next month\"\n disabled={!canNext}\n onClick={() => nav(1)}\n >\n <Icon name=\"caret-right\" size=\"sm\" />\n </button>\n </div>\n </div>\n <div className=\"dtp__dow\" aria-hidden=\"true\">\n {DOW.map((d) => (\n <span key={d}>{d}</span>\n ))}\n </div>\n <div\n className=\"dtp__days\"\n ref={daysRef}\n role=\"grid\"\n aria-label=\"Calendar\"\n onKeyDown={onGridKeyDown}\n onPointerLeave={glide.leave}\n >\n {weeks.map((week, wi) => (\n <div key={wi} role=\"row\" className=\"dtp__row\">\n {week.map((d) => {\n const key = toKey(d);\n const out = d.getMonth() !== view.m;\n const sel = key === selKey;\n const cls = cx('dtp__day', out && 'is-out', sel && 'is-selected', key === todayKey && 'is-today');\n return (\n <button\n key={key}\n type=\"button\"\n role=\"gridcell\"\n data-key={key}\n className={cls}\n disabled={!inRange(key)}\n tabIndex={key === tabKey ? 0 : -1}\n aria-selected={sel || undefined}\n aria-label={MONTHS[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear()}\n onClick={() => pickDay(key)}\n onPointerEnter={(e) => glide.enter(e.currentTarget)}\n >\n {sel ? (\n <Motion\n as=\"span\"\n layoutId={pillId}\n layoutTransition={PILL_FLIP}\n className=\"dtp__pill\"\n aria-hidden=\"true\"\n />\n ) : null}\n <span className=\"dtp__num\">{d.getDate()}</span>\n {key === todayKey ? <span className=\"dtp__dot\" aria-hidden=\"true\"></span> : null}\n </button>\n );\n })}\n </div>\n ))}\n <GlidePill className=\"dtp__hover\" glide={glide} />\n </div>\n </div>\n\n {slot || null}\n\n <div className=\"dtp__foot\">\n {timezone ? <span className=\"dtp__tz\">{tzLabel(timezone, selKey)}</span> : null}\n <span className=\"dtp__footSpacer\"></span>\n <Button variant=\"primary\" size=\"sm\" onClick={close}>\n Done\n </Button>\n </div>\n </div>\n );\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,22 +1,22 @@
1
- 'use client';import { DtpPanel } from './chunk-2HORSLXJ.js';
1
+ 'use client';import { DtpPanel } from './chunk-Y7AJQVWJ.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';
18
18
  import './chunk-S5ZTZANS.js';
19
- import './chunk-U5QQZC3U.js';
19
+ import './chunk-2F5PITAO.js';
20
20
  import './chunk-7SZCJ7WI.js';
21
21
  import './chunk-VTJTGVZZ.js';
22
22
  import './chunk-QGNC7LH5.js';
@@ -1,23 +1,23 @@
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';
19
19
  import { UIMotion } from './chunk-S5ZTZANS.js';
20
- import { Button } from './chunk-U5QQZC3U.js';
20
+ import { Button } from './chunk-2F5PITAO.js';
21
21
  import './chunk-7SZCJ7WI.js';
22
22
  import './chunk-VTJTGVZZ.js';
23
23
  import './chunk-QGNC7LH5.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
  ]