mirror of
https://github.com/flutter/holobooth.git
synced 2025-05-17 21:36:00 +08:00
Merge branch 'main' into fix/landing-page-resize
This commit is contained in:
Binary file not shown.
BIN
assets/animations/dash_desktop.riv
Normal file
BIN
assets/animations/dash_desktop.riv
Normal file
Binary file not shown.
BIN
assets/animations/dash_mobile.riv
Normal file
BIN
assets/animations/dash_mobile.riv
Normal file
Binary file not shown.
Binary file not shown.
BIN
assets/animations/sparky_desktop.riv
Normal file
BIN
assets/animations/sparky_desktop.riv
Normal file
Binary file not shown.
BIN
assets/animations/sparky_mobile.riv
Normal file
BIN
assets/animations/sparky_mobile.riv
Normal file
Binary file not shown.
@ -40,15 +40,38 @@ class $AssetsAnimationsGen {
|
|||||||
/// File path: assets/animations/bg_08.riv
|
/// File path: assets/animations/bg_08.riv
|
||||||
RiveGenImage get bg08 => const RiveGenImage('assets/animations/bg_08.riv');
|
RiveGenImage get bg08 => const RiveGenImage('assets/animations/bg_08.riv');
|
||||||
|
|
||||||
/// File path: assets/animations/dash.riv
|
/// File path: assets/animations/dash_desktop.riv
|
||||||
RiveGenImage get dash => const RiveGenImage('assets/animations/dash.riv');
|
RiveGenImage get dashDesktop =>
|
||||||
|
const RiveGenImage('assets/animations/dash_desktop.riv');
|
||||||
|
|
||||||
/// File path: assets/animations/sparky.riv
|
/// File path: assets/animations/dash_mobile.riv
|
||||||
RiveGenImage get sparky => const RiveGenImage('assets/animations/sparky.riv');
|
RiveGenImage get dashMobile =>
|
||||||
|
const RiveGenImage('assets/animations/dash_mobile.riv');
|
||||||
|
|
||||||
|
/// File path: assets/animations/sparky_desktop.riv
|
||||||
|
RiveGenImage get sparkyDesktop =>
|
||||||
|
const RiveGenImage('assets/animations/sparky_desktop.riv');
|
||||||
|
|
||||||
|
/// File path: assets/animations/sparky_mobile.riv
|
||||||
|
RiveGenImage get sparkyMobile =>
|
||||||
|
const RiveGenImage('assets/animations/sparky_mobile.riv');
|
||||||
|
|
||||||
/// List of all assets
|
/// List of all assets
|
||||||
List<RiveGenImage> get values =>
|
List<RiveGenImage> get values => [
|
||||||
[bg00, bg01, bg02, bg03, bg04, bg05, bg06, bg07, bg08, dash, sparky];
|
bg00,
|
||||||
|
bg01,
|
||||||
|
bg02,
|
||||||
|
bg03,
|
||||||
|
bg04,
|
||||||
|
bg05,
|
||||||
|
bg06,
|
||||||
|
bg07,
|
||||||
|
bg08,
|
||||||
|
dashDesktop,
|
||||||
|
dashMobile,
|
||||||
|
sparkyDesktop,
|
||||||
|
sparkyMobile
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
class $AssetsAudioGen {
|
class $AssetsAudioGen {
|
||||||
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:holobooth/assets/assets.dart';
|
import 'package:holobooth/assets/assets.dart';
|
||||||
import 'package:holobooth/in_experience_selection/in_experience_selection.dart';
|
import 'package:holobooth/in_experience_selection/in_experience_selection.dart';
|
||||||
import 'package:holobooth/rive/rive.dart';
|
import 'package:holobooth/rive/rive.dart';
|
||||||
|
import 'package:platform_helper/platform_helper.dart';
|
||||||
import 'package:rive/rive.dart';
|
import 'package:rive/rive.dart';
|
||||||
|
|
||||||
class DashCharacterAnimation extends CharacterAnimation {
|
class DashCharacterAnimation extends CharacterAnimation {
|
||||||
@ -14,8 +15,11 @@ class DashCharacterAnimation extends CharacterAnimation {
|
|||||||
required super.glasses,
|
required super.glasses,
|
||||||
required super.clothes,
|
required super.clothes,
|
||||||
required super.handheldlLeft,
|
required super.handheldlLeft,
|
||||||
|
PlatformHelper? platformHelper,
|
||||||
}) : super(
|
}) : super(
|
||||||
assetGenImage: Assets.animations.dash,
|
riveGenImage: (platformHelper ?? PlatformHelper()).isMobile
|
||||||
|
? Assets.animations.dashMobile
|
||||||
|
: Assets.animations.dashDesktop,
|
||||||
riveImageSize: const Size(2400, 2100),
|
riveImageSize: const Size(2400, 2100),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -28,8 +32,11 @@ class SparkyCharacterAnimation extends CharacterAnimation {
|
|||||||
required super.glasses,
|
required super.glasses,
|
||||||
required super.clothes,
|
required super.clothes,
|
||||||
required super.handheldlLeft,
|
required super.handheldlLeft,
|
||||||
|
PlatformHelper? platformHelper,
|
||||||
}) : super(
|
}) : super(
|
||||||
assetGenImage: Assets.animations.sparky,
|
riveGenImage: (platformHelper ?? PlatformHelper()).isMobile
|
||||||
|
? Assets.animations.sparkyMobile
|
||||||
|
: Assets.animations.sparkyDesktop,
|
||||||
riveImageSize: const Size(2500, 2100),
|
riveImageSize: const Size(2500, 2100),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -43,7 +50,7 @@ class CharacterAnimation extends StatefulWidget {
|
|||||||
required this.glasses,
|
required this.glasses,
|
||||||
required this.clothes,
|
required this.clothes,
|
||||||
required this.handheldlLeft,
|
required this.handheldlLeft,
|
||||||
required this.assetGenImage,
|
required this.riveGenImage,
|
||||||
required this.riveImageSize,
|
required this.riveImageSize,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -62,7 +69,7 @@ class CharacterAnimation extends StatefulWidget {
|
|||||||
final HandheldlLeft handheldlLeft;
|
final HandheldlLeft handheldlLeft;
|
||||||
|
|
||||||
/// The character's [RiveGenImage].
|
/// The character's [RiveGenImage].
|
||||||
final RiveGenImage assetGenImage;
|
final RiveGenImage riveGenImage;
|
||||||
|
|
||||||
/// The size of the character's [RiveGenImage].
|
/// The size of the character's [RiveGenImage].
|
||||||
final Size riveImageSize;
|
final Size riveImageSize;
|
||||||
@ -359,7 +366,7 @@ class CharacterAnimationState<T extends CharacterAnimation> extends State<T>
|
|||||||
scale: _scale,
|
scale: _scale,
|
||||||
alignment: const Alignment(0, 5 / 6),
|
alignment: const Alignment(0, 5 / 6),
|
||||||
duration: const Duration(milliseconds: 400),
|
duration: const Duration(milliseconds: 400),
|
||||||
child: widget.assetGenImage.rive(
|
child: widget.riveGenImage.rive(
|
||||||
onInit: onRiveInit,
|
onInit: onRiveInit,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
),
|
),
|
||||||
|
@ -26,11 +26,11 @@ void main() {
|
|||||||
group('PhotoboothCharacter', () {
|
group('PhotoboothCharacter', () {
|
||||||
late InExperienceSelectionBloc inExperienceSelectionBloc;
|
late InExperienceSelectionBloc inExperienceSelectionBloc;
|
||||||
late AvatarDetectorBloc avatarDetectorBloc;
|
late AvatarDetectorBloc avatarDetectorBloc;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
inExperienceSelectionBloc = _MockInExperienceSelectionBloc();
|
inExperienceSelectionBloc = _MockInExperienceSelectionBloc();
|
||||||
when(() => inExperienceSelectionBloc.state)
|
when(() => inExperienceSelectionBloc.state)
|
||||||
.thenReturn(InExperienceSelectionState());
|
.thenReturn(InExperienceSelectionState());
|
||||||
|
|
||||||
avatarDetectorBloc = _MockAvatarDetectorBloc();
|
avatarDetectorBloc = _MockAvatarDetectorBloc();
|
||||||
when(() => avatarDetectorBloc.state).thenReturn(AvatarDetectorState());
|
when(() => avatarDetectorBloc.state).thenReturn(AvatarDetectorState());
|
||||||
});
|
});
|
||||||
@ -40,6 +40,7 @@ void main() {
|
|||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
when(() => inExperienceSelectionBloc.state)
|
when(() => inExperienceSelectionBloc.state)
|
||||||
.thenReturn(InExperienceSelectionState());
|
.thenReturn(InExperienceSelectionState());
|
||||||
|
|
||||||
await tester.pumpSubject(
|
await tester.pumpSubject(
|
||||||
PhotoboothCharacter(),
|
PhotoboothCharacter(),
|
||||||
inExperienceSelectionBloc: inExperienceSelectionBloc,
|
inExperienceSelectionBloc: inExperienceSelectionBloc,
|
||||||
@ -59,6 +60,7 @@ void main() {
|
|||||||
when(() => inExperienceSelectionBloc.state).thenReturn(
|
when(() => inExperienceSelectionBloc.state).thenReturn(
|
||||||
InExperienceSelectionState(character: Character.sparky),
|
InExperienceSelectionState(character: Character.sparky),
|
||||||
);
|
);
|
||||||
|
|
||||||
await tester.pumpSubject(
|
await tester.pumpSubject(
|
||||||
PhotoboothCharacter(),
|
PhotoboothCharacter(),
|
||||||
inExperienceSelectionBloc: inExperienceSelectionBloc,
|
inExperienceSelectionBloc: inExperienceSelectionBloc,
|
||||||
|
@ -6,18 +6,130 @@ import 'package:holobooth/assets/assets.dart';
|
|||||||
import 'package:holobooth/in_experience_selection/in_experience_selection.dart';
|
import 'package:holobooth/in_experience_selection/in_experience_selection.dart';
|
||||||
import 'package:holobooth/rive/rive.dart';
|
import 'package:holobooth/rive/rive.dart';
|
||||||
import 'package:mocktail/mocktail.dart';
|
import 'package:mocktail/mocktail.dart';
|
||||||
|
import 'package:platform_helper/platform_helper.dart';
|
||||||
|
|
||||||
|
import '../../helpers/helpers.dart';
|
||||||
|
|
||||||
class _MockLeftEyeGeometry extends Mock implements LeftEyeGeometry {}
|
class _MockLeftEyeGeometry extends Mock implements LeftEyeGeometry {}
|
||||||
|
|
||||||
class _MockRightEyeGeometry extends Mock implements RightEyeGeometry {}
|
class _MockRightEyeGeometry extends Mock implements RightEyeGeometry {}
|
||||||
|
|
||||||
|
class _MockPlatformHelper extends Mock implements PlatformHelper {}
|
||||||
|
|
||||||
|
Finder _findCharacterAnimation<T extends CharacterAnimation>(
|
||||||
|
String path,
|
||||||
|
) =>
|
||||||
|
find.byWidgetPredicate(
|
||||||
|
(widget) => widget is T && widget.riveGenImage.path == path,
|
||||||
|
);
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
late PlatformHelper platformHelper;
|
||||||
|
|
||||||
|
setUp(() => platformHelper = _MockPlatformHelper());
|
||||||
|
|
||||||
|
group('DashCharacterAnimation', () {
|
||||||
|
testWidgets(
|
||||||
|
'renders mobile asset',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
when(() => platformHelper.isMobile).thenReturn(true);
|
||||||
|
|
||||||
|
await tester.pumpApp(
|
||||||
|
DashCharacterAnimation(
|
||||||
|
avatar: Avatar.zero,
|
||||||
|
hat: Hats.none,
|
||||||
|
glasses: Glasses.none,
|
||||||
|
clothes: Clothes.none,
|
||||||
|
handheldlLeft: HandheldlLeft.none,
|
||||||
|
platformHelper: platformHelper,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final widgetFinder =
|
||||||
|
_findCharacterAnimation(Assets.animations.dashMobile.path);
|
||||||
|
|
||||||
|
expect(widgetFinder, findsOneWidget);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'renders desktop asset',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
when(() => platformHelper.isMobile).thenReturn(false);
|
||||||
|
|
||||||
|
await tester.pumpApp(
|
||||||
|
DashCharacterAnimation(
|
||||||
|
avatar: Avatar.zero,
|
||||||
|
hat: Hats.none,
|
||||||
|
glasses: Glasses.none,
|
||||||
|
clothes: Clothes.none,
|
||||||
|
handheldlLeft: HandheldlLeft.none,
|
||||||
|
platformHelper: platformHelper,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final widgetFinder =
|
||||||
|
_findCharacterAnimation(Assets.animations.dashDesktop.path);
|
||||||
|
|
||||||
|
expect(widgetFinder, findsOneWidget);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('SparkyCharacterAnimation', () {
|
||||||
|
testWidgets(
|
||||||
|
'renders mobile asset',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
when(() => platformHelper.isMobile).thenReturn(true);
|
||||||
|
|
||||||
|
await tester.pumpApp(
|
||||||
|
SparkyCharacterAnimation(
|
||||||
|
avatar: Avatar.zero,
|
||||||
|
hat: Hats.none,
|
||||||
|
glasses: Glasses.none,
|
||||||
|
clothes: Clothes.none,
|
||||||
|
handheldlLeft: HandheldlLeft.none,
|
||||||
|
platformHelper: platformHelper,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final widgetFinder =
|
||||||
|
_findCharacterAnimation(Assets.animations.sparkyMobile.path);
|
||||||
|
|
||||||
|
expect(widgetFinder, findsOneWidget);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'renders desktop asset',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
when(() => platformHelper.isMobile).thenReturn(false);
|
||||||
|
|
||||||
|
await tester.pumpApp(
|
||||||
|
SparkyCharacterAnimation(
|
||||||
|
avatar: Avatar.zero,
|
||||||
|
hat: Hats.none,
|
||||||
|
glasses: Glasses.none,
|
||||||
|
clothes: Clothes.none,
|
||||||
|
handheldlLeft: HandheldlLeft.none,
|
||||||
|
platformHelper: platformHelper,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final widgetFinder =
|
||||||
|
_findCharacterAnimation(Assets.animations.sparkyDesktop.path);
|
||||||
|
|
||||||
|
expect(widgetFinder, findsOneWidget);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
group('CharacterAnimation', () {
|
group('CharacterAnimation', () {
|
||||||
late RiveGenImage assetGenImage;
|
late RiveGenImage riveGenImage;
|
||||||
late Size riveImageSize;
|
late Size riveImageSize;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
assetGenImage = Assets.animations.dash;
|
riveGenImage = Assets.animations.dashMobile;
|
||||||
riveImageSize = Size(100, 100);
|
riveImageSize = Size(100, 100);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -45,7 +157,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -127,7 +239,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -194,7 +306,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -256,7 +368,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -350,7 +462,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -417,7 +529,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -520,7 +632,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -586,7 +698,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -668,7 +780,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -729,7 +841,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -781,7 +893,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -818,7 +930,7 @@ void main() {
|
|||||||
glasses: glasses,
|
glasses: glasses,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -855,7 +967,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: clothes,
|
clothes: clothes,
|
||||||
handheldlLeft: HandheldlLeft.none,
|
handheldlLeft: HandheldlLeft.none,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -892,7 +1004,7 @@ void main() {
|
|||||||
glasses: Glasses.none,
|
glasses: Glasses.none,
|
||||||
clothes: Clothes.none,
|
clothes: Clothes.none,
|
||||||
handheldlLeft: handheldLeft,
|
handheldlLeft: handheldLeft,
|
||||||
assetGenImage: assetGenImage,
|
riveGenImage: riveGenImage,
|
||||||
riveImageSize: riveImageSize,
|
riveImageSize: riveImageSize,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
@ -26,10 +26,8 @@
|
|||||||
|
|
||||||
<!-- Favicon -->
|
<!-- Favicon -->
|
||||||
<link rel="icon" type="image/png" href="favicon.png" />
|
<link rel="icon" type="image/png" href="favicon.png" />
|
||||||
|
|
||||||
<link rel="preload" crossorigin="anonymous" as="fetch" href="assets/assets/animations/background.riv" />
|
<link rel="preload" crossorigin="anonymous" as="fetch" href="assets/assets/animations/background.riv" />
|
||||||
<link rel="preload" crossorigin="anonymous" as="fetch" href="assets/assets/animations/dash.riv" />
|
|
||||||
<link rel="preload" crossorigin="anonymous" as="fetch" href="assets/assets/animations/sparky.riv" />
|
|
||||||
<link rel="preload" crossorigin="anonymous" as="fetch" href="assets/assets/images/holobooth_avatar.png" />
|
<link rel="preload" crossorigin="anonymous" as="fetch" href="assets/assets/images/holobooth_avatar.png" />
|
||||||
|
|
||||||
<title>Holobooth</title>
|
<title>Holobooth</title>
|
||||||
|
Reference in New Issue
Block a user