69 lines
1.6 KiB
Dart
69 lines
1.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
/// Cornice "ibrida": bordo esterno rettangolare + bordo interno smussato.
|
|
class HybridFrame extends StatelessWidget {
|
|
final Widget child;
|
|
|
|
/// raggio della cornice interna
|
|
final double radius;
|
|
|
|
/// spessore dei bordi
|
|
final double stroke;
|
|
|
|
/// distanza tra bordo esterno e interno
|
|
final double inset;
|
|
|
|
/// colori personalizzabili
|
|
final Color? outerColor;
|
|
final Color? innerColor;
|
|
|
|
const HybridFrame({
|
|
super.key,
|
|
required this.child,
|
|
this.radius = 12,
|
|
this.stroke = 2,
|
|
this.inset = 3,
|
|
this.outerColor,
|
|
this.innerColor,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final oc = outerColor ?? Colors.white.withOpacity(.85);
|
|
final ic = innerColor ?? Colors.black.withOpacity(.55);
|
|
|
|
return Stack(
|
|
fit: StackFit.expand,
|
|
children: [
|
|
child,
|
|
|
|
// bordo esterno: rettangolare
|
|
Positioned.fill(
|
|
child: IgnorePointer(
|
|
child: DecoratedBox(
|
|
decoration: BoxDecoration(
|
|
border: Border.all(color: oc, width: stroke),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
|
|
// bordo interno: smussato
|
|
Positioned.fill(
|
|
child: IgnorePointer(
|
|
child: Padding(
|
|
padding: EdgeInsets.all(inset),
|
|
child: DecoratedBox(
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(radius),
|
|
border: Border.all(color: ic, width: stroke),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|