@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
@@ -102,7 +102,8 @@ export function Tag({
102
102
  ref={ref}
103
103
  animate={group?.animate}
104
104
  exit={group?.exit}
105
- layout={group?.layout}
105
+ layout={!!group}
106
+ layoutTransition={group?.layout}
106
107
  className={cls}
107
108
  style={style}
108
109
  data-disabled={disabled ? 'true' : undefined}
@@ -14,40 +14,13 @@ const NAMED: Record<string, Bezier> = {
14
14
  anticipate: [0.38, -0.4, 0.88, 1.08],
15
15
  };
16
16
 
17
- const bezierCurve = (a: number, b: number, t: number) => {
18
- const u = 1 - t;
19
- return 3 * a * u * u * t + 3 * b * u * t * t + t * t * t;
20
- };
21
-
22
- const bezierSlope = (a: number, b: number, t: number) => {
23
- const u = 1 - t;
24
- return 3 * a * (u * u - 2 * t * u) + 3 * b * (2 * t * u - t * t) + 3 * t * t;
25
- };
26
-
27
- export function bezierAt(b: Bezier, x: number): number {
28
- const [x1, y1, x2, y2] = b;
29
- if (x1 === y1 && x2 === y2) return x;
30
- if (x <= 0) return 0;
31
- if (x >= 1) return 1;
32
- let t = x;
33
- for (let i = 0; i < 8; i++) {
34
- const err = bezierCurve(x1, x2, t) - x;
35
- if (err < 1e-4 && err > -1e-4) break;
36
- const slope = bezierSlope(x1, x2, t);
37
- if (slope < 1e-6 && slope > -1e-6) break;
38
- t -= err / slope;
39
- }
40
- return bezierCurve(y1, y2, t);
41
- }
42
-
43
17
  export type EaseValue = NonNullable<MotionTransition['ease']>;
44
18
 
45
- export const toBezier = (ease: EaseValue): Bezier =>
46
- typeof ease === 'string' ? (NAMED[ease] ?? NAMED.easeInOut) : ease;
19
+ const toBezier = (ease: EaseValue): Bezier => (typeof ease === 'string' ? (NAMED[ease] ?? NAMED.easeInOut) : ease);
47
20
 
48
- export const cssBezier = (ease: EaseValue): string => `cubic-bezier(${toBezier(ease).join(',')})`;
21
+ const cssBezier = (ease: EaseValue): string => `cubic-bezier(${toBezier(ease).join(',')})`;
49
22
 
50
- export const isSegmented = (ease: unknown): ease is EaseValue[] =>
23
+ const isSegmented = (ease: unknown): ease is EaseValue[] =>
51
24
  Array.isArray(ease) && (Array.isArray(ease[0]) || typeof ease[0] === 'string');
52
25
 
53
26
  const ARRIVAL = 0.99;
@@ -103,7 +76,6 @@ function toLinearEasing(at: (progress: number) => number, durationMs: number): s
103
76
  interface SpringCurve {
104
77
  duration: number;
105
78
  easing: string;
106
- at(progress: number): number;
107
79
  }
108
80
 
109
81
  const springCache = new Map<string, SpringCurve>();
@@ -117,7 +89,7 @@ function springCurve(visual: number, bounce: number): SpringCurve {
117
89
  const seconds = settleSeconds(zeta, omega, visual);
118
90
  const duration = seconds * 1000;
119
91
  const at = (progress: number) => (progress >= 1 ? 1 : springAt(zeta, omega, progress * seconds));
120
- const curve: SpringCurve = { duration, easing: toLinearEasing(at, duration), at };
92
+ const curve: SpringCurve = { duration, easing: toLinearEasing(at, duration) };
121
93
  springCache.set(key, curve);
122
94
  return curve;
123
95
  }
@@ -133,7 +105,6 @@ export interface ResolvedTiming {
133
105
  delay: number;
134
106
  easing: string;
135
107
  segments: string[] | null;
136
- at(progress: number): number;
137
108
  }
138
109
 
139
110
  export function resolveTiming(timing: Timing = {}): ResolvedTiming {
@@ -142,14 +113,11 @@ export function resolveTiming(timing: Timing = {}): ResolvedTiming {
142
113
  if (spring) {
143
114
  const visual = Math.max(timing.visualDuration ?? timing.duration ?? 0.3, 0.01);
144
115
  const curve = springCurve(visual, timing.bounce ?? 0);
145
- return { duration: curve.duration, delay, easing: curve.easing, segments: null, at: curve.at };
116
+ return { duration: curve.duration, delay, easing: curve.easing, segments: null };
146
117
  }
147
118
  const duration = (timing.duration ?? 0.3) * 1000;
148
119
  const ease = timing.ease;
149
- if (isSegmented(ease)) {
150
- const first = toBezier(ease[0]);
151
- return { duration, delay, easing: 'linear', segments: ease.map(cssBezier), at: (p) => bezierAt(first, p) };
152
- }
120
+ if (isSegmented(ease)) return { duration, delay, easing: 'linear', segments: ease.map(cssBezier) };
153
121
  const bezier = ease === undefined ? NAMED.easeInOut : toBezier(ease);
154
- return { duration, delay, easing: cssBezier(bezier), segments: null, at: (p) => bezierAt(bezier, p) };
122
+ return { duration, delay, easing: cssBezier(bezier), segments: null };
155
123
  }
@@ -1,13 +1,3 @@
1
- export { animate, clock, type Layer, type Playback, type Size } from './animate';
2
- export {
3
- bezierAt,
4
- cssBezier,
5
- isSegmented,
6
- resolveTiming,
7
- toBezier,
8
- type EaseValue,
9
- type ResolvedTiming,
10
- type Timing,
11
- } from './ease';
1
+ export { animate, clock, type Layer, type Playback } from './animate';
12
2
  export { flip, measure, keepShared, readShared, dropShared, type Box, type FlipOptions } from './flip';
13
3
  export { startDrag, type PanInfo } from './drag';
@@ -1,16 +1,18 @@
1
1
  'use client';
2
2
 
3
3
  import { createElement, useCallback, useRef, type ReactNode, type Ref } from 'react';
4
- import { useSelfFlip, useSharedFlip, type FlipTuning } from './flip';
4
+ import { useFlip, type FlipTuning } from './flip';
5
5
  import { useMotion, type MotionSpecs } from './use-motion';
6
6
 
7
7
  export interface MotionProps extends MotionSpecs {
8
8
  /** Tag for the element this renders. @default 'div' */
9
9
  as?: string;
10
- /** FLIP this element from its previous box on every render; an object tunes the timing. */
11
- layout?: boolean | FlipTuning;
10
+ /** FLIP this element from its previous box on every render. Implied by `layoutId`. */
11
+ layout?: boolean;
12
12
  /** FLIP from whatever element last held this id, so the box travels between nodes. */
13
13
  layoutId?: string;
14
+ /** Tunes whichever layout animation is active; ignored without `layout` or `layoutId`. */
15
+ layoutTransition?: FlipTuning;
14
16
  ref?: Ref<HTMLElement | null>;
15
17
  children?: ReactNode;
16
18
  [prop: string]: unknown;
@@ -24,13 +26,12 @@ export function Motion({
24
26
  deps,
25
27
  layout,
26
28
  layoutId,
29
+ layoutTransition,
27
30
  ref,
28
31
  children,
29
32
  ...rest
30
33
  }: MotionProps) {
31
- const tuning = typeof layout === 'object' ? layout : {};
32
- const selfRef = useSelfFlip<HTMLElement>(tuning, !!layout && !layoutId);
33
- const sharedRef = useSharedFlip<HTMLElement>(layoutId ?? '', tuning, !!layoutId);
34
+ const flipRef = useFlip<HTMLElement>(layoutId ?? null, layoutTransition, !!layoutId || !!layout);
34
35
  const host = useRef<HTMLElement | null>(null);
35
36
  const forwarded = useRef(ref);
36
37
  forwarded.current = ref;
@@ -40,13 +41,12 @@ export function Motion({
40
41
  const attach = useCallback(
41
42
  (el: HTMLElement | null) => {
42
43
  host.current = el;
43
- selfRef.current = el;
44
- sharedRef.current = el;
44
+ flipRef.current = el;
45
45
  const outer = forwarded.current;
46
46
  if (typeof outer === 'function') outer(el);
47
47
  else if (outer) outer.current = el;
48
48
  },
49
- [selfRef, sharedRef],
49
+ [flipRef],
50
50
  );
51
51
 
52
52
  return createElement(as, { ...rest, ref: attach }, children);
@@ -0,0 +1,61 @@
1
+ 'use client';
2
+
3
+ import { useLayoutEffect, useRef, type RefObject } from 'react';
4
+ import {
5
+ dropShared,
6
+ flip,
7
+ keepShared,
8
+ measure,
9
+ readShared,
10
+ type Box,
11
+ type FlipOptions,
12
+ type Playback,
13
+ } from '../engine';
14
+ import { UIMotion } from '../tokens/motion-tokens';
15
+
16
+ export type FlipTuning = FlipOptions;
17
+
18
+ export function useFlip<T extends HTMLElement>(
19
+ sharedId: string | null,
20
+ tuning: FlipTuning = {},
21
+ enabled = true,
22
+ ): RefObject<T | null> {
23
+ const ref = useRef<T | null>(null);
24
+ const privateBox = useRef<Box | null>(null);
25
+ const playing = useRef<{ play: Playback; el: T } | null>(null);
26
+ const { scale, timing } = tuning;
27
+
28
+ useLayoutEffect(() => {
29
+ const el = ref.current;
30
+ if (!el || !enabled) return;
31
+ const live = playing.current;
32
+ const from = live && live.el === el ? measure(el) : sharedId === null ? privateBox.current : readShared(sharedId);
33
+ live?.play.stop();
34
+ const settled = measure(el);
35
+ if (sharedId === null) privateBox.current = settled;
36
+ else keepShared(sharedId, settled);
37
+ const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
38
+ playing.current = next ? { play: next, el } : null;
39
+ next?.finished.then(() => {
40
+ if (playing.current?.play === next) playing.current = null;
41
+ });
42
+ });
43
+
44
+ useLayoutEffect(() => {
45
+ if (!enabled || sharedId === null) return;
46
+ return () => {
47
+ const live = playing.current;
48
+ if (live) {
49
+ const box = measure(live.el);
50
+ if (box.width && box.height) keepShared(sharedId, box);
51
+ live.play.stop();
52
+ }
53
+ const mine = readShared(sharedId);
54
+ queueMicrotask(() => {
55
+ if (readShared(sharedId) === mine) dropShared(sharedId);
56
+ });
57
+ };
58
+ }, [sharedId, enabled]);
59
+
60
+ return ref;
61
+ }
@@ -7,11 +7,12 @@ export interface PresenceState {
7
7
  isPresent: boolean;
8
8
  /** False for children present at the Presence's own first paint when `initial={false}`. */
9
9
  initial: boolean;
10
- /** Called by the child when its exit has finished; lets Presence drop it from the tree. */
11
- safeToRemove: () => void;
10
+ /** Claims responsibility for animating this child out; call the returned release once the
11
+ * exit has finished. A child nobody claims is dropped as soon as it leaves `children`. */
12
+ claimExit: () => () => void;
12
13
  }
13
14
 
14
- const DETACHED: PresenceState = { isPresent: true, initial: true, safeToRemove: () => {} };
15
+ const DETACHED: PresenceState = { isPresent: true, initial: true, claimExit: () => () => {} };
15
16
 
16
17
  export const PresenceContext = createContext<PresenceState>(DETACHED);
17
18
 
@@ -47,6 +47,29 @@ export function Presence({ children, initial = true, mode = 'sync', onExitComple
47
47
  const wasExiting = useRef(false);
48
48
  const complete = useRef(onExitComplete);
49
49
  complete.current = onExitComplete;
50
+ const claims = useRef(new Map<string, Set<object>>());
51
+
52
+ const drop = (key: string) =>
53
+ setShown((previous) => {
54
+ const next = previous.filter((entry) => entry.key !== key || !entry.exiting);
55
+ return next.length === previous.length ? previous : next;
56
+ });
57
+
58
+ const claimExit = (key: string) => (): (() => void) => {
59
+ let tokens = claims.current.get(key);
60
+ if (!tokens) {
61
+ tokens = new Set<object>();
62
+ claims.current.set(key, tokens);
63
+ }
64
+ const token = {};
65
+ const held = tokens;
66
+ held.add(token);
67
+ return () => {
68
+ if (!held.delete(token) || held.size) return;
69
+ if (claims.current.get(key) === held) claims.current.delete(key);
70
+ drop(key);
71
+ };
72
+ };
50
73
 
51
74
  useLayoutEffect(() => {
52
75
  setShown((previous) => {
@@ -54,6 +77,7 @@ export function Presence({ children, initial = true, mode = 'sync', onExitComple
54
77
  const merged: Entry[] = incoming.map((entry) => ({ ...entry }));
55
78
  previous.forEach((entry, index) => {
56
79
  if (live.has(entry.key)) return;
80
+ if (!claims.current.get(entry.key)?.size) return;
57
81
  merged.splice(index, 0, entry.exiting ? entry : { ...entry, exiting: true });
58
82
  });
59
83
  return merged;
@@ -81,7 +105,7 @@ export function Presence({ children, initial = true, mode = 'sync', onExitComple
81
105
  value: {
82
106
  isPresent: !entry.exiting,
83
107
  initial: initial || !bornAtMount.current.has(entry.key),
84
- safeToRemove: () => setShown((previous) => previous.filter((e) => e.key !== entry.key || !e.exiting)),
108
+ claimExit: claimExit(entry.key),
85
109
  },
86
110
  },
87
111
  fresh.get(entry.key) ?? entry.node,
@@ -36,12 +36,23 @@ export function useMotion(ref: RefObject<HTMLElement | null>, { animate, exit, i
36
36
  const mounted = useRef(false);
37
37
  const spec = useRef({ animate, exit, initial });
38
38
  spec.current = { animate, exit, initial };
39
+ const release = useRef<(() => void) | null>(null);
40
+ const ownsExit = !!exit;
39
41
 
40
42
  const stop = () => {
41
43
  for (const play of playing.current) play.stop();
42
44
  playing.current = [];
43
45
  };
44
46
 
47
+ useLayoutEffect(() => {
48
+ if (!ownsExit) return;
49
+ release.current = presence.claimExit();
50
+ return () => {
51
+ release.current?.();
52
+ release.current = null;
53
+ };
54
+ }, [ownsExit]); // eslint-disable-line react-hooks/exhaustive-deps
55
+
45
56
  useLayoutEffect(() => {
46
57
  const el = ref.current;
47
58
  const atMount = !mounted.current;
@@ -53,11 +64,11 @@ export function useMotion(ref: RefObject<HTMLElement | null>, { animate, exit, i
53
64
  }, deps ?? []); // eslint-disable-line react-hooks/exhaustive-deps
54
65
 
55
66
  useLayoutEffect(() => {
56
- if (presence.isPresent) return;
67
+ if (presence.isPresent || !ownsExit) return;
57
68
  const el = ref.current;
58
69
  stop();
59
70
  playing.current = el ? run(spec.current.exit, el) : [];
60
- allSettled(playing.current).then(presence.safeToRemove);
71
+ allSettled(playing.current).then(() => release.current?.());
61
72
  }, [presence.isPresent]); // eslint-disable-line react-hooks/exhaustive-deps
62
73
 
63
74
  useLayoutEffect(() => stop, []);
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/composites/date-picker/calendar-panel.tsx"],"names":[],"mappings":"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","file":"chunk-2HORSLXJ.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 { useSharedFlip } from '../../../motion/flip';\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\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 const pillRef = useSharedFlip<HTMLSpanElement>(pillId, { timing: UIMotion.t.settle });\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 ? <span className=\"dtp__pill\" aria-hidden=\"true\" ref={pillRef}></span> : 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"]}
@@ -1,40 +0,0 @@
1
- 'use client';import { useMotion } from './chunk-W3SHPKSB.js';
2
- import { useSelfFlip, useSharedFlip } from './chunk-JSKXZMLH.js';
3
- import { useRef, useCallback, createElement } from 'react';
4
-
5
- function Motion({
6
- as = "div",
7
- animate,
8
- exit,
9
- initial,
10
- deps,
11
- layout,
12
- layoutId,
13
- ref,
14
- children,
15
- ...rest
16
- }) {
17
- const tuning = typeof layout === "object" ? layout : {};
18
- const selfRef = useSelfFlip(tuning, !!layout && !layoutId);
19
- const sharedRef = useSharedFlip(layoutId ?? "", tuning, !!layoutId);
20
- const host = useRef(null);
21
- const forwarded = useRef(ref);
22
- forwarded.current = ref;
23
- useMotion(host, { animate, exit, initial, deps });
24
- const attach = useCallback(
25
- (el) => {
26
- host.current = el;
27
- selfRef.current = el;
28
- sharedRef.current = el;
29
- const outer = forwarded.current;
30
- if (typeof outer === "function") outer(el);
31
- else if (outer) outer.current = el;
32
- },
33
- [selfRef, sharedRef]
34
- );
35
- return createElement(as, { ...rest, ref: attach }, children);
36
- }
37
-
38
- export { Motion };
39
- //# sourceMappingURL=chunk-36WVAQKL.js.map
40
- //# sourceMappingURL=chunk-36WVAQKL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/motion/element.tsx"],"names":[],"mappings":";;;;AAkBO,SAAS,MAAA,CAAO;AAAA,EACrB,EAAA,GAAK,KAAA;AAAA,EACL,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,EAAC;AACtD,EAAA,MAAM,UAAU,WAAA,CAAyB,MAAA,EAAQ,CAAC,CAAC,MAAA,IAAU,CAAC,QAAQ,CAAA;AACtE,EAAA,MAAM,YAAY,aAAA,CAA2B,QAAA,IAAY,IAAI,MAAA,EAAQ,CAAC,CAAC,QAAQ,CAAA;AAC/E,EAAA,MAAM,IAAA,GAAO,OAA2B,IAAI,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,EAAA,SAAA,CAAU,OAAA,GAAU,GAAA;AAEpB,EAAA,SAAA,CAAU,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAEhD,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,EAAA,KAA2B;AAC1B,MAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,MAAA,OAAA,CAAQ,OAAA,GAAU,EAAA;AAClB,MAAA,SAAA,CAAU,OAAA,GAAU,EAAA;AACpB,MAAA,MAAM,QAAQ,SAAA,CAAU,OAAA;AACxB,MAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,KAAA,CAAM,EAAE,CAAA;AAAA,WAAA,IAChC,KAAA,QAAa,OAAA,GAAU,EAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,SAAS,SAAS;AAAA,GACrB;AAEA,EAAA,OAAO,aAAA,CAAc,IAAI,EAAE,GAAG,MAAM,GAAA,EAAK,MAAA,IAAU,QAAQ,CAAA;AAC7D","file":"chunk-36WVAQKL.js","sourcesContent":["'use client';\n\nimport { createElement, useCallback, useRef, type ReactNode, type Ref } from 'react';\nimport { useSelfFlip, useSharedFlip, type FlipTuning } from './flip';\nimport { useMotion, type MotionSpecs } from './use-motion';\n\nexport interface MotionProps extends MotionSpecs {\n /** Tag for the element this renders. @default 'div' */\n as?: string;\n /** FLIP this element from its previous box on every render; an object tunes the timing. */\n layout?: boolean | FlipTuning;\n /** FLIP from whatever element last held this id, so the box travels between nodes. */\n layoutId?: string;\n ref?: Ref<HTMLElement | null>;\n children?: ReactNode;\n [prop: string]: unknown;\n}\n\nexport function Motion({\n as = 'div',\n animate,\n exit,\n initial,\n deps,\n layout,\n layoutId,\n ref,\n children,\n ...rest\n}: MotionProps) {\n const tuning = typeof layout === 'object' ? layout : {};\n const selfRef = useSelfFlip<HTMLElement>(tuning, !!layout && !layoutId);\n const sharedRef = useSharedFlip<HTMLElement>(layoutId ?? '', tuning, !!layoutId);\n const host = useRef<HTMLElement | null>(null);\n const forwarded = useRef(ref);\n forwarded.current = ref;\n\n useMotion(host, { animate, exit, initial, deps });\n\n const attach = useCallback(\n (el: HTMLElement | null) => {\n host.current = el;\n selfRef.current = el;\n sharedRef.current = el;\n const outer = forwarded.current;\n if (typeof outer === 'function') outer(el);\n else if (outer) outer.current = el;\n },\n [selfRef, sharedRef],\n );\n\n return createElement(as, { ...rest, ref: attach }, children);\n}\n"]}
@@ -1,67 +0,0 @@
1
- 'use client';import { measure, flip, readShared, keepShared, dropShared } from './chunk-L3Q3VDIW.js';
2
- import { UIMotion } from './chunk-S5ZTZANS.js';
3
- import { useRef, useLayoutEffect } from 'react';
4
-
5
- function useSelfFlip(tuning = {}, enabled = true) {
6
- const ref = useRef(null);
7
- const previous = useRef(null);
8
- const playing = useRef(null);
9
- const { scale, timing } = tuning;
10
- useLayoutEffect(() => {
11
- const el = ref.current;
12
- if (!el || !enabled) return;
13
- const from = playing.current ? measure(el) : previous.current;
14
- playing.current?.stop();
15
- previous.current = measure(el);
16
- const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
17
- playing.current = next;
18
- next?.finished.then(() => {
19
- if (playing.current === next) playing.current = null;
20
- });
21
- });
22
- useLayoutEffect(
23
- () => () => {
24
- playing.current?.stop();
25
- },
26
- []
27
- );
28
- return ref;
29
- }
30
- function useSharedFlip(id, tuning = {}, enabled = true) {
31
- const ref = useRef(null);
32
- const playing = useRef(null);
33
- const { scale, timing } = tuning;
34
- useLayoutEffect(() => {
35
- const el = ref.current;
36
- if (!el || !enabled) return;
37
- const live = playing.current;
38
- const from = live && live.el === el ? measure(el) : readShared(id);
39
- live?.play.stop();
40
- keepShared(id, measure(el));
41
- const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;
42
- playing.current = next ? { play: next, el } : null;
43
- next?.finished.then(() => {
44
- if (playing.current?.play === next) playing.current = null;
45
- });
46
- });
47
- useLayoutEffect(() => {
48
- if (!enabled) return;
49
- return () => {
50
- const live = playing.current;
51
- if (live) {
52
- const box = measure(live.el);
53
- if (box.width && box.height) keepShared(id, box);
54
- live.play.stop();
55
- }
56
- const mine = readShared(id);
57
- queueMicrotask(() => {
58
- if (readShared(id) === mine) dropShared(id);
59
- });
60
- };
61
- }, [id, enabled]);
62
- return ref;
63
- }
64
-
65
- export { useSelfFlip, useSharedFlip };
66
- //# sourceMappingURL=chunk-JSKXZMLH.js.map
67
- //# sourceMappingURL=chunk-JSKXZMLH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/motion/flip.tsx"],"names":[],"mappings":"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","file":"chunk-JSKXZMLH.js","sourcesContent":["'use client';\n\nimport { useLayoutEffect, useRef, type RefObject } from 'react';\nimport {\n dropShared,\n flip,\n keepShared,\n measure,\n readShared,\n type Box,\n type FlipOptions,\n type Playback,\n} from '../engine';\nimport { UIMotion } from '../tokens/motion-tokens';\n\nexport type FlipTuning = FlipOptions;\n\nexport function useSelfFlip<T extends HTMLElement>(tuning: FlipTuning = {}, enabled = true): RefObject<T | null> {\n const ref = useRef<T | null>(null);\n const previous = useRef<Box | null>(null);\n const playing = useRef<Playback | null>(null);\n const { scale, timing } = tuning;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n const from = playing.current ? measure(el) : previous.current;\n playing.current?.stop();\n previous.current = measure(el);\n const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;\n playing.current = next;\n next?.finished.then(() => {\n if (playing.current === next) playing.current = null;\n });\n });\n\n useLayoutEffect(\n () => () => {\n playing.current?.stop();\n },\n [],\n );\n\n return ref;\n}\n\nexport function useSharedFlip<T extends HTMLElement>(\n id: string,\n tuning: FlipTuning = {},\n enabled = true,\n): RefObject<T | null> {\n const ref = useRef<T | null>(null);\n const playing = useRef<{ play: Playback; el: T } | null>(null);\n const { scale, timing } = tuning;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n const live = playing.current;\n const from = live && live.el === el ? measure(el) : readShared(id);\n live?.play.stop();\n keepShared(id, measure(el));\n const next = from && !UIMotion.reduced ? flip(el, from, { scale, timing }) : null;\n playing.current = next ? { play: next, el } : null;\n next?.finished.then(() => {\n if (playing.current?.play === next) playing.current = null;\n });\n });\n\n useLayoutEffect(() => {\n if (!enabled) return;\n return () => {\n const live = playing.current;\n if (live) {\n const box = measure(live.el);\n if (box.width && box.height) keepShared(id, box);\n live.play.stop();\n }\n const mine = readShared(id);\n queueMicrotask(() => {\n if (readShared(id) === mine) dropShared(id);\n });\n };\n }, [id, enabled]);\n\n return ref;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/ease.ts","../src/engine/animate.ts","../src/engine/drag.ts","../src/engine/flip.ts"],"names":[],"mappings":"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","file":"chunk-L3Q3VDIW.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\nconst bezierCurve = (a: number, b: number, t: number) => {\n const u = 1 - t;\n return 3 * a * u * u * t + 3 * b * u * t * t + t * t * t;\n};\n\nconst bezierSlope = (a: number, b: number, t: number) => {\n const u = 1 - t;\n return 3 * a * (u * u - 2 * t * u) + 3 * b * (2 * t * u - t * t) + 3 * t * t;\n};\n\nexport function bezierAt(b: Bezier, x: number): number {\n const [x1, y1, x2, y2] = b;\n if (x1 === y1 && x2 === y2) return x;\n if (x <= 0) return 0;\n if (x >= 1) return 1;\n let t = x;\n for (let i = 0; i < 8; i++) {\n const err = bezierCurve(x1, x2, t) - x;\n if (err < 1e-4 && err > -1e-4) break;\n const slope = bezierSlope(x1, x2, t);\n if (slope < 1e-6 && slope > -1e-6) break;\n t -= err / slope;\n }\n return bezierCurve(y1, y2, t);\n}\n\nexport type EaseValue = NonNullable<MotionTransition['ease']>;\n\nexport const toBezier = (ease: EaseValue): Bezier =>\n typeof ease === 'string' ? (NAMED[ease] ?? NAMED.easeInOut) : ease;\n\nexport const cssBezier = (ease: EaseValue): string => `cubic-bezier(${toBezier(ease).join(',')})`;\n\nexport const 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 at(progress: number): number;\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), at };\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 at(progress: number): number;\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, at: curve.at };\n }\n const duration = (timing.duration ?? 0.3) * 1000;\n const ease = timing.ease;\n if (isSegmented(ease)) {\n const first = toBezier(ease[0]);\n return { duration, delay, easing: 'linear', segments: ease.map(cssBezier), at: (p) => bezierAt(first, p) };\n }\n const bezier = ease === undefined ? NAMED.easeInOut : toBezier(ease);\n return { duration, delay, easing: cssBezier(bezier), segments: null, at: (p) => bezierAt(bezier, p) };\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 +0,0 @@
1
- {"version":3,"sources":["../src/motion/presence.tsx"],"names":[],"mappings":"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","file":"chunk-MXOPCFWR.js","sourcesContent":["'use client';\n\nimport {\n Children,\n Fragment,\n createElement,\n isValidElement,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { PresenceContext } from './presence-context';\n\ninterface Entry {\n key: string;\n node: ReactElement;\n exiting: boolean;\n}\n\nfunction toEntries(children: ReactNode): Entry[] {\n const out: Entry[] = [];\n Children.forEach(children, (child, index) => {\n if (isValidElement(child)) out.push({ key: String(child.key ?? index), node: child, exiting: false });\n });\n return out;\n}\n\nexport interface PresenceProps {\n /** Keyed children. A child animates out only if it renders a `<Motion>` carrying `exit`. */\n children?: ReactNode;\n /** Let children present on the first paint play their `animate`. @default true */\n initial?: boolean;\n /** `wait` holds entering children back until the outgoing ones have left. @default 'sync' */\n mode?: 'sync' | 'wait';\n /** Fires once the last exiting child has been removed. */\n onExitComplete?: () => void;\n}\n\nexport function Presence({ children, initial = true, mode = 'sync', onExitComplete }: PresenceProps) {\n const incoming = toEntries(children);\n const signature = incoming.map((entry) => entry.key).join('|');\n const [shown, setShown] = useState<Entry[]>(incoming);\n const bornAtMount = useRef(new Set(incoming.map((entry) => entry.key)));\n const wasExiting = useRef(false);\n const complete = useRef(onExitComplete);\n complete.current = onExitComplete;\n\n useLayoutEffect(() => {\n setShown((previous) => {\n const live = new Set(incoming.map((entry) => entry.key));\n const merged: Entry[] = incoming.map((entry) => ({ ...entry }));\n previous.forEach((entry, index) => {\n if (live.has(entry.key)) return;\n merged.splice(index, 0, entry.exiting ? entry : { ...entry, exiting: true });\n });\n return merged;\n });\n }, [signature]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const leaving = shown.some((entry) => entry.exiting);\n\n useEffect(() => {\n if (wasExiting.current && !leaving) complete.current?.();\n wasExiting.current = leaving;\n }, [leaving]);\n\n const fresh = new Map(incoming.map((entry) => [entry.key, entry.node]));\n const visible = mode === 'wait' && leaving ? shown.filter((entry) => entry.exiting) : shown;\n\n return createElement(\n Fragment,\n null,\n visible.map((entry) =>\n createElement(\n PresenceContext.Provider,\n {\n key: entry.key,\n value: {\n isPresent: !entry.exiting,\n initial: initial || !bornAtMount.current.has(entry.key),\n safeToRemove: () => setShown((previous) => previous.filter((e) => e.key !== entry.key || !e.exiting)),\n },\n },\n fresh.get(entry.key) ?? entry.node,\n ),\n ),\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/motion/presence-context.ts","../src/motion/use-motion.ts"],"names":["animate"],"mappings":";;;AAaA,IAAM,WAA0B,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,IAAA,EAAM,cAAc,MAAM;AAAC,CAAA,EAAE;AAElF,IAAM,eAAA,GAAkB,cAA6B,QAAQ;AAE7D,IAAM,WAAA,GAAc,MAAqB,UAAA,CAAW,eAAe,CAAA;;;ACR1E,IAAM,MAAA,GAAS,CAAC,KAAA,KAA8B,CAAC,KAAA,GAAQ,EAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAE1F,SAAS,GAAA,CAAI,MAA8B,EAAA,EAA6B;AAC7E,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,SAAmB,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AACtD,EAAA,OAAO,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,EAAA,EAAI,GAAG,IAAI,CAAA,GAAI,OAAA,CAAQ,EAAA,EAAI,IAAI,CAAC,CAAA;AACxE;AAEA,IAAM,aAAa,CAAC,KAAA,KAClB,KAAA,CAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,KAAK,MAAY;AAAC,CAAC,CAAA,GAAI,QAAQ,OAAA,EAAQ;AAcjG,SAAS,SAAA,CAAU,KAAoC,EAAE,OAAA,EAAAA,UAAS,IAAA,EAAM,OAAA,EAAS,MAAK,EAAsB;AACjH,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAmB,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,EAAA,MAAM,OAAO,MAAA,CAAO,EAAE,SAAAA,QAAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC9C,EAAA,IAAA,CAAK,OAAA,GAAU,EAAE,OAAA,EAAAA,QAAAA,EAAS,MAAM,OAAA,EAAQ;AAExC,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK;AAC9C,IAAA,OAAA,CAAQ,UAAU,EAAC;AAAA,EACrB,CAAA;AAEA,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA;AACzB,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,YAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,QAAA,CAAS,aAAa,KAAA,EAAO;AACrE,IAAA,IAAA,EAAK;AACL,IAAA,OAAA,CAAQ,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,EAChD,CAAA,EAAG,IAAA,IAAQ,EAAE,CAAA;AAEb,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,SAAS,SAAA,EAAW;AACxB,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAA,EAAK;AACL,IAAA,OAAA,CAAQ,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,IAAA,EAAM,EAAE,IAAI,EAAC;AACrD,IAAA,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,QAAA,CAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,eAAA,CAAgB,MAAM,IAAA,EAAM,EAAE,CAAA;AAChC","file":"chunk-W3SHPKSB.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 /** Called by the child when its exit has finished; lets Presence drop it from the tree. */\n safeToRemove: () => void;\n}\n\nconst DETACHED: PresenceState = { isPresent: true, initial: true, safeToRemove: () => {} };\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\n const stop = () => {\n for (const play of playing.current) play.stop();\n playing.current = [];\n };\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) return;\n const el = ref.current;\n stop();\n playing.current = el ? run(spec.current.exit, el) : [];\n allSettled(playing.current).then(presence.safeToRemove);\n }, [presence.isPresent]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useLayoutEffect(() => stop, []);\n}\n"]}