feat: initial Pyramid project scaffold

This commit is contained in:
Bernd Steckmeister
2026-04-19 19:18:12 +02:00
commit 062b8b6a94
138 changed files with 6001 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pyramid/features/rooms/rooms_page.dart';
final sidebarWidthProvider = StateProvider<double>((ref) => 280);
class PanelLayout extends ConsumerWidget {
final Widget mainContent;
const PanelLayout({super.key, required this.mainContent});
@override
Widget build(BuildContext context, WidgetRef ref) {
final sidebarWidth = ref.watch(sidebarWidthProvider);
return Row(
children: [
SizedBox(
width: sidebarWidth,
child: const RoomsPage(),
),
_ResizeDivider(
onDrag: (delta) {
final notifier = ref.read(sidebarWidthProvider.notifier);
notifier.state =
(notifier.state + delta).clamp(180.0, 480.0);
},
),
Expanded(child: mainContent),
],
);
}
}
class _ResizeDivider extends StatelessWidget {
final ValueChanged<double> onDrag;
const _ResizeDivider({required this.onDrag});
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.translucent,
onHorizontalDragUpdate: (d) => onDrag(d.delta.dx),
child: MouseRegion(
cursor: SystemMouseCursors.resizeColumn,
child: Container(
width: 6,
color: Theme.of(context).dividerColor,
),
),
);
}
}
+19
View File
@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pyramid/layout/panel_layout.dart';
class ShellPage extends ConsumerWidget {
final Widget child;
const ShellPage({super.key, required this.child});
@override
Widget build(BuildContext context, WidgetRef ref) {
final isWide = MediaQuery.sizeOf(context).width >= 700;
return Scaffold(
body: isWide
? PanelLayout(mainContent: child)
: child,
);
}
}