chore: release v1.4.0
Build and Push / release (push) Successful in 3s
Build and Push / build (push) Successful in 3m7s

- Decentralized Room Registry pattern
- Each room registers itself with central registry
- Dynamic navigation tabs and settings dropdown
- New Media Room and Parlor feature folders
- Permission-based room filtering support

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jeroen Schweitzer
2026-01-05 15:46:44 +01:00
co-authored by Claude Opus 4.5
parent 40ba6a869d
commit c3f6d27a52
15 changed files with 581 additions and 134 deletions
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
/// Parlor - AI chat and automation hub.
///
/// Placeholder page for future implementation.
class ParlorPage extends StatelessWidget {
const ParlorPage({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.lightbulb,
size: 64,
color: Theme.of(context).colorScheme.outline,
),
const SizedBox(height: 16),
Text(
'Parlor',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 8),
Text(
'AI chat and automation hub - coming soon',
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Theme.of(context).colorScheme.outline,
),
),
],
),
);
}
}
+38
View File
@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:tatlock_ui/features/parlor/presentation/pages/parlor_page.dart';
import 'package:tatlock_ui/routing/app_router.dart';
import 'package:tatlock_ui/routing/room_registry.dart';
/// Route paths for Parlor.
abstract class ParlorRoutes {
static const base = '/parlor';
}
/// Parlor room definition.
final parlorRoom = RoomDefinition(
id: 'parlor',
label: 'Parlor',
icon: Icons.lightbulb_outline,
selectedIcon: Icons.lightbulb,
defaultRoute: ParlorRoutes.base,
routes: parlorRoutes,
// No permissions required - accessible to all authenticated users
);
/// Register Parlor with the room registry.
void registerParlor() {
roomRegistry.register(parlorRoom);
}
/// Parlor routes for go_router.
List<RouteBase> parlorRoutes() {
return [
GoRoute(
path: ParlorRoutes.base,
name: 'parlor',
pageBuilder: (context, state) =>
noTransitionPage(context, state, const ParlorPage()),
),
];
}