@wix/ai-assistant-avatar 0.44.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.
@@ -11,6 +11,8 @@ var _DotTrail = require("./components/DotTrail");
11
11
  var _ariaAiAvatar = require("@wix/aria-ai-avatar");
12
12
  var _jsxFileName = "/home/builduser/work/4baef6c1cf3e5e6a/packages/ai-assistant-avatar/dist/cjs/Astro/Astro.tsx";
13
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ // Matches the `.astro` opacity transition in Astro.module.css.
15
+ const AVATAR_REVEAL_DURATION = 80;
14
16
  const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.forwardRef)(({
15
17
  mode,
16
18
  variant,
@@ -39,11 +41,39 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
39
41
  moveFromOffsetWithDots,
40
42
  moveToOffsetWithDots
41
43
  } = (0, _hooks.useDotAnimation)(setCenter, setAvatarHidden, AriaAvatar.setState, mode);
44
+ const revealRef = (0, _react.useRef)(null);
45
+ const cancelReveal = () => {
46
+ var _revealRef$current;
47
+ (_revealRef$current = revealRef.current) == null || _revealRef$current.cancel();
48
+ revealRef.current = null;
49
+ };
50
+
51
+ // The dots arrive on the compositor, so the avatar is revealed there too
52
+ // rather than when the main thread gets to `setAvatarHidden(false)`.
53
+ const scheduleReveal = () => {
54
+ cancelReveal();
55
+ const wrapper = wrapperRef.current;
56
+ if ((wrapper == null ? void 0 : wrapper.style.opacity) !== '0') {
57
+ return;
58
+ }
59
+ revealRef.current = wrapper.animate([{
60
+ opacity: 0
61
+ }, {
62
+ opacity: 1
63
+ }], {
64
+ delay: _config.TIMING.TRAVEL_DURATION,
65
+ duration: AVATAR_REVEAL_DURATION,
66
+ fill: 'forwards'
67
+ });
68
+ };
42
69
  const onTravelHomeFrom = async (x, y, options) => {
43
70
  const pos = {
44
71
  x,
45
72
  y
46
73
  };
74
+ if (typeof x === 'number' && typeof y === 'number') {
75
+ scheduleReveal();
76
+ }
47
77
  await moveFromOffsetWithDots(pos, options);
48
78
  };
49
79
  const onTravelAwayTo = async (x, y, options) => {
@@ -51,6 +81,7 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
51
81
  x,
52
82
  y
53
83
  };
84
+ cancelReveal();
54
85
  await moveToOffsetWithDots(pos, options);
55
86
  };
56
87
  const onMouseMove = (clientX, clientY) => {
@@ -83,6 +114,7 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
83
114
  const hideAvatar = ({
84
115
  withDots = false
85
116
  } = {}) => {
117
+ cancelReveal();
86
118
  setAvatarHidden(true);
87
119
  if (withDots) {
88
120
  hideDots();
@@ -155,7 +187,7 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
155
187
  __self: void 0,
156
188
  __source: {
157
189
  fileName: _jsxFileName,
158
- lineNumber: 173,
190
+ lineNumber: 203,
159
191
  columnNumber: 7
160
192
  }
161
193
  }, /*#__PURE__*/_react.default.createElement(_DotTrail.DotTrail, {
@@ -164,7 +196,7 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
164
196
  __self: void 0,
165
197
  __source: {
166
198
  fileName: _jsxFileName,
167
- lineNumber: 174,
199
+ lineNumber: 204,
168
200
  columnNumber: 9
169
201
  }
170
202
  }), /*#__PURE__*/_react.default.createElement("div", {
@@ -176,7 +208,7 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
176
208
  __self: void 0,
177
209
  __source: {
178
210
  fileName: _jsxFileName,
179
- lineNumber: 176,
211
+ lineNumber: 206,
180
212
  columnNumber: 9
181
213
  }
182
214
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -187,14 +219,14 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
187
219
  __self: void 0,
188
220
  __source: {
189
221
  fileName: _jsxFileName,
190
- lineNumber: 183,
222
+ lineNumber: 213,
191
223
  columnNumber: 11
192
224
  }
193
225
  }, /*#__PURE__*/_react.default.createElement(AriaAvatar.AriaAvatar, {
194
226
  __self: void 0,
195
227
  __source: {
196
228
  fileName: _jsxFileName,
197
- lineNumber: 184,
229
+ lineNumber: 214,
198
230
  columnNumber: 13
199
231
  }
200
232
  }))));
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_AstroModule","_interopRequireDefault","_config","_hooks","_DotTrail","_ariaAiAvatar","_jsxFileName","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AiAssistantAvatar","exports","forwardRef","mode","variant","sleepTimeout","ref","wrapperRef","useRef","typingTimeout","isTyping","setIsTyping","useState","showBg","setShowBg","AriaAvatar","avatarHidden","setAvatarHidden","useAvatarSetup","setCenter","useMovement","ASTRO_SIZE","WIDTH","HEIGHT","leadDotRef","trailRefs","hideDots","moveFromOffsetWithDots","moveToOffsetWithDots","useDotAnimation","setState","onTravelHomeFrom","x","y","options","pos","onTravelAwayTo","onMouseMove","clientX","clientY","lookAt","onUserTyping","caretX","caretY","current","clearTimeout","setTimeout","err","console","error","useEffect","hideAvatar","withDots","showAvatar","useImperativeHandle","trigger","shrink","getState","AvatarState","SMALL","IDLE","smallLoader","SMALL_LOADER","pulse","Promise","resolve","idle","undo","fireEvent","AvatarEvent","UNDO_EVENT","boredom","SLEEPING","bigLoader","BIG_LOADER","ideaSpark","IDEA_SPARK","publish","PUBLISH_EVENT","wrapper","changeAstroColor","color","setAvatarColor","toggleAvatarBackground","hideBg","hide","show","createElement","className","s","avatar","__self","__source","fileName","lineNumber","columnNumber","DotTrail","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, mode);\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","_interopRequireWildcard","require","_AstroModule","_interopRequireDefault","_config","_hooks","_DotTrail","_ariaAiAvatar","_jsxFileName","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AVATAR_REVEAL_DURATION","AiAssistantAvatar","exports","forwardRef","mode","variant","sleepTimeout","ref","wrapperRef","useRef","typingTimeout","isTyping","setIsTyping","useState","showBg","setShowBg","AriaAvatar","avatarHidden","setAvatarHidden","useAvatarSetup","setCenter","useMovement","ASTRO_SIZE","WIDTH","HEIGHT","leadDotRef","trailRefs","hideDots","moveFromOffsetWithDots","moveToOffsetWithDots","useDotAnimation","setState","revealRef","cancelReveal","_revealRef$current","current","cancel","scheduleReveal","wrapper","style","opacity","animate","delay","TIMING","TRAVEL_DURATION","duration","fill","onTravelHomeFrom","x","y","options","pos","onTravelAwayTo","onMouseMove","clientX","clientY","lookAt","onUserTyping","caretX","caretY","clearTimeout","setTimeout","err","console","error","useEffect","hideAvatar","withDots","showAvatar","useImperativeHandle","trigger","shrink","getState","AvatarState","SMALL","IDLE","smallLoader","SMALL_LOADER","pulse","Promise","resolve","idle","undo","fireEvent","AvatarEvent","UNDO_EVENT","boredom","SLEEPING","bigLoader","BIG_LOADER","ideaSpark","IDEA_SPARK","publish","PUBLISH_EVENT","changeAstroColor","color","setAvatarColor","toggleAvatarBackground","hideBg","hide","show","createElement","className","s","avatar","__self","__source","fileName","lineNumber","columnNumber","DotTrail","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":[]}
@@ -6,32 +6,74 @@ var _react = require("react");
6
6
  var _config = require("../config");
7
7
  var _utils = require("../utils");
8
8
  var _ariaAiAvatar = require("@wix/aria-ai-avatar");
9
+ const PATH_SAMPLES = 48;
10
+ // Matches the dots' opacity transition in Astro.module.css.
11
+ const DOT_FADE_OUT_DURATION = 150;
12
+ const centerOf = el => {
13
+ const rect = el.getBoundingClientRect();
14
+ return {
15
+ x: rect.left + rect.width / 2,
16
+ y: rect.top + rect.height / 2
17
+ };
18
+ };
19
+
20
+ /**
21
+ * Where path coordinate (0, 0) lies relative to the dot's own center, i.e.
22
+ * the translation that puts the dot where `offset-path` with a centered
23
+ * `offset-anchor` would.
24
+ */
25
+ const measurePathOrigin = el => {
26
+ const natural = centerOf(el);
27
+ el.style.offsetPath = 'path("M 0,0 L 1,0")';
28
+ el.style.offsetDistance = '0%';
29
+ el.style.offsetAnchor = '50% 50%';
30
+ el.style.offsetRotate = '0deg';
31
+ const origin = centerOf(el);
32
+ el.style.offsetPath = '';
33
+ el.style.offsetDistance = '';
34
+ el.style.offsetAnchor = '';
35
+ el.style.offsetRotate = '';
36
+ return {
37
+ x: origin.x - natural.x,
38
+ y: origin.y - natural.y
39
+ };
40
+ };
9
41
  const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimationState, mode) => {
10
42
  const leadDotRef = (0, _react.useRef)(null);
11
43
  const trailRefs = (0, _react.useRef)([]);
12
44
  const isMountedRef = (0, _react.useRef)(true);
13
- const animateDotsAlongPath = async (start, end, options = {}) => {
45
+ const travelRunRef = (0, _react.useRef)(0);
46
+ const isCurrentTravel = run => isMountedRef.current && run === travelRunRef.current;
47
+
48
+ /**
49
+ * Resolves `false` when a newer travel interrupted this one. The dots fade
50
+ * out on the compositor when they arrive, so a busy main thread doesn't
51
+ * leave them sitting at the end of the path.
52
+ */
53
+ const animateDotsAlongPath = async (run, start, end, options = {}) => {
14
54
  if (!isMountedRef.current) {
15
- return;
55
+ return true;
16
56
  }
17
57
  const lead = leadDotRef.current;
18
58
  if (!lead) {
19
- return;
59
+ return true;
20
60
  }
21
61
  if (!options.skipShrink) {
22
62
  try {
23
63
  triggerAvatarAnimationState(_ariaAiAvatar.AvatarState.SMALL);
24
64
  } catch {}
25
65
  }
26
- trailRefs.current.forEach((d, i) => {
27
- if (!d) {
28
- return;
29
- }
66
+ [lead, ...trailRefs.current].forEach(d => d == null ? void 0 : d.getAnimations().forEach(animation => animation.cancel()));
67
+ const trailStyles = trailRefs.current.map((d, i) => {
30
68
  const ratio = (i + 1) / _config.ANIMATION_CONFIG.TRAIL_COUNT;
31
- const scale = _config.ANIMATION_CONFIG.TRAIL_MIN_SCALE + (1 - _config.ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio);
32
69
  const opacity = _config.ANIMATION_CONFIG.TRAIL_FADE + (1 - _config.ANIMATION_CONFIG.TRAIL_FADE) * (1 - ratio);
33
- d.style.opacity = String(opacity);
34
- d.style.transform = `scale(${scale})`;
70
+ if (d) {
71
+ d.style.opacity = String(opacity);
72
+ }
73
+ return {
74
+ opacity,
75
+ scale: _config.ANIMATION_CONFIG.TRAIL_MIN_SCALE + (1 - _config.ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio)
76
+ };
35
77
  });
36
78
  const leadStartColor = mode === 'dark' ? _config.ANIMATION_CONFIG.DOT_COLOR : '#000000';
37
79
  lead.style.opacity = '1';
@@ -45,45 +87,54 @@ const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimation
45
87
  easing: 'ease-out',
46
88
  fill: 'forwards'
47
89
  });
48
- const pathD = (0, _utils.buildPathD)(start, end);
49
- const prepDot = el => {
50
- if (!el) {
51
- return;
52
- }
53
- (0, _utils.setMotionPath)(el, pathD);
54
- (0, _utils.setOffsetDistance)(el, '0%');
55
- (0, _utils.setOffsetRotate)(el, '0deg');
56
- (0, _utils.setOffsetAnchor)(el, '50% 50%');
57
- };
58
- prepDot(lead);
59
- trailRefs.current.forEach(td => td && prepDot(td));
60
- const leadAnim = lead.animate([{
61
- offsetDistance: '0%'
90
+ const origin = measurePathOrigin(lead);
91
+ const points = (0, _utils.samplePathByLength)((0, _utils.buildPathControlPoints)(start, end), PATH_SAMPLES);
92
+ const pathFrames = (scale = 1) => points.map(({
93
+ x,
94
+ y
95
+ }) => ({
96
+ transform: `translate3d(${x + origin.x}px, ${y + origin.y}px, 0) scale(${scale})`
97
+ }));
98
+ // Once faded, the inline opacity follows, so the next travel's opacity
99
+ // change runs the dots' CSS fade-in from 0.
100
+ const fadeOut = (el, opacity) => el.animate([{
101
+ opacity
62
102
  }, {
63
- offsetDistance: '100%'
103
+ opacity: 0
64
104
  }], {
105
+ delay: _config.TIMING.TRAVEL_DURATION,
106
+ duration: DOT_FADE_OUT_DURATION,
107
+ easing: 'ease-in-out',
108
+ fill: 'forwards'
109
+ }).finished.then(() => {
110
+ if (run === travelRunRef.current) {
111
+ el.style.opacity = '0';
112
+ }
113
+ }, () => {});
114
+ const leadAnim = lead.animate(pathFrames(), {
65
115
  duration: _config.TIMING.TRAVEL_DURATION,
66
116
  easing: _config.ANIMATION_CONFIG.EASING,
67
- fill: 'forwards'
117
+ fill: 'both'
68
118
  });
119
+ fadeOut(lead, 1);
69
120
  trailRefs.current.forEach((td, i) => {
70
121
  if (!td) {
71
122
  return;
72
123
  }
73
- td.animate([{
74
- offsetDistance: '0%'
75
- }, {
76
- offsetDistance: '100%'
77
- }], {
124
+ td.animate(pathFrames(trailStyles[i].scale), {
78
125
  duration: _config.TIMING.TRAVEL_DURATION,
79
126
  delay: (i + 1) * _config.ANIMATION_CONFIG.TRAIL_STAGGER,
80
127
  easing: _config.ANIMATION_CONFIG.EASING,
81
- fill: 'forwards'
128
+ fill: 'both'
82
129
  });
130
+ fadeOut(td, trailStyles[i].opacity);
83
131
  });
84
- await leadAnim.finished;
85
- lead.style.opacity = '0';
86
- trailRefs.current.forEach(td => td && (td.style.opacity = '0'));
132
+ try {
133
+ await leadAnim.finished;
134
+ } catch {
135
+ return false;
136
+ }
137
+ return run === travelRunRef.current;
87
138
  };
88
139
  const hideDots = () => {
89
140
  const lead = leadDotRef.current;
@@ -102,15 +153,18 @@ const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimation
102
153
  console.log('[Astro] Invalid position, skipping animation');
103
154
  return;
104
155
  }
156
+ const run = ++travelRunRef.current;
105
157
  const home = {
106
158
  x: 0,
107
159
  y: 0
108
160
  };
109
- await animateDotsAlongPath(currentPosition, home, options);
161
+ if (!(await animateDotsAlongPath(run, currentPosition, home, options))) {
162
+ return;
163
+ }
110
164
  moveToPosition(home);
111
165
  setAvatarHidden(false);
112
166
  await waitForNextFrame();
113
- if (isMountedRef.current) {
167
+ if (isCurrentTravel(run)) {
114
168
  if (options.endState) {
115
169
  await triggerAvatarAnimationState(options.endState);
116
170
  } else {
@@ -123,14 +177,17 @@ const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimation
123
177
  console.log('[Astro] Invalid position, skipping animation');
124
178
  return;
125
179
  }
180
+ const run = ++travelRunRef.current;
126
181
  setAvatarHidden(true);
127
182
  await waitForNextFrame();
183
+ if (!isCurrentTravel(run)) {
184
+ return;
185
+ }
128
186
  const home = {
129
187
  x: 0,
130
188
  y: 0
131
189
  };
132
- await animateDotsAlongPath(home, targetPosition, options);
133
- hideDots();
190
+ await animateDotsAlongPath(run, home, targetPosition, options);
134
191
  };
135
192
  (0, _react.useEffect)(() => {
136
193
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_config","_utils","_ariaAiAvatar","useDotAnimation","moveToPosition","setAvatarHidden","triggerAvatarAnimationState","mode","leadDotRef","useRef","trailRefs","isMountedRef","animateDotsAlongPath","start","end","options","current","lead","skipShrink","AvatarState","SMALL","forEach","d","i","ratio","ANIMATION_CONFIG","TRAIL_COUNT","scale","TRAIL_MIN_SCALE","opacity","TRAIL_FADE","style","String","transform","leadStartColor","DOT_COLOR","background","animate","duration","TIMING","DOT_FADE_DURATION","easing","fill","pathD","buildPathD","prepDot","el","setMotionPath","setOffsetDistance","setOffsetRotate","setOffsetAnchor","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","useEffect","exports"],"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 mode?: 'light' | 'dark',\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 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 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,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAOA,IAAAG,aAAA,GAAAH,OAAA;AAEO,MAAMI,eAAe,GAAGA,CAC7BC,cAA4C,EAC5CC,eAA0C,EAC1CC,2BAAyD,EACzDC,IAAuB,KACpB;EACH,MAAMC,UAAU,GAAG,IAAAC,aAAM,EAAwB,IAAI,CAAC;EACtD,MAAMC,SAAS,GAAG,IAAAD,aAAM,EAA4B,EAAE,CAAC;EACvD,MAAME,YAAY,GAAG,IAAAF,aAAM,EAAC,IAAI,CAAC;EAEjC,MAAMG,oBAAoB,GAAG,MAAAA,CAC3BC,KAAe,EACfC,GAAa,EACbC,OAAoB,GAAG,CAAC,CAAC,KACP;IAClB,IAAI,CAACJ,YAAY,CAACK,OAAO,EAAE;MACzB;IACF;IAEA,MAAMC,IAAI,GAAGT,UAAU,CAACQ,OAAO;IAC/B,IAAI,CAACC,IAAI,EAAE;MACT;IACF;IAEA,IAAI,CAACF,OAAO,CAACG,UAAU,EAAE;MACvB,IAAI;QACFZ,2BAA2B,CAACa,yBAAW,CAACC,KAAK,CAAC;MAChD,CAAC,CAAC,MAAM,CAAC;IACX;IAEAV,SAAS,CAACM,OAAO,CAACK,OAAO,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;MAClC,IAAI,CAACD,CAAC,EAAE;QACN;MACF;MACA,MAAME,KAAK,GAAG,CAACD,CAAC,GAAG,CAAC,IAAIE,wBAAgB,CAACC,WAAW;MACpD,MAAMC,KAAK,GACTF,wBAAgB,CAACG,eAAe,GAChC,CAAC,CAAC,GAAGH,wBAAgB,CAACG,eAAe,KAAK,CAAC,GAAGJ,KAAK,CAAC;MACtD,MAAMK,OAAO,GACXJ,wBAAgB,CAACK,UAAU,GAC3B,CAAC,CAAC,GAAGL,wBAAgB,CAACK,UAAU,KAAK,CAAC,GAAGN,KAAK,CAAC;MACjDF,CAAC,CAACS,KAAK,CAACF,OAAO,GAAGG,MAAM,CAACH,OAAO,CAAC;MACjCP,CAAC,CAACS,KAAK,CAACE,SAAS,GAAG,SAASN,KAAK,GAAG;IACvC,CAAC,CAAC;IAEF,MAAMO,cAAc,GAClB3B,IAAI,KAAK,MAAM,GAAGkB,wBAAgB,CAACU,SAAS,GAAG,SAAS;IAE1DlB,IAAI,CAACc,KAAK,CAACF,OAAO,GAAG,GAAG;IACxBZ,IAAI,CAACc,KAAK,CAACK,UAAU,GAAGF,cAAc;IAEtCjB,IAAI,CAACoB,OAAO,CACV,CACE;MAAED,UAAU,EAAEF;IAAe,CAAC,EAC9B;MAAEE,UAAU,EAAEX,wBAAgB,CAACU;IAAU,CAAC,CAC3C,EACD;MACEG,QAAQ,EAAEC,cAAM,CAACC,iBAAiB;MAClCC,MAAM,EAAE,UAAU;MAClBC,IAAI,EAAE;IACR,CACF,CAAC;IAED,MAAMC,KAAK,GAAG,IAAAC,iBAAU,EAAC/B,KAAK,EAAEC,GAAG,CAAC;IAEpC,MAAM+B,OAAO,GAAIC,EAAe,IAAK;MACnC,IAAI,CAACA,EAAE,EAAE;QACP;MACF;MACA,IAAAC,oBAAa,EAACD,EAAE,EAAEH,KAAK,CAAC;MACxB,IAAAK,wBAAiB,EAACF,EAAE,EAAE,IAAI,CAAC;MAC3B,IAAAG,sBAAe,EAACH,EAAE,EAAE,MAAM,CAAC;MAC3B,IAAAI,sBAAe,EAACJ,EAAE,EAAE,SAAS,CAAC;IAChC,CAAC;IAEDD,OAAO,CAAC5B,IAAI,CAAC;IAEbP,SAAS,CAACM,OAAO,CAACK,OAAO,CAAE8B,EAAE,IAAKA,EAAE,IAAIN,OAAO,CAACM,EAAE,CAAC,CAAC;IAEpD,MAAMC,QAAQ,GAAGnC,IAAI,CAACoB,OAAO,CAC3B,CAAC;MAAEgB,cAAc,EAAE;IAAK,CAAC,EAAE;MAAEA,cAAc,EAAE;IAAO,CAAC,CAAC,EACtD;MACEf,QAAQ,EAAEC,cAAM,CAACe,eAAe;MAChCb,MAAM,EAAEhB,wBAAgB,CAAC8B,MAAM;MAC/Bb,IAAI,EAAE;IACR,CACF,CAAC;IAEDhC,SAAS,CAACM,OAAO,CAACK,OAAO,CAAC,CAAC8B,EAAE,EAAE5B,CAAC,KAAK;MACnC,IAAI,CAAC4B,EAAE,EAAE;QACP;MACF;MACAA,EAAE,CAACd,OAAO,CAAC,CAAC;QAAEgB,cAAc,EAAE;MAAK,CAAC,EAAE;QAAEA,cAAc,EAAE;MAAO,CAAC,CAAC,EAAE;QACjEf,QAAQ,EAAEC,cAAM,CAACe,eAAe;QAChCE,KAAK,EAAE,CAACjC,CAAC,GAAG,CAAC,IAAIE,wBAAgB,CAACgC,aAAa;QAC/ChB,MAAM,EAAEhB,wBAAgB,CAAC8B,MAAM;QAC/Bb,IAAI,EAAE;MACR,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAMU,QAAQ,CAACM,QAAQ;IAEvBzC,IAAI,CAACc,KAAK,CAACF,OAAO,GAAG,GAAG;IACxBnB,SAAS,CAACM,OAAO,CAACK,OAAO,CAAE8B,EAAE,IAAKA,EAAE,KAAKA,EAAE,CAACpB,KAAK,CAACF,OAAO,GAAG,GAAG,CAAC,CAAC;EACnE,CAAC;EAED,MAAM8B,QAAQ,GAAGA,CAAA,KAAM;IACrB,MAAM1C,IAAI,GAAGT,UAAU,CAACQ,OAAO;IAC/B,IAAIC,IAAI,EAAE;MACRA,IAAI,CAACc,KAAK,CAACF,OAAO,GAAG,GAAG;IAC1B;IACAnB,SAAS,CAACM,OAAO,CAACK,OAAO,CAAE8B,EAAE,IAAK;MAChC,IAAIA,EAAE,EAAE;QACNA,EAAE,CAACpB,KAAK,CAACF,OAAO,GAAG,GAAG;MACxB;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAM+B,gBAAgB,GAAGA,CAAA,KACvB,IAAIC,OAAO,CAAQC,CAAC,IAAKC,qBAAqB,CAAC,MAAMD,CAAC,CAAC,CAAC,CAAC,CAAC;EAE5D,MAAME,sBAAsB,GAAG,MAAAA,CAC7BC,eAAyB,EACzBlD,OAAoB,GAAG,CAAC,CAAC,KACP;IAClB,IACE,OAAOkD,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,MAAMvD,oBAAoB,CAACqD,eAAe,EAAEK,IAAI,EAAEvD,OAAO,CAAC;IAE1DX,cAAc,CAACkE,IAAI,CAAC;IACpBjE,eAAe,CAAC,KAAK,CAAC;IAEtB,MAAMuD,gBAAgB,CAAC,CAAC;IAExB,IAAIjD,YAAY,CAACK,OAAO,EAAE;MACxB,IAAID,OAAO,CAACwD,QAAQ,EAAE;QACpB,MAAMjE,2BAA2B,CAACS,OAAO,CAACwD,QAAQ,CAAC;MACrD,CAAC,MAAM;QACL,MAAMjE,2BAA2B,CAACa,yBAAW,CAACqD,IAAI,CAAC;MACrD;IACF;EACF,CAAC;EAED,MAAMC,oBAAoB,GAAG,MAAAA,CAC3BC,cAAwB,EACxB3D,OAAoB,GAAG,CAAC,CAAC,KACP;IAClB,IACE,OAAO2D,cAAc,CAACR,CAAC,KAAK,QAAQ,IACpC,OAAOQ,cAAc,CAACP,CAAC,KAAK,QAAQ,EACpC;MACAC,OAAO,CAACC,GAAG,CAAC,8CAA8C,CAAC;MAC3D;IACF;IAEAhE,eAAe,CAAC,IAAI,CAAC;IACrB,MAAMuD,gBAAgB,CAAC,CAAC;IAExB,MAAMU,IAAI,GAAG;MAAEJ,CAAC,EAAE,CAAC;MAAEC,CAAC,EAAE;IAAE,CAAC;IAC3B,MAAMvD,oBAAoB,CAAC0D,IAAI,EAAEI,cAAc,EAAE3D,OAAO,CAAC;IAEzD4C,QAAQ,CAAC,CAAC;EACZ,CAAC;EAED,IAAAgB,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACXhE,YAAY,CAACK,OAAO,GAAG,KAAK;IAC9B,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IACLR,UAAU;IACVE,SAAS;IACTsD,sBAAsB;IACtBS,oBAAoB;IACpBd;EACF,CAAC;AACH,CAAC;AAACiB,OAAA,CAAAzE,eAAA,GAAAA,eAAA","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_config","_utils","_ariaAiAvatar","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","useRef","trailRefs","isMountedRef","travelRunRef","isCurrentTravel","run","current","animateDotsAlongPath","start","end","options","lead","skipShrink","AvatarState","SMALL","forEach","d","getAnimations","animation","cancel","trailStyles","map","i","ratio","ANIMATION_CONFIG","TRAIL_COUNT","opacity","TRAIL_FADE","String","scale","TRAIL_MIN_SCALE","leadStartColor","DOT_COLOR","background","animate","duration","TIMING","DOT_FADE_DURATION","easing","fill","points","samplePathByLength","buildPathControlPoints","pathFrames","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","useEffect","exports"],"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,22 +1,95 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
- exports.setOffsetRotate = exports.setOffsetDistance = exports.setOffsetAnchor = exports.setMotionPath = exports.buildPathD = void 0;
4
+ exports.setOffsetRotate = exports.setOffsetDistance = exports.setOffsetAnchor = exports.setMotionPath = exports.samplePathByLength = exports.buildPathD = exports.buildPathControlPoints = void 0;
5
5
  var _config = require("../config");
6
- const buildPathD = (start, end) => {
6
+ const buildPathControlPoints = (start, end) => {
7
7
  const dx = end.x - start.x;
8
8
  const dy = end.y - start.y;
9
9
  const len = Math.max(1, Math.hypot(dx, dy));
10
10
  const nx = -dy / len;
11
11
  const ny = dx / len;
12
12
  const sway = _config.ANIMATION_CONFIG.SWAY_AMOUNT * (0.85 + Math.random() * 0.3);
13
- const c1x = start.x + dx * _config.ANIMATION_CONFIG.CONTROL_POINT_1 + nx * sway;
14
- const c1y = start.y + dy * _config.ANIMATION_CONFIG.CONTROL_POINT_1 + ny * sway;
15
- const c2x = start.x + dx * _config.ANIMATION_CONFIG.CONTROL_POINT_2 - nx * (sway * 0.65);
16
- const c2y = start.y + dy * _config.ANIMATION_CONFIG.CONTROL_POINT_2 - ny * (sway * 0.65);
17
- return `M ${start.x},${start.y} C ${c1x},${c1y} ${c2x},${c2y} ${end.x},${end.y}`;
13
+ return {
14
+ start,
15
+ c1: {
16
+ x: start.x + dx * _config.ANIMATION_CONFIG.CONTROL_POINT_1 + nx * sway,
17
+ y: start.y + dy * _config.ANIMATION_CONFIG.CONTROL_POINT_1 + ny * sway
18
+ },
19
+ c2: {
20
+ x: start.x + dx * _config.ANIMATION_CONFIG.CONTROL_POINT_2 - nx * (sway * 0.65),
21
+ y: start.y + dy * _config.ANIMATION_CONFIG.CONTROL_POINT_2 - ny * (sway * 0.65)
22
+ },
23
+ end
24
+ };
25
+ };
26
+ exports.buildPathControlPoints = buildPathControlPoints;
27
+ const buildPathD = (start, end) => {
28
+ const {
29
+ c1,
30
+ c2
31
+ } = buildPathControlPoints(start, end);
32
+ return `M ${start.x},${start.y} C ${c1.x},${c1.y} ${c2.x},${c2.y} ${end.x},${end.y}`;
18
33
  };
19
34
  exports.buildPathD = buildPathD;
35
+ const pointOnCubic = ({
36
+ start,
37
+ c1,
38
+ c2,
39
+ end
40
+ }, t) => {
41
+ const u = 1 - t;
42
+ const a = u * u * u;
43
+ const b = 3 * u * u * t;
44
+ const c = 3 * u * t * t;
45
+ const d = t * t * t;
46
+ return {
47
+ x: a * start.x + b * c1.x + c * c2.x + d * end.x,
48
+ y: a * start.y + b * c1.y + c * c2.y + d * end.y
49
+ };
50
+ };
51
+
52
+ /**
53
+ * Points evenly spaced by arc length, so a linear keyframe interpolation
54
+ * between them moves like `offset-distance` does along the same path.
55
+ */
56
+ const samplePathByLength = (path, count) => {
57
+ const STEPS = 200;
58
+ const lut = [];
59
+ let length = 0;
60
+ let prev = pointOnCubic(path, 0);
61
+ lut.push({
62
+ point: prev,
63
+ length: 0
64
+ });
65
+ for (let i = 1; i <= STEPS; i++) {
66
+ const point = pointOnCubic(path, i / STEPS);
67
+ length += Math.hypot(point.x - prev.x, point.y - prev.y);
68
+ lut.push({
69
+ point,
70
+ length
71
+ });
72
+ prev = point;
73
+ }
74
+ const points = [];
75
+ let j = 1;
76
+ for (let i = 0; i < count; i++) {
77
+ const target = length * i / (count - 1);
78
+ while (j < lut.length - 1 && lut[j].length < target) {
79
+ j++;
80
+ }
81
+ const from = lut[j - 1];
82
+ const to = lut[j];
83
+ const span = to.length - from.length || 1;
84
+ const k = Math.min(1, Math.max(0, (target - from.length) / span));
85
+ points.push({
86
+ x: from.point.x + (to.point.x - from.point.x) * k,
87
+ y: from.point.y + (to.point.y - from.point.y) * k
88
+ });
89
+ }
90
+ return points;
91
+ };
92
+ exports.samplePathByLength = samplePathByLength;
20
93
  const setMotionPath = (el, pathD) => {
21
94
  el.style.offsetPath = `path("${pathD}")`;
22
95
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_config","require","buildPathD","start","end","dx","x","dy","y","len","Math","max","hypot","nx","ny","sway","ANIMATION_CONFIG","SWAY_AMOUNT","random","c1x","CONTROL_POINT_1","c1y","c2x","CONTROL_POINT_2","c2y","exports","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,IAAAA,OAAA,GAAAC,OAAA;AAEO,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,GAAGC,wBAAgB,CAACC,WAAW,IAAI,IAAI,GAAGP,IAAI,CAACQ,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;EAExE,MAAMC,GAAG,GAAGhB,KAAK,CAACG,CAAC,GAAGD,EAAE,GAAGW,wBAAgB,CAACI,eAAe,GAAGP,EAAE,GAAGE,IAAI;EACvE,MAAMM,GAAG,GAAGlB,KAAK,CAACK,CAAC,GAAGD,EAAE,GAAGS,wBAAgB,CAACI,eAAe,GAAGN,EAAE,GAAGC,IAAI;EACvE,MAAMO,GAAG,GACPnB,KAAK,CAACG,CAAC,GAAGD,EAAE,GAAGW,wBAAgB,CAACO,eAAe,GAAGV,EAAE,IAAIE,IAAI,GAAG,IAAI,CAAC;EACtE,MAAMS,GAAG,GACPrB,KAAK,CAACK,CAAC,GAAGD,EAAE,GAAGS,wBAAgB,CAACO,eAAe,GAAGT,EAAE,IAAIC,IAAI,GAAG,IAAI,CAAC;EAEtE,OAAO,KAAKZ,KAAK,CAACG,CAAC,IAAIH,KAAK,CAACK,CAAC,MAAMW,GAAG,IAAIE,GAAG,IAAIC,GAAG,IAAIE,GAAG,IAAIpB,GAAG,CAACE,CAAC,IAAIF,GAAG,CAACI,CAAC,EAAE;AAClF,CAAC;AAACiB,OAAA,CAAAvB,UAAA,GAAAA,UAAA;AAEK,MAAMwB,aAAa,GAAGA,CAACC,EAAe,EAAEC,KAAa,KAAW;EACrED,EAAE,CAACE,KAAK,CAACC,UAAU,GAAG,SAASF,KAAK,IAAI;AAC1C,CAAC;AAACH,OAAA,CAAAC,aAAA,GAAAA,aAAA;AAEK,MAAMK,iBAAiB,GAAGA,CAACJ,EAAe,EAAEK,KAAa,KAAW;EACzEL,EAAE,CAACE,KAAK,CAACI,cAAc,GAAGD,KAAK;AACjC,CAAC;AAACP,OAAA,CAAAM,iBAAA,GAAAA,iBAAA;AAEK,MAAMG,eAAe,GAAGA,CAACP,EAAe,EAAEK,KAAa,KAAW;EACvEL,EAAE,CAACE,KAAK,CAACM,YAAY,GAAGH,KAAK;AAC/B,CAAC;AAACP,OAAA,CAAAS,eAAA,GAAAA,eAAA;AAEK,MAAME,eAAe,GAAGA,CAACT,EAAe,EAAEK,KAAa,KAAW;EACtEL,EAAE,CAACE,KAAK,CAASQ,YAAY,GAAGL,KAAK;AACxC,CAAC;AAACP,OAAA,CAAAW,eAAA,GAAAA,eAAA","ignoreList":[]}
1
+ {"version":3,"names":["_config","require","buildPathControlPoints","start","end","dx","x","dy","y","len","Math","max","hypot","nx","ny","sway","ANIMATION_CONFIG","SWAY_AMOUNT","random","c1","CONTROL_POINT_1","c2","CONTROL_POINT_2","exports","buildPathD","pointOnCubic","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,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';
@@ -32,11 +35,39 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
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, mode);\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":"AAAA,OAAOA,KAAK,IACVC,UAAU,EAEVC,SAAS,EACTC,mBAAmB,EACnBC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,OAAOC,CAAC,MAAM,oBAAoB;AAElC,SAASC,UAAU,QAAQ,UAAU;AACrC,SAASC,cAAc,EAAEC,WAAW,EAAEC,eAAe,QAAQ,SAAS;AACtE,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,WAAW,EAAEC,WAAW,QAAQ,qBAAqB;AAE9D,OAAO,MAAMC,iBAAiB,gBAAGb,UAAU,CACzC,CAAAc,IAAA,EAAkCC,GAAyB,KAAK;EAAA,IAA7DC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAAEC,OAAO,GAAAH,IAAA,CAAPG,OAAO;IAAEC,YAAY,GAAAJ,IAAA,CAAZI,YAAY;EAC5B,MAAMC,UAAU,GAAGhB,MAAM,CAAwB,IAAI,CAAC;EACtD,MAAMiB,aAAa,GAAGjB,MAAM,CAAuC,IAAI,CAAC;EAExE,MAAAkB,SAAA,GAAgCjB,QAAQ,CAAC,KAAK,CAAC;IAAxCkB,QAAQ,GAAAD,SAAA;IAAEE,WAAW,GAAAF,SAAA;EAE5B,MAAAG,UAAA,GAA4BpB,QAAQ,CAAC,KAAK,CAAC;IAApCqB,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EAExB,MAAAG,eAAA,GAAsDpB,cAAc,CAAC;MACnES,IAAI;MACJC,OAAO;MACPC;IACF,CAAC,CAAC;IAJMU,UAAU,GAAAD,eAAA,CAAVC,UAAU;IAAEC,YAAY,GAAAF,eAAA,CAAZE,YAAY;IAAEC,eAAe,GAAAH,eAAA,CAAfG,eAAe;EAMjD,MAAAC,YAAA,GAAsBvB,WAAW,CAC/BW,UAAU,EACVb,UAAU,CAAC0B,KAAK,EAChB1B,UAAU,CAAC2B,MACb,CAAC;IAJOC,SAAS,GAAAH,YAAA,CAATG,SAAS;EAMjB,MAAAC,gBAAA,GAMI1B,eAAe,CAACyB,SAAS,EAAEJ,eAAe,EAAEF,UAAU,CAACQ,QAAQ,EAAEpB,IAAI,CAAC;IALxEqB,UAAU,GAAAF,gBAAA,CAAVE,UAAU;IACVC,SAAS,GAAAH,gBAAA,CAATG,SAAS;IACTC,QAAQ,GAAAJ,gBAAA,CAARI,QAAQ;IACRC,sBAAsB,GAAAL,gBAAA,CAAtBK,sBAAsB;IACtBC,oBAAoB,GAAAN,gBAAA,CAApBM,oBAAoB;EAGtB,MAAMC,gBAAgB,GAAG,MAAAA,CACvBC,CAAS,EACTC,CAAS,EACTC,OAAqB,KAClB;IACH,MAAMC,GAAG,GAAG;MAAEH,CAAC;MAAEC;IAAE,CAAC;IACpB,MAAMJ,sBAAsB,CAACM,GAAG,EAAED,OAAO,CAAC;EAC5C,CAAC;EAED,MAAME,cAAc,GAAG,MAAAA,CACrBJ,CAAS,EACTC,CAAS,EACTC,OAAqB,KAClB;IACH,MAAMC,GAAG,GAAG;MAAEH,CAAC;MAAEC;IAAE,CAAC;IACpB,MAAMH,oBAAoB,CAACK,GAAG,EAAED,OAAO,CAAC;EAC1C,CAAC;EAED,MAAMG,WAAW,GAAGA,CAACC,OAAe,EAAEC,OAAe,KAAK;IACxD,IAAI5B,QAAQ,EAAE;MACZ;IACF;IAEAM,UAAU,CAACuB,MAAM,CAACF,OAAO,EAAEC,OAAO,CAAC;EACrC,CAAC;EAED,MAAME,YAAY,GAAGA,CAACC,MAAc,EAAEC,MAAc,KAAK;IACvD,IAAI;MACF/B,WAAW,CAAC,IAAI,CAAC;MACjBK,UAAU,CAACuB,MAAM,CAACE,MAAM,EAAEC,MAAM,CAAC;MAEjC,IAAIlC,aAAa,CAACmC,OAAO,EAAE;QACzBC,YAAY,CAACpC,aAAa,CAACmC,OAAO,CAAC;MACrC;MAEAnC,aAAa,CAACmC,OAAO,GAAGE,UAAU,CAAC,MAAM;QACvClC,WAAW,CAAC,KAAK,CAAC;MACpB,CAAC,EAAE,GAAG,CAAC;IACT,CAAC,CAAC,OAAOmC,GAAG,EAAE;MACZC,OAAO,CAACC,KAAK,CAAC,gCAAgC,EAAEF,GAAG,CAAC;IACtD;EACF,CAAC;EAEDzD,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX,IAAImB,aAAa,CAACmC,OAAO,EAAE;QACzBC,YAAY,CAACpC,aAAa,CAACmC,OAAO,CAAC;MACrC;IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMM,UAAU,GAAG,SAAAA,CAAAC,KAAA,EAAuD;IAAA,IAAAC,KAAA,GAAAD,KAAA,cAAP,CAAC,CAAC,GAAAA,KAAA;MAAAE,cAAA,GAAAD,KAAA,CAA/CE,QAAQ;MAARA,QAAQ,GAAAD,cAAA,cAAG,KAAK,GAAAA,cAAA;IACpClC,eAAe,CAAC,IAAI,CAAC;IAErB,IAAImC,QAAQ,EAAE;MACZ1B,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAM2B,UAAU,GAAGA,CAAA,KAAM;IACvBpC,eAAe,CAAC,KAAK,CAAC;EACxB,CAAC;EAED5B,mBAAmB,CAACa,GAAG,EAAE,OAAO;IAC9BoD,OAAO,EAAE;MACPC,MAAM,EAAEA,CAAA,KAAM;QACZ,IAAIxC,UAAU,CAACyC,QAAQ,CAAC,CAAC,KAAKzD,WAAW,CAAC0D,KAAK,EAAE;UAC/C,OAAO1C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC2D,IAAI,CAAC;QAC9C;QACA,OAAO3C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC0D,KAAK,CAAC;MAC/C,CAAC;MACDE,WAAW,EAAEA,CAAA,KAAM;QACjB,IAAI5C,UAAU,CAACyC,QAAQ,CAAC,CAAC,KAAKzD,WAAW,CAAC0D,KAAK,EAAE;UAC/C,OAAO1C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC6D,YAAY,CAAC;QACtD;QACA,OAAO7C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC0D,KAAK,CAAC;MAC/C,CAAC;MACDI,KAAK,EAAEA,CAAA,KAAMC,OAAO,CAACC,OAAO,CAAC,CAAC;MAC9BC,IAAI,EAAE,MAAAA,CAAA,KAAY;QAChB,IAAIjD,UAAU,CAACyC,QAAQ,CAAC,CAAC,KAAKzD,WAAW,CAAC6D,YAAY,EAAE;UACtD,MAAM7C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC0D,KAAK,CAAC;QAC9C;QACA,OAAO1C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC2D,IAAI,CAAC;MAC9C,CAAC;MACDO,IAAI,EAAEA,CAAA,KAAMlD,UAAU,CAACmD,SAAS,CAACpE,WAAW,CAACqE,UAAU,CAAC;MACxDC,OAAO,EAAEA,CAAA,KAAM;QACb,IAAIrD,UAAU,CAACyC,QAAQ,CAAC,CAAC,KAAKzD,WAAW,CAACsE,QAAQ,EAAE;UAClD,OAAOtD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC2D,IAAI,CAAC;QAC9C;QACA,OAAO3C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACsE,QAAQ,CAAC;MAClD,CAAC;MACDC,SAAS,EAAEA,CAAA,KAAM;QACf,IAAIvD,UAAU,CAACyC,QAAQ,CAAC,CAAC,KAAKzD,WAAW,CAACwE,UAAU,EAAE;UACpD,OAAOxD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC2D,IAAI,CAAC;QAC9C;QACA,OAAO3C,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACwE,UAAU,CAAC;MACpD,CAAC;MACDC,SAAS,EAAEA,CAAA,KAAMzD,UAAU,CAACmD,SAAS,CAACpE,WAAW,CAAC2E,UAAU,CAAC;MAC7DC,OAAO,EAAEA,CAAA,KAAM3D,UAAU,CAACmD,SAAS,CAACpE,WAAW,CAAC6E,aAAa;IAC/D,CAAC;IACD3D,YAAY;IACZ4D,OAAO,EAAEtE,UAAU,CAACoC,OAAO;IAC3Bc,QAAQ,EAAEzC,UAAU,CAACyC,QAAQ;IAE7BrB,WAAW;IACXI,YAAY;IACZV,gBAAgB;IAChBK,cAAc;IAEd2C,gBAAgB,EAAGC,KAAa,IAAK;MACnC/D,UAAU,CAACgE,cAAc,CAACD,KAAK,CAAC;IAClC,CAAC;IAEDE,sBAAsB,EAAEA,CAAA,KAAM;MAC5B,IAAIpE,MAAM,EAAE;QACVC,SAAS,CAAC,KAAK,CAAC;QAChBE,UAAU,CAACkE,MAAM,CAAC,CAAC;MACrB,CAAC,MAAM;QACLpE,SAAS,CAAC,IAAI,CAAC;QACfE,UAAU,CAACH,MAAM,CAAC,CAAC;MACrB;IACF,CAAC;IAEDsE,IAAI,EAAElC,UAAU;IAChBmC,IAAI,EAAE9B;EACR,CAAC,CAAC,CAAC;EAEH,oBACEnE,KAAA,CAAAkG,aAAA;IAAKC,SAAS,EAAE7F,CAAC,CAAC8F;EAAO,gBACvBpG,KAAA,CAAAkG,aAAA,CAACvF,QAAQ;IAAC2B,UAAU,EAAEA,UAAW;IAACC,SAAS,EAAEA;EAAU,CAAE,CAAC,eAE1DvC,KAAA,CAAAkG,aAAA;IACElF,GAAG,EAAEI,UAAW;IAChB+E,SAAS,EAAE7F,CAAC,CAAC+F,KAAM;IACnBC,KAAK,EAAE;MACLC,OAAO,EAAEzE,YAAY,GAAG,CAAC,GAAG;IAC9B;EAAE,gBAEF9B,KAAA,CAAAkG,aAAA;IAAKI,KAAK,EAAE;MAAEE,KAAK,EAAEjG,UAAU,CAAC0B,KAAK;MAAEwE,MAAM,EAAElG,UAAU,CAAC2B;IAAO;EAAE,gBACjElC,KAAA,CAAAkG,aAAA,CAACrE,UAAU,CAACA,UAAU,MAAE,CACrB,CACF,CACF,CAAC;AAEV,CACF,CAAC","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":"AAAA,OAAOA,KAAK,IACVC,UAAU,EAEVC,SAAS,EACTC,mBAAmB,EACnBC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,OAAOC,CAAC,MAAM,oBAAoB;AAElC,SAASC,UAAU,EAAEC,MAAM,QAAQ,UAAU;;AAE7C;AACA,MAAMC,sBAAsB,GAAG,EAAE;AACjC,SAASC,cAAc,EAAEC,WAAW,EAAEC,eAAe,QAAQ,SAAS;AACtE,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,WAAW,EAAEC,WAAW,QAAQ,qBAAqB;AAE9D,OAAO,MAAMC,iBAAiB,gBAAGf,UAAU,CACzC,CAAAgB,IAAA,EAAkCC,GAAyB,KAAK;EAAA,IAA7DC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAAEC,OAAO,GAAAH,IAAA,CAAPG,OAAO;IAAEC,YAAY,GAAAJ,IAAA,CAAZI,YAAY;EAC5B,MAAMC,UAAU,GAAGlB,MAAM,CAAwB,IAAI,CAAC;EACtD,MAAMmB,aAAa,GAAGnB,MAAM,CAAuC,IAAI,CAAC;EAExE,MAAAoB,SAAA,GAAgCnB,QAAQ,CAAC,KAAK,CAAC;IAAxCoB,QAAQ,GAAAD,SAAA;IAAEE,WAAW,GAAAF,SAAA;EAE5B,MAAAG,UAAA,GAA4BtB,QAAQ,CAAC,KAAK,CAAC;IAApCuB,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EAExB,MAAAG,eAAA,GAAsDpB,cAAc,CAAC;MACnES,IAAI;MACJC,OAAO;MACPC;IACF,CAAC,CAAC;IAJMU,UAAU,GAAAD,eAAA,CAAVC,UAAU;IAAEC,YAAY,GAAAF,eAAA,CAAZE,YAAY;IAAEC,eAAe,GAAAH,eAAA,CAAfG,eAAe;EAMjD,MAAAC,YAAA,GAAsBvB,WAAW,CAC/BW,UAAU,EACVf,UAAU,CAAC4B,KAAK,EAChB5B,UAAU,CAAC6B,MACb,CAAC;IAJOC,SAAS,GAAAH,YAAA,CAATG,SAAS;EAMjB,MAAAC,gBAAA,GAMI1B,eAAe,CAACyB,SAAS,EAAEJ,eAAe,EAAEF,UAAU,CAACQ,QAAQ,EAAEpB,IAAI,CAAC;IALxEqB,UAAU,GAAAF,gBAAA,CAAVE,UAAU;IACVC,SAAS,GAAAH,gBAAA,CAATG,SAAS;IACTC,QAAQ,GAAAJ,gBAAA,CAARI,QAAQ;IACRC,sBAAsB,GAAAL,gBAAA,CAAtBK,sBAAsB;IACtBC,oBAAoB,GAAAN,gBAAA,CAApBM,oBAAoB;EAGtB,MAAMC,SAAS,GAAGzC,MAAM,CAAmB,IAAI,CAAC;EAEhD,MAAM0C,YAAY,GAAGA,CAAA,KAAM;IAAA,IAAAC,kBAAA;IACzB,CAAAA,kBAAA,GAAAF,SAAS,CAACG,OAAO,aAAjBD,kBAAA,CAAmBE,MAAM,CAAC,CAAC;IAC3BJ,SAAS,CAACG,OAAO,GAAG,IAAI;EAC1B,CAAC;;EAED;EACA;EACA,MAAME,cAAc,GAAGA,CAAA,KAAM;IAC3BJ,YAAY,CAAC,CAAC;IACd,MAAMK,OAAO,GAAG7B,UAAU,CAAC0B,OAAO;IAClC,IAAI,CAAAG,OAAO,oBAAPA,OAAO,CAAEC,KAAK,CAACC,OAAO,MAAK,GAAG,EAAE;MAClC;IACF;IACAR,SAAS,CAACG,OAAO,GAAGG,OAAO,CAACG,OAAO,CAAC,CAAC;MAAED,OAAO,EAAE;IAAE,CAAC,EAAE;MAAEA,OAAO,EAAE;IAAE,CAAC,CAAC,EAAE;MACpEE,KAAK,EAAE/C,MAAM,CAACgD,eAAe;MAC7BC,QAAQ,EAAEhD,sBAAsB;MAChCiD,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC;EAED,MAAMC,gBAAgB,GAAG,MAAAA,CACvBC,CAAS,EACTC,CAAS,EACTC,OAAqB,KAClB;IACH,MAAMC,GAAG,GAAG;MAAEH,CAAC;MAAEC;IAAE,CAAC;IACpB,IAAI,OAAOD,CAAC,KAAK,QAAQ,IAAI,OAAOC,CAAC,KAAK,QAAQ,EAAE;MAClDX,cAAc,CAAC,CAAC;IAClB;IACA,MAAMP,sBAAsB,CAACoB,GAAG,EAAED,OAAO,CAAC;EAC5C,CAAC;EAED,MAAME,cAAc,GAAG,MAAAA,CACrBJ,CAAS,EACTC,CAAS,EACTC,OAAqB,KAClB;IACH,MAAMC,GAAG,GAAG;MAAEH,CAAC;MAAEC;IAAE,CAAC;IACpBf,YAAY,CAAC,CAAC;IACd,MAAMF,oBAAoB,CAACmB,GAAG,EAAED,OAAO,CAAC;EAC1C,CAAC;EAED,MAAMG,WAAW,GAAGA,CAACC,OAAe,EAAEC,OAAe,KAAK;IACxD,IAAI1C,QAAQ,EAAE;MACZ;IACF;IAEAM,UAAU,CAACqC,MAAM,CAACF,OAAO,EAAEC,OAAO,CAAC;EACrC,CAAC;EAED,MAAME,YAAY,GAAGA,CAACC,MAAc,EAAEC,MAAc,KAAK;IACvD,IAAI;MACF7C,WAAW,CAAC,IAAI,CAAC;MACjBK,UAAU,CAACqC,MAAM,CAACE,MAAM,EAAEC,MAAM,CAAC;MAEjC,IAAIhD,aAAa,CAACyB,OAAO,EAAE;QACzBwB,YAAY,CAACjD,aAAa,CAACyB,OAAO,CAAC;MACrC;MAEAzB,aAAa,CAACyB,OAAO,GAAGyB,UAAU,CAAC,MAAM;QACvC/C,WAAW,CAAC,KAAK,CAAC;MACpB,CAAC,EAAE,GAAG,CAAC;IACT,CAAC,CAAC,OAAOgD,GAAG,EAAE;MACZC,OAAO,CAACC,KAAK,CAAC,gCAAgC,EAAEF,GAAG,CAAC;IACtD;EACF,CAAC;EAEDxE,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX,IAAIqB,aAAa,CAACyB,OAAO,EAAE;QACzBwB,YAAY,CAACjD,aAAa,CAACyB,OAAO,CAAC;MACrC;IACF,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM6B,UAAU,GAAG,SAAAA,CAAAC,KAAA,EAAuD;IAAA,IAAAC,KAAA,GAAAD,KAAA,cAAP,CAAC,CAAC,GAAAA,KAAA;MAAAE,cAAA,GAAAD,KAAA,CAA/CE,QAAQ;MAARA,QAAQ,GAAAD,cAAA,cAAG,KAAK,GAAAA,cAAA;IACpClC,YAAY,CAAC,CAAC;IACdb,eAAe,CAAC,IAAI,CAAC;IAErB,IAAIgD,QAAQ,EAAE;MACZvC,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMwC,UAAU,GAAGA,CAAA,KAAM;IACvBjD,eAAe,CAAC,KAAK,CAAC;EACxB,CAAC;EAED9B,mBAAmB,CAACe,GAAG,EAAE,OAAO;IAC9BiE,OAAO,EAAE;MACPC,MAAM,EAAEA,CAAA,KAAM;QACZ,IAAIrD,UAAU,CAACsD,QAAQ,CAAC,CAAC,KAAKtE,WAAW,CAACuE,KAAK,EAAE;UAC/C,OAAOvD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACwE,IAAI,CAAC;QAC9C;QACA,OAAOxD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACuE,KAAK,CAAC;MAC/C,CAAC;MACDE,WAAW,EAAEA,CAAA,KAAM;QACjB,IAAIzD,UAAU,CAACsD,QAAQ,CAAC,CAAC,KAAKtE,WAAW,CAACuE,KAAK,EAAE;UAC/C,OAAOvD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAAC0E,YAAY,CAAC;QACtD;QACA,OAAO1D,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACuE,KAAK,CAAC;MAC/C,CAAC;MACDI,KAAK,EAAEA,CAAA,KAAMC,OAAO,CAACC,OAAO,CAAC,CAAC;MAC9BC,IAAI,EAAE,MAAAA,CAAA,KAAY;QAChB,IAAI9D,UAAU,CAACsD,QAAQ,CAAC,CAAC,KAAKtE,WAAW,CAAC0E,YAAY,EAAE;UACtD,MAAM1D,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACuE,KAAK,CAAC;QAC9C;QACA,OAAOvD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACwE,IAAI,CAAC;MAC9C,CAAC;MACDO,IAAI,EAAEA,CAAA,KAAM/D,UAAU,CAACgE,SAAS,CAACjF,WAAW,CAACkF,UAAU,CAAC;MACxDC,OAAO,EAAEA,CAAA,KAAM;QACb,IAAIlE,UAAU,CAACsD,QAAQ,CAAC,CAAC,KAAKtE,WAAW,CAACmF,QAAQ,EAAE;UAClD,OAAOnE,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACwE,IAAI,CAAC;QAC9C;QACA,OAAOxD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACmF,QAAQ,CAAC;MAClD,CAAC;MACDC,SAAS,EAAEA,CAAA,KAAM;QACf,IAAIpE,UAAU,CAACsD,QAAQ,CAAC,CAAC,KAAKtE,WAAW,CAACqF,UAAU,EAAE;UACpD,OAAOrE,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACwE,IAAI,CAAC;QAC9C;QACA,OAAOxD,UAAU,CAACQ,QAAQ,CAACxB,WAAW,CAACqF,UAAU,CAAC;MACpD,CAAC;MACDC,SAAS,EAAEA,CAAA,KAAMtE,UAAU,CAACgE,SAAS,CAACjF,WAAW,CAACwF,UAAU,CAAC;MAC7DC,OAAO,EAAEA,CAAA,KAAMxE,UAAU,CAACgE,SAAS,CAACjF,WAAW,CAAC0F,aAAa;IAC/D,CAAC;IACDxE,YAAY;IACZmB,OAAO,EAAE7B,UAAU,CAAC0B,OAAO;IAC3BqC,QAAQ,EAAEtD,UAAU,CAACsD,QAAQ;IAE7BpB,WAAW;IACXI,YAAY;IACZV,gBAAgB;IAChBK,cAAc;IAEdyC,gBAAgB,EAAGC,KAAa,IAAK;MACnC3E,UAAU,CAAC4E,cAAc,CAACD,KAAK,CAAC;IAClC,CAAC;IAEDE,sBAAsB,EAAEA,CAAA,KAAM;MAC5B,IAAIhF,MAAM,EAAE;QACVC,SAAS,CAAC,KAAK,CAAC;QAChBE,UAAU,CAAC8E,MAAM,CAAC,CAAC;MACrB,CAAC,MAAM;QACLhF,SAAS,CAAC,IAAI,CAAC;QACfE,UAAU,CAACH,MAAM,CAAC,CAAC;MACrB;IACF,CAAC;IAEDkF,IAAI,EAAEjC,UAAU;IAChBkC,IAAI,EAAE7B;EACR,CAAC,CAAC,CAAC;EAEH,oBACElF,KAAA,CAAAgH,aAAA;IAAKC,SAAS,EAAE3G,CAAC,CAAC4G;EAAO,gBACvBlH,KAAA,CAAAgH,aAAA,CAACnG,QAAQ;IAAC2B,UAAU,EAAEA,UAAW;IAACC,SAAS,EAAEA;EAAU,CAAE,CAAC,eAE1DzC,KAAA,CAAAgH,aAAA;IACE9F,GAAG,EAAEI,UAAW;IAChB2F,SAAS,EAAE3G,CAAC,CAAC6G,KAAM;IACnB/D,KAAK,EAAE;MACLC,OAAO,EAAErB,YAAY,GAAG,CAAC,GAAG;IAC9B;EAAE,gBAEFhC,KAAA,CAAAgH,aAAA;IAAK5D,KAAK,EAAE;MAAEgE,KAAK,EAAE7G,UAAU,CAAC4B,KAAK;MAAEkF,MAAM,EAAE9G,UAAU,CAAC6B;IAAO;EAAE,gBACjEpC,KAAA,CAAAgH,aAAA,CAACjF,UAAU,CAACA,UAAU,MAAE,CACrB,CACF,CACF,CAAC;AAEV,CACF,CAAC","ignoreList":[]}
@@ -1,36 +1,78 @@
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
+ 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
+ };
5
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
  });
35
77
  const leadStartColor = mode === 'dark' ? ANIMATION_CONFIG.DOT_COLOR : '#000000';
36
78
  lead.style.opacity = '1';
@@ -44,45 +86,60 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
44
86
  easing: 'ease-out',
45
87
  fill: 'forwards'
46
88
  });
47
- const pathD = buildPathD(start, end);
48
- const prepDot = el => {
49
- if (!el) {
50
- 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;
51
94
  }
52
- setMotionPath(el, pathD);
53
- setOffsetDistance(el, '0%');
54
- setOffsetRotate(el, '0deg');
55
- 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
+ });
56
102
  };
57
- prepDot(lead);
58
- trailRefs.current.forEach(td => td && prepDot(td));
59
- const leadAnim = lead.animate([{
60
- 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
61
107
  }, {
62
- offsetDistance: '100%'
108
+ opacity: 0
63
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(), {
64
120
  duration: TIMING.TRAVEL_DURATION,
65
121
  easing: ANIMATION_CONFIG.EASING,
66
- fill: 'forwards'
122
+ fill: 'both'
67
123
  });
124
+ fadeOut(lead, 1);
68
125
  trailRefs.current.forEach((td, i) => {
69
126
  if (!td) {
70
127
  return;
71
128
  }
72
- td.animate([{
73
- offsetDistance: '0%'
74
- }, {
75
- offsetDistance: '100%'
76
- }], {
129
+ td.animate(pathFrames(trailStyles[i].scale), {
77
130
  duration: TIMING.TRAVEL_DURATION,
78
131
  delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,
79
132
  easing: ANIMATION_CONFIG.EASING,
80
- fill: 'forwards'
133
+ fill: 'both'
81
134
  });
135
+ fadeOut(td, trailStyles[i].opacity);
82
136
  });
83
- await leadAnim.finished;
84
- lead.style.opacity = '0';
85
- 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;
86
143
  };
87
144
  const hideDots = () => {
88
145
  const lead = leadDotRef.current;
@@ -104,15 +161,18 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
104
161
  console.log('[Astro] Invalid position, skipping animation');
105
162
  return;
106
163
  }
164
+ const run = ++travelRunRef.current;
107
165
  const home = {
108
166
  x: 0,
109
167
  y: 0
110
168
  };
111
- await animateDotsAlongPath(currentPosition, home, options);
169
+ if (!(await animateDotsAlongPath(run, currentPosition, home, options))) {
170
+ return;
171
+ }
112
172
  moveToPosition(home);
113
173
  setAvatarHidden(false);
114
174
  await waitForNextFrame();
115
- if (isMountedRef.current) {
175
+ if (isCurrentTravel(run)) {
116
176
  if (options.endState) {
117
177
  await triggerAvatarAnimationState(options.endState);
118
178
  } else {
@@ -128,14 +188,17 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
128
188
  console.log('[Astro] Invalid position, skipping animation');
129
189
  return;
130
190
  }
191
+ const run = ++travelRunRef.current;
131
192
  setAvatarHidden(true);
132
193
  await waitForNextFrame();
194
+ if (!isCurrentTravel(run)) {
195
+ return;
196
+ }
133
197
  const home = {
134
198
  x: 0,
135
199
  y: 0
136
200
  };
137
- await animateDotsAlongPath(home, targetPosition, options);
138
- hideDots();
201
+ await animateDotsAlongPath(run, home, targetPosition, options);
139
202
  };
140
203
  useEffect(() => {
141
204
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["useRef","useEffect","ANIMATION_CONFIG","TIMING","buildPathD","setMotionPath","setOffsetDistance","setOffsetRotate","setOffsetAnchor","AvatarState","useDotAnimation","moveToPosition","setAvatarHidden","triggerAvatarAnimationState","mode","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","leadStartColor","DOT_COLOR","background","animate","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 mode?: 'light' | 'dark',\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 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 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":"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","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 +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,EACzD,OAAO,OAAO,GAAG,MAAM;;;8CAsHJ,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/ai-assistant-avatar",
3
- "version": "0.44.0",
3
+ "version": "0.45.0",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -83,5 +83,5 @@
83
83
  "yoshiFlowLibrary": {
84
84
  "buildEsmWithBabel": true
85
85
  },
86
- "falconPackageHash": "ee4e8d64c4bcf3d3601630411400915769682025c2ad163b34383166"
86
+ "falconPackageHash": "271c6bfc0b51c51ee58ec4367ac1c27fd9320f63ec494d9655d01b11"
87
87
  }