- Rename features/dashboard → features/front_hall - Update routes: /, /control-room, /parlor, /settings - Update navigation to 4 rooms (removed chat tab - will be omnipresent dock) - Add docs/UI_LAYOUT.md with wireframes and responsive specs - Update ARCHITECTURE.md and PLAN.md to reflect room structure Directory structure now mirrors "Rooms of the Estate" UI navigation: - front_hall/ (dashboard) - control_room/ (infrastructure - containers, stacks, etc.) - parlor/ (home automation) - library/ (future) - study/ (future, hidden) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
111 lines
3.2 KiB
Dart
111 lines
3.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
|
|
|
import '../shared/layouts/app_scaffold.dart';
|
|
import '../features/front_hall/presentation/pages/front_hall_page.dart';
|
|
|
|
part 'app_router.g.dart';
|
|
|
|
/// Route paths as constants.
|
|
abstract class AppRoutes {
|
|
static const frontHall = '/';
|
|
static const controlRoom = '/control-room';
|
|
static const containers = '/control-room/containers';
|
|
static const containerDetail = '/control-room/containers/:id';
|
|
static const parlor = '/parlor';
|
|
static const settings = '/settings';
|
|
}
|
|
|
|
/// Provides the GoRouter instance.
|
|
@riverpod
|
|
GoRouter appRouter(AppRouterRef ref) {
|
|
return GoRouter(
|
|
initialLocation: AppRoutes.frontHall,
|
|
debugLogDiagnostics: true,
|
|
routes: [
|
|
ShellRoute(
|
|
builder: (context, state, child) => AppScaffold(child: child),
|
|
routes: [
|
|
GoRoute(
|
|
path: AppRoutes.frontHall,
|
|
name: 'frontHall',
|
|
builder: (context, state) => const FrontHallPage(),
|
|
),
|
|
GoRoute(
|
|
path: AppRoutes.controlRoom,
|
|
name: 'controlRoom',
|
|
builder: (context, state) =>
|
|
const _PlaceholderPage(title: 'Control Room'),
|
|
routes: [
|
|
GoRoute(
|
|
path: 'containers',
|
|
name: 'containers',
|
|
builder: (context, state) =>
|
|
const _PlaceholderPage(title: 'Containers'),
|
|
routes: [
|
|
GoRoute(
|
|
path: ':id',
|
|
name: 'containerDetail',
|
|
builder: (context, state) {
|
|
final id = state.pathParameters['id']!;
|
|
return _PlaceholderPage(title: 'Container: $id');
|
|
},
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
GoRoute(
|
|
path: AppRoutes.parlor,
|
|
name: 'parlor',
|
|
builder: (context, state) =>
|
|
const _PlaceholderPage(title: 'Parlor'),
|
|
),
|
|
GoRoute(
|
|
path: AppRoutes.settings,
|
|
name: 'settings',
|
|
builder: (context, state) =>
|
|
const _PlaceholderPage(title: 'Settings'),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
/// Placeholder page for routes not yet implemented.
|
|
class _PlaceholderPage extends StatelessWidget {
|
|
const _PlaceholderPage({required this.title});
|
|
|
|
final String title;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Center(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Icon(
|
|
Icons.construction,
|
|
size: 64,
|
|
color: Theme.of(context).colorScheme.outline,
|
|
),
|
|
const SizedBox(height: 16),
|
|
Text(
|
|
title,
|
|
style: Theme.of(context).textTheme.headlineMedium,
|
|
),
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
'Coming soon',
|
|
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
|
|
color: Theme.of(context).colorScheme.outline,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|