@wix/ai-assistant-avatar 0.43.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,
@@ -38,12 +40,40 @@ const AiAssistantAvatar = exports.AiAssistantAvatar = /*#__PURE__*/(0, _react.fo
38
40
  hideDots,
39
41
  moveFromOffsetWithDots,
40
42
  moveToOffsetWithDots
41
- } = (0, _hooks.useDotAnimation)(setCenter, setAvatarHidden, AriaAvatar.setState);
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);\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":[]}
@@ -12,7 +12,24 @@
12
12
  transition: opacity 80ms linear;
13
13
  transform: translate3d(0, 0, 0);
14
14
 
15
- clip-path: inset(23px 23px 23px 23px); /* cut off the edges to stop hijacking mouse events. maybe we need to reduce canvas size itself instead of this. */
15
+ clip-path: inset(12px); /* cut off the edges to stop hijacking mouse events. maybe we need to reduce canvas size itself instead of this. */
16
+
17
+ [class*='_wrapper_'] [class*='_hitbox_'] {
18
+ transform: scale(0.47);
19
+ }
20
+
21
+ [class*='_wrapper_'] [class*='_hitbox_'] [class*='_head_'][class*='_dark_'][class*='_shrunk_'] {
22
+ background: #557dff;
23
+ }
24
+
25
+ [class*='_wrapper_'] [class*='_hitbox_'] [class*='_head_'][class*='_dark_']:not([class*='_shrunk_']) {
26
+ box-shadow:
27
+ 0 12px 15px #2f5dffb2,
28
+ 0 8px 8px #3ca1ff40,
29
+ 0 0 6px #ffffff60,
30
+ 0 0 6px 2px #ffffff40,
31
+ 0 0 6px #2f5dffb2;
32
+ }
16
33
 
17
34
  @starting-style {
18
35
  opacity: 0;
@@ -6,37 +6,80 @@ 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 useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimationState) => {
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
+ };
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
  });
78
+ const leadStartColor = mode === 'dark' ? _config.ANIMATION_CONFIG.DOT_COLOR : '#000000';
36
79
  lead.style.opacity = '1';
37
- lead.style.background = '#000000';
80
+ lead.style.background = leadStartColor;
38
81
  lead.animate([{
39
- background: '#000000'
82
+ background: leadStartColor
40
83
  }, {
41
84
  background: _config.ANIMATION_CONFIG.DOT_COLOR
42
85
  }], {
@@ -44,45 +87,54 @@ const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimation
44
87
  easing: 'ease-out',
45
88
  fill: 'forwards'
46
89
  });
47
- const pathD = (0, _utils.buildPathD)(start, end);
48
- const prepDot = el => {
49
- if (!el) {
50
- return;
51
- }
52
- (0, _utils.setMotionPath)(el, pathD);
53
- (0, _utils.setOffsetDistance)(el, '0%');
54
- (0, _utils.setOffsetRotate)(el, '0deg');
55
- (0, _utils.setOffsetAnchor)(el, '50% 50%');
56
- };
57
- prepDot(lead);
58
- trailRefs.current.forEach(td => td && prepDot(td));
59
- const leadAnim = lead.animate([{
60
- 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
61
102
  }, {
62
- offsetDistance: '100%'
103
+ opacity: 0
63
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(), {
64
115
  duration: _config.TIMING.TRAVEL_DURATION,
65
116
  easing: _config.ANIMATION_CONFIG.EASING,
66
- fill: 'forwards'
117
+ fill: 'both'
67
118
  });
119
+ fadeOut(lead, 1);
68
120
  trailRefs.current.forEach((td, i) => {
69
121
  if (!td) {
70
122
  return;
71
123
  }
72
- td.animate([{
73
- offsetDistance: '0%'
74
- }, {
75
- offsetDistance: '100%'
76
- }], {
124
+ td.animate(pathFrames(trailStyles[i].scale), {
77
125
  duration: _config.TIMING.TRAVEL_DURATION,
78
126
  delay: (i + 1) * _config.ANIMATION_CONFIG.TRAIL_STAGGER,
79
127
  easing: _config.ANIMATION_CONFIG.EASING,
80
- fill: 'forwards'
128
+ fill: 'both'
81
129
  });
130
+ fadeOut(td, trailStyles[i].opacity);
82
131
  });
83
- await leadAnim.finished;
84
- lead.style.opacity = '0';
85
- 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;
86
138
  };
87
139
  const hideDots = () => {
88
140
  const lead = leadDotRef.current;
@@ -101,15 +153,18 @@ const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimation
101
153
  console.log('[Astro] Invalid position, skipping animation');
102
154
  return;
103
155
  }
156
+ const run = ++travelRunRef.current;
104
157
  const home = {
105
158
  x: 0,
106
159
  y: 0
107
160
  };
108
- await animateDotsAlongPath(currentPosition, home, options);
161
+ if (!(await animateDotsAlongPath(run, currentPosition, home, options))) {
162
+ return;
163
+ }
109
164
  moveToPosition(home);
110
165
  setAvatarHidden(false);
111
166
  await waitForNextFrame();
112
- if (isMountedRef.current) {
167
+ if (isCurrentTravel(run)) {
113
168
  if (options.endState) {
114
169
  await triggerAvatarAnimationState(options.endState);
115
170
  } else {
@@ -122,14 +177,17 @@ const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimation
122
177
  console.log('[Astro] Invalid position, skipping animation');
123
178
  return;
124
179
  }
180
+ const run = ++travelRunRef.current;
125
181
  setAvatarHidden(true);
126
182
  await waitForNextFrame();
183
+ if (!isCurrentTravel(run)) {
184
+ return;
185
+ }
127
186
  const home = {
128
187
  x: 0,
129
188
  y: 0
130
189
  };
131
- await animateDotsAlongPath(home, targetPosition, options);
132
- hideDots();
190
+ await animateDotsAlongPath(run, home, targetPosition, options);
133
191
  };
134
192
  (0, _react.useEffect)(() => {
135
193
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_config","_utils","_ariaAiAvatar","useDotAnimation","moveToPosition","setAvatarHidden","triggerAvatarAnimationState","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","background","animate","DOT_COLOR","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) => {\n const leadDotRef = useRef<HTMLDivElement | null>(null);\n const trailRefs = useRef<(HTMLDivElement | null)[]>([]);\n const isMountedRef = useRef(true);\n\n const animateDotsAlongPath = async (\n start: Position,\n end: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (!isMountedRef.current) {\n return;\n }\n\n const lead = leadDotRef.current;\n if (!lead) {\n return;\n }\n\n if (!options.skipShrink) {\n try {\n triggerAvatarAnimationState(AvatarState.SMALL);\n } catch {}\n }\n\n trailRefs.current.forEach((d, i) => {\n if (!d) {\n return;\n }\n const ratio = (i + 1) / ANIMATION_CONFIG.TRAIL_COUNT;\n const scale =\n ANIMATION_CONFIG.TRAIL_MIN_SCALE +\n (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio);\n const opacity =\n ANIMATION_CONFIG.TRAIL_FADE +\n (1 - ANIMATION_CONFIG.TRAIL_FADE) * (1 - ratio);\n d.style.opacity = String(opacity);\n d.style.transform = `scale(${scale})`;\n });\n\n lead.style.opacity = '1';\n lead.style.background = '#000000';\n\n lead.animate(\n [{ background: '#000000' }, { background: ANIMATION_CONFIG.DOT_COLOR }],\n {\n duration: TIMING.DOT_FADE_DURATION,\n easing: 'ease-out',\n fill: 'forwards',\n },\n );\n\n const pathD = buildPathD(start, end);\n\n const prepDot = (el: HTMLElement) => {\n if (!el) {\n return;\n }\n setMotionPath(el, pathD);\n setOffsetDistance(el, '0%');\n setOffsetRotate(el, '0deg');\n setOffsetAnchor(el, '50% 50%');\n };\n\n prepDot(lead);\n\n trailRefs.current.forEach((td) => td && prepDot(td));\n\n const leadAnim = lead.animate(\n [{ offsetDistance: '0%' }, { offsetDistance: '100%' }],\n {\n duration: TIMING.TRAVEL_DURATION,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'forwards',\n },\n );\n\n trailRefs.current.forEach((td, i) => {\n if (!td) {\n return;\n }\n td.animate([{ offsetDistance: '0%' }, { offsetDistance: '100%' }], {\n duration: TIMING.TRAVEL_DURATION,\n delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'forwards',\n });\n });\n\n await leadAnim.finished;\n\n lead.style.opacity = '0';\n trailRefs.current.forEach((td) => td && (td.style.opacity = '0'));\n };\n\n const hideDots = () => {\n const lead = leadDotRef.current;\n if (lead) {\n lead.style.opacity = '0';\n }\n trailRefs.current.forEach((td) => {\n if (td) {\n td.style.opacity = '0';\n }\n });\n };\n\n const waitForNextFrame = () =>\n new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const moveFromOffsetWithDots = async (\n currentPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof currentPosition.x !== 'number' ||\n typeof currentPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(currentPosition, home, options);\n\n moveToPosition(home);\n setAvatarHidden(false);\n\n await waitForNextFrame();\n\n if (isMountedRef.current) {\n if (options.endState) {\n await triggerAvatarAnimationState(options.endState);\n } else {\n await triggerAvatarAnimationState(AvatarState.IDLE);\n }\n }\n };\n\n const moveToOffsetWithDots = async (\n targetPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof targetPosition.x !== 'number' ||\n typeof targetPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n setAvatarHidden(true);\n await waitForNextFrame();\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(home, targetPosition, options);\n\n hideDots();\n };\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return {\n leadDotRef,\n trailRefs,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n hideDots,\n };\n};\n"],"mappings":"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","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":";;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AAIO,MAAMC,sBAAsB,GAAGA,CACpCC,KAAe,EACfC,GAAa,KACC;EACd,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,OAAO;IACLf,KAAK;IACLgB,EAAE,EAAE;MACFb,CAAC,EAAEH,KAAK,CAACG,CAAC,GAAGD,EAAE,GAAGW,wBAAgB,CAACI,eAAe,GAAGP,EAAE,GAAGE,IAAI;MAC9DP,CAAC,EAAEL,KAAK,CAACK,CAAC,GAAGD,EAAE,GAAGS,wBAAgB,CAACI,eAAe,GAAGN,EAAE,GAAGC;IAC5D,CAAC;IACDM,EAAE,EAAE;MACFf,CAAC,EAAEH,KAAK,CAACG,CAAC,GAAGD,EAAE,GAAGW,wBAAgB,CAACM,eAAe,GAAGT,EAAE,IAAIE,IAAI,GAAG,IAAI,CAAC;MACvEP,CAAC,EAAEL,KAAK,CAACK,CAAC,GAAGD,EAAE,GAAGS,wBAAgB,CAACM,eAAe,GAAGR,EAAE,IAAIC,IAAI,GAAG,IAAI;IACxE,CAAC;IACDX;EACF,CAAC;AACH,CAAC;AAACmB,OAAA,CAAArB,sBAAA,GAAAA,sBAAA;AAEK,MAAMsB,UAAU,GAAGA,CAACrB,KAAe,EAAEC,GAAa,KAAa;EACpE,MAAM;IAAEe,EAAE;IAAEE;EAAG,CAAC,GAAGnB,sBAAsB,CAACC,KAAK,EAAEC,GAAG,CAAC;EACrD,OAAO,KAAKD,KAAK,CAACG,CAAC,IAAIH,KAAK,CAACK,CAAC,MAAMW,EAAE,CAACb,CAAC,IAAIa,EAAE,CAACX,CAAC,IAAIa,EAAE,CAACf,CAAC,IAAIe,EAAE,CAACb,CAAC,IAAIJ,GAAG,CAACE,CAAC,IAAIF,GAAG,CAACI,CAAC,EAAE;AACtF,CAAC;AAACe,OAAA,CAAAC,UAAA,GAAAA,UAAA;AAEF,MAAMC,YAAY,GAAGA,CACnB;EAAEtB,KAAK;EAAEgB,EAAE;EAAEE,EAAE;EAAEjB;AAAe,CAAC,EACjCsB,CAAS,KACI;EACb,MAAMC,CAAC,GAAG,CAAC,GAAGD,CAAC;EACf,MAAME,CAAC,GAAGD,CAAC,GAAGA,CAAC,GAAGA,CAAC;EACnB,MAAME,CAAC,GAAG,CAAC,GAAGF,CAAC,GAAGA,CAAC,GAAGD,CAAC;EACvB,MAAMI,CAAC,GAAG,CAAC,GAAGH,CAAC,GAAGD,CAAC,GAAGA,CAAC;EACvB,MAAMK,CAAC,GAAGL,CAAC,GAAGA,CAAC,GAAGA,CAAC;EACnB,OAAO;IACLpB,CAAC,EAAEsB,CAAC,GAAGzB,KAAK,CAACG,CAAC,GAAGuB,CAAC,GAAGV,EAAE,CAACb,CAAC,GAAGwB,CAAC,GAAGT,EAAE,CAACf,CAAC,GAAGyB,CAAC,GAAG3B,GAAG,CAACE,CAAC;IAChDE,CAAC,EAAEoB,CAAC,GAAGzB,KAAK,CAACK,CAAC,GAAGqB,CAAC,GAAGV,EAAE,CAACX,CAAC,GAAGsB,CAAC,GAAGT,EAAE,CAACb,CAAC,GAAGuB,CAAC,GAAG3B,GAAG,CAACI;EACjD,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACO,MAAMwB,kBAAkB,GAAGA,CAChCC,IAAe,EACfC,KAAa,KACE;EACf,MAAMC,KAAK,GAAG,GAAG;EACjB,MAAMC,GAA0C,GAAG,EAAE;EACrD,IAAIC,MAAM,GAAG,CAAC;EACd,IAAIC,IAAI,GAAGb,YAAY,CAACQ,IAAI,EAAE,CAAC,CAAC;EAChCG,GAAG,CAACG,IAAI,CAAC;IAAEC,KAAK,EAAEF,IAAI;IAAED,MAAM,EAAE;EAAE,CAAC,CAAC;EACpC,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIN,KAAK,EAAEM,CAAC,EAAE,EAAE;IAC/B,MAAMD,KAAK,GAAGf,YAAY,CAACQ,IAAI,EAAEQ,CAAC,GAAGN,KAAK,CAAC;IAC3CE,MAAM,IAAI3B,IAAI,CAACE,KAAK,CAAC4B,KAAK,CAAClC,CAAC,GAAGgC,IAAI,CAAChC,CAAC,EAAEkC,KAAK,CAAChC,CAAC,GAAG8B,IAAI,CAAC9B,CAAC,CAAC;IACxD4B,GAAG,CAACG,IAAI,CAAC;MAAEC,KAAK;MAAEH;IAAO,CAAC,CAAC;IAC3BC,IAAI,GAAGE,KAAK;EACd;EAEA,MAAME,MAAkB,GAAG,EAAE;EAC7B,IAAIC,CAAC,GAAG,CAAC;EACT,KAAK,IAAIF,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,KAAK,EAAEO,CAAC,EAAE,EAAE;IAC9B,MAAMG,MAAM,GAAIP,MAAM,GAAGI,CAAC,IAAKP,KAAK,GAAG,CAAC,CAAC;IACzC,OAAOS,CAAC,GAAGP,GAAG,CAACC,MAAM,GAAG,CAAC,IAAID,GAAG,CAACO,CAAC,CAAC,CAACN,MAAM,GAAGO,MAAM,EAAE;MACnDD,CAAC,EAAE;IACL;IACA,MAAME,IAAI,GAAGT,GAAG,CAACO,CAAC,GAAG,CAAC,CAAC;IACvB,MAAMG,EAAE,GAAGV,GAAG,CAACO,CAAC,CAAC;IACjB,MAAMI,IAAI,GAAGD,EAAE,CAACT,MAAM,GAAGQ,IAAI,CAACR,MAAM,IAAI,CAAC;IACzC,MAAMW,CAAC,GAAGtC,IAAI,CAACuC,GAAG,CAAC,CAAC,EAAEvC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE,CAACiC,MAAM,GAAGC,IAAI,CAACR,MAAM,IAAIU,IAAI,CAAC,CAAC;IACjEL,MAAM,CAACH,IAAI,CAAC;MACVjC,CAAC,EAAEuC,IAAI,CAACL,KAAK,CAAClC,CAAC,GAAG,CAACwC,EAAE,CAACN,KAAK,CAAClC,CAAC,GAAGuC,IAAI,CAACL,KAAK,CAAClC,CAAC,IAAI0C,CAAC;MACjDxC,CAAC,EAAEqC,IAAI,CAACL,KAAK,CAAChC,CAAC,GAAG,CAACsC,EAAE,CAACN,KAAK,CAAChC,CAAC,GAAGqC,IAAI,CAACL,KAAK,CAAChC,CAAC,IAAIwC;IAClD,CAAC,CAAC;EACJ;EACA,OAAON,MAAM;AACf,CAAC;AAACnB,OAAA,CAAAS,kBAAA,GAAAA,kBAAA;AAEK,MAAMkB,aAAa,GAAGA,CAACC,EAAe,EAAEC,KAAa,KAAW;EACrED,EAAE,CAACE,KAAK,CAACC,UAAU,GAAG,SAASF,KAAK,IAAI;AAC1C,CAAC;AAAC7B,OAAA,CAAA2B,aAAA,GAAAA,aAAA;AAEK,MAAMK,iBAAiB,GAAGA,CAACJ,EAAe,EAAEK,KAAa,KAAW;EACzEL,EAAE,CAACE,KAAK,CAACI,cAAc,GAAGD,KAAK;AACjC,CAAC;AAACjC,OAAA,CAAAgC,iBAAA,GAAAA,iBAAA;AAEK,MAAMG,eAAe,GAAGA,CAACP,EAAe,EAAEK,KAAa,KAAW;EACvEL,EAAE,CAACE,KAAK,CAACM,YAAY,GAAGH,KAAK;AAC/B,CAAC;AAACjC,OAAA,CAAAmC,eAAA,GAAAA,eAAA;AAEK,MAAME,eAAe,GAAGA,CAACT,EAAe,EAAEK,KAAa,KAAW;EACtEL,EAAE,CAACE,KAAK,CAASQ,YAAY,GAAGL,KAAK;AACxC,CAAC;AAACjC,OAAA,CAAAqC,eAAA,GAAAA,eAAA","ignoreList":[]}