Initial commit: monorepo Match Live TV.

Rails API, app Flutter, infrastruttura Docker/MediaMTX, sito marketing e documentazione di deploy.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-26 17:45:37 +02:00
commit bba6df52c0
381 changed files with 20599 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
import 'dart:math' as math;
import 'package:flutter/material.dart';
/// Padding di sistema (status bar, notch, barra navigazione) con minimo configurabile.
class ScreenInsets {
ScreenInsets._();
static EdgeInsets of(BuildContext context, {double minimum = 8}) {
final mq = MediaQuery.of(context);
final padding = mq.padding;
final view = mq.viewPadding;
return EdgeInsets.only(
left: math.max(math.max(padding.left, view.left), minimum),
top: math.max(math.max(padding.top, view.top), minimum),
right: math.max(math.max(padding.right, view.right), minimum),
bottom: math.max(math.max(padding.bottom, view.bottom), minimum),
);
}
/// Padding per contenuti scrollabili (login, wizard, elenco partite).
/// Overlay camera: in landscape su Android la barra nav può stare a sinistra.
static EdgeInsets cameraOverlay(BuildContext context, {double minimum = 12}) {
final base = of(context, minimum: minimum);
final landscape =
MediaQuery.orientationOf(context) == Orientation.landscape;
if (landscape && base.left < 48) {
return base.copyWith(left: 48);
}
return base;
}
static EdgeInsets contentPadding(
BuildContext context, {
double horizontal = 20,
double vertical = 16,
double minimum = 8,
}) {
final inset = of(context, minimum: minimum);
return EdgeInsets.fromLTRB(
math.max(inset.left, horizontal),
math.max(inset.top, vertical),
math.max(inset.right, horizontal),
math.max(inset.bottom, vertical),
);
}
}
/// SafeArea con padding minimo su tutti i lati (gestisce edge-to-edge Android).
class AppSafeArea extends StatelessWidget {
const AppSafeArea({
super.key,
required this.child,
this.minimum = 8,
this.top = true,
this.bottom = true,
this.left = true,
this.right = true,
});
final Widget child;
final double minimum;
final bool top;
final bool bottom;
final bool left;
final bool right;
@override
Widget build(BuildContext context) {
return SafeArea(
minimum: EdgeInsets.only(
left: left ? minimum : 0,
top: top ? minimum : 0,
right: right ? minimum : 0,
bottom: bottom ? minimum : 0,
),
top: top,
bottom: bottom,
left: left,
right: right,
child: child,
);
}
}