react-native-ai-animations 0.0.0-stage → 0.8.1
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/LICENSE +21 -0
- package/README.md +226 -2
- package/lib/module/brand/index.js +4 -0
- package/lib/module/brand/index.js.map +1 -0
- package/lib/module/brand/spinning-mark.js +96 -0
- package/lib/module/brand/spinning-mark.js.map +1 -0
- package/lib/module/chat/effort-bar.js +853 -0
- package/lib/module/chat/effort-bar.js.map +1 -0
- package/lib/module/chat/index.js +8 -0
- package/lib/module/chat/index.js.map +1 -0
- package/lib/module/chat/question-card.js +720 -0
- package/lib/module/chat/question-card.js.map +1 -0
- package/lib/module/chat/reasoning.js +38 -0
- package/lib/module/chat/reasoning.js.map +1 -0
- package/lib/module/chat/status-row.js +140 -0
- package/lib/module/chat/status-row.js.map +1 -0
- package/lib/module/chat/thinking-block.js +255 -0
- package/lib/module/chat/thinking-block.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/internal/color.js +15 -0
- package/lib/module/internal/color.js.map +1 -0
- package/lib/module/internal/use-elapsed.js +20 -0
- package/lib/module/internal/use-elapsed.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/skia/dot-orb.js +256 -0
- package/lib/module/skia/dot-orb.js.map +1 -0
- package/lib/module/skia/index.js +8 -0
- package/lib/module/skia/index.js.map +1 -0
- package/lib/module/skia/liquid-orb.js +303 -0
- package/lib/module/skia/liquid-orb.js.map +1 -0
- package/lib/module/skia/matrix-orb.js +272 -0
- package/lib/module/skia/matrix-orb.js.map +1 -0
- package/lib/module/skia/media-generating.js +524 -0
- package/lib/module/skia/media-generating.js.map +1 -0
- package/lib/module/skia/voice-wave.js +278 -0
- package/lib/module/skia/voice-wave.js.map +1 -0
- package/lib/module/text/index.js +6 -0
- package/lib/module/text/index.js.map +1 -0
- package/lib/module/text/shimmer-text.js +122 -0
- package/lib/module/text/shimmer-text.js.map +1 -0
- package/lib/module/text/spoken-text.js +85 -0
- package/lib/module/text/spoken-text.js.map +1 -0
- package/lib/module/text/streaming-text.js +135 -0
- package/lib/module/text/streaming-text.js.map +1 -0
- package/lib/module/theme/index.js +5 -0
- package/lib/module/theme/index.js.map +1 -0
- package/lib/module/theme/palette.js +45 -0
- package/lib/module/theme/palette.js.map +1 -0
- package/lib/module/theme/provider.js +65 -0
- package/lib/module/theme/provider.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/brand/index.d.ts +2 -0
- package/lib/typescript/src/brand/index.d.ts.map +1 -0
- package/lib/typescript/src/brand/spinning-mark.d.ts +21 -0
- package/lib/typescript/src/brand/spinning-mark.d.ts.map +1 -0
- package/lib/typescript/src/chat/effort-bar.d.ts +42 -0
- package/lib/typescript/src/chat/effort-bar.d.ts.map +1 -0
- package/lib/typescript/src/chat/index.d.ts +6 -0
- package/lib/typescript/src/chat/index.d.ts.map +1 -0
- package/lib/typescript/src/chat/question-card.d.ts +73 -0
- package/lib/typescript/src/chat/question-card.d.ts.map +1 -0
- package/lib/typescript/src/chat/reasoning.d.ts +20 -0
- package/lib/typescript/src/chat/reasoning.d.ts.map +1 -0
- package/lib/typescript/src/chat/status-row.d.ts +20 -0
- package/lib/typescript/src/chat/status-row.d.ts.map +1 -0
- package/lib/typescript/src/chat/thinking-block.d.ts +35 -0
- package/lib/typescript/src/chat/thinking-block.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/internal/color.d.ts +2 -0
- package/lib/typescript/src/internal/color.d.ts.map +1 -0
- package/lib/typescript/src/internal/use-elapsed.d.ts +3 -0
- package/lib/typescript/src/internal/use-elapsed.d.ts.map +1 -0
- package/lib/typescript/src/skia/dot-orb.d.ts +16 -0
- package/lib/typescript/src/skia/dot-orb.d.ts.map +1 -0
- package/lib/typescript/src/skia/index.d.ts +6 -0
- package/lib/typescript/src/skia/index.d.ts.map +1 -0
- package/lib/typescript/src/skia/liquid-orb.d.ts +20 -0
- package/lib/typescript/src/skia/liquid-orb.d.ts.map +1 -0
- package/lib/typescript/src/skia/matrix-orb.d.ts +12 -0
- package/lib/typescript/src/skia/matrix-orb.d.ts.map +1 -0
- package/lib/typescript/src/skia/media-generating.d.ts +59 -0
- package/lib/typescript/src/skia/media-generating.d.ts.map +1 -0
- package/lib/typescript/src/skia/voice-wave.d.ts +17 -0
- package/lib/typescript/src/skia/voice-wave.d.ts.map +1 -0
- package/lib/typescript/src/text/index.d.ts +4 -0
- package/lib/typescript/src/text/index.d.ts.map +1 -0
- package/lib/typescript/src/text/shimmer-text.d.ts +13 -0
- package/lib/typescript/src/text/shimmer-text.d.ts.map +1 -0
- package/lib/typescript/src/text/spoken-text.d.ts +15 -0
- package/lib/typescript/src/text/spoken-text.d.ts.map +1 -0
- package/lib/typescript/src/text/streaming-text.d.ts +16 -0
- package/lib/typescript/src/text/streaming-text.d.ts.map +1 -0
- package/lib/typescript/src/theme/index.d.ts +3 -0
- package/lib/typescript/src/theme/index.d.ts.map +1 -0
- package/lib/typescript/src/theme/palette.d.ts +33 -0
- package/lib/typescript/src/theme/palette.d.ts.map +1 -0
- package/lib/typescript/src/theme/provider.d.ts +13 -0
- package/lib/typescript/src/theme/provider.d.ts.map +1 -0
- package/package.json +133 -4
- package/src/brand/index.ts +5 -0
- package/src/brand/spinning-mark.tsx +118 -0
- package/src/chat/effort-bar.tsx +748 -0
- package/src/chat/index.ts +45 -0
- package/src/chat/question-card.tsx +649 -0
- package/src/chat/reasoning.ts +30 -0
- package/src/chat/status-row.tsx +127 -0
- package/src/chat/thinking-block.tsx +250 -0
- package/src/index.ts +2 -0
- package/src/internal/color.ts +18 -0
- package/src/internal/use-elapsed.ts +21 -0
- package/src/skia/dot-orb.tsx +248 -0
- package/src/skia/index.ts +34 -0
- package/src/skia/liquid-orb.tsx +274 -0
- package/src/skia/matrix-orb.tsx +337 -0
- package/src/skia/media-generating.tsx +389 -0
- package/src/skia/voice-wave.tsx +215 -0
- package/src/text/index.ts +3 -0
- package/src/text/shimmer-text.tsx +140 -0
- package/src/text/spoken-text.tsx +82 -0
- package/src/text/streaming-text.tsx +144 -0
- package/src/theme/index.ts +11 -0
- package/src/theme/palette.ts +62 -0
- package/src/theme/provider.tsx +54 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { Canvas, Fill, Shader, Skia } from "@shopify/react-native-skia";
|
|
2
|
+
import { useEffect, useMemo } from "react";
|
|
3
|
+
import { PixelRatio, StyleSheet } from "react-native";
|
|
4
|
+
import {
|
|
5
|
+
useDerivedValue,
|
|
6
|
+
useFrameCallback,
|
|
7
|
+
useReducedMotion,
|
|
8
|
+
useSharedValue,
|
|
9
|
+
} from "react-native-reanimated";
|
|
10
|
+
|
|
11
|
+
export type MatrixOrbState = "idle" | "listening" | "thinking";
|
|
12
|
+
|
|
13
|
+
const STATES: MatrixOrbState[] = ["idle", "listening", "thinking"];
|
|
14
|
+
const STATE_SCALE = [0.88, 1, 0.92];
|
|
15
|
+
|
|
16
|
+
const STIFFNESS = 180;
|
|
17
|
+
const DAMPING = 26;
|
|
18
|
+
const ATTACK = 0.22;
|
|
19
|
+
const RELEASE = 0.08;
|
|
20
|
+
const BLEND = 0.16;
|
|
21
|
+
const FRAME_RATE = 60;
|
|
22
|
+
const MAX_DELTA = 0.05;
|
|
23
|
+
|
|
24
|
+
const MIN_DOTS = 3;
|
|
25
|
+
const DEFAULT_DOTS = 11;
|
|
26
|
+
const DEFAULT_SIZE = 240;
|
|
27
|
+
const DEFAULT_COLOR = "#FFFFFF";
|
|
28
|
+
|
|
29
|
+
const ORB_SPAN = 0.74;
|
|
30
|
+
const ORB_DOT = 0.6;
|
|
31
|
+
const ORB_BLOOM = 1.7;
|
|
32
|
+
const ORB_CUTOFF = 1.12;
|
|
33
|
+
const ORB_REACH = 1;
|
|
34
|
+
|
|
35
|
+
const COVER_DOT = 0.42;
|
|
36
|
+
const COVER_BLOOM = 0.55;
|
|
37
|
+
const COVER_CUTOFF = 2.0;
|
|
38
|
+
const COVER_MARGIN = 0.85;
|
|
39
|
+
const COVER_REACH = 0.7;
|
|
40
|
+
|
|
41
|
+
const MATRIX_ORB = Skia.RuntimeEffect.Make(`
|
|
42
|
+
uniform float2 resolution;
|
|
43
|
+
uniform float2 counts;
|
|
44
|
+
uniform float spacing;
|
|
45
|
+
uniform float dotScale;
|
|
46
|
+
uniform float bloom;
|
|
47
|
+
uniform float cutoff;
|
|
48
|
+
uniform float reach;
|
|
49
|
+
uniform float time;
|
|
50
|
+
uniform float amplitude;
|
|
51
|
+
uniform float scale;
|
|
52
|
+
uniform float3 weights;
|
|
53
|
+
uniform float feather;
|
|
54
|
+
uniform float4 tint;
|
|
55
|
+
|
|
56
|
+
float orbiter(float2 n, float radius, float speed, float phase, float spread) {
|
|
57
|
+
float angle = time * speed + phase;
|
|
58
|
+
float2 delta = n - float2(cos(angle), sin(angle)) * radius;
|
|
59
|
+
return exp(-dot(delta, delta) / (spread * spread));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
float idleIntensity(float d) {
|
|
63
|
+
return 0.62 + 0.12 * sin(time * 1.05 - d * 2.4);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
float listeningIntensity(float d) {
|
|
67
|
+
float ripple = 0.5 + 0.5 * sin(d * 4.2 - time * 3.0);
|
|
68
|
+
return 0.32 + amplitude * (0.34 + 0.38 * ripple);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
float thinkingIntensity(float2 n) {
|
|
72
|
+
float heat = orbiter(n, 0.62, 2.2, 0.0, 0.42)
|
|
73
|
+
+ orbiter(n, 0.4, -1.7, 2.1, 0.36)
|
|
74
|
+
+ orbiter(n, 0.8, 1.15, 4.0, 0.34);
|
|
75
|
+
return 0.26 + 0.8 * min(1.0, heat);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
half4 main(float2 xy) {
|
|
79
|
+
float2 span = (counts - 1.0) * 0.5;
|
|
80
|
+
float maxRadius = spacing * dotScale;
|
|
81
|
+
float2 center = resolution * 0.5;
|
|
82
|
+
float stride = spacing * scale;
|
|
83
|
+
float2 origin = floor((xy - center) / stride + span + 0.5);
|
|
84
|
+
|
|
85
|
+
float cover = 0.0;
|
|
86
|
+
|
|
87
|
+
for (int iy = 0; iy < 3; iy++) {
|
|
88
|
+
for (int ix = 0; ix < 3; ix++) {
|
|
89
|
+
float2 cell = origin + float2(float(ix) - 1.0, float(iy) - 1.0);
|
|
90
|
+
float2 edge = min(cell, counts - 1.0 - cell);
|
|
91
|
+
|
|
92
|
+
if (min(edge.x, edge.y) >= 0.0) {
|
|
93
|
+
float2 n = (cell - span) / span;
|
|
94
|
+
float d = length(n);
|
|
95
|
+
|
|
96
|
+
if (d <= cutoff) {
|
|
97
|
+
float blended = weights.x * idleIntensity(d)
|
|
98
|
+
+ weights.y * listeningIntensity(d)
|
|
99
|
+
+ weights.z * thinkingIntensity(n / reach);
|
|
100
|
+
float intensity = clamp(blended, 0.0, 1.0);
|
|
101
|
+
float radius = maxRadius * exp(-d * d * bloom) * intensity * scale;
|
|
102
|
+
|
|
103
|
+
if (radius >= feather) {
|
|
104
|
+
float dist = length(xy - (center + (cell - span) * stride));
|
|
105
|
+
cover = max(
|
|
106
|
+
cover,
|
|
107
|
+
1.0 - smoothstep(radius - feather, radius + feather, dist)
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
float alpha = cover * tint.a;
|
|
116
|
+
return half4(half3(tint.rgb) * half(alpha), half(alpha));
|
|
117
|
+
}
|
|
118
|
+
`);
|
|
119
|
+
|
|
120
|
+
type Motion = {
|
|
121
|
+
stamp: number;
|
|
122
|
+
time: number;
|
|
123
|
+
amplitude: number;
|
|
124
|
+
scale: number;
|
|
125
|
+
velocity: number;
|
|
126
|
+
weights: number[];
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
type Field = {
|
|
130
|
+
counts: number[];
|
|
131
|
+
spacing: number;
|
|
132
|
+
dotScale: number;
|
|
133
|
+
bloom: number;
|
|
134
|
+
cutoff: number;
|
|
135
|
+
reach: number;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
function stateIndex(state: MatrixOrbState) {
|
|
139
|
+
return Math.max(STATES.indexOf(state), 0);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function oneHot(index: number) {
|
|
143
|
+
return STATES.map((_, position) => (position === index ? 1 : 0));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function envelope(time: number) {
|
|
147
|
+
"worklet";
|
|
148
|
+
const slow = 0.5 + 0.5 * Math.sin(time * 0.62 + 0.4);
|
|
149
|
+
const fast = 0.5 + 0.5 * Math.sin(time * 1.9 + 1.1);
|
|
150
|
+
return 0.22 + 0.78 * (0.45 + 0.55 * slow) * fast;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function levelAt(level: number | undefined, time: number) {
|
|
154
|
+
"worklet";
|
|
155
|
+
if (level === undefined || !Number.isFinite(level)) {
|
|
156
|
+
return envelope(time);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return Math.min(1, Math.max(0, level));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function orbField(size: number, dots: number): Field {
|
|
163
|
+
"worklet";
|
|
164
|
+
return {
|
|
165
|
+
counts: [dots, dots],
|
|
166
|
+
spacing: (size * ORB_SPAN) / (dots - 1),
|
|
167
|
+
dotScale: ORB_DOT,
|
|
168
|
+
bloom: ORB_BLOOM,
|
|
169
|
+
cutoff: ORB_CUTOFF,
|
|
170
|
+
reach: ORB_REACH,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function coverField(width: number, height: number, dots: number): Field {
|
|
175
|
+
"worklet";
|
|
176
|
+
const spacing = Math.min(width, height) / (dots - 1);
|
|
177
|
+
const across = Math.ceil(width / (spacing * COVER_MARGIN)) + 1;
|
|
178
|
+
const down = Math.ceil(height / (spacing * COVER_MARGIN)) + 1;
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
counts: [Math.max(across, MIN_DOTS), Math.max(down, MIN_DOTS)],
|
|
182
|
+
spacing,
|
|
183
|
+
dotScale: COVER_DOT,
|
|
184
|
+
bloom: COVER_BLOOM,
|
|
185
|
+
cutoff: COVER_CUTOFF,
|
|
186
|
+
reach: COVER_REACH,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export type MatrixOrbProps = {
|
|
191
|
+
state?: MatrixOrbState;
|
|
192
|
+
level?: number;
|
|
193
|
+
size?: number;
|
|
194
|
+
cover?: boolean;
|
|
195
|
+
color?: string;
|
|
196
|
+
stateColors?: Partial<Record<MatrixOrbState, string>>;
|
|
197
|
+
dots?: number;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export function MatrixOrb({
|
|
201
|
+
state = "idle",
|
|
202
|
+
level,
|
|
203
|
+
size = DEFAULT_SIZE,
|
|
204
|
+
cover = false,
|
|
205
|
+
color = DEFAULT_COLOR,
|
|
206
|
+
stateColors,
|
|
207
|
+
dots = DEFAULT_DOTS,
|
|
208
|
+
}: MatrixOrbProps) {
|
|
209
|
+
const reduceMotion = useReducedMotion();
|
|
210
|
+
|
|
211
|
+
const grid = Math.max(MIN_DOTS, Math.round(dots));
|
|
212
|
+
const feather = 0.5 / PixelRatio.get();
|
|
213
|
+
const tints = useMemo(
|
|
214
|
+
() => STATES.map((name) => Array.from(Skia.Color(stateColors?.[name] ?? color))),
|
|
215
|
+
[color, stateColors],
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
const layout = useSharedValue(
|
|
219
|
+
cover ? { width: 0, height: 0 } : { width: size, height: size },
|
|
220
|
+
);
|
|
221
|
+
const target = useSharedValue(stateIndex(state));
|
|
222
|
+
const requested = useSharedValue(level);
|
|
223
|
+
const motion = useSharedValue<Motion>({
|
|
224
|
+
stamp: 0,
|
|
225
|
+
time: 0,
|
|
226
|
+
amplitude: 0,
|
|
227
|
+
scale: STATE_SCALE[stateIndex(state)],
|
|
228
|
+
velocity: 0,
|
|
229
|
+
weights: oneHot(stateIndex(state)),
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
const index = stateIndex(state);
|
|
234
|
+
target.value = index;
|
|
235
|
+
requested.value = level;
|
|
236
|
+
|
|
237
|
+
if (reduceMotion) {
|
|
238
|
+
motion.value = {
|
|
239
|
+
stamp: 0,
|
|
240
|
+
time: 0,
|
|
241
|
+
amplitude: levelAt(level, 0),
|
|
242
|
+
scale: STATE_SCALE[index],
|
|
243
|
+
velocity: 0,
|
|
244
|
+
weights: oneHot(index),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}, [level, motion, reduceMotion, requested, state, target]);
|
|
248
|
+
|
|
249
|
+
useFrameCallback((info) => {
|
|
250
|
+
const current = target.value;
|
|
251
|
+
const previous = motion.value;
|
|
252
|
+
const elapsed = previous.stamp === 0 ? 0 : info.timestamp - previous.stamp;
|
|
253
|
+
const delta = Math.min(elapsed / 1000, MAX_DELTA);
|
|
254
|
+
|
|
255
|
+
if (delta <= 0) {
|
|
256
|
+
motion.value = { ...previous, stamp: info.timestamp };
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const time = previous.time + delta;
|
|
261
|
+
|
|
262
|
+
const desired = levelAt(requested.value, time);
|
|
263
|
+
const rate = desired > previous.amplitude ? ATTACK : RELEASE;
|
|
264
|
+
const amplitude =
|
|
265
|
+
previous.amplitude +
|
|
266
|
+
(desired - previous.amplitude) *
|
|
267
|
+
(1 - Math.pow(1 - rate, delta * FRAME_RATE));
|
|
268
|
+
|
|
269
|
+
const step = 1 - Math.pow(1 - BLEND, delta * FRAME_RATE);
|
|
270
|
+
const weights = previous.weights.map(
|
|
271
|
+
(weight, index) => weight + ((index === current ? 1 : 0) - weight) * step,
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
const velocity =
|
|
275
|
+
previous.velocity +
|
|
276
|
+
(-STIFFNESS * (previous.scale - STATE_SCALE[current]) -
|
|
277
|
+
DAMPING * previous.velocity) *
|
|
278
|
+
delta;
|
|
279
|
+
|
|
280
|
+
motion.value = {
|
|
281
|
+
stamp: info.timestamp,
|
|
282
|
+
time,
|
|
283
|
+
amplitude,
|
|
284
|
+
scale: previous.scale + velocity * delta,
|
|
285
|
+
velocity,
|
|
286
|
+
weights,
|
|
287
|
+
};
|
|
288
|
+
}, !reduceMotion);
|
|
289
|
+
|
|
290
|
+
const uniforms = useDerivedValue(() => {
|
|
291
|
+
const width = Math.max(layout.value.width, 1);
|
|
292
|
+
const height = Math.max(layout.value.height, 1);
|
|
293
|
+
const field = cover
|
|
294
|
+
? coverField(width, height, grid)
|
|
295
|
+
: orbField(Math.min(width, height), grid);
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
resolution: [width, height],
|
|
299
|
+
counts: field.counts,
|
|
300
|
+
spacing: field.spacing,
|
|
301
|
+
dotScale: field.dotScale,
|
|
302
|
+
bloom: field.bloom,
|
|
303
|
+
cutoff: field.cutoff,
|
|
304
|
+
reach: field.reach,
|
|
305
|
+
time: motion.value.time,
|
|
306
|
+
amplitude: motion.value.amplitude,
|
|
307
|
+
scale: motion.value.scale,
|
|
308
|
+
weights: motion.value.weights,
|
|
309
|
+
feather,
|
|
310
|
+
tint: [0, 1, 2, 3].map((channel) =>
|
|
311
|
+
tints.reduce((sum, value, index) => sum + value[channel] * (motion.value.weights[index] ?? 0), 0) /
|
|
312
|
+
Math.max(motion.value.weights.reduce((sum, weight) => sum + weight, 0), 0.0001),
|
|
313
|
+
),
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
if (!MATRIX_ORB) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return (
|
|
322
|
+
<Canvas
|
|
323
|
+
onSize={layout}
|
|
324
|
+
style={cover ? styles.cover : { width: size, height: size }}
|
|
325
|
+
>
|
|
326
|
+
<Fill>
|
|
327
|
+
<Shader source={MATRIX_ORB} uniforms={uniforms} />
|
|
328
|
+
</Fill>
|
|
329
|
+
</Canvas>
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const styles = StyleSheet.create({
|
|
334
|
+
cover: {
|
|
335
|
+
flex: 1,
|
|
336
|
+
},
|
|
337
|
+
});
|