@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.
- package/dist/cjs/Astro/Astro.js +38 -6
- package/dist/cjs/Astro/Astro.js.map +1 -1
- package/dist/cjs/Astro/Astro.module.css +18 -1
- package/dist/cjs/Astro/hooks/useDotAnimation.js +100 -42
- package/dist/cjs/Astro/hooks/useDotAnimation.js.map +1 -1
- package/dist/cjs/Astro/utils/pathGeneration.js +80 -7
- package/dist/cjs/Astro/utils/pathGeneration.js.map +1 -1
- package/dist/esm/Astro/Astro.js +35 -2
- package/dist/esm/Astro/Astro.js.map +1 -1
- package/dist/esm/Astro/Astro.module.css +18 -1
- package/dist/esm/Astro/hooks/useDotAnimation.js +105 -41
- package/dist/esm/Astro/hooks/useDotAnimation.js.map +1 -1
- package/dist/esm/Astro/utils/pathGeneration.js +75 -6
- package/dist/esm/Astro/utils/pathGeneration.js.map +1 -1
- package/dist/types/Astro/Astro.d.ts.map +1 -1
- package/dist/types/Astro/hooks/useDotAnimation.d.ts +1 -1
- package/dist/types/Astro/hooks/useDotAnimation.d.ts.map +1 -1
- package/dist/types/Astro/utils/pathGeneration.d.ts +13 -0
- package/dist/types/Astro/utils/pathGeneration.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/esm/Astro/Astro.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
|
|
2
2
|
import s from './Astro.module.css';
|
|
3
|
-
import { ASTRO_SIZE } from './config';
|
|
3
|
+
import { ASTRO_SIZE, TIMING } from './config';
|
|
4
|
+
|
|
5
|
+
// Matches the `.astro` opacity transition in Astro.module.css.
|
|
6
|
+
const AVATAR_REVEAL_DURATION = 80;
|
|
4
7
|
import { useAvatarSetup, useMovement, useDotAnimation } from './hooks';
|
|
5
8
|
import { DotTrail } from './components/DotTrail';
|
|
6
9
|
import { AvatarEvent, AvatarState } from '@wix/aria-ai-avatar';
|
|
@@ -26,17 +29,45 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
26
29
|
setAvatarHidden = _useAvatarSetup.setAvatarHidden;
|
|
27
30
|
const _useMovement = useMovement(wrapperRef, ASTRO_SIZE.WIDTH, ASTRO_SIZE.HEIGHT),
|
|
28
31
|
setCenter = _useMovement.setCenter;
|
|
29
|
-
const _useDotAnimation = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState),
|
|
32
|
+
const _useDotAnimation = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState, mode),
|
|
30
33
|
leadDotRef = _useDotAnimation.leadDotRef,
|
|
31
34
|
trailRefs = _useDotAnimation.trailRefs,
|
|
32
35
|
hideDots = _useDotAnimation.hideDots,
|
|
33
36
|
moveFromOffsetWithDots = _useDotAnimation.moveFromOffsetWithDots,
|
|
34
37
|
moveToOffsetWithDots = _useDotAnimation.moveToOffsetWithDots;
|
|
38
|
+
const revealRef = useRef(null);
|
|
39
|
+
const cancelReveal = () => {
|
|
40
|
+
var _revealRef$current;
|
|
41
|
+
(_revealRef$current = revealRef.current) == null || _revealRef$current.cancel();
|
|
42
|
+
revealRef.current = null;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// The dots arrive on the compositor, so the avatar is revealed there too
|
|
46
|
+
// rather than when the main thread gets to `setAvatarHidden(false)`.
|
|
47
|
+
const scheduleReveal = () => {
|
|
48
|
+
cancelReveal();
|
|
49
|
+
const wrapper = wrapperRef.current;
|
|
50
|
+
if ((wrapper == null ? void 0 : wrapper.style.opacity) !== '0') {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
revealRef.current = wrapper.animate([{
|
|
54
|
+
opacity: 0
|
|
55
|
+
}, {
|
|
56
|
+
opacity: 1
|
|
57
|
+
}], {
|
|
58
|
+
delay: TIMING.TRAVEL_DURATION,
|
|
59
|
+
duration: AVATAR_REVEAL_DURATION,
|
|
60
|
+
fill: 'forwards'
|
|
61
|
+
});
|
|
62
|
+
};
|
|
35
63
|
const onTravelHomeFrom = async (x, y, options) => {
|
|
36
64
|
const pos = {
|
|
37
65
|
x,
|
|
38
66
|
y
|
|
39
67
|
};
|
|
68
|
+
if (typeof x === 'number' && typeof y === 'number') {
|
|
69
|
+
scheduleReveal();
|
|
70
|
+
}
|
|
40
71
|
await moveFromOffsetWithDots(pos, options);
|
|
41
72
|
};
|
|
42
73
|
const onTravelAwayTo = async (x, y, options) => {
|
|
@@ -44,6 +75,7 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
44
75
|
x,
|
|
45
76
|
y
|
|
46
77
|
};
|
|
78
|
+
cancelReveal();
|
|
47
79
|
await moveToOffsetWithDots(pos, options);
|
|
48
80
|
};
|
|
49
81
|
const onMouseMove = (clientX, clientY) => {
|
|
@@ -77,6 +109,7 @@ export const AiAssistantAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
77
109
|
let _ref2 = _temp === void 0 ? {} : _temp,
|
|
78
110
|
_ref2$withDots = _ref2.withDots,
|
|
79
111
|
withDots = _ref2$withDots === void 0 ? false : _ref2$withDots;
|
|
112
|
+
cancelReveal();
|
|
80
113
|
setAvatarHidden(true);
|
|
81
114
|
if (withDots) {
|
|
82
115
|
hideDots();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","forwardRef","useEffect","useImperativeHandle","useRef","useState","s","ASTRO_SIZE","useAvatarSetup","useMovement","useDotAnimation","DotTrail","AvatarEvent","AvatarState","AiAssistantAvatar","_ref","ref","mode","variant","sleepTimeout","wrapperRef","typingTimeout","_useState","isTyping","setIsTyping","_useState2","showBg","setShowBg","_useAvatarSetup","AriaAvatar","avatarHidden","setAvatarHidden","_useMovement","WIDTH","HEIGHT","setCenter","_useDotAnimation","setState","leadDotRef","trailRefs","hideDots","moveFromOffsetWithDots","moveToOffsetWithDots","onTravelHomeFrom","x","y","options","pos","onTravelAwayTo","onMouseMove","clientX","clientY","lookAt","onUserTyping","caretX","caretY","current","clearTimeout","setTimeout","err","console","error","hideAvatar","_temp","_ref2","_ref2$withDots","withDots","showAvatar","trigger","shrink","getState","SMALL","IDLE","smallLoader","SMALL_LOADER","pulse","Promise","resolve","idle","undo","fireEvent","UNDO_EVENT","boredom","SLEEPING","bigLoader","BIG_LOADER","ideaSpark","IDEA_SPARK","publish","PUBLISH_EVENT","wrapper","changeAstroColor","color","setAvatarColor","toggleAvatarBackground","hideBg","hide","show","createElement","className","avatar","astro","style","opacity","width","height"],"sources":["../../../src/Astro/Astro.tsx"],"sourcesContent":["import React, {\n forwardRef,\n Ref,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport s from './Astro.module.css';\nimport type { AstroRef, AstroProps, MoveOptions } from './types';\nimport { ASTRO_SIZE } from './config';\nimport { useAvatarSetup, useMovement, useDotAnimation } from './hooks';\nimport { DotTrail } from './components/DotTrail';\nimport { AvatarEvent, AvatarState } from '@wix/aria-ai-avatar';\n\nexport const AiAssistantAvatar = forwardRef<AstroRef, AstroProps>(\n ({ mode, variant, sleepTimeout }, ref: Ref<AstroRef> | null) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const typingTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [isTyping, setIsTyping] = useState(false);\n\n const [showBg, setShowBg] = useState(false);\n\n const { AriaAvatar, avatarHidden, setAvatarHidden } = useAvatarSetup({\n mode,\n variant,\n sleepTimeout,\n });\n\n const { setCenter } = useMovement(\n wrapperRef,\n ASTRO_SIZE.WIDTH,\n ASTRO_SIZE.HEIGHT,\n );\n\n const {\n leadDotRef,\n trailRefs,\n hideDots,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n } = useDotAnimation(setCenter, setAvatarHidden, AriaAvatar.setState);\n\n const onTravelHomeFrom = async (\n x: number,\n y: number,\n options?: MoveOptions,\n ) => {\n const pos = { x, y };\n await moveFromOffsetWithDots(pos, options);\n };\n\n const onTravelAwayTo = async (\n x: number,\n y: number,\n options?: MoveOptions,\n ) => {\n const pos = { x, y };\n await moveToOffsetWithDots(pos, options);\n };\n\n const onMouseMove = (clientX: number, clientY: number) => {\n if (isTyping) {\n return;\n }\n\n AriaAvatar.lookAt(clientX, clientY);\n };\n\n const onUserTyping = (caretX: number, caretY: number) => {\n try {\n setIsTyping(true);\n AriaAvatar.lookAt(caretX, caretY);\n\n if (typingTimeout.current) {\n clearTimeout(typingTimeout.current);\n }\n\n typingTimeout.current = setTimeout(() => {\n setIsTyping(false);\n }, 500);\n } catch (err) {\n console.error('[Astro] Error tracking typing:', err);\n }\n };\n\n useEffect(() => {\n return () => {\n if (typingTimeout.current) {\n clearTimeout(typingTimeout.current);\n }\n };\n }, []);\n\n const hideAvatar = ({ withDots = false }: { withDots?: boolean } = {}) => {\n setAvatarHidden(true);\n\n if (withDots) {\n hideDots();\n }\n };\n\n const showAvatar = () => {\n setAvatarHidden(false);\n };\n\n useImperativeHandle(ref, () => ({\n trigger: {\n shrink: () => {\n if (AriaAvatar.getState() === AvatarState.SMALL) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.SMALL);\n },\n smallLoader: () => {\n if (AriaAvatar.getState() === AvatarState.SMALL) {\n return AriaAvatar.setState(AvatarState.SMALL_LOADER);\n }\n return AriaAvatar.setState(AvatarState.SMALL);\n },\n pulse: () => Promise.resolve(),\n idle: async () => {\n if (AriaAvatar.getState() === AvatarState.SMALL_LOADER) {\n await AriaAvatar.setState(AvatarState.SMALL);\n }\n return AriaAvatar.setState(AvatarState.IDLE);\n },\n undo: () => AriaAvatar.fireEvent(AvatarEvent.UNDO_EVENT),\n boredom: () => {\n if (AriaAvatar.getState() === AvatarState.SLEEPING) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.SLEEPING);\n },\n bigLoader: () => {\n if (AriaAvatar.getState() === AvatarState.BIG_LOADER) {\n return AriaAvatar.setState(AvatarState.IDLE);\n }\n return AriaAvatar.setState(AvatarState.BIG_LOADER);\n },\n ideaSpark: () => AriaAvatar.fireEvent(AvatarEvent.IDEA_SPARK),\n publish: () => AriaAvatar.fireEvent(AvatarEvent.PUBLISH_EVENT),\n },\n avatarHidden,\n wrapper: wrapperRef.current,\n getState: AriaAvatar.getState,\n\n onMouseMove,\n onUserTyping,\n onTravelHomeFrom,\n onTravelAwayTo,\n\n changeAstroColor: (color: string) => {\n AriaAvatar.setAvatarColor(color);\n },\n\n toggleAvatarBackground: () => {\n if (showBg) {\n setShowBg(false);\n AriaAvatar.hideBg();\n } else {\n setShowBg(true);\n AriaAvatar.showBg();\n }\n },\n\n hide: hideAvatar,\n show: showAvatar,\n }));\n\n return (\n <div className={s.avatar}>\n <DotTrail leadDotRef={leadDotRef} trailRefs={trailRefs} />\n\n <div\n ref={wrapperRef}\n className={s.astro}\n style={{\n opacity: avatarHidden ? 0 : 1,\n }}\n >\n <div style={{ width: ASTRO_SIZE.WIDTH, height: ASTRO_SIZE.HEIGHT }}>\n <AriaAvatar.AriaAvatar />\n </div>\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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,CAAC;IALlEC,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":"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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(
|
|
15
|
+
clip-path: inset(12px); /* cut off the edges to stop hijacking mouse events. maybe we need to reduce canvas size itself instead of this. */
|
|
16
|
+
|
|
17
|
+
[class*='_wrapper_'] [class*='_hitbox_'] {
|
|
18
|
+
transform: scale(0.47);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
[class*='_wrapper_'] [class*='_hitbox_'] [class*='_head_'][class*='_dark_'][class*='_shrunk_'] {
|
|
22
|
+
background: #557dff;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
[class*='_wrapper_'] [class*='_hitbox_'] [class*='_head_'][class*='_dark_']:not([class*='_shrunk_']) {
|
|
26
|
+
box-shadow:
|
|
27
|
+
0 12px 15px #2f5dffb2,
|
|
28
|
+
0 8px 8px #3ca1ff40,
|
|
29
|
+
0 0 6px #ffffff60,
|
|
30
|
+
0 0 6px 2px #ffffff40,
|
|
31
|
+
0 0 6px #2f5dffb2;
|
|
32
|
+
}
|
|
16
33
|
|
|
17
34
|
@starting-style {
|
|
18
35
|
opacity: 0;
|
|
@@ -1,41 +1,84 @@
|
|
|
1
1
|
import { useRef, useEffect } from 'react';
|
|
2
2
|
import { ANIMATION_CONFIG, TIMING } from '../config';
|
|
3
|
-
import {
|
|
3
|
+
import { buildPathControlPoints, samplePathByLength } from '../utils';
|
|
4
4
|
import { AvatarState } from '@wix/aria-ai-avatar';
|
|
5
|
-
|
|
5
|
+
const PATH_SAMPLES = 48;
|
|
6
|
+
// Matches the dots' opacity transition in Astro.module.css.
|
|
7
|
+
const DOT_FADE_OUT_DURATION = 150;
|
|
8
|
+
const centerOf = el => {
|
|
9
|
+
const rect = el.getBoundingClientRect();
|
|
10
|
+
return {
|
|
11
|
+
x: rect.left + rect.width / 2,
|
|
12
|
+
y: rect.top + rect.height / 2
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Where path coordinate (0, 0) lies relative to the dot's own center, i.e.
|
|
18
|
+
* the translation that puts the dot where `offset-path` with a centered
|
|
19
|
+
* `offset-anchor` would.
|
|
20
|
+
*/
|
|
21
|
+
const measurePathOrigin = el => {
|
|
22
|
+
const natural = centerOf(el);
|
|
23
|
+
el.style.offsetPath = 'path("M 0,0 L 1,0")';
|
|
24
|
+
el.style.offsetDistance = '0%';
|
|
25
|
+
el.style.offsetAnchor = '50% 50%';
|
|
26
|
+
el.style.offsetRotate = '0deg';
|
|
27
|
+
const origin = centerOf(el);
|
|
28
|
+
el.style.offsetPath = '';
|
|
29
|
+
el.style.offsetDistance = '';
|
|
30
|
+
el.style.offsetAnchor = '';
|
|
31
|
+
el.style.offsetRotate = '';
|
|
32
|
+
return {
|
|
33
|
+
x: origin.x - natural.x,
|
|
34
|
+
y: origin.y - natural.y
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAnimationState, mode) => {
|
|
6
38
|
const leadDotRef = useRef(null);
|
|
7
39
|
const trailRefs = useRef([]);
|
|
8
40
|
const isMountedRef = useRef(true);
|
|
9
|
-
const
|
|
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(
|
|
26
|
-
|
|
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
|
-
|
|
33
|
-
|
|
69
|
+
if (d) {
|
|
70
|
+
d.style.opacity = String(opacity);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
opacity,
|
|
74
|
+
scale: ANIMATION_CONFIG.TRAIL_MIN_SCALE + (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio)
|
|
75
|
+
};
|
|
34
76
|
});
|
|
77
|
+
const leadStartColor = mode === 'dark' ? ANIMATION_CONFIG.DOT_COLOR : '#000000';
|
|
35
78
|
lead.style.opacity = '1';
|
|
36
|
-
lead.style.background =
|
|
79
|
+
lead.style.background = leadStartColor;
|
|
37
80
|
lead.animate([{
|
|
38
|
-
background:
|
|
81
|
+
background: leadStartColor
|
|
39
82
|
}, {
|
|
40
83
|
background: ANIMATION_CONFIG.DOT_COLOR
|
|
41
84
|
}], {
|
|
@@ -43,45 +86,60 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
|
|
|
43
86
|
easing: 'ease-out',
|
|
44
87
|
fill: 'forwards'
|
|
45
88
|
});
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
89
|
+
const origin = measurePathOrigin(lead);
|
|
90
|
+
const points = samplePathByLength(buildPathControlPoints(start, end), PATH_SAMPLES);
|
|
91
|
+
const pathFrames = function (scale) {
|
|
92
|
+
if (scale === void 0) {
|
|
93
|
+
scale = 1;
|
|
50
94
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
95
|
+
return points.map(_ref => {
|
|
96
|
+
let x = _ref.x,
|
|
97
|
+
y = _ref.y;
|
|
98
|
+
return {
|
|
99
|
+
transform: `translate3d(${x + origin.x}px, ${y + origin.y}px, 0) scale(${scale})`
|
|
100
|
+
};
|
|
101
|
+
});
|
|
55
102
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
103
|
+
// Once faded, the inline opacity follows, so the next travel's opacity
|
|
104
|
+
// change runs the dots' CSS fade-in from 0.
|
|
105
|
+
const fadeOut = (el, opacity) => el.animate([{
|
|
106
|
+
opacity
|
|
60
107
|
}, {
|
|
61
|
-
|
|
108
|
+
opacity: 0
|
|
62
109
|
}], {
|
|
110
|
+
delay: TIMING.TRAVEL_DURATION,
|
|
111
|
+
duration: DOT_FADE_OUT_DURATION,
|
|
112
|
+
easing: 'ease-in-out',
|
|
113
|
+
fill: 'forwards'
|
|
114
|
+
}).finished.then(() => {
|
|
115
|
+
if (run === travelRunRef.current) {
|
|
116
|
+
el.style.opacity = '0';
|
|
117
|
+
}
|
|
118
|
+
}, () => {});
|
|
119
|
+
const leadAnim = lead.animate(pathFrames(), {
|
|
63
120
|
duration: TIMING.TRAVEL_DURATION,
|
|
64
121
|
easing: ANIMATION_CONFIG.EASING,
|
|
65
|
-
fill: '
|
|
122
|
+
fill: 'both'
|
|
66
123
|
});
|
|
124
|
+
fadeOut(lead, 1);
|
|
67
125
|
trailRefs.current.forEach((td, i) => {
|
|
68
126
|
if (!td) {
|
|
69
127
|
return;
|
|
70
128
|
}
|
|
71
|
-
td.animate([{
|
|
72
|
-
offsetDistance: '0%'
|
|
73
|
-
}, {
|
|
74
|
-
offsetDistance: '100%'
|
|
75
|
-
}], {
|
|
129
|
+
td.animate(pathFrames(trailStyles[i].scale), {
|
|
76
130
|
duration: TIMING.TRAVEL_DURATION,
|
|
77
131
|
delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,
|
|
78
132
|
easing: ANIMATION_CONFIG.EASING,
|
|
79
|
-
fill: '
|
|
133
|
+
fill: 'both'
|
|
80
134
|
});
|
|
135
|
+
fadeOut(td, trailStyles[i].opacity);
|
|
81
136
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
137
|
+
try {
|
|
138
|
+
await leadAnim.finished;
|
|
139
|
+
} catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
return run === travelRunRef.current;
|
|
85
143
|
};
|
|
86
144
|
const hideDots = () => {
|
|
87
145
|
const lead = leadDotRef.current;
|
|
@@ -103,15 +161,18 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
|
|
|
103
161
|
console.log('[Astro] Invalid position, skipping animation');
|
|
104
162
|
return;
|
|
105
163
|
}
|
|
164
|
+
const run = ++travelRunRef.current;
|
|
106
165
|
const home = {
|
|
107
166
|
x: 0,
|
|
108
167
|
y: 0
|
|
109
168
|
};
|
|
110
|
-
await animateDotsAlongPath(currentPosition, home, options)
|
|
169
|
+
if (!(await animateDotsAlongPath(run, currentPosition, home, options))) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
111
172
|
moveToPosition(home);
|
|
112
173
|
setAvatarHidden(false);
|
|
113
174
|
await waitForNextFrame();
|
|
114
|
-
if (
|
|
175
|
+
if (isCurrentTravel(run)) {
|
|
115
176
|
if (options.endState) {
|
|
116
177
|
await triggerAvatarAnimationState(options.endState);
|
|
117
178
|
} else {
|
|
@@ -127,14 +188,17 @@ export const useDotAnimation = (moveToPosition, setAvatarHidden, triggerAvatarAn
|
|
|
127
188
|
console.log('[Astro] Invalid position, skipping animation');
|
|
128
189
|
return;
|
|
129
190
|
}
|
|
191
|
+
const run = ++travelRunRef.current;
|
|
130
192
|
setAvatarHidden(true);
|
|
131
193
|
await waitForNextFrame();
|
|
194
|
+
if (!isCurrentTravel(run)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
132
197
|
const home = {
|
|
133
198
|
x: 0,
|
|
134
199
|
y: 0
|
|
135
200
|
};
|
|
136
|
-
await animateDotsAlongPath(home, targetPosition, options);
|
|
137
|
-
hideDots();
|
|
201
|
+
await animateDotsAlongPath(run, home, targetPosition, options);
|
|
138
202
|
};
|
|
139
203
|
useEffect(() => {
|
|
140
204
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useRef","useEffect","ANIMATION_CONFIG","TIMING","buildPathD","setMotionPath","setOffsetDistance","setOffsetRotate","setOffsetAnchor","AvatarState","useDotAnimation","moveToPosition","setAvatarHidden","triggerAvatarAnimationState","leadDotRef","trailRefs","isMountedRef","animateDotsAlongPath","start","end","options","current","lead","skipShrink","SMALL","forEach","d","i","ratio","TRAIL_COUNT","scale","TRAIL_MIN_SCALE","opacity","TRAIL_FADE","style","String","transform","background","animate","DOT_COLOR","duration","DOT_FADE_DURATION","easing","fill","pathD","prepDot","el","td","leadAnim","offsetDistance","TRAVEL_DURATION","EASING","delay","TRAIL_STAGGER","finished","hideDots","waitForNextFrame","Promise","r","requestAnimationFrame","moveFromOffsetWithDots","currentPosition","x","y","console","log","home","endState","IDLE","moveToOffsetWithDots","targetPosition"],"sources":["../../../../src/Astro/hooks/useDotAnimation.ts"],"sourcesContent":["import { useRef, useEffect } from 'react';\nimport type { Position, MoveOptions } from '../types';\nimport { ANIMATION_CONFIG, TIMING } from '../config';\nimport {\n buildPathD,\n setMotionPath,\n setOffsetDistance,\n setOffsetRotate,\n setOffsetAnchor,\n} from '../utils';\nimport { AvatarState } from '@wix/aria-ai-avatar';\n\nexport const useDotAnimation = (\n moveToPosition: (position: Position) => void,\n setAvatarHidden: (hidden: boolean) => void,\n triggerAvatarAnimationState: (state: AvatarState) => void,\n) => {\n const leadDotRef = useRef<HTMLDivElement | null>(null);\n const trailRefs = useRef<(HTMLDivElement | null)[]>([]);\n const isMountedRef = useRef(true);\n\n const animateDotsAlongPath = async (\n start: Position,\n end: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (!isMountedRef.current) {\n return;\n }\n\n const lead = leadDotRef.current;\n if (!lead) {\n return;\n }\n\n if (!options.skipShrink) {\n try {\n triggerAvatarAnimationState(AvatarState.SMALL);\n } catch {}\n }\n\n trailRefs.current.forEach((d, i) => {\n if (!d) {\n return;\n }\n const ratio = (i + 1) / ANIMATION_CONFIG.TRAIL_COUNT;\n const scale =\n ANIMATION_CONFIG.TRAIL_MIN_SCALE +\n (1 - ANIMATION_CONFIG.TRAIL_MIN_SCALE) * (1 - ratio);\n const opacity =\n ANIMATION_CONFIG.TRAIL_FADE +\n (1 - ANIMATION_CONFIG.TRAIL_FADE) * (1 - ratio);\n d.style.opacity = String(opacity);\n d.style.transform = `scale(${scale})`;\n });\n\n lead.style.opacity = '1';\n lead.style.background = '#000000';\n\n lead.animate(\n [{ background: '#000000' }, { background: ANIMATION_CONFIG.DOT_COLOR }],\n {\n duration: TIMING.DOT_FADE_DURATION,\n easing: 'ease-out',\n fill: 'forwards',\n },\n );\n\n const pathD = buildPathD(start, end);\n\n const prepDot = (el: HTMLElement) => {\n if (!el) {\n return;\n }\n setMotionPath(el, pathD);\n setOffsetDistance(el, '0%');\n setOffsetRotate(el, '0deg');\n setOffsetAnchor(el, '50% 50%');\n };\n\n prepDot(lead);\n\n trailRefs.current.forEach((td) => td && prepDot(td));\n\n const leadAnim = lead.animate(\n [{ offsetDistance: '0%' }, { offsetDistance: '100%' }],\n {\n duration: TIMING.TRAVEL_DURATION,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'forwards',\n },\n );\n\n trailRefs.current.forEach((td, i) => {\n if (!td) {\n return;\n }\n td.animate([{ offsetDistance: '0%' }, { offsetDistance: '100%' }], {\n duration: TIMING.TRAVEL_DURATION,\n delay: (i + 1) * ANIMATION_CONFIG.TRAIL_STAGGER,\n easing: ANIMATION_CONFIG.EASING,\n fill: 'forwards',\n });\n });\n\n await leadAnim.finished;\n\n lead.style.opacity = '0';\n trailRefs.current.forEach((td) => td && (td.style.opacity = '0'));\n };\n\n const hideDots = () => {\n const lead = leadDotRef.current;\n if (lead) {\n lead.style.opacity = '0';\n }\n trailRefs.current.forEach((td) => {\n if (td) {\n td.style.opacity = '0';\n }\n });\n };\n\n const waitForNextFrame = () =>\n new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const moveFromOffsetWithDots = async (\n currentPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof currentPosition.x !== 'number' ||\n typeof currentPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(currentPosition, home, options);\n\n moveToPosition(home);\n setAvatarHidden(false);\n\n await waitForNextFrame();\n\n if (isMountedRef.current) {\n if (options.endState) {\n await triggerAvatarAnimationState(options.endState);\n } else {\n await triggerAvatarAnimationState(AvatarState.IDLE);\n }\n }\n };\n\n const moveToOffsetWithDots = async (\n targetPosition: Position,\n options: MoveOptions = {},\n ): Promise<void> => {\n if (\n typeof targetPosition.x !== 'number' ||\n typeof targetPosition.y !== 'number'\n ) {\n console.log('[Astro] Invalid position, skipping animation');\n return;\n }\n\n setAvatarHidden(true);\n await waitForNextFrame();\n\n const home = { x: 0, y: 0 };\n await animateDotsAlongPath(home, targetPosition, options);\n\n hideDots();\n };\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return {\n leadDotRef,\n trailRefs,\n moveFromOffsetWithDots,\n moveToOffsetWithDots,\n hideDots,\n };\n};\n"],"mappings":"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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
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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","
|
|
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;
|
|
1
|
+
{"version":3,"file":"Astro.d.ts","sourceRoot":"","sources":["../../../src/Astro/Astro.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AASjE,eAAO,MAAM,iBAAiB,6EAyM7B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Position, MoveOptions } from '../types';
|
|
2
2
|
import { AvatarState } from '@wix/aria-ai-avatar';
|
|
3
|
-
export declare const useDotAnimation: (moveToPosition: (position: Position) => void, setAvatarHidden: (hidden: boolean) => void, triggerAvatarAnimationState: (state: AvatarState) => void) => {
|
|
3
|
+
export declare const useDotAnimation: (moveToPosition: (position: Position) => void, setAvatarHidden: (hidden: boolean) => void, triggerAvatarAnimationState: (state: AvatarState) => void, mode?: "light" | "dark") => {
|
|
4
4
|
leadDotRef: import("react").MutableRefObject<HTMLDivElement | null>;
|
|
5
5
|
trailRefs: import("react").MutableRefObject<(HTMLDivElement | null)[]>;
|
|
6
6
|
moveFromOffsetWithDots: (currentPosition: Position, options?: MoveOptions) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDotAnimation.d.ts","sourceRoot":"","sources":["../../../../src/Astro/hooks/useDotAnimation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
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,
|
|
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"}
|