inou/app/lib/features/static/security_page.dart

149 lines
5.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:inou_app/design/inou_theme.dart';
import 'package:inou_app/design/inou_text.dart';
import 'package:inou_app/design/widgets/widgets.dart';
/// Security page - matches inou.com/security
class SecurityPage extends StatelessWidget {
const SecurityPage({super.key});
@override
Widget build(BuildContext context) {
return InouPage(
currentRoute: '/security',
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 48),
// Hero
Text(
'How we protect your health dossier.',
style: InouText.pageTitle,
),
const SizedBox(height: 16),
Text(
'Security isn\'t a feature we added. It\'s how we built inou from day one.',
style: InouText.body.copyWith(
color: InouTheme.textMuted,
fontWeight: FontWeight.w300,
fontSize: 18,
),
),
const SizedBox(height: 64),
// Security features
..._buildSecurityFeatures(),
const SizedBox(height: 48),
],
),
);
}
List<Widget> _buildSecurityFeatures() {
final features = [
_SecurityFeature(
icon: Icons.dns_outlined,
title: 'Your data never shares a server.',
description: 'Most services run on shared cloud infrastructure — your files sitting next to thousands of strangers. Not here. inou runs on dedicated, single-tenant hardware. Your data lives on machines that exist solely for this purpose.',
),
_SecurityFeature(
icon: Icons.lock_outline,
title: 'Encryption you can trust.',
description: 'FIPS 140-3 is the US government standard for cryptographic security — the same bar the military uses. Your files are encrypted in flight with TLS 1.3, encrypted again at the application layer before they touch the database, and stay encrypted at rest. Three layers deep.',
),
_SecurityFeature(
icon: Icons.power_outlined,
title: 'Power doesn\'t go out.',
description: 'Servers run on uninterruptible power, backed by a natural gas generator. Not a battery that buys you fifteen minutes — a generator with fuel supply independent of the grid. If the power company fails, we don\'t.',
),
_SecurityFeature(
icon: Icons.storage_outlined,
title: 'Drives fail. Data doesn\'t.',
description: 'Storage runs on ZFS with RAID-Z2 — enterprise technology that survives the simultaneous failure of any two drives without losing a byte. Backups happen automatically. (Our founder spent two decades building backup systems for a living. We take this seriously.)',
),
_SecurityFeature(
icon: Icons.satellite_alt_outlined,
title: 'The internet has a backup too.',
description: 'Primary connectivity is dedicated fiber. If that fails, satellite kicks in. Terrestrial and space-based redundancy — because your access matters.',
),
_SecurityFeature(
icon: Icons.visibility_outlined,
title: 'We watch. We act.',
description: 'Continuous uptime monitoring, automated alerting, 24/7. If something blinks wrong, we know — and our systems respond before you\'d ever notice.',
),
_SecurityFeature(
icon: Icons.shield_outlined,
title: 'We keep attackers out.',
description: 'Firewall rules block malicious traffic at the edge. Tarpits slow down scanners and bots, wasting their time instead of ours. Role-based access control ensures every request is authenticated and authorized — no exceptions.',
),
_SecurityFeature(
icon: Icons.code_outlined,
title: 'Built with intention.',
description: 'Most software is assembled from open source libraries — code written by strangers, maintained by volunteers, used by millions. When a vulnerability is discovered, every application using that library is exposed. We write our own code. We control every line. We don\'t inherit other people\'s risks.',
),
];
return features.map((feature) => Padding(
padding: const EdgeInsets.only(bottom: 48),
child: _buildFeatureCard(feature),
)).toList();
}
Widget _buildFeatureCard(_SecurityFeature feature) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 48,
height: 48,
decoration: BoxDecoration(
color: InouTheme.accentLight,
borderRadius: BorderRadius.circular(12),
),
child: Icon(
feature.icon,
color: InouTheme.accent,
size: 24,
),
),
const SizedBox(width: 24),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
feature.title,
style: InouText.h3,
),
const SizedBox(height: 12),
Text(
feature.description,
style: InouText.body.copyWith(
color: InouTheme.textMuted,
fontWeight: FontWeight.w300,
height: 1.8,
),
),
],
),
),
],
);
}
}
class _SecurityFeature {
final IconData icon;
final String title;
final String description;
const _SecurityFeature({
required this.icon,
required this.title,
required this.description,
});
}