(
+ RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(
+ AppUiConstants.defaultBorderRadius ?? .0,
+ ),
+ ),
+ );
+
+ final disableOnPressed = isLoading || isDisabled;
+
+ return SizedBox(
+ width: double.infinity,
+ child: switch (buttonType) {
+ _AppButtonType.primary => TextButton(
+ style: TextButton.styleFrom(
+ padding: _padding,
+ textStyle: _textStyle,
+ backgroundColor:
+ isDisabled ? _colors.primary.lowOpacity() : _colors.primary,
+ foregroundColor: _colors.foregroundOnPrimary,
+ ).copyWith(
+ shape: shape,
+ ),
+ onPressed: disableOnPressed ? null : onPressed,
+ child: isLoading
+ ? AppLoadingIndicator.small(
+ indicatorColor: _colors.foregroundOnPrimary,
+ )
+ : _AppButtonLabel(label),
+ ),
+ _AppButtonType.secondary => TextButton(
+ style: TextButton.styleFrom(
+ padding: _padding,
+ textStyle: _textStyle,
+ backgroundColor: isDisabled
+ ? _colors.secondary.lowOpacity()
+ : _colors.secondary,
+ foregroundColor: _colors.foregroundOnSecondary,
+ ).copyWith(
+ shape: shape,
+ ),
+ onPressed: disableOnPressed ? null : onPressed,
+ child: isLoading
+ ? AppLoadingIndicator.small(
+ indicatorColor: _colors.foregroundOnSecondary,
+ )
+ : _AppButtonLabel(label),
+ ),
+ _AppButtonType.outlined => OutlinedButton(
+ style: OutlinedButton.styleFrom(
+ padding: _padding,
+ textStyle: _textStyle,
+ ).copyWith(
+ shape: shape,
+ ),
+ onPressed: disableOnPressed ? null : onPressed,
+ child: isLoading
+ ? AppLoadingIndicator.small(
+ indicatorColor: _colors.foregroundOnBackground,
+ )
+ : _AppButtonLabel(label),
+ ),
+ _AppButtonType.text => TextButton(
+ style: TextButton.styleFrom(
+ padding: _padding,
+ textStyle: _textStyle,
+ ).copyWith(
+ shape: shape,
+ ),
+ onPressed: disableOnPressed ? null : onPressed,
+ child: isLoading
+ ? AppLoadingIndicator.small(
+ indicatorColor: _colors.foregroundOnBackground,
+ )
+ : _AppButtonLabel(label),
+ ),
+ _AppButtonType.danger => TextButton(
+ style: TextButton.styleFrom(
+ padding: _padding,
+ textStyle: _textStyle,
+ backgroundColor:
+ isDisabled ? _colors.danger.lowOpacity() : _colors.danger,
+ foregroundColor: _colors.foregroundOnDanger,
+ ).copyWith(
+ shape: shape,
+ ),
+ onPressed: disableOnPressed ? null : onPressed,
+ child: isLoading
+ ? AppLoadingIndicator.small(
+ indicatorColor: _colors.foregroundOnDanger,
+ )
+ : _AppButtonLabel(label),
+ ),
+ },
+ );
+ }
+}
+
+class _AppButtonLabel extends StatelessWidget {
+ const _AppButtonLabel(this.label);
+
+ final String label;
+
+ @override
+ Widget build(BuildContext context) {
+ return AppText.buttonLabel(
+ label,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ textAlign: TextAlign.center,
+ );
+ }
+}
diff --git a/lib/presentation/widgets/disable_widget/app_disable_widget.dart b/lib/presentation/widgets/disable_widget/app_disable_widget.dart
new file mode 100644
index 0000000..2ea1d53
--- /dev/null
+++ b/lib/presentation/widgets/disable_widget/app_disable_widget.dart
@@ -0,0 +1,52 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_template/presentation/resources/app_ui_constants.dart';
+import 'package:flutter_template/presentation/resources/resources.dart';
+
+class AppDisableWidget extends StatelessWidget {
+ const AppDisableWidget({
+ super.key,
+ this.disable = true,
+ this.applyBlackWhiteFilter = true,
+ this.opacity = 0.66,
+ this.animate = false,
+ required this.child,
+ });
+
+ final bool disable;
+ final double opacity;
+ final bool applyBlackWhiteFilter;
+ final bool animate;
+ final Widget child;
+
+ @override
+ Widget build(BuildContext context) {
+ Widget widget = IgnorePointer(
+ ignoring: disable,
+ child: child,
+ );
+
+ if (applyBlackWhiteFilter) {
+ widget = ColorFiltered(
+ colorFilter: ColorFilter.mode(
+ disable ? context.colors.background : Colors.transparent,
+ disable ? BlendMode.saturation : BlendMode.overlay,
+ ),
+ child: widget,
+ );
+ }
+
+ final opacity = disable ? this.opacity : 1.0;
+
+ return animate
+ ? AnimatedOpacity(
+ opacity: opacity,
+ duration: AppUiConstants.animationDuration,
+ curve: Curves.fastEaseInToSlowEaseOut,
+ child: widget,
+ )
+ : Opacity(
+ opacity: opacity,
+ child: widget,
+ );
+ }
+}
diff --git a/lib/presentation/widgets/loading_indicator/app_loading_indicator.dart b/lib/presentation/widgets/loading_indicator/app_loading_indicator.dart
new file mode 100644
index 0000000..fec8a98
--- /dev/null
+++ b/lib/presentation/widgets/loading_indicator/app_loading_indicator.dart
@@ -0,0 +1,49 @@
+import 'package:flutter/material.dart';
+
+class AppLoadingIndicator extends StatelessWidget {
+ /// Determines both height and width of the [AppLoadingIndicator]
+ static const defaultSize = 24.0;
+
+ /// Determines both height and width of the [AppLoadingIndicator.small]
+ static const defaultSmallSize = 16.0;
+
+ /// Determines the color of the loading indicator.
+ ///
+ /// By default, It will follow the primary color of the current theme.
+ final Color? indicatorColor;
+
+ const AppLoadingIndicator({
+ super.key,
+ this.size = defaultSize,
+ this.strokeWidth = 4.0,
+ this.indicatorColor,
+ });
+
+ /// Determines both height and width of the loader.
+ final double size;
+
+ /// The width of the material loader stroke.
+ final double strokeWidth;
+
+ factory AppLoadingIndicator.small({
+ Color? indicatorColor,
+ }) {
+ return AppLoadingIndicator(
+ size: defaultSmallSize,
+ strokeWidth: 2.0,
+ indicatorColor: indicatorColor,
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return SizedBox(
+ height: size,
+ width: size,
+ child: CircularProgressIndicator.adaptive(
+ strokeWidth: strokeWidth,
+ backgroundColor: indicatorColor,
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/widgets/spacers/safe_area_spacer.dart b/lib/presentation/widgets/spacers/safe_area_spacer.dart
new file mode 100644
index 0000000..e4bae8e
--- /dev/null
+++ b/lib/presentation/widgets/spacers/safe_area_spacer.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/material.dart';
+
+/// Create safe area space. Useful for the beginning/end of the pages
+/// to make sure the "padding" of it is above the safe area.
+class SafeAreaSpacer extends StatelessWidget {
+ const SafeAreaSpacer({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final padding = MediaQuery.maybePaddingOf(context);
+
+ if (padding == null) {
+ return const SizedBox.shrink();
+ }
+
+ final insets = padding.bottom;
+
+ return SizedBox(height: insets);
+ }
+}
diff --git a/lib/presentation/widgets/text/app_text.dart b/lib/presentation/widgets/text/app_text.dart
new file mode 100644
index 0000000..ee26876
--- /dev/null
+++ b/lib/presentation/widgets/text/app_text.dart
@@ -0,0 +1,381 @@
+import 'package:auto_size_text/auto_size_text.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_template/presentation/resources/resources.dart';
+
+enum _AppTextType {
+ header1,
+ header2,
+ header3,
+ appBarTitle,
+ bodySmall,
+ body,
+ bodyLarge,
+ buttonLabel,
+ underlineText,
+}
+
+class AppText extends StatelessWidget {
+ const AppText._(
+ this.text, {
+ Key? key,
+ required this.type,
+ this.color,
+ this.textAlign,
+ this.maxLines,
+ this.overflow,
+ this.letterSpacing,
+ this.fontFamily,
+ this.lineHeight,
+ this.fontWeight,
+ this.fontSize,
+ this.enableAutoTextSize = false,
+ }) : super(key: key);
+
+ factory AppText.header1(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.header1,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.header2(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.header2,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.header3(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.header3,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.appBarTitle(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.appBarTitle,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.bodySmall(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.bodySmall,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.body(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.body,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.bodyLarge(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.bodyLarge,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.buttonLabel(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.buttonLabel,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.underlineText(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.underlineText,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ factory AppText.custom(
+ String text, {
+ Key? key,
+ Color? color,
+ TextAlign? textAlign,
+ int? maxLines,
+ TextOverflow? overflow,
+ double? letterSpacing,
+ String? fontFamily,
+ double? lineHeight,
+ FontWeight? fontWeight,
+ double? fontSize,
+ bool enableAutoTextSize = false,
+ }) {
+ return AppText._(
+ text,
+ type: _AppTextType.body,
+ key: key,
+ color: color,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ letterSpacing: letterSpacing,
+ fontFamily: fontFamily,
+ lineHeight: lineHeight,
+ fontWeight: fontWeight,
+ fontSize: fontSize,
+ enableAutoTextSize: enableAutoTextSize,
+ );
+ }
+
+ final String text;
+ final _AppTextType type;
+ final Color? color;
+ final TextAlign? textAlign;
+ final int? maxLines;
+ final TextOverflow? overflow;
+ final double? letterSpacing;
+ final String? fontFamily;
+ final double? lineHeight;
+ final FontWeight? fontWeight;
+ final double? fontSize;
+ final bool enableAutoTextSize;
+
+ @override
+ Widget build(BuildContext context) {
+ final _appTextStyles = context.textStyles;
+
+ final textStyle = switch (type) {
+ _AppTextType.header1 => _appTextStyles.header1,
+ _AppTextType.header2 => _appTextStyles.header2,
+ _AppTextType.header3 => _appTextStyles.header3,
+ _AppTextType.appBarTitle => _appTextStyles.appBarTitle,
+ _AppTextType.bodySmall => _appTextStyles.bodySmall,
+ _AppTextType.body => _appTextStyles.body,
+ _AppTextType.bodyLarge => _appTextStyles.bodyLarge,
+ _AppTextType.buttonLabel => _appTextStyles.buttonLabel,
+ _AppTextType.underlineText => _appTextStyles.underlineText,
+ };
+
+ final customTextStyle = textStyle.copyWith(
+ color: color,
+ letterSpacing: letterSpacing,
+ fontSize: fontSize,
+ fontWeight: fontWeight,
+ );
+
+ if (enableAutoTextSize) {
+ return AutoSizeText(
+ text,
+ style: customTextStyle,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ minFontSize: 6,
+ );
+ }
+
+ return Text(
+ text,
+ style: customTextStyle,
+ textAlign: textAlign,
+ maxLines: maxLines,
+ overflow: overflow,
+ );
+ }
+}
diff --git a/lib/presentation/widgets/utilities/focus_scope_dismissible.dart b/lib/presentation/widgets/utilities/app_screen_config.dart
similarity index 53%
rename from lib/presentation/widgets/utilities/focus_scope_dismissible.dart
rename to lib/presentation/widgets/utilities/app_screen_config.dart
index e3eab20..6d49dc5 100644
--- a/lib/presentation/widgets/utilities/focus_scope_dismissible.dart
+++ b/lib/presentation/widgets/utilities/app_screen_config.dart
@@ -1,34 +1,38 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
-/// A widget for dismissing the keyboard on tap outside.
+/// A configuration widget designed to manage actions when tapping on the scaffold, such as dismissing the keyboard.
///
-/// Wrap a widget that contain text inputs with this widget
-/// to enable tap-outside-to-dismiss-keyboard behaviour.
+/// Wrap a widget containing text inputs with this widget to enable tap-outside-to-dismiss-keyboard behavior.
///
-/// So instead of this:
+/// Example Usage:
+/// ```dart
+/// AppScreenConfig(
+/// child: MyScreen(),
+/// )
+/// ```
///
+/// Instead of manually handling tap events to dismiss the keyboard:
/// ```dart
/// GestureDetector(
/// onTap: () {
-/// final focusScope = FocusScope.of(context);
-/// if (focusScope.hasFocus) {
-/// focusScope.unfocus();
-/// }
-/// },
-/// child: MyPage(),
+/// final focusScope = FocusScope.of(context);
+/// if (focusScope.hasFocus) {
+/// focusScope.unfocus();
+/// }
+/// },
+/// child: MyScreen(),
/// ),
/// ```
///
-/// You could do this:
-///
+/// You can simplify it using `AppScreenConfig`:
/// ```dart
-/// BackgroundFocusScopeDismisser(
-/// child: MyPage(),
+/// AppScreenConfig(
+/// child: MyScreen(),
/// ),
/// ```
-class FocusScopeDismissible extends StatelessWidget {
- const FocusScopeDismissible({
+class AppScreenConfig extends StatelessWidget {
+ const AppScreenConfig({
Key? key,
this.excludeFromSemantics = false,
this.dragStartBehavior = DragStartBehavior.start,
diff --git a/lib/presentation/widgets/utilities/top_app_bar_config.dart b/lib/presentation/widgets/utilities/top_app_bar_config.dart
new file mode 100644
index 0000000..bea834c
--- /dev/null
+++ b/lib/presentation/widgets/utilities/top_app_bar_config.dart
@@ -0,0 +1,39 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_template/presentation/extensions/scroll_controller_extensions.dart';
+
+/// A configurable widget designed for defining actions triggered by tapping on the [Scaffold]'s top app bar.
+///
+/// The primary use case for this widget is to facilitate scrolling to the top of the screen.
+/// If the screen is already scrolled to the top, the widget will alternatively unfocus and
+/// dismiss the keyboard if it is currently shown.
+class TopAppBarConfig extends StatelessWidget {
+ const TopAppBarConfig({
+ super.key,
+ required this.child,
+ });
+
+ final Widget child;
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: () {
+ final controller = PrimaryScrollController.maybeOf(context);
+
+ final hasClients = controller?.hasClients ?? false;
+
+ if (!hasClients) {
+ FocusManager.instance.primaryFocus?.unfocus();
+ return;
+ }
+
+ if (controller?.position.pixels == 0.0) {
+ FocusManager.instance.primaryFocus?.unfocus();
+ }
+
+ controller?.animateToTop();
+ },
+ child: child,
+ );
+ }
+}
diff --git a/mason-lock.json b/mason-lock.json
deleted file mode 100644
index eab10ae..0000000
--- a/mason-lock.json
+++ /dev/null
@@ -1 +0,0 @@
-{"bricks":{}}
\ No newline at end of file
diff --git a/mason.yaml b/mason.yaml
index 4f00993..83977aa 100644
--- a/mason.yaml
+++ b/mason.yaml
@@ -1 +1,21 @@
+# Register bricks which can be consumed via the Mason CLI.
+# Run "mason get" to install all registered bricks.
+# To learn more, visit https://docs.brickhub.dev.
bricks:
+ # service brick
+ service:
+ git:
+ url: "https://github.com/monstar-lab-oss/flutter-bricks.git"
+ path: bricks/service
+
+ # usecase brick
+ usecase:
+ git:
+ url: "https://github.com/monstar-lab-oss/flutter-bricks.git"
+ path: bricks/usecase
+
+ # feature brick
+ feature:
+ git:
+ url: "https://github.com/monstar-lab-oss/flutter-bricks.git"
+ path: bricks/feature
diff --git a/playbooks/_pictures/ScreenshotsBadExample.png b/playbooks/_pictures/ScreenshotsBadExample.png
new file mode 100644
index 0000000..ebc69c4
Binary files /dev/null and b/playbooks/_pictures/ScreenshotsBadExample.png differ
diff --git a/playbooks/_pictures/ScreenshotsGoodExample.png b/playbooks/_pictures/ScreenshotsGoodExample.png
new file mode 100644
index 0000000..28a35ad
Binary files /dev/null and b/playbooks/_pictures/ScreenshotsGoodExample.png differ
diff --git a/playbooks/organization/WorkingWithNStack.md b/playbooks/organization/WorkingWithNStack.md
new file mode 100644
index 0000000..920cbac
--- /dev/null
+++ b/playbooks/organization/WorkingWithNStack.md
@@ -0,0 +1,165 @@
+# Working with NStack
+
+> [!IMPORTANT]
+> ⚠️ **Notes regarding the NStack**
+>
+> NStack might currently be down as the
+> organization plans to sunset this service.
+> However, this guide will assist future
+> developers if they choose to work with it &
+> NStack is up again.
+
+_Please visit [Nstack website](https://www.nstack.io) to check if it's up._
+
+The feature integration was removed in the [chore: Removed NStack feature integration](https://github.com/ml-opensource/flutter-template/pull/161) Pull Request.
+
+**NStack** is a Backend-as-a-Service (BaaS) developed by Nodes/Monstarlab. It offers features such as localization, in-app messaging, and rate limiting.
+
+---
+
+## Getting Started
+
+For more details about the Flutter package for the NStack library, visit [NStack Flutter SDK on GitHub](https://github.com/nstack-io/flutter-sdk).
+
+---
+
+## Installation
+
+To use NStack, you'll need a typical `build_runner` setup. Follow these steps to install the required packages by adding them to your `pubspec.yaml` file:
+
+```yaml
+dependencies:
+ nstack:
+ git:
+ url: https://github.com/nstack-io/flutter-sdk.git
+ ref: v0.5.1
+
+dev_dependencies:
+ build_runner:
+```
+
+### Additional Notes
+
+- **Circular Dependencies:** Some packages may cause circular dependency issues. To resolve this, specify exact versions of those dependencies.
+
+ Example:
+
+ ```yaml
+ flutter_svg: 2.0.9
+ lottie: 3.0.0
+ ```
+
+---
+
+## Running the Code Generator
+
+1. **Create Configuration File:**
+ Create a file named `nstack.json` under `/lib/nstack` with the following content:
+
+ ```json
+ {
+ "version": 1,
+ "nstack_project_id": "YOUR_PROJECT_ID",
+ "nstack_api_key": "YOUR_REST_API_KEY"
+ }
+ ```
+
+2. **Run the Generator:**
+ Based on your use case, run one of the following commands:
+
+ - If your package depends on Flutter:
+
+ ```bash
+ flutter pub run build_runner build
+ ```
+
+ - Otherwise:
+
+ ```bash
+ pub run build_runner build
+ ```
+
+ A successful execution will generate a `nstack.dart` file tailored to your project.
+
+3. **Incremental Updates:**
+ To watch for changes in `nstack.json` and trigger automatic rebuilds, use the following command:
+
+ ```bash
+ flutter pub run build_runner watch --delete-conflicting-outputs
+ ```
+
+ Increment the `"version"` number in `nstack.json` and save to trigger an update.
+
+---
+
+## Example Usage
+
+1. **Import Generated File:**
+ Import the `nstack.dart` file in your project.
+
+2. **Integrate NStack Widget:**
+ In your `app.dart`, under `MaterialApp.router`, use the following code in the `builder`:
+
+ ```dart
+ return MaterialApp.router(
+ // ... other codes go here
+ builder: (context, widget) {
+ if (widget == null) {
+ return const SizedBox();
+ }
+
+ return NStackWidget(
+ child: widget,
+ );
+ },
+ );
+ ```
+
+3. **Analysis Options:**
+ Add the following to your `analysis_options.yaml` to exclude the generated `nstack.dart` file:
+
+ ```yaml
+ - "**/*nstack.dart"
+ ```
+
+---
+
+## Additional Setup
+
+### Java and Gradle Compatibility
+
+Ensure you have **Java 17** and a compatible Gradle version for Android builds.
+
+### Workaround for Namespace Issue
+
+If NStack complains about missing namespaces in its library, apply the following workaround in your `android/build.gradle`:
+
+```gradle
+// android/build.gradle
+rootProject.buildDir = "../build" // <-- existing line
+
+// Start of NStack Workaround
+subprojects {
+ afterEvaluate { project ->
+ if (project.name == 'nstack') {
+ if (project.hasProperty('android')) {
+ project.android {
+ if (namespace == null) {
+ namespace project.group
+ }
+ }
+ project.buildscript {
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.20"
+ }
+ }
+ }
+ }
+ }
+}
+// End of NStack Workaround
+```
+
+---
+
+This guide provides a complete overview of integrating and using NStack in a Flutter project. If you encounter issues, feel free to consult the official [NStack Flutter SDK documentation](https://github.com/nstack-io/flutter-sdk).
diff --git a/playbooks/organization/WorkingWithPullRequests.md b/playbooks/organization/WorkingWithPullRequests.md
new file mode 100644
index 0000000..a424fe2
--- /dev/null
+++ b/playbooks/organization/WorkingWithPullRequests.md
@@ -0,0 +1,139 @@
+# 🛠️ Working with Pull Requests (PR)
+
+## Code Review process
+
+When it comes to code review process, let's aim to make it efficient and convenient for both the reviewer and the author of the Pull Request.
+
+### Definition of Readiness
+
+A Pull Request is considered as ready for code review when:
+
+- All checkboxes in the pull request template are checked.
+- A review is requested from a team member who ideally has sufficient knowledge about the specific topic, feature, or area. Feel free to involve multiple individuals in the review process.
+
+### When Requesting a Review
+
+1. **Preserve the PR Template:** First of all, do not remove the pull request template unless it's necessary. Stick to the current template by filling in the required details.
+
+2. **Consider the Reviewer's Perspective:** When you submit your code for review, imagine yourself on the other side of the PR.
+
+- Is your code ready to be reviewed?
+- Are the needed details / clarifications provided in the description?
+- Is the needed person's review requested?
+
+3. **Keep Discussions within GitHub:** Prefer keeping the context inside the PR. E.g. minimize discussions around the code and the solution outside of GitHub.
+
+Below you can find recommendations / requirements for the PR organization. These are must-to-follow rules and is applicable for every PR with a few exceptions.
+
+### When Reviewing a PR
+
+Let's not talk about obvious things like being polite, giving constructive feedback etc. As a reviewer:
+
+- Ensure that the PR is ready to be reviewed before starting reviewing. Read the description to understand whether all conditions are met and review the code. Otherwise, request the author to update the missing details.
+- If a code is unclear and makes you confused, consider requesting documenting unclear parts of the code. Either in the code itself or maybe in a dedicated playbook. It won't hurt to put links to Confluence / other PRs right in the code to make sure that anyone will be able to recollect what happened in the code. Well... In an ideal world.
+ Remember: it's very easy to lose context or understanding of something that is not 100% obvious.
+- When requesting a change, either generally or on specific lines, double check if your request is clear enough for another person to understand. Consider using [suggestions](https://stackoverflow.com/questions/60311158/how-can-i-suggest-multiple-lines-be-changed-in-markdown), attaching screenshots or links to make requests clearer.
+
+## Branch name
+
+The branch name must start with the conventional type (`feat` / `fix` etc), have the ticket number and the ticket name (in lower case) in it.
+
+Example: a ticket you resolve is named `Introduce new kind of something` and the number is ABC-123. The branch name for a PR from the previous example must either be `feat/ABC-123-introduce-new-kind-of-something` or just `feat/ABC-123`.
+
+## Commits
+
+We are using conventional commits: https://www.conventionalcommits.org/en/v1.0.0/#summary
+Please make sure your commits match the rules.
+
+## Testing your changes first
+
+Kindly test all the changes you've made in all possible scenarios:
+
+- Different device sizes
+- Different platforms
+- Different connection states
+- Etc.
+
+Remember that some features work differently on different platforms, devices etc. For example, the `TextInputType.none` does not work on iOS and may lead to a crash / non-openable keyboard.
+
+## Title naming convention (pay attention ⚠️)
+
+### Why?
+
+When we merge a PR into develop (or any other branch), we do `squash merging`. It's when all the commits of another branch are squashed into one commit, with the name usually set to the PR title.
+
+_It is important to follow this naming convention as we have a script that parses the merged PR titles into a changelog when we release a new version._
+
+### Title schema & rules
+
+Here's a schema of the PR title: `{type}({tickets}): title`, where:
+
+- `type` is the type of the conventional commit. For example, a new feature must be `feat`, while a bug fix must either be `bug` or `fix`.
+- `tickets` (surrounded by `()`!) is/are the number(s) of the ticket(s) this PR resolves. Can either be one (`ABC-123`), or multiple, separated by comma (`ABC-123,ABC-322,ABC-100`).
+ If a PR doesn't resolve any ticket (for example, it's a minor enhancement or a documentation update) it is okay to leave the PR title without the `{tickets}` part. Don't forget to remove the `()` brackets then.
+- `title` usually is the ticket title. If the ticket resolves multiple tickets, use some common name, like `Login updates`. If the ticket doesn't resolve any tickets choose a title that describes the changes best.
+
+Example: a ticket you resolve is named `Introduce new kind of something` and the number is ABC-123. The PR title must be: `feat(ABC-123): Introduce new kind of something`.
+
+## Description
+
+To make it simpler for those checking your work, please tell them about the changes you made and why you made them. It's essential to give a quick explanation because the reviewer might be dealing with a different project or a different scope and might not know much about your work.
+
+If there is a ticket associated with your work, please include a link to it.
+
+### Steps to test
+
+If your works has complex or unclear steps to test, kindly provide those. Something like this would work:
+
+1. Sign in as ...
+2. Go to ...
+3. Do ...
+4. Expect ...
+
+If it doesn't require any specific steps to test skip this part.
+
+### Showcase: videos and screenshots
+
+Adding videos and screenshots to your work helps reviewers understand what you're doing faster. It lets them see how things are going without having to open the app, catching any issues early on. This way, reviewers only start looking at the code when everything checks out in the videos or pictures. It's a straightforward way to make the review process quicker and easier. Keep in mind that the reviewer might be working in a very different context right now, so any information you provide will be useful.
+
+In case some changes were requested, kindly attach a new video / screenshot, if required.
+
+#### Why?
+
+Switching to another branch, rerunning (possibly) code generation and launching / relaunching the app might be time consuming. If the change is minor, it is worth to provide the reviewer a visual representation of the change, so they won't even need to launch the app on their side to test it out.
+
+### Add Screenshots in a better way
+
+If you just drag & drop or upload a screenshot to Github, it will be formatted like this:
+
+```markdown
+
+```
+
+Which will make the image expand to the max available width. Instead, we should add images like this:
+
+```markdown
+# Width is approximate but usually works just fine.
+
+
+```
+
+> 💡 Tip of the day!
+>
+> Consider adding an `img` [text replacement](https://support.apple.com/en-gb/guide/mac-help/mh35735/mac) to your MacOS settings!
+
+Notice the difference between these two:
+
+#### First formatting
+
+Images are very large and cannot fit the normal screen size. In order to view a screenshot, you need to open it in a separate tab or zoom out the screen (just like it's done on the screenshot)
+
+
+Figure: Bad example of adding the screenshots
+
+#### Second formatting
+
+Images are not large, even multiple images can be placed in one row next to each other (normal browser zoom).
+
+
+Figure: Good example of adding the screenshots
diff --git a/pubspec.lock b/pubspec.lock
new file mode 100644
index 0000000..416982f
--- /dev/null
+++ b/pubspec.lock
@@ -0,0 +1,1231 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ _fe_analyzer_shared:
+ dependency: transitive
+ description:
+ name: _fe_analyzer_shared
+ sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
+ url: "https://pub.dev"
+ source: hosted
+ version: "72.0.0"
+ _macros:
+ dependency: transitive
+ description: dart
+ source: sdk
+ version: "0.3.2"
+ analyzer:
+ dependency: transitive
+ description:
+ name: analyzer
+ sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.7.0"
+ archive:
+ dependency: transitive
+ description:
+ name: archive
+ sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.6.1"
+ args:
+ dependency: transitive
+ description:
+ name: args
+ sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.0"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.11.0"
+ auto_route:
+ dependency: "direct main"
+ description:
+ name: auto_route
+ sha256: b83e8ce46da7228cdd019b5a11205454847f0a971bca59a7529b98df9876889b
+ url: "https://pub.dev"
+ source: hosted
+ version: "9.2.2"
+ auto_route_generator:
+ dependency: "direct dev"
+ description:
+ name: auto_route_generator
+ sha256: c9086eb07271e51b44071ad5cff34e889f3156710b964a308c2ab590769e79e6
+ url: "https://pub.dev"
+ source: hosted
+ version: "9.0.0"
+ auto_size_text:
+ dependency: "direct main"
+ description:
+ name: auto_size_text
+ sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.0"
+ bloc:
+ dependency: transitive
+ description:
+ name: bloc
+ sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.1.4"
+ 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: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ 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: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.2"
+ build_resolvers:
+ dependency: transitive
+ description:
+ name: build_resolvers
+ sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.2"
+ build_runner:
+ dependency: "direct dev"
+ description:
+ name: build_runner
+ sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.13"
+ build_runner_core:
+ dependency: transitive
+ description:
+ name: build_runner_core
+ sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.3.2"
+ build_test:
+ dependency: transitive
+ description:
+ name: build_test
+ sha256: "260dbba934f41b0a42935e9cae1f5731b94f0c3e489dc97bcf8e281265aaa5ae"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.2"
+ 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: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.9.2"
+ 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: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.10.1"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.18.0"
+ color:
+ dependency: transitive
+ description:
+ name: color
+ sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.0"
+ convert:
+ dependency: transitive
+ description:
+ name: convert
+ sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ coverage:
+ dependency: transitive
+ description:
+ name: coverage
+ sha256: "4b03e11f6d5b8f6e5bb5e9f7889a56fe6c5cbe942da5378ea4d4d7f73ef9dfe5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.0"
+ crypto:
+ dependency: transitive
+ description:
+ name: crypto
+ sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.6"
+ csslib:
+ dependency: transitive
+ description:
+ name: csslib
+ sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.2"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.8"
+ dart_style:
+ dependency: transitive
+ description:
+ name: dart_style
+ sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.7"
+ dartx:
+ dependency: transitive
+ description:
+ name: dartx
+ sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ device_info_plus:
+ dependency: "direct main"
+ description:
+ name: device_info_plus
+ sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95
+ url: "https://pub.dev"
+ source: hosted
+ version: "11.1.1"
+ device_info_plus_platform_interface:
+ dependency: transitive
+ description:
+ name: device_info_plus_platform_interface
+ sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.0.1"
+ dio:
+ dependency: "direct main"
+ description:
+ name: dio
+ sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.7.0"
+ dio_web_adapter:
+ dependency: transitive
+ description:
+ name: dio_web_adapter
+ sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.0"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ ffi:
+ dependency: transitive
+ description:
+ name: ffi
+ sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.3"
+ file:
+ dependency: transitive
+ description:
+ name: file
+ sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.0.1"
+ fixnum:
+ dependency: transitive
+ description:
+ name: fixnum
+ sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_bloc:
+ dependency: "direct main"
+ description:
+ name: flutter_bloc
+ sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.1.6"
+ flutter_gen_core:
+ dependency: transitive
+ description:
+ name: flutter_gen_core
+ sha256: "46ecf0e317413dd065547887c43f93f55e9653e83eb98dc13dd07d40dd225325"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.8.0"
+ flutter_gen_runner:
+ dependency: "direct dev"
+ description:
+ name: flutter_gen_runner
+ sha256: "77f0a02fc30d9fcf2549fe874eb3fde091435724904bcbb1af60aa40cbfab1f4"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.8.0"
+ flutter_secure_storage:
+ dependency: "direct main"
+ description:
+ name: flutter_secure_storage
+ sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "9.2.2"
+ flutter_secure_storage_linux:
+ dependency: transitive
+ description:
+ name: flutter_secure_storage_linux
+ sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ flutter_secure_storage_macos:
+ dependency: transitive
+ description:
+ name: flutter_secure_storage_macos
+ sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ flutter_secure_storage_platform_interface:
+ dependency: transitive
+ description:
+ name: flutter_secure_storage_platform_interface
+ sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.2"
+ flutter_secure_storage_web:
+ dependency: transitive
+ description:
+ name: flutter_secure_storage_web
+ sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ flutter_secure_storage_windows:
+ dependency: transitive
+ description:
+ name: flutter_secure_storage_windows
+ sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ flutter_sticky_header:
+ dependency: "direct main"
+ description:
+ name: flutter_sticky_header
+ sha256: "7f76d24d119424ca0c95c146b8627a457e8de8169b0d584f766c2c545db8f8be"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.0"
+ flutter_svg:
+ dependency: "direct main"
+ description:
+ name: flutter_svg
+ sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.16"
+ 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"
+ freezed:
+ dependency: "direct dev"
+ description:
+ name: freezed
+ sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.7"
+ freezed_annotation:
+ dependency: "direct main"
+ description:
+ name: freezed_annotation
+ sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.4"
+ frontend_server_client:
+ dependency: transitive
+ description:
+ name: frontend_server_client
+ sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.0"
+ get_it:
+ dependency: "direct main"
+ description:
+ name: get_it
+ sha256: c49895c1ecb0ee2a0ec568d39de882e2c299ba26355aa6744ab1001f98cebd15
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.0.2"
+ glob:
+ dependency: transitive
+ description:
+ name: glob
+ sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ graphs:
+ dependency: transitive
+ description:
+ name: graphs
+ sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
+ hashcodes:
+ dependency: transitive
+ description:
+ name: hashcodes
+ sha256: "80f9410a5b3c8e110c4b7604546034749259f5d6dcca63e0d3c17c9258f1a651"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.0"
+ html:
+ dependency: transitive
+ description:
+ name: html
+ sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.15.5"
+ http:
+ dependency: transitive
+ description:
+ name: http
+ sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.2"
+ 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"
+ image_size_getter:
+ dependency: transitive
+ description:
+ name: image_size_getter
+ sha256: "0511799498340b70993d2dfb34b55a2247b5b801d75a6cdd4543acfcafdb12b0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ injectable:
+ dependency: "direct main"
+ description:
+ name: injectable
+ sha256: "5e1556ea1d374fe44cbe846414d9bab346285d3d8a1da5877c01ad0774006068"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.0"
+ injectable_generator:
+ dependency: "direct dev"
+ description:
+ name: injectable_generator
+ sha256: af403d76c7b18b4217335e0075e950cd0579fd7f8d7bd47ee7c85ada31680ba1
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.2"
+ 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: "direct main"
+ description:
+ name: json_annotation
+ sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.9.0"
+ json_serializable:
+ dependency: "direct dev"
+ description:
+ name: json_serializable
+ sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.9.0"
+ leak_tracker:
+ dependency: transitive
+ description:
+ name: leak_tracker
+ sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
+ url: "https://pub.dev"
+ source: hosted
+ version: "10.0.5"
+ leak_tracker_flutter_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_flutter_testing
+ sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.5"
+ leak_tracker_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_testing
+ sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ logging:
+ dependency: transitive
+ description:
+ name: logging
+ sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ lottie:
+ dependency: "direct main"
+ description:
+ name: lottie
+ sha256: "7afc60865a2429d994144f7d66ced2ae4305fe35d82890b8766e3359872d872c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.3"
+ macros:
+ dependency: transitive
+ description:
+ name: macros
+ sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.1.2-main.4"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.16+1"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.11.1"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.15.0"
+ mime:
+ dependency: transitive
+ description:
+ name: mime
+ sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.0"
+ monstarlab_lints:
+ dependency: "direct dev"
+ description:
+ name: monstarlab_lints
+ sha256: fbdde80cf9c9a0ab133b2a6aca403ec987e66ff1ee62dc218eee63c1cf25ce27
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.4"
+ nested:
+ dependency: transitive
+ description:
+ name: nested
+ sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ node_preamble:
+ dependency: transitive
+ description:
+ name: node_preamble
+ sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.2"
+ package_config:
+ dependency: transitive
+ description:
+ name: package_config
+ sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ package_info_plus:
+ dependency: "direct main"
+ description:
+ name: package_info_plus
+ sha256: da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.1.1"
+ package_info_plus_platform_interface:
+ dependency: transitive
+ description:
+ name: package_info_plus_platform_interface
+ sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.0"
+ path_parsing:
+ dependency: transitive
+ description:
+ name: path_parsing
+ sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ path_provider:
+ dependency: transitive
+ description:
+ name: path_provider
+ sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.5"
+ path_provider_android:
+ dependency: transitive
+ description:
+ name: path_provider_android
+ sha256: "8c4967f8b7cb46dc914e178daa29813d83ae502e0529d7b0478330616a691ef7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.14"
+ path_provider_foundation:
+ dependency: transitive
+ description:
+ name: path_provider_foundation
+ sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.0"
+ path_provider_linux:
+ dependency: transitive
+ description:
+ name: path_provider_linux
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.1"
+ path_provider_platform_interface:
+ dependency: transitive
+ description:
+ name: path_provider_platform_interface
+ sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ path_provider_windows:
+ dependency: transitive
+ description:
+ name: path_provider_windows
+ sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.0"
+ petitparser:
+ dependency: transitive
+ description:
+ name: petitparser
+ sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.2"
+ platform:
+ dependency: transitive
+ description:
+ name: platform
+ sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.6"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.8"
+ pool:
+ dependency: transitive
+ description:
+ name: pool
+ sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.5.1"
+ protobuf:
+ dependency: transitive
+ description:
+ name: protobuf
+ sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.0"
+ provider:
+ dependency: transitive
+ description:
+ name: provider
+ sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.2"
+ 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: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ recase:
+ dependency: transitive
+ description:
+ name: recase
+ sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.1.0"
+ retrofit:
+ dependency: "direct main"
+ description:
+ name: retrofit
+ sha256: "3c9885ef3dbc5dc4b3fb0a40c972ab52e4dad04d52dac9bba24dfa76cf100451"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.4.1"
+ retrofit_generator:
+ dependency: "direct dev"
+ description:
+ name: retrofit_generator
+ sha256: f76fdb2b66854690d5a332e7364d7561fc9dc2b3c924d7956ab8070495e21f6a
+ url: "https://pub.dev"
+ source: hosted
+ version: "9.1.5"
+ shared_preferences:
+ dependency: "direct main"
+ description:
+ name: shared_preferences
+ sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.3"
+ shared_preferences_android:
+ dependency: transitive
+ description:
+ name: shared_preferences_android
+ sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.3"
+ shared_preferences_foundation:
+ dependency: transitive
+ description:
+ name: shared_preferences_foundation
+ sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.3"
+ shared_preferences_linux:
+ dependency: transitive
+ description:
+ name: shared_preferences_linux
+ sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ shared_preferences_platform_interface:
+ dependency: transitive
+ description:
+ name: shared_preferences_platform_interface
+ sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ shared_preferences_web:
+ dependency: transitive
+ description:
+ name: shared_preferences_web
+ sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.2"
+ shared_preferences_windows:
+ dependency: transitive
+ description:
+ name: shared_preferences_windows
+ sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ shelf:
+ dependency: transitive
+ description:
+ name: shelf
+ sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.4.1"
+ shelf_packages_handler:
+ dependency: transitive
+ description:
+ name: shelf_packages_handler
+ sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.2"
+ shelf_static:
+ dependency: transitive
+ description:
+ name: shelf_static
+ sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.3"
+ shelf_web_socket:
+ dependency: transitive
+ description:
+ name: shelf_web_socket
+ sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.1"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ source_gen:
+ dependency: transitive
+ description:
+ name: source_gen
+ sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.5.0"
+ source_gen_test:
+ dependency: transitive
+ description:
+ name: source_gen_test
+ sha256: ba9ec63c8f4f4d91021e5e09dd8259dc3bdfbd13cd027d91d761201542bc4a1f
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ source_helper:
+ dependency: transitive
+ description:
+ name: source_helper
+ sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.4"
+ source_map_stack_trace:
+ dependency: transitive
+ description:
+ name: source_map_stack_trace
+ sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ source_maps:
+ dependency: transitive
+ description:
+ name: source_maps
+ sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.10.12"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.10.0"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.1"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ 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:
+ dependency: transitive
+ description:
+ name: test
+ sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.25.7"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.2"
+ test_core:
+ dependency: transitive
+ description:
+ name: test_core
+ sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.4"
+ theme_tailor:
+ dependency: "direct dev"
+ description:
+ name: theme_tailor
+ sha256: "176c88b37f56996c2dc7b9e426a2db6fd66f95e1454288f7205ea4faa9380a3a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ theme_tailor_annotation:
+ dependency: "direct main"
+ description:
+ name: theme_tailor_annotation
+ sha256: "2990264653b700c7eece3557a5fe5f999cdcd32981aed67023a66004943db08d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ time:
+ dependency: transitive
+ description:
+ name: time
+ sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.5"
+ 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: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.4.0"
+ value_layout_builder:
+ dependency: transitive
+ description:
+ name: value_layout_builder
+ sha256: c02511ea91ca5c643b514a33a38fa52536f74aa939ec367d02938b5ede6807fa
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.4.0"
+ vector_graphics:
+ dependency: transitive
+ description:
+ name: vector_graphics
+ sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.15"
+ vector_graphics_codec:
+ dependency: transitive
+ description:
+ name: vector_graphics_codec
+ sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.12"
+ vector_graphics_compiler:
+ dependency: transitive
+ description:
+ name: vector_graphics_compiler
+ sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.16"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ vm_service:
+ dependency: transitive
+ description:
+ name: vm_service
+ sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "14.2.5"
+ watcher:
+ dependency: transitive
+ description:
+ name: watcher
+ sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ web_socket:
+ dependency: transitive
+ description:
+ name: web_socket
+ sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.1.6"
+ web_socket_channel:
+ dependency: transitive
+ description:
+ name: web_socket_channel
+ sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ webkit_inspection_protocol:
+ dependency: transitive
+ description:
+ name: webkit_inspection_protocol
+ sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ win32:
+ dependency: transitive
+ description:
+ name: win32
+ sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.8.0"
+ win32_registry:
+ dependency: transitive
+ description:
+ name: win32_registry
+ sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.5"
+ xdg_directories:
+ dependency: transitive
+ description:
+ name: xdg_directories
+ sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ xml:
+ dependency: transitive
+ description:
+ name: xml
+ sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.5.0"
+ yaml:
+ dependency: transitive
+ description:
+ name: yaml
+ sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+sdks:
+ dart: ">=3.5.4 <4.0.0"
+ flutter: ">=3.24.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 2841c34..afee99b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,85 +1,79 @@
name: flutter_template
description: A new Flutter application.
-# The following line prevents the package from being accidentally published to
-# pub.dev using `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 used as CFBundleVersion.
-# Read more about iOS versioning at
-# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 1.0.0+1
+publish_to: "none" # Private package, prevent accidental publishing
+
+version: 0.0.1+1
environment:
- sdk: ^3.0.0
+ sdk: ^3.5.4
dependencies:
flutter:
sdk: flutter
- # UI
- cupertino_icons: ^1.0.4
- flutter_svg: ^2.0.7
- nstack:
- git:
- url: https://github.com/nstack-io/flutter-sdk.git
- ref: v0.5.1
-
- # Net
- dio: ^5.1.2
- jaguar_jwt: ^3.0.0
-
- # Utility
- device_info_plus: ^9.0.0
- package_info_plus: ^4.0.0
-
- # Persistence
- shared_preferences: ^2.1.1
-
- # Architecture
- freezed_annotation: ^2.2.0
- json_annotation: ^4.8.1
- injectable: ^2.1.1
- get_it: ^7.6.0
- auto_route: ^7.1.0
- flutter_bloc: ^8.1.2
- rxdart: ^0.27.7
+ # UI & Design
+ cupertino_icons: ^1.0.8
+ flutter_svg: ^2.0.16
+ lottie: ^3.1.3
+ flutter_sticky_header: ^0.7.0
+ auto_size_text: ^3.0.0
+ theme_tailor_annotation: ^3.0.1
+
+ # Networking & API
+ dio: ^5.7.0
+ retrofit: ^4.4.1
+
+ # State Management, Dependency Injection, Navigation
+ get_it: ^8.0.2
+ injectable: ^2.5.0
+ flutter_bloc: ^8.1.6
+ auto_route: ^9.2.2
+
+ # Data Modeling & Serialization
+ freezed_annotation: ^2.4.4
+ json_annotation: ^4.9.0
+
+ # Device & App Info
+ device_info_plus: ^11.1.1
+ package_info_plus: ^8.1.1
+
+ # Persistence & Storage
+ flutter_secure_storage: ^9.2.2
+ shared_preferences: ^2.3.3
dev_dependencies:
+ # Testing
flutter_test:
sdk: flutter
- build_runner: ^2.4.6
- injectable_generator: ^2.1.5
- freezed: ^2.3.3
- json_serializable: ^6.6.2
- auto_route_generator: ^7.0.0
- flutter_lints: ^2.0.1
- # Simplifed work with assets
- flutter_gen_runner: ^5.3.1
+ # Code Generation
+ build_runner: ^2.4.13
+ freezed: ^2.5.7
+ json_serializable: ^6.9.0
+ theme_tailor: ^3.0.1
+ auto_route_generator: ^9.0.0
+ injectable_generator: ^2.6.2
+ retrofit_generator: ^9.1.5
+
+ # Linting & Code Quality
+ monstarlab_lints: ^1.0.4
+
+ # Asset Management
+ flutter_gen_runner: ^5.8.0
flutter_gen:
integrations:
flutter_svg: true
+ lottie: true
-# The following section is specific to Flutter.
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:
- assets/icons/
- assets/images/
+ - assets/animations/
fonts:
- family: Roboto
@@ -114,6 +108,3 @@ flutter:
- asset: assets/fonts/Roboto-ThinItalic.ttf
weight: 100
style: italic
-
- # For details regarding fonts from package dependencies,
- # see https://flutter.dev/custom-fonts/#from-packages
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy