From aef0c3df14fccc09f1bf2ea0be0dcd1b68da94dd Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 11:48:27 -0500 Subject: [PATCH 1/9] Refactor code structure for improved readability and maintainability --- apps/mobile/NEXT_SPRINT_TASKS.md | 13 +- apps/mobile/analysis.txt | Bin 310508 -> 0 bytes apps/mobile/analysis_2.txt | Bin 274588 -> 0 bytes apps/mobile/analysis_3.txt | Bin 269630 -> 0 bytes apps/mobile/analysis_utf8.txt | 832 ------------------------------- apps/mobile/analysis_utf8_2.txt | 735 --------------------------- apps/mobile/analysis_utf8_3.txt | 695 -------------------------- 7 files changed, 4 insertions(+), 2271 deletions(-) delete mode 100644 apps/mobile/analysis.txt delete mode 100644 apps/mobile/analysis_2.txt delete mode 100644 apps/mobile/analysis_3.txt delete mode 100644 apps/mobile/analysis_utf8.txt delete mode 100644 apps/mobile/analysis_utf8_2.txt delete mode 100644 apps/mobile/analysis_utf8_3.txt diff --git a/apps/mobile/NEXT_SPRINT_TASKS.md b/apps/mobile/NEXT_SPRINT_TASKS.md index 8b192813..8f88959e 100644 --- a/apps/mobile/NEXT_SPRINT_TASKS.md +++ b/apps/mobile/NEXT_SPRINT_TASKS.md @@ -5,16 +5,14 @@ * Break down large widgets into **smaller, reusable widgets** * Add **doc comments** where necessary to improve readability and maintainability * **Remove overly complicated or unnecessary logic** introduced by AI and simplify where possible - * **Adhere to the design system** and remove all **hard-coded colors and typography**, using shared tokens instead - * Improvement points - apps/mobile/packages/features/client/client_coverage/lib/src/data/repositories_impl/coverage_repository_impl.dart - Fix the location field in CoverageShiftRole to use the correct fallback logic. - line 125 remove redundant location values. -- Need to clarify the difference b/w `case dc.ApplicationStatus.ACCEPTED` and `case dc.ApplicationStatus.CONFIRMED`. - Update the dataconnect docs. - Track `lat` and `lng` in the staff preferred work locations (for now we are only storing the name). +- Change the name of the dataconnect connector replacing the "ExampleConnecter" with "KrowConnecter" - ` final String status;` in `OrderItem` make it an enum. - /// Date of the shift (ISO format). @@ -23,13 +21,10 @@ - in `view_orders_cubit.dart` combine the logic of `_calculateUpNextCount ` and `_calculateTodayCount` into a single function that calculates both counts together to avoid redundant filtering of orders. - In places api call in the when the api's not working we need to show a proper error message instead of just an empty list. - pending should come first in the view order list. -- rename connect name to 'krow-connect' in the project. -- fix "dartdepend_on_referenced_packages" warnings. -- fix "dartunnecessary_library_name" warnings. -- fix lint issues. -- fix localization. -- centralise way to handle errors. + + + - track minimum shift hours in the staff profile and show a warning if they try to apply for shifts that are below their minimum hours. - this need to be added in the BE and also a FE validation (5 hrs). diff --git a/apps/mobile/analysis.txt b/apps/mobile/analysis.txt deleted file mode 100644 index fe23f674e6e0cfa2a07af5f80f8befde3cfb9b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310508 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 DBN6@c diff --git a/apps/mobile/analysis_2.txt b/apps/mobile/analysis_2.txt deleted file mode 100644 index 986bb3d61429c1430ddcef2c25d00b367cd4fed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274588 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 Rd6cJq-A;_*=8#eU`TyNi') - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:47:23 - unrelated_type_equality_checks - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:194:41 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:195:47 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:196:44 - curly_braces_in_flow_control_structures - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\get_tax_forms_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_i9_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_w4_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_i9_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_w4_form_usecase.dart:7:3 - sort_constructors_first - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:2:8 - uri_does_not_exist - info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:4:8 - depend_on_referenced_packages - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:9:51 - mixin_of_non_class - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:13:3 - sort_constructors_first - error - The method 'handleError' isn't defined for the type 'FormI9Cubit' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:99:11 - undefined_method -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:102:47 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:38:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:117:30 - always_specify_types - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:2:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:8:10 - mixin_of_non_class - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:11:3 - sort_constructors_first - error - The method 'handleError' isn't defined for the type 'TaxFormsCubit' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:15:11 - undefined_method - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_state.dart:11:9 - sort_constructors_first - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:2:8 - uri_does_not_exist - info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:4:8 - depend_on_referenced_packages - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:9:51 - mixin_of_non_class - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:13:3 - sort_constructors_first - error - The method 'handleError' isn't defined for the type 'FormW4Cubit' - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:92:11 - undefined_method -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:95:47 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:32:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:92:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:12:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:212:81 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:232:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:249:77 - deprecated_member_use - info - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:465:21 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:12:9 - sort_constructors_first -warning - The value of the field '_usStates' isn't used - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:27:22 - unused_field - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:258:81 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:278:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:295:77 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:446:18 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:40:47 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:148:11 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:150:53 - unawaited_futures -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:153:11 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:155:53 - unawaited_futures - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:174:41 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\tax_forms\lib\staff_tax_forms.dart:1:9 - unnecessary_library_name - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:9:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:12:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\add_bank_account_usecase.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\get_bank_accounts_usecase.dart:9:3 - sort_constructors_first - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:2:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:10:10 - mixin_of_non_class - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:14:3 - sort_constructors_first - error - The method 'handleError' isn't defined for the type 'BankAccountCubit' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:23:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'BankAccountCubit' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:73:11 - undefined_method - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:14:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:34:30 - always_specify_types -warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:11:8 - unused_import - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:146:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:202:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:242:37 - deprecated_member_use -warning - Unused import: 'package:flutter_modular/flutter_modular.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:2:8 - unused_import -warning - Unused import: '../blocs/bank_account_cubit.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:4:8 - unused_import - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:11:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:125:34 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\finances\staff_bank_account\lib\staff_bank_account.dart:1:9 - unnecessary_library_name - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:1:8 - depend_on_referenced_packages - info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:2:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:17:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:8:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:11:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\usecases\get_time_cards_usecase.dart:10:3 - sort_constructors_first - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:3:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:13:10 - mixin_of_non_class - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:16:3 - sort_constructors_first - error - The method 'handleError' isn't defined for the type 'TimeCardBloc' - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:27:11 - undefined_method -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:6:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:14:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:19:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:22:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:6:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:17:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:25:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:29:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:31:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:30:12 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:65:29 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:29:19 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:17:17 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:30:27 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:42:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:19:17 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:45:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:62:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:64:23 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:15:5 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:22:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:27:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:32:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:37:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:43:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:54:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:58:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:61:27 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:98:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:116:25 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:139:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:141:9 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:155:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:161:17 - always_specify_types - info - Library names are not necessary - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:1:9 - unnecessary_library_name - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:3:8 - depend_on_referenced_packages -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:45:15 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\data\repositories_impl\attire_repository_impl.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\save_attire_arguments.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\upload_attire_photo_arguments.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\get_attire_options_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\save_attire_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\upload_attire_photo_usecase.dart:10:3 - sort_constructors_first - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:2:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:13:10 - mixin_of_non_class - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:18:3 - sort_constructors_first - error - The method 'handleError' isn't defined for the type 'AttireCubit' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:28:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'AttireCubit' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:89:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'AttireCubit' - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:141:11 - undefined_method - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_state.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attestation_checkbox.dart:9:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_bottom_bar.dart:12:9 - sort_constructors_first - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:15:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:56:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:156:46 - deprecated_member_use - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:3:8 - depend_on_referenced_packages - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:14:33 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\attire\lib\staff_attire.dart:1:9 - unnecessary_library_name - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:2:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:17:10 - mixin_of_non_class - error - The method 'handleError' isn't defined for the type 'EmergencyContactBloc' - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:39:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'EmergencyContactBloc' - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\blocs\emergency_contact_bloc.dart:91:11 - undefined_method - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\widgets\emergency_contact_info_banner.dart:12:32 - deprecated_member_use - info - Constructors in '@immutable' classes should be declared as 'const' - packages\features\staff\profile_sections\onboarding\experience\lib\src\domain\arguments\save_experience_arguments.dart:7:3 - prefer_const_constructors_in_immutables - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:3:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:97:10 - mixin_of_non_class - error - The method 'handleError' isn't defined for the type 'ExperienceBloc' - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:126:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ExperienceBloc' - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:191:11 - undefined_method -warning - The declaration '_buildCustomSkillsList' isn't referenced - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\pages\experience_page.dart:140:10 - unused_element - info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\experience\lib\staff_profile_experience.dart:1:9 - unnecessary_library_name - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:3:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:17:10 - mixin_of_non_class - error - The method 'handleError' isn't defined for the type 'PersonalInfoBloc' - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:44:11 - undefined_method -warning - Missing type annotation - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:82:48 - always_specify_types - error - The method 'handleError' isn't defined for the type 'PersonalInfoBloc' - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:95:11 - undefined_method - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:44:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:74:53 - deprecated_member_use - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:4:8 - depend_on_referenced_packages - info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:5:8 - depend_on_referenced_packages - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:1:8 - depend_on_referenced_packages - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:2:8 - uri_does_not_exist - error - Classes can only mix in mixins and classes - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:11:10 - mixin_of_non_class - error - The method 'handleError' isn't defined for the type 'ShiftDetailsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:31:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftDetailsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:51:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftDetailsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:71:11 - undefined_method - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:1:8 - depend_on_referenced_packages - error - Target of URI doesn't exist: 'package:krow_core/krow_core.dart' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:3:8 - uri_does_not_exist - info - The imported package 'meta' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:5:8 - depend_on_referenced_packages - error - Classes can only mix in mixins and classes - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:19:10 - mixin_of_non_class - error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:49:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:85:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:114:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:162:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:202:11 - undefined_method - error - The method 'handleError' isn't defined for the type 'ShiftsBloc' - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:248:13 - undefined_method - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:32:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:40:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:44:7 - avoid_print - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:128:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:183:57 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:208:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:209:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:216:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:74:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:100:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:101:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:108:51 - deprecated_member_use - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:4:8 - depend_on_referenced_packages - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:316:54 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:507:47 - deprecated_member_use - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\presentation\blocs\staff_main_cubit.dart:2:8 - depend_on_referenced_packages - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\staff_main_module.dart:3:8 - depend_on_referenced_packages - diff --git a/apps/mobile/analysis_utf8_2.txt b/apps/mobile/analysis_utf8_2.txt deleted file mode 100644 index e65ca897..00000000 --- a/apps/mobile/analysis_utf8_2.txt +++ /dev/null @@ -1,735 +0,0 @@ -Resolving dependencies... -Downloading packages... - _fe_analyzer_shared 91.0.0 (94.0.0 available) - analyzer 8.4.1 (10.0.2 available) - archive 3.6.1 (4.0.7 available) - bloc 8.1.4 (9.2.0 available) - bloc_test 9.1.7 (10.0.0 available) - build_runner 2.10.5 (2.11.0 available) - characters 1.4.0 (1.4.1 available) - code_assets 0.19.10 (1.0.0 available) - dart_style 3.1.3 (3.1.5 available) - fl_chart 0.66.2 (1.1.1 available) - flutter_bloc 8.1.6 (9.1.1 available) - geolocator 10.1.1 (14.0.2 available) - geolocator_android 4.6.2 (5.0.2 available) - geolocator_web 2.2.1 (4.1.3 available) - get_it 7.7.0 (9.2.0 available) - google_fonts 7.0.2 (8.0.1 available) - googleapis_auth 1.6.0 (2.0.0 available) - grpc 3.2.4 (5.1.0 available) - hooks 0.20.5 (1.0.1 available) - image 4.3.0 (4.7.2 available) - json_annotation 4.9.0 (4.10.0 available) - lints 6.0.0 (6.1.0 available) - matcher 0.12.17 (0.12.18 available) - material_color_utilities 0.11.1 (0.13.0 available) - melos 7.3.0 (7.4.0 available) - meta 1.17.0 (1.18.1 available) - native_toolchain_c 0.17.2 (0.17.4 available) - objective_c 9.2.2 (9.3.0 available) - permission_handler 11.4.0 (12.0.1 available) - permission_handler_android 12.1.0 (13.0.1 available) - protobuf 3.1.0 (6.0.0 available) - shared_preferences_android 2.4.18 (2.4.20 available) - slang 4.12.0 (4.12.1 available) - slang_build_runner 4.12.0 (4.12.1 available) - slang_flutter 4.12.0 (4.12.1 available) - source_span 1.10.1 (1.10.2 available) - test 1.26.3 (1.29.0 available) - test_api 0.7.7 (0.7.9 available) - test_core 0.6.12 (0.6.15 available) - url_launcher_ios 6.3.6 (6.4.0 available) -Got dependencies! -40 packages have newer versions incompatible with dependency constraints. -Try `flutter pub outdated` for more information. -Analyzing mobile... - - info - Library names are not necessary - packages\core\lib\core.dart:1:9 - unnecessary_library_name - info - The imported package 'flutter_bloc' isn't a dependency of the importing package - packages\core\lib\src\presentation\mixins\bloc_error_handler.dart:2:8 - depend_on_referenced_packages - info - The imported package 'krow_domain' isn't a dependency of the importing package - packages\core\lib\src\presentation\mixins\bloc_error_handler.dart:3:8 - depend_on_referenced_packages - info - The imported package 'flutter_bloc' isn't a dependency of the importing package - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:2:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:31:3 - sort_constructors_first -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:37:17 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:46:16 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:17 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:32 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:68:16 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:98:16 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:21 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:32 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:99:47 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:128:51 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:244:55 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:246:64 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:249:49 - deprecated_member_use - info - Dangling library doc comment - packages\core\lib\src\routing\routing.dart:1:1 - dangling_library_doc_comments - info - The imported package 'krow_domain' isn't a dependency of the importing package - packages\core\lib\src\routing\staff\navigator.dart:2:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\bloc\locale_event.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\data\datasources\locale_local_data_source.dart:18:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_default_locale_use_case.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_locale_use_case.dart:13:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_supported_locales_use_case.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\set_locale_use_case.dart:13:3 - sort_constructors_first - info - The imported package 'firebase_core' isn't a dependency of the importing package - packages\data_connect\lib\src\mixins\data_error_handler.dart:4:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:11:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:26:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:48:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:8:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:30:3 - sort_constructors_first - info - Statements in an if should be enclosed in a block - packages\design_system\lib\src\ui_theme.dart:85:19 - curly_braces_in_flow_control_structures -warning - Missing type annotation - packages\design_system\lib\src\ui_theme.dart:258:27 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_app_bar.dart:39:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:43:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - prefer_const_constructors_in_immutables - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - prefer_const_constructors_in_immutables - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - prefer_const_constructors_in_immutables - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - prefer_const_constructors_in_immutables - info - Type could be non-nullable - packages\design_system\lib\src\widgets\ui_button.dart:135:24 - unnecessary_nullable_for_final_variable_declarations - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_chip.dart:57:9 - sort_constructors_first -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:38:21 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:45:27 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:50:45 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:82:5 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:30:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:42:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:53:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_step_indicator.dart:18:9 - sort_constructors_first -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_step_indicator.dart:38:19 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:30:21 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:31:13 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_text_field.dart:59:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:5:68 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:6:16 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:11:18 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:16:16 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:25:5 - always_specify_types -warning - Unused import: '../../entities/shifts/shift.dart' - packages\domain\lib\src\adapters\clock_in\clock_in_adapter.dart:1:8 - unused_import -warning - Missing type annotation - packages\domain\lib\src\adapters\profile\bank_account_adapter.dart:34:10 - always_specify_types - info - Angle brackets will be interpreted as HTML - packages\domain\lib\src\adapters\profile\experience_adapter.dart:3:62 - unintended_html_in_doc_comment -warning - Unnecessary cast - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:53 - unnecessary_cast -warning - Missing type annotation - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:65 - always_specify_types - info - The imported package 'intl' isn't a dependency of the importing package - packages\domain\lib\src\adapters\shifts\shift_adapter.dart:1:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\availability_slot.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\availability\availability_slot.dart:32:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\day_availability.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:14:18 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:30:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\clock_in\attendance_status.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\clock_in\attendance_status.dart:20:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\payment_summary.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\financial\payment_summary.dart:18:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\time_card.dart:50:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\financial\time_card.dart:65:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\attire_item.dart:23:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\experience_skill.dart:21:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\experience_skill.dart:25:49 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\industry.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\industry.dart:16:42 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\staff_document.dart:38:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\staff_document.dart:50:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\tax_form.dart:19:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:26:21 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:32:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:33:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:65:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:102:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:105:30 - always_specify_types - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:35:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:44:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:53:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:62:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:71:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:80:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:89:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:98:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:107:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:116:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:134:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:143:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:152:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:170:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:179:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:188:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:197:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:206:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:224:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:233:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:242:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:260:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:269:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:278:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:291:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:300:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:309:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:318:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:327:9 - use_super_parameters -warning - The name GoogleOnlyAccountException is shown, but isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:16:9 - unused_shown_name -warning - The value of the local variable 'newUserData' isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:266:35 - unused_local_variable - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:137:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:152:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:200:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:210:47 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:241:35 - deprecated_member_use -warning - Missing type annotation - packages\features\client\authentication\lib\src\presentation\pages\client_sign_up_page.dart:44:12 - always_specify_types -warning - The value of the local variable 'currentBill' isn't used - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:57:22 - unused_local_variable - error - Expected a method, getter, setter or operator declaration - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:172:1 - expected_executable - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:76:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:108:61 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:156:64 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:171:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:189:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:110:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:135:58 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:173:45 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:76:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:112:60 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:130:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:142:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:159:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:320:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:322:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:331:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:333:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:341:31 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:343:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:352:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:354:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:362:29 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:364:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:372:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:374:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:382:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:384:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:394:29 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:396:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:22:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:25:39 - deprecated_member_use - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\client_main_module.dart:6:8 - depend_on_referenced_packages - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\presentation\blocs\client_main_cubit.dart:3:8 - depend_on_referenced_packages -warning - Missing type annotation - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:30:12 - always_specify_types - info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:131:7 - avoid_print -warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:71:23 - invalid_use_of_visible_for_testing_member -warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:75:7 - invalid_use_of_visible_for_testing_member - info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\presentation\widgets\rapid_order\rapid_order_view.dart:292:21 - avoid_print -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:25:10 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:17 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:29 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:17 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:29 - always_specify_types -warning - The name HubCreationFailedException is shown, but isn't used - packages\features\client\hubs\lib\src\data\repositories_impl\hub_repository_impl.dart:12:9 - unused_shown_name - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\domain\usecases\sign_out_usecase.dart:13:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_bloc.dart:14:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_state.dart:25:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_profile_header.dart:80:23 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_quick_links.dart:69:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:15:3 - sort_constructors_first - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:43:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:66:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:118:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:124:7 - avoid_print - info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\domain\usecases\get_orders_use_case.dart:15:3 - sort_constructors_first - error - The argument type 'Null Function(ViewOrdersState)' can't be assigned to the parameter type 'Emitter'. - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:42:13 - argument_type_not_assignable - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:248:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:257:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:266:7 - avoid_print -warning - The declaration '_applyApplications' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:323:19 - unused_element -warning - The declaration '_isSameDay' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:357:8 - unused_element -warning - The declaration '_calculateCalendarDays' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:361:18 - unused_element -warning - The declaration '_calculateFilteredOrders' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:376:19 - unused_element - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:402:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:410:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:418:7 - avoid_print -warning - The declaration '_calculateCategoryCount' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:426:7 - unused_element - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:427:9 - undefined_identifier - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:431:14 - undefined_identifier - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:434:14 - undefined_identifier - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:438:14 - undefined_identifier -warning - The declaration '_calculateUpNextCount' isn't referenced - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:445:7 - unused_element - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:446:9 - undefined_identifier - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:450:14 - undefined_identifier - error - Undefined name 'state' - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:452:12 - undefined_identifier - error - Expected a method, getter, setter or operator declaration - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:461:1 - expected_executable -warning - The declaration '_formatDate' isn't referenced - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:84:10 - unused_element -warning - The receiver can't be null, so the null-aware operator '?.' is unnecessary - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:833:55 - invalid_null_aware_operator - info - Type could be non-nullable - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:872:7 - unnecessary_nullable_for_final_variable_declarations - info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1615:39 - use_build_context_synchronously - info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1635:39 - use_build_context_synchronously - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:9:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:13:31 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:40:21 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\profile_setup_repository_impl.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\sign_in_with_phone_arguments.dart:13:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\verify_otp_arguments.dart:21:9 - sort_constructors_first -warning - Unused import: 'package:krow_domain/krow_domain.dart' - packages\features\staff\authentication\lib\src\domain\repositories\profile_setup_repository.dart:1:8 - unused_import - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\search_cities_usecase.dart:6:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\sign_in_with_phone_usecase.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\submit_profile_setup_usecase.dart:6:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\verify_otp_usecase.dart:15:3 - sort_constructors_first - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:29:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:19:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:39:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:57:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:67:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:78:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:89:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_state.dart:49:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:117:48 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:124:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:128:48 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:136:46 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:17:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:29:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:41:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:53:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:65:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:77:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:89:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_state.dart:36:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:23:9 - sort_constructors_first - info - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:138:24 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\pages\profile_setup_page.dart:157:27 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\common\section_title_subtitle.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_actions.dart:9:9 - sort_constructors_first - info - Unnecessary instance of 'Container' - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:9:12 - avoid_unnecessary_containers -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:11:19 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:25:50 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:36 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:45 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:52 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:43:23 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:57:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:66:43 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification.dart:24:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:20:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:31:52 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:35:39 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:75:21 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:14:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:35:5 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:18:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:38:17 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_header.dart:11:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_actions.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_form_field.dart:20:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_basic_info.dart:21:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_experience.dart:22:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_header.dart:17:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:24:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:33 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:104:28 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:106:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:36 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:45 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:31 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:40 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:118:19 - always_specify_types - info - Library names are not necessary - packages\features\staff\authentication\lib\staff_authentication.dart:1:9 - unnecessary_library_name - info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:148:28 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:149:35 - curly_braces_in_flow_control_structures - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:100:45 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:122:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:192:30 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:193:38 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:224:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:310:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:341:42 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:383:33 - deprecated_member_use - info - 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:418:17 - deprecated_member_use - info - Unnecessary use of 'toList' in a spread - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:431:14 - unnecessary_to_list_in_spreads - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:484:36 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:485:40 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:587:35 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\availability\lib\staff_availability.dart:1:9 - unnecessary_library_name -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\data\repositories_impl\clock_in_repository_impl.dart:109:78 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:105:11 - unawaited_futures - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:89:7 - unawaited_futures -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:130:11 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:147:11 - always_specify_types -warning - The value of the local variable 'checkInStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:68:24 - unused_local_variable -warning - The value of the local variable 'checkOutStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:71:24 - unused_local_variable -warning - The declaration '_buildModeTab' isn't referenced - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:465:10 - unused_element - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:483:43 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:523:43 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:573:33 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:34:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:100:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:106:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:112:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:118:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:175:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:273:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:375:23 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:386:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:427:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:430:51 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:461:51 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:464:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:512:56 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:541:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:19:34 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:44:60 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:70:44 - deprecated_member_use - info - Unnecessary use of multiple underscores - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:30:24 - unnecessary_underscores - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:59:41 - deprecated_member_use -warning - The value of the field '_tookLunch' isn't used - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:15:9 - unused_field -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:187:60 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:200:60 - always_specify_types - info - 'groupValue' is deprecated and shouldn't be used. Use a RadioGroup ancestor to manage group value instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:242:16 - deprecated_member_use - info - 'onChanged' is deprecated and shouldn't be used. Use RadioGroup to handle value change instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:243:16 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:59:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:84:11 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:99:34 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:152:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:168:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:200:47 - deprecated_member_use - error - The argument type 'void Function(HomeState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\home\lib\src\presentation\blocs\home_cubit.dart:25:13 - argument_type_not_assignable - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:36:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:41:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:75 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:29:54 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\placeholder_banner.dart:32:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\quick_action_item.dart:34:46 - deprecated_member_use -warning - Dead code - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:45 - dead_code -warning - The left operand can't be null, so the right operand is never executed - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:48 - dead_null_aware_expression - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:52:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:55:45 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:32:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:42:34 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:61:42 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:62:37 - deprecated_member_use - info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:20:46 - deprecated_member_use - info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:63 - deprecated_member_use - info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:56:48 - deprecated_member_use - info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:65 - deprecated_member_use - info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:78:56 - deprecated_member_use - info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:55:48 - deprecated_member_use - info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:65 - deprecated_member_use - info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:77:56 - deprecated_member_use - info - Import of a library in the 'lib/src' directory of another package - packages\features\staff\payments\lib\src\payments_module.dart:1:8 - implementation_imports - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\pages\payments_page.dart:114:41 - deprecated_member_use -warning - The value of the local variable 'maxX' isn't used - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:36:18 - unused_local_variable - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:47:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:105:54 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:124:12 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_history_item.dart:37:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_stats_card.dart:26:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\pending_pay_card.dart:27:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:34:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:39:5 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\get_profile_usecase.dart:18:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\sign_out_usecase.dart:19:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:16:3 - sort_constructors_first - error - The argument type 'void Function(ProfileState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:28:13 - argument_type_not_assignable -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:30:9 - always_specify_types - error - The argument type 'void Function(ProfileState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:51:13 - argument_type_not_assignable - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:36:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:56:30 - always_specify_types -warning - Duplicate import - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:17:8 - duplicate_import -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:20 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:29 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:28 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:86:11 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:94:25 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:108:33 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:125:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:146:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:150:41 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:164:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:188:37 - always_specify_types - error - The getter 'globe' isn't defined for the type 'UiIcons' - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:190:45 - undefined_getter -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:195:45 - always_specify_types -warning - Unused import: 'package:flutter_bloc/flutter_bloc.dart' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:4:8 - unused_import - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:18:16 - prefer_const_constructors - error - The getter 'surface' isn't defined for the type 'UiColors' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:20:25 - undefined_getter - error - The argument type 'BorderRadius' can't be assigned to the parameter type 'double'. - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:21:66 - argument_type_not_assignable -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:26:19 - always_specify_types - error - The getter 'headline4b' isn't defined for the type 'UiTypography' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:29:33 - undefined_getter - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:32:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:38:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:44:11 - prefer_const_constructors - error - The argument type 'BorderRadius' can't be assigned to the parameter type 'double'. - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:72:43 - argument_type_not_assignable - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:74:18 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:79:48 - deprecated_member_use - error - The argument type 'BorderRadius' can't be assigned to the parameter type 'double'. - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:80:47 - argument_type_not_assignable -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:88:21 - always_specify_types - error - The getter 'iconSizeMd' isn't defined for the type 'UiConstants' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:99:35 - undefined_getter - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:16:5 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:31:22 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:34:25 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:36:17 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:23:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:33:5 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:37:16 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:43:19 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:45:23 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:46:19 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:52:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:56:25 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:68:57 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:74:13 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:78:25 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:82:28 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:88:31 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:90:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:94:32 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:96:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:106:59 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:124:43 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:126:53 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:149:32 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:151:52 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:164:13 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:171:13 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:173:24 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:178:40 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:17 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:26 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:23:9 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:24:9 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:25:9 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:32:35 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:13:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:31:18 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:35:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:40:29 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:45:49 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:51:21 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:53:32 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:79:46 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:18:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:19:5 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:22:16 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:24:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:29:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:32:23 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:47:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:58:22 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:15:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:27:16 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:32:20 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:34:40 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:42:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:86:19 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:91:39 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:97:11 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:10:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:16:16 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:17:15 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\data\repositories_impl\certificates_repository_impl.dart:23:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\domain\usecases\get_certificates_usecase.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_cubit.dart:11:3 - sort_constructors_first - error - The argument type 'void Function(CertificatesState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_cubit.dart:19:13 - argument_type_not_assignable - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:30:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:34:15 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\add_certificate_card.dart:8:9 - sort_constructors_first - info - The imported package 'intl' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:14:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:48:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:62:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:99:46 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:416:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_upload_modal.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:10:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:42:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:73:55 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:103:45 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\certificates\lib\staff_certificates.dart:1:9 - unnecessary_library_name - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:14:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:29:12 - always_specify_types -warning - Dead code - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:52:5 - dead_code - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\domain\usecases\get_documents_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_cubit.dart:11:3 - sort_constructors_first - error - The argument type 'void Function(DocumentsState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_cubit.dart:16:13 - argument_type_not_assignable - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_state.dart:11:9 - sort_constructors_first -warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:11:8 - unused_import - info - Constructors for public widgets should have a named 'key' parameter - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:15:7 - use_key_in_widget_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:12:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:35:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:117:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:122:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:127:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:132:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:137:33 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\documents_progress_card.dart:17:9 - sort_constructors_first - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\documents\lib\staff_documents.dart:1:9 - unnecessary_library_name -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:9:43 - always_specify_types - info - The type of the right operand ('TaxFormType') isn't a subtype or a supertype of the left operand ('EnumValue') - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:47:23 - unrelated_type_equality_checks - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:194:41 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:195:47 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:196:44 - curly_braces_in_flow_control_structures - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\get_tax_forms_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_i9_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_w4_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_i9_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_w4_form_usecase.dart:7:3 - sort_constructors_first - info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:4:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:13:3 - sort_constructors_first - error - The argument type 'void Function(FormI9State)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:100:13 - argument_type_not_assignable -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:102:47 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:38:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:117:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:11:3 - sort_constructors_first - error - The argument type 'void Function(TaxFormsState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:16:13 - argument_type_not_assignable - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_state.dart:11:9 - sort_constructors_first - info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:4:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:13:3 - sort_constructors_first - error - The argument type 'void Function(FormW4State)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:93:13 - argument_type_not_assignable -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:95:47 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:32:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:92:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:12:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:212:81 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:232:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:249:77 - deprecated_member_use - info - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:465:21 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:12:9 - sort_constructors_first -warning - The value of the field '_usStates' isn't used - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:27:22 - unused_field - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:258:81 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:278:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:295:77 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:446:18 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:40:47 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:148:11 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:150:53 - unawaited_futures -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:153:11 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:155:53 - unawaited_futures - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:174:41 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\tax_forms\lib\staff_tax_forms.dart:1:9 - unnecessary_library_name - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:9:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:12:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\add_bank_account_usecase.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\get_bank_accounts_usecase.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:14:3 - sort_constructors_first - error - The argument type 'void Function(BankAccountState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:24:13 - argument_type_not_assignable - error - The argument type 'void Function(BankAccountState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:74:13 - argument_type_not_assignable - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:14:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:34:30 - always_specify_types -warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:11:8 - unused_import - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:146:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:202:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:242:37 - deprecated_member_use -warning - Unused import: 'package:flutter_modular/flutter_modular.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:2:8 - unused_import -warning - Unused import: '../blocs/bank_account_cubit.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:4:8 - unused_import - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:11:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:125:34 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\finances\staff_bank_account\lib\staff_bank_account.dart:1:9 - unnecessary_library_name - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:1:8 - depend_on_referenced_packages - info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:2:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:17:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:8:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:11:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\usecases\get_time_cards_usecase.dart:10:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:16:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:6:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:14:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:19:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:22:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:6:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:17:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:25:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:29:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:31:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:30:12 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:65:29 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:29:19 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:17:17 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:30:27 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:42:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:19:17 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:45:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:62:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:64:23 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:15:5 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:22:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:27:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:32:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:37:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:43:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:54:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:58:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:61:27 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:98:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:116:25 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:139:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:141:9 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:155:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:161:17 - always_specify_types - info - Library names are not necessary - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:1:9 - unnecessary_library_name - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:3:8 - depend_on_referenced_packages -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:45:15 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\data\repositories_impl\attire_repository_impl.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\save_attire_arguments.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\upload_attire_photo_arguments.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\get_attire_options_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\save_attire_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\upload_attire_photo_usecase.dart:10:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:18:3 - sort_constructors_first - error - The argument type 'void Function(AttireState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:29:13 - argument_type_not_assignable - error - The argument type 'void Function(AttireState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:90:13 - argument_type_not_assignable - error - The argument type 'void Function(AttireState)' can't be assigned to the parameter type 'Emitter'. - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:142:13 - argument_type_not_assignable - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_state.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attestation_checkbox.dart:9:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_bottom_bar.dart:12:9 - sort_constructors_first - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:15:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:56:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:156:46 - deprecated_member_use - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:3:8 - depend_on_referenced_packages - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:14:33 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\attire\lib\staff_attire.dart:1:9 - unnecessary_library_name - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\widgets\emergency_contact_info_banner.dart:12:32 - deprecated_member_use - info - Constructors in '@immutable' classes should be declared as 'const' - packages\features\staff\profile_sections\onboarding\experience\lib\src\domain\arguments\save_experience_arguments.dart:7:3 - prefer_const_constructors_in_immutables -warning - The declaration '_buildCustomSkillsList' isn't referenced - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\pages\experience_page.dart:140:10 - unused_element - info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\experience\lib\staff_profile_experience.dart:1:9 - unnecessary_library_name -warning - Missing type annotation - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:82:48 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:44:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:74:53 - deprecated_member_use - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:4:8 - depend_on_referenced_packages - info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:5:8 - depend_on_referenced_packages - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:1:8 - depend_on_referenced_packages - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:1:8 - depend_on_referenced_packages - info - The imported package 'meta' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:5:8 - depend_on_referenced_packages - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:32:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:40:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:44:7 - avoid_print - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:128:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:183:57 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:208:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:209:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:216:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:74:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:100:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:101:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:108:51 - deprecated_member_use - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:4:8 - depend_on_referenced_packages - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:316:54 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:507:47 - deprecated_member_use - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\presentation\blocs\staff_main_cubit.dart:2:8 - depend_on_referenced_packages - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\staff_main_module.dart:3:8 - depend_on_referenced_packages - diff --git a/apps/mobile/analysis_utf8_3.txt b/apps/mobile/analysis_utf8_3.txt deleted file mode 100644 index 8fb19646..00000000 --- a/apps/mobile/analysis_utf8_3.txt +++ /dev/null @@ -1,695 +0,0 @@ -Analyzing mobile... - - info - Library names are not necessary - packages\core\lib\core.dart:1:9 - unnecessary_library_name - info - The imported package 'flutter_bloc' isn't a dependency of the importing package - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:2:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:31:3 - sort_constructors_first -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:37:17 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:46:16 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:17 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:57:32 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:68:16 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:98:16 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:21 - always_specify_types -warning - Missing type annotation - packages\core\lib\src\presentation\observers\core_bloc_observer.dart:107:32 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:99:47 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:128:51 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:244:55 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:246:64 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\core\lib\src\presentation\widgets\web_mobile_frame.dart:249:49 - deprecated_member_use - info - Dangling library doc comment - packages\core\lib\src\routing\routing.dart:1:1 - dangling_library_doc_comments - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\bloc\locale_event.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\data\datasources\locale_local_data_source.dart:18:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_default_locale_use_case.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_locale_use_case.dart:13:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\get_supported_locales_use_case.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\core_localization\lib\src\domain\usecases\set_locale_use_case.dart:13:3 - sort_constructors_first - info - The imported package 'firebase_core' isn't a dependency of the importing package - packages\data_connect\lib\src\mixins\data_error_handler.dart:4:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:11:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:26:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\client_session_store.dart:48:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:8:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\data_connect\lib\src\session\staff_session_store.dart:30:3 - sort_constructors_first - info - Statements in an if should be enclosed in a block - packages\design_system\lib\src\ui_theme.dart:85:19 - curly_braces_in_flow_control_structures -warning - Missing type annotation - packages\design_system\lib\src\ui_theme.dart:258:27 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_app_bar.dart:39:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:43:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:61:3 - prefer_const_constructors_in_immutables - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:79:3 - prefer_const_constructors_in_immutables - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:97:3 - prefer_const_constructors_in_immutables - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - sort_constructors_first - info - Constructors in '@immutable' classes should be declared as 'const' - packages\design_system\lib\src\widgets\ui_button.dart:115:3 - prefer_const_constructors_in_immutables - info - Type could be non-nullable - packages\design_system\lib\src\widgets\ui_button.dart:135:24 - unnecessary_nullable_for_final_variable_declarations - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_chip.dart:57:9 - sort_constructors_first -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:38:21 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:45:27 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:50:45 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_error_snackbar.dart:82:5 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:30:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:42:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_icon_button.dart:53:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_step_indicator.dart:18:9 - sort_constructors_first -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_step_indicator.dart:38:19 - always_specify_types -warning - Missing type annotation - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:30:21 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\design_system\lib\src\widgets\ui_success_snackbar.dart:31:13 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\design_system\lib\src\widgets\ui_text_field.dart:59:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:5:68 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:6:16 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:11:18 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:16:16 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\adapters\availability\availability_adapter.dart:25:5 - always_specify_types -warning - Unused import: '../../entities/shifts/shift.dart' - packages\domain\lib\src\adapters\clock_in\clock_in_adapter.dart:1:8 - unused_import -warning - Missing type annotation - packages\domain\lib\src\adapters\profile\bank_account_adapter.dart:34:10 - always_specify_types - info - Angle brackets will be interpreted as HTML - packages\domain\lib\src\adapters\profile\experience_adapter.dart:3:62 - unintended_html_in_doc_comment -warning - Unnecessary cast - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:53 - unnecessary_cast -warning - Missing type annotation - packages\domain\lib\src\adapters\profile\tax_form_adapter.dart:21:65 - always_specify_types - info - The imported package 'intl' isn't a dependency of the importing package - packages\domain\lib\src\adapters\shifts\shift_adapter.dart:1:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\availability_slot.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\availability\availability_slot.dart:32:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\availability\day_availability.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:14:18 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\entities\availability\day_availability.dart:30:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\clock_in\attendance_status.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\clock_in\attendance_status.dart:20:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\payment_summary.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\financial\payment_summary.dart:18:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\financial\time_card.dart:50:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\financial\time_card.dart:65:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\attire_item.dart:23:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\experience_skill.dart:21:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\experience_skill.dart:25:49 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\industry.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\industry.dart:16:42 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\staff_document.dart:38:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\staff_document.dart:50:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\profile\tax_form.dart:19:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:26:21 - always_specify_types -warning - Missing type annotation - packages\domain\lib\src\entities\profile\tax_form.dart:32:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:33:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:65:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\domain\lib\src\entities\shifts\shift.dart:102:9 - sort_constructors_first -warning - Missing type annotation - packages\domain\lib\src\entities\shifts\shift.dart:105:30 - always_specify_types - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:35:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:44:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:53:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:62:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:71:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:80:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:89:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:98:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:107:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:116:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:134:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:143:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:152:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:170:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:179:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:188:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:197:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:206:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:224:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:233:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:242:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:260:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:269:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:278:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:291:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:300:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:309:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:318:9 - use_super_parameters - info - Parameter 'technicalMessage' could be a super parameter - packages\domain\lib\src\exceptions\app_exception.dart:327:9 - use_super_parameters -warning - The name GoogleOnlyAccountException is shown, but isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:16:9 - unused_shown_name -warning - The value of the local variable 'newUserData' isn't used - packages\features\client\authentication\lib\src\data\repositories_impl\auth_repository_impl.dart:266:35 - unused_local_variable - info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:58:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:80:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:106:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\authentication\lib\src\presentation\blocs\client_auth_bloc.dart:128:13 - implicit_call_tearoffs - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:137:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:152:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:200:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:210:47 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\authentication\lib\src\presentation\pages\client_get_started_page.dart:241:35 - deprecated_member_use -warning - Missing type annotation - packages\features\client\authentication\lib\src\presentation\pages\client_sign_up_page.dart:44:12 - always_specify_types - info - Implicit tear-off of the 'call' method - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:46:13 - implicit_call_tearoffs -warning - The value of the local variable 'currentBill' isn't used - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:57:22 - unused_local_variable - info - Implicit tear-off of the 'call' method - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:98:13 - implicit_call_tearoffs - error - Expected a method, getter, setter or operator declaration - packages\features\client\billing\lib\src\presentation\blocs\billing_bloc.dart:172:1 - expected_executable - info - Implicit tear-off of the 'call' method - packages\features\client\client_coverage\lib\src\presentation\blocs\coverage_bloc.dart:46:13 - implicit_call_tearoffs - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:76:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:108:61 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:156:64 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:171:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\pages\coverage_page.dart:189:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:110:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:135:58 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_calendar_selector.dart:173:45 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:76:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:112:60 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:130:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:142:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_header.dart:159:59 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:320:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:322:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:331:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:333:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:341:31 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:343:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:352:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:354:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:362:29 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:364:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:372:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:374:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:382:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:384:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:394:29 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\coverage_shift_list.dart:396:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:22:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\client\client_coverage\lib\src\presentation\widgets\late_workers_alert.dart:25:39 - deprecated_member_use - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\client_main_module.dart:6:8 - depend_on_referenced_packages - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\client\client_main\lib\src\presentation\blocs\client_main_cubit.dart:3:8 - depend_on_referenced_packages -warning - Missing type annotation - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:30:12 - always_specify_types - info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\data\repositories_impl\client_create_order_repository_impl.dart:131:7 - avoid_print - info - Implicit tear-off of the 'call' method - packages\features\client\create_order\lib\src\presentation\blocs\client_create_order_bloc.dart:23:13 - implicit_call_tearoffs -warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:71:23 - invalid_use_of_visible_for_testing_member -warning - The member 'emit' can only be used within 'package:bloc/src/bloc.dart' or a test - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:75:7 - invalid_use_of_visible_for_testing_member - info - Implicit tear-off of the 'call' method - packages\features\client\create_order\lib\src\presentation\blocs\one_time_order_bloc.dart:227:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\create_order\lib\src\presentation\blocs\rapid_order_bloc.dart:72:15 - implicit_call_tearoffs - info - Don't invoke 'print' in production code - packages\features\client\create_order\lib\src\presentation\widgets\rapid_order\rapid_order_view.dart:292:21 - avoid_print - info - Implicit tear-off of the 'call' method - packages\features\client\home\lib\src\presentation\blocs\client_home_bloc.dart:40:13 - implicit_call_tearoffs -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:25:10 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:17 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:42:29 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:17 - always_specify_types -warning - Missing type annotation - packages\features\client\home\lib\src\presentation\widgets\coverage_dashboard.dart:45:29 - always_specify_types -warning - The name HubCreationFailedException is shown, but isn't used - packages\features\client\hubs\lib\src\data\repositories_impl\hub_repository_impl.dart:12:9 - unused_shown_name - info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:71:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:90:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:130:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\client\hubs\lib\src\presentation\blocs\client_hubs_bloc.dart:156:13 - implicit_call_tearoffs - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\domain\usecases\sign_out_usecase.dart:13:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_bloc.dart:14:3 - sort_constructors_first - info - Implicit tear-off of the 'call' method - packages\features\client\settings\lib\src\presentation\blocs\client_settings_bloc.dart:26:13 - implicit_call_tearoffs - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\blocs\client_settings_state.dart:25:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_profile_header.dart:80:23 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\client\settings\lib\src\presentation\widgets\client_settings_page\settings_quick_links.dart:69:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:15:3 - sort_constructors_first - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:43:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:66:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:118:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\data\repositories\view_orders_repository_impl.dart:124:7 - avoid_print - info - Constructor declarations should be before non-constructor declarations - packages\features\client\view_orders\lib\src\domain\usecases\get_orders_use_case.dart:15:3 - sort_constructors_first - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:248:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:257:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\client\view_orders\lib\src\presentation\blocs\view_orders_cubit.dart:266:7 - avoid_print -warning - The declaration '_formatDate' isn't referenced - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:84:10 - unused_element -warning - The receiver can't be null, so the null-aware operator '?.' is unnecessary - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:833:55 - invalid_null_aware_operator - info - Type could be non-nullable - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:872:7 - unnecessary_nullable_for_final_variable_declarations - info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1615:39 - use_build_context_synchronously - info - Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check - packages\features\client\view_orders\lib\src\presentation\widgets\view_order_card.dart:1635:39 - use_build_context_synchronously - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:9:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:13:31 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\data\repositories_impl\place_repository_impl.dart:40:21 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\data\repositories_impl\profile_setup_repository_impl.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\sign_in_with_phone_arguments.dart:13:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\arguments\verify_otp_arguments.dart:21:9 - sort_constructors_first -warning - Unused import: 'package:krow_domain/krow_domain.dart' - packages\features\staff\authentication\lib\src\domain\repositories\profile_setup_repository.dart:1:8 - unused_import - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\search_cities_usecase.dart:6:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\sign_in_with_phone_usecase.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\submit_profile_setup_usecase.dart:6:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\domain\usecases\verify_otp_usecase.dart:15:3 - sort_constructors_first - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:29:3 - sort_constructors_first - info - Implicit tear-off of the 'call' method - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:114:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\authentication\lib\src\presentation\blocs\auth_bloc.dart:196:13 - implicit_call_tearoffs - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:19:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:39:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:57:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:67:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:78:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_event.dart:89:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\auth_state.dart:49:9 - sort_constructors_first - info - Implicit tear-off of the 'call' method - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:92:13 - implicit_call_tearoffs -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:117:48 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:124:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:128:48 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_bloc.dart:136:46 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:17:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:29:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:41:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:53:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:65:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:77:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_event.dart:89:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\blocs\profile_setup\profile_setup_state.dart:36:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:23:9 - sort_constructors_first - info - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre - packages\features\staff\authentication\lib\src\presentation\pages\phone_verification_page.dart:138:24 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\pages\profile_setup_page.dart:157:27 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\common\section_title_subtitle.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_actions.dart:9:9 - sort_constructors_first - info - Unnecessary instance of 'Container' - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:9:12 - avoid_unnecessary_containers -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:11:19 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:25:50 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:36 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:45 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:32:52 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:43:23 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:57:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\get_started_page\get_started_background.dart:66:43 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification.dart:24:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:20:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:31:52 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:35:39 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_input_field.dart:75:21 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:14:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_resend_section.dart:35:5 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:18:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_actions.dart:38:17 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\otp_verification\otp_verification_header.dart:11:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_actions.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\phone_verification_page\phone_input\phone_input_form_field.dart:20:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_basic_info.dart:21:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_experience.dart:22:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_header.dart:17:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:24:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:92:33 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:94:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:104:28 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:106:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:36 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:116:45 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:31 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:117:40 - always_specify_types -warning - Missing type annotation - packages\features\staff\authentication\lib\src\presentation\widgets\profile_setup_page\profile_setup_location.dart:118:19 - always_specify_types - info - Library names are not necessary - packages\features\staff\authentication\lib\staff_authentication.dart:1:9 - unnecessary_library_name - info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:148:28 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\availability\lib\src\data\repositories_impl\availability_repository_impl.dart:149:35 - curly_braces_in_flow_control_structures - info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:34:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:106:15 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:158:15 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\availability\lib\src\presentation\blocs\availability_bloc.dart:198:15 - implicit_call_tearoffs - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:100:45 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:122:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:192:30 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:193:38 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:224:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:310:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:341:42 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:383:33 - deprecated_member_use - info - 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:418:17 - deprecated_member_use - info - Unnecessary use of 'toList' in a spread - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:431:14 - unnecessary_to_list_in_spreads - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:484:36 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:485:40 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\availability\lib\src\presentation\pages\availability_page.dart:587:35 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\availability\lib\staff_availability.dart:1:9 - unnecessary_library_name -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\data\repositories_impl\clock_in_repository_impl.dart:109:78 - always_specify_types - info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:52:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:91:13 - implicit_call_tearoffs - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:105:11 - unawaited_futures - info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:206:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\clock_in\lib\src\presentation\bloc\clock_in_bloc.dart:229:13 - implicit_call_tearoffs - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:89:7 - unawaited_futures -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:130:11 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\blocs\clock_in_cubit.dart:147:11 - always_specify_types -warning - The value of the local variable 'checkInStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:68:24 - unused_local_variable -warning - The value of the local variable 'checkOutStr' isn't used - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:71:24 - unused_local_variable -warning - The declaration '_buildModeTab' isn't referenced - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:465:10 - unused_element - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:483:43 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:523:43 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\pages\clock_in_page.dart:573:33 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:34:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:100:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:106:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:112:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\attendance_card.dart:118:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:175:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:273:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:375:23 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:386:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:427:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:430:51 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:461:51 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:464:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:512:56 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\commute_tracker.dart:541:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:19:34 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:44:60 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\date_selector.dart:70:44 - deprecated_member_use - info - Unnecessary use of multiple underscores - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:30:24 - unnecessary_underscores - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\location_map_placeholder.dart:59:41 - deprecated_member_use -warning - The value of the field '_tookLunch' isn't used - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:15:9 - unused_field -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:187:60 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:200:60 - always_specify_types - info - 'groupValue' is deprecated and shouldn't be used. Use a RadioGroup ancestor to manage group value instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:242:16 - deprecated_member_use - info - 'onChanged' is deprecated and shouldn't be used. Use RadioGroup to handle value change instead. This feature was deprecated after v3.32.0-0.0.pre - packages\features\staff\clock_in\lib\src\presentation\widgets\lunch_break_modal.dart:243:16 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:59:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:84:11 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:99:34 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:152:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:168:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\clock_in\lib\src\presentation\widgets\swipe_to_check_in.dart:200:47 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:36:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\home_header.dart:41:49 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:24:75 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\pending_payment_card.dart:29:54 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\placeholder_banner.dart:32:44 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\quick_action_item.dart:34:46 - deprecated_member_use -warning - Dead code - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:45 - dead_code -warning - The left operand can't be null, so the right operand is never executed - packages\features\staff\home\lib\src\presentation\widgets\home_page\recommended_shift_card.dart:193:48 - dead_null_aware_expression - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:52:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\home_page\section_header.dart:55:45 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:32:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:42:34 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:61:42 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\auto_match_toggle.dart:62:37 - deprecated_member_use - info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:20:46 - deprecated_member_use - info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\benefits_widget.dart:25:63 - deprecated_member_use - info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:56:48 - deprecated_member_use - info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:61:65 - deprecated_member_use - info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\improve_yourself_widget.dart:78:56 - deprecated_member_use - info - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:55:48 - deprecated_member_use - info - 'onBackground' is deprecated and shouldn't be used. Use onSurface instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:60:65 - deprecated_member_use - info - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre - packages\features\staff\home\lib\src\presentation\widgets\worker\more_ways_widget.dart:77:56 - deprecated_member_use - info - Import of a library in the 'lib/src' directory of another package - packages\features\staff\payments\lib\src\payments_module.dart:1:8 - implementation_imports - info - Implicit tear-off of the 'call' method - packages\features\staff\payments\lib\src\presentation\blocs\payments\payments_bloc.dart:28:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\payments\lib\src\presentation\blocs\payments\payments_bloc.dart:54:15 - implicit_call_tearoffs - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\pages\payments_page.dart:114:41 - deprecated_member_use -warning - The value of the local variable 'maxX' isn't used - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:36:18 - unused_local_variable - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:47:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:105:54 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\payments\lib\src\presentation\widgets\earnings_graph.dart:124:12 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_history_item.dart:37:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\payment_stats_card.dart:26:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\payments\lib\src\presentation\widgets\pending_pay_card.dart:27:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:34:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\data\repositories\profile_repository_impl.dart:39:5 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\get_profile_usecase.dart:18:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\domain\usecases\sign_out_usecase.dart:19:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:16:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_cubit.dart:30:9 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:36:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\blocs\profile_state.dart:56:30 - always_specify_types -warning - Duplicate import - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:17:8 - duplicate_import -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:20 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:64:29 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:69:28 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:86:11 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:94:25 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:108:33 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:125:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:146:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:150:41 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:164:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:188:37 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\pages\staff_profile_page.dart:195:45 - always_specify_types -warning - Unused import: 'package:flutter_bloc/flutter_bloc.dart' - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:4:8 - unused_import - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:18:16 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:19:19 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:21:23 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:21:50 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:26:19 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:32:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:38:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:44:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:74:18 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:88:21 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\language_selector_bottom_sheet.dart:96:15 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:16:5 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:31:22 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:34:25 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\logout_button.dart:36:17 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:23:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:33:5 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:37:16 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:43:19 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:45:23 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:46:19 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:52:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:56:25 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:68:57 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:74:13 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:78:25 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:82:28 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:88:31 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:90:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:94:32 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:96:52 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:106:59 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:124:43 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:126:53 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:149:32 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:151:52 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:164:13 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:171:13 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:173:24 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_header.dart:178:40 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:17 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:22:26 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:23:9 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:24:9 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:25:9 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_grid.dart:32:35 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:13:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:31:18 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:35:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:40:29 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:45:49 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:51:21 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:53:32 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\profile_menu_item.dart:79:46 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:18:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:19:5 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:22:16 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:24:33 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:29:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:32:23 - always_specify_types - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:47:11 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_score_bar.dart:58:22 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:15:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:27:16 - prefer_const_constructors -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:32:20 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:34:40 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:42:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:86:19 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:91:39 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\reliability_stats_card.dart:97:11 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:10:9 - sort_constructors_first - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:16:16 - prefer_const_constructors - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile\lib\src\presentation\widgets\section_title.dart:17:15 - prefer_const_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\data\repositories_impl\certificates_repository_impl.dart:23:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\domain\usecases\get_certificates_usecase.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_cubit.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:30:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\blocs\certificates\certificates_state.dart:34:15 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\add_certificate_card.dart:8:9 - sort_constructors_first - info - The imported package 'intl' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:14:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:48:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:62:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:99:46 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_card.dart:416:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificate_upload_modal.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:10:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:42:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:73:55 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\certificates\lib\src\presentation\widgets\certificates_header.dart:103:45 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\certificates\lib\staff_certificates.dart:1:9 - unnecessary_library_name - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:14:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:29:12 - always_specify_types -warning - Dead code - packages\features\staff\profile_sections\compliance\documents\lib\src\data\repositories_impl\documents_repository_impl.dart:52:5 - dead_code - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\domain\usecases\get_documents_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_cubit.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\blocs\documents\documents_state.dart:11:9 - sort_constructors_first -warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:11:8 - unused_import - info - Constructors for public widgets should have a named 'key' parameter - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\pages\documents_page.dart:15:7 - use_key_in_widget_constructors - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:12:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:35:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:117:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:122:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:127:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:132:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\document_card.dart:137:33 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\documents\lib\src\presentation\widgets\documents_progress_card.dart:17:9 - sort_constructors_first - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\documents\lib\staff_documents.dart:1:9 - unnecessary_library_name -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:9:43 - always_specify_types - info - The type of the right operand ('TaxFormType') isn't a subtype or a supertype of the left operand ('EnumValue') - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\mappers\tax_form_mapper.dart:47:23 - unrelated_type_equality_checks - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:194:41 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:195:47 - curly_braces_in_flow_control_structures - info - Statements in an if should be enclosed in a block - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\data\repositories\tax_forms_repository_impl.dart:196:44 - curly_braces_in_flow_control_structures - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\get_tax_forms_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_i9_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\save_w4_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_i9_form_usecase.dart:7:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\domain\usecases\submit_w4_form_usecase.dart:7:3 - sort_constructors_first - info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:4:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:13:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_cubit.dart:102:47 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:38:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\i9\form_i9_state.dart:117:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_cubit.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\tax_forms\tax_forms_state.dart:11:9 - sort_constructors_first - info - The imported package 'uuid' isn't a dependency of the importing package - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:4:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:13:3 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_cubit.dart:95:47 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:32:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\blocs\w4\form_w4_state.dart:92:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:12:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:212:81 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:232:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:249:77 - deprecated_member_use - info - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_i9_page.dart:465:21 - deprecated_member_use - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:12:9 - sort_constructors_first -warning - The value of the field '_usStates' isn't used - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:27:22 - unused_field - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:258:81 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:278:50 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:295:77 - deprecated_member_use - info - Use 'const' with the constructor to improve performance - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\form_w4_page.dart:446:18 - prefer_const_constructors - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:40:47 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:148:11 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:150:53 - unawaited_futures -warning - Missing type annotation - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:153:11 - always_specify_types - info - Missing an 'await' for the 'Future' computed by this expression - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:155:53 - unawaited_futures - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\compliance\tax_forms\lib\src\presentation\pages\tax_forms_page.dart:174:41 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\compliance\tax_forms\lib\staff_tax_forms.dart:1:9 - unnecessary_library_name - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:9:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\arguments\add_bank_account_params.dart:12:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\add_bank_account_usecase.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\domain\usecases\get_bank_accounts_usecase.dart:9:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_cubit.dart:14:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:12:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:14:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\blocs\bank_account_state.dart:34:30 - always_specify_types -warning - Unused import: 'package:krow_core/core.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:11:8 - unused_import - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:146:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:202:39 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\pages\bank_account_page.dart:242:37 - deprecated_member_use -warning - Unused import: 'package:flutter_modular/flutter_modular.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:2:8 - unused_import -warning - Unused import: '../blocs/bank_account_cubit.dart' - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:4:8 - unused_import - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:11:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\staff_bank_account\lib\src\presentation\widgets\add_account_form.dart:125:34 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\finances\staff_bank_account\lib\staff_bank_account.dart:1:9 - unnecessary_library_name - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:1:8 - depend_on_referenced_packages - info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:2:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\data\repositories_impl\time_card_repository_impl.dart:17:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:8:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\arguments\get_time_cards_arguments.dart:11:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\domain\usecases\get_time_cards_usecase.dart:10:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:16:3 - sort_constructors_first - info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_bloc.dart:28:13 - implicit_call_tearoffs -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:6:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:14:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:19:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_event.dart:22:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:6:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:17:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:25:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:29:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\blocs\time_card_state.dart:31:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:30:12 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:21 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:53:30 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\pages\time_card_page.dart:65:29 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\month_selector.dart:29:19 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:17:17 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:30:27 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\shift_history_list.dart:42:30 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:10:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:19:17 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:45:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:62:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\time_card_summary.dart:64:23 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:11:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:15:5 - always_specify_types - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:22:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:27:41 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:32:37 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:37:41 - deprecated_member_use -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:43:5 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:54:19 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:58:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:61:27 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:98:23 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:116:25 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:139:7 - always_specify_types -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:141:9 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:155:9 - sort_constructors_first -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\presentation\widgets\timesheet_card.dart:161:17 - always_specify_types - info - Library names are not necessary - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:1:9 - unnecessary_library_name - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:3:8 - depend_on_referenced_packages -warning - Missing type annotation - packages\features\staff\profile_sections\finances\time_card\lib\src\staff_time_card_module.dart:45:15 - always_specify_types - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\data\repositories_impl\attire_repository_impl.dart:15:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\save_attire_arguments.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\arguments\upload_attire_photo_arguments.dart:12:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\get_attire_options_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\save_attire_usecase.dart:11:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\domain\usecases\upload_attire_photo_usecase.dart:10:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_cubit.dart:18:3 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\blocs\attire_state.dart:15:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attestation_checkbox.dart:9:9 - sort_constructors_first - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_bottom_bar.dart:12:9 - sort_constructors_first - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:3:8 - depend_on_referenced_packages - info - Constructor declarations should be before non-constructor declarations - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:15:9 - sort_constructors_first - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:56:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_grid.dart:156:46 - deprecated_member_use - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:3:8 - depend_on_referenced_packages - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\attire\lib\src\presentation\widgets\attire_info_card.dart:14:33 - deprecated_member_use - info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\attire\lib\staff_attire.dart:1:9 - unnecessary_library_name - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\emergency_contact\lib\src\presentation\widgets\emergency_contact_info_banner.dart:12:32 - deprecated_member_use - info - Constructors in '@immutable' classes should be declared as 'const' - packages\features\staff\profile_sections\onboarding\experience\lib\src\domain\arguments\save_experience_arguments.dart:7:3 - prefer_const_constructors_in_immutables - info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:127:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\blocs\experience_bloc.dart:192:13 - implicit_call_tearoffs -warning - The declaration '_buildCustomSkillsList' isn't referenced - packages\features\staff\profile_sections\onboarding\experience\lib\src\presentation\pages\experience_page.dart:140:10 - unused_element - info - Library names are not necessary - packages\features\staff\profile_sections\onboarding\experience\lib\staff_profile_experience.dart:1:9 - unnecessary_library_name - info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:45:13 - implicit_call_tearoffs -warning - Missing type annotation - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:82:48 - always_specify_types - info - Implicit tear-off of the 'call' method - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\blocs\personal_info_bloc.dart:96:13 - implicit_call_tearoffs - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:44:43 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\profile_sections\onboarding\profile_info\lib\src\presentation\widgets\profile_photo_widget.dart:74:53 - deprecated_member_use - info - The imported package 'firebase_auth' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:4:8 - depend_on_referenced_packages - info - The imported package 'firebase_data_connect' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\data\repositories_impl\shifts_repository_impl.dart:5:8 - depend_on_referenced_packages - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:1:8 - depend_on_referenced_packages - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:32:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:52:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shift_details\shift_details_bloc.dart:72:13 - implicit_call_tearoffs - info - The imported package 'bloc' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:1:8 - depend_on_referenced_packages - info - The imported package 'meta' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:5:8 - depend_on_referenced_packages - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:50:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:86:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:115:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:163:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:203:13 - implicit_call_tearoffs - info - Implicit tear-off of the 'call' method - packages\features\staff\shifts\lib\src\presentation\blocs\shifts\shifts_bloc.dart:249:15 - implicit_call_tearoffs - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:32:5 - avoid_print - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:40:7 - avoid_print - info - Don't invoke 'print' in production code - packages\features\staff\shifts\lib\src\presentation\pages\shifts_page.dart:44:7 - avoid_print - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:128:35 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:183:57 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:208:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:209:48 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\my_shift_card.dart:216:53 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:74:33 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:100:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:101:46 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\shift_assignment_card.dart:108:51 - deprecated_member_use - info - The imported package 'lucide_icons' isn't a dependency of the importing package - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:4:8 - depend_on_referenced_packages - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:316:54 - deprecated_member_use - info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - packages\features\staff\shifts\lib\src\presentation\widgets\tabs\my_shifts_tab.dart:507:47 - deprecated_member_use - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\presentation\blocs\staff_main_cubit.dart:2:8 - depend_on_referenced_packages - info - The imported package 'krow_core' isn't a dependency of the importing package - packages\features\staff\staff_main\lib\src\staff_main_module.dart:3:8 - depend_on_referenced_packages - From a34cc5b462bde8eb8f68e94cd7a4b7759b62af2b Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 12:15:51 -0500 Subject: [PATCH 2/9] feat: Implement staff authentication as a Flutter Modular feature module, centralizing dependency injection and routing while refactoring imports for better modularity. --- .../staff/authentication/feature_manifest.md | 33 ----- .../pages/phone_verification_page.dart | 38 +++--- .../pages/profile_setup_page.dart | 36 +++--- .../widgets/common/auth_trouble_link.dart | 2 +- .../get_started_background.dart | 113 +++++++++--------- .../get_started_page/get_started_header.dart | 10 +- .../otp_verification/otp_resend_section.dart | 2 +- .../otp_verification_actions.dart | 3 +- .../otp_verification_header.dart | 2 +- .../phone_input/phone_input_actions.dart | 2 +- .../phone_input/phone_input_form_field.dart | 2 +- .../phone_input/phone_input_header.dart | 2 +- .../profile_setup_basic_info.dart | 2 +- .../profile_setup_experience.dart | 2 +- .../profile_setup_header.dart | 2 +- .../profile_setup_location.dart | 54 +++++---- .../lib/src/staff_authentication_module.dart | 83 +++++++++++++ .../lib/staff_authentication.dart | 88 +------------- .../staff/authentication/pubspec.yaml | 3 +- 19 files changed, 225 insertions(+), 254 deletions(-) delete mode 100644 apps/mobile/packages/features/staff/authentication/feature_manifest.md create mode 100644 apps/mobile/packages/features/staff/authentication/lib/src/staff_authentication_module.dart diff --git a/apps/mobile/packages/features/staff/authentication/feature_manifest.md b/apps/mobile/packages/features/staff/authentication/feature_manifest.md deleted file mode 100644 index cd530b30..00000000 --- a/apps/mobile/packages/features/staff/authentication/feature_manifest.md +++ /dev/null @@ -1,33 +0,0 @@ -# Feature Manifest: Staff Authentication - -## Overview -**Feature Name:** Staff Authentication & Onboarding -**Package Path:** `packages/features/staff/authentication` - -## Responsibilities -* Handle user sign-up and log-in via Phone Auth. -* Verify OTP codes. -* Manage the Onboarding Wizard for new staff. -* Persist onboarding progress. - -## Architecture -* **Domain**: - * `AuthRepositoryInterface` - * `SignInWithPhoneUseCase` - * `VerifyOtpUseCase` -* **Data**: - * `AuthRepositoryImpl` (uses `AuthRepositoryMock` from `krow_data_connect`) -* **Presentation**: - * `AuthBloc`: Manages auth state (phone, otp, user status). - * `OnboardingBloc`: Manages wizard steps. - * Pages: `GetStartedPage`, `PhoneVerificationPage`, `ProfileSetupPage`. - -## Dependencies -* `krow_domain`: User entities. -* `krow_data_connect`: Auth mocks. -* `design_system`: UI components. - -## Routes -* `/`: Get Started (Welcome) -* `/phone-verification`: OTP Entry -* `/profile-setup`: Onboarding Wizard diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/phone_verification_page.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/phone_verification_page.dart index 830ded01..8d8a9db1 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/phone_verification_page.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/phone_verification_page.dart @@ -1,3 +1,4 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -49,9 +50,7 @@ class _PhoneVerificationPageState extends State { }) { final String normalized = phoneNumber.replaceAll(RegExp(r'\\D'), ''); if (normalized.length == 10) { - BlocProvider.of( - context, - ).add( + BlocProvider.of(context).add( AuthSignInRequested(phoneNumber: '+1$normalized', mode: widget.mode), ); } else { @@ -71,9 +70,7 @@ class _PhoneVerificationPageState extends State { required String otp, required String verificationId, }) { - BlocProvider.of( - context, - ).add( + BlocProvider.of(context).add( AuthOtpSubmitted( verificationId: verificationId, smsCode: otp, @@ -84,9 +81,9 @@ class _PhoneVerificationPageState extends State { /// Handles the request to resend the verification code using the phone number in the state. void _onResend({required BuildContext context}) { - BlocProvider.of(context).add( - AuthSignInRequested(mode: widget.mode), - ); + BlocProvider.of( + context, + ).add(AuthSignInRequested(mode: widget.mode)); } @override @@ -107,8 +104,9 @@ class _PhoneVerificationPageState extends State { state.mode == AuthMode.signup) { final String message = state.errorMessage ?? ''; if (message.contains('staff profile')) { - final ScaffoldMessengerState messenger = - ScaffoldMessenger.of(context); + final ScaffoldMessengerState messenger = ScaffoldMessenger.of( + context, + ); messenger.hideCurrentSnackBar(); messenger.showSnackBar( SnackBar( @@ -147,9 +145,9 @@ class _PhoneVerificationPageState extends State { centerTitle: true, showBackButton: true, onLeadingPressed: () { - BlocProvider.of(context).add( - AuthResetRequested(mode: widget.mode), - ); + BlocProvider.of( + context, + ).add(AuthResetRequested(mode: widget.mode)); Navigator.of(context).pop(); }, ), @@ -169,13 +167,13 @@ class _PhoneVerificationPageState extends State { verificationId: state.verificationId ?? '', ), ) - : PhoneInput( - state: state, - onSendCode: (String phoneNumber) => _onSendCode( - context: context, - phoneNumber: phoneNumber, + : PhoneInput( + state: state, + onSendCode: (String phoneNumber) => _onSendCode( + context: context, + phoneNumber: phoneNumber, + ), ), - ), ), ), ); diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/profile_setup_page.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/profile_setup_page.dart index 2f6a178c..8b0720cc 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/profile_setup_page.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/profile_setup_page.dart @@ -1,15 +1,16 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart' hide ModularWatchExtension; +import 'package:krow_core/core.dart'; + import '../blocs/profile_setup/profile_setup_bloc.dart'; import '../widgets/profile_setup_page/profile_setup_basic_info.dart'; -import '../widgets/profile_setup_page/profile_setup_location.dart'; import '../widgets/profile_setup_page/profile_setup_experience.dart'; import '../widgets/profile_setup_page/profile_setup_header.dart'; -import 'package:staff_authentication/staff_authentication.dart'; -import 'package:krow_core/core.dart'; +import '../widgets/profile_setup_page/profile_setup_location.dart'; /// Page for setting up the user profile after authentication. class ProfileSetupPage extends StatefulWidget { @@ -106,7 +107,8 @@ class _ProfileSetupPageState extends State { } }, builder: (BuildContext context, ProfileSetupState state) { - final bool isCreatingProfile = state.status == ProfileSetupStatus.loading; + final bool isCreatingProfile = + state.status == ProfileSetupStatus.loading; return Scaffold( body: SafeArea( @@ -125,7 +127,10 @@ class _ProfileSetupPageState extends State { // Step Indicators UiStepIndicator( stepIcons: steps - .map((Map step) => step['icon'] as IconData) + .map( + (Map step) => + step['icon'] as IconData, + ) .toList(), currentStep: _currentStep, ), @@ -211,9 +216,10 @@ class _ProfileSetupPageState extends State { return ProfileSetupLocation( preferredLocations: state.preferredLocations, maxDistanceMiles: state.maxDistanceMiles, - onLocationsChanged: (List val) => BlocProvider.of( - context, - ).add(ProfileSetupLocationsChanged(val)), + onLocationsChanged: (List val) => + BlocProvider.of( + context, + ).add(ProfileSetupLocationsChanged(val)), onDistanceChanged: (double val) => BlocProvider.of( context, ).add(ProfileSetupDistanceChanged(val)), @@ -222,12 +228,14 @@ class _ProfileSetupPageState extends State { return ProfileSetupExperience( skills: state.skills, industries: state.industries, - onSkillsChanged: (List val) => BlocProvider.of( - context, - ).add(ProfileSetupSkillsChanged(val)), - onIndustriesChanged: (List val) => BlocProvider.of( - context, - ).add(ProfileSetupIndustriesChanged(val)), + onSkillsChanged: (List val) => + BlocProvider.of( + context, + ).add(ProfileSetupSkillsChanged(val)), + onIndustriesChanged: (List val) => + BlocProvider.of( + context, + ).add(ProfileSetupIndustriesChanged(val)), ); default: return const SizedBox.shrink(); diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/common/auth_trouble_link.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/common/auth_trouble_link.dart index 95b6dff8..13f07feb 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/common/auth_trouble_link.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/common/auth_trouble_link.dart @@ -1,6 +1,6 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A common widget that displays a "Having trouble? Contact Support" link. class AuthTroubleLink extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart index a3c0bafa..7c370683 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart @@ -1,76 +1,71 @@ -import 'package:flutter/material.dart'; import 'package:design_system/design_system.dart'; +import 'package:flutter/material.dart'; class GetStartedBackground extends StatelessWidget { const GetStartedBackground({super.key}); @override Widget build(BuildContext context) { - return Container( - child: Column( - children: [ - const SizedBox(height: 32), - // Logo - Image.asset( - UiImageAssets.logoBlue, - height: 40, - ), - Expanded( - child: Center( - child: Container( - width: 288, - height: 288, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: const Color(0xFF3A4A5A).withOpacity(0.05), - ), - padding: const EdgeInsets.all(8.0), - child: ClipOval( - child: Image.network( - 'https://images.unsplash.com/photo-1577219491135-ce391730fb2c?w=400&h=400&fit=crop&crop=faces', - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Image.asset(UiImageAssets.logoBlue); - }, - ), + return Column( + children: [ + const SizedBox(height: 32), + // Logo + Image.asset(UiImageAssets.logoBlue, height: 40), + Expanded( + child: Center( + child: Container( + width: 288, + height: 288, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF3A4A5A).withOpacity(0.05), + ), + padding: const EdgeInsets.all(8.0), + child: ClipOval( + child: Image.network( + 'https://images.unsplash.com/photo-1577219491135-ce391730fb2c?w=400&h=400&fit=crop&crop=faces', + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Image.asset(UiImageAssets.logoBlue); + }, ), ), ), ), - // Pagination dots (Visual only) - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 24, - height: 8, - decoration: BoxDecoration( - color: UiColors.primary, - borderRadius: BorderRadius.circular(4), - ), + ), + // Pagination dots (Visual only) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 24, + height: 8, + decoration: BoxDecoration( + color: UiColors.primary, + borderRadius: BorderRadius.circular(4), ), - const SizedBox(width: 8), - Container( - width: 8, - height: 8, - decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.2), - borderRadius: BorderRadius.circular(4), - ), + ), + const SizedBox(width: 8), + Container( + width: 8, + height: 8, + decoration: BoxDecoration( + color: UiColors.primary.withOpacity(0.2), + borderRadius: BorderRadius.circular(4), ), - const SizedBox(width: 8), - Container( - width: 8, - height: 8, - decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.2), - borderRadius: BorderRadius.circular(4), - ), + ), + const SizedBox(width: 8), + Container( + width: 8, + height: 8, + decoration: BoxDecoration( + color: UiColors.primary.withOpacity(0.2), + borderRadius: BorderRadius.circular(4), ), - ], - ), - ], - ), + ), + ], + ), + ], ); } } diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_header.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_header.dart index e2b37211..69a11986 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_header.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_header.dart @@ -1,6 +1,6 @@ -import 'package:flutter/material.dart'; +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; -import 'package:staff_authentication/staff_authentication.dart'; +import 'package:flutter/material.dart'; /// A widget that displays the welcome text and description on the Get Started page. class GetStartedHeader extends StatelessWidget { @@ -20,9 +20,7 @@ class GetStartedHeader extends StatelessWidget { text: TextSpan( style: UiTypography.displayM, children: [ - TextSpan( - text: i18n.title_part1, - ), + TextSpan(text: i18n.title_part1), TextSpan( text: i18n.title_part2, style: UiTypography.displayMb.textLink, @@ -39,4 +37,4 @@ class GetStartedHeader extends StatelessWidget { ], ); } -} \ No newline at end of file +} diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_resend_section.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_resend_section.dart index 12fadb8c..41793f03 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_resend_section.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_resend_section.dart @@ -1,6 +1,6 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget that handles the OTP resend logic and countdown timer. class OtpResendSection extends StatefulWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_actions.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_actions.dart index a307b6df..750a0cff 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_actions.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_actions.dart @@ -1,6 +1,7 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:staff_authentication/staff_authentication.dart'; + import '../../common/auth_trouble_link.dart'; /// A widget that displays the primary action button and trouble link for OTP verification. diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart index ec4ff79c..d3bcfa5e 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart @@ -1,6 +1,6 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget that displays the title and subtitle for the OTP Verification page. class OtpVerificationHeader extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_actions.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_actions.dart index dcbe0d06..b9ced284 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_actions.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_actions.dart @@ -1,7 +1,7 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:staff_authentication/src/presentation/widgets/common/auth_trouble_link.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget that displays the primary action button and trouble link for Phone Input. class PhoneInputActions extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_form_field.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_form_field.dart index dc29e107..9065f986 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_form_field.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_form_field.dart @@ -1,7 +1,7 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget that displays the phone number input field with country code. /// diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_header.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_header.dart index 5b86b6e3..1b607af4 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_header.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/phone_input/phone_input_header.dart @@ -1,6 +1,6 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget that displays the title and subtitle for the Phone Input page. class PhoneInputHeader extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_basic_info.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_basic_info.dart index 4d9ad36c..93adabd5 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_basic_info.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_basic_info.dart @@ -1,7 +1,7 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:staff_authentication/src/presentation/widgets/common/section_title_subtitle.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget for setting up basic profile information (photo, name, bio). class ProfileSetupBasicInfo extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_experience.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_experience.dart index ac4273c1..e834dd1e 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_experience.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_experience.dart @@ -1,8 +1,8 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:krow_domain/krow_domain.dart'; import 'package:staff_authentication/src/presentation/widgets/common/section_title_subtitle.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget for setting up skills and preferred industries. class ProfileSetupExperience extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_header.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_header.dart index 5f727d48..f4168b7d 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_header.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_header.dart @@ -1,6 +1,6 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A header widget for the profile setup page showing back button and step count. class ProfileSetupHeader extends StatelessWidget { diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_location.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_location.dart index 5ee01419..a9458571 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_location.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/profile_setup_page/profile_setup_location.dart @@ -1,10 +1,11 @@ import 'dart:async'; + +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:staff_authentication/src/presentation/blocs/profile_setup/profile_setup_bloc.dart'; import 'package:staff_authentication/src/presentation/widgets/common/section_title_subtitle.dart'; -import 'package:staff_authentication/staff_authentication.dart'; /// A widget for setting up preferred work locations and distance. class ProfileSetupLocation extends StatefulWidget { @@ -47,22 +48,23 @@ class _ProfileSetupLocationState extends State { void _onSearchChanged(String query) { if (_debounce?.isActive ?? false) _debounce!.cancel(); _debounce = Timer(const Duration(milliseconds: 300), () { - context - .read() - .add(ProfileSetupLocationQueryChanged(query)); + context.read().add( + ProfileSetupLocationQueryChanged(query), + ); }); } /// Adds the selected location. void _addLocation(String location) { if (location.isNotEmpty && !widget.preferredLocations.contains(location)) { - final List updatedList = - List.from(widget.preferredLocations)..add(location); + final List updatedList = List.from( + widget.preferredLocations, + )..add(location); widget.onLocationsChanged(updatedList); _locationController.clear(); - context - .read() - .add(const ProfileSetupClearLocationSuggestions()); + context.read().add( + const ProfileSetupClearLocationSuggestions(), + ); } } @@ -79,10 +81,16 @@ class _ProfileSetupLocationState extends State { // Search Input UiTextField( - label: t.staff_authentication.profile_setup_page.location + label: t + .staff_authentication + .profile_setup_page + .location .add_location_label, controller: _locationController, - hintText: t.staff_authentication.profile_setup_page.location + hintText: t + .staff_authentication + .profile_setup_page + .location .add_location_hint, onChanged: _onSearchChanged, ), @@ -99,15 +107,8 @@ class _ProfileSetupLocationState extends State { constraints: const BoxConstraints(maxHeight: 200), margin: const EdgeInsets.only(top: UiConstants.space2), decoration: BoxDecoration( - color: Theme.of(context).cardColor, + color: UiColors.cardViewBackground, borderRadius: UiConstants.radiusMd, - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.1), - blurRadius: 4, - offset: const Offset(0, 2), - ), - ], ), child: ListView.separated( shrinkWrap: true, @@ -167,12 +168,18 @@ class _ProfileSetupLocationState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - t.staff_authentication.profile_setup_page.location + t + .staff_authentication + .profile_setup_page + .location .min_dist_label, style: UiTypography.footnote1r.textSecondary, ), Text( - t.staff_authentication.profile_setup_page.location + t + .staff_authentication + .profile_setup_page + .location .max_dist_label, style: UiTypography.footnote1r.textSecondary, ), @@ -185,8 +192,9 @@ class _ProfileSetupLocationState extends State { /// Removes the specified [location] from the list. void _removeLocation({required String location}) { - final List updatedList = - List.from(widget.preferredLocations)..remove(location); + final List updatedList = List.from( + widget.preferredLocations, + )..remove(location); widget.onLocationsChanged(updatedList); } } diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/staff_authentication_module.dart b/apps/mobile/packages/features/staff/authentication/lib/src/staff_authentication_module.dart new file mode 100644 index 00000000..ef1f34da --- /dev/null +++ b/apps/mobile/packages/features/staff/authentication/lib/src/staff_authentication_module.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; +import 'package:krow_data_connect/krow_data_connect.dart'; +import 'package:firebase_auth/firebase_auth.dart' as firebase; +import 'package:staff_authentication/src/data/repositories_impl/auth_repository_impl.dart'; +import 'package:staff_authentication/src/domain/repositories/auth_repository_interface.dart'; +import 'package:staff_authentication/src/domain/usecases/sign_in_with_phone_usecase.dart'; +import 'package:staff_authentication/src/domain/usecases/verify_otp_usecase.dart'; +import 'package:staff_authentication/src/domain/repositories/profile_setup_repository.dart'; +import 'package:staff_authentication/src/data/repositories_impl/profile_setup_repository_impl.dart'; +import 'package:staff_authentication/src/domain/usecases/submit_profile_setup_usecase.dart'; +import 'package:staff_authentication/src/domain/repositories/place_repository.dart'; +import 'package:staff_authentication/src/data/repositories_impl/place_repository_impl.dart'; +import 'package:staff_authentication/src/domain/usecases/search_cities_usecase.dart'; +import 'package:staff_authentication/src/presentation/blocs/auth_bloc.dart'; +import 'package:staff_authentication/src/presentation/blocs/profile_setup/profile_setup_bloc.dart'; +import 'package:staff_authentication/src/presentation/pages/get_started_page.dart'; +import 'package:staff_authentication/src/presentation/pages/phone_verification_page.dart'; +import 'package:staff_authentication/src/presentation/pages/profile_setup_page.dart'; +import 'package:staff_authentication/src/domain/ui_entities/auth_mode.dart'; + +/// A [Module] for the staff authentication feature. +class StaffAuthenticationModule extends Module { + @override + List get imports => [DataConnectModule()]; + + @override + void binds(Injector i) { + // Repositories + i.addLazySingleton( + () => AuthRepositoryImpl( + firebaseAuth: firebase.FirebaseAuth.instance, + dataConnect: ExampleConnector.instance, + ), + ); + i.addLazySingleton( + () => ProfileSetupRepositoryImpl( + firebaseAuth: firebase.FirebaseAuth.instance, + dataConnect: ExampleConnector.instance, + ), + ); + i.addLazySingleton(PlaceRepositoryImpl.new); + + // UseCases + i.addLazySingleton(SignInWithPhoneUseCase.new); + i.addLazySingleton(VerifyOtpUseCase.new); + i.addLazySingleton(SubmitProfileSetup.new); + i.addLazySingleton(SearchCitiesUseCase.new); + + // BLoCs + i.addLazySingleton( + () => AuthBloc( + signInUseCase: i.get(), + verifyOtpUseCase: i.get(), + ), + ); + i.add( + () => ProfileSetupBloc( + submitProfileSetup: i.get(), + searchCities: i.get(), + ), + ); + } + + @override + void routes(RouteManager r) { + r.child(StaffPaths.root, child: (_) => const GetStartedPage()); + r.child( + StaffPaths.phoneVerification, + child: (BuildContext context) { + final Map? data = r.args.data; + final String? modeName = data?['mode']; + final AuthMode mode = AuthMode.values.firstWhere( + (AuthMode e) => e.name == modeName, + orElse: () => AuthMode.login, + ); + return PhoneVerificationPage(mode: mode); + }, + ); + r.child(StaffPaths.profileSetup, child: (_) => const ProfileSetupPage()); + } +} diff --git a/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart b/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart index f6265aff..6b4d54cc 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/staff_authentication.dart @@ -1,91 +1,5 @@ -library staff_authentication; - -import 'package:flutter/material.dart'; -import 'package:flutter_modular/flutter_modular.dart'; -import 'package:krow_core/core.dart'; -import 'package:krow_data_connect/krow_data_connect.dart'; -import 'package:firebase_auth/firebase_auth.dart' as firebase; -import 'package:staff_authentication/src/data/repositories_impl/auth_repository_impl.dart'; -import 'package:staff_authentication/src/domain/repositories/auth_repository_interface.dart'; -import 'package:staff_authentication/src/domain/usecases/sign_in_with_phone_usecase.dart'; -import 'package:staff_authentication/src/domain/usecases/verify_otp_usecase.dart'; -import 'package:staff_authentication/src/domain/repositories/profile_setup_repository.dart'; -import 'package:staff_authentication/src/data/repositories_impl/profile_setup_repository_impl.dart'; -import 'package:staff_authentication/src/domain/usecases/submit_profile_setup_usecase.dart'; -import 'package:staff_authentication/src/domain/repositories/place_repository.dart'; -import 'package:staff_authentication/src/data/repositories_impl/place_repository_impl.dart'; -import 'package:staff_authentication/src/domain/usecases/search_cities_usecase.dart'; -import 'package:staff_authentication/src/presentation/blocs/auth_bloc.dart'; -import 'package:staff_authentication/src/presentation/blocs/profile_setup/profile_setup_bloc.dart'; -import 'package:staff_authentication/src/presentation/pages/get_started_page.dart'; -import 'package:staff_authentication/src/presentation/pages/phone_verification_page.dart'; -import 'package:staff_authentication/src/presentation/pages/profile_setup_page.dart'; -import 'package:staff_authentication/src/domain/ui_entities/auth_mode.dart'; - export 'src/domain/ui_entities/auth_mode.dart'; export 'src/presentation/pages/get_started_page.dart'; export 'src/presentation/pages/phone_verification_page.dart'; export 'src/presentation/pages/profile_setup_page.dart'; -export 'package:core_localization/core_localization.dart'; - -/// A [Module] for the staff authentication feature. -class StaffAuthenticationModule extends Module { - @override - List get imports => [DataConnectModule()]; - - @override - void binds(Injector i) { - // Repositories - i.addLazySingleton( - () => AuthRepositoryImpl( - firebaseAuth: firebase.FirebaseAuth.instance, - dataConnect: ExampleConnector.instance, - ), - ); - i.addLazySingleton( - () => ProfileSetupRepositoryImpl( - firebaseAuth: firebase.FirebaseAuth.instance, - dataConnect: ExampleConnector.instance, - ), - ); - i.addLazySingleton(PlaceRepositoryImpl.new); - - // UseCases - i.addLazySingleton(SignInWithPhoneUseCase.new); - i.addLazySingleton(VerifyOtpUseCase.new); - i.addLazySingleton(SubmitProfileSetup.new); - i.addLazySingleton(SearchCitiesUseCase.new); - - // BLoCs - i.addLazySingleton( - () => AuthBloc( - signInUseCase: i.get(), - verifyOtpUseCase: i.get(), - ), - ); - i.add( - () => ProfileSetupBloc( - submitProfileSetup: i.get(), - searchCities: i.get(), - ), - ); - } - - @override - void routes(RouteManager r) { - r.child(StaffPaths.root, child: (_) => const GetStartedPage()); - r.child( - StaffPaths.phoneVerification, - child: (BuildContext context) { - final Map? data = r.args.data; - final String? modeName = data?['mode']; - final AuthMode mode = AuthMode.values.firstWhere( - (AuthMode e) => e.name == modeName, - orElse: () => AuthMode.login, - ); - return PhoneVerificationPage(mode: mode); - }, - ); - r.child(StaffPaths.profileSetup, child: (_) => const ProfileSetupPage()); - } -} +export 'src/staff_authentication_module.dart'; diff --git a/apps/mobile/packages/features/staff/authentication/pubspec.yaml b/apps/mobile/packages/features/staff/authentication/pubspec.yaml index 6a955e2e..966934ef 100644 --- a/apps/mobile/packages/features/staff/authentication/pubspec.yaml +++ b/apps/mobile/packages/features/staff/authentication/pubspec.yaml @@ -14,9 +14,8 @@ dependencies: flutter_bloc: ^8.1.0 flutter_modular: ^6.3.0 equatable: ^2.0.5 - lucide_icons: ^0.257.0 firebase_core: ^4.2.1 - firebase_auth: ^6.1.2 # Updated for compatibility + firebase_auth: ^6.1.2 firebase_data_connect: ^0.2.2+1 http: ^1.2.0 From 4f94bf6835eceed4e076dfd3341f3d5c5ad85b98 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 15:34:52 -0500 Subject: [PATCH 3/9] feat: Refactor mobile UI components to adhere to design system tokens and improve loading and snackbar functionalities --- apps/mobile/NEXT_SPRINT_TASKS.md | 9 +- .../design_system/lib/design_system.dart | 2 + .../design_system/lib/src/ui_colors.dart | 2 +- .../design_system/lib/src/ui_icons.dart | 9 + .../lib/src/widgets/ui_loading_page.dart | 33 +++ .../lib/src/widgets/ui_snackbar.dart | 99 ++++++++ .../presentation/pages/availability_page.dart | 221 ++++++++---------- .../features/staff/availability/pubspec.yaml | 16 +- 8 files changed, 259 insertions(+), 132 deletions(-) create mode 100644 apps/mobile/packages/design_system/lib/src/widgets/ui_loading_page.dart create mode 100644 apps/mobile/packages/design_system/lib/src/widgets/ui_snackbar.dart diff --git a/apps/mobile/NEXT_SPRINT_TASKS.md b/apps/mobile/NEXT_SPRINT_TASKS.md index 8f88959e..790e32cf 100644 --- a/apps/mobile/NEXT_SPRINT_TASKS.md +++ b/apps/mobile/NEXT_SPRINT_TASKS.md @@ -28,10 +28,13 @@ - track minimum shift hours in the staff profile and show a warning if they try to apply for shifts that are below their minimum hours. - this need to be added in the BE and also a FE validation (5 hrs). + - Cannot cancel before 24 hours of the shift start time. If do we should charge for 4 hours of work for each shifts. + - verify the order creation process in the client app. - Vendor don't need to verify the order, when the order is created it should be automatically published. - rethink the order status, we need to simplify it. + - Validation layer - Profile info - emergency contact @@ -43,4 +46,8 @@ - there should be manual verification by the client even if the ai verification is passed. - to track false positives and false negatives. - documents - - tax forms \ No newline at end of file + - tax forms + +- How do we handle the current bank account verifcaiton in the current legacy application. +- We need have a show a list of clothing items in the staff app -> shift page. +- Template models for the pdf reports in the client and web apps. \ No newline at end of file diff --git a/apps/mobile/packages/design_system/lib/design_system.dart b/apps/mobile/packages/design_system/lib/design_system.dart index a20a8d7c..b447dd7b 100644 --- a/apps/mobile/packages/design_system/lib/design_system.dart +++ b/apps/mobile/packages/design_system/lib/design_system.dart @@ -12,3 +12,5 @@ export 'src/widgets/ui_button.dart'; export 'src/widgets/ui_chip.dart'; export 'src/widgets/ui_error_snackbar.dart'; export 'src/widgets/ui_success_snackbar.dart'; +export 'src/widgets/ui_loading_page.dart'; +export 'src/widgets/ui_snackbar.dart'; diff --git a/apps/mobile/packages/design_system/lib/src/ui_colors.dart b/apps/mobile/packages/design_system/lib/src/ui_colors.dart index 2462d0f3..30a56dc3 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_colors.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_colors.dart @@ -120,7 +120,7 @@ class UiColors { static const Color textDescription = mutedForeground; /// Success text (#10B981) - static const Color textSuccess = Color(0xFF10B981); + static const Color textSuccess = Color(0xFF0A8159); /// Error text (#F04444) static const Color textError = destructive; diff --git a/apps/mobile/packages/design_system/lib/src/ui_icons.dart b/apps/mobile/packages/design_system/lib/src/ui_icons.dart index d5c9b139..aa4c2e74 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_icons.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_icons.dart @@ -225,4 +225,13 @@ class UiIcons { /// Globe icon static const IconData globe = _IconLib.globe; + + /// Sunrise icon + static const IconData sunrise = _IconLib.sunrise; + + /// Sun icon + static const IconData sun = _IconLib.sun; + + /// Moon icon + static const IconData moon = _IconLib.moon; } diff --git a/apps/mobile/packages/design_system/lib/src/widgets/ui_loading_page.dart b/apps/mobile/packages/design_system/lib/src/widgets/ui_loading_page.dart new file mode 100644 index 00000000..9d59ebbe --- /dev/null +++ b/apps/mobile/packages/design_system/lib/src/widgets/ui_loading_page.dart @@ -0,0 +1,33 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +import '../ui_colors.dart'; + +/// A common loading page that adheres to the design system. +/// It features a blurred background using [UiColors.popupShadow] and a [CircularProgressIndicator]. +class UiLoadingPage extends StatelessWidget { + /// Creates a [UiLoadingPage]. + const UiLoadingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: UiColors.transparent, + body: Stack( + fit: StackFit.expand, + children: [ + // Background blur and color + Positioned.fill( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: Container(color: UiColors.popupShadow), + ), + ), + // Center loading indicator + const Center(child: CircularProgressIndicator()), + ], + ), + ); + } +} diff --git a/apps/mobile/packages/design_system/lib/src/widgets/ui_snackbar.dart b/apps/mobile/packages/design_system/lib/src/widgets/ui_snackbar.dart new file mode 100644 index 00000000..25ca55d0 --- /dev/null +++ b/apps/mobile/packages/design_system/lib/src/widgets/ui_snackbar.dart @@ -0,0 +1,99 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import '../ui_colors.dart'; +import '../ui_icons.dart'; +import '../ui_typography.dart'; + +/// Types of snackbars available in the design system. +enum UiSnackbarType { + /// Success state - green text and light blurred green background. + success, + + /// Message state - blue text and light blurred blue background. + message, + + /// Warning state - dark yellow text and light blurred yellow background. + warning, + + /// Error state - red text and light blurred red background. + error, +} + +/// A centralized snackbar widget that adheres to the design system with glassmorphism effects. +class UiSnackbar { + UiSnackbar._(); + + /// Shows a snackbar with the specified [message] and [type]. + static void show( + BuildContext context, { + required String message, + required UiSnackbarType type, + Duration duration = const Duration(seconds: 3), + }) { + final Color textColor; + final Color backgroundColor; + final IconData icon; + + switch (type) { + case UiSnackbarType.success: + textColor = UiColors.textSuccess; + backgroundColor = UiColors.tagSuccess.withValues(alpha: 0.7); + icon = UiIcons.success; + break; + case UiSnackbarType.message: + textColor = UiColors.primary; + backgroundColor = UiColors.tagInProgress.withValues(alpha: 0.7); + icon = UiIcons.info; + break; + case UiSnackbarType.warning: + textColor = UiColors.textWarning; + backgroundColor = UiColors.tagPending.withValues(alpha: 0.7); + icon = UiIcons.warning; + break; + case UiSnackbarType.error: + textColor = UiColors.textError; + backgroundColor = UiColors.tagError.withValues(alpha: 0.7); + icon = UiIcons.error; + break; + } + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: duration, + backgroundColor: UiColors.transparent, + elevation: 0, + behavior: SnackBarBehavior.floating, + content: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: textColor.withValues(alpha: 0.2), + width: 1, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 12, + children: [ + Icon(icon, color: textColor, size: 20), + Expanded( + child: Text( + message, + style: UiTypography.body2b.copyWith(color: textColor), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart b/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart index 91fc33ee..8725ceac 100644 --- a/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart +++ b/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart @@ -1,9 +1,9 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_modular/flutter_modular.dart' hide ModularWatchExtension; +import 'package:flutter_modular/flutter_modular.dart' + hide ModularWatchExtension; import 'package:intl/intl.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import '../blocs/availability_bloc.dart'; import '../blocs/availability_event.dart'; @@ -44,7 +44,6 @@ class _AvailabilityPageState extends State { return BlocProvider.value( value: _bloc, child: Scaffold( - backgroundColor: AppColors.krowBackground, appBar: UiAppBar( title: 'My Availability', centerTitle: false, @@ -53,13 +52,18 @@ class _AvailabilityPageState extends State { body: BlocListener( listener: (context, state) { if (state is AvailabilityLoaded && state.successMessage != null) { - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(state.successMessage!), - backgroundColor: Colors.green, - behavior: SnackBarBehavior.floating, - ), + UiSnackbar.show( + context, + message: state.successMessage!, + type: UiSnackbarType.success, + ); + } + + if (state is AvailabilityError) { + UiSnackbar.show( + context, + message: state.message, + type: UiSnackbarType.error, ); } }, @@ -78,16 +82,14 @@ class _AvailabilityPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 20), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, + spacing: 24, children: [ _buildQuickSet(context), - const SizedBox(height: 24), _buildWeekNavigation(context, state), - const SizedBox(height: 24), _buildSelectedDayAvailability( context, state.selectedDayAvailability, ), - const SizedBox(height: 24), _buildInfoCard(), ], ), @@ -96,12 +98,7 @@ class _AvailabilityPageState extends State { ), ), if (state.isActionInProgress) - Container( - color: Colors.black.withOpacity(0.3), - child: const Center( - child: CircularProgressIndicator(), - ), - ), + const UiLoadingPage(), // Show loading overlay during actions ], ); } else if (state is AvailabilityError) { @@ -119,45 +116,27 @@ class _AvailabilityPageState extends State { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: AppColors.krowBlue.withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( 'Quick Set Availability', - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: Color(0xFF333F48), - ), + style: UiTypography.body4r.copyWith(color: UiColors.textFilter), ), const SizedBox(height: 12), Row( children: [ + Expanded(child: _buildQuickSetButton(context, 'All Week', 'all')), + const SizedBox(width: 8), Expanded( - child: _buildQuickSetButton( - context, - 'All Week', - 'all', - ), + child: _buildQuickSetButton(context, 'Weekdays', 'weekdays'), ), const SizedBox(width: 8), Expanded( - child: _buildQuickSetButton( - context, - 'Weekdays', - 'weekdays', - ), - ), - const SizedBox(width: 8), - Expanded( - child: _buildQuickSetButton( - context, - 'Weekends', - 'weekends', - ), + child: _buildQuickSetButton(context, 'Weekends', 'weekends'), ), const SizedBox(width: 8), Expanded( @@ -184,23 +163,24 @@ class _AvailabilityPageState extends State { return SizedBox( height: 32, child: OutlinedButton( - onPressed: () => context.read().add(PerformQuickSet(type)), + onPressed: () => + context.read().add(PerformQuickSet(type)), style: OutlinedButton.styleFrom( padding: EdgeInsets.zero, side: BorderSide( color: isDestructive - ? Colors.red.withOpacity(0.2) - : AppColors.krowBlue.withOpacity(0.2), + ? UiColors.destructive.withValues(alpha: 0.2) + : UiColors.primary.withValues(alpha: 0.2), ), - backgroundColor: Colors.transparent, + backgroundColor: Colors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), - foregroundColor: isDestructive ? Colors.red : AppColors.krowBlue, + foregroundColor: isDestructive ? UiColors.destructive : UiColors.primary, ), child: Text( label, - style: const TextStyle(fontSize: 10, fontWeight: FontWeight.w500), + style: UiTypography.body4r, maxLines: 1, overflow: TextOverflow.ellipsis, ), @@ -221,7 +201,7 @@ class _AvailabilityPageState extends State { border: Border.all(color: Colors.grey.shade100), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -236,20 +216,24 @@ class _AvailabilityPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ _buildNavButton( - LucideIcons.chevronLeft, - () => context.read().add(const NavigateWeek(-1)), + UiIcons.chevronLeft, + () => context.read().add( + const NavigateWeek(-1), + ), ), Text( monthYear, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, - color: AppColors.krowCharcoal, + color: UiColors.foreground, ), ), _buildNavButton( - LucideIcons.chevronRight, - () => context.read().add(const NavigateWeek(1)), + UiIcons.chevronRight, + () => context.read().add( + const NavigateWeek(1), + ), ), ], ), @@ -257,7 +241,9 @@ class _AvailabilityPageState extends State { // Days Row Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: state.days.map((day) => _buildDayItem(context, day, state.selectedDate)).toList(), + children: state.days + .map((day) => _buildDayItem(context, day, state.selectedDate)) + .toList(), ), ], ), @@ -274,12 +260,16 @@ class _AvailabilityPageState extends State { color: Color(0xFFF1F5F9), // slate-100 shape: BoxShape.circle, ), - child: Icon(icon, size: 20, color: AppColors.krowMuted), + child: Icon(icon, size: 20, color: UiColors.mutedForeground), ), ); } - Widget _buildDayItem(BuildContext context, DayAvailability day, DateTime selectedDate) { + Widget _buildDayItem( + BuildContext context, + DayAvailability day, + DateTime selectedDate, + ) { final isSelected = AvailabilityLoaded.isSameDay(day.date, selectedDate); final isAvailable = day.isAvailable; final isToday = AvailabilityLoaded.isSameDay(day.date, DateTime.now()); @@ -292,22 +282,22 @@ class _AvailabilityPageState extends State { padding: const EdgeInsets.symmetric(vertical: 12), decoration: BoxDecoration( color: isSelected - ? AppColors.krowBlue + ? UiColors.primary : (isAvailable - ? const Color(0xFFECFDF5) - : const Color(0xFFF8FAFC)), // emerald-50 or slate-50 + ? const Color(0xFFECFDF5) + : const Color(0xFFF8FAFC)), // emerald-50 or slate-50 borderRadius: BorderRadius.circular(16), border: Border.all( color: isSelected - ? AppColors.krowBlue + ? UiColors.primary : (isAvailable - ? const Color(0xFFA7F3D0) - : Colors.transparent), // emerald-200 + ? const Color(0xFFA7F3D0) + : Colors.transparent), // emerald-200 ), boxShadow: isSelected ? [ BoxShadow( - color: AppColors.krowBlue.withOpacity(0.3), + color: UiColors.primary.withValues(alpha: 0.3), blurRadius: 8, offset: const Offset(0, 4), ), @@ -326,22 +316,22 @@ class _AvailabilityPageState extends State { fontSize: 18, fontWeight: FontWeight.bold, color: isSelected - ? Colors.white + ? UiColors.white : (isAvailable - ? const Color(0xFF047857) - : AppColors.krowMuted), // emerald-700 + ? const Color(0xFF047857) + : UiColors.mutedForeground), // emerald-700 ), ), const SizedBox(height: 2), Text( - DateFormat('EEE').format(day.date), + DateFormat('EEE').format(day.date), style: TextStyle( fontSize: 10, color: isSelected - ? Colors.white.withOpacity(0.8) + ? UiColors.white.withValues(alpha: 0.8) : (isAvailable - ? const Color(0xFF047857) - : AppColors.krowMuted), + ? const Color(0xFF047857) + : UiColors.mutedForeground), ), ), ], @@ -353,7 +343,7 @@ class _AvailabilityPageState extends State { width: 6, height: 6, decoration: const BoxDecoration( - color: AppColors.krowBlue, + color: UiColors.primary, shape: BoxShape.circle, ), ), @@ -380,7 +370,7 @@ class _AvailabilityPageState extends State { border: Border.all(color: Colors.grey.shade100), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -400,22 +390,23 @@ class _AvailabilityPageState extends State { style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, - color: AppColors.krowCharcoal, + color: UiColors.foreground, ), ), Text( isAvailable ? 'You are available' : 'Not available', style: const TextStyle( fontSize: 14, - color: AppColors.krowMuted, + color: UiColors.mutedForeground, ), ), ], ), Switch( value: isAvailable, - onChanged: (val) => context.read().add(ToggleDayStatus(day)), - activeColor: AppColors.krowBlue, + onChanged: (val) => + context.read().add(ToggleDayStatus(day)), + activeColor: UiColors.primary, ), ], ), @@ -426,37 +417,37 @@ class _AvailabilityPageState extends State { ...day.slots.map((slot) { // Get UI config for this slot ID final uiConfig = _getSlotUiConfig(slot.id); - + return _buildTimeSlotItem(context, day, slot, uiConfig); }).toList(), ], ), ); } - + Map _getSlotUiConfig(String slotId) { switch (slotId) { case 'morning': return { - 'icon': LucideIcons.sunrise, + 'icon': UiIcons.sunrise, 'bg': const Color(0xFFE6EBF9), // bg-[#0032A0]/10 'iconColor': const Color(0xFF0032A0), }; case 'afternoon': return { - 'icon': LucideIcons.sun, + 'icon': UiIcons.sun, 'bg': const Color(0xFFCCD6EC), // bg-[#0032A0]/20 'iconColor': const Color(0xFF0032A0), }; case 'evening': return { - 'icon': LucideIcons.moon, + 'icon': UiIcons.moon, 'bg': const Color(0xFFEBEDEE), // bg-[#333F48]/10 'iconColor': const Color(0xFF333F48), }; default: return { - 'icon': LucideIcons.clock, + 'icon': UiIcons.clock, 'bg': Colors.grey.shade100, 'iconColor': Colors.grey, }; @@ -464,15 +455,15 @@ class _AvailabilityPageState extends State { } Widget _buildTimeSlotItem( - BuildContext context, - DayAvailability day, - AvailabilitySlot slot, - Map uiConfig + BuildContext context, + DayAvailability day, + AvailabilitySlot slot, + Map uiConfig, ) { // Determine styles based on state - final isEnabled = day.isAvailable; + final isEnabled = day.isAvailable; final isActive = slot.isAvailable; - + // Container style Color bgColor; Color borderColor; @@ -481,8 +472,8 @@ class _AvailabilityPageState extends State { bgColor = const Color(0xFFF8FAFC); // slate-50 borderColor = const Color(0xFFF1F5F9); // slate-100 } else if (isActive) { - bgColor = AppColors.krowBlue.withOpacity(0.05); - borderColor = AppColors.krowBlue.withOpacity(0.2); + bgColor = UiColors.primary.withValues(alpha: 0.05); + borderColor = UiColors.primary.withValues(alpha: 0.2); } else { bgColor = const Color(0xFFF8FAFC); // slate-50 borderColor = const Color(0xFFE2E8F0); // slate-200 @@ -490,14 +481,18 @@ class _AvailabilityPageState extends State { // Text colors final titleColor = (isEnabled && isActive) - ? AppColors.krowCharcoal - : AppColors.krowMuted; + ? UiColors.foreground + : UiColors.mutedForeground; final subtitleColor = (isEnabled && isActive) - ? AppColors.krowMuted + ? UiColors.mutedForeground : Colors.grey.shade400; return GestureDetector( - onTap: isEnabled ? () => context.read().add(ToggleSlotStatus(day, slot.id)) : null, + onTap: isEnabled + ? () => context.read().add( + ToggleSlotStatus(day, slot.id), + ) + : null, child: AnimatedContainer( duration: const Duration(milliseconds: 200), margin: const EdgeInsets.only(bottom: 12), @@ -539,10 +534,7 @@ class _AvailabilityPageState extends State { ), Text( slot.timeRange, - style: TextStyle( - fontSize: 12, - color: subtitleColor, - ), + style: TextStyle(fontSize: 12, color: subtitleColor), ), ], ), @@ -553,14 +545,10 @@ class _AvailabilityPageState extends State { width: 24, height: 24, decoration: const BoxDecoration( - color: AppColors.krowBlue, + color: UiColors.primary, shape: BoxShape.circle, ), - child: const Icon( - LucideIcons.check, - size: 16, - color: Colors.white, - ), + child: const Icon(UiIcons.check, size: 16, color: UiColors.white), ) else if (isEnabled && !isActive) Container( @@ -584,13 +572,13 @@ class _AvailabilityPageState extends State { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: AppColors.krowBlue.withOpacity(0.05), + color: UiColors.primary.withValues(alpha: 0.05), borderRadius: BorderRadius.circular(12), ), child: const Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon(LucideIcons.clock, size: 20, color: AppColors.krowBlue), + Icon(UiIcons.clock, size: 20, color: UiColors.primary), SizedBox(width: 12), Expanded( child: Column( @@ -601,13 +589,13 @@ class _AvailabilityPageState extends State { style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, - color: AppColors.krowCharcoal, + color: UiColors.foreground, ), ), SizedBox(height: 2), Text( "When enabled, you'll only be matched with shifts during your available times.", - style: TextStyle(fontSize: 12, color: AppColors.krowMuted), + style: TextStyle(fontSize: 12, color: UiColors.mutedForeground), ), ], ), @@ -618,14 +606,3 @@ class _AvailabilityPageState extends State { } } -class AppColors { - static const Color krowBlue = Color(0xFF0A39DF); - static const Color krowYellow = Color(0xFFFFED4A); - static const Color krowCharcoal = Color(0xFF121826); - static const Color krowMuted = Color(0xFF6A7382); - static const Color krowBorder = Color(0xFFE3E6E9); - static const Color krowBackground = Color(0xFFFAFBFC); - - static const Color white = Colors.white; - static const Color black = Colors.black; -} diff --git a/apps/mobile/packages/features/staff/availability/pubspec.yaml b/apps/mobile/packages/features/staff/availability/pubspec.yaml index fe5ef376..b8353e1a 100644 --- a/apps/mobile/packages/features/staff/availability/pubspec.yaml +++ b/apps/mobile/packages/features/staff/availability/pubspec.yaml @@ -1,22 +1,17 @@ name: staff_availability description: Staff Availability Feature version: 0.0.1 -publish_to: 'none' +publish_to: "none" resolution: workspace environment: - sdk: '>=3.10.0 <4.0.0' + sdk: ">=3.10.0 <4.0.0" flutter: ">=1.17.0" dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 - equatable: ^2.0.5 - intl: ^0.20.0 - lucide_icons: ^0.257.0 - flutter_modular: ^6.3.2 - + # Internal packages core_localization: path: ../../../core_localization @@ -28,6 +23,11 @@ dependencies: path: ../../../data_connect krow_core: path: ../../../core + + flutter_bloc: ^8.1.3 + equatable: ^2.0.5 + intl: ^0.20.0 + flutter_modular: ^6.3.2 firebase_data_connect: ^0.2.2+2 firebase_auth: ^6.1.4 From 8edfc723701eb8757b85da592bff8311307157e3 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 15:51:50 -0500 Subject: [PATCH 4/9] refactor: Update AvailabilityPage and ClockInPage to enhance UI consistency and remove unused code --- .../presentation/pages/availability_page.dart | 156 +++++++----------- .../src/presentation/pages/clock_in_page.dart | 9 - 2 files changed, 60 insertions(+), 105 deletions(-) diff --git a/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart b/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart index 8725ceac..c07e0307 100644 --- a/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart +++ b/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart @@ -4,11 +4,11 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart' hide ModularWatchExtension; import 'package:intl/intl.dart'; +import 'package:krow_domain/krow_domain.dart'; import '../blocs/availability_bloc.dart'; import '../blocs/availability_event.dart'; import '../blocs/availability_state.dart'; -import 'package:krow_domain/krow_domain.dart'; class AvailabilityPage extends StatefulWidget { const AvailabilityPage({super.key}); @@ -102,7 +102,12 @@ class _AvailabilityPageState extends State { ], ); } else if (state is AvailabilityError) { - return Center(child: Text('Error: ${state.message}')); + return Center( + child: Text( + 'Error: ${state.message}', + style: UiTypography.body2r.textError, + ), + ); } return const SizedBox.shrink(); }, @@ -124,7 +129,7 @@ class _AvailabilityPageState extends State { children: [ Text( 'Quick Set Availability', - style: UiTypography.body4r.copyWith(color: UiColors.textFilter), + style: UiTypography.body2b, ), const SizedBox(height: 12), Row( @@ -172,11 +177,13 @@ class _AvailabilityPageState extends State { ? UiColors.destructive.withValues(alpha: 0.2) : UiColors.primary.withValues(alpha: 0.2), ), - backgroundColor: Colors.transparent, + backgroundColor: UiColors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), - foregroundColor: isDestructive ? UiColors.destructive : UiColors.primary, + foregroundColor: isDestructive + ? UiColors.destructive + : UiColors.primary, ), child: Text( label, @@ -196,16 +203,9 @@ class _AvailabilityPageState extends State { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.cardViewBackground, borderRadius: BorderRadius.circular(16), - border: Border.all(color: Colors.grey.shade100), - boxShadow: [ - BoxShadow( - color: UiColors.black.withValues(alpha: 0.05), - blurRadius: 2, - offset: const Offset(0, 1), - ), - ], + border: Border.all(color: UiColors.border), ), child: Column( children: [ @@ -223,11 +223,7 @@ class _AvailabilityPageState extends State { ), Text( monthYear, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: UiColors.foreground, - ), + style: UiTypography.title2b, ), _buildNavButton( UiIcons.chevronRight, @@ -257,10 +253,10 @@ class _AvailabilityPageState extends State { width: 32, height: 32, decoration: const BoxDecoration( - color: Color(0xFFF1F5F9), // slate-100 + color: UiColors.separatorSecondary, shape: BoxShape.circle, ), - child: Icon(icon, size: 20, color: UiColors.mutedForeground), + child: Icon(icon, size: 20, color: UiColors.iconSecondary), ), ); } @@ -283,26 +279,15 @@ class _AvailabilityPageState extends State { decoration: BoxDecoration( color: isSelected ? UiColors.primary - : (isAvailable - ? const Color(0xFFECFDF5) - : const Color(0xFFF8FAFC)), // emerald-50 or slate-50 + : (isAvailable ? UiColors.tagSuccess : UiColors.bgSecondary), borderRadius: BorderRadius.circular(16), border: Border.all( color: isSelected ? UiColors.primary : (isAvailable - ? const Color(0xFFA7F3D0) - : Colors.transparent), // emerald-200 + ? UiColors.success.withValues(alpha: 0.3) + : UiColors.transparent), ), - boxShadow: isSelected - ? [ - BoxShadow( - color: UiColors.primary.withValues(alpha: 0.3), - blurRadius: 8, - offset: const Offset(0, 4), - ), - ] - : null, ), child: Stack( clipBehavior: Clip.none, @@ -312,26 +297,24 @@ class _AvailabilityPageState extends State { children: [ Text( day.date.day.toString().padLeft(2, '0'), - style: TextStyle( - fontSize: 18, + style: UiTypography.title1m.copyWith( fontWeight: FontWeight.bold, color: isSelected ? UiColors.white : (isAvailable - ? const Color(0xFF047857) - : UiColors.mutedForeground), // emerald-700 + ? UiColors.textSuccess + : UiColors.textSecondary), ), ), const SizedBox(height: 2), Text( DateFormat('EEE').format(day.date), - style: TextStyle( - fontSize: 10, + style: UiTypography.footnote2r.copyWith( color: isSelected ? UiColors.white.withValues(alpha: 0.8) : (isAvailable - ? const Color(0xFF047857) - : UiColors.mutedForeground), + ? UiColors.textSuccess + : UiColors.textSecondary), ), ), ], @@ -365,16 +348,9 @@ class _AvailabilityPageState extends State { return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.cardViewBackground, borderRadius: BorderRadius.circular(16), - border: Border.all(color: Colors.grey.shade100), - boxShadow: [ - BoxShadow( - color: UiColors.black.withValues(alpha: 0.05), - blurRadius: 2, - offset: const Offset(0, 1), - ), - ], + border: Border.all(color: UiColors.border), ), child: Column( children: [ @@ -387,18 +363,11 @@ class _AvailabilityPageState extends State { children: [ Text( dateStr, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: UiColors.foreground, - ), + style: UiTypography.title2b, ), Text( isAvailable ? 'You are available' : 'Not available', - style: const TextStyle( - fontSize: 14, - color: UiColors.mutedForeground, - ), + style: UiTypography.body2r.textSecondary, ), ], ), @@ -430,26 +399,26 @@ class _AvailabilityPageState extends State { case 'morning': return { 'icon': UiIcons.sunrise, - 'bg': const Color(0xFFE6EBF9), // bg-[#0032A0]/10 - 'iconColor': const Color(0xFF0032A0), + 'bg': UiColors.primary.withValues(alpha: 0.1), + 'iconColor': UiColors.primary, }; case 'afternoon': return { 'icon': UiIcons.sun, - 'bg': const Color(0xFFCCD6EC), // bg-[#0032A0]/20 - 'iconColor': const Color(0xFF0032A0), + 'bg': UiColors.primary.withValues(alpha: 0.2), + 'iconColor': UiColors.primary, }; case 'evening': return { 'icon': UiIcons.moon, - 'bg': const Color(0xFFEBEDEE), // bg-[#333F48]/10 - 'iconColor': const Color(0xFF333F48), + 'bg': UiColors.bgSecondary, + 'iconColor': UiColors.foreground, }; default: return { 'icon': UiIcons.clock, - 'bg': Colors.grey.shade100, - 'iconColor': Colors.grey, + 'bg': UiColors.bgSecondary, + 'iconColor': UiColors.iconSecondary, }; } } @@ -469,14 +438,14 @@ class _AvailabilityPageState extends State { Color borderColor; if (!isEnabled) { - bgColor = const Color(0xFFF8FAFC); // slate-50 - borderColor = const Color(0xFFF1F5F9); // slate-100 + bgColor = UiColors.bgSecondary; + borderColor = UiColors.borderInactive; } else if (isActive) { bgColor = UiColors.primary.withValues(alpha: 0.05); borderColor = UiColors.primary.withValues(alpha: 0.2); } else { - bgColor = const Color(0xFFF8FAFC); // slate-50 - borderColor = const Color(0xFFE2E8F0); // slate-200 + bgColor = UiColors.bgSecondary; + borderColor = UiColors.borderPrimary; } // Text colors @@ -485,13 +454,13 @@ class _AvailabilityPageState extends State { : UiColors.mutedForeground; final subtitleColor = (isEnabled && isActive) ? UiColors.mutedForeground - : Colors.grey.shade400; + : UiColors.textInactive; return GestureDetector( onTap: isEnabled ? () => context.read().add( - ToggleSlotStatus(day, slot.id), - ) + ToggleSlotStatus(day, slot.id), + ) : null, child: AnimatedContainer( duration: const Duration(milliseconds: 200), @@ -526,15 +495,11 @@ class _AvailabilityPageState extends State { children: [ Text( slot.label, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: titleColor, - ), + style: UiTypography.body2m.copyWith(color: titleColor), ), Text( slot.timeRange, - style: TextStyle(fontSize: 12, color: subtitleColor), + style: UiTypography.body3r.copyWith(color: subtitleColor), ), ], ), @@ -548,7 +513,11 @@ class _AvailabilityPageState extends State { color: UiColors.primary, shape: BoxShape.circle, ), - child: const Icon(UiIcons.check, size: 16, color: UiColors.white), + child: const Icon( + UiIcons.check, + size: 16, + color: UiColors.white, + ), ) else if (isEnabled && !isActive) Container( @@ -557,9 +526,9 @@ class _AvailabilityPageState extends State { decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: const Color(0xFFCBD5E1), + color: UiColors.borderStill, width: 2, - ), // slate-300 + ), ), ), ], @@ -575,27 +544,23 @@ class _AvailabilityPageState extends State { color: UiColors.primary.withValues(alpha: 0.05), borderRadius: BorderRadius.circular(12), ), - child: const Row( + child: Row( crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, children: [ - Icon(UiIcons.clock, size: 20, color: UiColors.primary), - SizedBox(width: 12), + const Icon(UiIcons.clock, size: 20, color: UiColors.primary), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, children: [ Text( 'Auto-Match uses your availability', - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: UiColors.foreground, - ), + style: UiTypography.body2m, ), - SizedBox(height: 2), Text( "When enabled, you'll only be matched with shifts during your available times.", - style: TextStyle(fontSize: 12, color: UiColors.mutedForeground), + style: UiTypography.body3r.textSecondary, ), ], ), @@ -605,4 +570,3 @@ class _AvailabilityPageState extends State { ); } } - diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart index bd389ab6..adfa9cf8 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart @@ -64,14 +64,6 @@ class _ClockInPageState extends State { final bool isCheckedIn = state.attendance.isCheckedIn && isActiveSelected; - // Format times for display - final String checkInStr = checkInTime != null - ? DateFormat('h:mm a').format(checkInTime) - : '--:-- --'; - final String checkOutStr = checkOutTime != null - ? DateFormat('h:mm a').format(checkOutTime) - : '--:-- --'; - return Scaffold( appBar: UiAppBar( titleWidget: Text( @@ -117,7 +109,6 @@ class _ClockInPageState extends State { ), const SizedBox(height: 20), - // Your Activity Header const Text( "Your Activity", From c6448ad5c1aa0bac797062784a74830e4011c427 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 16:05:05 -0500 Subject: [PATCH 5/9] Refactor UI components to utilize design system colors and typography - Removed deprecated app_colors.dart file. - Updated AttendanceCard widget to use design system colors and typography. - Refactored CommuteTracker widget for consistent styling with design system. - Modified DateSelector widget to apply design system styles. - Adjusted LocationMapPlaceholder widget to align with design system. - Enhanced LunchBreakDialog with design system colors and typography. - Updated SwipeToCheckIn widget to utilize design system for colors and text styles. --- .../src/presentation/pages/clock_in_page.dart | 185 +++++-------- .../src/presentation/theme/app_colors.dart | 13 - .../presentation/widgets/attendance_card.dart | 42 ++- .../presentation/widgets/commute_tracker.dart | 162 +++++------- .../presentation/widgets/date_selector.dart | 28 +- .../widgets/location_map_placeholder.dart | 31 ++- .../widgets/lunch_break_modal.dart | 244 +++++++++--------- .../widgets/swipe_to_check_in.dart | 44 ++-- 8 files changed, 309 insertions(+), 440 deletions(-) delete mode 100644 apps/mobile/packages/features/staff/clock_in/lib/src/presentation/theme/app_colors.dart diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart index adfa9cf8..29df8a28 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart @@ -9,7 +9,6 @@ import 'package:lucide_icons/lucide_icons.dart'; import '../bloc/clock_in_bloc.dart'; import '../bloc/clock_in_event.dart'; import '../bloc/clock_in_state.dart'; -import '../theme/app_colors.dart'; import '../widgets/commute_tracker.dart'; import '../widgets/date_selector.dart'; import '../widgets/lunch_break_modal.dart'; @@ -39,9 +38,11 @@ class _ClockInPageState extends State { listener: (BuildContext context, ClockInState state) { if (state.status == ClockInStatus.failure && state.errorMessage != null) { - ScaffoldMessenger.of( + UiSnackbar.show( context, - ).showSnackBar(SnackBar(content: Text(state.errorMessage!))); + message: state.errorMessage!, + type: UiSnackbarType.error, + ); } }, builder: (BuildContext context, ClockInState state) { @@ -110,14 +111,10 @@ class _ClockInPageState extends State { const SizedBox(height: 20), // Your Activity Header - const Text( + Text( "Your Activity", textAlign: TextAlign.start, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: AppColors.krowCharcoal, - ), + style: UiTypography.headline4m, ), const SizedBox(height: 16), @@ -135,15 +132,15 @@ class _ClockInPageState extends State { margin: const EdgeInsets.only(bottom: 12), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: BorderRadius.circular( 12, ), border: Border.all( color: shift.id == selectedShift?.id - ? AppColors.krowBlue - : const Color(0xFFE2E8F0), + ? UiColors.primary + : UiColors.border, width: shift.id == selectedShift?.id ? 2 @@ -164,34 +161,25 @@ class _ClockInPageState extends State { selectedShift?.id ? "SELECTED SHIFT" : "TODAY'S SHIFT", - style: TextStyle( - fontSize: 10, - fontWeight: - FontWeight.w600, + style: UiTypography + .titleUppercase4b + .copyWith( color: shift.id == selectedShift?.id - ? AppColors.krowBlue - : AppColors - .krowCharcoal, - letterSpacing: 0.5, + ? UiColors.primary + : UiColors + .textSecondary, ), ), const SizedBox(height: 2), Text( shift.title, - style: const TextStyle( - fontSize: 14, - fontWeight: - FontWeight.w600, - color: Color(0xFF1E293B), - ), + style: UiTypography.body2b, ), Text( "${shift.clientName} • ${shift.location}", - style: const TextStyle( - fontSize: 12, - color: Color(0xFF64748B), - ), + style: UiTypography.body3r + .textSecondary, ), ], ), @@ -202,18 +190,14 @@ class _ClockInPageState extends State { children: [ Text( "${_formatTime(shift.startTime)} - ${_formatTime(shift.endTime)}", - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: Color(0xFF475569), - ), + style: UiTypography.body3m + .textSecondary, ), Text( "\$${shift.hourlyRate}/hr", - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: AppColors.krowBlue, + style: UiTypography.body3m + .copyWith( + color: UiColors.primary, ), ), ], @@ -234,7 +218,7 @@ class _ClockInPageState extends State { width: double.infinity, padding: const EdgeInsets.all(24), decoration: BoxDecoration( - color: const Color(0xFFF1F5F9), // slate-100 + color: UiColors.bgSecondary, borderRadius: BorderRadius.circular(16), ), child: Column( @@ -242,24 +226,17 @@ class _ClockInPageState extends State { const Icon( LucideIcons.clock, size: 48, - color: Color(0xFF94A3B8), // slate-400 + color: UiColors.iconThird, ), const SizedBox(height: 16), - const Text( + Text( "You're early!", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Color(0xFF475569), // slate-600 - ), + style: UiTypography.body1m.textSecondary, ), const SizedBox(height: 4), Text( "Check-in available at ${_getCheckInAvailabilityTime(selectedShift)}", - style: const TextStyle( - fontSize: 14, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.body2r.textSecondary, textAlign: TextAlign.center, ), ], @@ -304,11 +281,11 @@ class _ClockInPageState extends State { Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( - color: const Color(0xFFECFDF5), // emerald-50 + color: UiColors.tagSuccess, borderRadius: BorderRadius.circular(16), border: Border.all( - color: const Color(0xFFA7F3D0), - ), // emerald-200 + color: UiColors.success.withValues(alpha: 0.3), + ), ), child: Column( children: [ @@ -316,31 +293,24 @@ class _ClockInPageState extends State { width: 48, height: 48, decoration: const BoxDecoration( - color: Color(0xFFD1FAE5), // emerald-100 + color: UiColors.tagActive, shape: BoxShape.circle, ), child: const Icon( LucideIcons.check, - color: Color(0xFF059669), // emerald-600 + color: UiColors.textSuccess, size: 24, ), ), const SizedBox(height: 12), - const Text( + Text( "Shift Completed!", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Color(0xFF065F46), // emerald-800 - ), + style: UiTypography.body1b.textSuccess, ), const SizedBox(height: 4), - const Text( + Text( "Great work today", - style: TextStyle( - fontSize: 14, - color: Color(0xFF059669), // emerald-600 - ), + style: UiTypography.body2r.textSuccess, ), ], ), @@ -351,27 +321,20 @@ class _ClockInPageState extends State { width: double.infinity, padding: const EdgeInsets.all(24), decoration: BoxDecoration( - color: const Color(0xFFF1F5F9), // slate-100 + color: UiColors.bgSecondary, borderRadius: BorderRadius.circular(16), ), - child: const Column( + child: Column( children: [ Text( "No confirmed shifts for today", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Color(0xFF475569), // slate-600 - ), + style: UiTypography.body1m.textSecondary, textAlign: TextAlign.center, ), - SizedBox(height: 4), + const SizedBox(height: 4), Text( "Accept a shift to clock in", - style: TextStyle( - fontSize: 14, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.body2r.textSecondary, textAlign: TextAlign.center, ), ], @@ -385,11 +348,11 @@ class _ClockInPageState extends State { Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: const Color(0xFFECFDF5), // emerald-50 + color: UiColors.tagSuccess, borderRadius: BorderRadius.circular(12), border: Border.all( - color: const Color(0xFFA7F3D0), - ), // emerald-200 + color: UiColors.success.withValues(alpha: 0.3), + ), ), child: Row( mainAxisAlignment: @@ -399,23 +362,15 @@ class _ClockInPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( "Checked in at", - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: Color(0xFF059669), - ), + style: UiTypography.body3m.textSuccess, ), Text( DateFormat( 'h:mm a', ).format(checkInTime), - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0xFF065F46), - ), + style: UiTypography.body1b.textSuccess, ), ], ), @@ -423,12 +378,12 @@ class _ClockInPageState extends State { width: 40, height: 40, decoration: const BoxDecoration( - color: Color(0xFFD1FAE5), + color: UiColors.tagActive, shape: BoxShape.circle, ), child: const Icon( LucideIcons.check, - color: Color(0xFF059669), + color: UiColors.textSuccess, ), ), ], @@ -466,12 +421,12 @@ class _ClockInPageState extends State { child: Container( padding: const EdgeInsets.symmetric(vertical: 8), decoration: BoxDecoration( - color: isSelected ? Colors.white : Colors.transparent, + color: isSelected ? UiColors.white : UiColors.transparent, borderRadius: BorderRadius.circular(8), boxShadow: isSelected ? [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -484,15 +439,15 @@ class _ClockInPageState extends State { Icon( icon, size: 16, - color: isSelected ? Colors.black : Colors.grey, + color: isSelected ? UiColors.foreground : UiColors.iconThird, ), const SizedBox(width: 6), Text( label, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: isSelected ? Colors.black : Colors.grey, + style: UiTypography.body2m.copyWith( + color: isSelected + ? UiColors.foreground + : UiColors.textSecondary, ), ), ], @@ -521,26 +476,19 @@ class _ClockInPageState extends State { width: 96, height: 96, decoration: BoxDecoration( - color: scanned - ? Colors.green.shade50 - : Colors.blue.shade50, + color: scanned ? UiColors.tagSuccess : UiColors.tagInProgress, shape: BoxShape.circle, ), child: Icon( scanned ? LucideIcons.check : LucideIcons.nfc, size: 48, - color: scanned - ? Colors.green.shade600 - : Colors.blue.shade600, + color: scanned ? UiColors.textSuccess : UiColors.primary, ), ), const SizedBox(height: 24), Text( scanned ? 'Processing check-in...' : 'Ready to scan', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, - ), + style: UiTypography.headline4m, ), const SizedBox(height: 8), Text( @@ -548,7 +496,7 @@ class _ClockInPageState extends State { ? 'Please wait...' : 'Hold your phone near the NFC tag at the clock-in station', textAlign: TextAlign.center, - style: TextStyle(fontSize: 14, color: Colors.grey.shade600), + style: UiTypography.body2r.textSecondary, ), if (!scanned) ...[ const SizedBox(height: 24), @@ -573,16 +521,13 @@ class _ClockInPageState extends State { // It's safer to just return a result }, icon: const Icon(LucideIcons.nfc, size: 24), - label: const Text( + label: Text( 'Tap to Scan', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, - ), + style: UiTypography.headline4m.white, ), style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0047FF), - foregroundColor: Colors.white, + backgroundColor: UiColors.primary, + foregroundColor: UiColors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/theme/app_colors.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/theme/app_colors.dart deleted file mode 100644 index a41fe11f..00000000 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/theme/app_colors.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/material.dart'; - -class AppColors { - static const Color krowBlue = Color(0xFF0A39DF); - static const Color krowYellow = Color(0xFFFFED4A); - static const Color krowCharcoal = Color(0xFF121826); - static const Color krowMuted = Color(0xFF6A7382); - static const Color krowBorder = Color(0xFFE3E6E9); - static const Color krowBackground = Color(0xFFFAFBFC); - - static const Color white = Colors.white; - static const Color black = Colors.black; -} diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart index 9f5f07dd..adc955bb 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart @@ -1,10 +1,10 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; enum AttendanceType { checkin, checkout, breaks, days } class AttendanceCard extends StatelessWidget { - const AttendanceCard({ super.key, required this.type, @@ -26,12 +26,12 @@ class AttendanceCard extends StatelessWidget { return Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: BorderRadius.circular(16), - border: Border.all(color: Colors.grey.shade100), + border: Border.all(color: UiColors.bgSecondary), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -53,10 +53,7 @@ class AttendanceCard extends StatelessWidget { const SizedBox(height: 8), Text( title, - style: const TextStyle( - fontSize: 11, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.titleUppercase4m.textSecondary, maxLines: 1, overflow: TextOverflow.ellipsis, ), @@ -65,27 +62,20 @@ class AttendanceCard extends StatelessWidget { fit: BoxFit.scaleDown, child: Text( value, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.headline4m, ), ), if (scheduledTime != null) ...[ const SizedBox(height: 2), Text( "Scheduled: $scheduledTime", - style: const TextStyle( - fontSize: 10, - color: Color(0xFF94A3B8), // slate-400 - ), + style: UiTypography.footnote2r.textInactive, ), ], const SizedBox(height: 2), Text( subtitle, - style: const TextStyle(fontSize: 12, color: Color(0xFF0032A0)), + style: UiTypography.footnote1r.copyWith(color: UiColors.primary), ), ], ), @@ -97,26 +87,26 @@ class AttendanceCard extends StatelessWidget { case AttendanceType.checkin: return _AttendanceStyle( icon: LucideIcons.logIn, - bgColor: const Color(0xFF0032A0).withOpacity(0.1), - iconColor: const Color(0xFF0032A0), + bgColor: UiColors.primary.withValues(alpha: 0.1), + iconColor: UiColors.primary, ); case AttendanceType.checkout: return _AttendanceStyle( icon: LucideIcons.logOut, - bgColor: const Color(0xFF333F48).withOpacity(0.1), - iconColor: const Color(0xFF333F48), + bgColor: UiColors.foreground.withValues(alpha: 0.1), + iconColor: UiColors.foreground, ); case AttendanceType.breaks: return _AttendanceStyle( icon: LucideIcons.coffee, - bgColor: const Color(0xFFF9E547).withOpacity(0.2), - iconColor: const Color(0xFF4C460D), + bgColor: UiColors.accent.withValues(alpha: 0.2), + iconColor: UiColors.accentForeground, ); case AttendanceType.days: return _AttendanceStyle( icon: LucideIcons.calendar, - bgColor: Colors.green.withOpacity(0.1), - iconColor: Colors.green, + bgColor: UiColors.success.withValues(alpha: 0.1), + iconColor: UiColors.textSuccess, ); } } diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart index 8f3726eb..65474125 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart @@ -1,7 +1,7 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; -import '../theme/app_colors.dart'; import 'package:krow_domain/krow_domain.dart'; +import 'package:lucide_icons/lucide_icons.dart'; enum CommuteMode { lockedNoShift, @@ -161,18 +161,18 @@ class _CommuteTrackerState extends State { margin: const EdgeInsets.only(bottom: 20), padding: const EdgeInsets.all(12), decoration: BoxDecoration( - gradient: const LinearGradient( + gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFFEFF6FF), // blue-50 - Color(0xFFECFEFF), // cyan-50 + UiColors.primary.withValues(alpha: 0.05), + UiColors.primary.withValues(alpha: 0.1), ], ), borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -188,35 +188,28 @@ class _CommuteTrackerState extends State { width: 32, height: 32, decoration: const BoxDecoration( - color: Color(0xFF2563EB), // blue-600 + color: UiColors.primary, shape: BoxShape.circle, ), child: const Icon( LucideIcons.mapPin, size: 16, - color: Colors.white, + color: UiColors.white, ), ), const SizedBox(width: 12), - const Expanded( + Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Enable Commute Tracking?', - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.body2m.textPrimary, ), - SizedBox(height: 4), + const SizedBox(height: 4), Text( 'Share location 1hr before shift so your manager can see you\'re on the way.', - style: TextStyle( - fontSize: 12, - color: Color(0xFF475569), // slate-600 - ), + style: UiTypography.body4r.textSecondary, ), ], ), @@ -233,9 +226,9 @@ class _CommuteTrackerState extends State { }, style: OutlinedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 8), - side: const BorderSide(color: Color(0xFFE2E8F0)), + side: const BorderSide(color: UiColors.border), ), - child: const Text('Not Now', style: TextStyle(fontSize: 12)), + child: Text('Not Now', style: UiTypography.footnote1m), ), ), const SizedBox(width: 8), @@ -245,12 +238,12 @@ class _CommuteTrackerState extends State { setState(() => _localHasConsent = true); }, style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF2563EB), // blue-600 + backgroundColor: UiColors.primary, padding: const EdgeInsets.symmetric(vertical: 8), ), - child: const Text( + child: Text( 'Enable', - style: TextStyle(fontSize: 12, color: Colors.white), + style: UiTypography.footnote1m.white, ), ), ), @@ -266,11 +259,11 @@ class _CommuteTrackerState extends State { margin: const EdgeInsets.only(bottom: 20), padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -282,13 +275,13 @@ class _CommuteTrackerState extends State { width: 32, height: 32, decoration: const BoxDecoration( - color: Color(0xFFF1F5F9), // slate-100 + color: UiColors.bgSecondary, shape: BoxShape.circle, ), child: const Icon( LucideIcons.navigation, size: 16, - color: Color(0xFF475569), // slate-600 + color: UiColors.textSecondary, ), ), const SizedBox(width: 8), @@ -298,13 +291,9 @@ class _CommuteTrackerState extends State { children: [ Row( children: [ - const Text( + Text( 'On My Way', - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.body2m.textPrimary, ), const SizedBox(width: 8), Row( @@ -312,26 +301,20 @@ class _CommuteTrackerState extends State { const Icon( LucideIcons.clock, size: 12, - color: Color(0xFF64748B), // slate-500 + color: UiColors.textInactive, ), const SizedBox(width: 2), Text( 'Shift starts in ${_getMinutesUntilShift()} min', - style: const TextStyle( - fontSize: 11, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.titleUppercase4m.textSecondary, ), ], ), ], ), - const Text( + Text( 'Track arrival', - style: TextStyle( - fontSize: 10, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.titleUppercase4m.textSecondary, ), ], ), @@ -342,7 +325,7 @@ class _CommuteTrackerState extends State { setState(() => _localIsCommuteOn = value); widget.onCommuteToggled?.call(value); }, - activeThumbColor: AppColors.krowBlue, + activeThumbColor: UiColors.primary, ), ], ), @@ -357,8 +340,8 @@ class _CommuteTrackerState extends State { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFF2563EB), // blue-600 - Color(0xFF0891B2), // cyan-600 + UiColors.primary, + UiColors.iconActive, ], ), ), @@ -383,13 +366,13 @@ class _CommuteTrackerState extends State { width: 96, height: 96, decoration: BoxDecoration( - color: Colors.white.withOpacity(0.2), + color: UiColors.white.withValues(alpha: 0.2), shape: BoxShape.circle, ), child: const Icon( LucideIcons.navigation, size: 48, - color: Colors.white, + color: UiColors.white, ), ), ); @@ -400,20 +383,15 @@ class _CommuteTrackerState extends State { }, ), const SizedBox(height: 24), - const Text( + Text( 'On My Way', - style: TextStyle( - fontSize: 32, - fontWeight: FontWeight.bold, - color: Colors.white, - ), + style: UiTypography.displayMb.white, ), const SizedBox(height: 8), Text( 'Your manager can see you\'re heading to the site', - style: TextStyle( - fontSize: 14, - color: Colors.blue.shade100, + style: UiTypography.body2r.copyWith( + color: UiColors.primaryForeground.withValues(alpha: 0.8), ), textAlign: TextAlign.center, ), @@ -424,29 +402,24 @@ class _CommuteTrackerState extends State { constraints: const BoxConstraints(maxWidth: 300), padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: UiColors.white.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(16), border: Border.all( - color: Colors.white.withOpacity(0.2), + color: UiColors.white.withValues(alpha: 0.2), ), ), child: Column( children: [ Text( 'Distance to Site', - style: TextStyle( - fontSize: 14, - color: Colors.blue.shade100, + style: UiTypography.body2r.copyWith( + color: UiColors.primaryForeground.withValues(alpha: 0.8), ), ), const SizedBox(height: 4), Text( _formatDistance(widget.distanceMeters!), - style: const TextStyle( - fontSize: 36, - fontWeight: FontWeight.bold, - color: Colors.white, - ), + style: UiTypography.displayM.white, ), ], ), @@ -458,29 +431,24 @@ class _CommuteTrackerState extends State { constraints: const BoxConstraints(maxWidth: 300), padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: UiColors.white.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(16), border: Border.all( - color: Colors.white.withOpacity(0.2), + color: UiColors.white.withValues(alpha: 0.2), ), ), child: Column( children: [ Text( 'Estimated Arrival', - style: TextStyle( - fontSize: 14, - color: Colors.blue.shade100, + style: UiTypography.body2r.copyWith( + color: UiColors.primaryForeground.withValues(alpha: 0.8), ), ), const SizedBox(height: 4), Text( '${widget.etaMinutes} min', - style: const TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Colors.white, - ), + style: UiTypography.headline1m.white, ), ], ), @@ -490,9 +458,8 @@ class _CommuteTrackerState extends State { const SizedBox(height: 32), Text( 'Most app features are locked while commute mode is on. You\'ll be able to clock in once you arrive.', - style: TextStyle( - fontSize: 12, - color: Colors.blue.shade100, + style: UiTypography.footnote1r.copyWith( + color: UiColors.primaryForeground.withValues(alpha: 0.8), ), textAlign: TextAlign.center, ), @@ -508,12 +475,12 @@ class _CommuteTrackerState extends State { setState(() => _localIsCommuteOn = false); }, style: OutlinedButton.styleFrom( - foregroundColor: Colors.white, - side: BorderSide(color: Colors.white.withOpacity(0.3)), + foregroundColor: UiColors.white, + side: BorderSide(color: UiColors.white.withValues(alpha: 0.3)), padding: const EdgeInsets.symmetric(vertical: 16), minimumSize: const Size(double.infinity, 48), ), - child: const Text('Turn Off Commute Mode'), + child: Text('Turn Off Commute Mode', style: UiTypography.buttonL), ), ), ], @@ -527,18 +494,18 @@ class _CommuteTrackerState extends State { margin: const EdgeInsets.only(bottom: 20), padding: const EdgeInsets.all(20), decoration: BoxDecoration( - gradient: const LinearGradient( + gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Color(0xFFECFDF5), // emerald-50 - Color(0xFFD1FAE5), // green-50 + UiColors.tagSuccess, + UiColors.tagActive, ], ), borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: UiColors.black.withValues(alpha: 0.1), blurRadius: 8, offset: const Offset(0, 2), ), @@ -550,31 +517,24 @@ class _CommuteTrackerState extends State { width: 64, height: 64, decoration: const BoxDecoration( - color: Color(0xFF10B981), // emerald-500 + color: UiColors.success, shape: BoxShape.circle, ), child: const Icon( LucideIcons.checkCircle, size: 32, - color: Colors.white, + color: UiColors.white, ), ), const SizedBox(height: 16), - const Text( + Text( 'You\'ve Arrived! 🎉', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.headline3m.textPrimary, ), const SizedBox(height: 8), - const Text( + Text( 'You\'re at the shift location. Ready to clock in?', - style: TextStyle( - fontSize: 14, - color: Color(0xFF475569), // slate-600 - ), + style: UiTypography.body2r.textSecondary, textAlign: TextAlign.center, ), ], diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart index 3b732041..1e39eecf 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart @@ -1,8 +1,8 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; class DateSelector extends StatelessWidget { - const DateSelector({ super.key, required this.selectedDate, @@ -36,12 +36,12 @@ class DateSelector extends StatelessWidget { duration: const Duration(milliseconds: 200), margin: const EdgeInsets.symmetric(horizontal: 4), decoration: BoxDecoration( - color: isSelected ? const Color(0xFF0032A0) : Colors.white, + color: isSelected ? UiColors.primary : UiColors.white, borderRadius: BorderRadius.circular(16), boxShadow: isSelected ? [ BoxShadow( - color: const Color(0xFF0032A0).withOpacity(0.3), + color: UiColors.primary.withValues(alpha: 0.3), blurRadius: 10, offset: const Offset(0, 4), ), @@ -53,22 +53,18 @@ class DateSelector extends StatelessWidget { children: [ Text( DateFormat('d').format(date), - style: TextStyle( - fontSize: 18, + style: UiTypography.title1m.copyWith( fontWeight: FontWeight.bold, - color: isSelected - ? Colors.white - : const Color(0xFF0F172A), + color: isSelected ? UiColors.white : UiColors.foreground, ), ), const SizedBox(height: 2), Text( DateFormat('E').format(date), - style: TextStyle( - fontSize: 12, + style: UiTypography.footnote2r.copyWith( color: isSelected - ? Colors.white.withOpacity(0.8) - : const Color(0xFF94A3B8), + ? UiColors.white.withValues(alpha: 0.8) + : UiColors.textInactive, ), ), const SizedBox(height: 4), @@ -77,9 +73,7 @@ class DateSelector extends StatelessWidget { width: 6, height: 6, decoration: BoxDecoration( - color: isSelected - ? Colors.white - : const Color(0xFF0032A0), + color: isSelected ? UiColors.white : UiColors.primary, shape: BoxShape.circle, ), ) @@ -87,8 +81,8 @@ class DateSelector extends StatelessWidget { Container( width: 6, height: 6, - decoration: BoxDecoration( - color: Colors.grey.shade300, + decoration: const BoxDecoration( + color: UiColors.border, shape: BoxShape.circle, ), ) diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart index 9f3d594d..4ce26d6d 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart @@ -1,5 +1,5 @@ -import 'package:flutter/material.dart'; import 'package:design_system/design_system.dart'; +import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; class LocationMapPlaceholder extends StatelessWidget { @@ -18,7 +18,7 @@ class LocationMapPlaceholder extends StatelessWidget { height: 200, width: double.infinity, decoration: BoxDecoration( - color: const Color(0xFFE2E8F0), + color: UiColors.border, borderRadius: BorderRadius.circular(16), image: DecorationImage( image: const NetworkImage( @@ -33,17 +33,18 @@ class LocationMapPlaceholder extends StatelessWidget { child: Stack( children: [ // Fallback UI if image fails (which it will without key) - const Center( + Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(LucideIcons.mapPin, size: 48, color: UiColors.iconSecondary), - SizedBox(height: 8), - Text('Map View (GPS)', style: TextStyle(color: UiColors.textSecondary)), + const Icon(LucideIcons.mapPin, + size: 48, color: UiColors.iconSecondary), + const SizedBox(height: 8), + Text('Map View (GPS)', style: UiTypography.body2r.textSecondary), ], ), ), - + // Status Overlay Positioned( bottom: 16, @@ -52,11 +53,11 @@ class LocationMapPlaceholder extends StatelessWidget { child: Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: UiColors.black.withValues(alpha: 0.1), blurRadius: 8, offset: const Offset(0, 4), ), @@ -65,8 +66,12 @@ class LocationMapPlaceholder extends StatelessWidget { child: Row( children: [ Icon( - isVerified ? LucideIcons.checkCircle : LucideIcons.alertCircle, - color: isVerified ? UiColors.textSuccess : UiColors.destructive, + isVerified + ? LucideIcons.checkCircle + : LucideIcons.alertCircle, + color: isVerified + ? UiColors.textSuccess + : UiColors.destructive, size: 20, ), const SizedBox(width: 12), @@ -76,12 +81,12 @@ class LocationMapPlaceholder extends StatelessWidget { children: [ Text( isVerified ? 'Location Verified' : 'Location Check', - style: UiTypography.body1b.copyWith(color: UiColors.textPrimary), + style: UiTypography.body1b.textPrimary, ), if (distance != null) Text( '${distance!.toStringAsFixed(0)}m from venue', - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), ], ), diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart index f095f6a4..524cad92 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart @@ -1,8 +1,8 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; class LunchBreakDialog extends StatefulWidget { - const LunchBreakDialog({super.key, required this.onComplete}); final VoidCallback onComplete; @@ -47,7 +47,7 @@ class _LunchBreakDialogState extends State { @override Widget build(BuildContext context) { return Dialog( - backgroundColor: Colors.white, + backgroundColor: UiColors.white, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), child: AnimatedSwitcher( duration: const Duration(milliseconds: 300), @@ -82,25 +82,21 @@ class _LunchBreakDialogState extends State { Container( width: 80, height: 80, - decoration: BoxDecoration( - color: Colors.grey.shade100, + decoration: const BoxDecoration( + color: UiColors.bgSecondary, shape: BoxShape.circle, ), child: const Icon( LucideIcons.coffee, size: 40, - color: Color(0xFF6A7382), + color: UiColors.iconSecondary, ), ), const SizedBox(height: 24), - const Text( + Text( "Did You Take\na Lunch?", textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Color(0xFF121826), - ), + style: UiTypography.headline1m.textPrimary, ), const SizedBox(height: 24), Row( @@ -116,18 +112,14 @@ class _LunchBreakDialogState extends State { child: Container( padding: const EdgeInsets.symmetric(vertical: 16), decoration: BoxDecoration( - border: Border.all(color: Colors.grey.shade300), + border: Border.all(color: UiColors.border), borderRadius: BorderRadius.circular(12), - color: Colors.transparent, + color: UiColors.transparent, ), alignment: Alignment.center, - child: const Text( + child: Text( "No", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Color(0xFF121826), - ), + style: UiTypography.body1m.textPrimary, ), ), ), @@ -142,19 +134,15 @@ class _LunchBreakDialogState extends State { }); }, style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0032A0), + backgroundColor: UiColors.primary, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), - child: const Text( + child: Text( "Yes", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Colors.white, - ), + style: UiTypography.body1m.white, ), ), ), @@ -172,76 +160,51 @@ class _LunchBreakDialogState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Text( + Text( "When did you take lunch?", - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + style: UiTypography.headline4m, ), - const SizedBox(height: 24), - // Mock Inputs - Row( - children: [ - Expanded( - child: DropdownButtonFormField( - isExpanded: true, - initialValue: _breakStart, - items: _timeOptions.map((String t) => DropdownMenuItem(value: t, child: Text(t, style: const TextStyle(fontSize: 13)))).toList(), - onChanged: (String? v) => setState(() => _breakStart = v), - decoration: const InputDecoration( - labelText: 'Start', - contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), - ), - ), - ), - const SizedBox(width: 10), - Expanded( - child: DropdownButtonFormField( - isExpanded: true, - initialValue: _breakEnd, - items: _timeOptions.map((String t) => DropdownMenuItem(value: t, child: Text(t, style: const TextStyle(fontSize: 13)))).toList(), - onChanged: (String? v) => setState(() => _breakEnd = v), - decoration: const InputDecoration( - labelText: 'End', - contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), - ), - ), - ), - ], - ), - const SizedBox(height: 24), - ElevatedButton( - onPressed: () { - setState(() => _step = 3); - }, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0032A0), - minimumSize: const Size(double.infinity, 48), + // Mock Inputs + Row( + children: [ + Expanded( + child: DropdownButtonFormField( + isExpanded: true, + value: _breakStart, + items: _timeOptions + .map((String t) => DropdownMenuItem( + value: t, + child: Text(t, style: UiTypography.body3r))) + .toList(), + onChanged: (String? v) => setState(() => _breakStart = v), + decoration: const InputDecoration( + labelText: 'Start', + contentPadding: + EdgeInsets.symmetric(horizontal: 10, vertical: 8), + ), + ), ), - child: const Text("Next", style: TextStyle(color: Colors.white)), + const SizedBox(width: 10), + Expanded( + child: DropdownButtonFormField( + isExpanded: true, + value: _breakEnd, + items: _timeOptions + .map((String t) => DropdownMenuItem( + value: t, + child: Text(t, style: UiTypography.body3r))) + .toList(), + onChanged: (String? v) => setState(() => _breakEnd = v), + decoration: const InputDecoration( + labelText: 'End', + contentPadding: + EdgeInsets.symmetric(horizontal: 10, vertical: 8), + ), + ), + ), + ], ), - ], - )); - } - - Widget _buildStep2b() { - // No lunch reason - return Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const Text( - "Why didn't you take lunch?", - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 16), - ..._noLunchReasons.map((String reason) => RadioListTile( - title: Text(reason), - value: reason, - groupValue: _noLunchReason, - onChanged: (String? val) => setState(() => _noLunchReason = val), - )), const SizedBox(height: 24), ElevatedButton( @@ -249,10 +212,47 @@ class _LunchBreakDialogState extends State { setState(() => _step = 3); }, style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0032A0), - minimumSize: const Size(double.infinity, 48), - ), - child: const Text("Next", style: TextStyle(color: Colors.white)), + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), + ), + child: Text("Next", style: UiTypography.body1m.white), + ), + ], + )); + } + + Widget _buildStep2b() { + // No lunch reason + return Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Why didn't you take lunch?", + style: UiTypography.headline4m, + ), + const SizedBox(height: 16), + ..._noLunchReasons.map((String reason) => RadioListTile( + title: Text(reason, style: UiTypography.body2r), + value: reason, + groupValue: _noLunchReason, + onChanged: (String? val) => + setState(() => _noLunchReason = val), + activeColor: UiColors.primary, + )), + + const SizedBox(height: 24), + ElevatedButton( + onPressed: () { + setState(() => _step = 3); + }, + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), + ), + child: Text("Next", style: UiTypography.body1m.white), ), ], )); @@ -260,35 +260,36 @@ class _LunchBreakDialogState extends State { Widget _buildStep3() { // Additional Notes - return Padding( + return Padding( padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Text( + Text( "Additional Notes", - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + style: UiTypography.headline4m, + ), + const SizedBox(height: 16), + TextField( + onChanged: (String v) => _additionalNotes = v, + style: UiTypography.body2r, + decoration: const InputDecoration( + hintText: 'Add any details...', + border: OutlineInputBorder(), + ), + maxLines: 3, ), - const SizedBox(height: 16), - TextField( - onChanged: (String v) => _additionalNotes = v, - decoration: const InputDecoration( - hintText: 'Add any details...', - border: OutlineInputBorder(), - ), - maxLines: 3, - ), const SizedBox(height: 24), ElevatedButton( onPressed: () { setState(() => _step = 4); }, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0032A0), - minimumSize: const Size(double.infinity, 48), - ), - child: const Text("Submit", style: TextStyle(color: Colors.white)), + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), + ), + child: Text("Submit", style: UiTypography.body1m.white), ), ], )); @@ -296,25 +297,26 @@ class _LunchBreakDialogState extends State { Widget _buildStep4() { // Success - return Padding( + return Padding( padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Icon(LucideIcons.checkCircle, size: 64, color: Colors.green), + const Icon(LucideIcons.checkCircle, + size: 64, color: UiColors.success), const SizedBox(height: 24), - const Text( + Text( "Break Logged!", - style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + style: UiTypography.headline1m, ), const SizedBox(height: 24), ElevatedButton( onPressed: widget.onComplete, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0032A0), - minimumSize: const Size(double.infinity, 48), - ), - child: const Text("Close", style: TextStyle(color: Colors.white)), + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), + ), + child: Text("Close", style: UiTypography.body1m.white), ), ], )); diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart index 10315dd8..23987440 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart @@ -1,3 +1,4 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; @@ -72,9 +73,8 @@ class _SwipeToCheckInState extends State @override Widget build(BuildContext context) { - final Color baseColor = widget.isCheckedIn - ? const Color(0xFF10B981) - : const Color(0xFF0032A0); + final Color baseColor = + widget.isCheckedIn ? UiColors.success : UiColors.primary; if (widget.mode == 'nfc') { return GestureDetector( @@ -96,7 +96,7 @@ class _SwipeToCheckInState extends State borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( - color: baseColor.withOpacity(0.4), + color: baseColor.withValues(alpha: 0.4), blurRadius: 25, offset: const Offset(0, 10), spreadRadius: -5, @@ -106,7 +106,7 @@ class _SwipeToCheckInState extends State child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(LucideIcons.wifi, color: Colors.white), + const Icon(LucideIcons.wifi, color: UiColors.white), const SizedBox(width: 12), Text( widget.isLoading @@ -114,11 +114,7 @@ class _SwipeToCheckInState extends State ? "Checking out..." : "Checking in...") : (widget.isCheckedIn ? "NFC Check Out" : "NFC Check In"), - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 18, - ), + style: UiTypography.body1b.white, ), ], ), @@ -133,12 +129,10 @@ class _SwipeToCheckInState extends State // Calculate background color based on drag final double progress = _dragValue / maxDrag; - final Color startColor = widget.isCheckedIn - ? const Color(0xFF10B981) - : const Color(0xFF0032A0); - final Color endColor = widget.isCheckedIn - ? const Color(0xFF0032A0) - : const Color(0xFF10B981); + final Color startColor = + widget.isCheckedIn ? UiColors.success : UiColors.primary; + final Color endColor = + widget.isCheckedIn ? UiColors.primary : UiColors.success; final Color currentColor = Color.lerp(startColor, endColor, progress) ?? startColor; @@ -149,7 +143,7 @@ class _SwipeToCheckInState extends State borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: UiColors.black.withValues(alpha: 0.1), blurRadius: 4, offset: const Offset(0, 2), ), @@ -164,11 +158,7 @@ class _SwipeToCheckInState extends State widget.isCheckedIn ? "Swipe to Check Out" : "Swipe to Check In", - style: TextStyle( - color: Colors.white.withOpacity(0.8), - fontWeight: FontWeight.w600, - fontSize: 18, - ), + style: UiTypography.body1b, ), ), ), @@ -176,11 +166,7 @@ class _SwipeToCheckInState extends State Center( child: Text( widget.isCheckedIn ? "Check Out!" : "Check In!", - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.w600, - fontSize: 18, - ), + style: UiTypography.body1b, ), ), Positioned( @@ -193,11 +179,11 @@ class _SwipeToCheckInState extends State width: _handleSize, height: _handleSize, decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: UiColors.black.withValues(alpha: 0.1), blurRadius: 2, offset: const Offset(0, 1), ), From 77370a768829b7f002993b522b0e5753a57fb566 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 16:12:13 -0500 Subject: [PATCH 6/9] refactor: Replace Lucide icons with UiIcons across various widgets to ensure consistency with the design system --- .../design_system/lib/src/ui_icons.dart | 3 +++ .../presentation/pages/worker_home_page.dart | 10 +++++----- .../home_page/pending_payment_card.dart | 6 +++--- .../widgets/home_page/placeholder_banner.dart | 6 +++--- .../home_page/recommended_shift_card.dart | 10 +++++----- .../widgets/home_page/section_header.dart | 4 ++-- .../src/presentation/widgets/shift_card.dart | 18 +++++++++--------- .../widgets/worker/auto_match_toggle.dart | 11 ++++++----- .../widgets/worker/benefits_widget.dart | 5 +++-- .../packages/features/staff/home/pubspec.yaml | 1 - 10 files changed, 39 insertions(+), 35 deletions(-) diff --git a/apps/mobile/packages/design_system/lib/src/ui_icons.dart b/apps/mobile/packages/design_system/lib/src/ui_icons.dart index aa4c2e74..68d101e8 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_icons.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_icons.dart @@ -234,4 +234,7 @@ class UiIcons { /// Moon icon static const IconData moon = _IconLib.moon; + + /// Timer icon + static const IconData timer = _IconLib.timer; } diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart index eb4a01cf..c820e15c 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart @@ -3,9 +3,9 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:lucide_icons/lucide_icons.dart'; -import 'package:staff_home/src/presentation/blocs/home_cubit.dart'; import 'package:krow_core/core.dart'; + +import 'package:staff_home/src/presentation/blocs/home_cubit.dart'; import 'package:staff_home/src/presentation/widgets/home_page/empty_state_widget.dart'; import 'package:staff_home/src/presentation/widgets/home_page/home_header.dart'; import 'package:staff_home/src/presentation/widgets/home_page/placeholder_banner.dart'; @@ -83,21 +83,21 @@ class WorkerHomePage extends StatelessWidget { children: [ Expanded( child: QuickActionItem( - icon: LucideIcons.search, + icon: UiIcons.search, label: quickI18n.find_shifts, onTap: () => Modular.to.toShifts(), ), ), Expanded( child: QuickActionItem( - icon: LucideIcons.calendar, + icon: UiIcons.calendar, label: quickI18n.availability, onTap: () => Modular.to.toAvailability(), ), ), Expanded( child: QuickActionItem( - icon: LucideIcons.dollarSign, + icon: UiIcons.dollar, label: quickI18n.earnings, onTap: () => Modular.to.toPayments(), ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/pending_payment_card.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/pending_payment_card.dart index 261c7d65..4476aecc 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/pending_payment_card.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/pending_payment_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'package:design_system/design_system.dart'; import 'package:core_localization/core_localization.dart'; @@ -42,7 +42,7 @@ class PendingPaymentCard extends StatelessWidget { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.dollarSign, + UiIcons.dollar, color: UiColors.primary, size: 20, ), @@ -76,7 +76,7 @@ class PendingPaymentCard extends StatelessWidget { ), SizedBox(width: UiConstants.space2), Icon( - LucideIcons.chevronRight, + UiIcons.chevronRight, color: UiColors.mutedForeground, size: 20, ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart index 517eba67..8d8577ee 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'package:design_system/design_system.dart'; @@ -41,7 +41,7 @@ class PlaceholderBanner extends StatelessWidget { color: UiColors.bgBanner, shape: BoxShape.circle, ), - child: Icon(LucideIcons.sparkles, color: accent, size: 20), + child: Icon(UiIcons.sparkles, color: accent, size: 20), ), const SizedBox(width: UiConstants.space3), Expanded( @@ -59,7 +59,7 @@ class PlaceholderBanner extends StatelessWidget { ], ), ), - Icon(LucideIcons.chevronRight, color: accent), + Icon(UiIcons.chevronRight, color: accent), ], ), ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart index ede4069d..e9f9d2c2 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart @@ -3,7 +3,7 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:krow_domain/krow_domain.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'package:krow_core/core.dart'; class RecommendedShiftCard extends StatelessWidget { @@ -84,7 +84,7 @@ class RecommendedShiftCard extends StatelessWidget { borderRadius: BorderRadius.circular(12), ), child: const Icon( - LucideIcons.calendar, + UiIcons.calendar, color: Color(0xFF0047FF), size: 20, ), @@ -148,7 +148,7 @@ class RecommendedShiftCard extends StatelessWidget { Row( children: [ const Icon( - LucideIcons.calendar, + UiIcons.calendar, size: 14, color: UiColors.mutedForeground, ), @@ -162,7 +162,7 @@ class RecommendedShiftCard extends StatelessWidget { ), const SizedBox(width: 12), const Icon( - LucideIcons.clock, + UiIcons.clock, size: 14, color: UiColors.mutedForeground, ), @@ -183,7 +183,7 @@ class RecommendedShiftCard extends StatelessWidget { Row( children: [ const Icon( - LucideIcons.mapPin, + UiIcons.mapPin, size: 14, color: UiColors.mutedForeground, ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart index 59754ec6..482ef175 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'package:design_system/design_system.dart'; @@ -38,7 +38,7 @@ class SectionHeader extends StatelessWidget { style: UiTypography.body2m.copyWith(color: UiColors.primary), ), const Icon( - LucideIcons.chevronRight, + UiIcons.chevronRight, size: 16, color: UiColors.primary, ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart index 046afcfe..7a5caa37 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'package:intl/intl.dart'; import 'package:design_system/design_system.dart'; @@ -109,8 +109,8 @@ class _ShiftCardState extends State { fit: BoxFit.contain, ), ) - : const Icon( - LucideIcons.building2, + : Icon( + UiIcons.building, color: UiColors.mutedForeground, ), ), @@ -218,8 +218,8 @@ class _ShiftCardState extends State { fit: BoxFit.contain, ), ) - : const Icon( - LucideIcons.building2, + : Icon( + UiIcons.building, size: 28, color: UiColors.primary, ), @@ -300,7 +300,7 @@ class _ShiftCardState extends State { Row( children: [ const Icon( - LucideIcons.mapPin, + UiIcons.mapPin, size: 16, color: UiColors.mutedForeground, ), @@ -317,7 +317,7 @@ class _ShiftCardState extends State { ), const SizedBox(width: 16), const Icon( - LucideIcons.calendar, + UiIcons.calendar, size: 16, color: UiColors.mutedForeground, ), @@ -339,13 +339,13 @@ class _ShiftCardState extends State { runSpacing: 8, children: [ _buildTag( - LucideIcons.zap, + UiIcons.zap, 'Immediate start', UiColors.accent.withValues(alpha: 0.3), UiColors.foreground, ), _buildTag( - LucideIcons.timer, + UiIcons.timer, 'No experience', const Color(0xFFFEE2E2), const Color(0xFFDC2626), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart index 0813dbfe..61cef8f7 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart @@ -1,5 +1,6 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'package:core_localization/core_localization.dart'; @@ -63,7 +64,7 @@ class _AutoMatchToggleState extends State with SingleTickerProv borderRadius: BorderRadius.circular(12), ), child: Icon( - LucideIcons.zap, + UiIcons.zap, color: widget.enabled ? Colors.white : primary, size: 20, ), @@ -123,12 +124,12 @@ class _AutoMatchToggleState extends State with SingleTickerProv Wrap( spacing: 8, children: [ - _buildChip(LucideIcons.mapPin, i18n.chips.location), + _buildChip(UiIcons.mapPin, i18n.chips.location), _buildChip( - LucideIcons.clock, + UiIcons.clock, i18n.chips.availability, ), - _buildChip(LucideIcons.briefcase, i18n.chips.skills), + _buildChip(UiIcons.briefcase, i18n.chips.skills), ], ), ], diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart index 8826ea0c..9a475c22 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart @@ -1,6 +1,7 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:lucide_icons/lucide_icons.dart'; + import 'dart:math' as math; import 'package:core_localization/core_localization.dart'; @@ -46,7 +47,7 @@ class BenefitsWidget extends StatelessWidget { style: Theme.of(context).textTheme.labelLarge?.copyWith(color: Theme.of(context).colorScheme.primary), ), Icon( - LucideIcons.chevronRight, + UiIcons.chevronRight, size: 16, color: Theme.of(context).colorScheme.primary, ), diff --git a/apps/mobile/packages/features/staff/home/pubspec.yaml b/apps/mobile/packages/features/staff/home/pubspec.yaml index 8d6afcfd..3898f63e 100644 --- a/apps/mobile/packages/features/staff/home/pubspec.yaml +++ b/apps/mobile/packages/features/staff/home/pubspec.yaml @@ -15,7 +15,6 @@ dependencies: bloc: ^8.1.0 flutter_modular: ^6.3.0 equatable: ^2.0.5 - lucide_icons: ^0.257.0 intl: ^0.20.0 google_fonts: ^7.0.0 From 273027707548e7c11e2e192ff965a7eb5cf3ad7e Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 16:25:54 -0500 Subject: [PATCH 7/9] Refactor UI components to use design system tokens for consistency - Removed the UiSuccessSnackbar widget as it is no longer needed. - Updated WorkerHomePage to replace hardcoded spacing with UiConstants. - Refactored HomeHeader to use UiConstants for dimensions and colors. - Modified PlaceholderBanner to utilize UiConstants for sizes and colors. - Adjusted QuickActionItem to apply UiConstants for dimensions and icon sizes. - Updated RecommendedShiftCard to use design system typography and constants. - Refined SectionHeader to implement design system styles and spacing. - Enhanced ShiftCard to adopt design system tokens for colors and spacing. - Updated AutoMatchToggle to use design system colors and dimensions. - Refactored BenefitsWidget to apply design system styles and constants. - Improved ImproveYourselfWidget to utilize design system tokens for styling. - Updated MoreWaysToUseKrowWidget to implement design system styles and constants. --- .../design_system/lib/design_system.dart | 2 - .../design_system/lib/src/ui_theme.dart | 2 +- .../lib/src/widgets/ui_error_snackbar.dart | 202 ------------------ .../lib/src/widgets/ui_step_indicator.dart | 14 +- .../lib/src/widgets/ui_success_snackbar.dart | 49 ----- .../presentation/pages/worker_home_page.dart | 19 +- .../widgets/home_page/home_header.dart | 13 +- .../widgets/home_page/placeholder_banner.dart | 8 +- .../widgets/home_page/quick_action_item.dart | 8 +- .../home_page/recommended_shift_card.dart | 108 ++++------ .../widgets/home_page/section_header.dart | 88 ++++---- .../src/presentation/widgets/shift_card.dart | 182 ++++++---------- .../widgets/worker/auto_match_toggle.dart | 78 +++---- .../widgets/worker/benefits_widget.dart | 51 ++--- .../worker/improve_yourself_widget.dart | 34 ++- .../widgets/worker/more_ways_widget.dart | 30 +-- 16 files changed, 284 insertions(+), 604 deletions(-) delete mode 100644 apps/mobile/packages/design_system/lib/src/widgets/ui_error_snackbar.dart delete mode 100644 apps/mobile/packages/design_system/lib/src/widgets/ui_success_snackbar.dart diff --git a/apps/mobile/packages/design_system/lib/design_system.dart b/apps/mobile/packages/design_system/lib/design_system.dart index b447dd7b..2bfc01d4 100644 --- a/apps/mobile/packages/design_system/lib/design_system.dart +++ b/apps/mobile/packages/design_system/lib/design_system.dart @@ -10,7 +10,5 @@ export 'src/widgets/ui_step_indicator.dart'; export 'src/widgets/ui_icon_button.dart'; export 'src/widgets/ui_button.dart'; export 'src/widgets/ui_chip.dart'; -export 'src/widgets/ui_error_snackbar.dart'; -export 'src/widgets/ui_success_snackbar.dart'; export 'src/widgets/ui_loading_page.dart'; export 'src/widgets/ui_snackbar.dart'; diff --git a/apps/mobile/packages/design_system/lib/src/ui_theme.dart b/apps/mobile/packages/design_system/lib/src/ui_theme.dart index 2b098529..98ee7214 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_theme.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_theme.dart @@ -255,7 +255,7 @@ class UiTheme { } return UiColors.switchInactive; }), - thumbColor: const WidgetStatePropertyAll(UiColors.white), + thumbColor: const WidgetStatePropertyAll(UiColors.white), ), // Checkbox Theme diff --git a/apps/mobile/packages/design_system/lib/src/widgets/ui_error_snackbar.dart b/apps/mobile/packages/design_system/lib/src/widgets/ui_error_snackbar.dart deleted file mode 100644 index c35e36ae..00000000 --- a/apps/mobile/packages/design_system/lib/src/widgets/ui_error_snackbar.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:core_localization/core_localization.dart'; -import '../ui_colors.dart'; -import '../ui_typography.dart'; - -/// Centralized error snackbar for consistent error presentation across the app. -/// -/// This widget automatically resolves localization keys and displays -/// user-friendly error messages with optional error codes for support. -/// -/// Usage: -/// ```dart -/// UiErrorSnackbar.show( -/// context, -/// messageKey: 'errors.auth.invalid_credentials', -/// errorCode: 'AUTH_001', -/// ); -/// ``` -class UiErrorSnackbar { - /// Shows an error snackbar with a localized message. - /// - /// [messageKey] should be a dot-separated path like 'errors.auth.invalid_credentials' - /// [errorCode] is optional and will be shown in smaller text for support reference - /// [duration] controls how long the snackbar is visible - static void show( - BuildContext context, { - required String messageKey, - String? errorCode, - Duration duration = const Duration(seconds: 4), - }) { - // 1. Added explicit type 'Translations' to satisfy the lint - final Translations texts = Translations.of(context); - final String message = _getMessageFromKey(texts, messageKey); - - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Row( - children: [ - const Icon(Icons.error_outline, color: UiColors.white), - const SizedBox(width: 12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - message, - style: UiTypography.body2m.copyWith(color: UiColors.white), - ), - if (errorCode != null) ...[ - const SizedBox(height: 4), - Text( - 'Error Code: $errorCode', - style: UiTypography.footnote2r.copyWith( - // 3. Fixed deprecated member use - color: UiColors.white.withValues(alpha: 0.7), - ), - ), - ], - ], - ), - ), - ], - ), - backgroundColor: UiColors.error, - behavior: SnackBarBehavior.floating, - duration: duration, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - margin: const EdgeInsets.all(16), - ), - ); - } - - /// Resolves a localization key path to the actual translated message. - /// - /// Supports keys like: - /// - errors.auth.invalid_credentials - /// - errors.hub.has_orders - /// - errors.generic.unknown - static String _getMessageFromKey(Translations texts, String key) { - // Parse key like "errors.auth.invalid_credentials" - final parts = key.split('.'); - if (parts.length < 2) return texts.errors.generic.unknown; - - try { - switch (parts[1]) { - case 'auth': - return _getAuthError(texts, parts.length > 2 ? parts[2] : ''); - case 'hub': - return _getHubError(texts, parts.length > 2 ? parts[2] : ''); - case 'order': - return _getOrderError(texts, parts.length > 2 ? parts[2] : ''); - case 'profile': - return _getProfileError(texts, parts.length > 2 ? parts[2] : ''); - case 'shift': - return _getShiftError(texts, parts.length > 2 ? parts[2] : ''); - case 'generic': - return _getGenericError(texts, parts.length > 2 ? parts[2] : ''); - default: - return texts.errors.generic.unknown; - } - } catch (_) { - return texts.errors.generic.unknown; - } - } - - static String _getAuthError(Translations texts, String key) { - switch (key) { - case 'invalid_credentials': - return texts.errors.auth.invalid_credentials; - case 'account_exists': - return texts.errors.auth.account_exists; - case 'session_expired': - return texts.errors.auth.session_expired; - case 'user_not_found': - return texts.errors.auth.user_not_found; - case 'unauthorized_app': - return texts.errors.auth.unauthorized_app; - case 'weak_password': - return texts.errors.auth.weak_password; - case 'sign_up_failed': - return texts.errors.auth.sign_up_failed; - case 'sign_in_failed': - return texts.errors.auth.sign_in_failed; - case 'not_authenticated': - return texts.errors.auth.not_authenticated; - case 'password_mismatch': - return texts.errors.auth.password_mismatch; - case 'google_only_account': - return texts.errors.auth.google_only_account; - default: - return texts.errors.generic.unknown; - } - } - - static String _getHubError(Translations texts, String key) { - switch (key) { - case 'has_orders': - return texts.errors.hub.has_orders; - case 'not_found': - return texts.errors.hub.not_found; - case 'creation_failed': - return texts.errors.hub.creation_failed; - default: - return texts.errors.generic.unknown; - } - } - - static String _getOrderError(Translations texts, String key) { - switch (key) { - case 'missing_hub': - return texts.errors.order.missing_hub; - case 'missing_vendor': - return texts.errors.order.missing_vendor; - case 'creation_failed': - return texts.errors.order.creation_failed; - case 'shift_creation_failed': - return texts.errors.order.shift_creation_failed; - case 'missing_business': - return texts.errors.order.missing_business; - default: - return texts.errors.generic.unknown; - } - } - - static String _getProfileError(Translations texts, String key) { - switch (key) { - case 'staff_not_found': - return texts.errors.profile.staff_not_found; - case 'business_not_found': - return texts.errors.profile.business_not_found; - case 'update_failed': - return texts.errors.profile.update_failed; - default: - return texts.errors.generic.unknown; - } - } - - static String _getShiftError(Translations texts, String key) { - switch (key) { - case 'no_open_roles': - return texts.errors.shift.no_open_roles; - case 'application_not_found': - return texts.errors.shift.application_not_found; - case 'no_active_shift': - return texts.errors.shift.no_active_shift; - default: - return texts.errors.generic.unknown; - } - } - - static String _getGenericError(Translations texts, String key) { - switch (key) { - case 'unknown': - return texts.errors.generic.unknown; - case 'no_connection': - return texts.errors.generic.no_connection; - default: - return texts.errors.generic.unknown; - } - } -} diff --git a/apps/mobile/packages/design_system/lib/src/widgets/ui_step_indicator.dart b/apps/mobile/packages/design_system/lib/src/widgets/ui_step_indicator.dart index 3388098d..c6989e13 100644 --- a/apps/mobile/packages/design_system/lib/src/widgets/ui_step_indicator.dart +++ b/apps/mobile/packages/design_system/lib/src/widgets/ui_step_indicator.dart @@ -8,12 +8,6 @@ import '../ui_icons.dart'; /// This widget shows a series of circular step indicators connected by lines, /// with different visual states for completed, active, and inactive steps. class UiStepIndicator extends StatelessWidget { - /// The list of icons to display for each step. - final List stepIcons; - - /// The index of the currently active step (0-based). - final int currentStep; - /// Creates a [UiStepIndicator]. const UiStepIndicator({ super.key, @@ -21,6 +15,12 @@ class UiStepIndicator extends StatelessWidget { required this.currentStep, }); + /// The list of icons to display for each step. + final List stepIcons; + + /// The index of the currently active step (0-based). + final int currentStep; + @override /// Builds the step indicator UI. Widget build(BuildContext context) { @@ -35,7 +35,7 @@ class UiStepIndicator extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: UiConstants.space2), child: Row( mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(stepIcons.length, (int index) { + children: List.generate(stepIcons.length, (int index) { final bool isActive = index == currentStep; final bool isCompleted = index < currentStep; diff --git a/apps/mobile/packages/design_system/lib/src/widgets/ui_success_snackbar.dart b/apps/mobile/packages/design_system/lib/src/widgets/ui_success_snackbar.dart deleted file mode 100644 index 81855390..00000000 --- a/apps/mobile/packages/design_system/lib/src/widgets/ui_success_snackbar.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -import '../ui_colors.dart'; -import '../ui_typography.dart'; - -/// Centralized success snackbar for consistent success message presentation. -/// -/// This widget provides a unified way to show success feedback across the app -/// with consistent styling and behavior. -/// -/// Usage: -/// ```dart -/// UiSuccessSnackbar.show( -/// context, -/// message: 'Profile updated successfully!', -/// ); -/// ``` -class UiSuccessSnackbar { - /// Shows a success snackbar with a custom message. - /// - /// [message] is the success message to display - /// [duration] controls how long the snackbar is visible - static void show( - BuildContext context, { - required String message, - Duration duration = const Duration(seconds: 3), - }) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Row( - children: [ - Icon(Icons.check_circle_outline, color: UiColors.white), - const SizedBox(width: 12), - Expanded( - child: Text( - message, - style: UiTypography.body2m.copyWith(color: UiColors.white), - ), - ), - ], - ), - backgroundColor: UiColors.success, - behavior: SnackBarBehavior.floating, - duration: duration, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - margin: const EdgeInsets.all(16), - ), - ); - } -} diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart index c820e15c..67594247 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/pages/worker_home_page.dart @@ -104,7 +104,7 @@ class WorkerHomePage extends StatelessWidget { ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Today's Shifts BlocBuilder( @@ -123,9 +123,11 @@ class WorkerHomePage extends StatelessWidget { if (state.status == HomeStatus.loading) const Center( child: SizedBox( - height: 40, - width: 40, - child: CircularProgressIndicator(), + height: UiConstants.space10, + width: UiConstants.space10, + child: CircularProgressIndicator( + color: UiColors.primary, + ), ), ) else if (shifts.isEmpty) @@ -149,7 +151,7 @@ class WorkerHomePage extends StatelessWidget { ); }, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Tomorrow's Shifts BlocBuilder( @@ -177,7 +179,7 @@ class WorkerHomePage extends StatelessWidget { ); }, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Recommended Shifts SectionHeader( @@ -197,7 +199,8 @@ class WorkerHomePage extends StatelessWidget { itemCount: state.recommendedShifts.length, clipBehavior: Clip.none, itemBuilder: (context, index) => Padding( - padding: const EdgeInsets.only(right: 12), + padding: const EdgeInsets.only( + right: UiConstants.space3), child: RecommendedShiftCard( shift: state.recommendedShifts[index], ), @@ -206,7 +209,7 @@ class WorkerHomePage extends StatelessWidget { ); }, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), ], ), ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/home_header.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/home_header.dart index 17127ce5..fd8d9da8 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/home_header.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/home_header.dart @@ -28,23 +28,20 @@ class HomeHeader extends StatelessWidget { spacing: UiConstants.space3, children: [ Container( - width: 48, - height: 48, + width: UiConstants.space12, + height: UiConstants.space12, decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: UiColors.primary.withOpacity(0.2), + color: UiColors.primary.withValues(alpha: 0.2), width: 2, ), ), child: CircleAvatar( - backgroundColor: UiColors.primary.withOpacity(0.1), + backgroundColor: UiColors.primary.withValues(alpha: 0.1), child: Text( initial, - style: const TextStyle( - color: UiColors.primary, - fontWeight: FontWeight.bold, - ), + style: UiTypography.body1b.textPrimary, ), ), ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart index 8d8577ee..1d648bc4 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/placeholder_banner.dart @@ -29,19 +29,19 @@ class PlaceholderBanner extends StatelessWidget { decoration: BoxDecoration( color: bg, borderRadius: BorderRadius.circular(UiConstants.radiusBase), - border: Border.all(color: accent.withOpacity(0.3)), + border: Border.all(color: accent.withValues(alpha: 0.3)), ), child: Row( children: [ Container( - width: 40, - height: 40, + width: UiConstants.space10, + height: UiConstants.space10, padding: const EdgeInsets.all(UiConstants.space2), decoration: const BoxDecoration( color: UiColors.bgBanner, shape: BoxShape.circle, ), - child: Icon(UiIcons.sparkles, color: accent, size: 20), + child: Icon(UiIcons.sparkles, color: accent, size: UiConstants.space5), ), const SizedBox(width: UiConstants.space3), Expanded( diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/quick_action_item.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/quick_action_item.dart index 02271b5b..f89dd510 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/quick_action_item.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/quick_action_item.dart @@ -22,8 +22,8 @@ class QuickActionItem extends StatelessWidget { child: Column( children: [ Container( - width: 64, - height: 64, + width: UiConstants.space16, + height: UiConstants.space16, padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgBanner, @@ -31,13 +31,13 @@ class QuickActionItem extends StatelessWidget { border: Border.all(color: UiColors.bgSecondary), boxShadow: [ BoxShadow( - color: UiColors.foreground.withOpacity(0.05), + color: UiColors.foreground.withValues(alpha: 0.05), blurRadius: 4, offset: const Offset(0, 2), ), ], ), - child: Icon(icon, color: UiColors.primary, size: 24), + child: Icon(icon, color: UiColors.primary, size: UiConstants.space6), ), const SizedBox(height: UiConstants.space2), Text( diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart index e9f9d2c2..e5ead2d2 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/recommended_shift_card.dart @@ -14,8 +14,6 @@ class RecommendedShiftCard extends StatelessWidget { @override Widget build(BuildContext context) { final recI18n = t.staff.home.recommended_card; - final duration = 8; - final totalPay = duration * shift.hourlyRate; return GestureDetector( onTap: () { @@ -23,14 +21,14 @@ class RecommendedShiftCard extends StatelessWidget { }, child: Container( width: 300, - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Colors.black.withValues(alpha: 0.02), + color: UiColors.black.withValues(alpha: 0.02), blurRadius: 4, offset: const Offset(0, 2), ), @@ -45,51 +43,43 @@ class RecommendedShiftCard extends StatelessWidget { children: [ Text( recI18n.act_now, - style: const TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: Color(0xFFDC2626), - ), + style: UiTypography.body3m.copyWith(color: UiColors.textError), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Container( padding: const EdgeInsets.symmetric( - horizontal: 8, + horizontal: UiConstants.space2, vertical: 2, ), decoration: BoxDecoration( - color: const Color(0xFFE8F0FF), - borderRadius: BorderRadius.circular(999), + color: UiColors.tagInProgress, + borderRadius: UiConstants.radiusFull, ), child: Text( recI18n.one_day, - style: const TextStyle( - fontSize: 10, - fontWeight: FontWeight.w500, - color: Color(0xFF0047FF), - ), + style: UiTypography.body3m.textPrimary, ), ), ], ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - width: 44, - height: 44, + width: UiConstants.space10, + height: UiConstants.space10, decoration: BoxDecoration( - color: const Color(0xFFE8F0FF), - borderRadius: BorderRadius.circular(12), + color: UiColors.tagInProgress, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: const Icon( UiIcons.calendar, - color: Color(0xFF0047FF), - size: 20, + color: UiColors.primary, + size: UiConstants.space5, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -97,25 +87,16 @@ class RecommendedShiftCard extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( + Flexible( child: Text( shift.title, - style: const TextStyle( - fontWeight: FontWeight.w600, - fontSize: 16, - color: UiColors.foreground, - ), - maxLines: 1, + style: UiTypography.body1m.textPrimary, overflow: TextOverflow.ellipsis, ), ), Text( - '\$${totalPay.round()}', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: UiColors.foreground, - ), + '\$${shift.hourlyRate}/h', + style: UiTypography.headline4m.textPrimary, ), ], ), @@ -125,17 +106,11 @@ class RecommendedShiftCard extends StatelessWidget { children: [ Text( shift.clientName, - style: const TextStyle( - fontSize: 12, - color: UiColors.mutedForeground, - ), + style: UiTypography.body3r.textSecondary, ), Text( - '\$${shift.hourlyRate.toStringAsFixed(0)}/hr • ${duration}h', - style: const TextStyle( - fontSize: 10, - color: UiColors.mutedForeground, - ), + '\$${shift.hourlyRate.toStringAsFixed(0)}/hr', + style: UiTypography.body3r.textSecondary, ), ], ), @@ -144,57 +119,48 @@ class RecommendedShiftCard extends StatelessWidget { ), ], ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( children: [ const Icon( UiIcons.calendar, - size: 14, + size: UiConstants.space3, color: UiColors.mutedForeground, ), - const SizedBox(width: 4), + const SizedBox(width: UiConstants.space1), Text( recI18n.today, - style: const TextStyle( - fontSize: 12, - color: UiColors.mutedForeground, - ), + style: UiTypography.body3r.textSecondary, ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), const Icon( UiIcons.clock, - size: 14, + size: UiConstants.space3, color: UiColors.mutedForeground, ), - const SizedBox(width: 4), + const SizedBox(width: UiConstants.space1), Text( recI18n.time_range( start: shift.startTime, end: shift.endTime, ), - style: const TextStyle( - fontSize: 12, - color: UiColors.mutedForeground, - ), + style: UiTypography.body3r.textSecondary, ), ], ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Row( children: [ const Icon( UiIcons.mapPin, - size: 14, + size: UiConstants.space3, color: UiColors.mutedForeground, ), - const SizedBox(width: 4), + const SizedBox(width: UiConstants.space1), Expanded( child: Text( shift.locationAddress, - style: const TextStyle( - fontSize: 12, - color: UiColors.mutedForeground, - ), + style: UiTypography.body3r.textSecondary, maxLines: 1, overflow: TextOverflow.ellipsis, ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart index 482ef175..e38da6e4 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/home_page/section_header.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:design_system/design_system.dart'; - /// Section header widget for home page sections, using design system tokens. class SectionHeader extends StatelessWidget { /// Section title @@ -23,43 +22,58 @@ class SectionHeader extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - title, - style: UiTypography.headline4m, - ), - if (action != null) - if (onAction != null) - GestureDetector( - onTap: onAction, - child: Row( - children: [ - Text( - action!, - style: UiTypography.body2m.copyWith(color: UiColors.primary), - ), - const Icon( - UiIcons.chevronRight, - size: 16, - color: UiColors.primary, - ), - ], - ), - ) - else - Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), - decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.08), - borderRadius: BorderRadius.circular(12), - border: Border.all( - color: UiColors.primary.withOpacity(0.2), + Expanded( + child: action != null + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: UiTypography.body2m.textPrimary, + ), + if (onAction != null) + GestureDetector( + onTap: onAction, + child: Row( + children: [ + Text( + action ?? '', + style: UiTypography.body3r.textPrimary, + ), + const Icon( + UiIcons.chevronRight, + size: UiConstants.space4, + color: UiColors.primary, + ), + ], + ), + ) + else + Container( + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space2, + vertical: 2, + ), + decoration: BoxDecoration( + color: UiColors.primary.withValues(alpha: 0.08), + borderRadius: + BorderRadius.circular(UiConstants.radiusBase), + border: Border.all( + color: UiColors.primary.withValues(alpha: 0.2), + ), + ), + child: Text( + action!, + style: UiTypography.body3r.textPrimary, + ), + ), + ], + ) + : Text( + title, + style: UiTypography.body2m.textPrimary, ), - ), - child: Text( - action!, - style: UiTypography.body3r.copyWith(color: UiColors.primary), - ), - ), + ), ], ), ); diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart index 7a5caa37..13a39fb7 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/shift_card.dart @@ -77,15 +77,15 @@ class _ShiftCardState extends State { Modular.to.pushShiftDetails(widget.shift); }, child: Container( - margin: const EdgeInsets.only(bottom: 12), - padding: const EdgeInsets.all(16), + margin: const EdgeInsets.only(bottom: UiConstants.space3), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Colors.black.withValues(alpha: 0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -94,16 +94,17 @@ class _ShiftCardState extends State { child: Row( children: [ Container( - width: 48, - height: 48, + width: UiConstants.space12, + height: UiConstants.space12, decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: UiColors.border), ), child: widget.shift.logoUrl != null ? ClipRRect( - borderRadius: BorderRadius.circular(12), + borderRadius: + BorderRadius.circular(UiConstants.radiusBase), child: Image.network( widget.shift.logoUrl!, fit: BoxFit.contain, @@ -114,7 +115,7 @@ class _ShiftCardState extends State { color: UiColors.mutedForeground, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -125,28 +126,18 @@ class _ShiftCardState extends State { Flexible( child: Text( widget.shift.title, - style: const TextStyle( - fontWeight: FontWeight.w600, - color: UiColors.foreground, - ), + style: UiTypography.body1m.textPrimary, overflow: TextOverflow.ellipsis, ), ), Text.rich( TextSpan( text: '\$${widget.shift.hourlyRate}', - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 16, - color: UiColors.foreground, - ), - children: const [ + style: UiTypography.body1b.textPrimary, + children: [ TextSpan( text: '/h', - style: TextStyle( - fontWeight: FontWeight.normal, - fontSize: 12, - ), + style: UiTypography.body3r, ), ], ), @@ -155,19 +146,13 @@ class _ShiftCardState extends State { ), Text( widget.shift.clientName, - style: const TextStyle( - color: UiColors.mutedForeground, - fontSize: 13, - ), + style: UiTypography.body2r.textSecondary, overflow: TextOverflow.ellipsis, ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( '${_formatTime(widget.shift.startTime)} • ${widget.shift.location}', - style: const TextStyle( - color: UiColors.mutedForeground, - fontSize: 12, - ), + style: UiTypography.body3r.textSecondary, ), ], ), @@ -179,14 +164,14 @@ class _ShiftCardState extends State { } return Container( - margin: const EdgeInsets.only(bottom: 16), + margin: const EdgeInsets.only(bottom: UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Colors.black.withValues(alpha: 0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 4, offset: const Offset(0, 2), ), @@ -195,7 +180,7 @@ class _ShiftCardState extends State { child: Column( children: [ Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), child: Column( children: [ // Header @@ -203,16 +188,17 @@ class _ShiftCardState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( - width: 56, - height: 56, + width: UiConstants.space14, + height: UiConstants.space14, decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: UiColors.border), ), child: widget.shift.logoUrl != null ? ClipRRect( - borderRadius: BorderRadius.circular(12), + borderRadius: + BorderRadius.circular(UiConstants.radiusBase), child: Image.network( widget.shift.logoUrl!, fit: BoxFit.contain, @@ -226,25 +212,21 @@ class _ShiftCardState extends State { ), Container( padding: const EdgeInsets.symmetric( - horizontal: 16, + horizontal: UiConstants.space4, vertical: 6, ), decoration: BoxDecoration( color: UiColors.primary, - borderRadius: BorderRadius.circular(20), + borderRadius: UiConstants.radiusFull, ), child: Text( 'Assigned ${_getTimeAgo(widget.shift.createdDate).replaceAll('Pending ', '')}', - style: const TextStyle( - color: Colors.white, - fontSize: 12, - fontWeight: FontWeight.w600, - ), + style: UiTypography.body3m.white, ), ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Title and Rate Row( @@ -257,18 +239,11 @@ class _ShiftCardState extends State { children: [ Text( widget.shift.title, - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: UiColors.foreground, - ), + style: UiTypography.headline3m.textPrimary, ), Text( widget.shift.clientName, - style: const TextStyle( - color: UiColors.mutedForeground, - fontSize: 14, - ), + style: UiTypography.body2r.textSecondary, ), ], ), @@ -276,30 +251,23 @@ class _ShiftCardState extends State { Text.rich( TextSpan( text: '\$${widget.shift.hourlyRate}', - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 20, - color: UiColors.foreground, - ), - children: const [ + style: UiTypography.headline3m.textPrimary, + children: [ TextSpan( text: '/h', - style: TextStyle( - fontWeight: FontWeight.normal, - fontSize: 16, - ), + style: UiTypography.body1r, ), ], ), ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Location and Date Row( children: [ - const Icon( + Icon( UiIcons.mapPin, size: 16, color: UiColors.mutedForeground, @@ -308,15 +276,12 @@ class _ShiftCardState extends State { Expanded( child: Text( widget.shift.location, - style: const TextStyle( - color: UiColors.mutedForeground, - fontSize: 14, - ), + style: UiTypography.body2r.textSecondary, overflow: TextOverflow.ellipsis, ), ), - const SizedBox(width: 16), - const Icon( + const SizedBox(width: UiConstants.space4), + Icon( UiIcons.calendar, size: 16, color: UiColors.mutedForeground, @@ -324,14 +289,11 @@ class _ShiftCardState extends State { const SizedBox(width: 6), Text( '${_formatDate(widget.shift.date)}, ${_formatTime(widget.shift.startTime)}', - style: const TextStyle( - color: UiColors.mutedForeground, - fontSize: 14, - ), + style: UiTypography.body2r.textSecondary, ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Tags Wrap( @@ -347,13 +309,13 @@ class _ShiftCardState extends State { _buildTag( UiIcons.timer, 'No experience', - const Color(0xFFFEE2E2), - const Color(0xFFDC2626), + UiColors.tagError, + UiColors.textError, ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), ], ), ), @@ -361,46 +323,48 @@ class _ShiftCardState extends State { // Actions if (!widget.compact) Padding( - padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + ), child: Column( children: [ SizedBox( width: double.infinity, - height: 48, + height: UiConstants.space12, child: ElevatedButton( onPressed: widget.onApply, style: ElevatedButton.styleFrom( - backgroundColor: UiColors.foreground, - foregroundColor: Colors.white, + backgroundColor: UiColors.primary, + foregroundColor: UiColors.white, + elevation: 0, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: + BorderRadius.circular(UiConstants.radiusBase), ), ), - child: const Text( - 'Accept shift', - style: TextStyle(fontWeight: FontWeight.w600), - ), + child: const Text('Accept shift'), ), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), SizedBox( width: double.infinity, - height: 48, + height: UiConstants.space12, child: OutlinedButton( onPressed: widget.onDecline, style: OutlinedButton.styleFrom( - foregroundColor: const Color(0xFFEF4444), - side: const BorderSide(color: Color(0xFFFCA5A5)), + foregroundColor: UiColors.destructive, + side: BorderSide( + color: UiColors.destructive.withValues(alpha: 0.3), + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: + BorderRadius.circular(UiConstants.radiusBase), ), ), - child: const Text( - 'Decline shift', - style: TextStyle(fontWeight: FontWeight.w600), - ), + child: const Text('Decline shift'), ), ), + const SizedBox(height: UiConstants.space5), ], ), ), @@ -414,7 +378,7 @@ class _ShiftCardState extends State { padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), decoration: BoxDecoration( color: bg, - borderRadius: BorderRadius.circular(20), + borderRadius: UiConstants.radiusFull, ), child: Row( mainAxisSize: MainAxisSize.min, @@ -424,11 +388,7 @@ class _ShiftCardState extends State { Flexible( child: Text( label, - style: TextStyle( - color: text, - fontSize: 12, - fontWeight: FontWeight.w600, - ), + style: UiTypography.body3m.copyWith(color: text), overflow: TextOverflow.ellipsis, ), ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart index 61cef8f7..c6b35db9 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/auto_match_toggle.dart @@ -18,29 +18,33 @@ class AutoMatchToggle extends StatefulWidget { State createState() => _AutoMatchToggleState(); } -class _AutoMatchToggleState extends State with SingleTickerProviderStateMixin { +class _AutoMatchToggleState extends State + with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { final i18n = t.staff.home.auto_match; - final Color primary = Theme.of(context).colorScheme.primary; return AnimatedContainer( duration: const Duration(milliseconds: 300), - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), gradient: widget.enabled ? LinearGradient( - colors: [primary, primary.withOpacity(0.8)], + colors: [ + UiColors.primary, + UiColors.primary.withValues(alpha: 0.8), + ], begin: Alignment.centerLeft, end: Alignment.centerRight, ) : null, - color: widget.enabled ? null : Colors.white, - border: widget.enabled ? null : Border.all(color: Colors.grey.shade200), + color: widget.enabled ? null : UiColors.white, + border: + widget.enabled ? null : Border.all(color: UiColors.border), boxShadow: widget.enabled ? [ BoxShadow( - color: primary.withOpacity(0.3), + color: UiColors.primary.withValues(alpha: 0.3), blurRadius: 10, offset: const Offset(0, 4), ), @@ -55,36 +59,39 @@ class _AutoMatchToggleState extends State with SingleTickerProv Row( children: [ Container( - width: 40, - height: 40, + width: UiConstants.space10, + height: UiConstants.space10, decoration: BoxDecoration( color: widget.enabled - ? Colors.white.withOpacity(0.2) - : primary.withOpacity(0.1), - borderRadius: BorderRadius.circular(12), + ? UiColors.white.withValues(alpha: 0.2) + : UiColors.primary.withValues(alpha: 0.1), + borderRadius: + BorderRadius.circular(UiConstants.radiusBase), ), child: Icon( UiIcons.zap, - color: widget.enabled ? Colors.white : primary, + color: widget.enabled ? UiColors.white : UiColors.primary, size: 20, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( i18n.title, - style: TextStyle( - fontWeight: FontWeight.bold, - color: widget.enabled ? Colors.white : const Color(0xFF0F172A), + style: UiTypography.body1b.copyWith( + color: widget.enabled + ? UiColors.white + : UiColors.textPrimary, ), ), Text( widget.enabled ? i18n.finding_shifts : i18n.get_matched, - style: TextStyle( - fontSize: 12, - color: widget.enabled ? const Color(0xFFF8E08E) : Colors.grey.shade500, + style: UiTypography.body3r.copyWith( + color: widget.enabled + ? UiColors.accent + : UiColors.textInactive, ), ), ], @@ -94,10 +101,10 @@ class _AutoMatchToggleState extends State with SingleTickerProv Switch( value: widget.enabled, onChanged: widget.onToggle, - activeThumbColor: Colors.white, - activeTrackColor: Colors.white.withValues(alpha: 0.3), - inactiveThumbColor: Colors.white, - inactiveTrackColor: Colors.grey.shade300, + activeThumbColor: UiColors.white, + activeTrackColor: UiColors.white.withValues(alpha: 0.3), + inactiveThumbColor: UiColors.white, + inactiveTrackColor: UiColors.border, ), ], ), @@ -107,20 +114,19 @@ class _AutoMatchToggleState extends State with SingleTickerProv ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Container( height: 1, - color: Colors.white.withValues(alpha: 0.2), + color: UiColors.white.withValues(alpha: 0.2), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( i18n.matching_based_on, - style: const TextStyle( - color: Color(0xFFF8E08E), - fontSize: 12, + style: UiTypography.body3r.copyWith( + color: UiColors.accent, ), ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Wrap( spacing: 8, children: [ @@ -145,17 +151,17 @@ class _AutoMatchToggleState extends State with SingleTickerProv return Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.2), - borderRadius: BorderRadius.circular(8), + color: UiColors.white.withValues(alpha: 0.2), + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Icon(icon, size: 12, color: Colors.white), + Icon(icon, size: 12, color: UiColors.white), const SizedBox(width: 4), Text( label, - style: const TextStyle(color: Colors.white, fontSize: 12), + style: UiTypography.body3r.white, ), ], ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart index 9a475c22..886a44e4 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/benefits_widget.dart @@ -16,14 +16,14 @@ class BenefitsWidget extends StatelessWidget { Widget build(BuildContext context) { final i18n = t.staff.home.benefits; return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(16), - border: Border.all(color: Theme.of(context).dividerColor), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Theme.of(context).colorScheme.onBackground.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -36,7 +36,7 @@ class BenefitsWidget extends StatelessWidget { children: [ Text( i18n.title, - style: Theme.of(context).textTheme.titleMedium, + style: UiTypography.title1m.textPrimary, ), GestureDetector( onTap: () => Modular.to.pushNamed('/benefits'), @@ -44,19 +44,19 @@ class BenefitsWidget extends StatelessWidget { children: [ Text( i18n.view_all, - style: Theme.of(context).textTheme.labelLarge?.copyWith(color: Theme.of(context).colorScheme.primary), + style: UiTypography.buttonL.textPrimary, ), Icon( UiIcons.chevronRight, - size: 16, - color: Theme.of(context).colorScheme.primary, + size: UiConstants.space4, + color: UiColors.primary, ), ], ), ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -64,19 +64,19 @@ class BenefitsWidget extends StatelessWidget { label: i18n.items.sick_days, current: 10, total: 40, - color: Theme.of(context).colorScheme.primary, + color: UiColors.primary, ), _BenefitItem( label: i18n.items.vacation, current: 40, total: 40, - color: Theme.of(context).colorScheme.primary, + color: UiColors.primary, ), _BenefitItem( label: i18n.items.holidays, current: 24, total: 24, - color: Theme.of(context).colorScheme.primary, + color: UiColors.primary, ), ], ), @@ -105,13 +105,13 @@ class _BenefitItem extends StatelessWidget { return Column( children: [ SizedBox( - width: 56, - height: 56, + width: UiConstants.space14, + height: UiConstants.space14, child: CustomPaint( painter: _CircularProgressPainter( progress: current / total, color: color, - backgroundColor: const Color(0xFFE5E7EB), + backgroundColor: UiColors.border, strokeWidth: 4, ), child: Center( @@ -120,32 +120,21 @@ class _BenefitItem extends StatelessWidget { children: [ Text( '${current.toInt()}/${total.toInt()}', - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: Color(0xFF1E293B), - ), + style: UiTypography.body3m.textPrimary, ), Text( i18n.hours_label, - style: const TextStyle( - fontSize: 8, - color: Color(0xFF94A3B8), - ), + style: UiTypography.footnote1r.textTertiary, ), ], ), ), ), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( label, - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: Color(0xFF475569), - ), + style: UiTypography.body3m.textSecondary, ), ], ); diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/improve_yourself_widget.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/improve_yourself_widget.dart index 91d3d4af..dd2cf77a 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/improve_yourself_widget.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/improve_yourself_widget.dart @@ -1,3 +1,4 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:core_localization/core_localization.dart'; @@ -32,9 +33,9 @@ class ImproveYourselfWidget extends StatelessWidget { children: [ Text( i18n.title, - style: Theme.of(context).textTheme.titleMedium, + style: UiTypography.title1m.textPrimary, ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), SingleChildScrollView( scrollDirection: Axis.horizontal, clipBehavior: Clip.none, @@ -51,14 +52,14 @@ class ImproveYourselfWidget extends StatelessWidget { onTap: () => Modular.to.pushNamed(item['page']!), child: Container( width: 160, - margin: const EdgeInsets.only(right: 12), + margin: const EdgeInsets.only(right: UiConstants.space3), decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(16), - border: Border.all(color: Theme.of(context).dividerColor), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Theme.of(context).colorScheme.onBackground.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -69,36 +70,33 @@ class ImproveYourselfWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 96, + height: UiConstants.space24, width: double.infinity, child: Image.network( item['image']!, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) => Container( - color: Theme.of(context).colorScheme.surfaceVariant, - child: const Icon( - Icons.image_not_supported, - color: Colors.grey, + color: UiColors.background, + child: Icon( + UiIcons.zap, + color: UiColors.mutedForeground, ), ), ), ), Padding( - padding: const EdgeInsets.all(12), + padding: const EdgeInsets.all(UiConstants.space3), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( item['title']!, - style: Theme.of(context).textTheme.titleSmall, + style: UiTypography.body1m.textPrimary, ), const SizedBox(height: 2), Text( item['description']!, - style: const TextStyle( - fontSize: 12, - color: Color(0xFF64748B), - ), + style: UiTypography.body3r.textSecondary, maxLines: 2, overflow: TextOverflow.ellipsis, ), diff --git a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/more_ways_widget.dart b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/more_ways_widget.dart index 947e2be9..70949197 100644 --- a/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/more_ways_widget.dart +++ b/apps/mobile/packages/features/staff/home/lib/src/presentation/widgets/worker/more_ways_widget.dart @@ -1,8 +1,8 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:core_localization/core_localization.dart'; - /// Widget for displaying more ways to use Krow, using design system tokens. class MoreWaysToUseKrowWidget extends StatelessWidget { /// Creates a [MoreWaysToUseKrowWidget]. @@ -31,9 +31,9 @@ class MoreWaysToUseKrowWidget extends StatelessWidget { children: [ Text( i18n.title, - style: Theme.of(context).textTheme.titleMedium, + style: UiTypography.title1m.textPrimary, ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), SingleChildScrollView( scrollDirection: Axis.horizontal, clipBehavior: Clip.none, @@ -50,14 +50,14 @@ class MoreWaysToUseKrowWidget extends StatelessWidget { onTap: () => Modular.to.pushNamed(item['page']!), child: Container( width: 160, - margin: const EdgeInsets.only(right: 12), + margin: const EdgeInsets.only(right: UiConstants.space3), decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(16), - border: Border.all(color: Theme.of(context).dividerColor), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Theme.of(context).colorScheme.onBackground.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -68,25 +68,25 @@ class MoreWaysToUseKrowWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 96, + height: UiConstants.space24, width: double.infinity, child: Image.network( item['image']!, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) => Container( - color: Theme.of(context).colorScheme.surfaceVariant, - child: const Icon( - Icons.image_not_supported, - color: Colors.grey, + color: UiColors.background, + child: Icon( + UiIcons.zap, + color: UiColors.mutedForeground, ), ), ), ), Padding( - padding: const EdgeInsets.all(12), + padding: const EdgeInsets.all(UiConstants.space3), child: Text( item['title']!, - style: Theme.of(context).textTheme.titleSmall, + style: UiTypography.body1m.textPrimary, ), ), ], From bcd973cf64fa5e54a3902ee1f61a75f0c9add95e Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 16:32:03 -0500 Subject: [PATCH 8/9] refactor: Update pubspec.yaml files and remove unnecessary background color in PaymentsPage for consistency --- apps/mobile/NEXT_SPRINT_TASKS.md | 3 ++- .../packages/features/staff/home/pubspec.yaml | 20 ++++++++--------- .../src/presentation/pages/payments_page.dart | 1 - .../features/staff/payments/pubspec.yaml | 22 +++++++++---------- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/apps/mobile/NEXT_SPRINT_TASKS.md b/apps/mobile/NEXT_SPRINT_TASKS.md index 790e32cf..3647bdd5 100644 --- a/apps/mobile/NEXT_SPRINT_TASKS.md +++ b/apps/mobile/NEXT_SPRINT_TASKS.md @@ -50,4 +50,5 @@ - How do we handle the current bank account verifcaiton in the current legacy application. - We need have a show a list of clothing items in the staff app -> shift page. -- Template models for the pdf reports in the client and web apps. \ No newline at end of file +- Template models for the pdf reports in the client and web apps. +- remove `any` type and replace it with the correct types in the codebase. \ No newline at end of file diff --git a/apps/mobile/packages/features/staff/home/pubspec.yaml b/apps/mobile/packages/features/staff/home/pubspec.yaml index 3898f63e..e4e1225d 100644 --- a/apps/mobile/packages/features/staff/home/pubspec.yaml +++ b/apps/mobile/packages/features/staff/home/pubspec.yaml @@ -5,19 +5,10 @@ publish_to: none resolution: workspace environment: - sdk: '>=3.10.0 <4.0.0' + sdk: ">=3.10.0 <4.0.0" flutter: ">=3.0.0" dependencies: - flutter: - sdk: flutter - flutter_bloc: ^8.1.0 - bloc: ^8.1.0 - flutter_modular: ^6.3.0 - equatable: ^2.0.5 - intl: ^0.20.0 - google_fonts: ^7.0.0 - # Architecture Packages design_system: path: ../../../design_system @@ -31,6 +22,15 @@ dependencies: path: ../shifts krow_data_connect: path: ../../../data_connect + + flutter: + sdk: flutter + flutter_bloc: ^8.1.0 + bloc: ^8.1.0 + flutter_modular: ^6.3.0 + equatable: ^2.0.5 + intl: ^0.20.0 + google_fonts: ^7.0.0 firebase_data_connect: dev_dependencies: diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart index d8c16d86..7801eed1 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart @@ -33,7 +33,6 @@ class _PaymentsPageState extends State { return BlocProvider.value( value: _bloc, child: Scaffold( - backgroundColor: const Color(0xFFF8FAFC), body: BlocBuilder( builder: (BuildContext context, PaymentsState state) { if (state is PaymentsLoading) { diff --git a/apps/mobile/packages/features/staff/payments/pubspec.yaml b/apps/mobile/packages/features/staff/payments/pubspec.yaml index 3712abe6..44ba5aa6 100644 --- a/apps/mobile/packages/features/staff/payments/pubspec.yaml +++ b/apps/mobile/packages/features/staff/payments/pubspec.yaml @@ -1,23 +1,14 @@ name: staff_payments description: Staff Payments feature version: 0.0.1 -publish_to: 'none' +publish_to: "none" resolution: workspace environment: - sdk: '>=3.10.0 <4.0.0' + sdk: ">=3.10.0 <4.0.0" flutter: ">=3.0.0" dependencies: - flutter: - sdk: flutter - firebase_data_connect: ^0.2.2+2 - firebase_auth: ^6.1.4 - flutter_modular: ^6.3.2 - lucide_icons: ^0.257.0 - intl: ^0.20.0 - fl_chart: ^0.66.0 - # Internal packages design_system: path: ../../../design_system @@ -30,10 +21,17 @@ dependencies: krow_data_connect: path: ../../../data_connect + flutter: + sdk: flutter + firebase_data_connect: ^0.2.2+2 + firebase_auth: ^6.1.4 + flutter_modular: ^6.3.2 + lucide_icons: ^0.257.0 + intl: ^0.20.0 + fl_chart: ^0.66.0 flutter_bloc: any equatable: any dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^6.0.0 - \ No newline at end of file From 4c38013c1053336b551207d643f6100fde8ea037 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 10 Feb 2026 17:17:56 -0500 Subject: [PATCH 9/9] Standardize UI to design system tokens Refactor multiple UI components to use design system tokens and primitives. Added new UiIcons (coffee, wifi, xCircle, ban) and typography color getters (primary, accent). Replaced hardcoded paddings, spacings, radii, borderRadius, and icon imports (lucide_icons -> UiIcons) with UiConstants, UiColors, UiTypography and UiIcons, and switched to UiColors.withValues for opacity. Changes apply across authentication, availability, clock_in (and its widgets), commute tracker, lunch break modal, location map placeholder, attendance card, date selector, and related presentation files to improve visual consistency. --- .../design_system/lib/src/ui_icons.dart | 12 + .../design_system/lib/src/ui_typography.dart | 6 + .../presentation/pages/get_started_page.dart | 7 +- .../get_started_background.dart | 10 +- .../presentation/pages/availability_page.dart | 54 +- .../src/presentation/pages/clock_in_page.dart | 165 +++--- .../presentation/widgets/attendance_card.dart | 17 +- .../presentation/widgets/commute_tracker.dart | 83 +-- .../presentation/widgets/date_selector.dart | 11 +- .../widgets/location_map_placeholder.dart | 31 +- .../widgets/lunch_break_modal.dart | 317 +++++----- .../widgets/swipe_to_check_in.dart | 37 +- .../src/presentation/pages/payments_page.dart | 177 +++--- .../presentation/widgets/earnings_graph.dart | 39 +- .../widgets/payment_history_item.dart | 94 ++- .../widgets/payment_stats_card.dart | 26 +- .../widgets/pending_pay_card.dart | 63 +- .../pages/staff_profile_page.dart | 35 +- .../language_selector_bottom_sheet.dart | 31 +- .../presentation/widgets/logout_button.dart | 23 +- .../presentation/widgets/profile_header.dart | 48 +- .../widgets/profile_menu_item.dart | 31 +- .../widgets/reliability_score_bar.dart | 22 +- .../widgets/reliability_stats_card.dart | 31 +- .../presentation/widgets/section_title.dart | 9 +- .../presentation/pages/certificates_page.dart | 6 +- .../widgets/add_certificate_card.dart | 21 +- .../widgets/certificate_card.dart | 73 ++- .../widgets/certificate_upload_modal.dart | 78 ++- .../widgets/certificates_header.dart | 51 +- .../presentation/pages/documents_page.dart | 16 +- .../presentation/widgets/document_card.dart | 39 +- .../widgets/documents_progress_card.dart | 10 +- .../src/presentation/pages/form_i9_page.dart | 246 ++++---- .../src/presentation/pages/form_w4_page.dart | 316 +++++----- .../presentation/pages/tax_forms_page.dart | 45 +- .../presentation/pages/bank_account_page.dart | 29 +- .../widgets/add_account_form.dart | 10 +- .../presentation/pages/time_card_page.dart | 4 +- .../presentation/widgets/timesheet_card.dart | 24 +- .../src/presentation/pages/attire_page.dart | 4 +- .../widgets/attire_info_card.dart | 12 +- .../pages/emergency_contact_screen.dart | 10 +- .../widgets/emergency_contact_add_button.dart | 6 +- .../widgets/emergency_contact_form_item.dart | 89 ++- .../emergency_contact_info_banner.dart | 8 +- .../emergency_contact_save_button.dart | 11 +- .../presentation/pages/experience_page.dart | 71 ++- .../pages/personal_info_page.dart | 12 +- .../widgets/personal_info_form.dart | 10 +- .../widgets/profile_photo_widget.dart | 13 +- .../pages/shift_details_page.dart | 549 ++++++++++-------- .../src/presentation/pages/shifts_page.dart | 73 +-- .../presentation/widgets/my_shift_card.dart | 58 +- .../widgets/shift_assignment_card.dart | 104 ++-- .../widgets/tabs/find_shifts_tab.dart | 70 ++- .../widgets/tabs/history_shifts_tab.dart | 8 +- .../widgets/tabs/my_shifts_tab.dart | 198 +++---- 58 files changed, 1821 insertions(+), 1832 deletions(-) diff --git a/apps/mobile/packages/design_system/lib/src/ui_icons.dart b/apps/mobile/packages/design_system/lib/src/ui_icons.dart index 68d101e8..829553e9 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_icons.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_icons.dart @@ -237,4 +237,16 @@ class UiIcons { /// Timer icon static const IconData timer = _IconLib.timer; + + /// Coffee icon for breaks + static const IconData coffee = _IconLib.coffee; + + /// Wifi icon for NFC check-in + static const IconData wifi = _IconLib.wifi; + + /// X Circle icon for no-shows + static const IconData xCircle = _IconLib.xCircle; + + /// Ban icon for cancellations + static const IconData ban = _IconLib.ban; } diff --git a/apps/mobile/packages/design_system/lib/src/ui_typography.dart b/apps/mobile/packages/design_system/lib/src/ui_typography.dart index ed823b5e..6d33312b 100644 --- a/apps/mobile/packages/design_system/lib/src/ui_typography.dart +++ b/apps/mobile/packages/design_system/lib/src/ui_typography.dart @@ -579,4 +579,10 @@ extension TypographyColors on TextStyle { /// Active content color TextStyle get activeContentColor => copyWith(color: UiColors.textPrimary); + + /// Primary color + TextStyle get primary => copyWith(color: UiColors.primary); + + /// Accent color + TextStyle get accent => copyWith(color: UiColors.accent); } diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/get_started_page.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/get_started_page.dart index 35750c80..fd65b050 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/get_started_page.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/get_started_page.dart @@ -1,3 +1,4 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; @@ -36,7 +37,7 @@ class GetStartedPage extends StatelessWidget { // Content Overlay Padding( - padding: const EdgeInsets.all(24.0), + padding: const EdgeInsets.all(UiConstants.space6), child: Column( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.stretch, @@ -44,7 +45,7 @@ class GetStartedPage extends StatelessWidget { // Main text and actions const GetStartedHeader(), - const SizedBox(height: 48), + const SizedBox(height: UiConstants.space10), // Actions GetStartedActions( @@ -52,7 +53,7 @@ class GetStartedPage extends StatelessWidget { onLoginPressed: onLoginPressed, ), - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), ], ), ), diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart index 7c370683..1c36e3a8 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/get_started_page/get_started_background.dart @@ -8,7 +8,7 @@ class GetStartedBackground extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), // Logo Image.asset(UiImageAssets.logoBlue, height: 40), Expanded( @@ -18,9 +18,9 @@ class GetStartedBackground extends StatelessWidget { height: 288, decoration: BoxDecoration( shape: BoxShape.circle, - color: const Color(0xFF3A4A5A).withOpacity(0.05), + color: UiColors.bgSecondary.withValues(alpha: 0.5), ), - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(UiConstants.space2), child: ClipOval( child: Image.network( 'https://images.unsplash.com/photo-1577219491135-ce391730fb2c?w=400&h=400&fit=crop&crop=faces', @@ -50,7 +50,7 @@ class GetStartedBackground extends StatelessWidget { width: 8, height: 8, decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.2), + color: UiColors.primary.withValues(alpha: 0.2), borderRadius: BorderRadius.circular(4), ), ), @@ -59,7 +59,7 @@ class GetStartedBackground extends StatelessWidget { width: 8, height: 8, decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.2), + color: UiColors.primary.withValues(alpha: 0.2), borderRadius: BorderRadius.circular(4), ), ), diff --git a/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart b/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart index c07e0307..53e84cbc 100644 --- a/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart +++ b/apps/mobile/packages/features/staff/availability/lib/src/presentation/pages/availability_page.dart @@ -79,10 +79,12 @@ class _AvailabilityPageState extends State { child: Column( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, - spacing: 24, + spacing: UiConstants.space6, children: [ _buildQuickSet(context), _buildWeekNavigation(context, state), @@ -119,10 +121,10 @@ class _AvailabilityPageState extends State { Widget _buildQuickSet(BuildContext context) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.primary.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -131,19 +133,19 @@ class _AvailabilityPageState extends State { 'Quick Set Availability', style: UiTypography.body2b, ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( children: [ Expanded(child: _buildQuickSetButton(context, 'All Week', 'all')), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Expanded( child: _buildQuickSetButton(context, 'Weekdays', 'weekdays'), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Expanded( child: _buildQuickSetButton(context, 'Weekends', 'weekends'), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Expanded( child: _buildQuickSetButton( context, @@ -179,7 +181,7 @@ class _AvailabilityPageState extends State { ), backgroundColor: UiColors.transparent, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), foregroundColor: isDestructive ? UiColors.destructive @@ -201,17 +203,17 @@ class _AvailabilityPageState extends State { final monthYear = DateFormat('MMMM yyyy').format(middleDate); return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.cardViewBackground, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Column( children: [ // Nav Header Padding( - padding: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.only(bottom: UiConstants.space4), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -275,12 +277,12 @@ class _AvailabilityPageState extends State { onTap: () => context.read().add(SelectDate(day.date)), child: Container( margin: const EdgeInsets.symmetric(horizontal: 2), - padding: const EdgeInsets.symmetric(vertical: 12), + padding: const EdgeInsets.symmetric(vertical: UiConstants.space3), decoration: BoxDecoration( color: isSelected ? UiColors.primary : (isAvailable ? UiColors.tagSuccess : UiColors.bgSecondary), - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all( color: isSelected ? UiColors.primary @@ -346,10 +348,10 @@ class _AvailabilityPageState extends State { final isAvailable = day.isAvailable; return Container( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), decoration: BoxDecoration( color: UiColors.cardViewBackground, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Column( @@ -380,7 +382,7 @@ class _AvailabilityPageState extends State { ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Time Slots (only from Domain) ...day.slots.map((slot) { @@ -464,11 +466,11 @@ class _AvailabilityPageState extends State { : null, child: AnimatedContainer( duration: const Duration(milliseconds: 200), - margin: const EdgeInsets.only(bottom: 12), - padding: const EdgeInsets.all(16), + margin: const EdgeInsets.only(bottom: UiConstants.space3), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: bgColor, - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: borderColor, width: 2), ), child: Row( @@ -479,7 +481,7 @@ class _AvailabilityPageState extends State { height: 40, decoration: BoxDecoration( color: uiConfig['bg'], - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: Icon( uiConfig['icon'], @@ -487,7 +489,7 @@ class _AvailabilityPageState extends State { size: 20, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), // Text Expanded( child: Column( @@ -539,20 +541,20 @@ class _AvailabilityPageState extends State { Widget _buildInfoCard() { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.primary.withValues(alpha: 0.05), - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, - spacing: 12, + spacing: UiConstants.space3, children: [ const Icon(UiIcons.clock, size: 20, color: UiColors.primary), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - spacing: 4, + spacing: UiConstants.space1, children: [ Text( 'Auto-Match uses your availability', diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart index 29df8a28..0164b396 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart @@ -4,7 +4,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:intl/intl.dart'; import 'package:krow_domain/krow_domain.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import '../bloc/clock_in_bloc.dart'; import '../bloc/clock_in_event.dart'; @@ -84,7 +83,9 @@ class _ClockInPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -103,12 +104,13 @@ class _ClockInPageState extends State { // Date Selector DateSelector( selectedDate: state.selectedDate, - onSelect: (DateTime date) => _bloc.add(DateSelected(date)), + onSelect: (DateTime date) => + _bloc.add(DateSelected(date)), shiftDates: [ DateFormat('yyyy-MM-dd').format(DateTime.now()), ], ), - const SizedBox(height: 20), + const SizedBox(height: UiConstants.space5), // Your Activity Header Text( @@ -117,7 +119,7 @@ class _ClockInPageState extends State { style: UiTypography.headline4m, ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Selected Shift Info Card if (todayShifts.isNotEmpty) @@ -128,14 +130,16 @@ class _ClockInPageState extends State { onTap: () => _bloc.add(ShiftSelected(shift)), child: Container( - padding: const EdgeInsets.all(12), - margin: - const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all( + UiConstants.space3, + ), + margin: const EdgeInsets.only( + bottom: UiConstants.space3, + ), decoration: BoxDecoration( color: UiColors.white, - borderRadius: BorderRadius.circular( - 12, - ), + borderRadius: + UiConstants.radiusLg, border: Border.all( color: shift.id == selectedShift?.id @@ -211,39 +215,41 @@ class _ClockInPageState extends State { ), // Swipe To Check In / Checked Out State / No Shift State - if (selectedShift != null && checkOutTime == null) ...[ - if (!isCheckedIn && - !_isCheckInAllowed(selectedShift)) - Container( - width: double.infinity, - padding: const EdgeInsets.all(24), - decoration: BoxDecoration( - color: UiColors.bgSecondary, - borderRadius: BorderRadius.circular(16), - ), - child: Column( - children: [ - const Icon( - LucideIcons.clock, - size: 48, - color: UiColors.iconThird, - ), - const SizedBox(height: 16), - Text( - "You're early!", - style: UiTypography.body1m.textSecondary, - ), - const SizedBox(height: 4), - Text( - "Check-in available at ${_getCheckInAvailabilityTime(selectedShift)}", - style: UiTypography.body2r.textSecondary, - textAlign: TextAlign.center, - ), - ], - ), - ) - else - SwipeToCheckIn( + if (selectedShift != null && + checkOutTime == null) ...[ + if (!isCheckedIn && + !_isCheckInAllowed(selectedShift)) + Container( + width: double.infinity, + padding: + const EdgeInsets.all(UiConstants.space6), + decoration: BoxDecoration( + color: UiColors.bgSecondary, + borderRadius: UiConstants.radiusLg, + ), + child: Column( + children: [ + const Icon( + UiIcons.clock, + size: 48, + color: UiColors.iconThird, + ), + const SizedBox(height: UiConstants.space4), + Text( + "You're early!", + style: UiTypography.body1m.textSecondary, + ), + const SizedBox(height: UiConstants.space1), + Text( + "Check-in available at ${_getCheckInAvailabilityTime(selectedShift)}", + style: UiTypography.body2r.textSecondary, + textAlign: TextAlign.center, + ), + ], + ), + ) + else + SwipeToCheckIn( isCheckedIn: isCheckedIn, mode: state.checkInMode, isLoading: @@ -264,14 +270,17 @@ class _ClockInPageState extends State { onCheckOut: () { showDialog( context: context, - builder: (BuildContext context) => LunchBreakDialog( - onComplete: () { - Navigator.of( - context, - ).pop(); // Close dialog first - _bloc.add(const CheckOutRequested()); - }, - ), + builder: (BuildContext context) => + LunchBreakDialog( + onComplete: () { + Navigator.of( + context, + ).pop(); // Close dialog first + _bloc.add( + const CheckOutRequested(), + ); + }, + ), ); }, ), @@ -279,12 +288,14 @@ class _ClockInPageState extends State { checkOutTime != null) ...[ // Shift Completed State Container( - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.all(UiConstants.space6), decoration: BoxDecoration( color: UiColors.tagSuccess, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all( - color: UiColors.success.withValues(alpha: 0.3), + color: UiColors.success.withValues( + alpha: 0.3, + ), ), ), child: Column( @@ -297,17 +308,17 @@ class _ClockInPageState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.check, + UiIcons.check, color: UiColors.textSuccess, size: 24, ), ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Text( "Shift Completed!", style: UiTypography.body1b.textSuccess, ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( "Great work today", style: UiTypography.body2r.textSuccess, @@ -319,10 +330,10 @@ class _ClockInPageState extends State { // No Shift State Container( width: double.infinity, - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.all(UiConstants.space6), decoration: BoxDecoration( color: UiColors.bgSecondary, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, ), child: Column( children: [ @@ -331,7 +342,7 @@ class _ClockInPageState extends State { style: UiTypography.body1m.textSecondary, textAlign: TextAlign.center, ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( "Accept a shift to clock in", style: UiTypography.body2r.textSecondary, @@ -344,14 +355,16 @@ class _ClockInPageState extends State { // Checked In Banner if (isCheckedIn && checkInTime != null) ...[ - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Container( - padding: const EdgeInsets.all(12), + padding: const EdgeInsets.all(UiConstants.space3), decoration: BoxDecoration( color: UiColors.tagSuccess, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, border: Border.all( - color: UiColors.success.withValues(alpha: 0.3), + color: UiColors.success.withValues( + alpha: 0.3, + ), ), ), child: Row( @@ -382,7 +395,7 @@ class _ClockInPageState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.check, + UiIcons.check, color: UiColors.textSuccess, ), ), @@ -419,10 +432,10 @@ class _ClockInPageState extends State { child: GestureDetector( onTap: () => _bloc.add(CheckInModeChanged(value)), child: Container( - padding: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(vertical: UiConstants.space2), decoration: BoxDecoration( color: isSelected ? UiColors.white : UiColors.transparent, - borderRadius: BorderRadius.circular(8), + borderRadius: UiConstants.radiusMd, boxShadow: isSelected ? [ BoxShadow( @@ -476,21 +489,23 @@ class _ClockInPageState extends State { width: 96, height: 96, decoration: BoxDecoration( - color: scanned ? UiColors.tagSuccess : UiColors.tagInProgress, + color: scanned + ? UiColors.tagSuccess + : UiColors.tagInProgress, shape: BoxShape.circle, ), child: Icon( - scanned ? LucideIcons.check : LucideIcons.nfc, + scanned ? UiIcons.check : UiIcons.nfc, size: 48, color: scanned ? UiColors.textSuccess : UiColors.primary, ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Text( scanned ? 'Processing check-in...' : 'Ready to scan', style: UiTypography.headline4m, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( scanned ? 'Please wait...' @@ -499,7 +514,7 @@ class _ClockInPageState extends State { style: UiTypography.body2r.textSecondary, ), if (!scanned) ...[ - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), SizedBox( width: double.infinity, height: 56, @@ -520,7 +535,7 @@ class _ClockInPageState extends State { // But this dialog is just a function call. // It's safer to just return a result }, - icon: const Icon(LucideIcons.nfc, size: 24), + icon: const Icon(UiIcons.nfc, size: 24), label: Text( 'Tap to Scan', style: UiTypography.headline4m.white, @@ -529,7 +544,7 @@ class _ClockInPageState extends State { backgroundColor: UiColors.primary, foregroundColor: UiColors.white, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), ), ), diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart index adc955bb..fc187fdb 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/attendance_card.dart @@ -1,6 +1,5 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; enum AttendanceType { checkin, checkout, breaks, days } @@ -24,10 +23,10 @@ class AttendanceCard extends StatelessWidget { final _AttendanceStyle styles = _getStyles(type); return Container( - padding: const EdgeInsets.all(12), + padding: const EdgeInsets.all(UiConstants.space3), decoration: BoxDecoration( color: UiColors.white, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.bgSecondary), boxShadow: [ BoxShadow( @@ -46,11 +45,11 @@ class AttendanceCard extends StatelessWidget { height: 32, decoration: BoxDecoration( color: styles.bgColor, - borderRadius: BorderRadius.circular(8), + borderRadius: UiConstants.radiusMd, ), child: Icon(styles.icon, size: 16, color: styles.iconColor), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( title, style: UiTypography.titleUppercase4m.textSecondary, @@ -86,25 +85,25 @@ class AttendanceCard extends StatelessWidget { switch (type) { case AttendanceType.checkin: return _AttendanceStyle( - icon: LucideIcons.logIn, + icon: UiIcons.logIn, bgColor: UiColors.primary.withValues(alpha: 0.1), iconColor: UiColors.primary, ); case AttendanceType.checkout: return _AttendanceStyle( - icon: LucideIcons.logOut, + icon: UiIcons.logOut, bgColor: UiColors.foreground.withValues(alpha: 0.1), iconColor: UiColors.foreground, ); case AttendanceType.breaks: return _AttendanceStyle( - icon: LucideIcons.coffee, + icon: UiIcons.coffee, bgColor: UiColors.accent.withValues(alpha: 0.2), iconColor: UiColors.accentForeground, ); case AttendanceType.days: return _AttendanceStyle( - icon: LucideIcons.calendar, + icon: UiIcons.calendar, bgColor: UiColors.success.withValues(alpha: 0.1), iconColor: UiColors.textSuccess, ); diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart index 65474125..e251b6cb 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/commute_tracker.dart @@ -1,7 +1,6 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:krow_domain/krow_domain.dart'; -import 'package:lucide_icons/lucide_icons.dart'; enum CommuteMode { lockedNoShift, @@ -158,8 +157,8 @@ class _CommuteTrackerState extends State { Widget _buildConsentCard() { return Container( - margin: const EdgeInsets.only(bottom: 20), - padding: const EdgeInsets.all(12), + margin: const EdgeInsets.only(bottom: UiConstants.space5), + padding: const EdgeInsets.all(UiConstants.space3), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, @@ -169,7 +168,7 @@ class _CommuteTrackerState extends State { UiColors.primary.withValues(alpha: 0.1), ], ), - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: UiColors.black.withValues(alpha: 0.05), @@ -192,12 +191,12 @@ class _CommuteTrackerState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.mapPin, + UiIcons.mapPin, size: 16, color: UiColors.white, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -206,7 +205,7 @@ class _CommuteTrackerState extends State { 'Enable Commute Tracking?', style: UiTypography.body2m.textPrimary, ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( 'Share location 1hr before shift so your manager can see you\'re on the way.', style: UiTypography.body4r.textSecondary, @@ -216,7 +215,7 @@ class _CommuteTrackerState extends State { ), ], ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( children: [ Expanded( @@ -225,13 +224,15 @@ class _CommuteTrackerState extends State { setState(() => _localHasConsent = false); }, style: OutlinedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space2, + ), side: const BorderSide(color: UiColors.border), ), child: Text('Not Now', style: UiTypography.footnote1m), ), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Expanded( child: ElevatedButton( onPressed: () { @@ -239,7 +240,9 @@ class _CommuteTrackerState extends State { }, style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - padding: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space2, + ), ), child: Text( 'Enable', @@ -256,11 +259,11 @@ class _CommuteTrackerState extends State { Widget _buildPreShiftCard() { return Container( - margin: const EdgeInsets.only(bottom: 20), - padding: const EdgeInsets.all(12), + margin: const EdgeInsets.only(bottom: UiConstants.space5), + padding: const EdgeInsets.all(UiConstants.space3), decoration: BoxDecoration( color: UiColors.white, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: UiColors.black.withValues(alpha: 0.05), @@ -279,12 +282,12 @@ class _CommuteTrackerState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.navigation, + UiIcons.navigation, size: 16, color: UiColors.textSecondary, ), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -295,11 +298,11 @@ class _CommuteTrackerState extends State { 'On My Way', style: UiTypography.body2m.textPrimary, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Row( children: [ const Icon( - LucideIcons.clock, + UiIcons.clock, size: 12, color: UiColors.textInactive, ), @@ -351,7 +354,7 @@ class _CommuteTrackerState extends State { Expanded( child: Center( child: Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -370,7 +373,7 @@ class _CommuteTrackerState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.navigation, + UiIcons.navigation, size: 48, color: UiColors.white, ), @@ -382,12 +385,12 @@ class _CommuteTrackerState extends State { setState(() {}); }, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Text( 'On My Way', style: UiTypography.displayMb.white, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( 'Your manager can see you\'re heading to the site', style: UiTypography.body2r.copyWith( @@ -395,15 +398,15 @@ class _CommuteTrackerState extends State { ), textAlign: TextAlign.center, ), - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), if (widget.distanceMeters != null) ...[ Container( width: double.infinity, constraints: const BoxConstraints(maxWidth: 300), - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), decoration: BoxDecoration( color: UiColors.white.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all( color: UiColors.white.withValues(alpha: 0.2), ), @@ -416,7 +419,7 @@ class _CommuteTrackerState extends State { color: UiColors.primaryForeground.withValues(alpha: 0.8), ), ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( _formatDistance(widget.distanceMeters!), style: UiTypography.displayM.white, @@ -425,14 +428,14 @@ class _CommuteTrackerState extends State { ), ), if (widget.etaMinutes != null) ...[ - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Container( width: double.infinity, constraints: const BoxConstraints(maxWidth: 300), - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), decoration: BoxDecoration( color: UiColors.white.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all( color: UiColors.white.withValues(alpha: 0.2), ), @@ -445,7 +448,7 @@ class _CommuteTrackerState extends State { color: UiColors.primaryForeground.withValues(alpha: 0.8), ), ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( '${widget.etaMinutes} min', style: UiTypography.headline1m.white, @@ -455,7 +458,7 @@ class _CommuteTrackerState extends State { ), ], ], - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), Text( 'Most app features are locked while commute mode is on. You\'ll be able to clock in once you arrive.', style: UiTypography.footnote1r.copyWith( @@ -469,7 +472,7 @@ class _CommuteTrackerState extends State { ), ), Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), child: OutlinedButton( onPressed: () { setState(() => _localIsCommuteOn = false); @@ -477,7 +480,9 @@ class _CommuteTrackerState extends State { style: OutlinedButton.styleFrom( foregroundColor: UiColors.white, side: BorderSide(color: UiColors.white.withValues(alpha: 0.3)), - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), minimumSize: const Size(double.infinity, 48), ), child: Text('Turn Off Commute Mode', style: UiTypography.buttonL), @@ -491,8 +496,8 @@ class _CommuteTrackerState extends State { Widget _buildArrivedCard() { return Container( - margin: const EdgeInsets.only(bottom: 20), - padding: const EdgeInsets.all(20), + margin: const EdgeInsets.only(bottom: UiConstants.space5), + padding: const EdgeInsets.all(UiConstants.space5), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, @@ -502,7 +507,7 @@ class _CommuteTrackerState extends State { UiColors.tagActive, ], ), - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: UiColors.black.withValues(alpha: 0.1), @@ -521,17 +526,17 @@ class _CommuteTrackerState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.checkCircle, + UiIcons.check, size: 32, color: UiColors.white, ), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( 'You\'ve Arrived! 🎉', style: UiTypography.headline3m.textPrimary, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( 'You\'re at the shift location. Ready to clock in?', style: UiTypography.body2r.textSecondary, diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart index 1e39eecf..2d849477 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/date_selector.dart @@ -34,10 +34,12 @@ class DateSelector extends StatelessWidget { onTap: () => onSelect(date), child: AnimatedContainer( duration: const Duration(milliseconds: 200), - margin: const EdgeInsets.symmetric(horizontal: 4), + margin: const EdgeInsets.symmetric( + horizontal: UiConstants.space1, + ), decoration: BoxDecoration( color: isSelected ? UiColors.primary : UiColors.white, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, boxShadow: isSelected ? [ BoxShadow( @@ -55,7 +57,8 @@ class DateSelector extends StatelessWidget { DateFormat('d').format(date), style: UiTypography.title1m.copyWith( fontWeight: FontWeight.bold, - color: isSelected ? UiColors.white : UiColors.foreground, + color: + isSelected ? UiColors.white : UiColors.foreground, ), ), const SizedBox(height: 2), @@ -67,7 +70,7 @@ class DateSelector extends StatelessWidget { : UiColors.textInactive, ), ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), if (hasShift) Container( width: 6, diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart index 4ce26d6d..803d9f7a 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/location_map_placeholder.dart @@ -1,6 +1,5 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; class LocationMapPlaceholder extends StatelessWidget { @@ -19,7 +18,7 @@ class LocationMapPlaceholder extends StatelessWidget { width: double.infinity, decoration: BoxDecoration( color: UiColors.border, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, image: DecorationImage( image: const NetworkImage( 'https://maps.googleapis.com/maps/api/staticmap?center=40.7128,-74.0060&zoom=15&size=600x300&maptype=roadmap&markers=color:red%7C40.7128,-74.0060&key=YOUR_API_KEY', @@ -37,9 +36,12 @@ class LocationMapPlaceholder extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(LucideIcons.mapPin, - size: 48, color: UiColors.iconSecondary), - const SizedBox(height: 8), + const Icon( + UiIcons.mapPin, + size: 48, + color: UiColors.iconSecondary, + ), + const SizedBox(height: UiConstants.space2), Text('Map View (GPS)', style: UiTypography.body2r.textSecondary), ], ), @@ -47,14 +49,17 @@ class LocationMapPlaceholder extends StatelessWidget { // Status Overlay Positioned( - bottom: 16, - left: 16, - right: 16, + bottom: UiConstants.space4, + left: UiConstants.space4, + right: UiConstants.space4, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + vertical: UiConstants.space3, + ), decoration: BoxDecoration( color: UiColors.white, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: UiColors.black.withValues(alpha: 0.1), @@ -66,15 +71,13 @@ class LocationMapPlaceholder extends StatelessWidget { child: Row( children: [ Icon( - isVerified - ? LucideIcons.checkCircle - : LucideIcons.alertCircle, + isVerified ? UiIcons.checkCircle : UiIcons.warning, color: isVerified ? UiColors.textSuccess : UiColors.destructive, size: 20, ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart index 524cad92..83f3d58a 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/lunch_break_modal.dart @@ -1,6 +1,5 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; class LunchBreakDialog extends StatefulWidget { const LunchBreakDialog({super.key, required this.onComplete}); @@ -48,7 +47,9 @@ class _LunchBreakDialogState extends State { Widget build(BuildContext context) { return Dialog( backgroundColor: UiColors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.space6), + ), child: AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: _buildCurrentStep(), @@ -75,7 +76,7 @@ class _LunchBreakDialogState extends State { Widget _buildStep1() { return Padding( - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.all(UiConstants.space6), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -87,18 +88,18 @@ class _LunchBreakDialogState extends State { shape: BoxShape.circle, ), child: const Icon( - LucideIcons.coffee, + UiIcons.coffee, size: 40, color: UiColors.iconSecondary, ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Text( "Did You Take\na Lunch?", textAlign: TextAlign.center, style: UiTypography.headline1m.textPrimary, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Row( children: [ Expanded( @@ -110,10 +111,12 @@ class _LunchBreakDialogState extends State { }); }, child: Container( - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), decoration: BoxDecoration( border: Border.all(color: UiColors.border), - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, color: UiColors.transparent, ), alignment: Alignment.center, @@ -124,7 +127,7 @@ class _LunchBreakDialogState extends State { ), ), ), - const SizedBox(width: 16), + const SizedBox(width: UiConstants.space4), Expanded( child: ElevatedButton( onPressed: () { @@ -135,9 +138,11 @@ class _LunchBreakDialogState extends State { }, style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), ), child: Text( @@ -156,169 +161,183 @@ class _LunchBreakDialogState extends State { Widget _buildStep2() { // Time input return Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - "When did you take lunch?", - style: UiTypography.headline4m, - ), - const SizedBox(height: 24), - // Mock Inputs - Row( - children: [ - Expanded( - child: DropdownButtonFormField( - isExpanded: true, - value: _breakStart, - items: _timeOptions - .map((String t) => DropdownMenuItem( - value: t, - child: Text(t, style: UiTypography.body3r))) - .toList(), - onChanged: (String? v) => setState(() => _breakStart = v), - decoration: const InputDecoration( - labelText: 'Start', - contentPadding: - EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.all(UiConstants.space6), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "When did you take lunch?", + style: UiTypography.headline4m, + ), + const SizedBox(height: UiConstants.space6), + // Mock Inputs + Row( + children: [ + Expanded( + child: DropdownButtonFormField( + isExpanded: true, + value: _breakStart, + items: _timeOptions + .map( + (String t) => DropdownMenuItem( + value: t, + child: Text(t, style: UiTypography.body3r), + ), + ) + .toList(), + onChanged: (String? v) => setState(() => _breakStart = v), + decoration: const InputDecoration( + labelText: 'Start', + contentPadding: EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, ), ), ), - const SizedBox(width: 10), - Expanded( - child: DropdownButtonFormField( - isExpanded: true, - value: _breakEnd, - items: _timeOptions - .map((String t) => DropdownMenuItem( - value: t, - child: Text(t, style: UiTypography.body3r))) - .toList(), - onChanged: (String? v) => setState(() => _breakEnd = v), - decoration: const InputDecoration( - labelText: 'End', - contentPadding: - EdgeInsets.symmetric(horizontal: 10, vertical: 8), - ), - ), - ), - ], - ), - - const SizedBox(height: 24), - ElevatedButton( - onPressed: () { - setState(() => _step = 3); - }, - style: ElevatedButton.styleFrom( - backgroundColor: UiColors.primary, - minimumSize: const Size(double.infinity, 48), ), - child: Text("Next", style: UiTypography.body1m.white), + const SizedBox(width: 10), + Expanded( + child: DropdownButtonFormField( + isExpanded: true, + value: _breakEnd, + items: _timeOptions + .map( + (String t) => DropdownMenuItem( + value: t, + child: Text(t, style: UiTypography.body3r), + ), + ) + .toList(), + onChanged: (String? v) => setState(() => _breakEnd = v), + decoration: const InputDecoration( + labelText: 'End', + contentPadding: EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), + ), + ), + ), + ], + ), + + const SizedBox(height: UiConstants.space6), + ElevatedButton( + onPressed: () { + setState(() => _step = 3); + }, + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), ), - ], - )); + child: Text("Next", style: UiTypography.body1m.white), + ), + ], + ), + ); } Widget _buildStep2b() { // No lunch reason return Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - "Why didn't you take lunch?", - style: UiTypography.headline4m, + padding: const EdgeInsets.all(UiConstants.space6), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Why didn't you take lunch?", + style: UiTypography.headline4m, + ), + const SizedBox(height: UiConstants.space4), + ..._noLunchReasons.map( + (String reason) => RadioListTile( + title: Text(reason, style: UiTypography.body2r), + value: reason, + groupValue: _noLunchReason, + onChanged: (String? val) => setState(() => _noLunchReason = val), + activeColor: UiColors.primary, ), - const SizedBox(height: 16), - ..._noLunchReasons.map((String reason) => RadioListTile( - title: Text(reason, style: UiTypography.body2r), - value: reason, - groupValue: _noLunchReason, - onChanged: (String? val) => - setState(() => _noLunchReason = val), - activeColor: UiColors.primary, - )), + ), - const SizedBox(height: 24), - ElevatedButton( - onPressed: () { - setState(() => _step = 3); - }, - style: ElevatedButton.styleFrom( - backgroundColor: UiColors.primary, - minimumSize: const Size(double.infinity, 48), - ), - child: Text("Next", style: UiTypography.body1m.white), + const SizedBox(height: UiConstants.space6), + ElevatedButton( + onPressed: () { + setState(() => _step = 3); + }, + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), ), - ], - )); + child: Text("Next", style: UiTypography.body1m.white), + ), + ], + ), + ); } Widget _buildStep3() { // Additional Notes return Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - "Additional Notes", - style: UiTypography.headline4m, - ), - const SizedBox(height: 16), - TextField( - onChanged: (String v) => _additionalNotes = v, - style: UiTypography.body2r, - decoration: const InputDecoration( - hintText: 'Add any details...', - border: OutlineInputBorder(), - ), - maxLines: 3, + padding: const EdgeInsets.all(UiConstants.space6), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Additional Notes", + style: UiTypography.headline4m, + ), + const SizedBox(height: UiConstants.space4), + TextField( + onChanged: (String v) => _additionalNotes = v, + style: UiTypography.body2r, + decoration: const InputDecoration( + hintText: 'Add any details...', + border: OutlineInputBorder(), ), + maxLines: 3, + ), - const SizedBox(height: 24), - ElevatedButton( - onPressed: () { - setState(() => _step = 4); - }, - style: ElevatedButton.styleFrom( - backgroundColor: UiColors.primary, - minimumSize: const Size(double.infinity, 48), - ), - child: Text("Submit", style: UiTypography.body1m.white), + const SizedBox(height: UiConstants.space6), + ElevatedButton( + onPressed: () { + setState(() => _step = 4); + }, + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), ), - ], - )); + child: Text("Submit", style: UiTypography.body1m.white), + ), + ], + ), + ); } - + Widget _buildStep4() { // Success return Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(LucideIcons.checkCircle, - size: 64, color: UiColors.success), - const SizedBox(height: 24), - Text( - "Break Logged!", - style: UiTypography.headline1m, + padding: const EdgeInsets.all(UiConstants.space6), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(UiIcons.checkCircle, size: 64, color: UiColors.success), + const SizedBox(height: UiConstants.space6), + Text( + "Break Logged!", + style: UiTypography.headline1m, + ), + const SizedBox(height: UiConstants.space6), + ElevatedButton( + onPressed: widget.onComplete, + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + minimumSize: const Size(double.infinity, 48), ), - const SizedBox(height: 24), - ElevatedButton( - onPressed: widget.onComplete, - style: ElevatedButton.styleFrom( - backgroundColor: UiColors.primary, - minimumSize: const Size(double.infinity, 48), - ), - child: Text("Close", style: UiTypography.body1m.white), - ), - ], - )); + child: Text("Close", style: UiTypography.body1m.white), + ), + ], + ), + ); } } diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart index 23987440..bb79e4d3 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart @@ -1,9 +1,7 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; class SwipeToCheckIn extends StatefulWidget { - const SwipeToCheckIn({ super.key, this.onCheckIn, @@ -73,8 +71,9 @@ class _SwipeToCheckInState extends State @override Widget build(BuildContext context) { - final Color baseColor = - widget.isCheckedIn ? UiColors.success : UiColors.primary; + final Color baseColor = widget.isCheckedIn + ? UiColors.success + : UiColors.primary; if (widget.mode == 'nfc') { return GestureDetector( @@ -93,7 +92,7 @@ class _SwipeToCheckInState extends State height: 56, decoration: BoxDecoration( color: baseColor, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: baseColor.withValues(alpha: 0.4), @@ -106,8 +105,8 @@ class _SwipeToCheckInState extends State child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(LucideIcons.wifi, color: UiColors.white), - const SizedBox(width: 12), + const Icon(UiIcons.wifi, color: UiColors.white), + const SizedBox(width: UiConstants.space3), Text( widget.isLoading ? (widget.isCheckedIn @@ -129,10 +128,12 @@ class _SwipeToCheckInState extends State // Calculate background color based on drag final double progress = _dragValue / maxDrag; - final Color startColor = - widget.isCheckedIn ? UiColors.success : UiColors.primary; - final Color endColor = - widget.isCheckedIn ? UiColors.primary : UiColors.success; + final Color startColor = widget.isCheckedIn + ? UiColors.success + : UiColors.primary; + final Color endColor = widget.isCheckedIn + ? UiColors.primary + : UiColors.success; final Color currentColor = Color.lerp(startColor, endColor, progress) ?? startColor; @@ -140,7 +141,7 @@ class _SwipeToCheckInState extends State height: 56, decoration: BoxDecoration( color: currentColor, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: UiColors.black.withValues(alpha: 0.1), @@ -173,14 +174,16 @@ class _SwipeToCheckInState extends State left: 4 + _dragValue, top: 4, child: GestureDetector( - onHorizontalDragUpdate: (DragUpdateDetails d) => _onDragUpdate(d, maxWidth), - onHorizontalDragEnd: (DragEndDetails d) => _onDragEnd(d, maxWidth), + onHorizontalDragUpdate: (DragUpdateDetails d) => + _onDragUpdate(d, maxWidth), + onHorizontalDragEnd: (DragEndDetails d) => + _onDragEnd(d, maxWidth), child: Container( width: _handleSize, height: _handleSize, decoration: BoxDecoration( color: UiColors.white, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( color: UiColors.black.withValues(alpha: 0.1), @@ -191,9 +194,7 @@ class _SwipeToCheckInState extends State ), child: Center( child: Icon( - _isComplete - ? LucideIcons.check - : LucideIcons.arrowRight, + _isComplete ? UiIcons.check : UiIcons.arrowRight, color: startColor, ), ), diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart index 7801eed1..56ed57b0 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart @@ -1,7 +1,7 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import 'package:intl/intl.dart'; import 'package:krow_domain/krow_domain.dart'; import '../blocs/payments/payments_bloc.dart'; @@ -33,12 +33,22 @@ class _PaymentsPageState extends State { return BlocProvider.value( value: _bloc, child: Scaffold( + backgroundColor: UiColors.background, body: BlocBuilder( builder: (BuildContext context, PaymentsState state) { if (state is PaymentsLoading) { - return const Center(child: CircularProgressIndicator()); + return Center( + child: CircularProgressIndicator( + color: UiColors.primary, + ), + ); } else if (state is PaymentsError) { - return Center(child: Text('Error: ${state.message}')); + return Center( + child: Text( + 'Error: ${state.message}', + style: UiTypography.body2r.textError, + ), + ); } else if (state is PaymentsLoaded) { return _buildContent(context, state); } @@ -55,63 +65,57 @@ class _PaymentsPageState extends State { children: [ // Header Section with Gradient Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( gradient: LinearGradient( - colors: [Color(0xFF0032A0), Color(0xFF333F48)], + colors: [ + UiColors.primary, + UiColors.primary.withValues(alpha: 0.8), + ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), ), padding: EdgeInsets.fromLTRB( - 20, - MediaQuery.of(context).padding.top + 24, - 20, - 32, + UiConstants.space5, + MediaQuery.of(context).padding.top + UiConstants.space6, + UiConstants.space5, + UiConstants.space8, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( "Earnings", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Colors.white, - ), + style: UiTypography.displayMb.white, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Main Balance Center( child: Column( children: [ - const Text( + Text( "Total Earnings", - style: TextStyle( - color: Color(0xFFF8E08E), - fontSize: 14, + style: UiTypography.body2r.copyWith( + color: UiColors.accent, ), ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( "\$${state.summary.totalEarnings.toStringAsFixed(0).replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]},')}", - style: const TextStyle( - fontSize: 36, - fontWeight: FontWeight.bold, - color: Colors.white, - ), + style: UiTypography.displayL.white, ), ], ), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Period Tabs Container( - padding: const EdgeInsets.all(4), + padding: const EdgeInsets.all(UiConstants.space1), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.2), - borderRadius: BorderRadius.circular(12), + color: UiColors.white.withValues(alpha: 0.2), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: Row( children: [ @@ -127,9 +131,9 @@ class _PaymentsPageState extends State { // Main Content - Offset upwards Transform.translate( - offset: const Offset(0, -16), + offset: const Offset(0, -UiConstants.space4), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: UiConstants.space5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -138,76 +142,75 @@ class _PaymentsPageState extends State { payments: state.history, period: state.activePeriod, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Quick Stats Row( children: [ Expanded( child: PaymentStatsCard( - icon: LucideIcons.trendingUp, - iconColor: const Color(0xFF059669), + icon: UiIcons.chart, + iconColor: UiColors.success, label: "This Week", amount: "\$${state.summary.weeklyEarnings}", ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: PaymentStatsCard( - icon: LucideIcons.calendar, - iconColor: const Color(0xFF2563EB), + icon: UiIcons.calendar, + iconColor: UiColors.primary, label: "This Month", amount: "\$${state.summary.monthlyEarnings.toStringAsFixed(0)}", ), ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Pending Pay - if(state.summary.pendingEarnings > 0) PendingPayCard( - amount: state.summary.pendingEarnings, - onCashOut: () { - Modular.to.pushNamed('/early-pay'); - }, - ), - const SizedBox(height: 24), - - + if (state.summary.pendingEarnings > 0) + PendingPayCard( + amount: state.summary.pendingEarnings, + onCashOut: () { + Modular.to.pushNamed('/early-pay'); + }, + ), + const SizedBox(height: UiConstants.space6), // Recent Payments - if (state.history.isNotEmpty) Column( - children: [ - const Text( - "Recent Payments", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF0F172A), + if (state.history.isNotEmpty) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Recent Payments", + style: UiTypography.body2m.textPrimary, ), - ), - const SizedBox(height: 12), - Column( - children: state.history.map((StaffPayment payment) { - return Padding( - padding: const EdgeInsets.only(bottom: 8), - child: PaymentHistoryItem( - amount: payment.amount, - title: "Shift Payment", - location: "Varies", - address: "Payment ID: ${payment.id}", - date: payment.paidAt != null - ? DateFormat('E, MMM d').format(payment.paidAt!) - : 'Pending', - workedTime: "Completed", - hours: 0, - rate: 0.0, - status: payment.status.name.toUpperCase(), - ), - ); - }).toList(), - ), - ], - ), + const SizedBox(height: UiConstants.space3), + Column( + children: state.history.map((StaffPayment payment) { + return Padding( + padding: const EdgeInsets.only( + bottom: UiConstants.space2), + child: PaymentHistoryItem( + amount: payment.amount, + title: "Shift Payment", + location: "Varies", + address: "Payment ID: ${payment.id}", + date: payment.paidAt != null + ? DateFormat('E, MMM d') + .format(payment.paidAt!) + : 'Pending', + workedTime: "Completed", + hours: 0, + rate: 0.0, + status: payment.status.name.toUpperCase(), + ), + ); + }).toList(), + ), + ], + ), const SizedBox(height: 100), ], @@ -225,19 +228,17 @@ class _PaymentsPageState extends State { child: GestureDetector( onTap: () => _bloc.add(ChangePeriodEvent(value)), child: Container( - padding: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(vertical: UiConstants.space2), decoration: BoxDecoration( - color: isSelected ? Colors.white : Colors.transparent, - borderRadius: BorderRadius.circular(8), + color: isSelected ? UiColors.white : Colors.transparent, + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), ), child: Center( child: Text( label, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: isSelected ? const Color(0xFF0032A0) : Colors.white, - ), + style: isSelected + ? UiTypography.body2m.copyWith(color: UiColors.primary) + : UiTypography.body2m.white, ), ), ), diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/earnings_graph.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/earnings_graph.dart index 960bb7c7..18a8ac89 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/earnings_graph.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/earnings_graph.dart @@ -1,3 +1,4 @@ +import 'package:design_system/design_system.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -25,26 +26,30 @@ class EarningsGraph extends StatelessWidget { return Container( height: 200, decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + child: Center( + child: Text( + "No sufficient data for graph", + style: UiTypography.body2r.textSecondary, + ), ), - child: const Center(child: Text("No sufficient data for graph")), ); } final List spots = _generateSpots(validPayments); - final double maxX = spots.isNotEmpty ? spots.last.x : 0.0; final double maxY = spots.isNotEmpty ? spots.map((FlSpot s) => s.y).reduce((double a, double b) => a > b ? a : b) : 0.0; return Container( height: 220, - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), offset: const Offset(0, 4), blurRadius: 12, ), @@ -53,15 +58,11 @@ class EarningsGraph extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( "Earnings Trend", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF0F172A), - ), + style: UiTypography.body2b.textPrimary, ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Expanded( child: LineChart( LineChartData( @@ -79,7 +80,7 @@ class EarningsGraph extends StatelessWidget { padding: const EdgeInsets.only(top: 8.0), child: Text( DateFormat('d').format(validPayments[index].paidAt!), - style: const TextStyle(fontSize: 10, color: Colors.grey), + style: UiTypography.footnote1r.textSecondary, ), ); } @@ -96,13 +97,13 @@ class EarningsGraph extends StatelessWidget { LineChartBarData( spots: spots, isCurved: true, - color: const Color(0xFF0032A0), + color: UiColors.primary, barWidth: 3, isStrokeCapRound: true, dotData: const FlDotData(show: false), belowBarData: BarAreaData( show: true, - color: const Color(0xFF0032A0).withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), ), ), ], @@ -121,7 +122,7 @@ class EarningsGraph extends StatelessWidget { List _generateSpots(List data) { // Generate spots based on index in the list for simplicity in this demo // Real implementation would map to actual dates on X-axis - return List.generate(data.length, (int index) { + return List.generate(data.length, (int index) { return FlSpot(index.toDouble(), data[index].amount); }); } diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_history_item.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_history_item.dart index b64b78a9..e068caee 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_history_item.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_history_item.dart @@ -1,5 +1,5 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; class PaymentHistoryItem extends StatelessWidget { @@ -28,13 +28,13 @@ class PaymentHistoryItem extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -50,23 +50,20 @@ class PaymentHistoryItem extends StatelessWidget { width: 6, height: 6, decoration: const BoxDecoration( - color: Color(0xFF3B82F6), // blue-500 + color: UiColors.primary, shape: BoxShape.circle, ), ), const SizedBox(width: 6), - const Text( + Text( "PAID", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.w700, - color: Color(0xFF2563EB), // blue-600 - letterSpacing: 0.5, + style: UiTypography.titleUppercase4b.copyWith( + color: UiColors.primary, ), ), ], ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( crossAxisAlignment: CrossAxisAlignment.start, @@ -76,16 +73,16 @@ class PaymentHistoryItem extends StatelessWidget { width: 44, height: 44, decoration: BoxDecoration( - color: const Color(0xFFF1F5F9), // slate-100 - borderRadius: BorderRadius.circular(12), + color: UiColors.secondary, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: const Icon( - LucideIcons.dollarSign, - color: Color(0xFF334155), // slate-700 + UiIcons.chart, + color: UiColors.mutedForeground, size: 24, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), // Content Expanded( @@ -101,18 +98,11 @@ class PaymentHistoryItem extends StatelessWidget { children: [ Text( title, - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.body2b.textPrimary, ), Text( location, - style: const TextStyle( - fontSize: 12, - color: Color(0xFF475569), // slate-600 - ), + style: UiTypography.body3r.textSecondary, ), ], ), @@ -122,75 +112,59 @@ class PaymentHistoryItem extends StatelessWidget { children: [ Text( "\$${amount.toStringAsFixed(0)}", - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.headline4m.textPrimary, ), Text( "\$${rate.toStringAsFixed(0)}/hr · ${hours}h", - style: const TextStyle( - fontSize: 10, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.footnote1r.textSecondary, ), ], ), ], ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), // Date and Time Row( children: [ const Icon( - LucideIcons.calendar, + UiIcons.calendar, size: 12, - color: Color(0xFF64748B), + color: UiColors.mutedForeground, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Text( date, - style: const TextStyle( - fontSize: 12, - color: Color(0xFF64748B), - ), + style: UiTypography.body3r.textSecondary, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), const Icon( - LucideIcons.clock, + UiIcons.clock, size: 12, - color: Color(0xFF64748B), + color: UiColors.mutedForeground, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Text( workedTime, - style: const TextStyle( - fontSize: 12, - color: Color(0xFF64748B), - ), + style: UiTypography.body3r.textSecondary, ), ], ), - const SizedBox(height: 4), + const SizedBox(height: 1), // Address Row( children: [ const Icon( - LucideIcons.mapPin, + UiIcons.mapPin, size: 12, - color: Color(0xFF64748B), + color: UiColors.mutedForeground, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Expanded( child: Text( address, - style: const TextStyle( - fontSize: 12, - color: Color(0xFF64748B), - ), + style: UiTypography.body3r.textSecondary, maxLines: 1, overflow: TextOverflow.ellipsis, ), diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_stats_card.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_stats_card.dart index 77673455..e49174d5 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_stats_card.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/payment_stats_card.dart @@ -1,7 +1,7 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; class PaymentStatsCard extends StatelessWidget { - const PaymentStatsCard({ super.key, required this.icon, @@ -9,6 +9,7 @@ class PaymentStatsCard extends StatelessWidget { required this.label, required this.amount, }); + final IconData icon; final Color iconColor; final String label; @@ -17,13 +18,13 @@ class PaymentStatsCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -35,24 +36,17 @@ class PaymentStatsCard extends StatelessWidget { Row( children: [ Icon(icon, size: 16, color: iconColor), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Text( label, - style: const TextStyle( - fontSize: 12, - color: Color(0xFF64748B), // slate-500 - ), + style: UiTypography.body3r.textSecondary, ), ], ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( amount, - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Color(0xFF0F172A), // slate-900 - ), + style: UiTypography.headline1m.textPrimary, ), ], ), diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/pending_pay_card.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/pending_pay_card.dart index 54a56f39..fe49fbf8 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/pending_pay_card.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/widgets/pending_pay_card.dart @@ -1,5 +1,5 @@ +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; class PendingPayCard extends StatelessWidget { @@ -14,17 +14,13 @@ class PendingPayCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.all(14), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - gradient: const LinearGradient( - colors: [Color(0xFFEFF6FF), Color(0xFFEFF6FF)], // blue-50 to blue-50 - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - borderRadius: BorderRadius.circular(16), + color: UiColors.tagInProgress, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -36,63 +32,34 @@ class PendingPayCard extends StatelessWidget { Row( children: [ Container( - width: 40, - height: 40, + width: UiConstants.space10, + height: UiConstants.space10, decoration: BoxDecoration( - color: const Color(0xFFE8F0FF), - borderRadius: BorderRadius.circular(8), + color: UiColors.white.withValues(alpha: 0.2), + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), ), child: const Icon( - LucideIcons.dollarSign, - color: Color(0xFF0047FF), + UiIcons.chart, + color: UiColors.primary, size: 20, ), ), - const SizedBox(width: 10), + const SizedBox(width: UiConstants.space3), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( "Pending", - style: TextStyle( - fontWeight: FontWeight.bold, - color: Color(0xFF0F172A), // slate-900 - fontSize: 14, - ), + style: UiTypography.body2b.textPrimary, ), Text( "\$${amount.toStringAsFixed(0)} available", - style: const TextStyle( - fontSize: 12, - color: Color(0xFF475569), // slate-600 - fontWeight: FontWeight.w500, - ), + style: UiTypography.body3m.textSecondary, ), ], ), ], ), - /* - ElevatedButton.icon( - onPressed: onCashOut, - icon: const Icon(LucideIcons.zap, size: 14), - label: const Text("Early Pay"), - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF0047FF), - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), - elevation: 4, - shadowColor: Colors.black.withOpacity(0.2), - textStyle: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - ), - */ ], ), ); diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart index c92e8a11..2bd2f638 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/pages/staff_profile_page.dart @@ -1,22 +1,21 @@ +import 'package:core_localization/core_localization.dart'; +import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart' hide ReadContext; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:core_localization/core_localization.dart'; -import 'package:design_system/design_system.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_domain/krow_domain.dart'; import '../blocs/profile_cubit.dart'; import '../blocs/profile_state.dart'; -import 'package:krow_core/core.dart'; +import '../widgets/language_selector_bottom_sheet.dart'; import '../widgets/logout_button.dart'; +import '../widgets/profile_header.dart'; import '../widgets/profile_menu_grid.dart'; import '../widgets/profile_menu_item.dart'; -import '../widgets/profile_header.dart'; import '../widgets/reliability_score_bar.dart'; import '../widgets/reliability_stats_card.dart'; -import '../widgets/reliability_stats_card.dart'; import '../widgets/section_title.dart'; -import '../widgets/language_selector_bottom_sheet.dart'; /// The main Staff Profile page. /// @@ -68,17 +67,15 @@ class StaffProfilePage extends StatelessWidget { }, builder: (context, state) { // Show loading spinner if status is loading - if (state.status == ProfileStatus.loading) { - return const Center(child: CircularProgressIndicator()); - } + if (state.status == ProfileStatus.loading) { + return const Center(child: CircularProgressIndicator()); + } - if (state.status == ProfileStatus.error) { + if (state.status == ProfileStatus.error) { return Center( child: Text( state.errorMessage ?? 'An error occurred', - style: UiTypography.body1r.copyWith( - color: UiColors.destructive, - ), + style: UiTypography.body1r.textError, ), ); } @@ -121,7 +118,6 @@ class StaffProfilePage extends StatelessWidget { SectionTitle(i18n.sections.onboarding), ProfileMenuGrid( crossAxisCount: 3, - children: [ ProfileMenuItem( icon: UiIcons.user, @@ -181,18 +177,23 @@ class StaffProfilePage extends StatelessWidget { ), const SizedBox(height: UiConstants.space6), SectionTitle( - i18n.header.title.contains("Perfil") ? "Ajustes" : "Settings", + i18n.header.title.contains("Perfil") + ? "Ajustes" + : "Settings", ), ProfileMenuGrid( crossAxisCount: 3, children: [ ProfileMenuItem( icon: UiIcons.globe, - label: i18n.header.title.contains("Perfil") ? "Idioma" : "Language", + label: i18n.header.title.contains("Perfil") + ? "Idioma" + : "Language", onTap: () { showModalBottomSheet( context: context, - builder: (context) => const LanguageSelectorBottomSheet(), + builder: (context) => + const LanguageSelectorBottomSheet(), ); }, ), diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart index 057a17c9..06c4bda9 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/language_selector_bottom_sheet.dart @@ -1,7 +1,6 @@ import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; /// A bottom sheet that allows the user to select their preferred language. @@ -15,10 +14,12 @@ class LanguageSelectorBottomSheet extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.all(UiConstants.space6), - decoration: BoxDecoration( + padding: const EdgeInsets.all(UiConstants.space6), + decoration: const BoxDecoration( color: UiColors.background, - borderRadius: BorderRadius.vertical(top: Radius.circular(UiConstants.radiusBase)), + borderRadius: BorderRadius.vertical( + top: Radius.circular(UiConstants.radiusBase), + ), ), child: Column( mainAxisSize: MainAxisSize.min, @@ -29,19 +30,19 @@ class LanguageSelectorBottomSheet extends StatelessWidget { style: UiTypography.headline4m, textAlign: TextAlign.center, ), - SizedBox(height: UiConstants.space6), + const SizedBox(height: UiConstants.space6), _buildLanguageOption( context, label: 'English', locale: AppLocale.en, ), - SizedBox(height: UiConstants.space4), + const SizedBox(height: UiConstants.space4), _buildLanguageOption( context, label: 'Español', locale: AppLocale.es, ), - SizedBox(height: UiConstants.space6), + const SizedBox(height: UiConstants.space6), ], ), ); @@ -62,21 +63,23 @@ class LanguageSelectorBottomSheet extends StatelessWidget { onTap: () { // Dispatch the ChangeLocale event to the LocaleBloc Modular.get().add(ChangeLocale(locale.flutterLocale)); - + // Close the bottom sheet Navigator.pop(context); - + // Force a rebuild of the entire app to reflect locale change instantly if not handled by root widget // (Usually handled by BlocBuilder at the root, but this ensures settings are updated) }, borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), child: Container( - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( vertical: UiConstants.space4, horizontal: UiConstants.space4, ), decoration: BoxDecoration( - color: isSelected ? UiColors.primary.withValues(alpha: 0.1) : UiColors.background, + color: isSelected + ? UiColors.primary.withValues(alpha: 0.1) + : UiColors.background, borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), border: Border.all( color: isSelected ? UiColors.primary : UiColors.border, @@ -88,12 +91,10 @@ class LanguageSelectorBottomSheet extends StatelessWidget { children: [ Text( label, - style: isSelected - ? UiTypography.body1b.copyWith(color: UiColors.primary) - : UiTypography.body1r, + style: isSelected ? UiTypography.body1b.primary : UiTypography.body1r, ), if (isSelected) - Icon( + const Icon( UiIcons.check, color: UiColors.primary, size: 24.0, diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/logout_button.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/logout_button.dart index 3e81c641..a76e14f6 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/logout_button.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/logout_button.dart @@ -1,7 +1,6 @@ -import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; +import 'package:flutter/material.dart'; /// The sign-out button widget. /// @@ -14,31 +13,33 @@ class LogoutButton extends StatelessWidget { @override Widget build(BuildContext context) { final i18n = t.staff.profile.header; - + return Container( width: double.infinity, decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Material( color: const Color(0x00000000), child: InkWell( onTap: onTap, - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + borderRadius: UiConstants.radiusLg, child: Padding( - padding: EdgeInsets.symmetric(vertical: UiConstants.space4), + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(LucideIcons.logOut, color: UiColors.destructive, size: 20), - SizedBox(width: UiConstants.space2), + const Icon( + UiIcons.logOut, + color: UiColors.destructive, + size: 20, + ), + const SizedBox(width: UiConstants.space2), Text( i18n.sign_out, - style: UiTypography.body1m.copyWith( - color: UiColors.destructive, - ), + style: UiTypography.body1m.textError, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_header.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_header.dart index 9d15de3e..bee90690 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_header.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_header.dart @@ -34,13 +34,13 @@ class ProfileHeader extends StatelessWidget { return Container( width: double.infinity, - padding: EdgeInsets.fromLTRB( + padding: const EdgeInsets.fromLTRB( UiConstants.space5, UiConstants.space5, UiConstants.space5, UiConstants.space16, ), - decoration: BoxDecoration( + decoration: const BoxDecoration( color: UiColors.primary, borderRadius: BorderRadius.vertical( bottom: Radius.circular(UiConstants.space6), @@ -56,22 +56,20 @@ class ProfileHeader extends StatelessWidget { children: [ Text( i18n.title, - style: UiTypography.headline4m.copyWith( - color: UiColors.primaryForeground, - ), + style: UiTypography.headline4m.textSecondary, ), GestureDetector( onTap: onSignOutTap, child: Text( i18n.sign_out, style: UiTypography.body2m.copyWith( - color: UiColors.primaryForeground.withOpacity(0.8), + color: UiColors.primaryForeground.withValues(alpha: 0.8), ), ), ), ], ), - SizedBox(height: UiConstants.space8), + const SizedBox(height: UiConstants.space8), // Avatar Section Stack( alignment: Alignment.bottomRight, @@ -79,7 +77,7 @@ class ProfileHeader extends StatelessWidget { Container( width: 112, height: 112, - padding: EdgeInsets.all(UiConstants.space1), + padding: const EdgeInsets.all(UiConstants.space1), decoration: BoxDecoration( shape: BoxShape.circle, gradient: LinearGradient( @@ -87,13 +85,13 @@ class ProfileHeader extends StatelessWidget { end: Alignment.bottomRight, colors: [ UiColors.accent, - UiColors.accent.withOpacity(0.5), + UiColors.accent.withValues(alpha: 0.5), UiColors.primaryForeground, ], ), boxShadow: [ BoxShadow( - color: UiColors.foreground.withOpacity(0.2), + color: UiColors.foreground.withValues(alpha: 0.2), blurRadius: 10, offset: const Offset(0, 4), ), @@ -103,7 +101,7 @@ class ProfileHeader extends StatelessWidget { decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: UiColors.primaryForeground.withOpacity(0.2), + color: UiColors.primaryForeground.withValues(alpha: 0.2), width: 4, ), ), @@ -123,16 +121,16 @@ class ProfileHeader extends StatelessWidget { end: Alignment.bottomRight, colors: [ UiColors.accent, - UiColors.accent.withOpacity(0.7), + UiColors.accent.withValues(alpha: 0.7), ], ), ), alignment: Alignment.center, child: Text( - fullName.isNotEmpty ? fullName[0].toUpperCase() : 'K', - style: UiTypography.displayM.copyWith( - color: UiColors.primary, - ), + fullName.isNotEmpty + ? fullName[0].toUpperCase() + : 'K', + style: UiTypography.displayM.primary, ), ) : null, @@ -148,7 +146,7 @@ class ProfileHeader extends StatelessWidget { border: Border.all(color: UiColors.primary, width: 2), boxShadow: [ BoxShadow( - color: UiColors.foreground.withOpacity(0.1), + color: UiColors.foreground.withValues(alpha: 0.1), blurRadius: 4, ), ], @@ -161,28 +159,24 @@ class ProfileHeader extends StatelessWidget { ), ], ), - SizedBox(height: UiConstants.space4), + const SizedBox(height: UiConstants.space4), Text( fullName, - style: UiTypography.headline3m.copyWith( - color: UiColors.primaryForeground, - ), + style: UiTypography.headline3m.textPlaceholder, ), - SizedBox(height: UiConstants.space1), + const SizedBox(height: UiConstants.space1), Container( - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( horizontal: UiConstants.space3, vertical: UiConstants.space1, ), decoration: BoxDecoration( - color: UiColors.accent.withOpacity(0.2), + color: UiColors.accent.withValues(alpha: 0.2), borderRadius: BorderRadius.circular(UiConstants.space5), ), child: Text( level, - style: UiTypography.footnote1b.copyWith( - color: UiColors.accent, - ), + style: UiTypography.footnote1b.accent, ), ), ], diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_menu_item.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_menu_item.dart index 6fafeaa9..d61fac6f 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_menu_item.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/profile_menu_item.dart @@ -25,10 +25,10 @@ class ProfileMenuItem extends StatelessWidget { child: Container( decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), - padding: EdgeInsets.all(UiConstants.space2), + padding: const EdgeInsets.all(UiConstants.space2), child: AspectRatio( aspectRatio: 1.0, child: Stack( @@ -42,24 +42,23 @@ class ProfileMenuItem extends StatelessWidget { width: 36, height: 36, decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.08), - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + color: UiColors.primary.withValues(alpha: 0.08), + borderRadius: UiConstants.radiusLg, ), alignment: Alignment.center, child: Icon(icon, color: UiColors.primary, size: 20), ), - SizedBox(height: UiConstants.space1), + const SizedBox(height: UiConstants.space1), Padding( - padding: EdgeInsets.symmetric(horizontal: UiConstants.space1), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space1, + ), child: Text( label, textAlign: TextAlign.center, maxLines: 2, overflow: TextOverflow.ellipsis, - style: UiTypography.footnote1m.copyWith( - color: UiColors.foreground, - height: 1.2, - ), + style: UiTypography.footnote1m.textSecondary, ), ), ], @@ -76,16 +75,18 @@ class ProfileMenuItem extends StatelessWidget { shape: BoxShape.circle, color: completed! ? UiColors.primary - : UiColors.primary.withOpacity(0.1), + : UiColors.primary.withValues(alpha: 0.1), ), alignment: Alignment.center, child: completed! - ? const Icon(Icons.check, size: 10, color: UiColors.primaryForeground) + ? const Icon( + UiIcons.check, + size: 10, + color: UiColors.primaryForeground, + ) : Text( "!", - style: UiTypography.footnote2b.copyWith( - color: UiColors.primary, - ), + style: UiTypography.footnote2b.primary, ), ), ), diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_score_bar.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_score_bar.dart index 4fa8838b..82c0e4ea 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_score_bar.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_score_bar.dart @@ -19,10 +19,10 @@ class ReliabilityScoreBar extends StatelessWidget { final score = (reliabilityScore ?? 0) / 100; return Container( - padding: EdgeInsets.all(UiConstants.space4), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.1), - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + color: UiColors.primary.withValues(alpha: 0.1), + borderRadius: UiConstants.radiusLg, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -32,19 +32,15 @@ class ReliabilityScoreBar extends StatelessWidget { children: [ Text( i18n.title, - style: UiTypography.body2m.copyWith( - color: UiColors.primary, - ), + style: UiTypography.body2m.primary, ), Text( "${reliabilityScore ?? 0}%", - style: UiTypography.headline4m.copyWith( - color: UiColors.primary, - ), + style: UiTypography.headline4m.primary, ), ], ), - SizedBox(height: UiConstants.space2), + const SizedBox(height: UiConstants.space2), ClipRRect( borderRadius: BorderRadius.circular(UiConstants.space1), child: LinearProgressIndicator( @@ -55,12 +51,10 @@ class ReliabilityScoreBar extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(top: UiConstants.space2), + padding: const EdgeInsets.only(top: UiConstants.space2), child: Text( i18n.description, - style: UiTypography.footnote2r.copyWith( - color: UiColors.mutedForeground, - ), + style: UiTypography.footnote2r.textSecondary, ), ), ], diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_stats_card.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_stats_card.dart index 05594a60..b883e003 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_stats_card.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/reliability_stats_card.dart @@ -1,6 +1,5 @@ -import 'package:flutter/material.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import 'package:design_system/design_system.dart'; +import 'package:flutter/material.dart'; /// Displays the staff member's reliability statistics (Shifts, Rating, On Time, etc.). /// @@ -24,14 +23,14 @@ class ReliabilityStatsCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.all(UiConstants.space4), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: UiColors.foreground.withOpacity(0.05), + color: UiColors.foreground.withValues(alpha: 0.05), blurRadius: 4, offset: const Offset(0, 1), ), @@ -42,31 +41,31 @@ class ReliabilityStatsCard extends StatelessWidget { children: [ _buildStatItem( context, - LucideIcons.briefcase, + UiIcons.briefcase, "${totalShifts ?? 0}", "Shifts", ), _buildStatItem( context, - LucideIcons.star, + UiIcons.star, (averageRating ?? 0.0).toStringAsFixed(1), "Rating", ), _buildStatItem( context, - LucideIcons.clock, + UiIcons.clock, "${onTimeRate ?? 0}%", "On Time", ), _buildStatItem( context, - LucideIcons.xCircle, + UiIcons.xCircle, "${noShowCount ?? 0}", "No Shows", ), _buildStatItem( context, - LucideIcons.ban, + UiIcons.ban, "${cancellationCount ?? 0}", "Cancel.", ), @@ -88,26 +87,22 @@ class ReliabilityStatsCard extends StatelessWidget { width: 40, height: 40, decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), ), alignment: Alignment.center, child: Icon(icon, size: 20, color: UiColors.primary), ), - SizedBox(height: UiConstants.space1), + const SizedBox(height: UiConstants.space1), Text( value, - style: UiTypography.body1b.copyWith( - color: UiColors.foreground, - ), + style: UiTypography.body1b.textSecondary, ), FittedBox( fit: BoxFit.scaleDown, child: Text( label, - style: UiTypography.footnote2r.copyWith( - color: UiColors.mutedForeground, - ), + style: UiTypography.footnote2r.textSecondary, ), ), ], diff --git a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/section_title.dart b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/section_title.dart index 89167c61..3cd0c9e0 100644 --- a/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/section_title.dart +++ b/apps/mobile/packages/features/staff/profile/lib/src/presentation/widgets/section_title.dart @@ -13,14 +13,11 @@ class SectionTitle extends StatelessWidget { Widget build(BuildContext context) { return Container( width: double.infinity, - padding: EdgeInsets.only(left: UiConstants.space1), - margin: EdgeInsets.only(bottom: UiConstants.space3), + padding: const EdgeInsets.only(left: UiConstants.space1), + margin: const EdgeInsets.only(bottom: UiConstants.space3), child: Text( title.toUpperCase(), - style: UiTypography.footnote1b.copyWith( - color: UiColors.mutedForeground, - letterSpacing: 0.5, - ), + style: UiTypography.footnote1b.textSecondary, ), ); } diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/pages/certificates_page.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/pages/certificates_page.dart index f9ac8f85..cd28047d 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/pages/certificates_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/pages/certificates_page.dart @@ -53,7 +53,7 @@ class CertificatesPage extends StatelessWidget { Transform.translate( offset: const Offset(0, -48), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: UiConstants.space5), child: Column( children: [ ...documents.map((StaffDocument doc) => CertificateCard( @@ -70,11 +70,11 @@ class CertificatesPage extends StatelessWidget { ); }, )), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), AddCertificateCard( onTap: () => _showUploadModal(context, null), ), - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), ], ), ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/add_certificate_card.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/add_certificate_card.dart index 315e91ec..8e0634a1 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/add_certificate_card.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/add_certificate_card.dart @@ -12,37 +12,36 @@ class AddCertificateCard extends StatelessWidget { return GestureDetector( onTap: onTap, child: Container( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, - colors: [Colors.grey[50]!, Colors.grey[100]!], // Keep prototype style + colors: [ + UiColors.bgSecondary.withValues(alpha: 0.5), + UiColors.bgSecondary, + ], ), - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all( - color: Colors.grey[300]!, + color: UiColors.border, style: BorderStyle.solid, ), ), child: Row( children: [ const Icon(UiIcons.add, color: UiColors.primary, size: 24), - const SizedBox(width: 16), + const SizedBox(width: UiConstants.space4), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( t.staff_certificates.add_more.title, - style: UiTypography.body1b.copyWith( // 16px Bold - color: UiColors.textPrimary, - ), + style: UiTypography.body1b.textPrimary, ), Text( t.staff_certificates.add_more.subtitle, - style: UiTypography.body3r.copyWith( // 12px Regular - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_card.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_card.dart index c1cca227..c798f97a 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_card.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_card.dart @@ -1,8 +1,8 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:krow_domain/krow_domain.dart'; -import 'package:core_localization/core_localization.dart'; class CertificateCard extends StatelessWidget { final StaffDocument document; @@ -39,13 +39,13 @@ class CertificateCard extends StatelessWidget { final _CertificateUiProps uiProps = _getUiProps(document.documentId); return Container( - margin: const EdgeInsets.only(bottom: 16), + margin: const EdgeInsets.only(bottom: UiConstants.space4), decoration: BoxDecoration( color: UiColors.white, - borderRadius: BorderRadius.circular(UiConstants.space4), + borderRadius: UiConstants.radiusLg, boxShadow: [ BoxShadow( - color: UiColors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 4, offset: const Offset(0, 2), ), @@ -57,11 +57,14 @@ class CertificateCard extends StatelessWidget { children: [ if (isExpiring || isExpired) Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + vertical: UiConstants.space2, + ), decoration: BoxDecoration( - color: const Color(0xFFF9E547).withOpacity(0.2), // Yellow tint - border: const Border( - bottom: BorderSide(color: Color(0x66F9E547)), + color: UiColors.accent.withValues(alpha: 0.2), // Yellow tint + border: Border( + bottom: BorderSide(color: UiColors.accent.withValues(alpha: 0.4)), ), ), child: Row( @@ -76,16 +79,14 @@ class CertificateCard extends StatelessWidget { isExpired ? t.staff_certificates.card.expired : t.staff_certificates.card.expires_in_days(days: _daysUntilExpiry(document.expiryDate)), - style: UiTypography.body3m.copyWith( // 12px Medium - color: UiColors.textPrimary, - ), + style: UiTypography.body3m.textPrimary, ), ], ), ), Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(UiConstants.space5), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -96,8 +97,8 @@ class CertificateCard extends StatelessWidget { width: 64, height: 64, decoration: BoxDecoration( - color: uiProps.color.withOpacity(0.1), - borderRadius: BorderRadius.circular(16), + color: uiProps.color.withValues(alpha: 0.1), + borderRadius: UiConstants.radiusLg, ), child: Center( child: Icon( @@ -137,7 +138,7 @@ class CertificateCard extends StatelessWidget { ), ], ), - const SizedBox(width: 16), + const SizedBox(width: UiConstants.space4), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -151,16 +152,12 @@ class CertificateCard extends StatelessWidget { children: [ Text( document.name, - style: UiTypography.body1m.copyWith( // 16px Medium - color: UiColors.textPrimary, - ), + style: UiTypography.body1m.textPrimary, ), const SizedBox(height: 2), Text( document.description ?? '', // Optional description - style: UiTypography.body3r.copyWith( // 12px Regular - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, ), ], ), @@ -172,7 +169,7 @@ class CertificateCard extends StatelessWidget { ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), if (showComplete) _buildCompleteStatus(document.expiryDate), @@ -186,9 +183,11 @@ class CertificateCard extends StatelessWidget { style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, + ), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space3, ), - padding: const EdgeInsets.symmetric(vertical: 12), elevation: 0, ), child: Row( @@ -202,9 +201,7 @@ class CertificateCard extends StatelessWidget { const SizedBox(width: 8), Text( t.staff_certificates.card.upload_button, - style: UiTypography.body2m.copyWith( // 14px Medium - color: UiColors.white, - ), + style: UiTypography.body2m.white, ), ], ), @@ -212,7 +209,7 @@ class CertificateCard extends StatelessWidget { ), if (showComplete || isExpiring || isExpired) ...[ - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), SizedBox( width: double.infinity, child: OutlinedButton.icon( @@ -223,13 +220,15 @@ class CertificateCard extends StatelessWidget { foregroundColor: UiColors.textPrimary, side: const BorderSide(color: UiColors.border), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, + ), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space3, ), - padding: const EdgeInsets.symmetric(vertical: 12), ), ), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), SizedBox( width: double.infinity, child: TextButton.icon( @@ -238,9 +237,11 @@ class CertificateCard extends StatelessWidget { label: Text(t.staff_certificates.card.remove), style: TextButton.styleFrom( foregroundColor: UiColors.destructive, - padding: const EdgeInsets.symmetric(vertical: 12), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space3, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), ), ), @@ -274,16 +275,14 @@ class CertificateCard extends StatelessWidget { const SizedBox(width: 8), Text( t.staff_certificates.card.verified, - style: UiTypography.body2m.copyWith( - color: UiColors.primary, - ), + style: UiTypography.body2m.textPrimary, ), ], ), if (expiryDate != null) Text( t.staff_certificates.card.exp(date: DateFormat('MMM d, yyyy').format(expiryDate)), - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body3r.textSecondary, ), ], ); diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_upload_modal.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_upload_modal.dart index 852038a2..5651d6af 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_upload_modal.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificate_upload_modal.dart @@ -6,7 +6,8 @@ import 'package:flutter/material.dart'; class CertificateUploadModal extends StatelessWidget { /// The document being edited, or null for a new upload. // ignore: unused_field - final dynamic document; // Using dynamic for now as we don't import domain here to avoid direct coupling if possible, but actually we should import domain. + final dynamic + document; // Using dynamic for now as we don't import domain here to avoid direct coupling if possible, but actually we should import domain. // Ideally, widgets should be dumb. Let's import domain. final VoidCallback onSave; @@ -24,13 +25,13 @@ class CertificateUploadModal extends StatelessWidget { return Container( height: MediaQuery.of(context).size.height * 0.75, decoration: const BoxDecoration( - color: Colors.white, + color: UiColors.bgPopup, borderRadius: BorderRadius.only( - topLeft: Radius.circular(24), - topRight: Radius.circular(24), + topLeft: Radius.circular(UiConstants.radiusBase), + topRight: Radius.circular(UiConstants.radiusBase), ), ), - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.all(UiConstants.space6), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -39,7 +40,7 @@ class CertificateUploadModal extends StatelessWidget { children: [ Text( t.staff_certificates.upload_modal.title, - style: UiTypography.headline3m.copyWith(color: UiColors.textPrimary), + style: UiTypography.headline3m.textPrimary, ), IconButton( onPressed: onCancel, @@ -47,35 +48,42 @@ class CertificateUploadModal extends StatelessWidget { ), ], ), - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), Text( t.staff_certificates.upload_modal.expiry_label, style: UiTypography.body1m, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + vertical: UiConstants.space3, + ), decoration: BoxDecoration( border: Border.all(color: UiColors.border), - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), child: Row( children: [ - const Icon(UiIcons.calendar, size: 20, color: UiColors.textSecondary), - const SizedBox(width: 12), + const Icon( + UiIcons.calendar, + size: 20, + color: UiColors.textSecondary, + ), + const SizedBox(width: UiConstants.space3), Text( t.staff_certificates.upload_modal.select_date, - style: UiTypography.body1m.copyWith(color: UiColors.textSecondary), + style: UiTypography.body1m.textSecondary, ), ], ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Text( t.staff_certificates.upload_modal.upload_file, style: UiTypography.body1m, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Expanded( child: Container( width: double.infinity, @@ -84,16 +92,16 @@ class CertificateUploadModal extends StatelessWidget { color: UiColors.border, style: BorderStyle.solid, ), - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, color: UiColors.background, ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - padding: const EdgeInsets.all(16), - decoration: const BoxDecoration( - color: Color(0xFFEFF6FF), // Light blue + padding: const EdgeInsets.all(UiConstants.space4), + decoration: BoxDecoration( + color: UiColors.tagActive, shape: BoxShape.circle, ), child: const Icon( @@ -102,7 +110,7 @@ class CertificateUploadModal extends StatelessWidget { color: UiColors.primary, ), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( t.staff_certificates.upload_modal.drag_drop, style: UiTypography.body1m, @@ -110,43 +118,51 @@ class CertificateUploadModal extends StatelessWidget { const SizedBox(height: 4), Text( t.staff_certificates.upload_modal.supported_formats, - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body3r.textSecondary, ), ], ), ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Row( children: [ Expanded( child: OutlinedButton( onPressed: onCancel, style: OutlinedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), side: const BorderSide(color: UiColors.border), ), - child: Text(t.staff_certificates.upload_modal.cancel, - style: UiTypography.body1m.copyWith(color: UiColors.textPrimary)), + child: Text( + t.staff_certificates.upload_modal.cancel, + style: UiTypography.body1m.textPrimary, + ), ), ), - const SizedBox(width: 16), + const SizedBox(width: UiConstants.space4), Expanded( child: ElevatedButton( onPressed: onSave, style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), elevation: 0, ), - child: Text(t.staff_certificates.upload_modal.save, - style: UiTypography.body1m.copyWith(color: Colors.white)), + child: Text( + t.staff_certificates.upload_modal.save, + style: UiTypography.body1m.white, + ), ), ), ], diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificates_header.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificates_header.dart index 0d07100f..49555db9 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificates_header.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/certificates/lib/src/presentation/widgets/certificates_header.dart @@ -20,13 +20,21 @@ class CertificatesHeader extends StatelessWidget { final int progressPercent = totalCount == 0 ? 0 : (progressValue * 100).round(); return Container( - padding: const EdgeInsets.fromLTRB(20, 60, 20, 80), + padding: const EdgeInsets.fromLTRB( + UiConstants.space5, + 60, + UiConstants.space5, + 80, + ), // Keeping gradient as per prototype layout requirement decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, - colors: [UiColors.primary, Color(0xFF1E40AF)], // Using Primary and a darker shade + colors: [ + UiColors.primary, + Color(0xFF1E40AF), + ], // Using Primary and a darker shade ), ), child: Column( @@ -39,7 +47,7 @@ class CertificatesHeader extends StatelessWidget { width: 40, height: 40, decoration: BoxDecoration( - color: UiColors.white.withOpacity(0.1), + color: UiColors.white.withValues(alpha: 0.1), shape: BoxShape.circle, ), child: const Icon( @@ -49,16 +57,14 @@ class CertificatesHeader extends StatelessWidget { ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Text( t.staff_certificates.title, - style: UiTypography.headline3m.copyWith( // 18px Bold - color: UiColors.white, - ), + style: UiTypography.headline3m.white, ), ], ), - const SizedBox(height: 32), + const SizedBox(height: UiConstants.space8), Row( children: [ SizedBox( @@ -70,53 +76,48 @@ class CertificatesHeader extends StatelessWidget { CircularProgressIndicator( value: progressValue, strokeWidth: 8, - backgroundColor: UiColors.white.withOpacity(0.2), + backgroundColor: UiColors.white.withValues(alpha: 0.2), valueColor: const AlwaysStoppedAnimation( - Color(0xFFF9E547), // Yellow from prototype + UiColors.accent, // Yellow from prototype ), ), Center( child: Text( '$progressPercent%', - style: UiTypography.display1b.copyWith( // 26px Bold - color: UiColors.white, - ), + style: UiTypography.display1b.white, ), ), ], ), ), - const SizedBox(width: 24), + const SizedBox(width: UiConstants.space6), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( t.staff_certificates.progress.title, - style: UiTypography.body1b.copyWith( // 16px Bold - color: UiColors.white, - ), + style: UiTypography.body1b.white, ), const SizedBox(height: 4), Text( - t.staff_certificates.progress.verified_count(completed: completedCount, total: totalCount), - style: UiTypography.body3r.copyWith( // 12px Regular - color: UiColors.white.withOpacity(0.7), + t.staff_certificates.progress.verified_count( + completed: completedCount, total: totalCount), + style: UiTypography.body3r.copyWith( + color: UiColors.white.withValues(alpha: 0.7), ), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Row( children: [ const Icon( UiIcons.shield, - color: Color(0xFFF9E547), + color: UiColors.accent, size: 16, ), const SizedBox(width: 8), Text( t.staff_certificates.progress.active, - style: UiTypography.body3m.copyWith( // 12px Medium - color: const Color(0xFFF9E547), - ), + style: UiTypography.body3m.accent, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/pages/documents_page.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/pages/documents_page.dart index fb2e6526..28f95fcf 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/pages/documents_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/pages/documents_page.dart @@ -25,15 +25,14 @@ class DocumentsPage extends StatelessWidget { return Scaffold( appBar: AppBar( elevation: 0, + backgroundColor: UiColors.bgPopup, leading: IconButton( icon: const Icon(UiIcons.arrowLeft, color: UiColors.iconSecondary), onPressed: () => Modular.to.pop(), ), title: Text( t.staff_documents.title, - style: UiTypography.headline3m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline3m.textPrimary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(1.0), @@ -56,7 +55,7 @@ class DocumentsPage extends StatelessWidget { t.staff_documents.list.error( message: state.errorMessage ?? 'Unknown', ), - style: UiTypography.body1m.copyWith(color: UiColors.textError), + style: UiTypography.body1m.textError, ), ); } @@ -64,20 +63,23 @@ class DocumentsPage extends StatelessWidget { return Center( child: Text( t.staff_documents.list.empty, - style: UiTypography.body1m.copyWith(color: UiColors.textSecondary), + style: UiTypography.body1m.textSecondary, ), ); } return ListView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 24), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + vertical: UiConstants.space6, + ), children: [ DocumentsProgressCard( completedCount: state.completedCount, totalCount: state.totalCount, progress: state.progress, ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), ...state.documents.map( (StaffDocument doc) => DocumentCard( document: doc, diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/document_card.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/document_card.dart index 764caa18..0331e566 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/document_card.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/document_card.dart @@ -1,7 +1,6 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:krow_domain/krow_domain.dart'; -import 'package:lucide_icons/lucide_icons.dart'; // ignore: depend_on_referenced_packages import 'package:core_localization/core_localization.dart'; @@ -18,11 +17,11 @@ class DocumentCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - margin: const EdgeInsets.only(bottom: 12), - padding: const EdgeInsets.all(16), + margin: const EdgeInsets.only(bottom: UiConstants.space3), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(8), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Row( @@ -32,7 +31,7 @@ class DocumentCard extends StatelessWidget { width: 40, height: 40, decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(8), ), child: const Center( @@ -43,7 +42,7 @@ class DocumentCard extends StatelessWidget { ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -53,9 +52,7 @@ class DocumentCard extends StatelessWidget { children: [ Text( document.name, - style: UiTypography.body1m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body1m.textPrimary, ), _getStatusIcon(document.status), ], @@ -64,15 +61,13 @@ class DocumentCard extends StatelessWidget { if (document.description != null) Text( document.description!, - style: UiTypography.body2r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body2r.textSecondary, ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( children: [ _buildStatusBadge(document.status), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), _buildActionButton(document.status), ], ), @@ -114,27 +109,27 @@ class DocumentCard extends StatelessWidget { switch (status) { case DocumentStatus.verified: - bg = UiColors.textSuccess.withOpacity(0.2); + bg = UiColors.tagSuccess; text = UiColors.textSuccess; label = t.staff_documents.card.verified; break; case DocumentStatus.pending: - bg = UiColors.textWarning.withOpacity(0.2); + bg = UiColors.tagPending; text = UiColors.textWarning; label = t.staff_documents.card.pending; break; case DocumentStatus.missing: - bg = UiColors.textError.withOpacity(0.2); + bg = UiColors.textError.withValues(alpha: 0.1); text = UiColors.textError; label = t.staff_documents.card.missing; break; case DocumentStatus.rejected: - bg = UiColors.textError.withOpacity(0.2); + bg = UiColors.textError.withValues(alpha: 0.1); text = UiColors.textError; label = t.staff_documents.card.rejected; break; case DocumentStatus.expired: - bg = UiColors.textError.withOpacity(0.2); + bg = UiColors.textError.withValues(alpha: 0.1); text = UiColors.textError; label = t.staff_documents.card.rejected; // Or define "Expired" string break; @@ -165,7 +160,7 @@ class DocumentCard extends StatelessWidget { child: Row( children: [ Icon( - isVerified ? UiIcons.eye : LucideIcons.upload, + isVerified ? UiIcons.eye : UiIcons.upload, size: 16, color: UiColors.primary, ), @@ -174,9 +169,7 @@ class DocumentCard extends StatelessWidget { isVerified ? t.staff_documents.card.view : t.staff_documents.card.upload, - style: UiTypography.body3m.copyWith( - color: UiColors.primary, - ), + style: UiTypography.body3m.primary, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/documents_progress_card.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/documents_progress_card.dart index 95395e08..50180fb6 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/documents_progress_card.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/documents/lib/src/presentation/widgets/documents_progress_card.dart @@ -24,10 +24,10 @@ class DocumentsProgressCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(8), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Column( @@ -37,16 +37,14 @@ class DocumentsProgressCard extends StatelessWidget { children: [ Text( t.staff_documents.verification_card.title, - style: UiTypography.body1m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body1m.textPrimary, ), Text( t.staff_documents.verification_card.progress( completed: completedCount, total: totalCount, ), - style: UiTypography.body2r.copyWith(color: UiColors.primary), + style: UiTypography.body2r.primary, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_i9_page.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_i9_page.dart index fc513b7a..19affeb5 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_i9_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_i9_page.dart @@ -83,10 +83,13 @@ class _FormI9PageState extends State { if (state.status == FormI9Status.success) { // Success view is handled by state check in build or we can navigate } else if (state.status == FormI9Status.failure) { - final ScaffoldMessengerState messenger = ScaffoldMessenger.of(context); + final ScaffoldMessengerState messenger = + ScaffoldMessenger.of(context); messenger.hideCurrentSnackBar(); messenger.showSnackBar( - SnackBar(content: Text(state.errorMessage ?? 'An error occurred')), + SnackBar( + content: Text(state.errorMessage ?? 'An error occurred'), + ), ); } }, @@ -100,7 +103,10 @@ class _FormI9PageState extends State { _buildHeader(context, state), Expanded( child: SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 24), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + vertical: UiConstants.space6, + ), child: _buildCurrentStep(context, state), ), ), @@ -118,9 +124,9 @@ class _FormI9PageState extends State { backgroundColor: UiColors.background, body: Center( child: Padding( - padding: const EdgeInsets.all(24.0), + padding: const EdgeInsets.all(UiConstants.space6), child: Container( - padding: const EdgeInsets.all(32), + padding: const EdgeInsets.all(UiConstants.space8), decoration: BoxDecoration( color: UiColors.bgPopup, borderRadius: BorderRadius.circular(24), @@ -132,40 +138,40 @@ class _FormI9PageState extends State { Container( width: 64, height: 64, - decoration: const BoxDecoration( - color: Color(0xFFDCFCE7), + decoration: BoxDecoration( + color: UiColors.tagSuccess, shape: BoxShape.circle, ), child: const Icon( UiIcons.success, - color: Color(0xFF16A34A), + color: UiColors.textSuccess, size: 32, ), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( 'Form I-9 Submitted!', - style: UiTypography.headline4m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline4m.textPrimary, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( 'Your employment eligibility verification has been submitted.', textAlign: TextAlign.center, - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () => Modular.to.pop(true), style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - foregroundColor: UiColors.bgPopup, - padding: const EdgeInsets.symmetric(vertical: 16), + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), elevation: 0, ), @@ -183,7 +189,12 @@ class _FormI9PageState extends State { Widget _buildHeader(BuildContext context, FormI9State state) { return Container( color: UiColors.primary, - padding: const EdgeInsets.only(top: 60, bottom: 24, left: 20, right: 20), + padding: const EdgeInsets.only( + top: 60, + bottom: UiConstants.space6, + left: UiConstants.space5, + right: UiConstants.space5, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -193,31 +204,34 @@ class _FormI9PageState extends State { onTap: () => Modular.to.pop(), child: const Icon( UiIcons.arrowLeft, - color: UiColors.bgPopup, + color: UiColors.white, size: 24, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Form I-9', - style: UiTypography.headline4m.copyWith( - color: UiColors.bgPopup, - ), + style: UiTypography.headline4m.white, ), Text( 'Employment Eligibility Verification', - style: UiTypography.body3r.copyWith(color: UiColors.bgPopup.withOpacity(0.7)), + style: UiTypography.body3r.copyWith( + color: UiColors.white.withValues(alpha: 0.7), + ), ), ], ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Row( - children: _steps.asMap().entries.map((MapEntry> entry) { + children: _steps + .asMap() + .entries + .map((MapEntry> entry) { final int idx = entry.key; final bool isLast = idx == _steps.length - 1; return Expanded( @@ -228,8 +242,8 @@ class _FormI9PageState extends State { height: 4, decoration: BoxDecoration( color: idx <= state.currentStep - ? UiColors.bgPopup - : UiColors.bgPopup.withOpacity(0.3), + ? UiColors.white + : UiColors.white.withValues(alpha: 0.3), borderRadius: BorderRadius.circular(2), ), ), @@ -240,20 +254,21 @@ class _FormI9PageState extends State { ); }).toList(), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Step ${state.currentStep + 1} of ${_steps.length}', - style: UiTypography.body3r.copyWith(color: UiColors.bgPopup.withOpacity(0.7)), + style: UiTypography.body3r.copyWith( + color: UiColors.white.withValues(alpha: 0.7), + ), ), Expanded( child: Text( _steps[state.currentStep]['title']!, textAlign: TextAlign.end, - style: UiTypography.body3m.copyWith( - color: UiColors.bgPopup, + style: UiTypography.body3m.white.copyWith( fontWeight: FontWeight.w500, ), ), @@ -292,8 +307,7 @@ class _FormI9PageState extends State { children: [ Text( label, - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, + style: UiTypography.body3m.textSecondary.copyWith( fontWeight: FontWeight.w500, ), ), @@ -305,26 +319,26 @@ class _FormI9PageState extends State { ), onChanged: onChanged, keyboardType: keyboardType, - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, decoration: InputDecoration( hintText: placeholder, - hintStyle: TextStyle(color: Colors.grey[400]), + hintStyle: const TextStyle(color: UiColors.textPlaceholder), filled: true, fillColor: UiColors.bgPopup, contentPadding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 16, + horizontal: UiConstants.space4, + vertical: UiConstants.space4, ), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.primary), ), ), @@ -455,15 +469,15 @@ class _FormI9PageState extends State { children: [ Text( 'State *', - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, + style: UiTypography.body3m.textSecondary.copyWith( fontWeight: FontWeight.w500, ), ), const SizedBox(height: 6), DropdownButtonFormField( value: state.state.isEmpty ? null : state.state, - onChanged: (String? val) => context.read().stateChanged(val ?? ''), + onChanged: (String? val) => + context.read().stateChanged(val ?? ''), items: _usStates.map((String stateAbbr) { return DropdownMenuItem( value: stateAbbr, @@ -473,13 +487,15 @@ class _FormI9PageState extends State { decoration: InputDecoration( filled: true, fillColor: UiColors.bgPopup, - contentPadding: const EdgeInsets.symmetric(horizontal: 16), + contentPadding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + ), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), ), @@ -507,9 +523,9 @@ class _FormI9PageState extends State { children: [ Text( 'I attest, under penalty of perjury, that I am (check one of the following boxes):', - style: UiTypography.body2m.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2m.textPrimary, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), _buildRadioOption( context, state, @@ -578,15 +594,21 @@ class _FormI9PageState extends State { ); } - Widget _buildRadioOption(BuildContext context, FormI9State state, String value, String label, {Widget? child}) { + Widget _buildRadioOption( + BuildContext context, + FormI9State state, + String value, + String label, { + Widget? child, + }) { final bool isSelected = state.citizenshipStatus == value; return GestureDetector( onTap: () => context.read().citizenshipStatusChanged(value), child: Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, border: Border.all( color: isSelected ? UiColors.primary : UiColors.border, width: isSelected ? 2 : 1, @@ -602,18 +624,16 @@ class _FormI9PageState extends State { decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: isSelected ? UiColors.primary : Colors.grey, + color: isSelected ? UiColors.primary : UiColors.border, width: isSelected ? 6 : 2, ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Text( label, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), ), ], @@ -630,10 +650,10 @@ class _FormI9PageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Column( @@ -643,15 +663,21 @@ class _FormI9PageState extends State { 'Summary', style: UiTypography.headline4m.copyWith(fontSize: 14), ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), _buildSummaryRow('Name', '${state.firstName} ${state.lastName}'), _buildSummaryRow('Address', '${state.address}, ${state.city}'), - _buildSummaryRow('SSN', '***-**-${state.ssn.length >= 4 ? state.ssn.substring(state.ssn.length - 4) : '****'}'), - _buildSummaryRow('Citizenship', _getReadableCitizenship(state.citizenshipStatus)), + _buildSummaryRow( + 'SSN', + '***-**-${state.ssn.length >= 4 ? state.ssn.substring(state.ssn.length - 4) : '****'}', + ), + _buildSummaryRow( + 'Citizenship', + _getReadableCitizenship(state.citizenshipStatus), + ), ], ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), CheckboxListTile( value: state.preparerUsed, onChanged: (bool? val) { @@ -660,29 +686,27 @@ class _FormI9PageState extends State { contentPadding: EdgeInsets.zero, title: Text( 'I used a preparer or translator', - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, ), controlAffinity: ListTileControlAffinity.leading, activeColor: UiColors.primary, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.amber[50], - borderRadius: BorderRadius.circular(12), + color: UiColors.accent.withValues(alpha: 0.1), + borderRadius: UiConstants.radiusLg, ), - child: const Text( + child: Text( 'I am aware that federal law provides for imprisonment and/or fines for false statements or use of false documents in connection with the completion of this form.', - style: TextStyle(fontSize: 12, color: Color(0xFFB45309)), + style: UiTypography.body3r.textWarning.copyWith(fontSize: 12), ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Text( 'Signature (type your full name) *', - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3m.textSecondary, ), const SizedBox(height: 6), TextField( @@ -690,44 +714,46 @@ class _FormI9PageState extends State { ..selection = TextSelection.fromPosition( TextPosition(offset: state.signature.length), ), - onChanged: (String val) => context.read().signatureChanged(val), + onChanged: (String val) => + context.read().signatureChanged(val), decoration: InputDecoration( hintText: 'Type your full name', filled: true, fillColor: UiColors.bgPopup, contentPadding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 16, + horizontal: UiConstants.space4, + vertical: UiConstants.space4, ), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.primary), ), ), style: const TextStyle(fontFamily: 'Cursive', fontSize: 18), ), - const SizedBox(height: 16), - Text( + const SizedBox(height: UiConstants.space4), + Text( 'Date', - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3m.textSecondary, ), const SizedBox(height: 6), Container( width: double.infinity, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + vertical: UiConstants.space4, + ), decoration: BoxDecoration( - color: const Color(0xFFF3F4F6), - borderRadius: BorderRadius.circular(12), + color: UiColors.bgSecondary, + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Text( @@ -747,15 +773,13 @@ class _FormI9PageState extends State { children: [ Text( label, - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), Expanded( child: Text( value, textAlign: TextAlign.end, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), ), ], @@ -780,7 +804,7 @@ class _FormI9PageState extends State { Widget _buildFooter(BuildContext context, FormI9State state) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: const BoxDecoration( color: UiColors.bgPopup, border: Border(top: BorderSide(color: UiColors.border)), @@ -791,24 +815,30 @@ class _FormI9PageState extends State { if (state.currentStep > 0) Expanded( child: Padding( - padding: const EdgeInsets.only(right: 12), + padding: const EdgeInsets.only(right: UiConstants.space3), child: OutlinedButton( onPressed: () => _handleBack(context), style: OutlinedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), side: const BorderSide(color: UiColors.border), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(UiIcons.arrowLeft, size: 16, color: UiColors.textPrimary), + const Icon( + UiIcons.arrowLeft, + size: 16, + color: UiColors.textPrimary, + ), const SizedBox(width: 8), Text( 'Back', - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, ), ], ), @@ -818,16 +848,20 @@ class _FormI9PageState extends State { Expanded( flex: 2, child: ElevatedButton( - onPressed: (_canProceed(state) && state.status != FormI9Status.submitting) + onPressed: ( + _canProceed(state) && + state.status != FormI9Status.submitting) ? () => _handleNext(context, state.currentStep) : null, style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - disabledBackgroundColor: Colors.grey[300], - foregroundColor: UiColors.bgPopup, - padding: const EdgeInsets.symmetric(vertical: 16), + disabledBackgroundColor: UiColors.bgSecondary, + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), elevation: 0, ), @@ -836,7 +870,7 @@ class _FormI9PageState extends State { width: 20, height: 20, child: CircularProgressIndicator( - color: UiColors.bgPopup, + color: UiColors.white, strokeWidth: 2, ), ) @@ -850,7 +884,7 @@ class _FormI9PageState extends State { ), if (state.currentStep < _steps.length - 1) ...[ const SizedBox(width: 8), - const Icon(UiIcons.arrowRight, size: 16, color: UiColors.bgPopup), + const Icon(UiIcons.arrowRight, size: 16, color: UiColors.white), ], ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_w4_page.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_w4_page.dart index 7d147b91..c8969568 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_w4_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/form_w4_page.dart @@ -146,7 +146,10 @@ class _FormW4PageState extends State { _buildHeader(context, state), Expanded( child: SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 24), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + vertical: UiConstants.space6, + ), child: _buildCurrentStep(context, state), ), ), @@ -164,9 +167,9 @@ class _FormW4PageState extends State { backgroundColor: UiColors.background, body: Center( child: Padding( - padding: const EdgeInsets.all(24.0), + padding: const EdgeInsets.all(UiConstants.space6), child: Container( - padding: const EdgeInsets.all(32), + padding: const EdgeInsets.all(UiConstants.space8), decoration: BoxDecoration( color: UiColors.bgPopup, borderRadius: BorderRadius.circular(24), @@ -178,40 +181,40 @@ class _FormW4PageState extends State { Container( width: 64, height: 64, - decoration: const BoxDecoration( - color: Color(0xFFDCFCE7), + decoration: BoxDecoration( + color: UiColors.tagSuccess, shape: BoxShape.circle, ), child: const Icon( UiIcons.success, - color: Color(0xFF16A34A), + color: UiColors.textSuccess, size: 32, ), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( 'Form W-4 Submitted!', - style: UiTypography.headline4m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline4m.textPrimary, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( 'Your withholding certificate has been submitted to your employer.', textAlign: TextAlign.center, - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () => Modular.to.pop(true), style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - foregroundColor: UiColors.bgPopup, - padding: const EdgeInsets.symmetric(vertical: 16), + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), elevation: 0, ), @@ -229,7 +232,12 @@ class _FormW4PageState extends State { Widget _buildHeader(BuildContext context, FormW4State state) { return Container( color: UiColors.primary, - padding: const EdgeInsets.only(top: 60, bottom: 24, left: 20, right: 20), + padding: const EdgeInsets.only( + top: 60, + bottom: UiConstants.space6, + left: UiConstants.space5, + right: UiConstants.space5, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -239,31 +247,34 @@ class _FormW4PageState extends State { onTap: () => Modular.to.pop(), child: const Icon( UiIcons.arrowLeft, - color: UiColors.bgPopup, + color: UiColors.white, size: 24, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Form W-4', - style: UiTypography.headline4m.copyWith( - color: UiColors.bgPopup, - ), + style: UiTypography.headline4m.white, ), Text( 'Employee\'s Withholding Certificate', - style: UiTypography.body3r.copyWith(color: UiColors.bgPopup.withOpacity(0.7)), + style: UiTypography.body3r.copyWith( + color: UiColors.white.withValues(alpha: 0.7), + ), ), ], ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Row( - children: _steps.asMap().entries.map((MapEntry> entry) { + children: _steps + .asMap() + .entries + .map((MapEntry> entry) { final int idx = entry.key; final bool isLast = idx == _steps.length - 1; return Expanded( @@ -274,8 +285,8 @@ class _FormW4PageState extends State { height: 4, decoration: BoxDecoration( color: idx <= state.currentStep - ? UiColors.bgPopup - : UiColors.bgPopup.withOpacity(0.3), + ? UiColors.white + : UiColors.white.withValues(alpha: 0.3), borderRadius: BorderRadius.circular(2), ), ), @@ -286,18 +297,19 @@ class _FormW4PageState extends State { ); }).toList(), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Step ${state.currentStep + 1} of ${_steps.length}', - style: UiTypography.body3r.copyWith(color: UiColors.bgPopup.withOpacity(0.7)), + style: UiTypography.body3r.copyWith( + color: UiColors.white.withValues(alpha: 0.7), + ), ), Text( _steps[state.currentStep]['title']!, - style: UiTypography.body3m.copyWith( - color: UiColors.bgPopup, + style: UiTypography.body3m.white.copyWith( fontWeight: FontWeight.w500, ), ), @@ -339,8 +351,7 @@ class _FormW4PageState extends State { children: [ Text( label, - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, + style: UiTypography.body3m.textSecondary.copyWith( fontWeight: FontWeight.w500, ), ), @@ -352,26 +363,26 @@ class _FormW4PageState extends State { ), onChanged: onChanged, keyboardType: keyboardType, - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, decoration: InputDecoration( hintText: placeholder, - hintStyle: TextStyle(color: Colors.grey[400]), + hintStyle: const TextStyle(color: UiColors.textPlaceholder), filled: true, fillColor: UiColors.bgPopup, contentPadding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 16, + horizontal: UiConstants.space4, + vertical: UiConstants.space4, ), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.primary), ), ), @@ -438,25 +449,25 @@ class _FormW4PageState extends State { return Column( children: [ Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.blue[50], - borderRadius: BorderRadius.circular(12), + color: UiColors.tagActive, + borderRadius: UiConstants.radiusLg, ), child: Row( - children: const [ - Icon(UiIcons.info, color: Color(0xFF2563EB), size: 20), - SizedBox(width: 12), + children: [ + const Icon(UiIcons.info, color: UiColors.primary, size: 20), + const SizedBox(width: UiConstants.space3), Expanded( child: Text( 'Your filing status determines your standard deduction and tax rates.', - style: TextStyle(fontSize: 14, color: Color(0xFF1D4ED8)), + style: UiTypography.body2r.textPrimary, ), ), ], ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), _buildRadioOption( context, state, @@ -484,15 +495,21 @@ class _FormW4PageState extends State { ); } - Widget _buildRadioOption(BuildContext context, FormW4State state, String value, String label, String? subLabel) { + Widget _buildRadioOption( + BuildContext context, + FormW4State state, + String value, + String label, + String? subLabel, + ) { final bool isSelected = state.filingStatus == value; return GestureDetector( onTap: () => context.read().filingStatusChanged(value), child: Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, border: Border.all( color: isSelected ? UiColors.primary : UiColors.border, width: isSelected ? 2 : 1, @@ -508,29 +525,25 @@ class _FormW4PageState extends State { decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: isSelected ? UiColors.primary : Colors.grey, + color: isSelected ? UiColors.primary : UiColors.border, width: isSelected ? 6 : 2, ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), if (subLabel != null) ...[ const SizedBox(height: 4), Text( subLabel, - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, ), ], ], @@ -546,36 +559,32 @@ class _FormW4PageState extends State { return Column( children: [ Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.amber[50], - borderRadius: BorderRadius.circular(12), + color: UiColors.accent.withValues(alpha: 0.1), + borderRadius: UiConstants.radiusLg, ), - child: const Row( + child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon( + const Icon( UiIcons.help, - color: Color(0xFFD97706), + color: UiColors.accent, size: 20, ), - SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'When to complete this step?', - style: TextStyle( - fontWeight: FontWeight.w600, - color: Color(0xFF92400E), - fontSize: 14, - ), + style: UiTypography.body2m.accent, ), - SizedBox(height: 4), + const SizedBox(height: 4), Text( 'Complete this step only if you hold more than one job at a time, or are married filing jointly and your spouse also works.', - style: TextStyle(fontSize: 12, color: Color(0xFFB45309)), + style: UiTypography.body3r.accent, ), ], ), @@ -583,18 +592,17 @@ class _FormW4PageState extends State { ], ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), GestureDetector( - onTap: () => context.read().multipleJobsChanged(!state.multipleJobs), + onTap: () => + context.read().multipleJobsChanged(!state.multipleJobs), child: Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, border: Border.all( - color: state.multipleJobs - ? UiColors.primary - : UiColors.border, + color: state.multipleJobs ? UiColors.primary : UiColors.border, ), ), child: Row( @@ -604,20 +612,16 @@ class _FormW4PageState extends State { width: 24, height: 24, decoration: BoxDecoration( - color: state.multipleJobs - ? UiColors.primary - : UiColors.bgPopup, + color: state.multipleJobs ? UiColors.primary : UiColors.bgPopup, borderRadius: BorderRadius.circular(6), border: Border.all( - color: state.multipleJobs - ? UiColors.primary - : Colors.grey, + color: state.multipleJobs ? UiColors.primary : UiColors.border, ), ), child: state.multipleJobs ? const Icon( UiIcons.check, - color: UiColors.bgPopup, + color: UiColors.white, size: 16, ) : null, @@ -629,16 +633,12 @@ class _FormW4PageState extends State { children: [ Text( 'I have multiple jobs or my spouse works', - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), const SizedBox(height: 4), Text( 'Check this box if there are only two jobs total', - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, ), ], ), @@ -651,7 +651,7 @@ class _FormW4PageState extends State { Text( 'If this does not apply, you can continue to the next step', textAlign: TextAlign.center, - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body3r.textSecondary, ), ], ); @@ -661,30 +661,30 @@ class _FormW4PageState extends State { return Column( children: [ Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.blue[50], // Same note about blue migration - borderRadius: BorderRadius.circular(12), + color: UiColors.tagActive, + borderRadius: UiConstants.radiusLg, ), - child: const Row( + child: Row( children: [ - Icon(UiIcons.info, color: Color(0xFF2563EB), size: 20), - SizedBox(width: 12), + const Icon(UiIcons.info, color: UiColors.primary, size: 20), + const SizedBox(width: UiConstants.space3), Expanded( child: Text( 'If your total income will be \$200,000 or less (\$400,000 if married filing jointly), you may claim credits for dependents.', - style: TextStyle(fontSize: 14, color: Color(0xFF1D4ED8)), + style: UiTypography.body2r.textPrimary, ), ), ], ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(16), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Column( @@ -715,10 +715,10 @@ class _FormW4PageState extends State { if (_totalCredits(state) > 0) ...[ const SizedBox(height: 16), Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: const Color(0xFFDCFCE7), - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -770,16 +770,12 @@ class _FormW4PageState extends State { Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: const Color(0xFFDCFCE7), - borderRadius: BorderRadius.circular(12), + color: UiColors.tagSuccess, + borderRadius: UiConstants.radiusLg, ), child: Text( badge, - style: const TextStyle( - fontSize: 10, - color: Color(0xFF15803D), - fontWeight: FontWeight.bold, - ), + style: UiTypography.footnote2b.textSuccess, ), ), ], @@ -834,7 +830,7 @@ class _FormW4PageState extends State { children: [ Text( 'These adjustments are optional. You can skip them if they don\'t apply.', - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), const SizedBox(height: 24), _buildTextField( @@ -848,7 +844,7 @@ class _FormW4PageState extends State { padding: const EdgeInsets.only(top: 4, bottom: 16), child: Text( 'Include interest, dividends, retirement income', - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body3r.textSecondary, ), ), @@ -863,7 +859,7 @@ class _FormW4PageState extends State { padding: const EdgeInsets.only(top: 4, bottom: 16), child: Text( 'If you expect to claim deductions other than the standard deduction', - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body3r.textSecondary, ), ), @@ -878,7 +874,7 @@ class _FormW4PageState extends State { padding: const EdgeInsets.only(top: 4, bottom: 16), child: Text( 'Any additional tax you want withheld each pay period', - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body3r.textSecondary, ), ), ], @@ -890,10 +886,10 @@ class _FormW4PageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Column( @@ -927,22 +923,20 @@ class _FormW4PageState extends State { ), const SizedBox(height: 24), Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.amber[50], - borderRadius: BorderRadius.circular(12), + color: UiColors.accent.withValues(alpha: 0.1), + borderRadius: UiConstants.radiusLg, ), - child: const Text( + child: Text( 'Under penalties of perjury, I declare that this certificate, to the best of my knowledge and belief, is true, correct, and complete.', - style: TextStyle(fontSize: 12, color: Color(0xFFB45309)), + style: UiTypography.body3r.textWarning.copyWith(fontSize: 12), ), ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), Text( 'Signature (type your full name) *', - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3m.textSecondary, ), const SizedBox(height: 6), TextField( @@ -950,44 +944,46 @@ class _FormW4PageState extends State { ..selection = TextSelection.fromPosition( TextPosition(offset: state.signature.length), ), - onChanged: (String val) => context.read().signatureChanged(val), + onChanged: (String val) => + context.read().signatureChanged(val), decoration: InputDecoration( hintText: 'Type your full name', filled: true, fillColor: UiColors.bgPopup, contentPadding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 16, + horizontal: UiConstants.space4, + vertical: UiConstants.space4, ), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.border), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, borderSide: const BorderSide(color: UiColors.primary), ), ), style: const TextStyle(fontFamily: 'Cursive', fontSize: 18), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( 'Date', - style: UiTypography.body3m.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3m.textSecondary, ), const SizedBox(height: 6), Container( width: double.infinity, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + vertical: UiConstants.space4, + ), decoration: BoxDecoration( - color: const Color(0xFFF3F4F6), - borderRadius: BorderRadius.circular(12), + color: UiColors.bgSecondary, + borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), ), child: Text( @@ -1007,7 +1003,7 @@ class _FormW4PageState extends State { children: [ Text( label, - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), Text( value, @@ -1035,7 +1031,7 @@ class _FormW4PageState extends State { Widget _buildFooter(BuildContext context, FormW4State state) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: const BoxDecoration( color: UiColors.bgPopup, border: Border(top: BorderSide(color: UiColors.border)), @@ -1046,24 +1042,30 @@ class _FormW4PageState extends State { if (state.currentStep > 0) Expanded( child: Padding( - padding: const EdgeInsets.only(right: 12), + padding: const EdgeInsets.only(right: UiConstants.space3), child: OutlinedButton( onPressed: () => _handleBack(context), style: OutlinedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), side: const BorderSide(color: UiColors.border), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(UiIcons.arrowLeft, size: 16, color: UiColors.textPrimary), + const Icon( + UiIcons.arrowLeft, + size: 16, + color: UiColors.textPrimary, + ), const SizedBox(width: 8), Text( 'Back', - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, ), ], ), @@ -1073,16 +1075,20 @@ class _FormW4PageState extends State { Expanded( flex: 2, child: ElevatedButton( - onPressed: (_canProceed(state) && state.status != FormW4Status.submitting) + onPressed: ( + _canProceed(state) && + state.status != FormW4Status.submitting) ? () => _handleNext(context, state.currentStep) : null, style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - disabledBackgroundColor: Colors.grey[300], - foregroundColor: UiColors.bgPopup, - padding: const EdgeInsets.symmetric(vertical: 16), + disabledBackgroundColor: UiColors.bgSecondary, + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), + borderRadius: UiConstants.radiusLg, ), elevation: 0, ), @@ -1091,7 +1097,7 @@ class _FormW4PageState extends State { width: 20, height: 20, child: CircularProgressIndicator( - color: UiColors.bgPopup, + color: UiColors.white, strokeWidth: 2, ), ) @@ -1105,7 +1111,7 @@ class _FormW4PageState extends State { ), if (state.currentStep < _steps.length - 1) ...[ const SizedBox(width: 8), - const Icon(UiIcons.arrowRight, size: 16, color: UiColors.bgPopup), + const Icon(UiIcons.arrowRight, size: 16, color: UiColors.white), ], ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart index 923e7f24..b6957ca6 100644 --- a/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms/lib/src/presentation/pages/tax_forms_page.dart @@ -21,7 +21,7 @@ class TaxFormsPage extends StatelessWidget { ), title: Text( 'Tax Documents', - style: UiTypography.headline3m.copyWith(color: UiColors.bgPopup), + style: UiTypography.headline3m.textSecondary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(24), @@ -37,7 +37,7 @@ class TaxFormsPage extends StatelessWidget { child: Text( 'Complete required forms to start working', style: UiTypography.body3r.copyWith( - color: UiColors.bgPopup.withOpacity(0.8), + color: UiColors.primaryForeground.withValues(alpha: 0.8), ), ), ), @@ -111,15 +111,11 @@ class TaxFormsPage extends StatelessWidget { children: [ Text( 'Document Progress', - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), Text( '$completedCount/$totalCount', - style: UiTypography.body2m.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body2m.textSecondary, ), ], ), @@ -171,7 +167,7 @@ class TaxFormsPage extends StatelessWidget { width: 48, height: 48, decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), borderRadius: UiConstants.radiusLg, ), child: Center(child: Text(icon, style: UiTypography.headline1m)), @@ -186,9 +182,7 @@ class TaxFormsPage extends StatelessWidget { children: [ Text( form.title, - style: UiTypography.headline4m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline4m.textPrimary, ), _buildStatusBadge(form.status), ], @@ -196,17 +190,14 @@ class TaxFormsPage extends StatelessWidget { const SizedBox(height: UiConstants.space1), Text( form.subtitle ?? '', - style: UiTypography.body2m.copyWith( + style: UiTypography.body2m.textSecondary.copyWith( fontWeight: FontWeight.w500, - color: UiColors.textSecondary, ), ), const SizedBox(height: UiConstants.space1), Text( form.description ?? '', - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, ), ], ), @@ -247,9 +238,7 @@ class TaxFormsPage extends StatelessWidget { const SizedBox(width: UiConstants.space1), Text( 'Completed', - style: UiTypography.footnote2b.copyWith( - color: UiColors.textSuccess, - ), + style: UiTypography.footnote2b.textSuccess, ), ], ), @@ -271,9 +260,7 @@ class TaxFormsPage extends StatelessWidget { const SizedBox(width: UiConstants.space1), Text( 'In Progress', - style: UiTypography.footnote2b.copyWith( - color: UiColors.textWarning, - ), + style: UiTypography.footnote2b.textWarning, ), ], ), @@ -290,9 +277,7 @@ class TaxFormsPage extends StatelessWidget { ), child: Text( 'Not Started', - style: UiTypography.footnote2b.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote2b.textSecondary, ), ); } @@ -316,16 +301,12 @@ class TaxFormsPage extends StatelessWidget { children: [ Text( 'Why are these needed?', - style: UiTypography.headline4m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline4m.textPrimary, ), const SizedBox(height: UiConstants.space1), Text( 'I-9 and W-4 forms are required by federal law to verify your employment eligibility and set up correct tax withholding.', - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/pages/bank_account_page.dart b/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/pages/bank_account_page.dart index ffa8e21f..210e7502 100644 --- a/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/pages/bank_account_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/pages/bank_account_page.dart @@ -37,7 +37,7 @@ class BankAccountPage extends StatelessWidget { ), title: Text( strings.title, - style: UiTypography.headline3m.copyWith(color: UiColors.textPrimary), + style: UiTypography.headline3m.textPrimary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(1.0), @@ -143,7 +143,7 @@ class BankAccountPage extends StatelessWidget { return Container( padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.08), + color: UiColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: Row( @@ -157,15 +157,12 @@ class BankAccountPage extends StatelessWidget { children: [ Text( strings.secure_title, - style: UiTypography.body2r.copyWith( // Was body2 - fontWeight: FontWeight.w500, - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), const SizedBox(height: 2), Text( strings.secure_subtitle, - style: UiTypography.body3r.copyWith(color: UiColors.textSecondary), // Was bodySmall + style: UiTypography.body3r.textSecondary, ), ], ), @@ -199,7 +196,7 @@ class BankAccountPage extends StatelessWidget { width: 48, height: 48, decoration: BoxDecoration( - color: primaryColor.withOpacity(0.1), + color: primaryColor.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: const Center( @@ -216,10 +213,7 @@ class BankAccountPage extends StatelessWidget { children: [ Text( account.bankName, - style: UiTypography.body2r.copyWith( // Was body2 - fontWeight: FontWeight.w500, - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), Text( strings.account_ending( @@ -227,9 +221,7 @@ class BankAccountPage extends StatelessWidget { ? account.last4! : '----', ), - style: UiTypography.body2r.copyWith( // Was body2 - color: UiColors.textSecondary, - ), + style: UiTypography.body2r.textSecondary, ), ], ), @@ -239,7 +231,7 @@ class BankAccountPage extends StatelessWidget { Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: primaryColor.withOpacity(0.15), + color: primaryColor.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(20), ), child: Row( @@ -248,10 +240,7 @@ class BankAccountPage extends StatelessWidget { const SizedBox(width: 4), Text( strings.primary, - style: UiTypography.body3r.copyWith( // Was bodySmall - fontWeight: FontWeight.w500, - color: primaryColor, - ), + style: UiTypography.body3m.primary, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/widgets/add_account_form.dart b/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/widgets/add_account_form.dart index a7ad00c9..4858511d 100644 --- a/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/widgets/add_account_form.dart +++ b/apps/mobile/packages/features/staff/profile_sections/finances/staff_bank_account/lib/src/presentation/widgets/add_account_form.dart @@ -43,7 +43,7 @@ class _AddAccountFormState extends State { children: [ Text( widget.strings.add_new_account, - style: UiTypography.headline4m.copyWith(color: UiColors.textPrimary), // Was header4 + style: UiTypography.headline4m.textPrimary, // Was header4 ), const SizedBox(height: UiConstants.space4), UiTextField( @@ -71,8 +71,7 @@ class _AddAccountFormState extends State { padding: const EdgeInsets.only(bottom: UiConstants.space2), child: Text( widget.strings.account_type, - style: UiTypography.body2r.copyWith( // Was body2 - color: UiColors.textSecondary, fontWeight: FontWeight.w500), + style: UiTypography.body2m.textSecondary, ), ), Row( @@ -122,7 +121,7 @@ class _AddAccountFormState extends State { padding: const EdgeInsets.symmetric(vertical: 12), decoration: BoxDecoration( color: isSelected - ? UiColors.primary.withOpacity(0.05) + ? UiColors.primary.withValues(alpha: 0.05) : UiColors.bgPopup, // Was surface borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all( @@ -133,8 +132,7 @@ class _AddAccountFormState extends State { child: Center( child: Text( label, - style: UiTypography.body2r.copyWith( // Was body2 - fontWeight: FontWeight.w600, + style: UiTypography.body2b.copyWith( color: isSelected ? UiColors.primary : UiColors.textSecondary, ), ), diff --git a/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/pages/time_card_page.dart b/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/pages/time_card_page.dart index 6805e7fa..02b670c4 100644 --- a/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/pages/time_card_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/pages/time_card_page.dart @@ -40,9 +40,7 @@ class _TimeCardPageState extends State { ), title: Text( t.staff_time_card.title, - style: UiTypography.headline4m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline4m.textPrimary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(1.0), diff --git a/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/widgets/timesheet_card.dart b/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/widgets/timesheet_card.dart index 4e8d7351..70f707e2 100644 --- a/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/widgets/timesheet_card.dart +++ b/apps/mobile/packages/features/staff/profile_sections/finances/time_card/lib/src/presentation/widgets/timesheet_card.dart @@ -19,22 +19,22 @@ class TimesheetCard extends StatelessWidget { switch (status) { case TimeCardStatus.approved: - statusBg = UiColors.textSuccess.withOpacity(0.12); + statusBg = UiColors.tagSuccess; statusColor = UiColors.textSuccess; statusText = t.staff_time_card.status.approved; break; case TimeCardStatus.disputed: - statusBg = UiColors.destructive.withOpacity(0.12); + statusBg = UiColors.destructive.withValues(alpha: 0.12); statusColor = UiColors.destructive; statusText = t.staff_time_card.status.disputed; break; case TimeCardStatus.paid: - statusBg = UiColors.primary.withOpacity(0.12); + statusBg = UiColors.primary.withValues(alpha: 0.12); statusColor = UiColors.primary; statusText = t.staff_time_card.status.paid; break; case TimeCardStatus.pending: - statusBg = UiColors.textWarning.withOpacity(0.12); + statusBg = UiColors.tagPending; statusColor = UiColors.textWarning; statusText = t.staff_time_card.status.pending; break; @@ -61,15 +61,11 @@ class TimesheetCard extends StatelessWidget { children: [ Text( timesheet.shiftTitle, - style: UiTypography.body1m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body1m.textPrimary, ), Text( timesheet.clientName, - style: UiTypography.body2r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body2r.textSecondary, ), ], ), @@ -116,13 +112,11 @@ class TimesheetCard extends StatelessWidget { children: [ Text( '${timesheet.totalHours.toStringAsFixed(1)} ${t.staff_time_card.hours} @ \$${timesheet.hourlyRate.toStringAsFixed(2)}${t.staff_time_card.per_hr}', - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), Text( '\$${timesheet.totalPay.toStringAsFixed(2)}', - style: UiTypography.title2b.copyWith( - color: UiColors.primary, - ), + style: UiTypography.title2b.primary, ), ], ), @@ -163,7 +157,7 @@ class _IconText extends StatelessWidget { const SizedBox(width: UiConstants.space1), Text( text, - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), ], ); diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/pages/attire_page.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/pages/attire_page.dart index 776f5f77..44cde53f 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/pages/attire_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/pages/attire_page.dart @@ -32,9 +32,7 @@ class AttirePage extends StatelessWidget { ), title: Text( t.staff_profile_attire.title, - style: UiTypography.headline3m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline3m.textPrimary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(1.0), diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/widgets/attire_info_card.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/widgets/attire_info_card.dart index 656d1626..92606c1c 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/widgets/attire_info_card.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/attire/lib/src/presentation/widgets/attire_info_card.dart @@ -11,8 +11,8 @@ class AttireInfoCard extends StatelessWidget { return Container( padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.08), - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + color: UiColors.primary.withValues(alpha: 0.08), + borderRadius: UiConstants.radiusLg, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, @@ -26,16 +26,12 @@ class AttireInfoCard extends StatelessWidget { children: [ Text( t.staff_profile_attire.info_card.title, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, ), const SizedBox(height: 2), Text( t.staff_profile_attire.info_card.description, - style: UiTypography.body2r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body2r.textSecondary, ), ], ), diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/pages/emergency_contact_screen.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/pages/emergency_contact_screen.dart index 3e3637cd..652ff125 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/pages/emergency_contact_screen.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/pages/emergency_contact_screen.dart @@ -23,12 +23,12 @@ class EmergencyContactScreen extends StatelessWidget { appBar: AppBar( elevation: 0, leading: IconButton( - icon: Icon(UiIcons.chevronLeft, color: UiColors.textSecondary), + icon: const Icon(UiIcons.chevronLeft, color: UiColors.textSecondary), onPressed: () => Modular.to.pop(), ), title: Text( 'Emergency Contact', - style: UiTypography.title1m.copyWith(color: UiColors.textPrimary), + style: UiTypography.title1m.textPrimary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(1.0), @@ -53,11 +53,11 @@ class EmergencyContactScreen extends StatelessWidget { children: [ Expanded( child: SingleChildScrollView( - padding: EdgeInsets.all(UiConstants.space6), + padding: const EdgeInsets.all(UiConstants.space6), child: Column( children: [ const EmergencyContactInfoBanner(), - SizedBox(height: UiConstants.space6), + const SizedBox(height: UiConstants.space6), ...state.contacts.asMap().entries.map( (entry) => EmergencyContactFormItem( index: entry.key, @@ -66,7 +66,7 @@ class EmergencyContactScreen extends StatelessWidget { ), ), const EmergencyContactAddButton(), - SizedBox(height: UiConstants.space16), + const SizedBox(height: UiConstants.space16), ], ), ), diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_add_button.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_add_button.dart index 40f9b81e..769c709b 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_add_button.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_add_button.dart @@ -12,20 +12,20 @@ class EmergencyContactAddButton extends StatelessWidget { child: TextButton.icon( onPressed: () => context.read().add(EmergencyContactAdded()), - icon: Icon(UiIcons.add, size: 20.0), + icon: const Icon(UiIcons.add, size: 20.0), label: Text( 'Add Another Contact', style: UiTypography.title2b, ), style: TextButton.styleFrom( foregroundColor: UiColors.primary, - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( horizontal: UiConstants.space6, vertical: UiConstants.space3, ), shape: RoundedRectangleBorder( borderRadius: UiConstants.radiusFull, - side: BorderSide(color: UiColors.primary), + side: const BorderSide(color: UiColors.primary), ), ), ), diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_form_item.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_form_item.dart index 8dbf2063..4117a5d3 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_form_item.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_form_item.dart @@ -19,8 +19,8 @@ class EmergencyContactFormItem extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - margin: EdgeInsets.only(bottom: UiConstants.space4), - padding: EdgeInsets.all(UiConstants.space4), + margin: const EdgeInsets.only(bottom: UiConstants.space4), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( color: UiColors.bgPopup, borderRadius: UiConstants.radiusLg, @@ -30,33 +30,27 @@ class EmergencyContactFormItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildHeader(context), - SizedBox(height: UiConstants.space4), + const SizedBox(height: UiConstants.space4), _buildLabel('Full Name'), _buildTextField( initialValue: contact.name, hint: 'Contact name', icon: UiIcons.user, onChanged: (val) => context.read().add( - EmergencyContactUpdated( - index, - contact.copyWith(name: val), - ), - ), + EmergencyContactUpdated(index, contact.copyWith(name: val)), + ), ), - SizedBox(height: UiConstants.space4), + const SizedBox(height: UiConstants.space4), _buildLabel('Phone Number'), _buildTextField( initialValue: contact.phone, hint: '+1 (555) 000-0000', icon: UiIcons.phone, onChanged: (val) => context.read().add( - EmergencyContactUpdated( - index, - contact.copyWith(phone: val), - ), - ), + EmergencyContactUpdated(index, contact.copyWith(phone: val)), + ), ), - SizedBox(height: UiConstants.space4), + const SizedBox(height: UiConstants.space4), _buildLabel('Relationship'), _buildDropdown( context, @@ -65,11 +59,11 @@ class EmergencyContactFormItem extends StatelessWidget { onChanged: (val) { if (val != null) { context.read().add( - EmergencyContactUpdated( - index, - contact.copyWith(relationship: val), - ), - ); + EmergencyContactUpdated( + index, + contact.copyWith(relationship: val), + ), + ); } }, ), @@ -85,7 +79,7 @@ class EmergencyContactFormItem extends StatelessWidget { required ValueChanged onChanged, }) { return Container( - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( horizontal: UiConstants.space4, vertical: UiConstants.space2, ), @@ -99,13 +93,13 @@ class EmergencyContactFormItem extends StatelessWidget { value: value, isExpanded: true, dropdownColor: UiColors.bgPopup, - icon: Icon(UiIcons.chevronDown, color: UiColors.iconSecondary), + icon: const Icon(UiIcons.chevronDown, color: UiColors.iconSecondary), items: items.map((type) { return DropdownMenuItem( value: type, child: Text( _formatRelationship(type), - style: UiTypography.body1r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body1r.textPrimary, ), ); }).toList(), @@ -116,11 +110,15 @@ class EmergencyContactFormItem extends StatelessWidget { } String _formatRelationship(RelationshipType type) { - switch(type) { - case RelationshipType.family: return 'Family'; - case RelationshipType.spouse: return 'Spouse'; - case RelationshipType.friend: return 'Friend'; - case RelationshipType.other: return 'Other'; + switch (type) { + case RelationshipType.family: + return 'Family'; + case RelationshipType.spouse: + return 'Spouse'; + case RelationshipType.friend: + return 'Friend'; + case RelationshipType.other: + return 'Other'; } } @@ -128,22 +126,17 @@ class EmergencyContactFormItem extends StatelessWidget { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'Contact ${index + 1}', - style: UiTypography.title2m.copyWith( - color: UiColors.textPrimary, - ), - ), + Text('Contact ${index + 1}', style: UiTypography.title2m.textPrimary), if (totalContacts > 1) IconButton( - icon: Icon( + icon: const Icon( UiIcons.delete, color: UiColors.textError, size: 20.0, ), - onPressed: () => context - .read() - .add(EmergencyContactRemoved(index)), + onPressed: () => context.read().add( + EmergencyContactRemoved(index), + ), ), ], ); @@ -151,13 +144,8 @@ class EmergencyContactFormItem extends StatelessWidget { Widget _buildLabel(String label) { return Padding( - padding: EdgeInsets.only(bottom: UiConstants.space2), - child: Text( - label, - style: UiTypography.body2m.copyWith( - color: UiColors.textSecondary, - ), - ), + padding: const EdgeInsets.only(bottom: UiConstants.space2), + child: Text(label, style: UiTypography.body2m.textSecondary), ); } @@ -169,16 +157,16 @@ class EmergencyContactFormItem extends StatelessWidget { }) { return TextFormField( initialValue: initialValue, - style: UiTypography.body1r.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body1r.textPrimary, decoration: InputDecoration( hintText: hint, - hintStyle: TextStyle(color: UiColors.textPlaceholder), + hintStyle: const TextStyle(color: UiColors.textPlaceholder), prefixIcon: Icon(icon, color: UiColors.textSecondary, size: 20.0), filled: true, fillColor: UiColors.bgPopup, - contentPadding: EdgeInsets.symmetric(vertical: UiConstants.space4), + contentPadding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + ), border: OutlineInputBorder( borderRadius: UiConstants.radiusLg, borderSide: BorderSide(color: UiColors.border), @@ -196,4 +184,3 @@ class EmergencyContactFormItem extends StatelessWidget { ); } } - diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_info_banner.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_info_banner.dart index 975529be..e8d26179 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_info_banner.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_info_banner.dart @@ -7,14 +7,14 @@ class EmergencyContactInfoBanner extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.all(UiConstants.space4), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: UiColors.accent.withOpacity(0.2), - borderRadius: BorderRadius.circular(UiConstants.radiusBase), + color: UiColors.accent.withValues(alpha: 0.2), + borderRadius: UiConstants.radiusLg, ), child: Text( 'Please provide at least one emergency contact. This information will only be used in case of an emergency during your shifts.', - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, ), ); } diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_save_button.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_save_button.dart index e21e94f2..5f219cad 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_save_button.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/emergency_contact/lib/src/presentation/widgets/emergency_contact_save_button.dart @@ -30,19 +30,18 @@ class EmergencyContactSaveButton extends StatelessWidget { builder: (context, state) { final isLoading = state.status == EmergencyContactStatus.saving; return Container( - padding: EdgeInsets.all(UiConstants.space4), - decoration: BoxDecoration( + padding: const EdgeInsets.all(UiConstants.space4), + decoration: const BoxDecoration( color: UiColors.bgPopup, border: Border(top: BorderSide(color: UiColors.border)), ), child: SafeArea( child: UiButton.primary( fullWidth: true, - onPressed: state.isValid && !isLoading - ? () => _onSave(context) - : null, + onPressed: + state.isValid && !isLoading ? () => _onSave(context) : null, child: isLoading - ? SizedBox( + ? const SizedBox( height: 20.0, width: 20.0, child: CircularProgressIndicator( diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/pages/experience_page.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/pages/experience_page.dart index 65e19d44..cd3cada5 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/pages/experience_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/experience/lib/src/presentation/pages/experience_page.dart @@ -73,16 +73,16 @@ class ExperiencePage extends StatelessWidget { children: [ Expanded( child: SingleChildScrollView( - padding: EdgeInsets.all(UiConstants.space5), + padding: const EdgeInsets.all(UiConstants.space5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ExperienceSectionTitle(title: i18n.industries_title), Text( i18n.industries_subtitle, - style: UiTypography.body2m.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2m.textSecondary, ), - SizedBox(height: UiConstants.space3), + const SizedBox(height: UiConstants.space3), Wrap( spacing: UiConstants.space2, runSpacing: UiConstants.space2, @@ -90,23 +90,26 @@ class ExperiencePage extends StatelessWidget { .map( (i) => UiChip( label: _getIndustryLabel(i18n.industries, i), - isSelected: state.selectedIndustries.contains(i), - onTap: () => BlocProvider.of(context) - .add(ExperienceIndustryToggled(i)), - variant: state.selectedIndustries.contains(i) - ? UiChipVariant.primary - : UiChipVariant.secondary, + isSelected: + state.selectedIndustries.contains(i), + onTap: () => + BlocProvider.of(context) + .add(ExperienceIndustryToggled(i)), + variant: + state.selectedIndustries.contains(i) + ? UiChipVariant.primary + : UiChipVariant.secondary, ), ) .toList(), ), - SizedBox(height: UiConstants.space6), + const SizedBox(height: UiConstants.space6), ExperienceSectionTitle(title: i18n.skills_title), Text( i18n.skills_subtitle, - style: UiTypography.body2m.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2m.textSecondary, ), - SizedBox(height: UiConstants.space3), + const SizedBox(height: UiConstants.space3), Wrap( spacing: UiConstants.space2, runSpacing: UiConstants.space2, @@ -114,19 +117,22 @@ class ExperiencePage extends StatelessWidget { .map( (s) => UiChip( label: _getSkillLabel(i18n.skills, s), - isSelected: state.selectedSkills.contains(s.value), - onTap: () => BlocProvider.of(context) - .add(ExperienceSkillToggled(s.value)), - variant: state.selectedSkills.contains(s.value) - ? UiChipVariant.primary - : UiChipVariant.secondary, + isSelected: + state.selectedSkills.contains(s.value), + onTap: () => + BlocProvider.of(context) + .add(ExperienceSkillToggled(s.value)), + variant: + state.selectedSkills.contains(s.value) + ? UiChipVariant.primary + : UiChipVariant.secondary, ), ) .toList(), ), ], ), - ), + ), ), _buildSaveButton(context, state, i18n), ], @@ -148,9 +154,9 @@ class ExperiencePage extends StatelessWidget { children: [ Text( i18n.custom_skills_title, - style: UiTypography.body2m.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2m.textSecondary, ), - SizedBox(height: UiConstants.space2), + const SizedBox(height: UiConstants.space2), Wrap( spacing: UiConstants.space2, runSpacing: UiConstants.space2, @@ -165,10 +171,14 @@ class ExperiencePage extends StatelessWidget { ); } - Widget _buildSaveButton(BuildContext context, ExperienceState state, dynamic i18n) { + Widget _buildSaveButton( + BuildContext context, + ExperienceState state, + dynamic i18n, + ) { return Container( - padding: EdgeInsets.all(UiConstants.space4), - decoration: BoxDecoration( + padding: const EdgeInsets.all(UiConstants.space4), + decoration: const BoxDecoration( color: UiColors.bgPopup, border: Border(top: BorderSide(color: UiColors.border)), ), @@ -176,16 +186,21 @@ class ExperiencePage extends StatelessWidget { child: UiButton.primary( onPressed: state.status == ExperienceStatus.loading ? null - : () => BlocProvider.of(context).add(ExperienceSubmitted()), + : () => BlocProvider.of(context) + .add(ExperienceSubmitted()), fullWidth: true, - text: state.status == ExperienceStatus.loading ? null : i18n.save_button, + text: state.status == ExperienceStatus.loading + ? null + : i18n.save_button, child: state.status == ExperienceStatus.loading - ? SizedBox( + ? const SizedBox( height: 20.0, width: 20.0, child: CircularProgressIndicator( strokeWidth: 2, - valueColor: AlwaysStoppedAnimation(UiColors.white), // UiColors.primaryForeground is white mostly + valueColor: AlwaysStoppedAnimation( + UiColors.white, + ), // UiColors.primaryForeground is white mostly ), ) : null, diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart index 50fae0a9..c28e3593 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/pages/personal_info_page.dart @@ -1,4 +1,3 @@ - import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; @@ -52,13 +51,16 @@ class PersonalInfoPage extends StatelessWidget { backgroundColor: UiColors.bgPopup, elevation: 0, leading: IconButton( - icon: const Icon(UiIcons.chevronLeft, color: UiColors.textSecondary), + icon: const Icon( + UiIcons.chevronLeft, + color: UiColors.textSecondary, + ), onPressed: () => Modular.to.pop(), tooltip: MaterialLocalizations.of(context).backButtonTooltip, ), title: Text( i18n.title, - style: UiTypography.title1m.copyWith(color: UiColors.textPrimary), + style: UiTypography.title1m.textPrimary, ), bottom: PreferredSize( preferredSize: const Size.fromHeight(1.0), @@ -82,9 +84,7 @@ class PersonalInfoPage extends StatelessWidget { return Center( child: Text( 'Failed to load personal information', - style: UiTypography.body1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body1r.textSecondary, ), ); } diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart index ee4e84b5..6ae1fc46 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/personal_info_form.dart @@ -93,7 +93,7 @@ class _FieldLabel extends StatelessWidget { Widget build(BuildContext context) { return Text( text, - style: UiTypography.body2m.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2m.textPrimary, ); } } @@ -101,7 +101,6 @@ class _FieldLabel extends StatelessWidget { /// A read-only field widget for displaying non-editable information. /// A read-only field widget for displaying non-editable information. class _ReadOnlyField extends StatelessWidget { - const _ReadOnlyField({required this.value}); final String value; @@ -120,7 +119,7 @@ class _ReadOnlyField extends StatelessWidget { ), child: Text( value, - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, ), ); } @@ -129,7 +128,6 @@ class _ReadOnlyField extends StatelessWidget { /// An editable text field widget. /// An editable text field widget. class _EditableField extends StatelessWidget { - const _EditableField({ required this.controller, required this.hint, @@ -150,10 +148,10 @@ class _EditableField extends StatelessWidget { enabled: enabled, keyboardType: keyboardType, autofillHints: autofillHints, - style: UiTypography.body2r.copyWith(color: UiColors.textPrimary), + style: UiTypography.body2r.textPrimary, decoration: InputDecoration( hintText: hint, - hintStyle: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + hintStyle: UiTypography.body2r.textSecondary, contentPadding: const EdgeInsets.symmetric( horizontal: UiConstants.space3, vertical: UiConstants.space3, diff --git a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/profile_photo_widget.dart b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/profile_photo_widget.dart index dc681266..0abb3513 100644 --- a/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/profile_photo_widget.dart +++ b/apps/mobile/packages/features/staff/profile_sections/onboarding/profile_info/lib/src/presentation/widgets/profile_photo_widget.dart @@ -28,7 +28,8 @@ class ProfilePhotoWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final TranslationsStaffOnboardingPersonalInfoEn i18n = t.staff.onboarding.personal_info; + final TranslationsStaffOnboardingPersonalInfoEn i18n = + t.staff.onboarding.personal_info; return Column( children: [ @@ -41,7 +42,7 @@ class ProfilePhotoWidget extends StatelessWidget { height: 96, decoration: BoxDecoration( shape: BoxShape.circle, - color: UiColors.primary.withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), ), child: photoUrl != null ? ClipOval( @@ -53,9 +54,7 @@ class ProfilePhotoWidget extends StatelessWidget { : Center( child: Text( fullName.isNotEmpty ? fullName[0].toUpperCase() : '?', - style: UiTypography.displayL.copyWith( - color: UiColors.primary, - ), + style: UiTypography.displayL.primary, ), ), ), @@ -71,7 +70,7 @@ class ProfilePhotoWidget extends StatelessWidget { border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: UiColors.textPrimary.withOpacity(0.1), + color: UiColors.textPrimary.withValues(alpha: 0.1), blurRadius: UiConstants.space1, offset: const Offset(0, 2), ), @@ -92,7 +91,7 @@ class ProfilePhotoWidget extends StatelessWidget { const SizedBox(height: UiConstants.space3), Text( i18n.change_photo_hint, - style: UiTypography.body2r.copyWith(color: UiColors.textSecondary), + style: UiTypography.body2r.textSecondary, ), ], ); diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shift_details_page.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shift_details_page.dart index 3a8f22c9..1b04a87c 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shift_details_page.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shift_details_page.dart @@ -64,10 +64,10 @@ class _ShiftDetailsPageState extends State { Widget _buildStatCard(IconData icon, String value, String label) { return Container( - padding: const EdgeInsets.symmetric(vertical: 16), + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), decoration: BoxDecoration( - color: const Color(0xFFF8FAFC), - borderRadius: BorderRadius.circular(16), + color: UiColors.background, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all(color: UiColors.border), ), child: Column( @@ -76,21 +76,19 @@ class _ShiftDetailsPageState extends State { width: 40, height: 40, decoration: const BoxDecoration( - color: Colors.white, + color: UiColors.white, shape: BoxShape.circle, ), child: Icon(icon, size: 20, color: UiColors.iconSecondary), ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Text( value, - style: UiTypography.title1m.copyWith(color: UiColors.textPrimary), + style: UiTypography.title1m.textPrimary, ), Text( label, - style: UiTypography.footnote2r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote2r.textSecondary, ), ], ), @@ -99,29 +97,21 @@ class _ShiftDetailsPageState extends State { Widget _buildTimeBox(String label, String time) { return Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: const Color(0xFFF8FAFC), - borderRadius: BorderRadius.circular(16), + color: UiColors.background, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: Column( children: [ Text( label, - style: const TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: UiColors.textSecondary, - letterSpacing: 0.5, - ), + style: UiTypography.titleUppercase4b.textSecondary, ), - const SizedBox(height: 4), + const SizedBox(height: UiConstants.space1), Text( _formatTime(time), - style: UiTypography.display2m.copyWith( - fontSize: 20, - color: UiColors.textPrimary, - ), + style: UiTypography.headline2m.textPrimary, ), ], ), @@ -149,7 +139,7 @@ class _ShiftDetailsPageState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(state.message), - backgroundColor: UiColors.tagSuccess, + backgroundColor: UiColors.success, ), ); Modular.to.toShifts(selectedDate: state.shiftDate); @@ -158,7 +148,7 @@ class _ShiftDetailsPageState extends State { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(state.message), - backgroundColor: const Color(0xFFEF4444), + backgroundColor: UiColors.destructive, ), ); } @@ -203,7 +193,7 @@ class _ShiftDetailsPageState extends State { children: [ Expanded( child: SingleChildScrollView( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.all(UiConstants.space5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -211,16 +201,11 @@ class _ShiftDetailsPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( "VENDOR", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: UiColors.textSecondary, - letterSpacing: 0.5, - ), + style: UiTypography.titleUppercase4b.textSecondary, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Row( children: [ SizedBox( @@ -229,7 +214,7 @@ class _ShiftDetailsPageState extends State { child: displayShift.logoUrl != null ? ClipRRect( borderRadius: BorderRadius.circular( - 6, + UiConstants.radiusMdValue, ), child: Image.network( displayShift.logoUrl!, @@ -244,33 +229,26 @@ class _ShiftDetailsPageState extends State { ), ), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Text( displayShift.clientName, - style: UiTypography.headline5m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline5m.textPrimary, ), ], ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Date Section Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( + Text( "SHIFT DATE", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: UiColors.textSecondary, - letterSpacing: 0.5, - ), + style: UiTypography.titleUppercase4b.textSecondary, ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Row( children: [ const Icon( @@ -278,104 +256,44 @@ class _ShiftDetailsPageState extends State { size: 20, color: UiColors.primary, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Text( _formatDate(displayShift.date), - style: UiTypography.headline5m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.headline5m.textPrimary, ), ], ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), // Worker Capacity / Open Slots if ((displayShift.requiredSlots ?? 0) > 0) Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: const Color(0xFFF0FDF4), // green-50 - borderRadius: BorderRadius.circular(12), - border: Border.all( - color: const Color(0xFFBBF7D0), - ), // green-200 + color: UiColors.success.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: Row( children: [ const Icon( - Icons.people_alt_outlined, - size: 20, - color: Color(0xFF15803D), - ), // green-700, using Material Icon as generic fallback - const SizedBox(width: 12), - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - "$openSlots spots remaining", - style: UiTypography.body2b.copyWith( - color: const Color(0xFF15803D), - ), - ), - Text( - "${displayShift.filledSlots ?? 0} filled out of ${displayShift.requiredSlots}", - style: UiTypography.body3r.copyWith( - color: const Color(0xFF166534), - ), - ), - ], - ), + UiIcons.users, + size: 16, + color: UiColors.success, ), - SizedBox( - width: 60, - child: LinearProgressIndicator( - value: (displayShift.requiredSlots! > 0) - ? (displayShift.filledSlots ?? 0) / - displayShift.requiredSlots! - : 0, - backgroundColor: Colors.white, - color: const Color(0xFF15803D), - minHeight: 6, - borderRadius: BorderRadius.circular(3), - ), + const SizedBox(width: UiConstants.space2), + Text( + "$openSlots slots remaining", + style: UiTypography.footnote1m.textSuccess, ), ], ), ), - const SizedBox(height: 24), - // Stats Grid - GridView.count( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - crossAxisCount: 3, - crossAxisSpacing: 12, - childAspectRatio: 0.85, - children: [ - _buildStatCard( - UiIcons.dollar, - "\$${estimatedTotal.toStringAsFixed(0)}", - "Total Pay", - ), - _buildStatCard( - UiIcons.dollar, - "\$${displayShift.hourlyRate.toInt()}", - "Per Hour", - ), - _buildStatCard( - UiIcons.clock, - "${duration.toInt()}h", - "Duration", - ), - ], - ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), - // Shift Timing + // Time Section Row( children: [ Expanded( @@ -384,7 +302,7 @@ class _ShiftDetailsPageState extends State { displayShift.startTime, ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space4), Expanded( child: _buildTimeBox( "END TIME", @@ -393,129 +311,142 @@ class _ShiftDetailsPageState extends State { ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space6), - // Location - Column( - crossAxisAlignment: CrossAxisAlignment.start, + // Quick Info Grid + Row( children: [ - const Text( - "LOCATION", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: UiColors.textSecondary, - letterSpacing: 0.5, + Expanded( + child: _buildStatCard( + UiIcons.dollar, + "\$${displayShift.hourlyRate.toStringAsFixed(0)}/hr", + "Base Rate", ), ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - displayShift.location.isEmpty - ? "TBD" - : displayShift.location, - style: UiTypography.title1m.copyWith( - color: UiColors.textPrimary, - ), - ), - Text( - displayShift.location.isEmpty - ? "TBD" - : displayShift.locationAddress, - style: UiTypography.title1m.copyWith( - color: UiColors.textPrimary, - ), - ), - ], + const SizedBox(width: UiConstants.space4), + Expanded( + child: _buildStatCard( + UiIcons.clock, + "${duration.toInt()} hours", + "Duration", + ), + ), + const SizedBox(width: UiConstants.space4), + Expanded( + child: _buildStatCard( + UiIcons.wallet, + "\$${estimatedTotal.toStringAsFixed(0)}", + "Est. Total", + ), ), ], ), - const SizedBox(height: 24), + const SizedBox(height: UiConstants.space8), - // Additional Info - if (displayShift.description != null) ...[ - SizedBox( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - "ADDITIONAL INFO", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: UiColors.textSecondary, - letterSpacing: 0.5, - ), - ), - const SizedBox(height: 8), - Text( - displayShift.description!, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), - ), - ], + // Location Section + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "LOCATION", + style: UiTypography.titleUppercase4b.textSecondary, ), - ), - ], - const SizedBox(height: 20), - if (displayShift.status != 'confirmed' && - displayShift.hasApplied != true && - (displayShift.requiredSlots == null || - displayShift.filledSlots == null || - displayShift.filledSlots! < - displayShift.requiredSlots!)) - Row( - children: [ - Expanded( - child: OutlinedButton( - onPressed: () => _declineShift( - context, - displayShift!.id, - ), - style: OutlinedButton.styleFrom( - foregroundColor: const Color(0xFFEF4444), - side: const BorderSide( - color: Color(0xFFEF4444), - ), - padding: const EdgeInsets.symmetric( - vertical: 16, - ), - ), - child: const Text("Decline"), - ), + const SizedBox(height: UiConstants.space3), + Container( + padding: const EdgeInsets.all(UiConstants.space4), + decoration: BoxDecoration( + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + border: Border.all(color: UiColors.border), ), - const SizedBox(width: 16), - Expanded( - child: ElevatedButton( - onPressed: () => _bookShift( - context, - displayShift!, + child: Column( + children: [ + Row( + children: [ + const Icon( + UiIcons.mapPin, + color: UiColors.primary, + size: 20, + ), + const SizedBox(width: UiConstants.space3), + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + displayShift.location, + style: UiTypography.body2b.textPrimary, + ), + Text( + displayShift.locationAddress, + style: UiTypography.body3r.textSecondary, + ), + ], + ), + ), + ], ), - style: ElevatedButton.styleFrom( - backgroundColor: const Color( - 0xFF10B981, + const SizedBox(height: UiConstants.space4), + const Divider(), + const SizedBox(height: UiConstants.space2), + TextButton.icon( + onPressed: () {}, + icon: const Icon( + UiIcons.arrowRight, + size: 16, ), - foregroundColor: Colors.white, - padding: const EdgeInsets.symmetric( - vertical: 16, + label: const Text("Open in Maps"), + style: TextButton.styleFrom( + foregroundColor: UiColors.primary, + padding: EdgeInsets.zero, ), ), - child: const Text("Book Shift"), - ), + ], ), - ], - ), - SizedBox( - height: MediaQuery.of(context).padding.bottom + 10, + ), + ], ), + const SizedBox(height: UiConstants.space8), + + // Description / Instructions + if ((displayShift.description ?? '').isNotEmpty) ...[ + Text( + "JOB DESCRIPTION", + style: UiTypography.titleUppercase4b.textSecondary, + ), + const SizedBox(height: UiConstants.space2), + Text( + displayShift.description!, + style: UiTypography.body2r.textSecondary, + ), + const SizedBox(height: UiConstants.space8), + ], ], ), ), ), + // Bottom Action Bar + Container( + padding: EdgeInsets.fromLTRB( + UiConstants.space5, + UiConstants.space4, + UiConstants.space5, + MediaQuery.of(context).padding.bottom + UiConstants.space4, + ), + decoration: BoxDecoration( + color: UiColors.white, + border: Border(top: BorderSide(color: UiColors.border)), + boxShadow: [ + BoxShadow( + color: UiColors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, -4), + ), + ], + ), + child: _buildBottomButton(displayShift, context), + ), ], ), ); @@ -552,7 +483,7 @@ class _ShiftDetailsPageState extends State { ); }, style: TextButton.styleFrom( - foregroundColor: const Color(0xFF10B981), + foregroundColor: UiColors.success, ), child: const Text('Book'), ), @@ -581,7 +512,7 @@ class _ShiftDetailsPageState extends State { ).add(DeclineShiftDetailsEvent(id)); }, style: TextButton.styleFrom( - foregroundColor: const Color(0xFFEF4444), + foregroundColor: UiColors.destructive, ), child: const Text('Decline'), ), @@ -608,29 +539,23 @@ class _ShiftDetailsPageState extends State { width: 36, child: CircularProgressIndicator(), ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), Text( shift.title, - style: UiTypography.body2b.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2b.textPrimary, textAlign: TextAlign.center, ), const SizedBox(height: 6), Text( '${_formatDate(shift.date)} • ${_formatTime(shift.startTime)} - ${_formatTime(shift.endTime)}', - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, textAlign: TextAlign.center, ), if (shift.clientName.isNotEmpty) ...[ const SizedBox(height: 6), Text( shift.clientName, - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, textAlign: TextAlign.center, ), ], @@ -647,4 +572,150 @@ class _ShiftDetailsPageState extends State { Navigator.of(context, rootNavigator: true).pop(); _actionDialogOpen = false; } + + Widget _buildBottomButton(Shift shift, BuildContext context) { + final String status = shift.status ?? 'open'; + + if (status == 'confirmed') { + return Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () => _openCancelDialog(context), + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.destructive, + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + elevation: 0, + ), + child: Text("CANCEL SHIFT", style: UiTypography.body2b.white), + ), + ), + const SizedBox(width: UiConstants.space4), + Expanded( + child: ElevatedButton( + onPressed: () => Modular.to.toClockIn(), + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.success, + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + elevation: 0, + ), + child: Text("CLOCK IN", style: UiTypography.body2b.white), + ), + ), + ], + ); + } + + if (status == 'pending') { + return Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => BlocProvider.of(context).add(DeclineShiftDetailsEvent(shift.id)), + style: OutlinedButton.styleFrom( + foregroundColor: UiColors.destructive, + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), + side: const BorderSide(color: UiColors.destructive), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + ), + child: Text("DECLINE", style: UiTypography.body2b.textError), + ), + ), + const SizedBox(width: UiConstants.space4), + Expanded( + child: ElevatedButton( + onPressed: () => BlocProvider.of(context).add(BookShiftDetailsEvent(shift.id, roleId: shift.roleId)), + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + elevation: 0, + ), + child: Text("ACCEPT SHIFT", style: UiTypography.body2b.white), + ), + ), + ], + ); + } + + if (status == 'open' || status == 'available') { + return Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => _declineShift(context, shift.id), + style: OutlinedButton.styleFrom( + foregroundColor: UiColors.textSecondary, + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), + side: const BorderSide(color: UiColors.border), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + ), + child: Text("DECLINE", style: UiTypography.body2b.textSecondary), + ), + ), + const SizedBox(width: UiConstants.space4), + Expanded( + child: ElevatedButton( + onPressed: () => _bookShift(context, shift), + style: ElevatedButton.styleFrom( + backgroundColor: UiColors.primary, + foregroundColor: UiColors.white, + padding: const EdgeInsets.symmetric(vertical: UiConstants.space4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(UiConstants.radiusBase), + ), + elevation: 0, + ), + child: Text("APPLY NOW", style: UiTypography.body2b.white), + ), + ), + ], + ); + } + + return const SizedBox(); + } + + void _openCancelDialog(BuildContext context) { + showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: const Text('Cancel Shift'), + content: const Text('Are you sure you want to cancel this shift?'), + actions: [ + TextButton( + onPressed: () => Modular.to.pop(), + child: const Text('No'), + ), + TextButton( + onPressed: () { + Modular.to.pop(); + BlocProvider.of(context).add( + DeclineShiftDetailsEvent(widget.shiftId), + ); + }, + style: TextButton.styleFrom( + foregroundColor: UiColors.destructive, + ), + child: const Text('Yes, cancel it'), + ), + ], + ), + ); + } } diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shifts_page.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shifts_page.dart index 3d86039d..9f4caa2e 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shifts_page.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/pages/shifts_page.dart @@ -7,7 +7,6 @@ import '../blocs/shifts/shifts_bloc.dart'; import '../widgets/tabs/my_shifts_tab.dart'; import '../widgets/tabs/find_shifts_tab.dart'; import '../widgets/tabs/history_shifts_tab.dart'; -import '../styles/shifts_styles.dart'; class ShiftsPage extends StatefulWidget { final String? initialTab; @@ -107,29 +106,25 @@ class _ShiftsPageState extends State { // Note: Calendar logic moved to MyShiftsTab return Scaffold( - backgroundColor: AppColors.krowBackground, + backgroundColor: UiColors.background, body: Column( children: [ // Header (Blue) Container( - color: AppColors.krowBlue, + color: UiColors.primary, padding: EdgeInsets.fromLTRB( - 20, - MediaQuery.of(context).padding.top + 10, - 20, - 20, + UiConstants.space5, + MediaQuery.of(context).padding.top + UiConstants.space2, + UiConstants.space5, + UiConstants.space5, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - spacing: 16, + spacing: UiConstants.space4, children: [ - const Text( + Text( "Shifts", - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Colors.white, - ), + style: UiTypography.display1b.white, ), // Tabs @@ -143,17 +138,16 @@ class _ShiftsPageState extends State { showCount: myShiftsLoaded, enabled: !blockTabsForFind, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), _buildTab( "find", "Find Shifts", UiIcons.search, - availableJobs - .length, // Passed unfiltered count as badge? Or logic inside? Pass availableJobs. + availableJobs.length, showCount: availableLoaded, enabled: baseLoaded, ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), _buildTab( "history", "History", @@ -245,12 +239,15 @@ class _ShiftsPageState extends State { } }, child: Container( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 8), + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space2, + horizontal: UiConstants.space2, + ), decoration: BoxDecoration( color: isActive - ? Colors.white - : Colors.white.withAlpha((0.2 * 255).round()), - borderRadius: BorderRadius.circular(8), + ? UiColors.white + : UiColors.white.withValues(alpha: 0.2), + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -260,23 +257,17 @@ class _ShiftsPageState extends State { icon, size: 14, color: !enabled - ? Colors.white.withAlpha((0.5 * 255).round()) + ? UiColors.white.withValues(alpha: 0.5) : isActive - ? AppColors.krowBlue - : Colors.white, + ? UiColors.primary + : UiColors.white, ), - const SizedBox(width: 6), + const SizedBox(width: UiConstants.space1), Flexible( child: Text( label, - style: TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: !enabled - ? Colors.white.withAlpha((0.5 * 255).round()) - : isActive - ? AppColors.krowBlue - : Colors.white, + style: (isActive ? UiTypography.body3m.copyWith(color: UiColors.primary) : UiTypography.body3m.white).copyWith( + color: !enabled ? UiColors.white.withValues(alpha: 0.5) : null, ), overflow: TextOverflow.ellipsis, ), @@ -285,23 +276,21 @@ class _ShiftsPageState extends State { const SizedBox(width: 4), Container( padding: const EdgeInsets.symmetric( - horizontal: 6, + horizontal: UiConstants.space1, vertical: 2, ), constraints: const BoxConstraints(minWidth: 18), decoration: BoxDecoration( color: isActive - ? AppColors.krowBlue.withAlpha((0.1 * 255).round()) - : Colors.white.withAlpha((0.2 * 255).round()), - borderRadius: BorderRadius.circular(999), + ? UiColors.primary.withValues(alpha: 0.1) + : UiColors.white.withValues(alpha: 0.2), + borderRadius: UiConstants.radiusFull, ), child: Center( child: Text( "$count", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: isActive ? AppColors.krowBlue : Colors.white, + style: UiTypography.footnote1b.copyWith( + color: isActive ? UiColors.primary : UiColors.white, ), ), ), diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/my_shift_card.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/my_shift_card.dart index 2b07e2a0..9ca03298 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/my_shift_card.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/my_shift_card.dart @@ -118,14 +118,14 @@ class _MyShiftCardState extends State { Modular.to.pushShiftDetails(widget.shift); }, child: Container( - margin: const EdgeInsets.only(bottom: 12), + margin: const EdgeInsets.only(bottom: UiConstants.space3), decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -142,7 +142,7 @@ class _MyShiftCardState extends State { // Status Badge if (statusText.isNotEmpty) Padding( - padding: const EdgeInsets.only(bottom: 8), + padding: const EdgeInsets.only(bottom: UiConstants.space2), child: Row( children: [ if (statusIcon != null) @@ -173,14 +173,14 @@ class _MyShiftCardState extends State { ), // Shift Type Badge for available/pending shifts if (status == 'open' || status == 'pending') ...[ - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Container( padding: const EdgeInsets.symmetric( horizontal: 6, vertical: 2, ), decoration: BoxDecoration( - color: UiColors.primary.withOpacity(0.1), + color: UiColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(4), ), child: Text( @@ -205,20 +205,20 @@ class _MyShiftCardState extends State { decoration: BoxDecoration( gradient: LinearGradient( colors: [ - UiColors.primary.withOpacity(0.09), - UiColors.primary.withOpacity(0.03), + UiColors.primary.withValues(alpha: 0.09), + UiColors.primary.withValues(alpha: 0.03), ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all( - color: UiColors.primary.withOpacity(0.09), + color: UiColors.primary.withValues(alpha: 0.09), ), ), child: widget.shift.logoUrl != null ? ClipRRect( - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), child: Image.network( widget.shift.logoUrl!, fit: BoxFit.contain, @@ -232,7 +232,7 @@ class _MyShiftCardState extends State { ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), // Details Expanded( @@ -249,42 +249,34 @@ class _MyShiftCardState extends State { children: [ Text( widget.shift.title, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, overflow: TextOverflow.ellipsis, ), Text( widget.shift.clientName, - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, overflow: TextOverflow.ellipsis, ), ], ), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( "\$${estimatedTotal.toStringAsFixed(0)}", - style: UiTypography.title1m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.title1m.textPrimary, ), Text( "\$${widget.shift.hourlyRate.toInt()}/hr · ${duration.toInt()}h", - style: UiTypography.footnote2r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote2r.textSecondary, ), ], ), ], ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), // Date & Time - Multi-Day or Single Day if (widget.shift.durationDays != null && @@ -332,11 +324,9 @@ class _MyShiftCardState extends State { const SizedBox(width: 4), Text( _formatDate(widget.shift.date), - style: UiTypography.footnote1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote1r.textSecondary, ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), const Icon( UiIcons.clock, size: 12, @@ -345,9 +335,7 @@ class _MyShiftCardState extends State { const SizedBox(width: 4), Text( "${_formatTime(widget.shift.startTime)} - ${_formatTime(widget.shift.endTime)}", - style: UiTypography.footnote1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote1r.textSecondary, ), ], ), @@ -368,9 +356,7 @@ class _MyShiftCardState extends State { widget.shift.locationAddress.isNotEmpty ? widget.shift.locationAddress : widget.shift.location, - style: UiTypography.footnote1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote1r.textSecondary, overflow: TextOverflow.ellipsis, ), ), diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/shift_assignment_card.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/shift_assignment_card.dart index d46eb14a..086571e2 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/shift_assignment_card.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/shift_assignment_card.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:krow_domain/krow_domain.dart'; import 'package:design_system/design_system.dart'; -import 'package:core_localization/core_localization.dart'; class ShiftAssignmentCard extends StatelessWidget { final Shift shift; @@ -66,12 +65,12 @@ class ShiftAssignmentCard extends StatelessWidget { return Container( decoration: BoxDecoration( - color: Colors.white, + color: UiColors.white, borderRadius: UiConstants.radiusLg, border: Border.all(color: UiColors.border), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: UiColors.black.withValues(alpha: 0.05), blurRadius: 2, offset: const Offset(0, 1), ), @@ -81,7 +80,7 @@ class ShiftAssignmentCard extends StatelessWidget { children: [ // Header Padding( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -97,20 +96,20 @@ class ShiftAssignmentCard extends StatelessWidget { decoration: BoxDecoration( gradient: LinearGradient( colors: [ - UiColors.primary.withOpacity(0.09), - UiColors.primary.withOpacity(0.03), + UiColors.primary.withValues(alpha: 0.09), + UiColors.primary.withValues(alpha: 0.03), ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all( - color: UiColors.primary.withOpacity(0.09), + color: UiColors.primary.withValues(alpha: 0.09), ), ), child: shift.logoUrl != null ? ClipRRect( - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), child: Image.network( shift.logoUrl!, fit: BoxFit.contain, @@ -124,7 +123,7 @@ class ShiftAssignmentCard extends StatelessWidget { ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), // Details Expanded( @@ -140,42 +139,34 @@ class ShiftAssignmentCard extends StatelessWidget { children: [ Text( shift.title, - style: UiTypography.body2m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.body2m.textPrimary, overflow: TextOverflow.ellipsis, ), Text( shift.clientName, - style: UiTypography.body3r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.body3r.textSecondary, overflow: TextOverflow.ellipsis, ), ], ), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( "\$${totalPay.toStringAsFixed(0)}", - style: UiTypography.title1m.copyWith( - color: UiColors.textPrimary, - ), + style: UiTypography.title1m.textPrimary, ), Text( "\$${shift.hourlyRate.toInt()}/hr · ${hours.toInt()}h", - style: UiTypography.footnote2r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote2r.textSecondary, ), ], ), ], ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), // Date & Time Row( @@ -188,11 +179,9 @@ class ShiftAssignmentCard extends StatelessWidget { const SizedBox(width: 4), Text( _formatDate(shift.date), - style: UiTypography.footnote1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote1r.textSecondary, ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), const Icon( UiIcons.clock, size: 12, @@ -201,9 +190,7 @@ class ShiftAssignmentCard extends StatelessWidget { const SizedBox(width: 4), Text( "${_formatTime(shift.startTime)} - ${_formatTime(shift.endTime)}", - style: UiTypography.footnote1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote1r.textSecondary, ), ], ), @@ -223,9 +210,7 @@ class ShiftAssignmentCard extends StatelessWidget { shift.locationAddress.isNotEmpty ? shift.locationAddress : shift.location, - style: UiTypography.footnote1r.copyWith( - color: UiColors.textSecondary, - ), + style: UiTypography.footnote1r.textSecondary, overflow: TextOverflow.ellipsis, ), ), @@ -240,38 +225,55 @@ class ShiftAssignmentCard extends StatelessWidget { ), ), - Padding( - padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), + // Actions + Container( + padding: const EdgeInsets.all(UiConstants.space2), + decoration: const BoxDecoration( + color: UiColors.secondary, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(UiConstants.radiusBase), + bottomRight: Radius.circular(UiConstants.radiusBase), + ), + ), child: Row( children: [ Expanded( - child: OutlinedButton( + child: TextButton( onPressed: onDecline, - style: OutlinedButton.styleFrom( - foregroundColor: UiColors.iconSecondary, - side: const BorderSide(color: UiColors.border), - padding: const EdgeInsets.symmetric(vertical: 14), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), + style: TextButton.styleFrom( + foregroundColor: UiColors.destructive, + ), + child: Text( + "Decline", // Fallback if translation is broken + style: UiTypography.body2m.textError, ), - child: Text(t.staff_shifts.action.decline), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space2), Expanded( child: ElevatedButton( - onPressed: onConfirm, + onPressed: isConfirming ? null : onConfirm, style: ElevatedButton.styleFrom( backgroundColor: UiColors.primary, - foregroundColor: Colors.white, + foregroundColor: UiColors.white, elevation: 0, - padding: const EdgeInsets.symmetric(vertical: 14), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), + borderRadius: BorderRadius.circular(UiConstants.radiusMdValue), ), ), - child: Text(t.staff_shifts.action.confirm), + child: isConfirming + ? const SizedBox( + height: 16, + width: 16, + child: CircularProgressIndicator( + strokeWidth: 2, + color: UiColors.white, + ), + ) + : Text( + "Accept", // Fallback + style: UiTypography.body2m.white, + ), ), ), ], diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/find_shifts_tab.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/find_shifts_tab.dart index 1b75a48c..6422c312 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/find_shifts_tab.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/find_shifts_tab.dart @@ -2,7 +2,6 @@ import 'package:design_system/design_system.dart'; import 'package:flutter/material.dart'; import 'package:krow_domain/krow_domain.dart'; -import '../../styles/shifts_styles.dart'; import '../my_shift_card.dart'; import '../shared/empty_state_view.dart'; @@ -27,22 +26,21 @@ class _FindShiftsTabState extends State { return GestureDetector( onTap: () => setState(() => _jobType = id), child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space4, + vertical: UiConstants.space2, + ), decoration: BoxDecoration( - color: isSelected ? AppColors.krowBlue : Colors.white, - borderRadius: BorderRadius.circular(999), + color: isSelected ? UiColors.primary : UiColors.white, + borderRadius: UiConstants.radiusFull, border: Border.all( - color: isSelected ? AppColors.krowBlue : const Color(0xFFE2E8F0), + color: isSelected ? UiColors.primary : UiColors.border, ), ), child: Text( label, textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: isSelected ? Colors.white : const Color(0xFF64748B), - ), + style: (isSelected ? UiTypography.footnote2m.white : UiTypography.footnote2m.textSecondary), ), ), ); @@ -73,8 +71,11 @@ class _FindShiftsTabState extends State { children: [ // Search and Filters Container( - color: Colors.white, - padding: const EdgeInsets.fromLTRB(20, 16, 20, 16), + color: UiColors.white, + padding: const EdgeInsets.symmetric( + horizontal: UiConstants.space5, + vertical: UiConstants.space4, + ), child: Column( children: [ // Search Bar @@ -83,12 +84,12 @@ class _FindShiftsTabState extends State { Expanded( child: Container( height: 48, - padding: const EdgeInsets.symmetric(horizontal: 12), + padding: const EdgeInsets.symmetric(horizontal: UiConstants.space3), decoration: BoxDecoration( - color: const Color(0xFFF8FAFC), - borderRadius: BorderRadius.circular(12), + color: UiColors.background, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all( - color: const Color(0xFFE2E8F0), + color: UiColors.border, ), ), child: Row( @@ -96,20 +97,17 @@ class _FindShiftsTabState extends State { const Icon( UiIcons.search, size: 20, - color: Color(0xFF94A3B8), + color: UiColors.textInactive, ), - const SizedBox(width: 10), + const SizedBox(width: UiConstants.space2), Expanded( child: TextField( onChanged: (v) => setState(() => _searchQuery = v), - decoration: const InputDecoration( + decoration: InputDecoration( border: InputBorder.none, hintText: "Search jobs, location...", - hintStyle: TextStyle( - color: Color(0xFF94A3B8), - fontSize: 14, - ), + hintStyle: UiTypography.body2r.textPlaceholder, ), ), ), @@ -117,37 +115,37 @@ class _FindShiftsTabState extends State { ), ), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Container( height: 48, width: 48, decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all( - color: const Color(0xFFE2E8F0), + color: UiColors.border, ), ), child: const Icon( UiIcons.filter, size: 18, - color: Color(0xFF64748B), + color: UiColors.textSecondary, ), ), ], ), - const SizedBox(height: 16), + const SizedBox(height: UiConstants.space4), // Filter Tabs SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( children: [ _buildFilterTab('all', 'All Jobs'), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), _buildFilterTab('one-day', 'One Day'), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), _buildFilterTab('multi-day', 'Multi-Day'), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), _buildFilterTab('long-term', 'Long Term'), ], ), @@ -158,19 +156,19 @@ class _FindShiftsTabState extends State { Expanded( child: filteredJobs.isEmpty - ? EmptyStateView( + ? const EmptyStateView( icon: UiIcons.search, title: "No jobs available", subtitle: "Check back later", ) : SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: UiConstants.space5), child: Column( children: [ - const SizedBox(height: 20), + const SizedBox(height: UiConstants.space5), ...filteredJobs.map( (shift) => Padding( - padding: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.only(bottom: UiConstants.space3), child: MyShiftCard( shift: shift, ), diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/history_shifts_tab.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/history_shifts_tab.dart index 75f78284..6b325194 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/history_shifts_tab.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/history_shifts_tab.dart @@ -17,7 +17,7 @@ class HistoryShiftsTab extends StatelessWidget { @override Widget build(BuildContext context) { if (historyShifts.isEmpty) { - return EmptyStateView( + return const EmptyStateView( icon: UiIcons.clock, title: "No shift history", subtitle: "Completed shifts appear here", @@ -25,13 +25,13 @@ class HistoryShiftsTab extends StatelessWidget { } return SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: UiConstants.space5), child: Column( children: [ - const SizedBox(height: 20), + const SizedBox(height: UiConstants.space5), ...historyShifts.map( (shift) => Padding( - padding: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.only(bottom: UiConstants.space3), child: GestureDetector( onTap: () => Modular.to.pushShiftDetails(shift), child: MyShiftCard( diff --git a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/my_shifts_tab.dart b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/my_shifts_tab.dart index d2aecd1f..f184df7c 100644 --- a/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/my_shifts_tab.dart +++ b/apps/mobile/packages/features/staff/shifts/lib/src/presentation/widgets/tabs/my_shifts_tab.dart @@ -1,14 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import 'package:design_system/design_system.dart'; import 'package:krow_domain/krow_domain.dart'; import '../../blocs/shifts/shifts_bloc.dart'; import '../my_shift_card.dart'; import '../shift_assignment_card.dart'; import '../shared/empty_state_view.dart'; -import '../../styles/shifts_styles.dart'; class MyShiftsTab extends StatefulWidget { final List myShifts; @@ -118,14 +116,14 @@ class _MyShiftsTabState extends State { Navigator.of(context).pop(); context.read().add(AcceptShiftEvent(id)); ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Shift confirmed!'), - backgroundColor: Color(0xFF10B981), + SnackBar( + content: const Text('Shift confirmed!'), + backgroundColor: UiColors.success, ), ); }, style: TextButton.styleFrom( - foregroundColor: const Color(0xFF10B981), + foregroundColor: UiColors.success, ), child: const Text('Accept'), ), @@ -152,14 +150,14 @@ class _MyShiftsTabState extends State { Navigator.of(context).pop(); context.read().add(DeclineShiftEvent(id)); ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Shift declined.'), - backgroundColor: Color(0xFFEF4444), + SnackBar( + content: const Text('Shift declined.'), + backgroundColor: UiColors.destructive, ), ); }, style: TextButton.styleFrom( - foregroundColor: const Color(0xFFEF4444), + foregroundColor: UiColors.destructive, ), child: const Text('Decline'), ), @@ -212,12 +210,15 @@ class _MyShiftsTabState extends State { children: [ // Calendar Selector Container( - color: Colors.white, - padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 16), + color: UiColors.white, + padding: const EdgeInsets.symmetric( + vertical: UiConstants.space4, + horizontal: UiConstants.space4, + ), child: Column( children: [ Padding( - padding: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.only(bottom: UiConstants.space3), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -225,7 +226,7 @@ class _MyShiftsTabState extends State { icon: const Icon( UiIcons.chevronLeft, size: 20, - color: AppColors.krowCharcoal, + color: UiColors.textPrimary, ), onPressed: () => setState(() { _weekOffset--; @@ -237,17 +238,13 @@ class _MyShiftsTabState extends State { ), Text( DateFormat('MMMM yyyy').format(weekStartDate), - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: AppColors.krowCharcoal, - ), + style: UiTypography.title1m.textPrimary, ), IconButton( icon: const Icon( UiIcons.chevronRight, size: 20, - color: AppColors.krowCharcoal, + color: UiColors.textPrimary, ), onPressed: () => setState(() { _weekOffset++; @@ -284,13 +281,13 @@ class _MyShiftsTabState extends State { height: 60, decoration: BoxDecoration( color: isSelected - ? AppColors.krowBlue - : Colors.white, - borderRadius: BorderRadius.circular(12), + ? UiColors.primary + : UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase), border: Border.all( color: isSelected - ? AppColors.krowBlue - : AppColors.krowBorder, + ? UiColors.primary + : UiColors.border, width: 1, ), ), @@ -299,31 +296,25 @@ class _MyShiftsTabState extends State { children: [ Text( date.day.toString().padLeft(2, '0'), - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: isSelected - ? Colors.white - : AppColors.krowCharcoal, - ), + style: isSelected + ? UiTypography.body1b.white + : UiTypography.body1b.textPrimary, ), Text( DateFormat('E').format(date), - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.w500, - color: isSelected - ? Colors.white.withOpacity(0.8) - : AppColors.krowMuted, + style: (isSelected + ? UiTypography.footnote2m.white + : UiTypography.footnote2m.textSecondary).copyWith( + color: isSelected ? UiColors.white.withValues(alpha: 0.8) : null, ), ), if (hasShifts && !isSelected) Container( - margin: const EdgeInsets.only(top: 4), + margin: const EdgeInsets.only(top: UiConstants.space1), width: 4, height: 4, decoration: const BoxDecoration( - color: AppColors.krowBlue, + color: UiColors.primary, shape: BoxShape.circle, ), ), @@ -338,22 +329,22 @@ class _MyShiftsTabState extends State { ], ), ), - const Divider(height: 1, color: AppColors.krowBorder), + const Divider(height: 1, color: UiColors.border), Expanded( child: SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: UiConstants.space5), child: Column( children: [ - const SizedBox(height: 20), + const SizedBox(height: UiConstants.space5), if (widget.pendingAssignments.isNotEmpty) ...[ _buildSectionHeader( "Awaiting Confirmation", - const Color(0xFFF59E0B), + UiColors.textWarning, ), ...widget.pendingAssignments.map( (shift) => Padding( - padding: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.only(bottom: UiConstants.space4), child: ShiftAssignmentCard( shift: shift, onConfirm: () => _confirmShift(shift.id), @@ -362,14 +353,14 @@ class _MyShiftsTabState extends State { ), ), ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), ], if (visibleCancelledShifts.isNotEmpty) ...[ - _buildSectionHeader("Cancelled Shifts", AppColors.krowMuted), + _buildSectionHeader("Cancelled Shifts", UiColors.textSecondary), ...visibleCancelledShifts.map( (shift) => Padding( - padding: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.only(bottom: UiConstants.space4), child: _buildCancelledCard( title: shift.title, client: shift.clientName, @@ -383,15 +374,15 @@ class _MyShiftsTabState extends State { ), ), ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), ], // Confirmed Shifts if (visibleMyShifts.isNotEmpty) ...[ - _buildSectionHeader("Confirmed Shifts", AppColors.krowMuted), + _buildSectionHeader("Confirmed Shifts", UiColors.textSecondary), ...visibleMyShifts.map( (shift) => Padding( - padding: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.only(bottom: UiConstants.space3), child: MyShiftCard(shift: shift), ), ), @@ -417,7 +408,7 @@ class _MyShiftsTabState extends State { Widget _buildSectionHeader(String title, Color dotColor) { return Padding( - padding: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.only(bottom: UiConstants.space4), child: Row( children: [ Container( @@ -425,16 +416,12 @@ class _MyShiftsTabState extends State { height: 8, decoration: BoxDecoration(color: dotColor, shape: BoxShape.circle), ), - const SizedBox(width: 8), + const SizedBox(width: UiConstants.space2), Text( title, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: dotColor == AppColors.krowMuted - ? AppColors.krowMuted - : dotColor, - ), + style: (dotColor == UiColors.textSecondary + ? UiTypography.body2b.textSecondary + : UiTypography.body2b.copyWith(color: dotColor)), ), ], ), @@ -455,11 +442,11 @@ class _MyShiftsTabState extends State { return GestureDetector( onTap: onTap, child: Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(UiConstants.space4), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), - border: Border.all(color: AppColors.krowBorder), + color: UiColors.white, + borderRadius: BorderRadius.circular(UiConstants.radiusBase + 4), + border: Border.all(color: UiColors.border), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -470,33 +457,25 @@ class _MyShiftsTabState extends State { width: 6, height: 6, decoration: const BoxDecoration( - color: Color(0xFFEF4444), + color: UiColors.destructive, shape: BoxShape.circle, ), ), const SizedBox(width: 6), - const Text( + Text( "CANCELLED", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.bold, - color: Color(0xFFEF4444), - ), + style: UiTypography.footnote2b.textError, ), if (isLastMinute) ...[ const SizedBox(width: 4), - const Text( + Text( "• 4hr compensation", - style: TextStyle( - fontSize: 10, - fontWeight: FontWeight.w500, - color: Color(0xFF10B981), - ), + style: UiTypography.footnote2m.textSuccess, ), ], ], ), - const SizedBox(height: 12), + const SizedBox(height: UiConstants.space3), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -504,18 +483,18 @@ class _MyShiftsTabState extends State { width: 44, height: 44, decoration: BoxDecoration( - color: AppColors.krowBlue.withOpacity(0.05), - borderRadius: BorderRadius.circular(12), + color: UiColors.primary.withValues(alpha: 0.05), + borderRadius: BorderRadius.circular(UiConstants.radiusBase), ), child: const Center( child: Icon( - LucideIcons.briefcase, - color: AppColors.krowBlue, + UiIcons.briefcase, + color: UiColors.primary, size: 20, ), ), ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -529,18 +508,11 @@ class _MyShiftsTabState extends State { children: [ Text( title, - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: AppColors.krowCharcoal, - ), + style: UiTypography.body2b.textPrimary, ), Text( client, - style: const TextStyle( - fontSize: 12, - color: AppColors.krowMuted, - ), + style: UiTypography.footnote1r.textSecondary, ), ], ), @@ -550,52 +522,39 @@ class _MyShiftsTabState extends State { children: [ Text( pay, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: AppColors.krowCharcoal, - ), + style: UiTypography.headline4m.textPrimary, ), Text( rate, - style: const TextStyle( - fontSize: 10, - color: AppColors.krowMuted, - ), + style: UiTypography.footnote2r.textSecondary, ), ], ), ], ), - const SizedBox(height: 8), + const SizedBox(height: UiConstants.space2), Row( children: [ const Icon( - LucideIcons.calendar, + UiIcons.calendar, size: 12, - color: AppColors.krowMuted, + color: UiColors.textSecondary, ), const SizedBox(width: 4), Text( date, - style: const TextStyle( - fontSize: 12, - color: AppColors.krowMuted, - ), + style: UiTypography.footnote1r.textSecondary, ), - const SizedBox(width: 12), + const SizedBox(width: UiConstants.space3), const Icon( - LucideIcons.clock, + UiIcons.clock, size: 12, - color: AppColors.krowMuted, + color: UiColors.textSecondary, ), const SizedBox(width: 4), Text( time, - style: const TextStyle( - fontSize: 12, - color: AppColors.krowMuted, - ), + style: UiTypography.footnote1r.textSecondary, ), ], ), @@ -603,18 +562,15 @@ class _MyShiftsTabState extends State { Row( children: [ const Icon( - LucideIcons.mapPin, + UiIcons.mapPin, size: 12, - color: AppColors.krowMuted, + color: UiColors.textSecondary, ), const SizedBox(width: 4), Expanded( child: Text( address, - style: const TextStyle( - fontSize: 12, - color: AppColors.krowMuted, - ), + style: UiTypography.footnote1r.textSecondary, overflow: TextOverflow.ellipsis, ), ),