feat: Add a themed loading screen widget and a web-based HLS/MPEG-TS video player.

This commit is contained in:
Michael committed 2026-01-01 18:21:54 +01:00
1 parent be51118dc2
commit 79ad1243fa
2 files changed
+42 -10

No files matched your search

+23 -10
View File
@@ -7,20 +7,33 @@ class ThemedLoading extends StatelessWidget {
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
gradient: RadialGradient(
center: Alignment(0, -0.2),
radius: 1.5,
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFF2C2C2E),
Color(0xFF000000),
Color(0xFF0F1014), // Deep Space Dark
Color(0xFF181920), // Soft Eerie Black
],
stops: [0.0, 1.0],
),
),
child: const Center(
child: CircularProgressIndicator(
color: Colors.white,
strokeWidth: 3,
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const CircularProgressIndicator(
color: Color(0xFF007AFF), // Electric Blue (AppColors.primary)
strokeWidth: 3,
),
const SizedBox(height: 16),
Text(
'Loading...',
style: TextStyle(
fontFamily: 'Outfit', // Match AppTheme
color: Colors.white.withOpacity(0.7),
fontSize: 14,
),
),
],
),
),
);
+19
View File
@@ -471,6 +471,25 @@
}
}
// Listen for messages from Flutter
window.addEventListener('message', (event) => {
const data = event.data;
if (!data) return;
if (data.type === 'play') {
video.play().catch(e => log('Play command failed: ' + e));
} else if (data.type === 'pause') {
video.pause();
} else if (data.type === 'set_volume') {
video.volume = Math.max(0, Math.min(1, parseFloat(data.value)));
video.muted = video.volume === 0;
} else if (data.type === 'seek') {
if (isFinite(video.duration)) {
video.currentTime = parseFloat(data.value);
}
}
});
// Start player
initPlayer();
</script>