@wix/ai-assistant-avatar 0.43.0 → 0.45.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.
@@ -1,6 +1,9 @@
1
1
  import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
2
2
  import s from './Astro.module.css';
3
- import { ASTRO_SIZE } from './config';
3
+ import { ASTRO_SIZE, TIMING } from './config';
4
+
5
+ // Matches the `.astro` opacity transition in Astro.module.css.
6
+ const AVATAR_REVEAL_DURATION = 80;
4
7
  import { useAvatarSetup, useMovement, useDotAnimation } from './hooks';
5
8
  import { DotTrail } from './components/DotTrail';
6
9
  import { AvatarEvent, AvatarState } from '@wix/aria-ai-avatar';
@@ -26,17 +29,45 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
26
29
  setAvatarHidden = _useAvatarSetup.setAvatarHidden;
27
30
  const _useMovement = useMovement(wrapperRef, ASTRO_SIZE.WIDTH, ASTRO_SIZE.HEIGHT),
28
31
  setCenter = _useMovement.setCenter;
29
- const _useDotAnimation = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState),
32
+ const _useDotAnimation = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState, mode),
30
33
  leadDotRef = _useDotAnimation.leadDotRef,
31
34
  trailRefs = _useDotAnimation.trailRefs,
32
35
  hideDots = _useDotAnimation.hideDots,
33
36
  moveFromOffsetWithDots = _useDotAnimation.moveFromOffsetWithDots,
34
37
  moveToOffsetWithDots = _useDotAnimation.moveToOffsetWithDots;
38
+ const revealRef = useRef(null);
39
+ const cancelReveal = () => {
40
+ var _revealRef$current;
41
+ (_revealRef$current = revealRef.current) == null || _revealRef$current.cancel();
42
+ revealRef.current = null;
43
+ };
44
+
45
+ // The dots arrive on the compositor, so the avatar is revealed there too
46
+ // rather than when the main thread gets to `setAvatarHidden(false)`.
47
+ const scheduleReveal = () => {
48
+ cancelReveal();
49
+ const wrapper = wrapperRef.current;
50
+ if ((wrapper == null ? void 0 : wrapper.style.opacity) !== '0') {
51
+ return;
52
+ }
53
+ revealRef.current = wrapper.animate([{
54
+ opacity: 0
55
+ }, {
56
+ opacity: 1
57
+ }], {
58
+ delay: TIMING.TRAVEL_DURATION,
59
+ duration: AVATAR_REVEAL_DURATION,
60
+ fill: 'forwards'
61
+ });
62
+ };
35
63
  const onTravelHomeFrom = async (x, y, options) => {
36
64
  const pos = {
37
65
  x,
38
66
  y
39
67
  };
68
+ if (typeof x === 'number' && typeof y === 'number') {
69
+ scheduleReveal();
70
+ }
40
71
  await moveFromOffsetWithDots(pos, options);
41
72
  };
42
73
  const onTravelAwayTo = async (x, y, options) => {
@@ -44,6 +75,7 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
44
75
  x,
45
76
  y
46
77
  };
78
+ cancelReveal();
47
79
  await moveToOffsetWithDots(pos, options);
48
80
  };
49
81
  const onMouseMove = (clientX, clientY) => {
@@ -77,6 +109,7 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
77
109
  let _ref2 = _temp === void 0 ? {} : _temp,
78
110
  _ref2$withDots = _ref2.withDots,
79
111
  withDots = _ref2$withDots === void 0 ? false : _ref2$withDots;
112
+ cancelReveal();
80
113
  setAvatarHidden(true);
81
114
  if (withDots) {
82
115
  hideDots();
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useEffect","useImperativeHandle","useRef","useState","s","ASTRO_SIZE","useAvatarSetup","useMovement","useDotAnimation","DotTrail","AvatarEvent","AvatarState","AiAssistantAvatar","_ref","ref","mode","variant","sleepTimeout","wrapperRef","typingTimeout","_useState","isTyping","setIsTyping","_useState2","showBg","setShowBg","_useAvatarSetup","AriaAvatar","avatarHidden","setAvatarHidden","_useMovement","WIDTH","HEIGHT","setCenter","_useDotAnimation","setState","leadDotRef","trailRefs","hideDots","moveFromOffsetWithDots","moveToOffsetWithDots","onTravelHomeFrom","x","y","options","pos","onTravelAwayTo","onMouseMove","clientX","clientY","lookAt","onUserTyping","caretX","caretY","current","clearTimeout","setTimeout","err","console","error","hideAvatar","_temp","_ref2","_ref2$withDots","withDots","showAvatar","trigger","shrink","getState","SMALL","IDLE","smallLoader","SMALL_LOADER","pulse","Promise","resolve","idle","undo","fireEvent","UNDO_EVENT","boredom","SLEEPING","bigLoader","BIG_LOADER","ideaSpark","IDEA_SPARK","publish","PUBLISH_EVENT","wrapper","changeAstroColor","color","setAvatarColor","toggleAvatarBackground","hideBg","hide","show","createElement","className","avatar","astro","style","opacity","width","height"],"sources":["../../../src/Astro/Astro.tsx"],"sourcesContent":["import React, {\n forwardRef,\n Ref,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport s from './Astro.module.css';\nimport type { AstroRef, AstroProps, MoveOptions } from './types';\nimport { ASTRO_SIZE } from './config';\nimport { useAvatarSetup, useMovement, useDotAnimation } from './hooks';\nimport { DotTrail } from './components/DotTrail';\nimport { AvatarEvent, AvatarState } from '@wix/aria-ai-avatar';\n\nexport const AiAssistantAvatar = forwardRef<AstroRef, AstroProps>(\n ({ mode, variant, sleepTimeout }, ref: Ref<AstroRef> | null) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const typingTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [isTyping, setIsTyping] = useState(false);\n\n const [showBg, setShowBg] = useState(false);\n\n const { AriaAvatar, avatarHidden, setAvatarHidden } = useAvatarSetup({\n mode,\n variant,\n sleepTimeout,\n });\n\n const { setCenter } = useMovement(\n wrapperRef,\n ASTRO_SIZE.WIDTH,\n ASTRO_SIZE.HEIGHT,\n );\n\n const {\n leadDotRef,\n trailRefs,\n hideDots,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n } = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState);\n\n const onTravelHomeFrom = async (\n x: number,\n y: number,\n options?: MoveOptions,\n ) => {\n const pos = { x, y };\n await moveFromOffsetWithDots(pos, options);\n };\n\n const onTravelAwayTo = async (\n x: number,\n y: number,\n options?: MoveOptions,\n ) => {\n const pos = { x, y };\n await moveToOffsetWithDots(pos, options);\n };\n\n const onMouseMove = (clientX: number, clientY: number) => {\n if (isTyping) {\n return;\n }\n\n AriaAvatar.lookAt(clientX, clientY);\n };\n\n const onUserTyping = (caretX: number, caretY: number) => {\n try {\n setIsTyping(true);\n AriaAvatar.lookAt(caretX, caretY);\n\n if (typingTimeout.current) {\n clearTimeout(typingTimeout.current);\n }\n\n typingTimeout.current = setTimeout(() => {\n setIsTyping(false);\n }, 500);\n } catch (err) {\n console.error('[Astro] Error tracking typing:', err);\n }\n };\n\n useEffect(() => {\n return () => {\n if (typingTimeout.current) {\n clearTimeout(typingTimeout.current);\n }\n };\n }, []);\n\n const hideAvatar = ({ withDots = false }: { withDots?: boolean } = {}) => {\n setAvatarHidden(true);\n\n if (withDots) {\n hideDots();\n }\n };\n\n const showAvatar = () => {\n setAvatarHidden(false);\n };\n\n useImperativeHandle(ref, () => ({\n trigger: {\n shrink: () => {\n if (AriaAvatar.getState() === AvatarState.SMALL) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.SMALL);\n },\n smallLoader: () => {\n if (AriaAvatar.getState() === AvatarState.SMALL) {\n return AriaAvatar.setState(AvatarState.SMALL_LOADER);\n }\n return AriaAvatar.setState(AvatarState.SMALL);\n },\n pulse: () => Promise.resolve(),\n idle: async () => {\n if (AriaAvatar.getState() === AvatarState.SMALL_LOADER) {\n await AriaAvatar.setState(AvatarState.SMALL);\n }\n return AriaAvatar.setState(AvatarState.IDLE);\n },\n undo: () => AriaAvatar.fireEvent(AvatarEvent.UNDO_EVENT),\n boredom: () => {\n if (AriaAvatar.getState() === AvatarState.SLEEPING) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.SLEEPING);\n },\n bigLoader: () => {\n if (AriaAvatar.getState() === AvatarState.BIG_LOADER) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.BIG_LOADER);\n },\n ideaSpark: () => AriaAvatar.fireEvent(AvatarEvent.IDEA_SPARK),\n publish: () => AriaAvatar.fireEvent(AvatarEvent.PUBLISH_EVENT),\n },\n avatarHidden,\n wrapper: wrapperRef.current,\n getState: AriaAvatar.getState,\n\n onMouseMove,\n onUserTyping,\n onTravelHomeFrom,\n onTravelAwayTo,\n\n changeAstroColor: (color: string) => {\n AriaAvatar.setAvatarColor(color);\n },\n\n toggleAvatarBackground: () => {\n if (showBg) {\n setShowBg(false);\n AriaAvatar.hideBg();\n } else {\n setShowBg(true);\n AriaAvatar.showBg();\n }\n },\n\n hide: hideAvatar,\n show: showAvatar,\n }));\n\n return (\n <div className={s.avatar}>\n <DotTrail leadDotRef={leadDotRef} trailRefs={trailRefs} />\n\n <div\n ref={wrapperRef}\n className={s.astro}\n style={{\n opacity: avatarHidden ? 0 : 1,\n }}\n >\n <div style={{ width: ASTRO_SIZE.WIDTH, height: ASTRO_SIZE.HEIGHT }}>\n <AriaAvatar.AriaAvatar />\n </div>\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","forwardRef","useEffect","useImperativeHandle","useRef","useState","s","ASTRO_SIZE","TIMING","AVATAR_REVEAL_DURATION","useAvatarSetup","useMovement","useDotAnimation","DotTrail","AvatarEvent","AvatarState","AiAssistantAvatar","_ref","ref","mode","variant","sleepTimeout","wrapperRef","typingTimeout","_useState","isTyping","setIsTyping","_useState2","showBg","setShowBg","_useAvatarSetup","AriaAvatar","avatarHidden","setAvatarHidden","_useMovement","WIDTH","HEIGHT","setCenter","_useDotAnimation","setState","leadDotRef","trailRefs","hideDots","moveFromOffsetWithDots","moveToOffsetWithDots","revealRef","cancelReveal","_revealRef$current","current","cancel","scheduleReveal","wrapper","style","opacity","animate","delay","TRAVEL_DURATION","duration","fill","onTravelHomeFrom","x","y","options","pos","onTravelAwayTo","onMouseMove","clientX","clientY","lookAt","onUserTyping","caretX","caretY","clearTimeout","setTimeout","err","console","error","hideAvatar","_temp","_ref2","_ref2$withDots","withDots","showAvatar","trigger","shrink","getState","SMALL","IDLE","smallLoader","SMALL_LOADER","pulse","Promise","resolve","idle","undo","fireEvent","UNDO_EVENT","boredom","SLEEPING","bigLoader","BIG_LOADER","ideaSpark","IDEA_SPARK","publish","PUBLISH_EVENT","changeAstroColor","color","setAvatarColor","toggleAvatarBackground","hideBg","hide","show","createElement","className","avatar","astro","width","height"],"sources":["../../../src/Astro/Astro.tsx"],"sourcesContent":["import React, {\n forwardRef,\n Ref,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport s from './Astro.module.css';\nimport type { AstroRef, AstroProps, MoveOptions } from './types';\nimport { ASTRO_SIZE, TIMING } from './config';\n\n// Matches the `.astro` opacity transition in Astro.module.css.\nconst AVATAR_REVEAL_DURATION = 80;\nimport { useAvatarSetup, useMovement, useDotAnimation } from './hooks';\nimport { DotTrail } from './components/DotTrail';\nimport { AvatarEvent, AvatarState } from '@wix/aria-ai-avatar';\n\nexport const AiAssistantAvatar = forwardRef<AstroRef, AstroProps>(\n ({ mode, variant, sleepTimeout }, ref: Ref<AstroRef> | null) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const typingTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [isTyping, setIsTyping] = useState(false);\n\n const [showBg, setShowBg] = useState(false);\n\n const { AriaAvatar, avatarHidden, setAvatarHidden } = useAvatarSetup({\n mode,\n variant,\n sleepTimeout,\n });\n\n const { setCenter } = useMovement(\n wrapperRef,\n ASTRO_SIZE.WIDTH,\n ASTRO_SIZE.HEIGHT,\n );\n\n const {\n leadDotRef,\n trailRefs,\n hideDots,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n } = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState, mode);\n\n const revealRef = useRef<Animation | null>(null);\n\n const cancelReveal = () => {\n revealRef.current?.cancel();\n revealRef.current = null;\n };\n\n // The dots arrive on the compositor, so the avatar is revealed there too\n // rather than when the main thread gets to `setAvatarHidden(false)`.\n const scheduleReveal = () => {\n cancelReveal();\n const wrapper = wrapperRef.current;\n if (wrapper?.style.opacity !== '0') {\n return;\n }\n revealRef.current = wrapper.animate([{ opacity: 0 }, { opacity: 1 }], {\n delay: TIMING.TRAVEL_DURATION,\n duration: AVATAR_REVEAL_DURATION,\n fill: 'forwards',\n });\n };\n\n const onTravelHomeFrom = async (\n x: number,\n y: number,\n options?: MoveOptions,\n ) => {\n const pos = { x, y };\n if (typeof x === 'number' && typeof y === 'number') {\n scheduleReveal();\n }\n await moveFromOffsetWithDots(pos, options);\n };\n\n const onTravelAwayTo = async (\n x: number,\n y: number,\n options?: MoveOptions,\n ) => {\n const pos = { x, y };\n cancelReveal();\n await moveToOffsetWithDots(pos, options);\n };\n\n const onMouseMove = (clientX: number, clientY: number) => {\n if (isTyping) {\n return;\n }\n\n AriaAvatar.lookAt(clientX, clientY);\n };\n\n const onUserTyping = (caretX: number, caretY: number) => {\n try {\n setIsTyping(true);\n AriaAvatar.lookAt(caretX, caretY);\n\n if (typingTimeout.current) {\n clearTimeout(typingTimeout.current);\n }\n\n typingTimeout.current = setTimeout(() => {\n setIsTyping(false);\n }, 500);\n } catch (err) {\n console.error('[Astro] Error tracking typing:', err);\n }\n };\n\n useEffect(() => {\n return () => {\n if (typingTimeout.current) {\n clearTimeout(typingTimeout.current);\n }\n };\n }, []);\n\n const hideAvatar = ({ withDots = false }: { withDots?: boolean } = {}) => {\n cancelReveal();\n setAvatarHidden(true);\n\n if (withDots) {\n hideDots();\n }\n };\n\n const showAvatar = () => {\n setAvatarHidden(false);\n };\n\n useImperativeHandle(ref, () => ({\n trigger: {\n shrink: () => {\n if (AriaAvatar.getState() === AvatarState.SMALL) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.SMALL);\n },\n smallLoader: () => {\n if (AriaAvatar.getState() === AvatarState.SMALL) {\n return AriaAvatar.setState(AvatarState.SMALL_LOADER);\n }\n return AriaAvatar.setState(AvatarState.SMALL);\n },\n pulse: () => Promise.resolve(),\n idle: async () => {\n if (AriaAvatar.getState() === AvatarState.SMALL_LOADER) {\n await AriaAvatar.setState(AvatarState.SMALL);\n }\n return AriaAvatar.setState(AvatarState.IDLE);\n },\n undo: () => AriaAvatar.fireEvent(AvatarEvent.UNDO_EVENT),\n boredom: () => {\n if (AriaAvatar.getState() === AvatarState.SLEEPING) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.SLEEPING);\n },\n bigLoader: () => {\n if (AriaAvatar.getState() === AvatarState.BIG_LOADER) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.BIG_LOADER);\n },\n ideaSpark: () => AriaAvatar.fireEvent(AvatarEvent.IDEA_SPARK),\n publish: () => AriaAvatar.fireEvent(AvatarEvent.PUBLISH_EVENT),\n },\n avatarHidden,\n wrapper: wrapperRef.current,\n getState: AriaAvatar.getState,\n\n onMouseMove,\n onUserTyping,\n onTravelHomeFrom,\n onTravelAwayTo,\n\n changeAstroColor: (color: string) => {\n AriaAvatar.setAvatarColor(color);\n },\n\n toggleAvatarBackground: () => {\n if (showBg) {\n setShowBg(false);\n AriaAvatar.hideBg();\n } else {\n setShowBg(true);\n AriaAvatar.showBg();\n }\n },\n\n hide: hideAvatar,\n show: showAvatar,\n }));\n\n return (\n <div className={s.avatar}>\n <DotTrail leadDotRef={leadDotRef} trailRefs={trailRefs} />\n\n <div\n ref={wrapperRef}\n className={s.astro}\n style={{\n opacity: avatarHidden ? 0 : 1,\n }}\n >\n <div style={{ width: ASTRO_SIZE.WIDTH, height: ASTRO_SIZE.HEIGHT }}>\n <AriaAvatar.AriaAvatar />\n </div>\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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","ignoreList":[]}
@@ -12,7 +12,24 @@
12
12
  transition: opacity 80ms linear;
13
13
  transform: translate3d(0, 0, 0);
14
14
 
15
- clip-path: inset(23px 23px 23px 23px); /* cut off the edges to stop hijacking mouse events. maybe we need to reduce canvas size itself instead of this. */
15
+ clip-path: inset(12px); /* cut off the edges to stop hijacking mouse events. maybe we need to reduce canvas size itself instead of this. */
16
+
17
+ [class*='_wrapper_'] [class*='_hitbox_'] {
18
+ transform: scale(0.47);
19
+ }
20
+
21
+ [class*='_wrapper_'] [class*='_hitbox_'] [class*='_head_'][class*='_dark_'][class*='_shrunk_'] {
22
+ background: #557dff;
23
+ }
24
+
25
+ [class*='_wrapper_'] [class*='_hitbox_'] [class*='_head_'][class*='_dark_']:not([class*='_shrunk_']) {
26
+ box-shadow:
27
+ 0 12px 15px #2f5dffb2,
28
+ 0 8px 8px #3ca1ff40,
29
+ 0 0 6px #ffffff60,
30
+ 0 0 6px 2px #ffffff40,
31
+ 0 0 6px #2f5dffb2;
32
+ }
16
33
 
17
34
  @starting-style {
18
35
  opacity: 0;
@@ -1,41 +1,84 @@
1
1
  import { useRef, useEffect } from 'react';
2
2
  import { ANIMATION_CONFIG, TIMING } from '../config';
3
- import { buildPathD, setMotionPath, setOffsetDistance, setOffsetRotate, setOffsetAnchor } from '../utils';
3
+ import { buildPathControlPoints, samplePathByLength } from '../utils';
4
4
  import { AvatarState } from '@wix/aria-ai-avatar';
5
- export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimationState) => {
5
+ const PATH_SAMPLES = 48;
6
+ // Matches the dots' opacity transition in Astro.module.css.
7
+ const DOT_FADE_OUT_DURATION = 150;
8
+ const centerOf = el => {
9
+ const rect = el.getBoundingClientRect();
10
+ return {
11
+ x: rect.left + rect.width / 2,
12
+ y: rect.top + rect.height / 2
13
+ };
14
+ };
15
+
16
+ /**
17
+ * Where path coordinate (0, 0) lies relative to the dot's own center, i.e.
18
+ * the translation that puts the dot where `offset-path` with a centered
19
+ * `offset-anchor` would.
20
+ */
21
+ const measurePathOrigin = el => {
22
+ const natural = centerOf(el);
23
+ el.style.offsetPath = 'path("M 0,0 L 1,0")';
24
+ el.style.offsetDistance = '0%';
25
+ el.style.offsetAnchor = '50% 50%';
26
+ el.style.offsetRotate = '0deg';
27
+ const origin = centerOf(el);
28
+ el.style.offsetPath = '';
29
+ el.style.offsetDistance = '';
30
+ el.style.offsetAnchor = '';
31
+ el.style.offsetRotate = '';
32
+ return {
33
+ x: origin.x - natural.x,
34
+ y: origin.y - natural.y
35
+ };
36
+ };
37
+ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimationState, mode) => {
6
38
  const leadDotRef = useRef(null);
7
39
  const trailRefs = useRef([]);
8
40
  const isMountedRef = useRef(true);
9
- const animateDotsAlongPath = async function (start, end, options) {
41
+ const travelRunRef = useRef(0);
42
+ const isCurrentTravel = run => isMountedRef.current && run === travelRunRef.current;
43
+
44
+ /**
45
+ * Resolves `false` when a newer travel interrupted this one. The dots fade
46
+ * out on the compositor when they arrive, so a busy main thread doesn't
47
+ * leave them sitting at the end of the path.
48
+ */
49
+ const animateDotsAlongPath = async function (run, start, end, options) {
10
50
  if (options === void 0) {
11
51
  options = {};
12
52
  }
13
53
  if (!isMountedRef.current) {
14
- return;
54
+ return true;
15
55
  }
16
56
  const lead = leadDotRef.current;
17
57
  if (!lead) {
18
- return;
58
+ return true;
19
59
  }
20
60
  if (!options.skipShrink) {
21
61
  try {
22
62
  triggerAvatarAnimationState(AvatarState.SMALL);
23
63
  } catch {}
24
64
  }
25
- trailRefs.current.forEach((d, i) => {
26
- if (!d) {
27
- return;
28
- }
65
+ [lead, ...trailRefs.current].forEach(d => d == null ? void 0 : d.getAnimations().forEach(animation => animation.cancel()));
66
+ const trailStyles = trailRefs.current.map((d, i) => {
29
67
  const ratio = (i + 1) / ANIMATION_CONFIG.TRAIL_COUNT;
30
- const scale = ANIMATION_CONFIG.TRAIL_MIN_SCALE + (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio);
31
68
  const opacity = ANIMATION_CONFIG.TRAIL_FADE + (1 - ANIMATION_CONFIG.TRAIL_FADE) * (1 - ratio);
32
- d.style.opacity = String(opacity);
33
- d.style.transform = `scale(${scale})`;
69
+ if (d) {
70
+ d.style.opacity = String(opacity);
71
+ }
72
+ return {
73
+ opacity,
74
+ scale: ANIMATION_CONFIG.TRAIL_MIN_SCALE + (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio)
75
+ };
34
76
  });
77
+ const leadStartColor = mode === 'dark' ? ANIMATION_CONFIG.DOT_COLOR : '#000000';
35
78
  lead.style.opacity = '1';
36
- lead.style.background = '#000000';
79
+ lead.style.background = leadStartColor;
37
80
  lead.animate([{
38
- background: '#000000'
81
+ background: leadStartColor
39
82
  }, {
40
83
  background: ANIMATION_CONFIG.DOT_COLOR
41
84
  }], {
@@ -43,45 +86,60 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
43
86
  easing: 'ease-out',
44
87
  fill: 'forwards'
45
88
  });
46
- const pathD = buildPathD(start, end);
47
- const prepDot = el => {
48
- if (!el) {
49
- return;
89
+ const origin = measurePathOrigin(lead);
90
+ const points = samplePathByLength(buildPathControlPoints(start, end), PATH_SAMPLES);
91
+ const pathFrames = function (scale) {
92
+ if (scale === void 0) {
93
+ scale = 1;
50
94
  }
51
- setMotionPath(el, pathD);
52
- setOffsetDistance(el, '0%');
53
- setOffsetRotate(el, '0deg');
54
- setOffsetAnchor(el, '50% 50%');
95
+ return points.map(_ref => {
96
+ let x = _ref.x,
97
+ y = _ref.y;
98
+ return {
99
+ transform: `translate3d(${x + origin.x}px, ${y + origin.y}px, 0) scale(${scale})`
100
+ };
101
+ });
55
102
  };
56
- prepDot(lead);
57
- trailRefs.current.forEach(td => td && prepDot(td));
58
- const leadAnim = lead.animate([{
59
- offsetDistance: '0%'
103
+ // Once faded, the inline opacity follows, so the next travel's opacity
104
+ // change runs the dots' CSS fade-in from 0.
105
+ const fadeOut = (el, opacity) => el.animate([{
106
+ opacity
60
107
  }, {
61
- offsetDistance: '100%'
108
+ opacity: 0
62
109
  }], {
110
+ delay: TIMING.TRAVEL_DURATION,
111
+ duration: DOT_FADE_OUT_DURATION,
112
+ easing: 'ease-in-out',
113
+ fill: 'forwards'
114
+ }).finished.then(() => {
115
+ if (run === travelRunRef.current) {
116
+ el.style.opacity = '0';
117
+ }
118
+ }, () => {});
119
+ const leadAnim = lead.animate(pathFrames(), {
63
120
  duration: TIMING.TRAVEL_DURATION,
64
121
  easing: ANIMATION_CONFIG.EASING,
65
- fill: 'forwards'
122
+ fill: 'both'
66
123
  });
124
+ fadeOut(lead, 1);
67
125
  trailRefs.current.forEach((td, i) => {
68
126
  if (!td) {
69
127
  return;
70
128
  }
71
- td.animate([{
72
- offsetDistance: '0%'
73
- }, {
74
- offsetDistance: '100%'
75
- }], {
129
+ td.animate(pathFrames(trailStyles[i].scale), {
76
130
  duration: TIMING.TRAVEL_DURATION,
77
131
  delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,
78
132
  easing: ANIMATION_CONFIG.EASING,
79
- fill: 'forwards'
133
+ fill: 'both'
80
134
  });
135
+ fadeOut(td, trailStyles[i].opacity);
81
136
  });
82
- await leadAnim.finished;
83
- lead.style.opacity = '0';
84
- trailRefs.current.forEach(td => td && (td.style.opacity = '0'));
137
+ try {
138
+ await leadAnim.finished;
139
+ } catch {
140
+ return false;
141
+ }
142
+ return run === travelRunRef.current;
85
143
  };
86
144
  const hideDots = () => {
87
145
  const lead = leadDotRef.current;
@@ -103,15 +161,18 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
103
161
  console.log('[Astro] Invalid position, skipping animation');
104
162
  return;
105
163
  }
164
+ const run = ++travelRunRef.current;
106
165
  const home = {
107
166
  x: 0,
108
167
  y: 0
109
168
  };
110
- await animateDotsAlongPath(currentPosition, home, options);
169
+ if (!(await animateDotsAlongPath(run, currentPosition, home, options))) {
170
+ return;
171
+ }
111
172
  moveToPosition(home);
112
173
  setAvatarHidden(false);
113
174
  await waitForNextFrame();
114
- if (isMountedRef.current) {
175
+ if (isCurrentTravel(run)) {
115
176
  if (options.endState) {
116
177
  await triggerAvatarAnimationState(options.endState);
117
178
  } else {
@@ -127,14 +188,17 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
127
188
  console.log('[Astro] Invalid position, skipping animation');
128
189
  return;
129
190
  }
191
+ const run = ++travelRunRef.current;
130
192
  setAvatarHidden(true);
131
193
  await waitForNextFrame();
194
+ if (!isCurrentTravel(run)) {
195
+ return;
196
+ }
132
197
  const home = {
133
198
  x: 0,
134
199
  y: 0
135
200
  };
136
- await animateDotsAlongPath(home, targetPosition, options);
137
- hideDots();
201
+ await animateDotsAlongPath(run, home, targetPosition, options);
138
202
  };
139
203
  useEffect(() => {
140
204
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["useRef","useEffect","ANIMATION_CONFIG","TIMING","buildPathD","setMotionPath","setOffsetDistance","setOffsetRotate","setOffsetAnchor","AvatarState","useDotAnimation","moveToPosition","setAvatarHidden","triggerAvatarAnimationState","leadDotRef","trailRefs","isMountedRef","animateDotsAlongPath","start","end","options","current","lead","skipShrink","SMALL","forEach","d","i","ratio","TRAIL_COUNT","scale","TRAIL_MIN_SCALE","opacity","TRAIL_FADE","style","String","transform","background","animate","DOT_COLOR","duration","DOT_FADE_DURATION","easing","fill","pathD","prepDot","el","td","leadAnim","offsetDistance","TRAVEL_DURATION","EASING","delay","TRAIL_STAGGER","finished","hideDots","waitForNextFrame","Promise","r","requestAnimationFrame","moveFromOffsetWithDots","currentPosition","x","y","console","log","home","endState","IDLE","moveToOffsetWithDots","targetPosition"],"sources":["../../../../src/Astro/hooks/useDotAnimation.ts"],"sourcesContent":["import { useRef, useEffect } from 'react';\nimport type { Position, MoveOptions } from '../types';\nimport { ANIMATION_CONFIG, TIMING } from '../config';\nimport {\n buildPathD,\n setMotionPath,\n setOffsetDistance,\n setOffsetRotate,\n setOffsetAnchor,\n} from '../utils';\nimport { AvatarState } from '@wix/aria-ai-avatar';\n\nexport const useDotAnimation = (\n moveToPosition: (position: Position) => void,\n setAvatarHidden: (hidden: boolean) => void,\n triggerAvatarAnimationState: (state: AvatarState) => void,\n) => {\n const leadDotRef = useRef<HTMLDivElement | null>(null);\n const trailRefs = useRef<(HTMLDivElement | null)[]>([]);\n const isMountedRef = useRef(true);\n\n const animateDotsAlongPath = async (\n start: Position,\n end: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (!isMountedRef.current) {\n return;\n }\n\n const lead = leadDotRef.current;\n if (!lead) {\n return;\n }\n\n if (!options.skipShrink) {\n try {\n triggerAvatarAnimationState(AvatarState.SMALL);\n } catch {}\n }\n\n trailRefs.current.forEach((d, i) => {\n if (!d) {\n return;\n }\n const ratio = (i + 1) / ANIMATION_CONFIG.TRAIL_COUNT;\n const scale =\n ANIMATION_CONFIG.TRAIL_MIN_SCALE +\n (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio);\n const opacity =\n ANIMATION_CONFIG.TRAIL_FADE +\n (1 - ANIMATION_CONFIG.TRAIL_FADE) * (1 - ratio);\n d.style.opacity = String(opacity);\n d.style.transform = `scale(${scale})`;\n });\n\n lead.style.opacity = '1';\n lead.style.background = '#000000';\n\n lead.animate(\n [{ background: '#000000' }, { background: ANIMATION_CONFIG.DOT_COLOR }],\n {\n duration: TIMING.DOT_FADE_DURATION,\n easing: 'ease-out',\n fill: 'forwards',\n },\n );\n\n const pathD = buildPathD(start, end);\n\n const prepDot = (el: HTMLElement) => {\n if (!el) {\n return;\n }\n setMotionPath(el, pathD);\n setOffsetDistance(el, '0%');\n setOffsetRotate(el, '0deg');\n setOffsetAnchor(el, '50% 50%');\n };\n\n prepDot(lead);\n\n trailRefs.current.forEach((td) => td && prepDot(td));\n\n const leadAnim = lead.animate(\n [{ offsetDistance: '0%' }, { offsetDistance: '100%' }],\n {\n duration: TIMING.TRAVEL_DURATION,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'forwards',\n },\n );\n\n trailRefs.current.forEach((td, i) => {\n if (!td) {\n return;\n }\n td.animate([{ offsetDistance: '0%' }, { offsetDistance: '100%' }], {\n duration: TIMING.TRAVEL_DURATION,\n delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'forwards',\n });\n });\n\n await leadAnim.finished;\n\n lead.style.opacity = '0';\n trailRefs.current.forEach((td) => td && (td.style.opacity = '0'));\n };\n\n const hideDots = () => {\n const lead = leadDotRef.current;\n if (lead) {\n lead.style.opacity = '0';\n }\n trailRefs.current.forEach((td) => {\n if (td) {\n td.style.opacity = '0';\n }\n });\n };\n\n const waitForNextFrame = () =>\n new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const moveFromOffsetWithDots = async (\n currentPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof currentPosition.x !== 'number' ||\n typeof currentPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(currentPosition, home, options);\n\n moveToPosition(home);\n setAvatarHidden(false);\n\n await waitForNextFrame();\n\n if (isMountedRef.current) {\n if (options.endState) {\n await triggerAvatarAnimationState(options.endState);\n } else {\n await triggerAvatarAnimationState(AvatarState.IDLE);\n }\n }\n };\n\n const moveToOffsetWithDots = async (\n targetPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof targetPosition.x !== 'number' ||\n typeof targetPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n setAvatarHidden(true);\n await waitForNextFrame();\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(home, targetPosition, options);\n\n hideDots();\n };\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return {\n leadDotRef,\n trailRefs,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n hideDots,\n };\n};\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,SAAS,QAAQ,OAAO;AAEzC,SAASC,gBAAgB,EAAEC,MAAM,QAAQ,WAAW;AACpD,SACEC,UAAU,EACVC,aAAa,EACbC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,QACV,UAAU;AACjB,SAASC,WAAW,QAAQ,qBAAqB;AAEjD,OAAO,MAAMC,eAAe,GAAGA,CAC7BC,cAA4C,EAC5CC,eAA0C,EAC1CC,2BAAyD,KACtD;EACH,MAAMC,UAAU,GAAGd,MAAM,CAAwB,IAAI,CAAC;EACtD,MAAMe,SAAS,GAAGf,MAAM,CAA4B,EAAE,CAAC;EACvD,MAAMgB,YAAY,GAAGhB,MAAM,CAAC,IAAI,CAAC;EAEjC,MAAMiB,oBAAoB,GAAG,eAAAA,CAC3BC,KAAe,EACfC,GAAa,EACbC,OAAoB,EACF;IAAA,IADlBA,OAAoB;MAApBA,OAAoB,GAAG,CAAC,CAAC;IAAA;IAEzB,IAAI,CAACJ,YAAY,CAACK,OAAO,EAAE;MACzB;IACF;IAEA,MAAMC,IAAI,GAAGR,UAAU,CAACO,OAAO;IAC/B,IAAI,CAACC,IAAI,EAAE;MACT;IACF;IAEA,IAAI,CAACF,OAAO,CAACG,UAAU,EAAE;MACvB,IAAI;QACFV,2BAA2B,CAACJ,WAAW,CAACe,KAAK,CAAC;MAChD,CAAC,CAAC,MAAM,CAAC;IACX;IAEAT,SAAS,CAACM,OAAO,CAACI,OAAO,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;MAClC,IAAI,CAACD,CAAC,EAAE;QACN;MACF;MACA,MAAME,KAAK,GAAG,CAACD,CAAC,GAAG,CAAC,IAAIzB,gBAAgB,CAAC2B,WAAW;MACpD,MAAMC,KAAK,GACT5B,gBAAgB,CAAC6B,eAAe,GAChC,CAAC,CAAC,GAAG7B,gBAAgB,CAAC6B,eAAe,KAAK,CAAC,GAAGH,KAAK,CAAC;MACtD,MAAMI,OAAO,GACX9B,gBAAgB,CAAC+B,UAAU,GAC3B,CAAC,CAAC,GAAG/B,gBAAgB,CAAC+B,UAAU,KAAK,CAAC,GAAGL,KAAK,CAAC;MACjDF,CAAC,CAACQ,KAAK,CAACF,OAAO,GAAGG,MAAM,CAACH,OAAO,CAAC;MACjCN,CAAC,CAACQ,KAAK,CAACE,SAAS,GAAG,SAASN,KAAK,GAAG;IACvC,CAAC,CAAC;IAEFR,IAAI,CAACY,KAAK,CAACF,OAAO,GAAG,GAAG;IACxBV,IAAI,CAACY,KAAK,CAACG,UAAU,GAAG,SAAS;IAEjCf,IAAI,CAACgB,OAAO,CACV,CAAC;MAAED,UAAU,EAAE;IAAU,CAAC,EAAE;MAAEA,UAAU,EAAEnC,gBAAgB,CAACqC;IAAU,CAAC,CAAC,EACvE;MACEC,QAAQ,EAAErC,MAAM,CAACsC,iBAAiB;MAClCC,MAAM,EAAE,UAAU;MAClBC,IAAI,EAAE;IACR,CACF,CAAC;IAED,MAAMC,KAAK,GAAGxC,UAAU,CAACc,KAAK,EAAEC,GAAG,CAAC;IAEpC,MAAM0B,OAAO,GAAIC,EAAe,IAAK;MACnC,IAAI,CAACA,EAAE,EAAE;QACP;MACF;MACAzC,aAAa,CAACyC,EAAE,EAAEF,KAAK,CAAC;MACxBtC,iBAAiB,CAACwC,EAAE,EAAE,IAAI,CAAC;MAC3BvC,eAAe,CAACuC,EAAE,EAAE,MAAM,CAAC;MAC3BtC,eAAe,CAACsC,EAAE,EAAE,SAAS,CAAC;IAChC,CAAC;IAEDD,OAAO,CAACvB,IAAI,CAAC;IAEbP,SAAS,CAACM,OAAO,CAACI,OAAO,CAAEsB,EAAE,IAAKA,EAAE,IAAIF,OAAO,CAACE,EAAE,CAAC,CAAC;IAEpD,MAAMC,QAAQ,GAAG1B,IAAI,CAACgB,OAAO,CAC3B,CAAC;MAAEW,cAAc,EAAE;IAAK,CAAC,EAAE;MAAEA,cAAc,EAAE;IAAO,CAAC,CAAC,EACtD;MACET,QAAQ,EAAErC,MAAM,CAAC+C,eAAe;MAChCR,MAAM,EAAExC,gBAAgB,CAACiD,MAAM;MAC/BR,IAAI,EAAE;IACR,CACF,CAAC;IAED5B,SAAS,CAACM,OAAO,CAACI,OAAO,CAAC,CAACsB,EAAE,EAAEpB,CAAC,KAAK;MACnC,IAAI,CAACoB,EAAE,EAAE;QACP;MACF;MACAA,EAAE,CAACT,OAAO,CAAC,CAAC;QAAEW,cAAc,EAAE;MAAK,CAAC,EAAE;QAAEA,cAAc,EAAE;MAAO,CAAC,CAAC,EAAE;QACjET,QAAQ,EAAErC,MAAM,CAAC+C,eAAe;QAChCE,KAAK,EAAE,CAACzB,CAAC,GAAG,CAAC,IAAIzB,gBAAgB,CAACmD,aAAa;QAC/CX,MAAM,EAAExC,gBAAgB,CAACiD,MAAM;QAC/BR,IAAI,EAAE;MACR,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAMK,QAAQ,CAACM,QAAQ;IAEvBhC,IAAI,CAACY,KAAK,CAACF,OAAO,GAAG,GAAG;IACxBjB,SAAS,CAACM,OAAO,CAACI,OAAO,CAAEsB,EAAE,IAAKA,EAAE,KAAKA,EAAE,CAACb,KAAK,CAACF,OAAO,GAAG,GAAG,CAAC,CAAC;EACnE,CAAC;EAED,MAAMuB,QAAQ,GAAGA,CAAA,KAAM;IACrB,MAAMjC,IAAI,GAAGR,UAAU,CAACO,OAAO;IAC/B,IAAIC,IAAI,EAAE;MACRA,IAAI,CAACY,KAAK,CAACF,OAAO,GAAG,GAAG;IAC1B;IACAjB,SAAS,CAACM,OAAO,CAACI,OAAO,CAAEsB,EAAE,IAAK;MAChC,IAAIA,EAAE,EAAE;QACNA,EAAE,CAACb,KAAK,CAACF,OAAO,GAAG,GAAG;MACxB;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAMwB,gBAAgB,GAAGA,CAAA,KACvB,IAAIC,OAAO,CAAQC,CAAC,IAAKC,qBAAqB,CAAC,MAAMD,CAAC,CAAC,CAAC,CAAC,CAAC;EAE5D,MAAME,sBAAsB,GAAG,eAAAA,CAC7BC,eAAyB,EACzBzC,OAAoB,EACF;IAAA,IADlBA,OAAoB;MAApBA,OAAoB,GAAG,CAAC,CAAC;IAAA;IAEzB,IACE,OAAOyC,eAAe,CAACC,CAAC,KAAK,QAAQ,IACrC,OAAOD,eAAe,CAACE,CAAC,KAAK,QAAQ,EACrC;MACAC,OAAO,CAACC,GAAG,CAAC,8CAA8C,CAAC;MAC3D;IACF;IAEA,MAAMC,IAAI,GAAG;MAAEJ,CAAC,EAAE,CAAC;MAAEC,CAAC,EAAE;IAAE,CAAC;IAC3B,MAAM9C,oBAAoB,CAAC4C,eAAe,EAAEK,IAAI,EAAE9C,OAAO,CAAC;IAE1DT,cAAc,CAACuD,IAAI,CAAC;IACpBtD,eAAe,CAAC,KAAK,CAAC;IAEtB,MAAM4C,gBAAgB,CAAC,CAAC;IAExB,IAAIxC,YAAY,CAACK,OAAO,EAAE;MACxB,IAAID,OAAO,CAAC+C,QAAQ,EAAE;QACpB,MAAMtD,2BAA2B,CAACO,OAAO,CAAC+C,QAAQ,CAAC;MACrD,CAAC,MAAM;QACL,MAAMtD,2BAA2B,CAACJ,WAAW,CAAC2D,IAAI,CAAC;MACrD;IACF;EACF,CAAC;EAED,MAAMC,oBAAoB,GAAG,eAAAA,CAC3BC,cAAwB,EACxBlD,OAAoB,EACF;IAAA,IADlBA,OAAoB;MAApBA,OAAoB,GAAG,CAAC,CAAC;IAAA;IAEzB,IACE,OAAOkD,cAAc,CAACR,CAAC,KAAK,QAAQ,IACpC,OAAOQ,cAAc,CAACP,CAAC,KAAK,QAAQ,EACpC;MACAC,OAAO,CAACC,GAAG,CAAC,8CAA8C,CAAC;MAC3D;IACF;IAEArD,eAAe,CAAC,IAAI,CAAC;IACrB,MAAM4C,gBAAgB,CAAC,CAAC;IAExB,MAAMU,IAAI,GAAG;MAAEJ,CAAC,EAAE,CAAC;MAAEC,CAAC,EAAE;IAAE,CAAC;IAC3B,MAAM9C,oBAAoB,CAACiD,IAAI,EAAEI,cAAc,EAAElD,OAAO,CAAC;IAEzDmC,QAAQ,CAAC,CAAC;EACZ,CAAC;EAEDtD,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXe,YAAY,CAACK,OAAO,GAAG,KAAK;IAC9B,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLP,UAAU;IACVC,SAAS;IACT6C,sBAAsB;IACtBS,oBAAoB;IACpBd;EACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useRef","useEffect","ANIMATION_CONFIG","TIMING","buildPathControlPoints","samplePathByLength","AvatarState","PATH_SAMPLES","DOT_FADE_OUT_DURATION","centerOf","el","rect","getBoundingClientRect","x","left","width","y","top","height","measurePathOrigin","natural","style","offsetPath","offsetDistance","offsetAnchor","offsetRotate","origin","useDotAnimation","moveToPosition","setAvatarHidden","triggerAvatarAnimationState","mode","leadDotRef","trailRefs","isMountedRef","travelRunRef","isCurrentTravel","run","current","animateDotsAlongPath","start","end","options","lead","skipShrink","SMALL","forEach","d","getAnimations","animation","cancel","trailStyles","map","i","ratio","TRAIL_COUNT","opacity","TRAIL_FADE","String","scale","TRAIL_MIN_SCALE","leadStartColor","DOT_COLOR","background","animate","duration","DOT_FADE_DURATION","easing","fill","points","pathFrames","_ref","transform","fadeOut","delay","TRAVEL_DURATION","finished","then","leadAnim","EASING","td","TRAIL_STAGGER","hideDots","waitForNextFrame","Promise","r","requestAnimationFrame","moveFromOffsetWithDots","currentPosition","console","log","home","endState","IDLE","moveToOffsetWithDots","targetPosition"],"sources":["../../../../src/Astro/hooks/useDotAnimation.ts"],"sourcesContent":["import { useRef, useEffect } from 'react';\nimport type { Position, MoveOptions } from '../types';\nimport { ANIMATION_CONFIG, TIMING } from '../config';\nimport { buildPathControlPoints, samplePathByLength } from '../utils';\nimport { AvatarState } from '@wix/aria-ai-avatar';\n\nconst PATH_SAMPLES = 48;\n// Matches the dots' opacity transition in Astro.module.css.\nconst DOT_FADE_OUT_DURATION = 150;\n\nconst centerOf = (el: HTMLElement) => {\n const rect = el.getBoundingClientRect();\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n};\n\n/**\n * Where path coordinate (0, 0) lies relative to the dot's own center, i.e.\n * the translation that puts the dot where `offset-path` with a centered\n * `offset-anchor` would.\n */\nconst measurePathOrigin = (el: HTMLElement): Position => {\n const natural = centerOf(el);\n el.style.offsetPath = 'path(\"M 0,0 L 1,0\")';\n el.style.offsetDistance = '0%';\n (el.style as any).offsetAnchor = '50% 50%';\n el.style.offsetRotate = '0deg';\n const origin = centerOf(el);\n el.style.offsetPath = '';\n el.style.offsetDistance = '';\n (el.style as any).offsetAnchor = '';\n el.style.offsetRotate = '';\n return { x: origin.x - natural.x, y: origin.y - natural.y };\n};\n\nexport const useDotAnimation = (\n moveToPosition: (position: Position) => void,\n setAvatarHidden: (hidden: boolean) => void,\n triggerAvatarAnimationState: (state: AvatarState) => void,\n mode?: 'light' | 'dark',\n) => {\n const leadDotRef = useRef<HTMLDivElement | null>(null);\n const trailRefs = useRef<(HTMLDivElement | null)[]>([]);\n const isMountedRef = useRef(true);\n const travelRunRef = useRef(0);\n\n const isCurrentTravel = (run: number) =>\n isMountedRef.current && run === travelRunRef.current;\n\n /**\n * Resolves `false` when a newer travel interrupted this one. The dots fade\n * out on the compositor when they arrive, so a busy main thread doesn't\n * leave them sitting at the end of the path.\n */\n const animateDotsAlongPath = async (\n run: number,\n start: Position,\n end: Position,\n options: MoveOptions = {},\n ): Promise<boolean> => {\n if (!isMountedRef.current) {\n return true;\n }\n\n const lead = leadDotRef.current;\n if (!lead) {\n return true;\n }\n\n if (!options.skipShrink) {\n try {\n triggerAvatarAnimationState(AvatarState.SMALL);\n } catch {}\n }\n\n [lead, ...trailRefs.current].forEach((d) =>\n d?.getAnimations().forEach((animation) => animation.cancel()),\n );\n\n const trailStyles = trailRefs.current.map((d, i) => {\n const ratio = (i + 1) / ANIMATION_CONFIG.TRAIL_COUNT;\n const opacity =\n ANIMATION_CONFIG.TRAIL_FADE +\n (1 - ANIMATION_CONFIG.TRAIL_FADE) * (1 - ratio);\n if (d) {\n d.style.opacity = String(opacity);\n }\n return {\n opacity,\n scale:\n ANIMATION_CONFIG.TRAIL_MIN_SCALE +\n (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio),\n };\n });\n\n const leadStartColor =\n mode === 'dark' ? ANIMATION_CONFIG.DOT_COLOR : '#000000';\n\n lead.style.opacity = '1';\n lead.style.background = leadStartColor;\n\n lead.animate(\n [\n { background: leadStartColor },\n { background: ANIMATION_CONFIG.DOT_COLOR },\n ],\n {\n duration: TIMING.DOT_FADE_DURATION,\n easing: 'ease-out',\n fill: 'forwards',\n },\n );\n\n const origin = measurePathOrigin(lead);\n const points = samplePathByLength(\n buildPathControlPoints(start, end),\n PATH_SAMPLES,\n );\n const pathFrames = (scale = 1): Keyframe[] =>\n points.map(({ x, y }) => ({\n transform: `translate3d(${x + origin.x}px, ${\n y + origin.y\n }px, 0) scale(${scale})`,\n }));\n // Once faded, the inline opacity follows, so the next travel's opacity\n // change runs the dots' CSS fade-in from 0.\n const fadeOut = (el: HTMLElement, opacity: number) =>\n el\n .animate([{ opacity }, { opacity: 0 }], {\n delay: TIMING.TRAVEL_DURATION,\n duration: DOT_FADE_OUT_DURATION,\n easing: 'ease-in-out',\n fill: 'forwards',\n })\n .finished.then(\n () => {\n if (run === travelRunRef.current) {\n el.style.opacity = '0';\n }\n },\n () => {},\n );\n\n const leadAnim = lead.animate(pathFrames(), {\n duration: TIMING.TRAVEL_DURATION,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'both',\n });\n fadeOut(lead, 1);\n\n trailRefs.current.forEach((td, i) => {\n if (!td) {\n return;\n }\n td.animate(pathFrames(trailStyles[i].scale), {\n duration: TIMING.TRAVEL_DURATION,\n delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'both',\n });\n fadeOut(td, trailStyles[i].opacity);\n });\n\n try {\n await leadAnim.finished;\n } catch {\n return false;\n }\n return run === travelRunRef.current;\n };\n\n const hideDots = () => {\n const lead = leadDotRef.current;\n if (lead) {\n lead.style.opacity = '0';\n }\n trailRefs.current.forEach((td) => {\n if (td) {\n td.style.opacity = '0';\n }\n });\n };\n\n const waitForNextFrame = () =>\n new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const moveFromOffsetWithDots = async (\n currentPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof currentPosition.x !== 'number' ||\n typeof currentPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n const run = ++travelRunRef.current;\n const home = { x: 0, y: 0 };\n\n if (!(await animateDotsAlongPath(run, currentPosition, home, options))) {\n return;\n }\n\n moveToPosition(home);\n setAvatarHidden(false);\n\n await waitForNextFrame();\n\n if (isCurrentTravel(run)) {\n if (options.endState) {\n await triggerAvatarAnimationState(options.endState);\n } else {\n await triggerAvatarAnimationState(AvatarState.IDLE);\n }\n }\n };\n\n const moveToOffsetWithDots = async (\n targetPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof targetPosition.x !== 'number' ||\n typeof targetPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n const run = ++travelRunRef.current;\n setAvatarHidden(true);\n await waitForNextFrame();\n\n if (!isCurrentTravel(run)) {\n return;\n }\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(run, home, targetPosition, options);\n };\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return {\n leadDotRef,\n trailRefs,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n hideDots,\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,16 +1,85 @@
1
1
  import { ANIMATION_CONFIG } from '../config';
2
- export const buildPathD = (start, end) => {
2
+ export const buildPathControlPoints = (start, end) => {
3
3
  const dx = end.x - start.x;
4
4
  const dy = end.y - start.y;
5
5
  const len = Math.max(1, Math.hypot(dx, dy));
6
6
  const nx = -dy / len;
7
7
  const ny = dx / len;
8
8
  const sway = ANIMATION_CONFIG.SWAY_AMOUNT * (0.85 + Math.random() * 0.3);
9
- const c1x = start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_1 + nx * sway;
10
- const c1y = start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_1 + ny * sway;
11
- const c2x = start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_2 - nx * (sway * 0.65);
12
- const c2y = start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_2 - ny * (sway * 0.65);
13
- return `M ${start.x},${start.y} C ${c1x},${c1y} ${c2x},${c2y} ${end.x},${end.y}`;
9
+ return {
10
+ start,
11
+ c1: {
12
+ x: start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_1 + nx * sway,
13
+ y: start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_1 + ny * sway
14
+ },
15
+ c2: {
16
+ x: start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_2 - nx * (sway * 0.65),
17
+ y: start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_2 - ny * (sway * 0.65)
18
+ },
19
+ end
20
+ };
21
+ };
22
+ export const buildPathD = (start, end) => {
23
+ const _buildPathControlPoin = buildPathControlPoints(start, end),
24
+ c1 = _buildPathControlPoin.c1,
25
+ c2 = _buildPathControlPoin.c2;
26
+ return `M ${start.x},${start.y} C ${c1.x},${c1.y} ${c2.x},${c2.y} ${end.x},${end.y}`;
27
+ };
28
+ const pointOnCubic = (_ref, t) => {
29
+ let start = _ref.start,
30
+ c1 = _ref.c1,
31
+ c2 = _ref.c2,
32
+ end = _ref.end;
33
+ const u = 1 - t;
34
+ const a = u * u * u;
35
+ const b = 3 * u * u * t;
36
+ const c = 3 * u * t * t;
37
+ const d = t * t * t;
38
+ return {
39
+ x: a * start.x + b * c1.x + c * c2.x + d * end.x,
40
+ y: a * start.y + b * c1.y + c * c2.y + d * end.y
41
+ };
42
+ };
43
+
44
+ /**
45
+ * Points evenly spaced by arc length, so a linear keyframe interpolation
46
+ * between them moves like `offset-distance` does along the same path.
47
+ */
48
+ export const samplePathByLength = (path, count) => {
49
+ const STEPS = 200;
50
+ const lut = [];
51
+ let length = 0;
52
+ let prev = pointOnCubic(path, 0);
53
+ lut.push({
54
+ point: prev,
55
+ length: 0
56
+ });
57
+ for (let i = 1; i <= STEPS; i++) {
58
+ const point = pointOnCubic(path, i / STEPS);
59
+ length += Math.hypot(point.x - prev.x, point.y - prev.y);
60
+ lut.push({
61
+ point,
62
+ length
63
+ });
64
+ prev = point;
65
+ }
66
+ const points = [];
67
+ let j = 1;
68
+ for (let i = 0; i < count; i++) {
69
+ const target = length * i / (count - 1);
70
+ while (j < lut.length - 1 && lut[j].length < target) {
71
+ j++;
72
+ }
73
+ const from = lut[j - 1];
74
+ const to = lut[j];
75
+ const span = to.length - from.length || 1;
76
+ const k = Math.min(1, Math.max(0, (target - from.length) / span));
77
+ points.push({
78
+ x: from.point.x + (to.point.x - from.point.x) * k,
79
+ y: from.point.y + (to.point.y - from.point.y) * k
80
+ });
81
+ }
82
+ return points;
14
83
  };
15
84
  export const setMotionPath = (el, pathD) => {
16
85
  el.style.offsetPath = `path("${pathD}")`;
@@ -1 +1 @@
1
- {"version":3,"names":["ANIMATION_CONFIG","buildPathD","start","end","dx","x","dy","y","len","Math","max","hypot","nx","ny","sway","SWAY_AMOUNT","random","c1x","CONTROL_POINT_1","c1y","c2x","CONTROL_POINT_2","c2y","setMotionPath","el","pathD","style","offsetPath","setOffsetDistance","value","offsetDistance","setOffsetRotate","offsetRotate","setOffsetAnchor","offsetAnchor"],"sources":["../../../../src/Astro/utils/pathGeneration.ts"],"sourcesContent":["import type { Position } from '../types';\nimport { ANIMATION_CONFIG } from '../config';\n\nexport const buildPathD = (start: Position, end: Position): string => {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const len = Math.max(1, Math.hypot(dx, dy));\n const nx = -dy / len;\n const ny = dx / len;\n\n const sway = ANIMATION_CONFIG.SWAY_AMOUNT * (0.85 + Math.random() * 0.3);\n\n const c1x = start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_1 + nx * sway;\n const c1y = start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_1 + ny * sway;\n const c2x =\n start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_2 - nx * (sway * 0.65);\n const c2y =\n start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_2 - ny * (sway * 0.65);\n\n return `M ${start.x},${start.y} C ${c1x},${c1y} ${c2x},${c2y} ${end.x},${end.y}`;\n};\n\nexport const setMotionPath = (el: HTMLElement, pathD: string): void => {\n el.style.offsetPath = `path(\"${pathD}\")`;\n};\n\nexport const setOffsetDistance = (el: HTMLElement, value: string): void => {\n el.style.offsetDistance = value;\n};\n\nexport const setOffsetRotate = (el: HTMLElement, value: string): void => {\n el.style.offsetRotate = value;\n};\n\nexport const setOffsetAnchor = (el: HTMLElement, value: string): void => {\n (el.style as any).offsetAnchor = value;\n};\n"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,WAAW;AAE5C,OAAO,MAAMC,UAAU,GAAGA,CAACC,KAAe,EAAEC,GAAa,KAAa;EACpE,MAAMC,EAAE,GAAGD,GAAG,CAACE,CAAC,GAAGH,KAAK,CAACG,CAAC;EAC1B,MAAMC,EAAE,GAAGH,GAAG,CAACI,CAAC,GAAGL,KAAK,CAACK,CAAC;EAC1B,MAAMC,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,KAAK,CAACP,EAAE,EAAEE,EAAE,CAAC,CAAC;EAC3C,MAAMM,EAAE,GAAG,CAACN,EAAE,GAAGE,GAAG;EACpB,MAAMK,EAAE,GAAGT,EAAE,GAAGI,GAAG;EAEnB,MAAMM,IAAI,GAAGd,gBAAgB,CAACe,WAAW,IAAI,IAAI,GAAGN,IAAI,CAACO,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;EAExE,MAAMC,GAAG,GAAGf,KAAK,CAACG,CAAC,GAAGD,EAAE,GAAGJ,gBAAgB,CAACkB,eAAe,GAAGN,EAAE,GAAGE,IAAI;EACvE,MAAMK,GAAG,GAAGjB,KAAK,CAACK,CAAC,GAAGD,EAAE,GAAGN,gBAAgB,CAACkB,eAAe,GAAGL,EAAE,GAAGC,IAAI;EACvE,MAAMM,GAAG,GACPlB,KAAK,CAACG,CAAC,GAAGD,EAAE,GAAGJ,gBAAgB,CAACqB,eAAe,GAAGT,EAAE,IAAIE,IAAI,GAAG,IAAI,CAAC;EACtE,MAAMQ,GAAG,GACPpB,KAAK,CAACK,CAAC,GAAGD,EAAE,GAAGN,gBAAgB,CAACqB,eAAe,GAAGR,EAAE,IAAIC,IAAI,GAAG,IAAI,CAAC;EAEtE,OAAO,KAAKZ,KAAK,CAACG,CAAC,IAAIH,KAAK,CAACK,CAAC,MAAMU,GAAG,IAAIE,GAAG,IAAIC,GAAG,IAAIE,GAAG,IAAInB,GAAG,CAACE,CAAC,IAAIF,GAAG,CAACI,CAAC,EAAE;AAClF,CAAC;AAED,OAAO,MAAMgB,aAAa,GAAGA,CAACC,EAAe,EAAEC,KAAa,KAAW;EACrED,EAAE,CAACE,KAAK,CAACC,UAAU,GAAG,SAASF,KAAK,IAAI;AAC1C,CAAC;AAED,OAAO,MAAMG,iBAAiB,GAAGA,CAACJ,EAAe,EAAEK,KAAa,KAAW;EACzEL,EAAE,CAACE,KAAK,CAACI,cAAc,GAAGD,KAAK;AACjC,CAAC;AAED,OAAO,MAAME,eAAe,GAAGA,CAACP,EAAe,EAAEK,KAAa,KAAW;EACvEL,EAAE,CAACE,KAAK,CAACM,YAAY,GAAGH,KAAK;AAC/B,CAAC;AAED,OAAO,MAAMI,eAAe,GAAGA,CAACT,EAAe,EAAEK,KAAa,KAAW;EACtEL,EAAE,CAACE,KAAK,CAASQ,YAAY,GAAGL,KAAK;AACxC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ANIMATION_CONFIG","buildPathControlPoints","start","end","dx","x","dy","y","len","Math","max","hypot","nx","ny","sway","SWAY_AMOUNT","random","c1","CONTROL_POINT_1","c2","CONTROL_POINT_2","buildPathD","_buildPathControlPoin","pointOnCubic","_ref","t","u","a","b","c","d","samplePathByLength","path","count","STEPS","lut","length","prev","push","point","i","points","j","target","from","to","span","k","min","setMotionPath","el","pathD","style","offsetPath","setOffsetDistance","value","offsetDistance","setOffsetRotate","offsetRotate","setOffsetAnchor","offsetAnchor"],"sources":["../../../../src/Astro/utils/pathGeneration.ts"],"sourcesContent":["import type { Position } from '../types';\nimport { ANIMATION_CONFIG } from '../config';\n\ntype CubicPath = { start: Position; c1: Position; c2: Position; end: Position };\n\nexport const buildPathControlPoints = (\n start: Position,\n end: Position,\n): CubicPath => {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const len = Math.max(1, Math.hypot(dx, dy));\n const nx = -dy / len;\n const ny = dx / len;\n\n const sway = ANIMATION_CONFIG.SWAY_AMOUNT * (0.85 + Math.random() * 0.3);\n\n return {\n start,\n c1: {\n x: start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_1 + nx * sway,\n y: start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_1 + ny * sway,\n },\n c2: {\n x: start.x + dx * ANIMATION_CONFIG.CONTROL_POINT_2 - nx * (sway * 0.65),\n y: start.y + dy * ANIMATION_CONFIG.CONTROL_POINT_2 - ny * (sway * 0.65),\n },\n end,\n };\n};\n\nexport const buildPathD = (start: Position, end: Position): string => {\n const { c1, c2 } = buildPathControlPoints(start, end);\n return `M ${start.x},${start.y} C ${c1.x},${c1.y} ${c2.x},${c2.y} ${end.x},${end.y}`;\n};\n\nconst pointOnCubic = (\n { start, c1, c2, end }: CubicPath,\n t: number,\n): Position => {\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const c = 3 * u * t * t;\n const d = t * t * t;\n return {\n x: a * start.x + b * c1.x + c * c2.x + d * end.x,\n y: a * start.y + b * c1.y + c * c2.y + d * end.y,\n };\n};\n\n/**\n * Points evenly spaced by arc length, so a linear keyframe interpolation\n * between them moves like `offset-distance` does along the same path.\n */\nexport const samplePathByLength = (\n path: CubicPath,\n count: number,\n): Position[] => {\n const STEPS = 200;\n const lut: { point: Position; length: number }[] = [];\n let length = 0;\n let prev = pointOnCubic(path, 0);\n lut.push({ point: prev, length: 0 });\n for (let i = 1; i <= STEPS; i++) {\n const point = pointOnCubic(path, i / STEPS);\n length += Math.hypot(point.x - prev.x, point.y - prev.y);\n lut.push({ point, length });\n prev = point;\n }\n\n const points: Position[] = [];\n let j = 1;\n for (let i = 0; i < count; i++) {\n const target = (length * i) / (count - 1);\n while (j < lut.length - 1 && lut[j].length < target) {\n j++;\n }\n const from = lut[j - 1];\n const to = lut[j];\n const span = to.length - from.length || 1;\n const k = Math.min(1, Math.max(0, (target - from.length) / span));\n points.push({\n x: from.point.x + (to.point.x - from.point.x) * k,\n y: from.point.y + (to.point.y - from.point.y) * k,\n });\n }\n return points;\n};\n\nexport const setMotionPath = (el: HTMLElement, pathD: string): void => {\n el.style.offsetPath = `path(\"${pathD}\")`;\n};\n\nexport const setOffsetDistance = (el: HTMLElement, value: string): void => {\n el.style.offsetDistance = value;\n};\n\nexport const setOffsetRotate = (el: HTMLElement, value: string): void => {\n el.style.offsetRotate = value;\n};\n\nexport const setOffsetAnchor = (el: HTMLElement, value: string): void => {\n (el.style as any).offsetAnchor = value;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Astro.d.ts","sourceRoot":"","sources":["../../../src/Astro/Astro.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AAMjE,eAAO,MAAM,iBAAiB,6EA8K7B,CAAC"}
1
+ {"version":3,"file":"Astro.d.ts","sourceRoot":"","sources":["../../../src/Astro/Astro.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AASjE,eAAO,MAAM,iBAAiB,6EAyM7B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { Position, MoveOptions } from '../types';
2
2
  import { AvatarState } from '@wix/aria-ai-avatar';
3
- export declare const useDotAnimation: (moveToPosition: (position: Position) => void, setAvatarHidden: (hidden: boolean) => void, triggerAvatarAnimationState: (state: AvatarState) => void) => {
3
+ export declare const useDotAnimation: (moveToPosition: (position: Position) => void, setAvatarHidden: (hidden: boolean) => void, triggerAvatarAnimationState: (state: AvatarState) => void, mode?: "light" | "dark") => {
4
4
  leadDotRef: import("react").MutableRefObject<HTMLDivElement | null>;
5
5
  trailRefs: import("react").MutableRefObject<(HTMLDivElement | null)[]>;
6
6
  moveFromOffsetWithDots: (currentPosition: Position, options?: MoveOptions) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"useDotAnimation.d.ts","sourceRoot":"","sources":["../../../../src/Astro/hooks/useDotAnimation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAStD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,eAAO,MAAM,eAAe,GAC1B,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC5C,iBAAiB,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAC1C,6BAA6B,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;;;8CAgHtC,QAAQ,YAChB,WAAW,KACnB,OAAO,CAAC,IAAI,CAAC;2CA2BE,QAAQ,YACf,WAAW,KACnB,OAAO,CAAC,IAAI,CAAC;;CA+BjB,CAAC"}
1
+ {"version":3,"file":"useDotAnimation.d.ts","sourceRoot":"","sources":["../../../../src/Astro/hooks/useDotAnimation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA8BlD,eAAO,MAAM,eAAe,GAC1B,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC5C,iBAAiB,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAC1C,6BAA6B,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,EACzD,OAAO,OAAO,GAAG,MAAM;;;8CAoJJ,QAAQ,YAChB,WAAW,KACnB,OAAO,CAAC,IAAI,CAAC;2CA+BE,QAAQ,YACf,WAAW,KACnB,OAAO,CAAC,IAAI,CAAC;;CAkCjB,CAAC"}
@@ -1,7 +1,20 @@
1
1
  import type { Position } from '../types';
2
+ type CubicPath = {
3
+ start: Position;
4
+ c1: Position;
5
+ c2: Position;
6
+ end: Position;
7
+ };
8
+ export declare const buildPathControlPoints: (start: Position, end: Position) => CubicPath;
2
9
  export declare const buildPathD: (start: Position, end: Position) => string;
10
+ /**
11
+ * Points evenly spaced by arc length, so a linear keyframe interpolation
12
+ * between them moves like `offset-distance` does along the same path.
13
+ */
14
+ export declare const samplePathByLength: (path: CubicPath, count: number) => Position[];
3
15
  export declare const setMotionPath: (el: HTMLElement, pathD: string) => void;
4
16
  export declare const setOffsetDistance: (el: HTMLElement, value: string) => void;
5
17
  export declare const setOffsetRotate: (el: HTMLElement, value: string) => void;
6
18
  export declare const setOffsetAnchor: (el: HTMLElement, value: string) => void;
19
+ export {};
7
20
  //# sourceMappingURL=pathGeneration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pathGeneration.d.ts","sourceRoot":"","sources":["../../../../src/Astro/utils/pathGeneration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,eAAO,MAAM,UAAU,GAAI,OAAO,QAAQ,EAAE,KAAK,QAAQ,KAAG,MAiB3D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAE9D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAElE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAEhE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAEhE,CAAC"}
1
+ {"version":3,"file":"pathGeneration.d.ts","sourceRoot":"","sources":["../../../../src/Astro/utils/pathGeneration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,KAAK,SAAS,GAAG;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhF,eAAO,MAAM,sBAAsB,GACjC,OAAO,QAAQ,EACf,KAAK,QAAQ,KACZ,SAqBF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,QAAQ,EAAE,KAAK,QAAQ,KAAG,MAG3D,CAAC;AAiBF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,SAAS,EACf,OAAO,MAAM,KACZ,QAAQ,EA8BV,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAE9D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAElE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAEhE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,KAAG,IAEhE,CAAC"}