@adminide-stack/yantra-mobile 12.0.79 → 12.0.80-alpha.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/lib/components/ThinkingIndicator.js +3 -49
- package/lib/components/ThinkingIndicator.js.map +1 -1
- package/lib/components/YantraBrandLoader.js +5 -83
- package/lib/components/YantraBrandLoader.js.map +1 -1
- package/lib/components/mascot/YantraMascot.js +361 -0
- package/lib/components/mascot/YantraMascot.js.map +1 -0
- package/lib/components/mascot/mascotChoreography.js +76 -0
- package/lib/components/mascot/mascotChoreography.js.map +1 -0
- package/lib/components/mascot/mascotTracks.js +72 -0
- package/lib/components/mascot/mascotTracks.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,41 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useRef,useEffect}from'react';import {Animated,Easing,View,StyleSheet}from'react-native';import {Text}from'@admin-layout/gluestack-ui-mobile';import {useLiveThinkingLabel}from'../hooks/useLiveThinkingLabel.js';function
|
|
2
|
-
accent,
|
|
3
|
-
delay
|
|
4
|
-
}) {
|
|
5
|
-
const scale = useRef(new Animated.Value(0.55)).current;
|
|
6
|
-
const opacity = useRef(new Animated.Value(0.35)).current;
|
|
7
|
-
useEffect(() => {
|
|
8
|
-
const loop = Animated.loop(Animated.sequence([Animated.delay(delay), Animated.parallel([Animated.timing(scale, {
|
|
9
|
-
toValue: 1,
|
|
10
|
-
duration: 280,
|
|
11
|
-
easing: Easing.out(Easing.quad),
|
|
12
|
-
useNativeDriver: true
|
|
13
|
-
}), Animated.timing(opacity, {
|
|
14
|
-
toValue: 1,
|
|
15
|
-
duration: 280,
|
|
16
|
-
useNativeDriver: true
|
|
17
|
-
})]), Animated.parallel([Animated.timing(scale, {
|
|
18
|
-
toValue: 0.55,
|
|
19
|
-
duration: 280,
|
|
20
|
-
easing: Easing.in(Easing.quad),
|
|
21
|
-
useNativeDriver: true
|
|
22
|
-
}), Animated.timing(opacity, {
|
|
23
|
-
toValue: 0.35,
|
|
24
|
-
duration: 280,
|
|
25
|
-
useNativeDriver: true
|
|
26
|
-
})]), Animated.delay(640)]));
|
|
27
|
-
loop.start();
|
|
28
|
-
return () => loop.stop();
|
|
29
|
-
}, [delay, opacity, scale]);
|
|
30
|
-
return /* @__PURE__ */ jsx(Animated.View, { style: [styles.dot, {
|
|
31
|
-
backgroundColor: accent,
|
|
32
|
-
opacity,
|
|
33
|
-
transform: [{
|
|
34
|
-
scale
|
|
35
|
-
}]
|
|
36
|
-
}] });
|
|
37
|
-
}
|
|
38
|
-
function SkeletonLine({
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useRef,useEffect}from'react';import {Animated,Easing,View,StyleSheet}from'react-native';import {Text}from'@admin-layout/gluestack-ui-mobile';import {useLiveThinkingLabel}from'../hooks/useLiveThinkingLabel.js';import {YantraMascot}from'./mascot/YantraMascot.js';function SkeletonLine({
|
|
39
2
|
width,
|
|
40
3
|
delay,
|
|
41
4
|
isDark
|
|
@@ -65,7 +28,6 @@ function SkeletonLine({
|
|
|
65
28
|
}
|
|
66
29
|
function ThinkingIndicator({
|
|
67
30
|
color,
|
|
68
|
-
accent = "#2563eb",
|
|
69
31
|
variant = "inline",
|
|
70
32
|
label,
|
|
71
33
|
isDark = false
|
|
@@ -89,9 +51,7 @@ function ThinkingIndicator({
|
|
|
89
51
|
return () => loop.stop();
|
|
90
52
|
}, [labelOpacity]);
|
|
91
53
|
const statusRow = /* @__PURE__ */ jsxs(View, { style: styles.row, accessibilityRole: "text", accessibilityLabel: "Assistant is working", children: [
|
|
92
|
-
/* @__PURE__ */ jsx(
|
|
93
|
-
/* @__PURE__ */ jsx(PulseDot, { accent, delay: 160 }),
|
|
94
|
-
/* @__PURE__ */ jsx(PulseDot, { accent, delay: 320 }),
|
|
54
|
+
/* @__PURE__ */ jsx(YantraMascot, { mode: "working", size: variant === "awaiting" ? 34 : 26, shadowColor: color }),
|
|
95
55
|
/* @__PURE__ */ jsx(Animated.View, { style: {
|
|
96
56
|
opacity: labelOpacity
|
|
97
57
|
}, children: /* @__PURE__ */ jsx(Text, { style: [styles.label, {
|
|
@@ -120,14 +80,8 @@ const styles = StyleSheet.create({
|
|
|
120
80
|
alignSelf: "stretch",
|
|
121
81
|
paddingVertical: 4
|
|
122
82
|
},
|
|
123
|
-
dot: {
|
|
124
|
-
width: 7,
|
|
125
|
-
height: 7,
|
|
126
|
-
borderRadius: 4,
|
|
127
|
-
marginRight: 5
|
|
128
|
-
},
|
|
129
83
|
label: {
|
|
130
|
-
marginLeft:
|
|
84
|
+
marginLeft: 10,
|
|
131
85
|
fontSize: 14,
|
|
132
86
|
fontWeight: "600",
|
|
133
87
|
letterSpacing: -0.2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThinkingIndicator.js","sources":["../../src/components/ThinkingIndicator.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Animated, Easing, StyleSheet, View } from 'react-native';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { useLiveThinkingLabel } from '../hooks/useLiveThinkingLabel';\n\ninterface ThinkingIndicatorProps {\n /** Muted caption color. */\n color: string;\n /** Dot / skeleton accent. Defaults to the product primary. */\n accent?: string;\n /**\n * `inline` — compact status row (hydration, dock).\n * `awaiting` — assistant-turn placeholder: dots, live label, skeleton lines\n * (browser `yantra-awaiting` treatment).\n */\n variant?: 'inline' | 'awaiting';\n /** Override the rotating caption (e.g. \"Opening conversation…\"). */\n label?: string;\n isDark?: boolean;\n}\n\nfunction PulseDot({ accent, delay }: { accent: string; delay: number }) {\n const scale = useRef(new Animated.Value(0.55)).current;\n const opacity = useRef(new Animated.Value(0.35)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.delay(delay),\n Animated.parallel([\n Animated.timing(scale, {\n toValue: 1,\n duration: 280,\n easing: Easing.out(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 280,\n useNativeDriver: true,\n }),\n ]),\n Animated.parallel([\n Animated.timing(scale, {\n toValue: 0.55,\n duration: 280,\n easing: Easing.in(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 0.35,\n duration: 280,\n useNativeDriver: true,\n }),\n ]),\n Animated.delay(640),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [delay, opacity, scale]);\n return <Animated.View style={[styles.dot, { backgroundColor: accent, opacity, transform: [{ scale }] }]} />;\n}\n\nfunction SkeletonLine({ width, delay, isDark }: { width: `${number}%`; delay: number; isDark: boolean }) {\n const opacity = useRef(new Animated.Value(0.45)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.delay(delay),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 700,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 0.4,\n duration: 700,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [delay, opacity]);\n const fill = isDark ? 'rgba(148, 163, 184, 0.18)' : 'rgba(15, 23, 42, 0.08)';\n return <Animated.View style={[styles.skel, { width, backgroundColor: fill, opacity }]} />;\n}\n\n/**\n * In-flight assistant wait — browser ChatConversation awaiting strip:\n * staggered dots, rotating status copy, optional skeleton bars.\n */\nexport default function ThinkingIndicator({\n color,\n accent = '#2563eb',\n variant = 'inline',\n label,\n isDark = false,\n}: ThinkingIndicatorProps) {\n const live = useLiveThinkingLabel(!label);\n const caption = label ?? live;\n const labelOpacity = useRef(new Animated.Value(0.72)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(labelOpacity, {\n toValue: 1,\n duration: 900,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(labelOpacity, {\n toValue: 0.55,\n duration: 900,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [labelOpacity]);\n\n const statusRow = (\n <View style={styles.row} accessibilityRole=\"text\" accessibilityLabel=\"Assistant is working\">\n <PulseDot accent={accent} delay={0} />\n <PulseDot accent={accent} delay={160} />\n <PulseDot accent={accent} delay={320} />\n <Animated.View style={{ opacity: labelOpacity }}>\n <Text style={[styles.label, { color }]}>{caption}</Text>\n </Animated.View>\n </View>\n );\n\n if (variant === 'inline') {\n return statusRow;\n }\n\n return (\n <View style={styles.awaiting}>\n {statusRow}\n <View style={styles.skelCol}>\n <SkeletonLine width=\"92%\" delay={0} isDark={isDark} />\n <SkeletonLine width=\"78%\" delay={180} isDark={isDark} />\n <SkeletonLine width=\"60%\" delay={360} isDark={isDark} />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'flex-start',\n },\n awaiting: {\n alignSelf: 'stretch',\n paddingVertical: 4,\n },\n dot: {\n width: 7,\n height: 7,\n borderRadius: 4,\n marginRight: 5,\n },\n label: {\n marginLeft: 8,\n fontSize: 14,\n fontWeight: '600',\n letterSpacing: -0.2,\n },\n skelCol: {\n marginTop: 14,\n },\n skel: {\n height: 11,\n borderRadius: 6,\n marginBottom: 8,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThinkingIndicator.js","sources":["../../src/components/ThinkingIndicator.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Animated, Easing, StyleSheet, View } from 'react-native';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { useLiveThinkingLabel } from '../hooks/useLiveThinkingLabel';\nimport { YantraMascot } from './mascot/YantraMascot';\n\ninterface ThinkingIndicatorProps {\n /** Muted caption color (also tints the mascot's ground shadow). */\n color: string;\n /**\n * `inline` — compact status row (hydration, dock).\n * `awaiting` — assistant-turn placeholder: working mascot, live label, skeleton lines\n * (browser `yantra-awaiting` treatment).\n */\n variant?: 'inline' | 'awaiting';\n /** Override the rotating caption (e.g. \"Opening conversation…\"). */\n label?: string;\n isDark?: boolean;\n}\n\nfunction SkeletonLine({ width, delay, isDark }: { width: `${number}%`; delay: number; isDark: boolean }) {\n const opacity = useRef(new Animated.Value(0.45)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.delay(delay),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 700,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 0.4,\n duration: 700,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [delay, opacity]);\n const fill = isDark ? 'rgba(148, 163, 184, 0.18)' : 'rgba(15, 23, 42, 0.08)';\n return <Animated.View style={[styles.skel, { width, backgroundColor: fill, opacity }]} />;\n}\n\n/**\n * In-flight assistant wait — browser ChatConversation awaiting strip:\n * the Yantra mascot at work, rotating status copy, optional skeleton bars.\n */\nexport default function ThinkingIndicator({\n color,\n variant = 'inline',\n label,\n isDark = false,\n}: ThinkingIndicatorProps) {\n const live = useLiveThinkingLabel(!label);\n const caption = label ?? live;\n const labelOpacity = useRef(new Animated.Value(0.72)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(labelOpacity, {\n toValue: 1,\n duration: 900,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.timing(labelOpacity, {\n toValue: 0.55,\n duration: 900,\n easing: Easing.inOut(Easing.quad),\n useNativeDriver: true,\n }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [labelOpacity]);\n\n const statusRow = (\n <View style={styles.row} accessibilityRole=\"text\" accessibilityLabel=\"Assistant is working\">\n <YantraMascot mode=\"working\" size={variant === 'awaiting' ? 34 : 26} shadowColor={color} />\n <Animated.View style={{ opacity: labelOpacity }}>\n <Text style={[styles.label, { color }]}>{caption}</Text>\n </Animated.View>\n </View>\n );\n\n if (variant === 'inline') {\n return statusRow;\n }\n\n return (\n <View style={styles.awaiting}>\n {statusRow}\n <View style={styles.skelCol}>\n <SkeletonLine width=\"92%\" delay={0} isDark={isDark} />\n <SkeletonLine width=\"78%\" delay={180} isDark={isDark} />\n <SkeletonLine width=\"60%\" delay={360} isDark={isDark} />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'flex-start',\n },\n awaiting: {\n alignSelf: 'stretch',\n paddingVertical: 4,\n },\n label: {\n marginLeft: 10,\n fontSize: 14,\n fontWeight: '600',\n letterSpacing: -0.2,\n },\n skelCol: {\n marginTop: 14,\n },\n skel: {\n height: 11,\n borderRadius: 6,\n marginBottom: 8,\n },\n});\n"],"names":[],"mappings":"sTAkBA,SAAS,YAAa,CAAA;AAAA,EACpB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAA,MAAM,UAAU,MAAO,CAAA,IAAI,SAAS,KAAM,CAAA,IAAI,CAAC,CAAE,CAAA,OAAA;AACjD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAO,GAAA,QAAA,CAAS,IAAK,CAAA,QAAA,CAAS,QAAS,CAAA,CAAC,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,EAAG,QAAS,CAAA,MAAA,CAAO,OAAS,EAAA;AAAA,MAC5F,OAAS,EAAA,CAAA;AAAA,MACT,QAAU,EAAA,GAAA;AAAA,MACV,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,MAAA,CAAO,IAAI,CAAA;AAAA,MAChC,eAAiB,EAAA;AAAA,KAClB,CAAA,EAAG,QAAS,CAAA,MAAA,CAAO,OAAS,EAAA;AAAA,MAC3B,OAAS,EAAA,GAAA;AAAA,MACT,QAAU,EAAA,GAAA;AAAA,MACV,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,MAAA,CAAO,IAAI,CAAA;AAAA,MAChC,eAAiB,EAAA;AAAA,KAClB,CAAC,CAAC,CAAC,CAAA;AACJ,IAAA,IAAA,CAAK,KAAM,EAAA;AACX,IAAO,OAAA,MAAM,KAAK,IAAK,EAAA;AAAA,GACtB,EAAA,CAAC,KAAO,EAAA,OAAO,CAAC,CAAA;AACnB,EAAM,MAAA,IAAA,GAAO,SAAS,2BAA8B,GAAA,wBAAA;AACpD,EAAA,2BAAQ,QAAS,CAAA,IAAA,EAAT,EAAc,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IACzC,KAAA;AAAA,IACA,eAAiB,EAAA,IAAA;AAAA,IACjB;AAAA,GACD,CAAG,EAAA,CAAA;AACN;AAMA,SAAwB,iBAAkB,CAAA;AAAA,EACxC,KAAA;AAAA,EACA,OAAU,GAAA,QAAA;AAAA,EACV,KAAA;AAAA,EACA,MAAS,GAAA;AACX,CAA2B,EAAA;AACzB,EAAM,MAAA,IAAA,GAAO,oBAAqB,CAAA,CAAC,KAAK,CAAA;AACxC,EAAA,MAAM,UAAU,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,IAAA;AACzB,EAAA,MAAM,eAAe,MAAO,CAAA,IAAI,SAAS,KAAM,CAAA,IAAI,CAAC,CAAE,CAAA,OAAA;AACtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,IAAA,GAAO,SAAS,IAAK,CAAA,QAAA,CAAS,SAAS,CAAC,QAAA,CAAS,OAAO,YAAc,EAAA;AAAA,MAC1E,OAAS,EAAA,CAAA;AAAA,MACT,QAAU,EAAA,GAAA;AAAA,MACV,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,MAAA,CAAO,IAAI,CAAA;AAAA,MAChC,eAAiB,EAAA;AAAA,KAClB,CAAA,EAAG,QAAS,CAAA,MAAA,CAAO,YAAc,EAAA;AAAA,MAChC,OAAS,EAAA,IAAA;AAAA,MACT,QAAU,EAAA,GAAA;AAAA,MACV,MAAQ,EAAA,MAAA,CAAO,KAAM,CAAA,MAAA,CAAO,IAAI,CAAA;AAAA,MAChC,eAAiB,EAAA;AAAA,KAClB,CAAC,CAAC,CAAC,CAAA;AACJ,IAAA,IAAA,CAAK,KAAM,EAAA;AACX,IAAO,OAAA,MAAM,KAAK,IAAK,EAAA;AAAA,GACzB,EAAG,CAAC,YAAY,CAAC,CAAA;AACjB,EAAM,MAAA,SAAA,wBAAa,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,GAAK,EAAA,iBAAA,EAAkB,MAAO,EAAA,kBAAA,EAAmB,sBAC7E,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,YAAA,EAAA,EAAa,MAAK,SAAU,EAAA,IAAA,EAAM,YAAY,UAAa,GAAA,EAAA,GAAK,EAAI,EAAA,WAAA,EAAa,KAAO,EAAA,CAAA;AAAA,oBACxF,GAAA,CAAA,QAAA,CAAS,IAAT,EAAA,EAAc,KAAO,EAAA;AAAA,MAC5B,OAAS,EAAA;AAAA,OAEC,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MACpC;AAAA,KACD,CAAI,EAAA,QAAA,EAAA,OAAA,EAAQ,CACP,EAAA;AAAA,GACJ,EAAA,CAAA;AACN,EAAA,IAAI,YAAY,QAAU,EAAA;AACxB,IAAO,OAAA,SAAA;AAAA;AAET,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,QAChB,EAAA,QAAA,EAAA;AAAA,IAAA,SAAA;AAAA,oBACA,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,KAAA,EAAO,GAAG,MAAgB,EAAA,CAAA;AAAA,0BACnD,YAAa,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,KAAA,EAAO,KAAK,MAAgB,EAAA,CAAA;AAAA,0BACrD,YAAa,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,KAAA,EAAO,KAAK,MAAgB,EAAA;AAAA,KAC1D,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,GAAK,EAAA;AAAA,IACH,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,SAAW,EAAA;AAAA,GACb;AAAA,EACA,QAAU,EAAA;AAAA,IACR,SAAW,EAAA,SAAA;AAAA,IACX,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,UAAY,EAAA,EAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,SAAW,EAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA;AAElB,CAAC,CAAA"}
|
|
@@ -1,94 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
var __defProps = Object.defineProperties;
|
|
3
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
-
var __spreadValues = (a, b) => {
|
|
9
|
-
for (var prop in b || (b = {}))
|
|
10
|
-
if (__hasOwnProp.call(b, prop))
|
|
11
|
-
__defNormalProp(a, prop, b[prop]);
|
|
12
|
-
if (__getOwnPropSymbols)
|
|
13
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
-
if (__propIsEnum.call(b, prop))
|
|
15
|
-
__defNormalProp(a, prop, b[prop]);
|
|
16
|
-
}
|
|
17
|
-
return a;
|
|
18
|
-
};
|
|
19
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
-
const ICON = require("../assets/icon.png");
|
|
21
|
-
const YANTRA_LOADER_SIZE_DEFAULT = 72;
|
|
1
|
+
import {jsx}from'react/jsx-runtime';import {View,StyleSheet}from'react-native';import {YantraMascot}from'./mascot/YantraMascot.js';const YANTRA_LOADER_SIZE_DEFAULT = 72;
|
|
22
2
|
const YANTRA_LOADER_SIZE_COMPACT = 40;
|
|
23
|
-
const BASE = YANTRA_LOADER_SIZE_DEFAULT;
|
|
24
|
-
const RING = 62;
|
|
25
|
-
const ICON_SZ = 34;
|
|
26
3
|
function YantraBrandLoader({
|
|
27
|
-
size =
|
|
4
|
+
size = YANTRA_LOADER_SIZE_DEFAULT
|
|
28
5
|
}) {
|
|
29
|
-
|
|
30
|
-
const scale = size / BASE;
|
|
31
|
-
const ringLayout = useMemo(() => {
|
|
32
|
-
const ringSize2 = RING * scale;
|
|
33
|
-
const inset2 = (size - ringSize2) / 2;
|
|
34
|
-
return {
|
|
35
|
-
ringSize: ringSize2,
|
|
36
|
-
inset: inset2
|
|
37
|
-
};
|
|
38
|
-
}, [size, scale]);
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
const loop = Animated.loop(Animated.timing(spin, {
|
|
41
|
-
toValue: 1,
|
|
42
|
-
duration: 1100,
|
|
43
|
-
easing: Easing.linear,
|
|
44
|
-
useNativeDriver: true
|
|
45
|
-
}));
|
|
46
|
-
loop.start();
|
|
47
|
-
return () => loop.stop();
|
|
48
|
-
}, [spin]);
|
|
49
|
-
const rotate = spin.interpolate({
|
|
50
|
-
inputRange: [0, 1],
|
|
51
|
-
outputRange: ["0deg", "360deg"]
|
|
52
|
-
});
|
|
53
|
-
const {
|
|
54
|
-
ringSize,
|
|
55
|
-
inset
|
|
56
|
-
} = ringLayout;
|
|
57
|
-
const ringBorder = Math.max(2, Math.round(3 * scale));
|
|
58
|
-
return /* @__PURE__ */ jsxs(View, { style: [styles.wrap, {
|
|
6
|
+
return /* @__PURE__ */ jsx(View, { style: [styles.wrap, {
|
|
59
7
|
width: size,
|
|
60
8
|
height: size
|
|
61
|
-
}], children:
|
|
62
|
-
/* @__PURE__ */ jsx(Animated.View, { style: [styles.ring, {
|
|
63
|
-
width: ringSize,
|
|
64
|
-
height: ringSize,
|
|
65
|
-
borderRadius: ringSize / 2,
|
|
66
|
-
borderWidth: ringBorder,
|
|
67
|
-
top: inset,
|
|
68
|
-
left: inset,
|
|
69
|
-
transform: [{
|
|
70
|
-
rotate
|
|
71
|
-
}]
|
|
72
|
-
}] }),
|
|
73
|
-
/* @__PURE__ */ jsx(View, { style: styles.iconWrap, children: /* @__PURE__ */ jsx(Image, { source: ICON, style: {
|
|
74
|
-
width: ICON_SZ * scale,
|
|
75
|
-
height: ICON_SZ * scale
|
|
76
|
-
}, resizeMode: "contain", accessibilityIgnoresInvertColors: true }) })
|
|
77
|
-
] });
|
|
9
|
+
}], accessibilityRole: "progressbar", accessibilityLabel: "Loading", children: /* @__PURE__ */ jsx(YantraMascot, { mode: "working", size: Math.round(size * 0.86) }) });
|
|
78
10
|
}
|
|
79
11
|
const styles = StyleSheet.create({
|
|
80
12
|
wrap: {
|
|
81
13
|
alignItems: "center",
|
|
82
14
|
justifyContent: "center"
|
|
83
|
-
}
|
|
84
|
-
ring: {
|
|
85
|
-
position: "absolute",
|
|
86
|
-
borderColor: "#e5e7eb",
|
|
87
|
-
borderTopColor: "#111827",
|
|
88
|
-
borderRightColor: "#6b7280"
|
|
89
|
-
},
|
|
90
|
-
iconWrap: __spreadProps(__spreadValues({}, StyleSheet.absoluteFillObject), {
|
|
91
|
-
alignItems: "center",
|
|
92
|
-
justifyContent: "center"
|
|
93
|
-
})
|
|
15
|
+
}
|
|
94
16
|
});export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader};//# sourceMappingURL=YantraBrandLoader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YantraBrandLoader.js","sources":["../../src/components/YantraBrandLoader.tsx"],"sourcesContent":["import React
|
|
1
|
+
{"version":3,"file":"YantraBrandLoader.js","sources":["../../src/components/YantraBrandLoader.tsx"],"sourcesContent":["import React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { YantraMascot } from './mascot/YantraMascot';\n\n/** Default outer size for full-screen / landing loaders */\nexport const YANTRA_LOADER_SIZE_DEFAULT = 72;\n/** Compact size for composer “sending…” overlay */\nexport const YANTRA_LOADER_SIZE_COMPACT = 40;\n\nexport interface YantraBrandLoaderProps {\n /** Outer container width/height in px */\n size?: number;\n}\n\n/**\n * Brand loader for splash / gate screens: the Yantra mascot busy at work, in a\n * square box so it drops in wherever the old spinner ring sat.\n */\nexport function YantraBrandLoader({ size = YANTRA_LOADER_SIZE_DEFAULT }: YantraBrandLoaderProps) {\n return (\n <View\n style={[styles.wrap, { width: size, height: size }]}\n accessibilityRole=\"progressbar\"\n accessibilityLabel=\"Loading\"\n >\n {/* A little under the box width leaves room for its hops and hat tips. */}\n <YantraMascot mode=\"working\" size={Math.round(size * 0.86)} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":[],"mappings":"mIAKO,MAAM,0BAA6B,GAAA;AAEnC,MAAM,0BAA6B,GAAA;AAUnC,SAAS,iBAAkB,CAAA;AAAA,EAChC,IAAO,GAAA;AACT,CAA2B,EAAA;AACzB,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IAChC,KAAO,EAAA,IAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACT,CAAG,EAAA,iBAAA,EAAkB,aAAc,EAAA,kBAAA,EAAmB,WAE7C,QAAC,kBAAA,GAAA,CAAA,YAAA,EAAA,EAAa,IAAK,EAAA,SAAA,EAAU,MAAM,IAAK,CAAA,KAAA,CAAM,IAAO,GAAA,IAAI,GAAG,CAChE,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA;AAEpB,CAAC,CAAA"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useRef,useMemo,useEffect}from'react';import {Animated,View,AccessibilityInfo,StyleSheet,Easing,AppState}from'react-native';import Svg,{Ellipse,Polygon,Path,Circle,Rect}from'react-native-svg';import {firstPeekMs,blinkGapMs,WAKE_MS,workingGapMs,pickWorkingGesture,pickPeekGesture,peekGapMs,BLINK_MS,GESTURE_MS}from'./mascotChoreography.js';import {REST,GESTURE_TRACKS}from'./mascotTracks.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const VB = {
|
|
18
|
+
x: 78,
|
|
19
|
+
y: 62,
|
|
20
|
+
w: 228,
|
|
21
|
+
h: 212
|
|
22
|
+
};
|
|
23
|
+
const VIEWBOX = `${VB.x} ${VB.y} ${VB.w} ${VB.h}`;
|
|
24
|
+
const INK = "#1d1a24";
|
|
25
|
+
const EASE = {
|
|
26
|
+
inOut: Easing.inOut(Easing.ease),
|
|
27
|
+
in: Easing.bezier(0.6, 0, 0.9, 0.45),
|
|
28
|
+
out: Easing.bezier(0.2, 0.7, 0.3, 1)
|
|
29
|
+
};
|
|
30
|
+
function track(value, keyframes, totalMs) {
|
|
31
|
+
const steps = [];
|
|
32
|
+
for (let i = 1; i < keyframes.length; i++) {
|
|
33
|
+
const [from] = keyframes[i - 1];
|
|
34
|
+
const [at, toValue, ease = "inOut"] = keyframes[i];
|
|
35
|
+
steps.push(Animated.timing(value, {
|
|
36
|
+
toValue,
|
|
37
|
+
duration: Math.max(0, (at - from) * totalMs),
|
|
38
|
+
easing: EASE[ease],
|
|
39
|
+
useNativeDriver: true
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
return Animated.sequence(steps);
|
|
43
|
+
}
|
|
44
|
+
function breathingLoop(value) {
|
|
45
|
+
const half = {
|
|
46
|
+
duration: 1300,
|
|
47
|
+
easing: Easing.inOut(Easing.ease),
|
|
48
|
+
useNativeDriver: true
|
|
49
|
+
};
|
|
50
|
+
return Animated.loop(Animated.sequence([Animated.timing(value, __spreadValues({
|
|
51
|
+
toValue: 1
|
|
52
|
+
}, half)), Animated.timing(value, __spreadValues({
|
|
53
|
+
toValue: 0
|
|
54
|
+
}, half))]));
|
|
55
|
+
}
|
|
56
|
+
function YantraMascot({
|
|
57
|
+
mode = "working",
|
|
58
|
+
size = 32,
|
|
59
|
+
shadowColor = "#0f172a",
|
|
60
|
+
title
|
|
61
|
+
}) {
|
|
62
|
+
const k = size / VB.w;
|
|
63
|
+
const height = Math.round(size * (VB.h / VB.w));
|
|
64
|
+
const values = useRef(null);
|
|
65
|
+
if (!values.current) {
|
|
66
|
+
values.current = Object.fromEntries(Object.keys(REST).map((channel) => [channel, new Animated.Value(REST[channel])]));
|
|
67
|
+
}
|
|
68
|
+
const v = values.current;
|
|
69
|
+
const awake = useRef(new Animated.Value(mode === "working" ? 1 : 0)).current;
|
|
70
|
+
const breathe = useRef(new Animated.Value(0)).current;
|
|
71
|
+
const hatNod = useRef(new Animated.Value(0)).current;
|
|
72
|
+
const blink = useRef(new Animated.Value(1)).current;
|
|
73
|
+
useMascotDirector({
|
|
74
|
+
mode,
|
|
75
|
+
v,
|
|
76
|
+
awake,
|
|
77
|
+
breathe,
|
|
78
|
+
hatNod,
|
|
79
|
+
blink
|
|
80
|
+
});
|
|
81
|
+
const layout = useMemo(() => {
|
|
82
|
+
const at2 = (x, y) => [(x - VB.x) * k, (y - VB.y) * k, 0];
|
|
83
|
+
const px2 = (value) => Animated.multiply(value, k);
|
|
84
|
+
const deg2 = (value) => value.interpolate({
|
|
85
|
+
inputRange: [-360, 360],
|
|
86
|
+
outputRange: ["-360deg", "360deg"]
|
|
87
|
+
});
|
|
88
|
+
const notHappy2 = Animated.subtract(1, v.happy);
|
|
89
|
+
return {
|
|
90
|
+
at: at2,
|
|
91
|
+
px: px2,
|
|
92
|
+
deg: deg2,
|
|
93
|
+
notHappy: notHappy2
|
|
94
|
+
};
|
|
95
|
+
}, [k, v]);
|
|
96
|
+
const {
|
|
97
|
+
at,
|
|
98
|
+
px,
|
|
99
|
+
deg,
|
|
100
|
+
notHappy
|
|
101
|
+
} = layout;
|
|
102
|
+
const layer = (style, children, key) => /* @__PURE__ */ jsx(Animated.View, { pointerEvents: "none", style: [StyleSheet.absoluteFill, style], children }, key);
|
|
103
|
+
const art = (children) => /* @__PURE__ */ jsx(Svg, { width: size, height, viewBox: VIEWBOX, children });
|
|
104
|
+
const awakeClamped = awake.interpolate({
|
|
105
|
+
inputRange: [0, 1],
|
|
106
|
+
outputRange: [0, 1],
|
|
107
|
+
extrapolate: "clamp"
|
|
108
|
+
});
|
|
109
|
+
return /* @__PURE__ */ jsxs(View, { style: {
|
|
110
|
+
width: size,
|
|
111
|
+
height
|
|
112
|
+
}, accessible: Boolean(title), accessibilityRole: title ? "image" : void 0, accessibilityLabel: title, accessibilityElementsHidden: !title, importantForAccessibility: title ? "yes" : "no-hide-descendants", children: [
|
|
113
|
+
layer({
|
|
114
|
+
opacity: Animated.multiply(awake.interpolate({
|
|
115
|
+
inputRange: [0, 1],
|
|
116
|
+
outputRange: [0, 0.13],
|
|
117
|
+
extrapolate: "clamp"
|
|
118
|
+
}), v.shadowFade),
|
|
119
|
+
transformOrigin: at(192, 261),
|
|
120
|
+
transform: [{
|
|
121
|
+
scale: v.shadowScale
|
|
122
|
+
}]
|
|
123
|
+
}, art(/* @__PURE__ */ jsx(Ellipse, { cx: "192", cy: "261", rx: "98", ry: "4.5", fill: shadowColor }))),
|
|
124
|
+
layer({
|
|
125
|
+
transform: [{
|
|
126
|
+
translateY: px(v.jumpY)
|
|
127
|
+
}]
|
|
128
|
+
}, layer({
|
|
129
|
+
transformOrigin: at(192, 257),
|
|
130
|
+
transform: [{
|
|
131
|
+
rotate: deg(v.sway)
|
|
132
|
+
}]
|
|
133
|
+
}, [layer({
|
|
134
|
+
transformOrigin: at(129.35, 256.89),
|
|
135
|
+
transform: [{
|
|
136
|
+
translateY: px(v.footLY)
|
|
137
|
+
}, {
|
|
138
|
+
rotate: deg(v.footLRot)
|
|
139
|
+
}]
|
|
140
|
+
}, art(/* @__PURE__ */ jsx(Polygon, { fill: "#DF1E5B", points: "85.22,256.89 105.11,223.09 129.35,256.89" })), "foot-l"), layer({
|
|
141
|
+
transformOrigin: at(254.57, 256.89),
|
|
142
|
+
transform: [{
|
|
143
|
+
translateY: px(v.footRY)
|
|
144
|
+
}, {
|
|
145
|
+
rotate: deg(v.footRRot)
|
|
146
|
+
}]
|
|
147
|
+
}, art(/* @__PURE__ */ jsx(Polygon, { fill: "#31B57E", points: "298.71,256.89 254.57,256.89 278.82,223.09" })), "foot-r"), layer({
|
|
148
|
+
transformOrigin: at(192, 257),
|
|
149
|
+
transform: [{
|
|
150
|
+
scaleX: breathe.interpolate({
|
|
151
|
+
inputRange: [0, 1],
|
|
152
|
+
outputRange: [1, 0.992]
|
|
153
|
+
})
|
|
154
|
+
}, {
|
|
155
|
+
scaleY: breathe.interpolate({
|
|
156
|
+
inputRange: [0, 1],
|
|
157
|
+
outputRange: [1, 1.022]
|
|
158
|
+
})
|
|
159
|
+
}]
|
|
160
|
+
}, layer({
|
|
161
|
+
transformOrigin: at(192, 257),
|
|
162
|
+
transform: [{
|
|
163
|
+
scaleX: v.squashX
|
|
164
|
+
}, {
|
|
165
|
+
scaleY: v.squashY
|
|
166
|
+
}]
|
|
167
|
+
}, [layer({}, art(/* @__PURE__ */ jsxs(Fragment, { children: [
|
|
168
|
+
/* @__PURE__ */ jsx(Polygon, { fill: "#DF1E5B", points: "182.27,256.89 142.89,256.89 111.22,212.73 128.56,183.26" }),
|
|
169
|
+
/* @__PURE__ */ jsx(Polygon, { fill: "#31B57E", points: "272.71,212.73 241.04,256.89 201.66,256.89 255.37,183.26" })
|
|
170
|
+
] })), "legs"), layer({
|
|
171
|
+
transform: [{
|
|
172
|
+
translateY: breathe.interpolate({
|
|
173
|
+
inputRange: [0, 1],
|
|
174
|
+
outputRange: [0, -1.6 * k]
|
|
175
|
+
})
|
|
176
|
+
}]
|
|
177
|
+
}, [
|
|
178
|
+
layer({}, art(/* @__PURE__ */ jsx(Path, { fill: "#EAB12B", fillRule: "evenodd", d: "M246.64,168.43H137.28l-2.64,4.51l57.32,78.6l57.32-78.6L246.64,168.43z M191.96,208.5c-5.76,0-10.43-4.67-10.43-10.43c0-5.76,4.67-10.43,10.43-10.43c5.77,0,10.45,4.67,10.45,10.43C202.41,203.83,197.73,208.5,191.96,208.5z" })), "face"),
|
|
179
|
+
// Closes the logo's round "eye" while the face is showing.
|
|
180
|
+
layer({
|
|
181
|
+
transformOrigin: at(191.96, 198.07),
|
|
182
|
+
transform: [{
|
|
183
|
+
scale: awakeClamped
|
|
184
|
+
}]
|
|
185
|
+
}, art(/* @__PURE__ */ jsx(Circle, { fill: "#EAB12B", cx: "191.96", cy: "198.07", r: "11.2" })), "plug"),
|
|
186
|
+
layer({
|
|
187
|
+
opacity: awakeClamped,
|
|
188
|
+
transformOrigin: at(192, 193),
|
|
189
|
+
transform: [{
|
|
190
|
+
scale: awake.interpolate({
|
|
191
|
+
inputRange: [0, 1],
|
|
192
|
+
outputRange: [0.35, 1]
|
|
193
|
+
})
|
|
194
|
+
}]
|
|
195
|
+
}, [layer({
|
|
196
|
+
opacity: v.happy
|
|
197
|
+
}, art(/* @__PURE__ */ jsxs(Fragment, { children: [
|
|
198
|
+
/* @__PURE__ */ jsx(Ellipse, { fill: "#DF1E5B", fillOpacity: 0.42, cx: "163.5", cy: "202.5", rx: "6.8", ry: "3.6" }),
|
|
199
|
+
/* @__PURE__ */ jsx(Ellipse, { fill: "#DF1E5B", fillOpacity: 0.42, cx: "220.5", cy: "202.5", rx: "6.8", ry: "3.6" })
|
|
200
|
+
] })), "blush"), layer({
|
|
201
|
+
transform: [{
|
|
202
|
+
translateX: px(v.lookX)
|
|
203
|
+
}, {
|
|
204
|
+
translateY: px(v.lookY)
|
|
205
|
+
}]
|
|
206
|
+
}, [layer({
|
|
207
|
+
opacity: notHappy,
|
|
208
|
+
transformOrigin: at(192, 187.5),
|
|
209
|
+
transform: [{
|
|
210
|
+
scaleY: blink
|
|
211
|
+
}]
|
|
212
|
+
}, art(/* @__PURE__ */ jsxs(Fragment, { children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Rect, { fill: INK, x: "170.5", y: "176", width: "13", height: "23", rx: "6.5" }),
|
|
214
|
+
/* @__PURE__ */ jsx(Rect, { fill: INK, x: "200.5", y: "176", width: "13", height: "23", rx: "6.5" })
|
|
215
|
+
] })), "eyes"), layer({
|
|
216
|
+
opacity: v.happy
|
|
217
|
+
}, art(/* @__PURE__ */ jsxs(Fragment, { children: [
|
|
218
|
+
/* @__PURE__ */ jsx(Path, { fill: "none", stroke: INK, strokeWidth: 4.2, strokeLinecap: "round", d: "M170.5,190.5 Q177,180 183.5,190.5" }),
|
|
219
|
+
/* @__PURE__ */ jsx(Path, { fill: "none", stroke: INK, strokeWidth: 4.2, strokeLinecap: "round", d: "M200.5,190.5 Q207,180 213.5,190.5" })
|
|
220
|
+
] })), "eyes-happy")], "look"), layer({
|
|
221
|
+
opacity: notHappy
|
|
222
|
+
}, art(/* @__PURE__ */ jsx(Path, { fill: "none", stroke: INK, strokeWidth: 3.8, strokeLinecap: "round", d: "M184.5,207.5 Q192,215 199.5,207.5" })), "smile"), layer({
|
|
223
|
+
opacity: v.happy
|
|
224
|
+
}, art(/* @__PURE__ */ jsx(Path, { fill: INK, d: "M183,206 Q192,221 201,206 Z" })), "grin")], "features")
|
|
225
|
+
], "head"), layer({
|
|
226
|
+
transform: [{
|
|
227
|
+
translateX: px(v.hatFollowX)
|
|
228
|
+
}, {
|
|
229
|
+
translateY: Animated.add(px(v.hatFollowY), hatNod.interpolate({
|
|
230
|
+
inputRange: [0, 1],
|
|
231
|
+
outputRange: [0, -1.6 * k]
|
|
232
|
+
}))
|
|
233
|
+
}]
|
|
234
|
+
}, layer({
|
|
235
|
+
transformOrigin: at(192, 157),
|
|
236
|
+
transform: [{
|
|
237
|
+
translateX: px(v.hatX)
|
|
238
|
+
}, {
|
|
239
|
+
translateY: px(v.hatY)
|
|
240
|
+
}, {
|
|
241
|
+
rotate: deg(v.hatRot)
|
|
242
|
+
}]
|
|
243
|
+
}, art(/* @__PURE__ */ jsxs(Fragment, { children: [
|
|
244
|
+
/* @__PURE__ */ jsx(Polygon, { fill: "#39C5EF", points: "217.45,118.82 166.48,118.82 191.97,75.53" }),
|
|
245
|
+
/* @__PURE__ */ jsx(Polygon, { fill: "#39C5EF", points: "240.18,157.43 143.75,157.43 160.01,129.82 223.92,129.82" })
|
|
246
|
+
] }))), "hat")]), "body")]))
|
|
247
|
+
] });
|
|
248
|
+
}
|
|
249
|
+
function useMascotDirector({
|
|
250
|
+
mode,
|
|
251
|
+
v,
|
|
252
|
+
awake,
|
|
253
|
+
breathe,
|
|
254
|
+
hatNod,
|
|
255
|
+
blink
|
|
256
|
+
}) {
|
|
257
|
+
useEffect(() => {
|
|
258
|
+
if (mode === "static") return void 0;
|
|
259
|
+
let disposed = false;
|
|
260
|
+
const timers = /* @__PURE__ */ new Set();
|
|
261
|
+
const running = /* @__PURE__ */ new Set();
|
|
262
|
+
const later = (fn, ms) => {
|
|
263
|
+
const id = setTimeout(() => {
|
|
264
|
+
timers.delete(id);
|
|
265
|
+
if (!disposed) fn();
|
|
266
|
+
}, ms);
|
|
267
|
+
timers.add(id);
|
|
268
|
+
};
|
|
269
|
+
const run = (animation, done) => {
|
|
270
|
+
running.add(animation);
|
|
271
|
+
animation.start(({
|
|
272
|
+
finished
|
|
273
|
+
}) => {
|
|
274
|
+
running.delete(animation);
|
|
275
|
+
if (finished && !disposed) done == null ? void 0 : done();
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
const rand = Math.random;
|
|
279
|
+
const startedAt = Date.now();
|
|
280
|
+
const active = () => AppState.currentState === "active";
|
|
281
|
+
let previous = null;
|
|
282
|
+
let isAwake = mode === "working";
|
|
283
|
+
let breathing = null;
|
|
284
|
+
const setAwake = (next) => {
|
|
285
|
+
isAwake = next;
|
|
286
|
+
run(Animated.timing(awake, {
|
|
287
|
+
toValue: next ? 1 : 0,
|
|
288
|
+
duration: WAKE_MS,
|
|
289
|
+
easing: next ? Easing.bezier(0.34, 1.56, 0.64, 1) : Easing.out(Easing.ease),
|
|
290
|
+
useNativeDriver: true
|
|
291
|
+
}));
|
|
292
|
+
breathing == null ? void 0 : breathing.stop();
|
|
293
|
+
breathing = null;
|
|
294
|
+
if (next) {
|
|
295
|
+
const body = breathingLoop(breathe);
|
|
296
|
+
const hat = breathingLoop(hatNod);
|
|
297
|
+
breathing = Animated.parallel([body, Animated.sequence([Animated.delay(140), hat])]);
|
|
298
|
+
breathing.start();
|
|
299
|
+
} else {
|
|
300
|
+
breathe.setValue(0);
|
|
301
|
+
hatNod.setValue(0);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
const play = (gesture, done) => {
|
|
305
|
+
previous = gesture;
|
|
306
|
+
const total = GESTURE_MS[gesture];
|
|
307
|
+
const tracks = GESTURE_TRACKS[gesture];
|
|
308
|
+
run(Animated.parallel(Object.keys(tracks).map((channel) => track(v[channel], tracks[channel], total))), done);
|
|
309
|
+
};
|
|
310
|
+
const blinkLoop = () => later(() => {
|
|
311
|
+
if (isAwake && active()) {
|
|
312
|
+
const half = {
|
|
313
|
+
duration: BLINK_MS / 2,
|
|
314
|
+
useNativeDriver: true
|
|
315
|
+
};
|
|
316
|
+
run(Animated.sequence([Animated.timing(blink, __spreadValues({
|
|
317
|
+
toValue: 0.08
|
|
318
|
+
}, half)), Animated.timing(blink, __spreadValues({
|
|
319
|
+
toValue: 1
|
|
320
|
+
}, half))]));
|
|
321
|
+
}
|
|
322
|
+
blinkLoop();
|
|
323
|
+
}, blinkGapMs(rand));
|
|
324
|
+
const start = () => {
|
|
325
|
+
blinkLoop();
|
|
326
|
+
if (mode === "working") {
|
|
327
|
+
setAwake(true);
|
|
328
|
+
const next = () => later(() => {
|
|
329
|
+
if (!active()) return next();
|
|
330
|
+
play(pickWorkingGesture(previous, Date.now() - startedAt, rand), next);
|
|
331
|
+
}, workingGapMs(rand));
|
|
332
|
+
next();
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const peek = () => {
|
|
336
|
+
if (active()) {
|
|
337
|
+
setAwake(true);
|
|
338
|
+
later(() => play(pickPeekGesture(previous, rand), () => later(() => setAwake(false), 450)), WAKE_MS);
|
|
339
|
+
}
|
|
340
|
+
later(peek, peekGapMs(rand));
|
|
341
|
+
};
|
|
342
|
+
later(peek, firstPeekMs(rand));
|
|
343
|
+
};
|
|
344
|
+
AccessibilityInfo.isReduceMotionEnabled().catch(() => false).then((reduce) => {
|
|
345
|
+
if (disposed) return;
|
|
346
|
+
if (reduce) {
|
|
347
|
+
awake.setValue(mode === "working" ? 1 : 0);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
start();
|
|
351
|
+
});
|
|
352
|
+
return () => {
|
|
353
|
+
disposed = true;
|
|
354
|
+
timers.forEach(clearTimeout);
|
|
355
|
+
running.forEach((animation) => animation.stop());
|
|
356
|
+
breathing == null ? void 0 : breathing.stop();
|
|
357
|
+
Object.keys(REST).forEach((channel) => v[channel].setValue(REST[channel]));
|
|
358
|
+
blink.setValue(1);
|
|
359
|
+
};
|
|
360
|
+
}, [mode, v, awake, breathe, hatNod, blink]);
|
|
361
|
+
}export{YantraMascot,YantraMascot as default};//# sourceMappingURL=YantraMascot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"YantraMascot.js","sources":["../../../src/components/mascot/YantraMascot.tsx"],"sourcesContent":["/**\n * The Yantra logo as a living character - native twin of the browser\n * components/mascot/YantraMascot. At rest it is the exact logo; awake, the round\n * hole in the yellow triangle closes into a face, the blue top becomes a hat and\n * the red/green corners become feet.\n *\n * - `working`: always awake, breathing, with a gesture every couple of seconds.\n * - `idle`: the plain logo that wakes for a moment every so often.\n * - `static`: the plain logo, no motion.\n *\n * Every moving part is its own full-size layer holding a slice of the mark, so\n * all motion is transform/opacity on the native driver - nothing re-renders\n * while it plays. Pivots are given in the logo's own coordinates.\n */\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { AccessibilityInfo, Animated, AppState, Easing, StyleSheet, View } from 'react-native';\nimport Svg, { Circle, Ellipse, Path, Polygon, Rect } from 'react-native-svg';\n\nimport {\n BLINK_MS,\n blinkGapMs,\n firstPeekMs,\n GESTURE_MS,\n type MascotGesture,\n peekGapMs,\n pickPeekGesture,\n pickWorkingGesture,\n WAKE_MS,\n workingGapMs,\n} from './mascotChoreography';\nimport { type Channel, type Ease, GESTURE_TRACKS, type Keyframe, REST, TRANSLATE_CHANNELS } from './mascotTracks';\n\nexport type MascotMode = 'working' | 'idle' | 'static';\n\nconst VB = { x: 78, y: 62, w: 228, h: 212 };\nconst VIEWBOX = `${VB.x} ${VB.y} ${VB.w} ${VB.h}`;\nconst INK = '#1d1a24';\n\nconst EASE: Record<Ease, (t: number) => number> = {\n inOut: Easing.inOut(Easing.ease),\n in: Easing.bezier(0.6, 0, 0.9, 0.45),\n out: Easing.bezier(0.2, 0.7, 0.3, 1),\n};\n\nexport interface YantraMascotProps {\n mode?: MascotMode;\n /** Width in px; the height follows the artwork. */\n size?: number;\n /** Ground shadow tint - pass the surrounding text colour so it reads in both themes. */\n shadowColor?: string;\n /** Accessible name. Without one the mascot is decorative. */\n title?: string;\n}\n\n/** One keyframe track as a chain of timings on a single value. */\nfunction track(value: Animated.Value, keyframes: readonly Keyframe[], totalMs: number) {\n const steps: Animated.CompositeAnimation[] = [];\n for (let i = 1; i < keyframes.length; i++) {\n const [from] = keyframes[i - 1];\n const [at, toValue, ease = 'inOut'] = keyframes[i];\n steps.push(\n Animated.timing(value, {\n toValue,\n duration: Math.max(0, (at - from) * totalMs),\n easing: EASE[ease],\n useNativeDriver: true,\n }),\n );\n }\n return Animated.sequence(steps);\n}\n\nfunction breathingLoop(value: Animated.Value) {\n const half = { duration: 1300, easing: Easing.inOut(Easing.ease), useNativeDriver: true };\n return Animated.loop(\n Animated.sequence([\n Animated.timing(value, { toValue: 1, ...half }),\n Animated.timing(value, { toValue: 0, ...half }),\n ]),\n );\n}\n\nexport function YantraMascot({ mode = 'working', size = 32, shadowColor = '#0f172a', title }: YantraMascotProps) {\n const k = size / VB.w;\n const height = Math.round(size * (VB.h / VB.w));\n\n const values = useRef<Record<Channel, Animated.Value> | null>(null);\n if (!values.current) {\n values.current = Object.fromEntries(\n (Object.keys(REST) as Channel[]).map((channel) => [channel, new Animated.Value(REST[channel])]),\n ) as Record<Channel, Animated.Value>;\n }\n const v = values.current;\n const awake = useRef(new Animated.Value(mode === 'working' ? 1 : 0)).current;\n const breathe = useRef(new Animated.Value(0)).current;\n const hatNod = useRef(new Animated.Value(0)).current;\n const blink = useRef(new Animated.Value(1)).current;\n\n useMascotDirector({ mode, v, awake, breathe, hatNod, blink });\n\n const layout = useMemo(() => {\n /** A point of the logo, in this layer's pixels - for transformOrigin. */\n const at = (x: number, y: number) => [(x - VB.x) * k, (y - VB.y) * k, 0];\n const px = (value: Animated.Value) => Animated.multiply(value, k);\n const deg = (value: Animated.Value) =>\n value.interpolate({ inputRange: [-360, 360], outputRange: ['-360deg', '360deg'] });\n const notHappy = Animated.subtract(1, v.happy);\n return { at, px, deg, notHappy };\n }, [k, v]);\n const { at, px, deg, notHappy } = layout;\n\n const layer = (style: object, children: React.ReactNode, key?: string) => (\n <Animated.View key={key} pointerEvents=\"none\" style={[StyleSheet.absoluteFill, style]}>\n {children}\n </Animated.View>\n );\n const art = (children: React.ReactNode) => (\n <Svg width={size} height={height} viewBox={VIEWBOX}>\n {children}\n </Svg>\n );\n const awakeClamped = awake.interpolate({ inputRange: [0, 1], outputRange: [0, 1], extrapolate: 'clamp' });\n\n return (\n <View\n style={{ width: size, height }}\n accessible={Boolean(title)}\n accessibilityRole={title ? 'image' : undefined}\n accessibilityLabel={title}\n accessibilityElementsHidden={!title}\n importantForAccessibility={title ? 'yes' : 'no-hide-descendants'}\n >\n {layer(\n {\n opacity: Animated.multiply(\n awake.interpolate({ inputRange: [0, 1], outputRange: [0, 0.13], extrapolate: 'clamp' }),\n v.shadowFade,\n ),\n transformOrigin: at(192, 261),\n transform: [{ scale: v.shadowScale }],\n },\n art(<Ellipse cx=\"192\" cy=\"261\" rx=\"98\" ry=\"4.5\" fill={shadowColor} />),\n )}\n {layer(\n { transform: [{ translateY: px(v.jumpY) }] },\n layer({ transformOrigin: at(192, 257), transform: [{ rotate: deg(v.sway) }] }, [\n layer(\n {\n transformOrigin: at(129.35, 256.89),\n transform: [{ translateY: px(v.footLY) }, { rotate: deg(v.footLRot) }],\n },\n art(<Polygon fill=\"#DF1E5B\" points=\"85.22,256.89 105.11,223.09 129.35,256.89\" />),\n 'foot-l',\n ),\n layer(\n {\n transformOrigin: at(254.57, 256.89),\n transform: [{ translateY: px(v.footRY) }, { rotate: deg(v.footRRot) }],\n },\n art(<Polygon fill=\"#31B57E\" points=\"298.71,256.89 254.57,256.89 278.82,223.09\" />),\n 'foot-r',\n ),\n layer(\n {\n transformOrigin: at(192, 257),\n transform: [\n { scaleX: breathe.interpolate({ inputRange: [0, 1], outputRange: [1, 0.992] }) },\n { scaleY: breathe.interpolate({ inputRange: [0, 1], outputRange: [1, 1.022] }) },\n ],\n },\n layer(\n {\n transformOrigin: at(192, 257),\n transform: [{ scaleX: v.squashX }, { scaleY: v.squashY }],\n },\n [\n layer(\n {},\n art(\n <>\n <Polygon\n fill=\"#DF1E5B\"\n points=\"182.27,256.89 142.89,256.89 111.22,212.73 128.56,183.26\"\n />\n <Polygon\n fill=\"#31B57E\"\n points=\"272.71,212.73 241.04,256.89 201.66,256.89 255.37,183.26\"\n />\n </>,\n ),\n 'legs',\n ),\n layer(\n {\n transform: [\n {\n translateY: breathe.interpolate({\n inputRange: [0, 1],\n outputRange: [0, -1.6 * k],\n }),\n },\n ],\n },\n [\n layer(\n {},\n art(\n <Path\n fill=\"#EAB12B\"\n fillRule=\"evenodd\"\n d=\"M246.64,168.43H137.28l-2.64,4.51l57.32,78.6l57.32-78.6L246.64,168.43z M191.96,208.5c-5.76,0-10.43-4.67-10.43-10.43c0-5.76,4.67-10.43,10.43-10.43c5.77,0,10.45,4.67,10.45,10.43C202.41,203.83,197.73,208.5,191.96,208.5z\"\n />,\n ),\n 'face',\n ),\n // Closes the logo's round \"eye\" while the face is showing.\n layer(\n {\n transformOrigin: at(191.96, 198.07),\n transform: [{ scale: awakeClamped }],\n },\n art(<Circle fill=\"#EAB12B\" cx=\"191.96\" cy=\"198.07\" r=\"11.2\" />),\n 'plug',\n ),\n layer(\n {\n opacity: awakeClamped,\n transformOrigin: at(192, 193),\n transform: [\n {\n scale: awake.interpolate({\n inputRange: [0, 1],\n outputRange: [0.35, 1],\n }),\n },\n ],\n },\n [\n layer(\n { opacity: v.happy },\n art(\n <>\n <Ellipse\n fill=\"#DF1E5B\"\n fillOpacity={0.42}\n cx=\"163.5\"\n cy=\"202.5\"\n rx=\"6.8\"\n ry=\"3.6\"\n />\n <Ellipse\n fill=\"#DF1E5B\"\n fillOpacity={0.42}\n cx=\"220.5\"\n cy=\"202.5\"\n rx=\"6.8\"\n ry=\"3.6\"\n />\n </>,\n ),\n 'blush',\n ),\n layer(\n {\n transform: [\n { translateX: px(v.lookX) },\n { translateY: px(v.lookY) },\n ],\n },\n [\n layer(\n {\n opacity: notHappy,\n transformOrigin: at(192, 187.5),\n transform: [{ scaleY: blink }],\n },\n art(\n <>\n <Rect\n fill={INK}\n x=\"170.5\"\n y=\"176\"\n width=\"13\"\n height=\"23\"\n rx=\"6.5\"\n />\n <Rect\n fill={INK}\n x=\"200.5\"\n y=\"176\"\n width=\"13\"\n height=\"23\"\n rx=\"6.5\"\n />\n </>,\n ),\n 'eyes',\n ),\n layer(\n { opacity: v.happy },\n art(\n <>\n <Path\n fill=\"none\"\n stroke={INK}\n strokeWidth={4.2}\n strokeLinecap=\"round\"\n d=\"M170.5,190.5 Q177,180 183.5,190.5\"\n />\n <Path\n fill=\"none\"\n stroke={INK}\n strokeWidth={4.2}\n strokeLinecap=\"round\"\n d=\"M200.5,190.5 Q207,180 213.5,190.5\"\n />\n </>,\n ),\n 'eyes-happy',\n ),\n ],\n 'look',\n ),\n layer(\n { opacity: notHappy },\n art(\n <Path\n fill=\"none\"\n stroke={INK}\n strokeWidth={3.8}\n strokeLinecap=\"round\"\n d=\"M184.5,207.5 Q192,215 199.5,207.5\"\n />,\n ),\n 'smile',\n ),\n layer(\n { opacity: v.happy },\n art(<Path fill={INK} d=\"M183,206 Q192,221 201,206 Z\" />),\n 'grin',\n ),\n ],\n 'features',\n ),\n ],\n 'head',\n ),\n layer(\n {\n transform: [\n { translateX: px(v.hatFollowX) },\n {\n translateY: Animated.add(\n px(v.hatFollowY),\n hatNod.interpolate({\n inputRange: [0, 1],\n outputRange: [0, -1.6 * k],\n }),\n ),\n },\n ],\n },\n layer(\n {\n transformOrigin: at(192, 157),\n transform: [\n { translateX: px(v.hatX) },\n { translateY: px(v.hatY) },\n { rotate: deg(v.hatRot) },\n ],\n },\n art(\n <>\n <Polygon\n fill=\"#39C5EF\"\n points=\"217.45,118.82 166.48,118.82 191.97,75.53\"\n />\n <Polygon\n fill=\"#39C5EF\"\n points=\"240.18,157.43 143.75,157.43 160.01,129.82 223.92,129.82\"\n />\n </>,\n ),\n ),\n 'hat',\n ),\n ],\n ),\n 'body',\n ),\n ]),\n )}\n </View>\n );\n}\n\ninterface DirectorArgs {\n mode: MascotMode;\n v: Record<Channel, Animated.Value>;\n awake: Animated.Value;\n breathe: Animated.Value;\n hatNod: Animated.Value;\n blink: Animated.Value;\n}\n\n/** Schedules wake-ups, blinks and gestures - the same rhythm as the web director. */\nfunction useMascotDirector({ mode, v, awake, breathe, hatNod, blink }: DirectorArgs) {\n useEffect(() => {\n if (mode === 'static') return undefined;\n let disposed = false;\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const running = new Set<Animated.CompositeAnimation>();\n const later = (fn: () => void, ms: number) => {\n const id = setTimeout(() => {\n timers.delete(id);\n if (!disposed) fn();\n }, ms);\n timers.add(id);\n };\n const run = (animation: Animated.CompositeAnimation, done?: () => void) => {\n running.add(animation);\n animation.start(({ finished }) => {\n running.delete(animation);\n if (finished && !disposed) done?.();\n });\n };\n const rand = Math.random;\n const startedAt = Date.now();\n const active = () => AppState.currentState === 'active';\n let previous: MascotGesture | null = null;\n let isAwake = mode === 'working';\n let breathing: Animated.CompositeAnimation | null = null;\n\n const setAwake = (next: boolean) => {\n isAwake = next;\n run(\n Animated.timing(awake, {\n toValue: next ? 1 : 0,\n duration: WAKE_MS,\n easing: next ? Easing.bezier(0.34, 1.56, 0.64, 1) : Easing.out(Easing.ease),\n useNativeDriver: true,\n }),\n );\n breathing?.stop();\n breathing = null;\n if (next) {\n const body = breathingLoop(breathe);\n const hat = breathingLoop(hatNod);\n breathing = Animated.parallel([body, Animated.sequence([Animated.delay(140), hat])]);\n breathing.start();\n } else {\n breathe.setValue(0);\n hatNod.setValue(0);\n }\n };\n\n const play = (gesture: MascotGesture, done: () => void) => {\n previous = gesture;\n const total = GESTURE_MS[gesture];\n const tracks = GESTURE_TRACKS[gesture];\n run(\n Animated.parallel(\n (Object.keys(tracks) as Channel[]).map((channel) => track(v[channel], tracks[channel]!, total)),\n ),\n done,\n );\n };\n\n const blinkLoop = () =>\n later(() => {\n if (isAwake && active()) {\n const half = { duration: BLINK_MS / 2, useNativeDriver: true };\n run(\n Animated.sequence([\n Animated.timing(blink, { toValue: 0.08, ...half }),\n Animated.timing(blink, { toValue: 1, ...half }),\n ]),\n );\n }\n blinkLoop();\n }, blinkGapMs(rand));\n\n const start = () => {\n blinkLoop();\n if (mode === 'working') {\n setAwake(true);\n const next = () =>\n later(() => {\n if (!active()) return next();\n play(pickWorkingGesture(previous, Date.now() - startedAt, rand), next);\n }, workingGapMs(rand));\n next();\n return;\n }\n const peek = () => {\n if (active()) {\n setAwake(true);\n later(\n () => play(pickPeekGesture(previous, rand), () => later(() => setAwake(false), 450)),\n WAKE_MS,\n );\n }\n later(peek, peekGapMs(rand));\n };\n later(peek, firstPeekMs(rand));\n };\n\n // Reduced motion keeps the face (while working) but drops every movement.\n AccessibilityInfo.isReduceMotionEnabled()\n .catch(() => false)\n .then((reduce) => {\n if (disposed) return;\n if (reduce) {\n awake.setValue(mode === 'working' ? 1 : 0);\n return;\n }\n start();\n });\n\n return () => {\n disposed = true;\n timers.forEach(clearTimeout);\n running.forEach((animation) => animation.stop());\n breathing?.stop();\n (Object.keys(REST) as Channel[]).forEach((channel) => v[channel].setValue(REST[channel]));\n blink.setValue(1);\n };\n }, [mode, v, awake, breathe, hatNod, blink]);\n}\n\nexport default YantraMascot;\n"],"names":["at","px","deg","notHappy"],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const GESTURE_MS = {
|
|
21
|
+
glance: 1700,
|
|
22
|
+
think: 1900,
|
|
23
|
+
tap: 1400,
|
|
24
|
+
hop: 900,
|
|
25
|
+
tip: 1500,
|
|
26
|
+
dance: 2200
|
|
27
|
+
};
|
|
28
|
+
const BLINK_MS = 180;
|
|
29
|
+
const WAKE_MS = 320;
|
|
30
|
+
const WORKING_WEIGHTS = {
|
|
31
|
+
glance: 3,
|
|
32
|
+
think: 2.5,
|
|
33
|
+
tap: 2.5,
|
|
34
|
+
hop: 1.5,
|
|
35
|
+
tip: 1
|
|
36
|
+
};
|
|
37
|
+
const LONG_WAIT_MS = 12e3;
|
|
38
|
+
const LONG_WAIT_WEIGHTS = __spreadProps(__spreadValues({}, WORKING_WEIGHTS), {
|
|
39
|
+
dance: 1.5
|
|
40
|
+
});
|
|
41
|
+
const PEEK_WEIGHTS = {
|
|
42
|
+
glance: 3,
|
|
43
|
+
tip: 2,
|
|
44
|
+
hop: 1
|
|
45
|
+
};
|
|
46
|
+
function between(rand, min, max) {
|
|
47
|
+
return Math.round(min + rand() * (max - min));
|
|
48
|
+
}
|
|
49
|
+
function pickWeighted(weights, exclude, rand) {
|
|
50
|
+
const entries = Object.entries(weights).filter(([gesture, weight]) => weight > 0 && gesture !== exclude);
|
|
51
|
+
const total = entries.reduce((sum, [, weight]) => sum + weight, 0);
|
|
52
|
+
let roll = rand() * total;
|
|
53
|
+
for (const [gesture, weight] of entries) {
|
|
54
|
+
roll -= weight;
|
|
55
|
+
if (roll < 0) return gesture;
|
|
56
|
+
}
|
|
57
|
+
return entries[entries.length - 1][0];
|
|
58
|
+
}
|
|
59
|
+
function pickWorkingGesture(previous, elapsedMs, rand) {
|
|
60
|
+
return pickWeighted(elapsedMs >= LONG_WAIT_MS ? LONG_WAIT_WEIGHTS : WORKING_WEIGHTS, previous, rand);
|
|
61
|
+
}
|
|
62
|
+
function pickPeekGesture(previous, rand) {
|
|
63
|
+
return pickWeighted(PEEK_WEIGHTS, previous, rand);
|
|
64
|
+
}
|
|
65
|
+
function workingGapMs(rand) {
|
|
66
|
+
return between(rand, 1400, 2800);
|
|
67
|
+
}
|
|
68
|
+
function blinkGapMs(rand) {
|
|
69
|
+
return between(rand, 2200, 5200);
|
|
70
|
+
}
|
|
71
|
+
function firstPeekMs(rand) {
|
|
72
|
+
return between(rand, 2500, 5e3);
|
|
73
|
+
}
|
|
74
|
+
function peekGapMs(rand) {
|
|
75
|
+
return between(rand, 2e4, 4e4);
|
|
76
|
+
}export{BLINK_MS,GESTURE_MS,WAKE_MS,blinkGapMs,firstPeekMs,peekGapMs,pickPeekGesture,pickWorkingGesture,workingGapMs};//# sourceMappingURL=mascotChoreography.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mascotChoreography.js","sources":["../../../src/components/mascot/mascotChoreography.ts"],"sourcesContent":["/**\n * Timing and gesture choice for the Yantra mascot - the logo come to life.\n * Mirror of browser/src/components/mascot/mascotChoreography.ts; change both together.\n *\n * The mark reads as a little character: the blue top is a hat, the yellow\n * triangle a face (its round hole closes and two eyes open), the red and green\n * corners are feet. Pure logic, no DOM: the web component and the native port\n * both drive their own renderers from these tables, so the two move alike.\n */\n\nexport type MascotGesture = 'glance' | 'think' | 'tap' | 'hop' | 'tip' | 'dance';\n\n/** Run length of each gesture; the renderer clears it once this elapses. */\nexport const GESTURE_MS: Record<MascotGesture, number> = {\n glance: 1700,\n think: 1900,\n tap: 1400,\n hop: 900,\n tip: 1500,\n dance: 2200,\n};\n\nexport const BLINK_MS = 180;\n\n/** Face fade in/out when an idle logo wakes up or goes back to being the mark. */\nexport const WAKE_MS = 320;\n\ntype Weights = Partial<Record<MascotGesture, number>>;\n\n/** While the assistant works: mostly calm busy-ness, now and then a flourish. */\nconst WORKING_WEIGHTS: Weights = { glance: 3, think: 2.5, tap: 2.5, hop: 1.5, tip: 1 };\n\n/** A long wait earns a dance, so a slow turn still feels like it is moving. */\nconst LONG_WAIT_MS = 12000;\nconst LONG_WAIT_WEIGHTS: Weights = { ...WORKING_WEIGHTS, dance: 1.5 };\n\n/** A resting logo that wakes up only says hello: a look around or a hat tip. */\nconst PEEK_WEIGHTS: Weights = { glance: 3, tip: 2, hop: 1 };\n\nexport type Random = () => number;\n\nfunction between(rand: Random, min: number, max: number): number {\n return Math.round(min + rand() * (max - min));\n}\n\nfunction pickWeighted(weights: Weights, exclude: MascotGesture | null, rand: Random): MascotGesture {\n const entries = (Object.entries(weights) as [MascotGesture, number][]).filter(\n ([gesture, weight]) => weight > 0 && gesture !== exclude,\n );\n const total = entries.reduce((sum, [, weight]) => sum + weight, 0);\n let roll = rand() * total;\n for (const [gesture, weight] of entries) {\n roll -= weight;\n if (roll < 0) return gesture;\n }\n return entries[entries.length - 1][0];\n}\n\n/** Next working gesture; never the same one twice in a row. */\nexport function pickWorkingGesture(previous: MascotGesture | null, elapsedMs: number, rand: Random): MascotGesture {\n return pickWeighted(elapsedMs >= LONG_WAIT_MS ? LONG_WAIT_WEIGHTS : WORKING_WEIGHTS, previous, rand);\n}\n\nexport function pickPeekGesture(previous: MascotGesture | null, rand: Random): MascotGesture {\n return pickWeighted(PEEK_WEIGHTS, previous, rand);\n}\n\n/** Pause between working gestures: long enough to read as a rhythm, not a fidget. */\nexport function workingGapMs(rand: Random): number {\n return between(rand, 1400, 2800);\n}\n\n/** Time until the next blink - people blink every few seconds, never on a beat. */\nexport function blinkGapMs(rand: Random): number {\n return between(rand, 2200, 5200);\n}\n\n/** Delay before an idle logo peeks, and between peeks after that. */\nexport function firstPeekMs(rand: Random): number {\n return between(rand, 2500, 5000);\n}\n\n/** Rare on purpose: a logo that fidgets while someone reads is a distraction, not a delight. */\nexport function peekGapMs(rand: Random): number {\n return between(rand, 20000, 40000);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAaO,MAAM,UAA4C,GAAA;AAAA,EACvD,MAAQ,EAAA,IAAA;AAAA,EACR,KAAO,EAAA,IAAA;AAAA,EACP,GAAK,EAAA,IAAA;AAAA,EACL,GAAK,EAAA,GAAA;AAAA,EACL,GAAK,EAAA,IAAA;AAAA,EACL,KAAO,EAAA;AACT;AACO,MAAM,QAAW,GAAA;AAGjB,MAAM,OAAU,GAAA;AAIvB,MAAM,eAA2B,GAAA;AAAA,EAC/B,MAAQ,EAAA,CAAA;AAAA,EACR,KAAO,EAAA,GAAA;AAAA,EACP,GAAK,EAAA,GAAA;AAAA,EACL,GAAK,EAAA,GAAA;AAAA,EACL,GAAK,EAAA;AACP,CAAA;AAGA,MAAM,YAAe,GAAA,IAAA;AACrB,MAAM,iBAAA,GAA6B,iCAC9B,eAD8B,CAAA,EAAA;AAAA,EAEjC,KAAO,EAAA;AACT,CAAA,CAAA;AAGA,MAAM,YAAwB,GAAA;AAAA,EAC5B,MAAQ,EAAA,CAAA;AAAA,EACR,GAAK,EAAA,CAAA;AAAA,EACL,GAAK,EAAA;AACP,CAAA;AAEA,SAAS,OAAA,CAAQ,IAAc,EAAA,GAAA,EAAa,GAAqB,EAAA;AAC/D,EAAA,OAAO,KAAK,KAAM,CAAA,GAAA,GAAM,IAAK,EAAA,IAAK,MAAM,GAAI,CAAA,CAAA;AAC9C;AACA,SAAS,YAAA,CAAa,OAAkB,EAAA,OAAA,EAA+B,IAA6B,EAAA;AAClG,EAAA,MAAM,OAAW,GAAA,MAAA,CAAO,OAAQ,CAAA,OAAO,EAAgC,MAAO,CAAA,CAAC,CAAC,OAAA,EAAS,MAAM,CAAA,KAAM,MAAS,GAAA,CAAA,IAAK,YAAY,OAAO,CAAA;AACtI,EAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,GAAG,MAAM,CAAA,KAAM,GAAM,GAAA,MAAA,EAAQ,CAAC,CAAA;AACjE,EAAI,IAAA,IAAA,GAAO,MAAS,GAAA,KAAA;AACpB,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,CAAA,IAAK,OAAS,EAAA;AACvC,IAAQ,IAAA,IAAA,MAAA;AACR,IAAI,IAAA,IAAA,GAAO,GAAU,OAAA,OAAA;AAAA;AAEvB,EAAA,OAAO,OAAQ,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAC,EAAE,CAAC,CAAA;AACtC;AAGgB,SAAA,kBAAA,CAAmB,QAAgC,EAAA,SAAA,EAAmB,IAA6B,EAAA;AACjH,EAAA,OAAO,aAAa,SAAa,IAAA,YAAA,GAAe,iBAAoB,GAAA,eAAA,EAAiB,UAAU,IAAI,CAAA;AACrG;AACgB,SAAA,eAAA,CAAgB,UAAgC,IAA6B,EAAA;AAC3F,EAAO,OAAA,YAAA,CAAa,YAAc,EAAA,QAAA,EAAU,IAAI,CAAA;AAClD;AAGO,SAAS,aAAa,IAAsB,EAAA;AACjD,EAAO,OAAA,OAAA,CAAQ,IAAM,EAAA,IAAA,EAAM,IAAI,CAAA;AACjC;AAGO,SAAS,WAAW,IAAsB,EAAA;AAC/C,EAAO,OAAA,OAAA,CAAQ,IAAM,EAAA,IAAA,EAAM,IAAI,CAAA;AACjC;AAGO,SAAS,YAAY,IAAsB,EAAA;AAChD,EAAO,OAAA,OAAA,CAAQ,IAAM,EAAA,IAAA,EAAM,GAAI,CAAA;AACjC;AAGO,SAAS,UAAU,IAAsB,EAAA;AAC9C,EAAO,OAAA,OAAA,CAAQ,IAAM,EAAA,GAAA,EAAO,GAAK,CAAA;AACnC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const REST = {
|
|
2
|
+
jumpY: 0,
|
|
3
|
+
sway: 0,
|
|
4
|
+
squashX: 1,
|
|
5
|
+
squashY: 1,
|
|
6
|
+
hatX: 0,
|
|
7
|
+
hatY: 0,
|
|
8
|
+
hatRot: 0,
|
|
9
|
+
hatFollowX: 0,
|
|
10
|
+
hatFollowY: 0,
|
|
11
|
+
footLY: 0,
|
|
12
|
+
footLRot: 0,
|
|
13
|
+
footRY: 0,
|
|
14
|
+
footRRot: 0,
|
|
15
|
+
lookX: 0,
|
|
16
|
+
lookY: 0,
|
|
17
|
+
happy: 0,
|
|
18
|
+
shadowScale: 1,
|
|
19
|
+
shadowFade: 1
|
|
20
|
+
};
|
|
21
|
+
const HAPPY = [[0, 0], [0.12, 0], [0.2, 1], [0.8, 1], [0.88, 0], [1, 0]];
|
|
22
|
+
const DANCE_BOUNCE = Array.from({
|
|
23
|
+
length: 17
|
|
24
|
+
}, (_, i) => [i / 16, i % 2 ? -8 : 0]);
|
|
25
|
+
const GESTURE_TRACKS = {
|
|
26
|
+
glance: {
|
|
27
|
+
lookX: [[0, 0], [0.16, -8], [0.42, -8], [0.58, 8], [0.84, 8], [1, 0]],
|
|
28
|
+
lookY: [[0, 0], [0.16, -1.5], [0.84, -1.5], [1, 0]],
|
|
29
|
+
sway: [[0, 0], [0.16, -2], [0.42, -2], [0.58, 2], [0.84, 2], [1, 0]]
|
|
30
|
+
},
|
|
31
|
+
think: {
|
|
32
|
+
lookX: [[0, 0], [0.18, 6], [0.82, 6], [1, 0]],
|
|
33
|
+
lookY: [[0, 0], [0.18, -3.5], [0.82, -3.5], [1, 0]],
|
|
34
|
+
hatY: [[0, 0], [0.22, -2], [0.78, -2], [1, 0]],
|
|
35
|
+
hatRot: [[0, 0], [0.22, 6], [0.78, 6], [1, 0]],
|
|
36
|
+
sway: [[0, 0], [0.22, 1.6], [0.78, 1.6], [1, 0]]
|
|
37
|
+
},
|
|
38
|
+
tap: {
|
|
39
|
+
footLY: [[0, 0], [0.12, -6], [0.24, 0], [0.5, 0], [0.62, -6], [0.74, 0], [1, 0]],
|
|
40
|
+
footLRot: [[0, 0], [0.12, 6], [0.24, 0], [0.5, 0], [0.62, 6], [0.74, 0], [1, 0]],
|
|
41
|
+
footRY: [[0, 0], [0.25, 0], [0.37, -6], [0.49, 0], [0.75, 0], [0.87, -6], [0.99, 0], [1, 0]],
|
|
42
|
+
footRRot: [[0, 0], [0.25, 0], [0.37, -6], [0.49, 0], [0.75, 0], [0.87, -6], [0.99, 0], [1, 0]],
|
|
43
|
+
sway: [[0, 0], [0.12, -1.6], [0.37, 1.6], [0.62, -1.6], [0.87, 1.6], [1, 0]],
|
|
44
|
+
lookY: [[0, 0], [0.12, 3], [0.88, 3], [1, 0]]
|
|
45
|
+
},
|
|
46
|
+
hop: {
|
|
47
|
+
jumpY: [[0, 0], [0.16, 0], [0.46, -26, "out"], [0.74, 0, "in"], [1, 0]],
|
|
48
|
+
squashX: [[0, 1], [0.14, 1.07], [0.28, 0.95], [0.46, 1], [0.76, 1.08], [0.88, 0.98], [1, 1]],
|
|
49
|
+
squashY: [[0, 1], [0.14, 0.88], [0.28, 1.08], [0.46, 1], [0.76, 0.88], [0.88, 1.03], [1, 1]],
|
|
50
|
+
hatFollowY: [[0, 0], [0.14, 3], [0.3, 6], [0.52, -7], [0.74, -4], [0.86, 3], [1, 0]],
|
|
51
|
+
shadowScale: [[0, 1], [0.16, 1], [0.46, 0.6, "out"], [0.74, 1, "in"], [1, 1]],
|
|
52
|
+
shadowFade: [[0, 1], [0.16, 1], [0.46, 0.55, "out"], [0.74, 1, "in"], [1, 1]],
|
|
53
|
+
happy: HAPPY
|
|
54
|
+
},
|
|
55
|
+
tip: {
|
|
56
|
+
hatX: [[0, 0], [0.22, -2], [0.62, -2], [0.82, 0], [1, 0]],
|
|
57
|
+
hatY: [[0, 0], [0.22, -19], [0.3, -16], [0.46, -17], [0.62, -16], [0.82, 2], [0.91, -1], [1, 0]],
|
|
58
|
+
hatRot: [[0, 0], [0.22, -15], [0.3, -11], [0.46, -13], [0.62, -11], [0.82, 1], [0.91, 0], [1, 0]],
|
|
59
|
+
sway: [[0, 0], [0.22, -2.5], [0.66, -2.5], [1, 0]],
|
|
60
|
+
happy: HAPPY
|
|
61
|
+
},
|
|
62
|
+
dance: {
|
|
63
|
+
sway: [[0, 0], [0.125, -6], [0.25, 0], [0.375, 6], [0.5, 0], [0.625, -6], [0.75, 0], [0.875, 6], [1, 0]],
|
|
64
|
+
jumpY: DANCE_BOUNCE,
|
|
65
|
+
footLY: [[0, 0], [0.25, 0], [0.375, -5], [0.5, 0], [0.75, 0], [0.875, -5], [1, 0]],
|
|
66
|
+
footLRot: [[0, 0], [0.25, 0], [0.375, 8], [0.5, 0], [0.75, 0], [0.875, 8], [1, 0]],
|
|
67
|
+
footRY: [[0, 0], [0.125, -5], [0.25, 0], [0.5, 0], [0.625, -5], [0.75, 0], [1, 0]],
|
|
68
|
+
footRRot: [[0, 0], [0.125, -8], [0.25, 0], [0.5, 0], [0.625, -8], [0.75, 0], [1, 0]],
|
|
69
|
+
hatFollowX: [[0, 0], [0.125, 3], [0.25, 0], [0.375, -3], [0.5, 0], [0.625, 3], [0.75, 0], [0.875, -3], [1, 0]],
|
|
70
|
+
happy: HAPPY
|
|
71
|
+
}
|
|
72
|
+
};export{GESTURE_TRACKS,REST};//# sourceMappingURL=mascotTracks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mascotTracks.js","sources":["../../../src/components/mascot/mascotTracks.ts"],"sourcesContent":["/**\n * The mascot's gestures as keyframe tracks - the native twin of the @keyframes in\n * browser/src/components/mascot/yantraMascotCss.ts, so a hop on the phone is the\n * hop on the web. Each channel drives one transform of one layer.\n *\n * A keyframe is [at (0..1 of the gesture), value, easing of the segment that ends\n * here]. Translations are in the logo's own units (the renderer scales them to\n * pixels), rotations in degrees, scales as factors. Every track starts and ends\n * at its channel's rest value, so gestures chain without a jump.\n */\n\nimport type { MascotGesture } from './mascotChoreography';\n\nexport type Channel =\n | 'jumpY'\n | 'sway'\n | 'squashX'\n | 'squashY'\n | 'hatX'\n | 'hatY'\n | 'hatRot'\n | 'hatFollowX'\n | 'hatFollowY'\n | 'footLY'\n | 'footLRot'\n | 'footRY'\n | 'footRRot'\n | 'lookX'\n | 'lookY'\n | 'happy'\n | 'shadowScale'\n | 'shadowFade';\n\nexport type Ease = 'inOut' | 'in' | 'out';\nexport type Keyframe = readonly [at: number, value: number, ease?: Ease];\nexport type Tracks = Partial<Record<Channel, readonly Keyframe[]>>;\n\nexport const REST: Record<Channel, number> = {\n jumpY: 0,\n sway: 0,\n squashX: 1,\n squashY: 1,\n hatX: 0,\n hatY: 0,\n hatRot: 0,\n hatFollowX: 0,\n hatFollowY: 0,\n footLY: 0,\n footLRot: 0,\n footRY: 0,\n footRRot: 0,\n lookX: 0,\n lookY: 0,\n happy: 0,\n shadowScale: 1,\n shadowFade: 1,\n};\n\n/** Channels whose values are logo units and must be scaled to pixels. */\nexport const TRANSLATE_CHANNELS: ReadonlySet<Channel> = new Set([\n 'jumpY',\n 'hatX',\n 'hatY',\n 'hatFollowX',\n 'hatFollowY',\n 'footLY',\n 'footRY',\n 'lookX',\n 'lookY',\n]);\n\n/** Happy face (^^ eyes, blush, grin) through the middle of a gesture. */\nconst HAPPY: readonly Keyframe[] = [\n [0, 0],\n [0.12, 0],\n [0.2, 1],\n [0.8, 1],\n [0.88, 0],\n [1, 0],\n];\n\n/** A beat every eighth of the dance: down on the quarter marks, up between them. */\nconst DANCE_BOUNCE: readonly Keyframe[] = Array.from({ length: 17 }, (_, i) => [i / 16, i % 2 ? -8 : 0] as const);\n\nexport const GESTURE_TRACKS: Record<MascotGesture, Tracks> = {\n glance: {\n lookX: [\n [0, 0],\n [0.16, -8],\n [0.42, -8],\n [0.58, 8],\n [0.84, 8],\n [1, 0],\n ],\n lookY: [\n [0, 0],\n [0.16, -1.5],\n [0.84, -1.5],\n [1, 0],\n ],\n sway: [\n [0, 0],\n [0.16, -2],\n [0.42, -2],\n [0.58, 2],\n [0.84, 2],\n [1, 0],\n ],\n },\n think: {\n lookX: [\n [0, 0],\n [0.18, 6],\n [0.82, 6],\n [1, 0],\n ],\n lookY: [\n [0, 0],\n [0.18, -3.5],\n [0.82, -3.5],\n [1, 0],\n ],\n hatY: [\n [0, 0],\n [0.22, -2],\n [0.78, -2],\n [1, 0],\n ],\n hatRot: [\n [0, 0],\n [0.22, 6],\n [0.78, 6],\n [1, 0],\n ],\n sway: [\n [0, 0],\n [0.22, 1.6],\n [0.78, 1.6],\n [1, 0],\n ],\n },\n tap: {\n footLY: [\n [0, 0],\n [0.12, -6],\n [0.24, 0],\n [0.5, 0],\n [0.62, -6],\n [0.74, 0],\n [1, 0],\n ],\n footLRot: [\n [0, 0],\n [0.12, 6],\n [0.24, 0],\n [0.5, 0],\n [0.62, 6],\n [0.74, 0],\n [1, 0],\n ],\n footRY: [\n [0, 0],\n [0.25, 0],\n [0.37, -6],\n [0.49, 0],\n [0.75, 0],\n [0.87, -6],\n [0.99, 0],\n [1, 0],\n ],\n footRRot: [\n [0, 0],\n [0.25, 0],\n [0.37, -6],\n [0.49, 0],\n [0.75, 0],\n [0.87, -6],\n [0.99, 0],\n [1, 0],\n ],\n sway: [\n [0, 0],\n [0.12, -1.6],\n [0.37, 1.6],\n [0.62, -1.6],\n [0.87, 1.6],\n [1, 0],\n ],\n lookY: [\n [0, 0],\n [0.12, 3],\n [0.88, 3],\n [1, 0],\n ],\n },\n hop: {\n jumpY: [\n [0, 0],\n [0.16, 0],\n [0.46, -26, 'out'],\n [0.74, 0, 'in'],\n [1, 0],\n ],\n squashX: [\n [0, 1],\n [0.14, 1.07],\n [0.28, 0.95],\n [0.46, 1],\n [0.76, 1.08],\n [0.88, 0.98],\n [1, 1],\n ],\n squashY: [\n [0, 1],\n [0.14, 0.88],\n [0.28, 1.08],\n [0.46, 1],\n [0.76, 0.88],\n [0.88, 1.03],\n [1, 1],\n ],\n hatFollowY: [\n [0, 0],\n [0.14, 3],\n [0.3, 6],\n [0.52, -7],\n [0.74, -4],\n [0.86, 3],\n [1, 0],\n ],\n shadowScale: [\n [0, 1],\n [0.16, 1],\n [0.46, 0.6, 'out'],\n [0.74, 1, 'in'],\n [1, 1],\n ],\n shadowFade: [\n [0, 1],\n [0.16, 1],\n [0.46, 0.55, 'out'],\n [0.74, 1, 'in'],\n [1, 1],\n ],\n happy: HAPPY,\n },\n tip: {\n hatX: [\n [0, 0],\n [0.22, -2],\n [0.62, -2],\n [0.82, 0],\n [1, 0],\n ],\n hatY: [\n [0, 0],\n [0.22, -19],\n [0.3, -16],\n [0.46, -17],\n [0.62, -16],\n [0.82, 2],\n [0.91, -1],\n [1, 0],\n ],\n hatRot: [\n [0, 0],\n [0.22, -15],\n [0.3, -11],\n [0.46, -13],\n [0.62, -11],\n [0.82, 1],\n [0.91, 0],\n [1, 0],\n ],\n sway: [\n [0, 0],\n [0.22, -2.5],\n [0.66, -2.5],\n [1, 0],\n ],\n happy: HAPPY,\n },\n dance: {\n sway: [\n [0, 0],\n [0.125, -6],\n [0.25, 0],\n [0.375, 6],\n [0.5, 0],\n [0.625, -6],\n [0.75, 0],\n [0.875, 6],\n [1, 0],\n ],\n jumpY: DANCE_BOUNCE,\n footLY: [\n [0, 0],\n [0.25, 0],\n [0.375, -5],\n [0.5, 0],\n [0.75, 0],\n [0.875, -5],\n [1, 0],\n ],\n footLRot: [\n [0, 0],\n [0.25, 0],\n [0.375, 8],\n [0.5, 0],\n [0.75, 0],\n [0.875, 8],\n [1, 0],\n ],\n footRY: [\n [0, 0],\n [0.125, -5],\n [0.25, 0],\n [0.5, 0],\n [0.625, -5],\n [0.75, 0],\n [1, 0],\n ],\n footRRot: [\n [0, 0],\n [0.125, -8],\n [0.25, 0],\n [0.5, 0],\n [0.625, -8],\n [0.75, 0],\n [1, 0],\n ],\n hatFollowX: [\n [0, 0],\n [0.125, 3],\n [0.25, 0],\n [0.375, -3],\n [0.5, 0],\n [0.625, 3],\n [0.75, 0],\n [0.875, -3],\n [1, 0],\n ],\n happy: HAPPY,\n },\n};\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.80-alpha.0",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"uuid": "^9.0.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"common": "
|
|
29
|
+
"common": "12.0.80-alpha.0",
|
|
30
30
|
"libphonenumber-js": "^1.13.3"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@messenger-box/platform-mobile": "*",
|
|
44
44
|
"@react-native-async-storage/async-storage": "*",
|
|
45
45
|
"@react-navigation/native": "*",
|
|
46
|
-
"common": "12.0.
|
|
46
|
+
"common": "12.0.79-alpha.1",
|
|
47
47
|
"expo-constants": "*",
|
|
48
48
|
"expo-secure-store": "*",
|
|
49
49
|
"expo-web-browser": "*",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"react-native-keyboard-controller": "*",
|
|
53
53
|
"react-native-reanimated": "*",
|
|
54
54
|
"react-native-safe-area-context": "*",
|
|
55
|
+
"react-native-svg": "*",
|
|
55
56
|
"react-native-webview": "*"
|
|
56
57
|
},
|
|
57
58
|
"publishConfig": {
|
|
@@ -60,5 +61,5 @@
|
|
|
60
61
|
"typescript": {
|
|
61
62
|
"definition": "lib/index.d.ts"
|
|
62
63
|
},
|
|
63
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "f5fb2d3c71393576df74bd788a60ffe15b4043ba"
|
|
64
65
|
}
|