35 changed files with 2249 additions and 0 deletions
			
			
		@ -0,0 +1,44 @@
					 | 
				
			||||
# Miscellaneous | 
				
			||||
*.class | 
				
			||||
*.log | 
				
			||||
*.pyc | 
				
			||||
*.swp | 
				
			||||
.DS_Store | 
				
			||||
.atom/ | 
				
			||||
.buildlog/ | 
				
			||||
.history | 
				
			||||
.svn/ | 
				
			||||
migrate_working_dir/ | 
				
			||||
 | 
				
			||||
# IntelliJ related | 
				
			||||
*.iml | 
				
			||||
*.ipr | 
				
			||||
*.iws | 
				
			||||
.idea/ | 
				
			||||
 | 
				
			||||
# The .vscode folder contains launch configuration and tasks you configure in | 
				
			||||
# VS Code which you may wish to be included in version control, so this line | 
				
			||||
# is commented out by default. | 
				
			||||
#.vscode/ | 
				
			||||
 | 
				
			||||
# Flutter/Dart/Pub related | 
				
			||||
**/doc/api/ | 
				
			||||
**/ios/Flutter/.last_build_id | 
				
			||||
.dart_tool/ | 
				
			||||
.flutter-plugins | 
				
			||||
.flutter-plugins-dependencies | 
				
			||||
.packages | 
				
			||||
.pub-cache/ | 
				
			||||
.pub/ | 
				
			||||
/build/ | 
				
			||||
 | 
				
			||||
# Symbolication related | 
				
			||||
app.*.symbols | 
				
			||||
 | 
				
			||||
# Obfuscation related | 
				
			||||
app.*.map.json | 
				
			||||
 | 
				
			||||
# Android Studio will place build artifacts here | 
				
			||||
/android/app/debug | 
				
			||||
/android/app/profile | 
				
			||||
/android/app/release | 
				
			||||
@ -0,0 +1,45 @@
					 | 
				
			||||
# This file tracks properties of this Flutter project. | 
				
			||||
# Used by Flutter tool to assess capabilities and perform upgrades etc. | 
				
			||||
# | 
				
			||||
# This file should be version controlled. | 
				
			||||
 | 
				
			||||
version: | 
				
			||||
  revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
  channel: stable | 
				
			||||
 | 
				
			||||
project_type: app | 
				
			||||
 | 
				
			||||
# Tracks metadata for the flutter migrate command | 
				
			||||
migration: | 
				
			||||
  platforms: | 
				
			||||
    - platform: root | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
    - platform: android | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
    - platform: ios | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
    - platform: linux | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
    - platform: macos | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
    - platform: web | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
    - platform: windows | 
				
			||||
      create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
      base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8 | 
				
			||||
 | 
				
			||||
  # User provided section | 
				
			||||
 | 
				
			||||
  # List of Local paths (relative to this file) that should be | 
				
			||||
  # ignored by the migrate tool. | 
				
			||||
  # | 
				
			||||
  # Files that are not part of the templates will be ignored by default. | 
				
			||||
  unmanaged_files: | 
				
			||||
    - 'lib/main.dart' | 
				
			||||
    - 'ios/Runner.xcodeproj/project.pbxproj' | 
				
			||||
@ -0,0 +1,16 @@
					 | 
				
			||||
# adaptive_layout | 
				
			||||
 | 
				
			||||
A new Flutter project. | 
				
			||||
 | 
				
			||||
## Getting Started | 
				
			||||
 | 
				
			||||
This project is a starting point for a Flutter application. | 
				
			||||
 | 
				
			||||
A few resources to get you started if this is your first Flutter project: | 
				
			||||
 | 
				
			||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) | 
				
			||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) | 
				
			||||
 | 
				
			||||
For help getting started with Flutter development, view the | 
				
			||||
[online documentation](https://docs.flutter.dev/), which offers tutorials, | 
				
			||||
samples, guidance on mobile development, and a full API reference. | 
				
			||||
@ -0,0 +1,6 @@
					 | 
				
			||||
include: package:nit_picking/flutter.yaml | 
				
			||||
 | 
				
			||||
linter: | 
				
			||||
  rules: | 
				
			||||
    prefer_final_parameters: false | 
				
			||||
    prefer_expression_function_bodies: false | 
				
			||||
@ -0,0 +1,22 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/routes.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
 | 
				
			||||
void main() { | 
				
			||||
  runApp(const MyApp()); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
class MyApp extends StatelessWidget { | 
				
			||||
  const MyApp({super.key}); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(final BuildContext context) { | 
				
			||||
    return MaterialApp.router( | 
				
			||||
      title: 'Adaptive Layout Demo', | 
				
			||||
      theme: ThemeData( | 
				
			||||
        primaryColor: Colors.deepPurple, | 
				
			||||
        useMaterial3: true, | 
				
			||||
      ), | 
				
			||||
      routerConfig: router, | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,43 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/data.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
 | 
				
			||||
class NeonAccountSwitcher extends StatefulWidget { | 
				
			||||
  const NeonAccountSwitcher({super.key}); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  State<NeonAccountSwitcher> createState() => _NeonAccountSwitcherState(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
class _NeonAccountSwitcherState extends State<NeonAccountSwitcher> { | 
				
			||||
  int _activeAccount = 0; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final theme = Theme.of(context); | 
				
			||||
    final colorScheme = theme.colorScheme; | 
				
			||||
 | 
				
			||||
    return DropdownButtonHideUnderline( | 
				
			||||
      child: DropdownButton( | 
				
			||||
        isExpanded: true, | 
				
			||||
        dropdownColor: colorScheme.primary, | 
				
			||||
        iconEnabledColor: colorScheme.onPrimary, | 
				
			||||
        value: _activeAccount, | 
				
			||||
        items: const [ | 
				
			||||
          DropdownMenuItem( | 
				
			||||
            value: 0, | 
				
			||||
            child: DrawerItem(name: 'John Doe'), | 
				
			||||
          ), | 
				
			||||
          DropdownMenuItem( | 
				
			||||
            value: 1, | 
				
			||||
            child: DrawerItem(name: 'John Doe Work'), | 
				
			||||
          ), | 
				
			||||
        ], | 
				
			||||
        onChanged: (id) { | 
				
			||||
          setState(() { | 
				
			||||
            _activeAccount = id ?? 0; | 
				
			||||
          }); | 
				
			||||
        }, | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,20 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/destination.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
class App { | 
				
			||||
  App({ | 
				
			||||
    required this.destination, | 
				
			||||
    required this.route, | 
				
			||||
    String? routeName, | 
				
			||||
  })  : assert( | 
				
			||||
          routeName != null || route is GoRoute && route.name != null, | 
				
			||||
          'Routename must be specified when the route is not named.', | 
				
			||||
        ), | 
				
			||||
        routeName = route is GoRoute ? route.name! : routeName!; | 
				
			||||
 | 
				
			||||
  final RouteBase route; | 
				
			||||
 | 
				
			||||
  final NeonNavigationDestination destination; | 
				
			||||
 | 
				
			||||
  final String routeName; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,15 @@
					 | 
				
			||||
import 'package:flutter/widgets.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
abstract class NeonAppRoute extends GoRouteData { | 
				
			||||
  const NeonAppRoute(); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Page<void> buildPage(BuildContext context, GoRouterState state) { | 
				
			||||
    return NoTransitionPage( | 
				
			||||
      // Todo: cache the build to avoid duplicate animations. | 
				
			||||
      // might turn out against us having every app cached though :thinking: | 
				
			||||
      child: build(context, state), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,80 @@
					 | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
 | 
				
			||||
class DrawerItem extends StatelessWidget { | 
				
			||||
  const DrawerItem({ | 
				
			||||
    required this.name, | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final String name; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final colorScheme = Theme.of(context).colorScheme; | 
				
			||||
    return ListTile( | 
				
			||||
      leading: Icon( | 
				
			||||
        Icons.person_outline, | 
				
			||||
        color: colorScheme.onPrimary, | 
				
			||||
      ), | 
				
			||||
      title: Text( | 
				
			||||
        name, | 
				
			||||
        style: TextStyle( | 
				
			||||
          color: colorScheme.onPrimary, | 
				
			||||
        ), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
class NeonDrawerHeader extends StatelessWidget { | 
				
			||||
  const NeonDrawerHeader({ | 
				
			||||
    this.name = 'NextCloud', | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final String name; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    return SizedBox( | 
				
			||||
      height: 100, | 
				
			||||
      child: Padding( | 
				
			||||
        padding: const EdgeInsets.symmetric(horizontal: 24), | 
				
			||||
        child: Row( | 
				
			||||
          children: [ | 
				
			||||
            const Icon( | 
				
			||||
              Icons.cloud_outlined, | 
				
			||||
              size: 60, | 
				
			||||
            ), | 
				
			||||
            const SizedBox(width: 10), | 
				
			||||
            Text( | 
				
			||||
              name, | 
				
			||||
              style: const TextStyle(fontSize: 25), | 
				
			||||
            ), | 
				
			||||
          ], | 
				
			||||
        ), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
class NeonSettingsDrawerItem extends StatelessWidget { | 
				
			||||
  const NeonSettingsDrawerItem({ | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    return const Padding( | 
				
			||||
      // maybe drawerdestination | 
				
			||||
      padding: EdgeInsets.symmetric(horizontal: 28), | 
				
			||||
      child: Row( | 
				
			||||
        children: [ | 
				
			||||
          Icon(Icons.settings_outlined), | 
				
			||||
          SizedBox(width: 12), | 
				
			||||
          Text('settings'), | 
				
			||||
        ], | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,73 @@
					 | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
 | 
				
			||||
class NeonNavigationDestination { | 
				
			||||
  const NeonNavigationDestination({ | 
				
			||||
    required this.label, | 
				
			||||
    required this.icon, | 
				
			||||
    required this.selectedIcon, | 
				
			||||
    this.notificationCount = 0, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final String label; | 
				
			||||
  final Widget icon; | 
				
			||||
  final Widget selectedIcon; | 
				
			||||
  final int notificationCount; | 
				
			||||
 | 
				
			||||
  NavigationDestination toDestination() { | 
				
			||||
    return NavigationDestination( | 
				
			||||
      label: label, | 
				
			||||
      icon: icon, | 
				
			||||
      selectedIcon: selectedIcon, | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  NavigationRailDestination toRailDestination() { | 
				
			||||
    var iconWIdget = icon; | 
				
			||||
 | 
				
			||||
    if (notificationCount > 0) { | 
				
			||||
      iconWIdget = Stack( | 
				
			||||
        alignment: Alignment.bottomRight, | 
				
			||||
        children: [ | 
				
			||||
          Container( | 
				
			||||
            margin: const EdgeInsets.all(5), | 
				
			||||
            child: iconWIdget, | 
				
			||||
          ), | 
				
			||||
          Text(notificationCount.toString()), | 
				
			||||
        ], | 
				
			||||
      ); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    return NavigationRailDestination( | 
				
			||||
      label: Text(label), | 
				
			||||
      icon: iconWIdget, | 
				
			||||
      selectedIcon: selectedIcon, | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  NavigationDrawerDestination toDrawerDestination() { | 
				
			||||
    Widget labelWidget = Text(label); | 
				
			||||
 | 
				
			||||
    if (notificationCount > 0) { | 
				
			||||
      labelWidget = Row( | 
				
			||||
        mainAxisAlignment: MainAxisAlignment.spaceBetween, | 
				
			||||
        children: [ | 
				
			||||
          labelWidget, | 
				
			||||
          Text(notificationCount.toString()), | 
				
			||||
        ], | 
				
			||||
      ); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    return NavigationDrawerDestination( | 
				
			||||
      label: labelWidget, | 
				
			||||
      icon: icon, | 
				
			||||
      selectedIcon: selectedIcon, | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  Tab toTab() { | 
				
			||||
    return Tab( | 
				
			||||
      icon: icon, | 
				
			||||
      text: label, | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,30 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/destination.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
 | 
				
			||||
class NeonNavBarLayout extends SlotLayout { | 
				
			||||
  NeonNavBarLayout({ | 
				
			||||
    required List<NeonNavigationDestination> destinations, | 
				
			||||
    required ValueNotifier<int> valueListenable, | 
				
			||||
    super.key, | 
				
			||||
  }) : super( | 
				
			||||
          config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
            Breakpoints.small: SlotLayout.from( | 
				
			||||
              key: const Key('bottomNavigation'), | 
				
			||||
              outAnimation: AdaptiveScaffold.topToBottom, | 
				
			||||
              builder: (_) { | 
				
			||||
                return ValueListenableBuilder( | 
				
			||||
                  valueListenable: valueListenable, | 
				
			||||
                  builder: (context, value, child) => NavigationBar( | 
				
			||||
                    selectedIndex: value, | 
				
			||||
                    destinations: | 
				
			||||
                        destinations.map((d) => d.toDestination()).toList(), | 
				
			||||
                    onDestinationSelected: (index) => | 
				
			||||
                        valueListenable.value = index, | 
				
			||||
                  ), | 
				
			||||
                ); | 
				
			||||
              }, | 
				
			||||
            ), | 
				
			||||
          }, | 
				
			||||
        ); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,87 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/data.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/destination.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
 | 
				
			||||
class NeonNavRailLayout extends SlotLayout { | 
				
			||||
  NeonNavRailLayout({ | 
				
			||||
    required List<NeonNavigationDestination> destinations, | 
				
			||||
    required ValueNotifier<int> valueListenable, | 
				
			||||
    FloatingActionButton? floatingActionButton, | 
				
			||||
    super.key, | 
				
			||||
  }) : super( | 
				
			||||
          config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
            Breakpoints.medium: SlotLayout.from( | 
				
			||||
              key: const Key('primaryNavigation'), | 
				
			||||
              outAnimation: AdaptiveScaffold.leftInOut, | 
				
			||||
              builder: (_) { | 
				
			||||
                final fab = floatingActionButton != null | 
				
			||||
                    ? FloatingActionButton( | 
				
			||||
                        onPressed: floatingActionButton.onPressed, | 
				
			||||
                        tooltip: floatingActionButton.tooltip, | 
				
			||||
                        elevation: 0, | 
				
			||||
                        child: floatingActionButton.child, | 
				
			||||
                      ) | 
				
			||||
                    : const SizedBox(height: 56); | 
				
			||||
 | 
				
			||||
                return ValueListenableBuilder( | 
				
			||||
                  valueListenable: valueListenable, | 
				
			||||
                  builder: (context, value, child) => SizedBox( | 
				
			||||
                    width: 80, | 
				
			||||
                    child: NavigationRail( | 
				
			||||
                      leading: Column( | 
				
			||||
                        children: [ | 
				
			||||
                          const SizedBox(height: 56), | 
				
			||||
                          const DrawerButton(), | 
				
			||||
                          const SizedBox(height: 16), | 
				
			||||
                          fab, | 
				
			||||
                          const SizedBox(height: 80), | 
				
			||||
                        ], | 
				
			||||
                      ), | 
				
			||||
                      destinations: destinations.map((d) => d.toRailDestination()).toList(), | 
				
			||||
                      selectedIndex: value, | 
				
			||||
                      onDestinationSelected: (index) => valueListenable.value = index, | 
				
			||||
                      labelType: NavigationRailLabelType.all, | 
				
			||||
                    ), | 
				
			||||
                  ), | 
				
			||||
                ); | 
				
			||||
              }, | 
				
			||||
            ), | 
				
			||||
            Breakpoints.large: SlotLayout.from( | 
				
			||||
              key: const Key('Large primaryNavigation'), | 
				
			||||
              builder: (context) { | 
				
			||||
                // this is ugly. We should abstract this in another way | 
				
			||||
                final fab = floatingActionButton != null | 
				
			||||
                    ? FloatingActionButton.extended( | 
				
			||||
                        onPressed: floatingActionButton.onPressed, | 
				
			||||
                        label: Text(floatingActionButton.tooltip!), | 
				
			||||
                        icon: floatingActionButton.child, | 
				
			||||
                        elevation: 0, | 
				
			||||
                      ) | 
				
			||||
                    : null; | 
				
			||||
 | 
				
			||||
                return ValueListenableBuilder( | 
				
			||||
                  valueListenable: valueListenable, | 
				
			||||
                  builder: (context, value, child) => NavigationDrawer( | 
				
			||||
                    selectedIndex: value, | 
				
			||||
                    onDestinationSelected: (index) => valueListenable.value = index, | 
				
			||||
                    children: <Widget>[ | 
				
			||||
                      const NeonDrawerHeader(name: 'coolApp'), | 
				
			||||
                      if (fab != null) ...[ | 
				
			||||
                        Padding( | 
				
			||||
                          padding: const EdgeInsets.symmetric( | 
				
			||||
                            horizontal: 28, | 
				
			||||
                            vertical: 16, | 
				
			||||
                          ), | 
				
			||||
                          child: fab, | 
				
			||||
                        ), | 
				
			||||
                      ], | 
				
			||||
                      ...destinations.map((d) => d.toDrawerDestination()), | 
				
			||||
                    ], | 
				
			||||
                  ), | 
				
			||||
                ); | 
				
			||||
              }, | 
				
			||||
            ), | 
				
			||||
          }, | 
				
			||||
        ); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,26 @@
					 | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
 | 
				
			||||
class NeonTabBar extends InheritedWidget { | 
				
			||||
  const NeonTabBar({ | 
				
			||||
    required this.tabBarLayout, | 
				
			||||
    required super.child, | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final SlotLayout tabBarLayout; | 
				
			||||
 | 
				
			||||
  static NeonTabBar? maybeOf(BuildContext context) { | 
				
			||||
    return context.dependOnInheritedWidgetOfExactType<NeonTabBar>(); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  static NeonTabBar of(BuildContext context) { | 
				
			||||
    final result = maybeOf(context); | 
				
			||||
    assert(result != null, 'No NeonTabBar found in context'); | 
				
			||||
    return result!; | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  bool updateShouldNotify(NeonTabBar oldWidget) => | 
				
			||||
      tabBarLayout != oldWidget.tabBarLayout; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,80 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/app_interface.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/app_route.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/destination.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
part 'files.g.dart'; | 
				
			||||
part 'routes.dart'; | 
				
			||||
 | 
				
			||||
final view = ListView.builder( | 
				
			||||
  itemBuilder: (context, index) { | 
				
			||||
    return Card( | 
				
			||||
      child: ListTile( | 
				
			||||
        leading: const Icon(Icons.folder_outlined), | 
				
			||||
        title: const Text('item'), | 
				
			||||
        trailing: Text(index.toString()), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  }, | 
				
			||||
); | 
				
			||||
 | 
				
			||||
final fab = FloatingActionButton( | 
				
			||||
  onPressed: () {}, | 
				
			||||
  child: const Icon(Icons.add), | 
				
			||||
); | 
				
			||||
 | 
				
			||||
class FilesAppView extends StatelessWidget { | 
				
			||||
  const FilesAppView({ | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final topNavigation = NeonTabBar.of(context).tabBarLayout; | 
				
			||||
 | 
				
			||||
    return AdaptiveLayout( | 
				
			||||
      internalAnimations: false, | 
				
			||||
      topNavigation: topNavigation, | 
				
			||||
      body: SlotLayout( | 
				
			||||
        config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
          Breakpoints.standard: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (context) { | 
				
			||||
              final drawerButton = DrawerButton( | 
				
			||||
                onPressed: Scaffold.of(context).openDrawer, | 
				
			||||
              ); | 
				
			||||
 | 
				
			||||
              return Scaffold( | 
				
			||||
                appBar: AppBar( | 
				
			||||
                  leading: drawerButton, | 
				
			||||
                  title: const Text('Files'), | 
				
			||||
                ), | 
				
			||||
                body: view, | 
				
			||||
                floatingActionButton: fab, | 
				
			||||
              ); | 
				
			||||
            }, | 
				
			||||
          ), | 
				
			||||
          Breakpoints.large: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (_) => Scaffold( | 
				
			||||
              body: view, | 
				
			||||
              floatingActionButton: fab, | 
				
			||||
            ), | 
				
			||||
          ), | 
				
			||||
        }, | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
final filesApp = App( | 
				
			||||
  route: $filesAppRoute, | 
				
			||||
  destination: const NeonNavigationDestination( | 
				
			||||
    icon: Icon(Icons.folder_outlined), | 
				
			||||
    selectedIcon: Icon(Icons.folder), | 
				
			||||
    label: 'Files', | 
				
			||||
  ), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,32 @@
					 | 
				
			||||
// GENERATED CODE - DO NOT MODIFY BY HAND | 
				
			||||
 | 
				
			||||
part of 'files.dart'; | 
				
			||||
 | 
				
			||||
// ************************************************************************** | 
				
			||||
// GoRouterGenerator | 
				
			||||
// ************************************************************************** | 
				
			||||
 | 
				
			||||
List<RouteBase> get $appRoutes => [ | 
				
			||||
      $filesAppRoute, | 
				
			||||
    ]; | 
				
			||||
 | 
				
			||||
RouteBase get $filesAppRoute => GoRouteData.$route( | 
				
			||||
      path: '/apps/files', | 
				
			||||
      name: 'filesApp', | 
				
			||||
      factory: $FilesAppRouteExtension._fromState, | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
extension $FilesAppRouteExtension on FilesAppRoute { | 
				
			||||
  static FilesAppRoute _fromState(GoRouterState state) => const FilesAppRoute(); | 
				
			||||
 | 
				
			||||
  String get location => GoRouteData.$location( | 
				
			||||
        '/apps/files', | 
				
			||||
      ); | 
				
			||||
 | 
				
			||||
  void go(BuildContext context) => context.go(location); | 
				
			||||
 | 
				
			||||
  Future<T?> push<T>(BuildContext context) => context.push<T>(location); | 
				
			||||
 | 
				
			||||
  void pushReplacement(BuildContext context) => | 
				
			||||
      context.pushReplacement(location); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,15 @@
					 | 
				
			||||
part of 'files.dart'; | 
				
			||||
 | 
				
			||||
@TypedGoRoute<FilesAppRoute>( | 
				
			||||
  path: '/apps/files', | 
				
			||||
  name: 'filesApp', | 
				
			||||
) | 
				
			||||
@immutable | 
				
			||||
class FilesAppRoute extends NeonAppRoute { | 
				
			||||
  const FilesAppRoute(); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context, GoRouterState state) { | 
				
			||||
    return const FilesAppView(); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,135 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/account_switcher.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/data.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; | 
				
			||||
import 'package:adaptive_layout/src/files/files.dart'; | 
				
			||||
import 'package:adaptive_layout/src/news/news.dart'; | 
				
			||||
import 'package:adaptive_layout/src/notes/notes.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
final apps = [ | 
				
			||||
  filesApp, | 
				
			||||
  notesApp, | 
				
			||||
  newsApp, | 
				
			||||
]; | 
				
			||||
 | 
				
			||||
class NeonMainView extends StatefulWidget { | 
				
			||||
  const NeonMainView({ | 
				
			||||
    required this.state, | 
				
			||||
    required this.view, | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final GoRouterState state; | 
				
			||||
  final Widget view; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  State<NeonMainView> createState() => _NeonMainViewState(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
class _NeonMainViewState extends State<NeonMainView> with SingleTickerProviderStateMixin { | 
				
			||||
  final _scaffoldKey = GlobalKey<ScaffoldState>(); | 
				
			||||
  late TabController _tabController; | 
				
			||||
 | 
				
			||||
  int _activeApp = 0; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  void initState() { | 
				
			||||
    super.initState(); | 
				
			||||
 | 
				
			||||
    _tabController = TabController( | 
				
			||||
      vsync: this, | 
				
			||||
      length: apps.length, | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  void dispose() { | 
				
			||||
    _tabController.dispose(); | 
				
			||||
    super.dispose(); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  void onAppChange(int index) { | 
				
			||||
    context.goNamed(apps[index].routeName); | 
				
			||||
 | 
				
			||||
    setState(() { | 
				
			||||
      _activeApp = index; | 
				
			||||
    }); | 
				
			||||
 | 
				
			||||
    _scaffoldKey.currentState?.closeDrawer(); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final theme = Theme.of(context); | 
				
			||||
    final colorScheme = theme.colorScheme; | 
				
			||||
 | 
				
			||||
    final header = DrawerHeader( | 
				
			||||
      decoration: BoxDecoration( | 
				
			||||
        color: colorScheme.primary, | 
				
			||||
      ), | 
				
			||||
      child: Column( | 
				
			||||
        children: [ | 
				
			||||
          Expanded( | 
				
			||||
            child: Center( | 
				
			||||
              child: Icon( | 
				
			||||
                Icons.cloud_outlined, // that's the new NC icon for sure | 
				
			||||
                size: 100, | 
				
			||||
                color: colorScheme.onPrimary, | 
				
			||||
              ), | 
				
			||||
            ), | 
				
			||||
          ), | 
				
			||||
          const NeonAccountSwitcher(), | 
				
			||||
        ], | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
    final drawer = NavigationDrawer( | 
				
			||||
      selectedIndex: _activeApp, | 
				
			||||
      onDestinationSelected: onAppChange, | 
				
			||||
      children: [ | 
				
			||||
        header, | 
				
			||||
        ...apps.map((app) => app.destination.toDrawerDestination()), | 
				
			||||
        const NeonSettingsDrawerItem(), | 
				
			||||
      ], | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
    final topNavigation = SlotLayout( | 
				
			||||
      config: { | 
				
			||||
        Breakpoints.large: SlotLayout.from( | 
				
			||||
          key: const Key('Large topNavigation'), | 
				
			||||
          builder: (context) { | 
				
			||||
            return Row( | 
				
			||||
              children: [ | 
				
			||||
                Expanded( | 
				
			||||
                  child: TabBar( | 
				
			||||
                    tabs: apps.map((a) => a.destination.toTab()).toList(), | 
				
			||||
                    onTap: onAppChange, | 
				
			||||
                    isScrollable: true, | 
				
			||||
                  ), | 
				
			||||
                ), | 
				
			||||
                IconButton( | 
				
			||||
                  onPressed: () {}, | 
				
			||||
                  icon: const Icon(Icons.person_outline), | 
				
			||||
                ), | 
				
			||||
              ], | 
				
			||||
            ); | 
				
			||||
          }, | 
				
			||||
        ), | 
				
			||||
      }, | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
    return Scaffold( | 
				
			||||
      key: _scaffoldKey, | 
				
			||||
      drawer: drawer, | 
				
			||||
      body: DefaultTabController( | 
				
			||||
        length: apps.length, | 
				
			||||
        child: NeonTabBar( | 
				
			||||
          tabBarLayout: topNavigation, | 
				
			||||
          child: widget.view, | 
				
			||||
        ), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,141 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/app_interface.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/app_route.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/destination.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
part 'news.g.dart'; | 
				
			||||
part 'routes.dart'; | 
				
			||||
 | 
				
			||||
class NewsAppView extends StatelessWidget { | 
				
			||||
  const NewsAppView({ | 
				
			||||
    this.articleID, | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final int? articleID; | 
				
			||||
 | 
				
			||||
  Widget secondaryBodyNuilder(BuildContext context) { | 
				
			||||
    return NewsSecondaryView(id: articleID!); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final topNavigation = NeonTabBar.of(context).tabBarLayout; | 
				
			||||
 | 
				
			||||
    final listView = ListView.builder( | 
				
			||||
      itemBuilder: (context, index) { | 
				
			||||
        return Card( | 
				
			||||
          child: ListTile( | 
				
			||||
            leading: const Icon(Icons.article_outlined), | 
				
			||||
            title: const Text('item'), | 
				
			||||
            trailing: Text(index.toString()), | 
				
			||||
            onTap: () => NewsAppRoute(index).go(context), | 
				
			||||
          ), | 
				
			||||
        ); | 
				
			||||
      }, | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
    return AdaptiveLayout( | 
				
			||||
      internalAnimations: false, | 
				
			||||
      topNavigation: topNavigation, | 
				
			||||
      body: SlotLayout( | 
				
			||||
        config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
          Breakpoints.standard: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (context) { | 
				
			||||
              final drawerButton = DrawerButton( | 
				
			||||
                onPressed: Scaffold.of(context).openDrawer, | 
				
			||||
              ); | 
				
			||||
 | 
				
			||||
              return Scaffold( | 
				
			||||
                appBar: AppBar( | 
				
			||||
                  leading: drawerButton, | 
				
			||||
                  title: const Text('News'), | 
				
			||||
                ), | 
				
			||||
                body: listView, | 
				
			||||
              ); | 
				
			||||
            }, | 
				
			||||
          ), | 
				
			||||
          if (articleID != null) ...{ | 
				
			||||
            Breakpoints.small: SlotLayout.from( | 
				
			||||
              key: const Key('body'), | 
				
			||||
              builder: (context) { | 
				
			||||
                return NewsSecondaryView( | 
				
			||||
                  id: articleID!, | 
				
			||||
                  isPage: true, | 
				
			||||
                ); | 
				
			||||
              }, | 
				
			||||
            ) | 
				
			||||
          }, | 
				
			||||
          Breakpoints.large: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (_) => Scaffold( | 
				
			||||
              body: listView, | 
				
			||||
            ), | 
				
			||||
          ), | 
				
			||||
        }, | 
				
			||||
      ), | 
				
			||||
      secondaryBody: SlotLayout( | 
				
			||||
        config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
          Breakpoints.mediumAndUp: SlotLayout.from( | 
				
			||||
            key: const Key('secondaryBody'), | 
				
			||||
            builder: articleID != null | 
				
			||||
                ? secondaryBodyNuilder | 
				
			||||
                : AdaptiveScaffold.emptyBuilder, | 
				
			||||
          ), | 
				
			||||
        }, | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
class NewsSecondaryView extends StatelessWidget { | 
				
			||||
  const NewsSecondaryView({ | 
				
			||||
    required this.id, | 
				
			||||
    this.isPage = false, | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  final int id; | 
				
			||||
  final bool isPage; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final appBar = AppBar( | 
				
			||||
      leading: BackButton( | 
				
			||||
        onPressed: () => const NewsAppRoute().go(context), | 
				
			||||
      ), | 
				
			||||
      title: const Text('NewsItem'), | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
    return Scaffold( | 
				
			||||
      appBar: isPage ? appBar : null, | 
				
			||||
      body: Center( | 
				
			||||
        child: Column( | 
				
			||||
          mainAxisAlignment: MainAxisAlignment.center, | 
				
			||||
          children: [ | 
				
			||||
            const FlutterLogo(size: 100), | 
				
			||||
            const SizedBox(height: 30), | 
				
			||||
            Text( | 
				
			||||
              id.toString(), | 
				
			||||
              style: Theme.of(context).textTheme.headlineLarge, | 
				
			||||
            ), | 
				
			||||
          ], | 
				
			||||
        ), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
final newsApp = App( | 
				
			||||
  route: $newsAppRoute, | 
				
			||||
  destination: const NeonNavigationDestination( | 
				
			||||
    icon: Icon(Icons.notes_outlined), | 
				
			||||
    selectedIcon: Icon(Icons.notes), | 
				
			||||
    label: 'News', | 
				
			||||
    notificationCount: 100, | 
				
			||||
  ), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,46 @@
					 | 
				
			||||
// GENERATED CODE - DO NOT MODIFY BY HAND | 
				
			||||
 | 
				
			||||
part of 'news.dart'; | 
				
			||||
 | 
				
			||||
// ************************************************************************** | 
				
			||||
// GoRouterGenerator | 
				
			||||
// ************************************************************************** | 
				
			||||
 | 
				
			||||
List<RouteBase> get $appRoutes => [ | 
				
			||||
      $newsAppRoute, | 
				
			||||
    ]; | 
				
			||||
 | 
				
			||||
RouteBase get $newsAppRoute => GoRouteData.$route( | 
				
			||||
      path: '/apps/news', | 
				
			||||
      name: 'newsApp', | 
				
			||||
      factory: $NewsAppRouteExtension._fromState, | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
extension $NewsAppRouteExtension on NewsAppRoute { | 
				
			||||
  static NewsAppRoute _fromState(GoRouterState state) => NewsAppRoute( | 
				
			||||
        _$convertMapValue('article-i-d', state.queryParameters, int.parse), | 
				
			||||
      ); | 
				
			||||
 | 
				
			||||
  String get location => GoRouteData.$location( | 
				
			||||
        '/apps/news', | 
				
			||||
        queryParams: { | 
				
			||||
          if (articleID != null) 'article-i-d': articleID!.toString(), | 
				
			||||
        }, | 
				
			||||
      ); | 
				
			||||
 | 
				
			||||
  void go(BuildContext context) => context.go(location); | 
				
			||||
 | 
				
			||||
  Future<T?> push<T>(BuildContext context) => context.push<T>(location); | 
				
			||||
 | 
				
			||||
  void pushReplacement(BuildContext context) => | 
				
			||||
      context.pushReplacement(location); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
T? _$convertMapValue<T>( | 
				
			||||
  String key, | 
				
			||||
  Map<String, String> map, | 
				
			||||
  T Function(String) converter, | 
				
			||||
) { | 
				
			||||
  final value = map[key]; | 
				
			||||
  return value == null ? null : converter(value); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,17 @@
					 | 
				
			||||
part of 'news.dart'; | 
				
			||||
 | 
				
			||||
@TypedGoRoute<NewsAppRoute>( | 
				
			||||
  path: '/apps/news', | 
				
			||||
  name: 'newsApp', | 
				
			||||
) | 
				
			||||
@immutable | 
				
			||||
class NewsAppRoute extends NeonAppRoute { | 
				
			||||
  const NewsAppRoute([this.articleID]); | 
				
			||||
 | 
				
			||||
  final int? articleID; | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context, GoRouterState state) { | 
				
			||||
    return NewsAppView(articleID: articleID); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,149 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/app_neon/app_interface.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/app_route.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/destination.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/widgets/navbar_layout.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/widgets/navrail_layout.dart'; | 
				
			||||
import 'package:adaptive_layout/src/app_neon/widgets/tabbar_layout.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
part 'notes.g.dart'; | 
				
			||||
part 'routes.dart'; | 
				
			||||
 | 
				
			||||
final _destinations = <NeonNavigationDestination>[ | 
				
			||||
  const NeonNavigationDestination( | 
				
			||||
    icon: Icon(Icons.note_outlined), | 
				
			||||
    selectedIcon: Icon(Icons.note), | 
				
			||||
    label: 'Notes', | 
				
			||||
  ), | 
				
			||||
  const NeonNavigationDestination( | 
				
			||||
    icon: Icon(Icons.label_outline), | 
				
			||||
    selectedIcon: Icon(Icons.label), | 
				
			||||
    label: 'Category', | 
				
			||||
  ), | 
				
			||||
]; | 
				
			||||
 | 
				
			||||
final _appNavNotifier = ValueNotifier<int>(0); | 
				
			||||
 | 
				
			||||
final _listView = ListView.builder( | 
				
			||||
  itemBuilder: (context, index) { | 
				
			||||
    return Card( | 
				
			||||
      child: ListTile( | 
				
			||||
        leading: const Icon(Icons.article_outlined), | 
				
			||||
        title: const Text('item'), | 
				
			||||
        trailing: Text(index.toString()), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  }, | 
				
			||||
); | 
				
			||||
 | 
				
			||||
final _gridView = GridView.builder( | 
				
			||||
  itemBuilder: (context, index) { | 
				
			||||
    return Card( | 
				
			||||
      child: ListTile( | 
				
			||||
        leading: const Icon(Icons.article_outlined), | 
				
			||||
        title: const Text('item'), | 
				
			||||
        trailing: Text(index.toString()), | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  }, | 
				
			||||
  gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(maxCrossAxisExtent: 150), | 
				
			||||
); | 
				
			||||
 | 
				
			||||
final view = ValueListenableBuilder( | 
				
			||||
  valueListenable: _appNavNotifier, | 
				
			||||
  builder: (context, value, child) { | 
				
			||||
    if (value == 1) { | 
				
			||||
      return _gridView; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    return _listView; | 
				
			||||
  }, | 
				
			||||
); | 
				
			||||
 | 
				
			||||
final fab = FloatingActionButton( | 
				
			||||
  onPressed: () {}, | 
				
			||||
  tooltip: 'Create Note', | 
				
			||||
  child: const Icon(Icons.add), | 
				
			||||
); | 
				
			||||
 | 
				
			||||
class NotesAppView extends StatelessWidget { | 
				
			||||
  const NotesAppView({ | 
				
			||||
    super.key, | 
				
			||||
  }); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context) { | 
				
			||||
    final topNavigation = NeonTabBar.of(context).tabBarLayout; | 
				
			||||
 | 
				
			||||
    return AdaptiveLayout( | 
				
			||||
      internalAnimations: false, | 
				
			||||
      topNavigation: topNavigation, | 
				
			||||
      body: SlotLayout( | 
				
			||||
        config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
          Breakpoints.standard: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (_) => Scaffold( | 
				
			||||
              body: view, | 
				
			||||
            ), | 
				
			||||
          ), | 
				
			||||
          Breakpoints.small: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (context) { | 
				
			||||
              final drawerButton = DrawerButton( | 
				
			||||
                onPressed: Scaffold.of(context).openDrawer, | 
				
			||||
              ); | 
				
			||||
 | 
				
			||||
              return Scaffold( | 
				
			||||
                appBar: AppBar( | 
				
			||||
                  leading: drawerButton, | 
				
			||||
                  title: const Text('Notes'), | 
				
			||||
                ), | 
				
			||||
                body: view, | 
				
			||||
                floatingActionButton: fab, | 
				
			||||
              ); | 
				
			||||
            }, | 
				
			||||
          ), | 
				
			||||
        }, | 
				
			||||
      ), | 
				
			||||
      secondaryBody: SlotLayout( | 
				
			||||
        config: <Breakpoint, SlotLayoutConfig?>{ | 
				
			||||
          Breakpoints.mediumAndUp: SlotLayout.from( | 
				
			||||
            key: const Key('body'), | 
				
			||||
            builder: (_) => Scaffold( | 
				
			||||
              body: ListView.builder( | 
				
			||||
                itemBuilder: (context, index) { | 
				
			||||
                  return Card( | 
				
			||||
                    child: ListTile( | 
				
			||||
                      title: const Text('item'), | 
				
			||||
                      trailing: Text(index.toString()), | 
				
			||||
                    ), | 
				
			||||
                  ); | 
				
			||||
                }, | 
				
			||||
              ), | 
				
			||||
            ), | 
				
			||||
          ), | 
				
			||||
        }, | 
				
			||||
      ), | 
				
			||||
      primaryNavigation: NeonNavRailLayout( | 
				
			||||
        destinations: _destinations, | 
				
			||||
        valueListenable: _appNavNotifier, | 
				
			||||
        floatingActionButton: fab, | 
				
			||||
      ), | 
				
			||||
      bottomNavigation: NeonNavBarLayout( | 
				
			||||
        destinations: _destinations, | 
				
			||||
        valueListenable: _appNavNotifier, | 
				
			||||
      ), | 
				
			||||
    ); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
final notesApp = App( | 
				
			||||
  route: $notesAppRoute, | 
				
			||||
  destination: const NeonNavigationDestination( | 
				
			||||
    icon: Icon(Icons.edit_outlined), | 
				
			||||
    selectedIcon: Icon(Icons.edit), | 
				
			||||
    label: 'Notes', | 
				
			||||
  ), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,32 @@
					 | 
				
			||||
// GENERATED CODE - DO NOT MODIFY BY HAND | 
				
			||||
 | 
				
			||||
part of 'notes.dart'; | 
				
			||||
 | 
				
			||||
// ************************************************************************** | 
				
			||||
// GoRouterGenerator | 
				
			||||
// ************************************************************************** | 
				
			||||
 | 
				
			||||
List<RouteBase> get $appRoutes => [ | 
				
			||||
      $notesAppRoute, | 
				
			||||
    ]; | 
				
			||||
 | 
				
			||||
RouteBase get $notesAppRoute => GoRouteData.$route( | 
				
			||||
      path: '/apps/notes', | 
				
			||||
      name: 'notesApp', | 
				
			||||
      factory: $NotesAppRouteExtension._fromState, | 
				
			||||
    ); | 
				
			||||
 | 
				
			||||
extension $NotesAppRouteExtension on NotesAppRoute { | 
				
			||||
  static NotesAppRoute _fromState(GoRouterState state) => const NotesAppRoute(); | 
				
			||||
 | 
				
			||||
  String get location => GoRouteData.$location( | 
				
			||||
        '/apps/notes', | 
				
			||||
      ); | 
				
			||||
 | 
				
			||||
  void go(BuildContext context) => context.go(location); | 
				
			||||
 | 
				
			||||
  Future<T?> push<T>(BuildContext context) => context.push<T>(location); | 
				
			||||
 | 
				
			||||
  void pushReplacement(BuildContext context) => | 
				
			||||
      context.pushReplacement(location); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,15 @@
					 | 
				
			||||
part of 'notes.dart'; | 
				
			||||
 | 
				
			||||
@TypedGoRoute<NotesAppRoute>( | 
				
			||||
  path: '/apps/notes', | 
				
			||||
  name: 'notesApp', | 
				
			||||
) | 
				
			||||
@immutable | 
				
			||||
class NotesAppRoute extends NeonAppRoute { | 
				
			||||
  const NotesAppRoute(); | 
				
			||||
 | 
				
			||||
  @override | 
				
			||||
  Widget build(BuildContext context, GoRouterState state) { | 
				
			||||
    return const NotesAppView(); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,26 @@
					 | 
				
			||||
import 'package:adaptive_layout/src/files/files.dart'; | 
				
			||||
import 'package:adaptive_layout/src/main_view.dart'; | 
				
			||||
import 'package:flutter/material.dart'; | 
				
			||||
import 'package:go_router/go_router.dart'; | 
				
			||||
 | 
				
			||||
final GlobalKey<NavigatorState> _rootKey = GlobalKey<NavigatorState>(); | 
				
			||||
final GlobalKey<NavigatorState> _appsKey = GlobalKey<NavigatorState>(); | 
				
			||||
 | 
				
			||||
final router = GoRouter( | 
				
			||||
  navigatorKey: _rootKey, | 
				
			||||
  initialLocation: const FilesAppRoute().location, | 
				
			||||
  routes: [ | 
				
			||||
    ShellRoute( | 
				
			||||
      navigatorKey: _appsKey, | 
				
			||||
      builder: (context, state, navigator) { | 
				
			||||
        return NeonMainView( | 
				
			||||
          state: state, | 
				
			||||
          view: navigator, | 
				
			||||
        ); | 
				
			||||
      }, | 
				
			||||
      routes: [ | 
				
			||||
        ...apps.map((a) => a.route), | 
				
			||||
      ], | 
				
			||||
    ), | 
				
			||||
  ], | 
				
			||||
); | 
				
			||||
@ -0,0 +1 @@
					 | 
				
			||||
flutter/ephemeral | 
				
			||||
@ -0,0 +1,139 @@
					 | 
				
			||||
# Project-level configuration. | 
				
			||||
cmake_minimum_required(VERSION 3.10) | 
				
			||||
project(runner LANGUAGES CXX) | 
				
			||||
 | 
				
			||||
# The name of the executable created for the application. Change this to change | 
				
			||||
# the on-disk name of your application. | 
				
			||||
set(BINARY_NAME "adaptive_layout") | 
				
			||||
# The unique GTK application identifier for this application. See: | 
				
			||||
# https://wiki.gnome.org/HowDoI/ChooseApplicationID | 
				
			||||
set(APPLICATION_ID "com.example.adaptive_layout") | 
				
			||||
 | 
				
			||||
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent | 
				
			||||
# versions of CMake. | 
				
			||||
cmake_policy(SET CMP0063 NEW) | 
				
			||||
 | 
				
			||||
# Load bundled libraries from the lib/ directory relative to the binary. | 
				
			||||
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") | 
				
			||||
 | 
				
			||||
# Root filesystem for cross-building. | 
				
			||||
if(FLUTTER_TARGET_PLATFORM_SYSROOT) | 
				
			||||
  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) | 
				
			||||
  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) | 
				
			||||
  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | 
				
			||||
  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | 
				
			||||
  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | 
				
			||||
  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | 
				
			||||
endif() | 
				
			||||
 | 
				
			||||
# Define build configuration options. | 
				
			||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) | 
				
			||||
  set(CMAKE_BUILD_TYPE "Debug" CACHE | 
				
			||||
    STRING "Flutter build mode" FORCE) | 
				
			||||
  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS | 
				
			||||
    "Debug" "Profile" "Release") | 
				
			||||
endif() | 
				
			||||
 | 
				
			||||
# Compilation settings that should be applied to most targets. | 
				
			||||
# | 
				
			||||
# Be cautious about adding new options here, as plugins use this function by | 
				
			||||
# default. In most cases, you should add new options to specific targets instead | 
				
			||||
# of modifying this function. | 
				
			||||
function(APPLY_STANDARD_SETTINGS TARGET) | 
				
			||||
  target_compile_features(${TARGET} PUBLIC cxx_std_14) | 
				
			||||
  target_compile_options(${TARGET} PRIVATE -Wall -Werror) | 
				
			||||
  target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>") | 
				
			||||
  target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>") | 
				
			||||
endfunction() | 
				
			||||
 | 
				
			||||
# Flutter library and tool build rules. | 
				
			||||
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") | 
				
			||||
add_subdirectory(${FLUTTER_MANAGED_DIR}) | 
				
			||||
 | 
				
			||||
# System-level dependencies. | 
				
			||||
find_package(PkgConfig REQUIRED) | 
				
			||||
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) | 
				
			||||
 | 
				
			||||
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") | 
				
			||||
 | 
				
			||||
# Define the application target. To change its name, change BINARY_NAME above, | 
				
			||||
# not the value here, or `flutter run` will no longer work. | 
				
			||||
# | 
				
			||||
# Any new source files that you add to the application should be added here. | 
				
			||||
add_executable(${BINARY_NAME} | 
				
			||||
  "main.cc" | 
				
			||||
  "my_application.cc" | 
				
			||||
  "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
# Apply the standard set of build settings. This can be removed for applications | 
				
			||||
# that need different build settings. | 
				
			||||
apply_standard_settings(${BINARY_NAME}) | 
				
			||||
 | 
				
			||||
# Add dependency libraries. Add any application-specific dependencies here. | 
				
			||||
target_link_libraries(${BINARY_NAME} PRIVATE flutter) | 
				
			||||
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) | 
				
			||||
 | 
				
			||||
# Run the Flutter tool portions of the build. This must not be removed. | 
				
			||||
add_dependencies(${BINARY_NAME} flutter_assemble) | 
				
			||||
 | 
				
			||||
# Only the install-generated bundle's copy of the executable will launch | 
				
			||||
# correctly, since the resources must in the right relative locations. To avoid | 
				
			||||
# people trying to run the unbundled copy, put it in a subdirectory instead of | 
				
			||||
# the default top-level location. | 
				
			||||
set_target_properties(${BINARY_NAME} | 
				
			||||
  PROPERTIES | 
				
			||||
  RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# Generated plugin build rules, which manage building the plugins and adding | 
				
			||||
# them to the application. | 
				
			||||
include(flutter/generated_plugins.cmake) | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# === Installation === | 
				
			||||
# By default, "installing" just makes a relocatable bundle in the build | 
				
			||||
# directory. | 
				
			||||
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") | 
				
			||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) | 
				
			||||
  set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) | 
				
			||||
endif() | 
				
			||||
 | 
				
			||||
# Start with a clean build bundle directory every time. | 
				
			||||
install(CODE " | 
				
			||||
  file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") | 
				
			||||
  " COMPONENT Runtime) | 
				
			||||
 | 
				
			||||
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") | 
				
			||||
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") | 
				
			||||
 | 
				
			||||
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" | 
				
			||||
  COMPONENT Runtime) | 
				
			||||
 | 
				
			||||
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" | 
				
			||||
  COMPONENT Runtime) | 
				
			||||
 | 
				
			||||
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" | 
				
			||||
  COMPONENT Runtime) | 
				
			||||
 | 
				
			||||
foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) | 
				
			||||
  install(FILES "${bundled_library}" | 
				
			||||
    DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" | 
				
			||||
    COMPONENT Runtime) | 
				
			||||
endforeach(bundled_library) | 
				
			||||
 | 
				
			||||
# Fully re-copy the assets directory on each build to avoid having stale files | 
				
			||||
# from a previous install. | 
				
			||||
set(FLUTTER_ASSET_DIR_NAME "flutter_assets") | 
				
			||||
install(CODE " | 
				
			||||
  file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") | 
				
			||||
  " COMPONENT Runtime) | 
				
			||||
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" | 
				
			||||
  DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) | 
				
			||||
 | 
				
			||||
# Install the AOT library on non-Debug builds only. | 
				
			||||
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") | 
				
			||||
  install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" | 
				
			||||
    COMPONENT Runtime) | 
				
			||||
endif() | 
				
			||||
@ -0,0 +1,88 @@
					 | 
				
			||||
# This file controls Flutter-level build steps. It should not be edited. | 
				
			||||
cmake_minimum_required(VERSION 3.10) | 
				
			||||
 | 
				
			||||
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") | 
				
			||||
 | 
				
			||||
# Configuration provided via flutter tool. | 
				
			||||
include(${EPHEMERAL_DIR}/generated_config.cmake) | 
				
			||||
 | 
				
			||||
# TODO: Move the rest of this into files in ephemeral. See | 
				
			||||
# https://github.com/flutter/flutter/issues/57146. | 
				
			||||
 | 
				
			||||
# Serves the same purpose as list(TRANSFORM ... PREPEND ...), | 
				
			||||
# which isn't available in 3.10. | 
				
			||||
function(list_prepend LIST_NAME PREFIX) | 
				
			||||
    set(NEW_LIST "") | 
				
			||||
    foreach(element ${${LIST_NAME}}) | 
				
			||||
        list(APPEND NEW_LIST "${PREFIX}${element}") | 
				
			||||
    endforeach(element) | 
				
			||||
    set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) | 
				
			||||
endfunction() | 
				
			||||
 | 
				
			||||
# === Flutter Library === | 
				
			||||
# System-level dependencies. | 
				
			||||
find_package(PkgConfig REQUIRED) | 
				
			||||
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) | 
				
			||||
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) | 
				
			||||
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) | 
				
			||||
 | 
				
			||||
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") | 
				
			||||
 | 
				
			||||
# Published to parent scope for install step. | 
				
			||||
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) | 
				
			||||
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) | 
				
			||||
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) | 
				
			||||
set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) | 
				
			||||
 | 
				
			||||
list(APPEND FLUTTER_LIBRARY_HEADERS | 
				
			||||
  "fl_basic_message_channel.h" | 
				
			||||
  "fl_binary_codec.h" | 
				
			||||
  "fl_binary_messenger.h" | 
				
			||||
  "fl_dart_project.h" | 
				
			||||
  "fl_engine.h" | 
				
			||||
  "fl_json_message_codec.h" | 
				
			||||
  "fl_json_method_codec.h" | 
				
			||||
  "fl_message_codec.h" | 
				
			||||
  "fl_method_call.h" | 
				
			||||
  "fl_method_channel.h" | 
				
			||||
  "fl_method_codec.h" | 
				
			||||
  "fl_method_response.h" | 
				
			||||
  "fl_plugin_registrar.h" | 
				
			||||
  "fl_plugin_registry.h" | 
				
			||||
  "fl_standard_message_codec.h" | 
				
			||||
  "fl_standard_method_codec.h" | 
				
			||||
  "fl_string_codec.h" | 
				
			||||
  "fl_value.h" | 
				
			||||
  "fl_view.h" | 
				
			||||
  "flutter_linux.h" | 
				
			||||
) | 
				
			||||
list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") | 
				
			||||
add_library(flutter INTERFACE) | 
				
			||||
target_include_directories(flutter INTERFACE | 
				
			||||
  "${EPHEMERAL_DIR}" | 
				
			||||
) | 
				
			||||
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") | 
				
			||||
target_link_libraries(flutter INTERFACE | 
				
			||||
  PkgConfig::GTK | 
				
			||||
  PkgConfig::GLIB | 
				
			||||
  PkgConfig::GIO | 
				
			||||
) | 
				
			||||
add_dependencies(flutter flutter_assemble) | 
				
			||||
 | 
				
			||||
# === Flutter tool backend === | 
				
			||||
# _phony_ is a non-existent file to force this command to run every time, | 
				
			||||
# since currently there's no way to get a full input/output list from the | 
				
			||||
# flutter tool. | 
				
			||||
add_custom_command( | 
				
			||||
  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} | 
				
			||||
    ${CMAKE_CURRENT_BINARY_DIR}/_phony_ | 
				
			||||
  COMMAND ${CMAKE_COMMAND} -E env | 
				
			||||
    ${FLUTTER_TOOL_ENVIRONMENT} | 
				
			||||
    "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" | 
				
			||||
      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} | 
				
			||||
  VERBATIM | 
				
			||||
) | 
				
			||||
add_custom_target(flutter_assemble DEPENDS | 
				
			||||
  "${FLUTTER_LIBRARY}" | 
				
			||||
  ${FLUTTER_LIBRARY_HEADERS} | 
				
			||||
) | 
				
			||||
@ -0,0 +1,11 @@
					 | 
				
			||||
//
 | 
				
			||||
//  Generated file. Do not edit.
 | 
				
			||||
//
 | 
				
			||||
 | 
				
			||||
// clang-format off
 | 
				
			||||
 | 
				
			||||
#include "generated_plugin_registrant.h" | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void fl_register_plugins(FlPluginRegistry* registry) { | 
				
			||||
} | 
				
			||||
@ -0,0 +1,15 @@
					 | 
				
			||||
//
 | 
				
			||||
//  Generated file. Do not edit.
 | 
				
			||||
//
 | 
				
			||||
 | 
				
			||||
// clang-format off
 | 
				
			||||
 | 
				
			||||
#ifndef GENERATED_PLUGIN_REGISTRANT_ | 
				
			||||
#define GENERATED_PLUGIN_REGISTRANT_ | 
				
			||||
 | 
				
			||||
#include <flutter_linux/flutter_linux.h> | 
				
			||||
 | 
				
			||||
// Registers Flutter plugins.
 | 
				
			||||
void fl_register_plugins(FlPluginRegistry* registry); | 
				
			||||
 | 
				
			||||
#endif  // GENERATED_PLUGIN_REGISTRANT_
 | 
				
			||||
@ -0,0 +1,23 @@
					 | 
				
			||||
# | 
				
			||||
# Generated file, do not edit. | 
				
			||||
# | 
				
			||||
 | 
				
			||||
list(APPEND FLUTTER_PLUGIN_LIST | 
				
			||||
) | 
				
			||||
 | 
				
			||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST | 
				
			||||
) | 
				
			||||
 | 
				
			||||
set(PLUGIN_BUNDLED_LIBRARIES) | 
				
			||||
 | 
				
			||||
foreach(plugin ${FLUTTER_PLUGIN_LIST}) | 
				
			||||
  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) | 
				
			||||
  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) | 
				
			||||
  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) | 
				
			||||
  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) | 
				
			||||
endforeach(plugin) | 
				
			||||
 | 
				
			||||
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) | 
				
			||||
  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) | 
				
			||||
  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) | 
				
			||||
endforeach(ffi_plugin) | 
				
			||||
@ -0,0 +1,6 @@
					 | 
				
			||||
#include "my_application.h" | 
				
			||||
 | 
				
			||||
int main(int argc, char** argv) { | 
				
			||||
  g_autoptr(MyApplication) app = my_application_new(); | 
				
			||||
  return g_application_run(G_APPLICATION(app), argc, argv); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,104 @@
					 | 
				
			||||
#include "my_application.h" | 
				
			||||
 | 
				
			||||
#include <flutter_linux/flutter_linux.h> | 
				
			||||
#ifdef GDK_WINDOWING_X11 | 
				
			||||
#include <gdk/gdkx.h> | 
				
			||||
#endif | 
				
			||||
 | 
				
			||||
#include "flutter/generated_plugin_registrant.h" | 
				
			||||
 | 
				
			||||
struct _MyApplication { | 
				
			||||
  GtkApplication parent_instance; | 
				
			||||
  char** dart_entrypoint_arguments; | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) | 
				
			||||
 | 
				
			||||
// Implements GApplication::activate.
 | 
				
			||||
static void my_application_activate(GApplication* application) { | 
				
			||||
  MyApplication* self = MY_APPLICATION(application); | 
				
			||||
  GtkWindow* window = | 
				
			||||
      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); | 
				
			||||
 | 
				
			||||
  // Use a header bar when running in GNOME as this is the common style used
 | 
				
			||||
  // by applications and is the setup most users will be using (e.g. Ubuntu
 | 
				
			||||
  // desktop).
 | 
				
			||||
  // If running on X and not using GNOME then just use a traditional title bar
 | 
				
			||||
  // in case the window manager does more exotic layout, e.g. tiling.
 | 
				
			||||
  // If running on Wayland assume the header bar will work (may need changing
 | 
				
			||||
  // if future cases occur).
 | 
				
			||||
  gboolean use_header_bar = TRUE; | 
				
			||||
#ifdef GDK_WINDOWING_X11 | 
				
			||||
  GdkScreen* screen = gtk_window_get_screen(window); | 
				
			||||
  if (GDK_IS_X11_SCREEN(screen)) { | 
				
			||||
    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); | 
				
			||||
    if (g_strcmp0(wm_name, "GNOME Shell") != 0) { | 
				
			||||
      use_header_bar = FALSE; | 
				
			||||
    } | 
				
			||||
  } | 
				
			||||
#endif | 
				
			||||
  if (use_header_bar) { | 
				
			||||
    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); | 
				
			||||
    gtk_widget_show(GTK_WIDGET(header_bar)); | 
				
			||||
    gtk_header_bar_set_title(header_bar, "adaptive_layout"); | 
				
			||||
    gtk_header_bar_set_show_close_button(header_bar, TRUE); | 
				
			||||
    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); | 
				
			||||
  } else { | 
				
			||||
    gtk_window_set_title(window, "adaptive_layout"); | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  gtk_window_set_default_size(window, 1280, 720); | 
				
			||||
  gtk_widget_show(GTK_WIDGET(window)); | 
				
			||||
 | 
				
			||||
  g_autoptr(FlDartProject) project = fl_dart_project_new(); | 
				
			||||
  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); | 
				
			||||
 | 
				
			||||
  FlView* view = fl_view_new(project); | 
				
			||||
  gtk_widget_show(GTK_WIDGET(view)); | 
				
			||||
  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); | 
				
			||||
 | 
				
			||||
  fl_register_plugins(FL_PLUGIN_REGISTRY(view)); | 
				
			||||
 | 
				
			||||
  gtk_widget_grab_focus(GTK_WIDGET(view)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// Implements GApplication::local_command_line.
 | 
				
			||||
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { | 
				
			||||
  MyApplication* self = MY_APPLICATION(application); | 
				
			||||
  // Strip out the first argument as it is the binary name.
 | 
				
			||||
  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); | 
				
			||||
 | 
				
			||||
  g_autoptr(GError) error = nullptr; | 
				
			||||
  if (!g_application_register(application, nullptr, &error)) { | 
				
			||||
     g_warning("Failed to register: %s", error->message); | 
				
			||||
     *exit_status = 1; | 
				
			||||
     return TRUE; | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  g_application_activate(application); | 
				
			||||
  *exit_status = 0; | 
				
			||||
 | 
				
			||||
  return TRUE; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// Implements GObject::dispose.
 | 
				
			||||
static void my_application_dispose(GObject* object) { | 
				
			||||
  MyApplication* self = MY_APPLICATION(object); | 
				
			||||
  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); | 
				
			||||
  G_OBJECT_CLASS(my_application_parent_class)->dispose(object); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
static void my_application_class_init(MyApplicationClass* klass) { | 
				
			||||
  G_APPLICATION_CLASS(klass)->activate = my_application_activate; | 
				
			||||
  G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; | 
				
			||||
  G_OBJECT_CLASS(klass)->dispose = my_application_dispose; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
static void my_application_init(MyApplication* self) {} | 
				
			||||
 | 
				
			||||
MyApplication* my_application_new() { | 
				
			||||
  return MY_APPLICATION(g_object_new(my_application_get_type(), | 
				
			||||
                                     "application-id", APPLICATION_ID, | 
				
			||||
                                     "flags", G_APPLICATION_NON_UNIQUE, | 
				
			||||
                                     nullptr)); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,18 @@
					 | 
				
			||||
#ifndef FLUTTER_MY_APPLICATION_H_ | 
				
			||||
#define FLUTTER_MY_APPLICATION_H_ | 
				
			||||
 | 
				
			||||
#include <gtk/gtk.h> | 
				
			||||
 | 
				
			||||
G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, | 
				
			||||
                     GtkApplication) | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * my_application_new: | 
				
			||||
 * | 
				
			||||
 * Creates a new Flutter-based application. | 
				
			||||
 * | 
				
			||||
 * Returns: a new #MyApplication. | 
				
			||||
 */ | 
				
			||||
MyApplication* my_application_new(); | 
				
			||||
 | 
				
			||||
#endif  // FLUTTER_MY_APPLICATION_H_
 | 
				
			||||
@ -0,0 +1,555 @@
					 | 
				
			||||
# Generated by pub | 
				
			||||
# See https://dart.dev/tools/pub/glossary#lockfile | 
				
			||||
packages: | 
				
			||||
  _fe_analyzer_shared: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: _fe_analyzer_shared | 
				
			||||
      sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "61.0.0" | 
				
			||||
  analyzer: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: analyzer | 
				
			||||
      sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "5.13.0" | 
				
			||||
  args: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: args | 
				
			||||
      sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.4.1" | 
				
			||||
  async: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: async | 
				
			||||
      sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.11.0" | 
				
			||||
  boolean_selector: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: boolean_selector | 
				
			||||
      sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.1" | 
				
			||||
  build: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: build | 
				
			||||
      sha256: "43865b79fbb78532e4bff7c33087aa43b1d488c4fdef014eaef568af6d8016dc" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.4.0" | 
				
			||||
  build_config: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: build_config | 
				
			||||
      sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.1.1" | 
				
			||||
  build_daemon: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: build_daemon | 
				
			||||
      sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "4.0.0" | 
				
			||||
  build_resolvers: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: build_resolvers | 
				
			||||
      sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.2.0" | 
				
			||||
  build_runner: | 
				
			||||
    dependency: "direct dev" | 
				
			||||
    description: | 
				
			||||
      name: build_runner | 
				
			||||
      sha256: "220ae4553e50d7c21a17c051afc7b183d28a24a420502e842f303f8e4e6edced" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.4.4" | 
				
			||||
  build_runner_core: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: build_runner_core | 
				
			||||
      sha256: "88a57f2ac99849362e73878334caa9f06ee25f31d2adced882b8337838c84e1e" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "7.2.9" | 
				
			||||
  built_collection: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: built_collection | 
				
			||||
      sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "5.1.1" | 
				
			||||
  built_value: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: built_value | 
				
			||||
      sha256: "7dd62d9faf105c434f3d829bbe9c4be02ec67f5ed94832222116122df67c5452" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "8.6.0" | 
				
			||||
  characters: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: characters | 
				
			||||
      sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.3.0" | 
				
			||||
  checked_yaml: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: checked_yaml | 
				
			||||
      sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.0.3" | 
				
			||||
  clock: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: clock | 
				
			||||
      sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.1.1" | 
				
			||||
  code_builder: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: code_builder | 
				
			||||
      sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "4.4.0" | 
				
			||||
  collection: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: collection | 
				
			||||
      sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.17.1" | 
				
			||||
  convert: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: convert | 
				
			||||
      sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "3.1.1" | 
				
			||||
  crypto: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: crypto | 
				
			||||
      sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "3.0.3" | 
				
			||||
  cupertino_icons: | 
				
			||||
    dependency: "direct main" | 
				
			||||
    description: | 
				
			||||
      name: cupertino_icons | 
				
			||||
      sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.0.5" | 
				
			||||
  dart_style: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: dart_style | 
				
			||||
      sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.3.1" | 
				
			||||
  fake_async: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: fake_async | 
				
			||||
      sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.3.1" | 
				
			||||
  file: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: file | 
				
			||||
      sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "7.0.0" | 
				
			||||
  fixnum: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: fixnum | 
				
			||||
      sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.1.0" | 
				
			||||
  flutter: | 
				
			||||
    dependency: "direct main" | 
				
			||||
    description: flutter | 
				
			||||
    source: sdk | 
				
			||||
    version: "0.0.0" | 
				
			||||
  flutter_adaptive_scaffold: | 
				
			||||
    dependency: "direct main" | 
				
			||||
    description: | 
				
			||||
      name: flutter_adaptive_scaffold | 
				
			||||
      sha256: f9482e41adaf26d6fa9de02b605adc346961cb4bb34fe9420335df591ce3de6d | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "0.1.3" | 
				
			||||
  flutter_test: | 
				
			||||
    dependency: "direct dev" | 
				
			||||
    description: flutter | 
				
			||||
    source: sdk | 
				
			||||
    version: "0.0.0" | 
				
			||||
  flutter_web_plugins: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: flutter | 
				
			||||
    source: sdk | 
				
			||||
    version: "0.0.0" | 
				
			||||
  frontend_server_client: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: frontend_server_client | 
				
			||||
      sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "3.2.0" | 
				
			||||
  glob: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: glob | 
				
			||||
      sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.2" | 
				
			||||
  go_router: | 
				
			||||
    dependency: "direct main" | 
				
			||||
    description: | 
				
			||||
      name: go_router | 
				
			||||
      sha256: "00d1b67d6e9fa443331da229084dd3eb04407f5a2dff22940bd7bba6af5722c3" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "7.1.1" | 
				
			||||
  go_router_builder: | 
				
			||||
    dependency: "direct dev" | 
				
			||||
    description: | 
				
			||||
      name: go_router_builder | 
				
			||||
      sha256: "74c6c12cf80248e97d5555df6fcae38a78e9ab7680689e9b9661bd74bcdda74d" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.0.1" | 
				
			||||
  graphs: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: graphs | 
				
			||||
      sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.3.1" | 
				
			||||
  http_multi_server: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: http_multi_server | 
				
			||||
      sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "3.2.1" | 
				
			||||
  http_parser: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: http_parser | 
				
			||||
      sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "4.0.2" | 
				
			||||
  intersperse: | 
				
			||||
    dependency: "direct main" | 
				
			||||
    description: | 
				
			||||
      name: intersperse | 
				
			||||
      sha256: "2f8a905c96f6cbba978644a3d5b31b8d86ddc44917662df7d27a61f3df66a576" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.0.0" | 
				
			||||
  io: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: io | 
				
			||||
      sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.0.4" | 
				
			||||
  js: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: js | 
				
			||||
      sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "0.6.7" | 
				
			||||
  json_annotation: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: json_annotation | 
				
			||||
      sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "4.8.1" | 
				
			||||
  logging: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: logging | 
				
			||||
      sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.2.0" | 
				
			||||
  matcher: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: matcher | 
				
			||||
      sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "0.12.15" | 
				
			||||
  material_color_utilities: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: material_color_utilities | 
				
			||||
      sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "0.2.0" | 
				
			||||
  meta: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: meta | 
				
			||||
      sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.9.1" | 
				
			||||
  mime: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: mime | 
				
			||||
      sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.0.4" | 
				
			||||
  nit_picking: | 
				
			||||
    dependency: "direct dev" | 
				
			||||
    description: | 
				
			||||
      path: "." | 
				
			||||
      ref: "0b2ee0d" | 
				
			||||
      resolved-ref: "0b2ee0d6d6871a04aaf85e88cd7e877f654d15e3" | 
				
			||||
      url: "https://github.com/stack11/dart_nit_picking" | 
				
			||||
    source: git | 
				
			||||
    version: "0.0.0" | 
				
			||||
  package_config: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: package_config | 
				
			||||
      sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.0" | 
				
			||||
  path: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: path | 
				
			||||
      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.8.3" | 
				
			||||
  path_to_regexp: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: path_to_regexp | 
				
			||||
      sha256: "169d78fbd55e61ea8873bcca545979f559d22238f66facdd7ef30870c7f53327" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "0.4.0" | 
				
			||||
  pool: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: pool | 
				
			||||
      sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.5.1" | 
				
			||||
  pub_semver: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: pub_semver | 
				
			||||
      sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.4" | 
				
			||||
  pubspec_parse: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: pubspec_parse | 
				
			||||
      sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.2.3" | 
				
			||||
  shelf: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: shelf | 
				
			||||
      sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.4.1" | 
				
			||||
  shelf_web_socket: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: shelf_web_socket | 
				
			||||
      sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.0.4" | 
				
			||||
  sky_engine: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: flutter | 
				
			||||
    source: sdk | 
				
			||||
    version: "0.0.99" | 
				
			||||
  source_gen: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: source_gen | 
				
			||||
      sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.3.2" | 
				
			||||
  source_helper: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: source_helper | 
				
			||||
      sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.3.3" | 
				
			||||
  source_span: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: source_span | 
				
			||||
      sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.9.1" | 
				
			||||
  stack_trace: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: stack_trace | 
				
			||||
      sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.11.0" | 
				
			||||
  stream_channel: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: stream_channel | 
				
			||||
      sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.1" | 
				
			||||
  stream_transform: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: stream_transform | 
				
			||||
      sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.0" | 
				
			||||
  string_scanner: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: string_scanner | 
				
			||||
      sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.2.0" | 
				
			||||
  term_glyph: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: term_glyph | 
				
			||||
      sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.2.1" | 
				
			||||
  test_api: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: test_api | 
				
			||||
      sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "0.5.1" | 
				
			||||
  timing: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: timing | 
				
			||||
      sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.0.1" | 
				
			||||
  typed_data: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: typed_data | 
				
			||||
      sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.3.2" | 
				
			||||
  vector_math: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: vector_math | 
				
			||||
      sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.1.4" | 
				
			||||
  watcher: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: watcher | 
				
			||||
      sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "1.1.0" | 
				
			||||
  web_socket_channel: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: web_socket_channel | 
				
			||||
      sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "2.4.0" | 
				
			||||
  yaml: | 
				
			||||
    dependency: transitive | 
				
			||||
    description: | 
				
			||||
      name: yaml | 
				
			||||
      sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" | 
				
			||||
      url: "https://pub.dev" | 
				
			||||
    source: hosted | 
				
			||||
    version: "3.1.2" | 
				
			||||
sdks: | 
				
			||||
  dart: ">=3.0.0 <4.0.0" | 
				
			||||
  flutter: ">=3.3.0" | 
				
			||||
@ -0,0 +1,94 @@
					 | 
				
			||||
name: adaptive_layout | 
				
			||||
description: A new Flutter project. | 
				
			||||
# The following line prevents the package from being accidentally published to | 
				
			||||
# pub.dev using `flutter pub publish`. This is preferred for private packages. | 
				
			||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev | 
				
			||||
 | 
				
			||||
# The following defines the version and build number for your application. | 
				
			||||
# A version number is three numbers separated by dots, like 1.2.43 | 
				
			||||
# followed by an optional build number separated by a +. | 
				
			||||
# Both the version and the builder number may be overridden in flutter | 
				
			||||
# build by specifying --build-name and --build-number, respectively. | 
				
			||||
# In Android, build-name is used as versionName while build-number used as versionCode. | 
				
			||||
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning | 
				
			||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. | 
				
			||||
# Read more about iOS versioning at | 
				
			||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | 
				
			||||
# In Windows, build-name is used as the major, minor, and patch parts | 
				
			||||
# of the product and file versions while build-number is used as the build suffix. | 
				
			||||
version: 1.0.0+1 | 
				
			||||
 | 
				
			||||
environment: | 
				
			||||
  sdk: '>=3.0.0 <4.0.0' | 
				
			||||
 | 
				
			||||
# Dependencies specify other packages that your package needs in order to work. | 
				
			||||
# To automatically upgrade your package dependencies to the latest versions | 
				
			||||
# consider running `flutter pub upgrade --major-versions`. Alternatively, | 
				
			||||
# dependencies can be manually updated by changing the version numbers below to | 
				
			||||
# the latest version available on pub.dev. To see which dependencies have newer | 
				
			||||
# versions available, run `flutter pub outdated`. | 
				
			||||
dependencies: | 
				
			||||
  # The following adds the Cupertino Icons font to your application. | 
				
			||||
  # Use with the CupertinoIcons class for iOS style icons. | 
				
			||||
  cupertino_icons: ^1.0.2 | 
				
			||||
  flutter: | 
				
			||||
    sdk: flutter | 
				
			||||
  flutter_adaptive_scaffold: ^0.1.3 | 
				
			||||
  go_router: ^7.1.1 | 
				
			||||
  intersperse: ^2.0.0 | 
				
			||||
 | 
				
			||||
dev_dependencies: | 
				
			||||
  build_runner: ^2.4.4 | 
				
			||||
  flutter_test: | 
				
			||||
    sdk: flutter | 
				
			||||
  # The "flutter_lints" package below contains a set of recommended lints to | 
				
			||||
  # encourage good coding practices. The lint set provided by the package is | 
				
			||||
  # activated in the `analysis_options.yaml` file located at the root of your | 
				
			||||
  # package. See that file for information about deactivating specific lint | 
				
			||||
  # rules and activating additional ones. | 
				
			||||
  go_router_builder: ^2.0.1 | 
				
			||||
  nit_picking: | 
				
			||||
    git: | 
				
			||||
      url: https://github.com/stack11/dart_nit_picking | 
				
			||||
      ref: 0b2ee0d | 
				
			||||
 | 
				
			||||
# For information on the generic Dart part of this file, see the | 
				
			||||
# following page: https://dart.dev/tools/pub/pubspec | 
				
			||||
 | 
				
			||||
# The following section is specific to Flutter packages. | 
				
			||||
flutter: | 
				
			||||
  # The following line ensures that the Material Icons font is | 
				
			||||
  # included with your application, so that you can use the icons in | 
				
			||||
  # the material Icons class. | 
				
			||||
  uses-material-design: true | 
				
			||||
 | 
				
			||||
  # To add assets to your application, add an assets section, like this: | 
				
			||||
  # assets: | 
				
			||||
  #   - images/a_dot_burr.jpeg | 
				
			||||
  #   - images/a_dot_ham.jpeg | 
				
			||||
 | 
				
			||||
  # An image asset can refer to one or more resolution-specific "variants", see | 
				
			||||
  # https://flutter.dev/assets-and-images/#resolution-aware | 
				
			||||
 | 
				
			||||
  # For details regarding adding assets from package dependencies, see | 
				
			||||
  # https://flutter.dev/assets-and-images/#from-packages | 
				
			||||
 | 
				
			||||
  # To add custom fonts to your application, add a fonts section here, | 
				
			||||
  # in this "flutter" section. Each entry in this list should have a | 
				
			||||
  # "family" key with the font family name, and a "fonts" key with a | 
				
			||||
  # list giving the asset and other descriptors for the font. For | 
				
			||||
  # example: | 
				
			||||
  # fonts: | 
				
			||||
  #   - family: Schyler | 
				
			||||
  #     fonts: | 
				
			||||
  #       - asset: fonts/Schyler-Regular.ttf | 
				
			||||
  #       - asset: fonts/Schyler-Italic.ttf | 
				
			||||
  #         style: italic | 
				
			||||
  #   - family: Trajan Pro | 
				
			||||
  #     fonts: | 
				
			||||
  #       - asset: fonts/TrajanPro.ttf | 
				
			||||
  #       - asset: fonts/TrajanPro_Bold.ttf | 
				
			||||
  #         weight: 700 | 
				
			||||
  # | 
				
			||||
  # For details regarding fonts from package dependencies, | 
				
			||||
  # see https://flutter.dev/custom-fonts/#from-packages | 
				
			||||
					Loading…
					
					
				
		Reference in new issue