mosaique 2.0.0 copy "mosaique: ^2.0.0" to clipboard
mosaique: ^2.0.0 copied to clipboard

A declarative, route-driven region-based view composition package for Flutter with go_router integration.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mosaique/mosaique.dart';

// Shell templates
import 'shells/app_shell.dart';
import 'shells/simple_shell.dart';
import 'shells/two_column_shell.dart';

// Fixed views (injected via fixedRegions)
import 'views/fixed/app_header.dart';
import 'views/fixed/app_sidebar.dart';

// Dynamic views (injected via routes)
import 'views/dynamic/dashboard_view.dart';
import 'views/dynamic/login_view.dart';
import 'views/dynamic/products_view.dart';
import 'views/dynamic/settings_view.dart';
import 'views/dynamic/user_details_view.dart';
import 'views/dynamic/users_list_view.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    final router = GoRouter(
      initialLocation: '/dashboard',
      routes: [
        // =====================================================================
        // REUSABLE SHELL #1: AppShell (header + sidebar + content)
        // Used by: Dashboard, Products
        // =====================================================================
        MosaiqueShellRoute(
          shellBuilder: (context) => const AppShell(),
          fixedRegions: {
            'header': (context) => const AppHeader(),
            'sidebar': (context) => const AppSidebar(),
          },
          routes: [
            // Dashboard view → injected into AppShell's content region
            MosaiqueViewRoute(
              path: '/dashboard',
              region: 'content',
              builder: (context, state) => const DashboardView(),
            ),

            // Products view → injected into AppShell's content region
            MosaiqueViewRoute(
              path: '/products',
              region: 'content',
              builder: (context, state) => const ProductsView(),
            ),

            // ==================================================================
            // REUSABLE SHELL #2: TwoColumnShell (list + details)
            // Nested inside AppShell's content region
            // Used by: Users section
            // ==================================================================
            MosaiqueShellRoute(
              shellBuilder: (context) => const TwoColumnShell(),
              region: 'content', // Inject into parent's content region
              fixedRegions: {
                'list': (context) => const UsersListView(), // Always show list
              },
              routes: [
                // Users list only (no user selected)
                MosaiqueViewRoute(
                  path: '/users',
                  region: 'details', // Empty details region
                  builder: (context, state) => const SizedBox.shrink(),
                ),

                // User details → details region
                MosaiqueViewRoute(
                  path: '/users/:userId',
                  region: 'details',
                  builder: (context, state) =>
                      UserDetailsView(userId: state.pathParameters['userId']!),
                ),
              ],
            ),
          ],
        ),

        // =====================================================================
        // REUSABLE SHELL #3: SimpleShell (full-screen content only)
        // Used by: Login
        // =====================================================================
        MosaiqueShellRoute(
          shellBuilder: (context) => const SimpleShell(),
          routes: [
            // Login view → injected into SimpleShell's content region
            MosaiqueViewRoute(
              path: '/login',
              region: 'content',
              builder: (context, state) => const LoginView(),
            ),
          ],
        ),

        // =====================================================================
        // NO SHELL: Regular GoRoute for full-screen pages
        // =====================================================================
        GoRoute(
          path: '/settings',
          builder: (context, state) => Scaffold(
            appBar: AppBar(
              title: const Text('Settings'),
              leading: IconButton(
                icon: const Icon(Icons.arrow_back),
                onPressed: () => context.pop(),
              ),
            ),
            body: const SettingsView(),
          ),
        ),
      ],
    );

    return MaterialApp.router(
      title: 'Mosaique Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      routerConfig: router,
    );
  }
}
1
likes
150
points
137
downloads

Publisher

verified publisherzooper.dev

Weekly Downloads

A declarative, route-driven region-based view composition package for Flutter with go_router integration.

Repository (GitHub)
View/report issues

Topics

#routing #navigation #go-router #shell #regions

Documentation

API reference

License

MIT (license)

Dependencies

flutter, go_router

More

Packages that depend on mosaique