TKK_Nisa_E32221364/lib/widgets/sensor_card.dart

209 lines
6.5 KiB
Dart

import 'package:flutter/material.dart';
import '../utils/app_colors.dart';
class SensorCard extends StatelessWidget {
final String title;
final String value;
final String unit;
final IconData icon;
final Color statusColor;
final String status;
final VoidCallback? onTap;
const SensorCard({
Key? key,
required this.title,
required this.value,
required this.unit,
required this.icon,
required this.statusColor,
required this.status,
this.onTap,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
elevation: 4,
margin: const EdgeInsets.symmetric(vertical: 8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
child: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: onTap,
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [AppColors.backgroundWhite, AppColors.backgroundLight],
),
),
child: Column(
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: statusColor.withOpacity(0.1),
shape: BoxShape.circle,
),
child: Icon(icon, color: statusColor, size: 24),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: AppColors.textSecondary,
),
),
const SizedBox(height: 4),
Row(
children: [
Text(
value,
style: const TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: AppColors.textPrimary,
),
),
const SizedBox(width: 4),
Text(
unit,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w500,
color: AppColors.textSecondary,
),
),
],
),
],
),
),
],
),
const SizedBox(height: 12),
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: statusColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(20),
),
child: Text(
status,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: statusColor,
),
),
),
],
),
),
),
);
}
}
class ControlCard extends StatelessWidget {
final String title;
final String description;
final IconData icon;
final bool isActive;
final VoidCallback onToggle;
final Color activeColor;
const ControlCard({
Key? key,
required this.title,
required this.description,
required this.icon,
required this.isActive,
required this.onToggle,
required this.activeColor,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
elevation: 4,
margin: const EdgeInsets.symmetric(vertical: 8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [AppColors.backgroundWhite, AppColors.backgroundLight],
),
),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: (isActive ? activeColor : AppColors.secondaryGray)
.withOpacity(0.1),
shape: BoxShape.circle,
),
child: Icon(
icon,
color: isActive ? activeColor : AppColors.secondaryGray,
size: 24,
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.textPrimary,
),
),
const SizedBox(height: 4),
Text(
description,
style: const TextStyle(
fontSize: 13,
color: AppColors.textSecondary,
),
),
],
),
),
Switch(
value: isActive,
onChanged: (_) => onToggle(),
activeColor: activeColor,
inactiveTrackColor: AppColors.secondaryLightGray,
),
],
),
),
);
}
}