Files
valuecards/lib/widgets/value_card_tile.dart
2026-09-18 00:01:42 +02:00

101 lines
2.7 KiB
Dart

/// Visual tiles for a [ValueCard] in hero, sort, and list contexts.
library;
import 'package:flutter/material.dart';
import '../models/value_card.dart';
/// Elevated paper card used during sorting and as list detail rows.
class ValueCardTile extends StatelessWidget {
const ValueCardTile({
super.key,
required this.card,
this.compact = false,
this.trailing,
this.onTap,
this.elevation = 0,
});
final ValueCard card;
final bool compact;
final Widget? trailing;
final VoidCallback? onTap;
final double elevation;
@override
Widget build(BuildContext context) {
final text = Theme.of(context).textTheme;
final colors = Theme.of(context).colorScheme;
return Material(
color: colors.surfaceContainerLow,
elevation: elevation,
shadowColor: colors.shadow.withValues(alpha: 0.12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24),
side: BorderSide(color: colors.outlineVariant),
),
child: InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(24),
child: Padding(
padding: EdgeInsets.all(compact ? 14 : 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
card.title,
style: (compact ? text.titleLarge : text.headlineMedium)
?.copyWith(color: colors.onSurface),
),
),
if (trailing != null) ...[
const SizedBox(width: 8),
trailing!,
],
],
),
if (card.description.isNotEmpty) ...[
const SizedBox(height: 8),
Text(
card.description,
style: text.bodyMedium?.copyWith(
color: colors.onSurfaceVariant,
),
maxLines: compact ? 3 : 5,
overflow: TextOverflow.ellipsis,
),
],
],
),
),
),
);
}
}
/// Small chip used in overview grids.
class ValueChip extends StatelessWidget {
const ValueChip({
super.key,
required this.title,
this.onTap,
});
final String title;
final VoidCallback? onTap;
@override
Widget build(BuildContext context) {
return ActionChip(
label: Text(title),
onPressed: onTap,
visualDensity: VisualDensity.compact,
);
}
}