From 507e31d7f9bd904c7e43c4d99ea2626e3642b72a Mon Sep 17 00:00:00 2001 From: Sendi Guntur Fajar Saputra Date: Mon, 27 Jul 2026 12:19:45 +0700 Subject: [PATCH] Upload project Mylaundry1 --- laundry-app/.editorconfig | 18 + laundry-app/.gitattributes | 11 + laundry-app/.gitignore | 24 + laundry-app/README.md | 59 + laundry-app/app/Exports/ReportExport.php | 305 + .../Http/Controllers/Api/AuthController.php | 58 + .../Controllers/Api/DashboardController.php | 150 + .../Controllers/Api/ServiceController.php | 32 + .../Api/ShopSettingsController.php | 96 + .../Controllers/Api/TransactionController.php | 694 ++ .../Auth/AuthenticatedSessionController.php | 47 + .../Auth/ConfirmablePasswordController.php | 40 + ...mailVerificationNotificationController.php | 24 + .../EmailVerificationPromptController.php | 21 + .../Auth/NewPasswordController.php | 62 + .../Controllers/Auth/PasswordController.php | 29 + .../Auth/PasswordResetLinkController.php | 44 + .../Auth/RegisteredUserController.php | 51 + .../Auth/VerifyEmailController.php | 27 + .../app/Http/Controllers/Controller.php | 8 + .../Http/Controllers/DashboardController.php | 47 + .../Http/Controllers/LaundryController.php | 101 + .../Http/Controllers/OrderListController.php | 57 + .../Http/Controllers/ProfileController.php | 60 + .../app/Http/Controllers/ReportController.php | 140 + .../app/Http/Controllers/StaffController.php | 84 + .../app/Http/Controllers/UserController.php | 75 + laundry-app/app/Http/Middleware/OnlyOwner.php | 30 + .../Http/Middleware/PreventBackHistory.php | 25 + .../app/Http/Requests/Auth/LoginRequest.php | 88 + .../Http/Requests/ProfileUpdateRequest.php | 30 + laundry-app/app/Livewire/ActiveOrders.php | 22 + laundry-app/app/Livewire/DashboardStats.php | 19 + laundry-app/app/Models/Order.php | 85 + laundry-app/app/Models/OrderItem.php | 38 + laundry-app/app/Models/Service.php | 51 + laundry-app/app/Models/Shop.php | 44 + laundry-app/app/Models/User.php | 89 + .../app/Notifications/CustomResetPassword.php | 106 + .../app/Providers/AppServiceProvider.php | 31 + laundry-app/app/View/Components/AppLayout.php | 17 + .../app/View/Components/GuestLayout.php | 17 + laundry-app/artisan | 18 + laundry-app/bootstrap/app.php | 26 + laundry-app/bootstrap/cache/.gitignore | 2 + laundry-app/bootstrap/providers.php | 5 + laundry-app/composer.json | 104 + laundry-app/composer.lock | 9653 +++++++++++++++++ laundry-app/config/app.php | 126 + laundry-app/config/auth.php | 115 + laundry-app/config/cache.php | 117 + laundry-app/config/database.php | 183 + laundry-app/config/filesystems.php | 80 + laundry-app/config/logging.php | 132 + laundry-app/config/mail.php | 118 + laundry-app/config/queue.php | 129 + laundry-app/config/sanctum.php | 84 + laundry-app/config/services.php | 47 + laundry-app/config/session.php | 217 + laundry-app/database/.gitignore | 1 + .../database/factories/UserFactory.php | 44 + .../0001_01_01_000000_create_users_table.php | 61 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + .../2026_02_08_073500_create_shops_table.php | 43 + ...026_02_08_073610_create_services_table.php | 28 + .../2026_02_08_073659_create_orders_table.php | 62 + ...32_create_personal_access_tokens_table.php | 33 + ..._05_24_113000_create_order_items_table.php | 36 + ...2_drop_unused_columns_from_shops_table.php | 30 + .../database/seeders/DatabaseSeeder.php | 21 + laundry-app/envexample.txt | 65 + laundry-app/lang/en/auth.php | 20 + laundry-app/lang/en/pagination.php | 19 + laundry-app/lang/en/passwords.php | 22 + laundry-app/lang/en/validation.php | 200 + laundry-app/package-lock.json | 3246 ++++++ laundry-app/package.json | 21 + laundry-app/phpunit.xml | 35 + laundry-app/postcss.config.js | 6 + laundry-app/public/.htaccess | 25 + laundry-app/public/app_icon.png | Bin 0 -> 9232 bytes laundry-app/public/favicon.ico | Bin 0 -> 9232 bytes laundry-app/public/index.php | 20 + laundry-app/public/robots.txt | 2 + laundry-app/resources/css/app.css | 3 + laundry-app/resources/js/app.js | 7 + laundry-app/resources/js/bootstrap.js | 4 + .../views/auth/confirm-password.blade.php | 27 + .../views/auth/forgot-password.blade.php | 77 + .../resources/views/auth/login.blade.php | 136 + .../resources/views/auth/register.blade.php | 119 + .../views/auth/reset-password.blade.php | 39 + .../views/auth/verify-email.blade.php | 31 + .../components/application-logo.blade.php | 1 + .../components/auth-session-status.blade.php | 7 + .../views/components/danger-button.blade.php | 3 + .../views/components/dropdown-link.blade.php | 1 + .../views/components/dropdown.blade.php | 35 + .../views/components/input-error.blade.php | 9 + .../views/components/input-label.blade.php | 5 + .../views/components/modal.blade.php | 78 + .../views/components/nav-link.blade.php | 11 + .../views/components/primary-button.blade.php | 3 + .../components/responsive-nav-link.blade.php | 11 + .../components/secondary-button.blade.php | 3 + .../views/components/text-input.blade.php | 3 + .../resources/views/dashboard.blade.php | 132 + laundry-app/resources/views/laundry.blade.php | 239 + .../resources/views/laundry/create.blade.php | 76 + .../resources/views/laundry/edit.blade.php | 88 + .../resources/views/layouts/app.blade.php | 253 + .../resources/views/layouts/guest.blade.php | 34 + .../views/layouts/navigation.blade.php | 100 + .../views/livewire/active-orders.blade.php | 206 + .../views/livewire/dashboard-stats.blade.php | 48 + .../views/orders/status_list.blade.php | 346 + .../resources/views/profile/edit.blade.php | 29 + .../partials/delete-user-form.blade.php | 55 + .../partials/update-password-form.blade.php | 48 + .../update-profile-information-form.blade.php | 64 + laundry-app/resources/views/reports.blade.php | 499 + .../resources/views/settings.blade.php | 378 + .../resources/views/staff/create.blade.php | 67 + .../resources/views/staff/edit.blade.php | 69 + .../views/vendor/mail/html/button.blade.php | 24 + .../views/vendor/mail/html/footer.blade.php | 11 + .../views/vendor/mail/html/header.blade.php | 8 + .../views/vendor/mail/html/layout.blade.php | 58 + .../views/vendor/mail/html/message.blade.php | 27 + .../views/vendor/mail/html/panel.blade.php | 14 + .../views/vendor/mail/html/subcopy.blade.php | 7 + .../views/vendor/mail/html/table.blade.php | 3 + .../views/vendor/mail/html/themes/default.css | 297 + .../views/vendor/mail/text/button.blade.php | 1 + .../views/vendor/mail/text/footer.blade.php | 1 + .../views/vendor/mail/text/header.blade.php | 1 + .../views/vendor/mail/text/layout.blade.php | 9 + .../views/vendor/mail/text/message.blade.php | 27 + .../views/vendor/mail/text/panel.blade.php | 1 + .../views/vendor/mail/text/subcopy.blade.php | 1 + .../views/vendor/mail/text/table.blade.php | 1 + .../vendor/notifications/email.blade.php | 58 + laundry-app/routes/api.php | 45 + laundry-app/routes/auth.php | 59 + laundry-app/routes/console.php | 8 + laundry-app/routes/web.php | 55 + laundry-app/storage/app/.gitignore | 4 + laundry-app/storage/app/private/.gitignore | 2 + laundry-app/storage/app/public/.gitignore | 2 + laundry-app/storage/framework/.gitignore | 9 + .../storage/framework/cache/.gitignore | 3 + .../storage/framework/cache/data/.gitignore | 2 + .../storage/framework/sessions/.gitignore | 2 + .../storage/framework/testing/.gitignore | 2 + .../storage/framework/views/.gitignore | 2 + laundry-app/storage/logs/.gitignore | 2 + laundry-app/tailwind.config.js | 21 + .../tests/Feature/Auth/AuthenticationTest.php | 54 + .../Feature/Auth/EmailVerificationTest.php | 58 + .../Feature/Auth/PasswordConfirmationTest.php | 44 + .../tests/Feature/Auth/PasswordResetTest.php | 73 + .../tests/Feature/Auth/PasswordUpdateTest.php | 51 + .../tests/Feature/Auth/RegistrationTest.php | 31 + laundry-app/tests/Feature/ExampleTest.php | 20 + laundry-app/tests/Feature/ProfileTest.php | 100 + laundry-app/tests/TestCase.php | 10 + laundry-app/tests/Unit/ExampleTest.php | 16 + laundry-app/vite.config.js | 11 + laundry_mobile/.gitignore | 43 + laundry_mobile/.metadata | 45 + laundry_mobile/README.md | 16 + laundry_mobile/analysis_options.yaml | 28 + laundry_mobile/analyze_machine.json | Bin 0 -> 1190 bytes laundry_mobile/android/.gitignore | 13 + laundry_mobile/android/app/build.gradle | 46 + .../android/app/google-services.json | 30 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 62 + .../example/laundry_mobile/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 2307 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 1505 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 2786 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 4266 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 5330 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + laundry_mobile/android/build.gradle | 32 + laundry_mobile/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 5 + laundry_mobile/android/settings.gradle | 26 + laundry_mobile/assets/app_icon.png | Bin 0 -> 9232 bytes laundry_mobile/assets/beranda.jpg | Bin 0 -> 307442 bytes laundry_mobile/assets/qris.png | Bin 0 -> 426394 bytes laundry_mobile/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + laundry_mobile/ios/Flutter/Debug.xcconfig | 1 + laundry_mobile/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 616 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + laundry_mobile/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 38146 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 628 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1214 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1806 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 882 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1762 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 2607 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1214 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 2701 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 3500 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1529 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 2930 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1651 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 3324 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 3500 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 5252 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 2307 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 4266 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 2522 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 4484 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 4825 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + laundry_mobile/ios/Runner/Info.plist | 49 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../ios/RunnerTests/RunnerTests.swift | 12 + laundry_mobile/lib/config.dart | 23 + laundry_mobile/lib/driver/beranda.dart | 1055 ++ laundry_mobile/lib/driver/profile.dart | 199 + laundry_mobile/lib/login.dart | 445 + laundry_mobile/lib/main.dart | 103 + laundry_mobile/lib/staf/beranda.dart | 1033 ++ laundry_mobile/lib/staf/home/order_list.dart | 846 ++ laundry_mobile/lib/staf/home/payments.dart | 701 ++ laundry_mobile/lib/staf/laundry.dart | 1503 +++ laundry_mobile/lib/staf/laundry/map.dart | 507 + laundry_mobile/lib/staf/laundry/payment.dart | 954 ++ laundry_mobile/lib/staf/profile.dart | 342 + laundry_mobile/lib/staf/request_pickup.dart | 287 + laundry_mobile/linux/.gitignore | 1 + laundry_mobile/linux/CMakeLists.txt | 145 + laundry_mobile/linux/flutter/CMakeLists.txt | 88 + .../flutter/generated_plugin_registrant.cc | 15 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 24 + laundry_mobile/linux/main.cc | 6 + laundry_mobile/linux/my_application.cc | 124 + laundry_mobile/linux/my_application.h | 18 + laundry_mobile/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 24 + .../macos/Runner.xcodeproj/project.pbxproj | 705 ++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + laundry_mobile/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 + .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + laundry_mobile/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../macos/Runner/Release.entitlements | 8 + .../macos/RunnerTests/RunnerTests.swift | 12 + laundry_mobile/pubspec.lock | 778 ++ laundry_mobile/pubspec.yaml | 105 + laundry_mobile/test/widget_test.dart | 31 + laundry_mobile/web/favicon.png | Bin 0 -> 917 bytes laundry_mobile/web/icons/Icon-192.png | Bin 0 -> 5292 bytes laundry_mobile/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes laundry_mobile/web/index.html | 38 + laundry_mobile/web/manifest.json | 35 + laundry_mobile/windows/.gitignore | 17 + laundry_mobile/windows/CMakeLists.txt | 108 + laundry_mobile/windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 23 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 27 + laundry_mobile/windows/runner/CMakeLists.txt | 40 + laundry_mobile/windows/runner/Runner.rc | 121 + .../windows/runner/flutter_window.cpp | 71 + .../windows/runner/flutter_window.h | 33 + laundry_mobile/windows/runner/main.cpp | 43 + laundry_mobile/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 14 + laundry_mobile/windows/runner/utils.cpp | 65 + laundry_mobile/windows/runner/utils.h | 19 + .../windows/runner/win32_window.cpp | 288 + laundry_mobile/windows/runner/win32_window.h | 102 + mylaundry.ino | 543 + 326 files changed, 36926 insertions(+) create mode 100644 laundry-app/.editorconfig create mode 100644 laundry-app/.gitattributes create mode 100644 laundry-app/.gitignore create mode 100644 laundry-app/README.md create mode 100644 laundry-app/app/Exports/ReportExport.php create mode 100644 laundry-app/app/Http/Controllers/Api/AuthController.php create mode 100644 laundry-app/app/Http/Controllers/Api/DashboardController.php create mode 100644 laundry-app/app/Http/Controllers/Api/ServiceController.php create mode 100644 laundry-app/app/Http/Controllers/Api/ShopSettingsController.php create mode 100644 laundry-app/app/Http/Controllers/Api/TransactionController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/AuthenticatedSessionController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/ConfirmablePasswordController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/EmailVerificationNotificationController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/EmailVerificationPromptController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/NewPasswordController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/PasswordController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/PasswordResetLinkController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/RegisteredUserController.php create mode 100644 laundry-app/app/Http/Controllers/Auth/VerifyEmailController.php create mode 100644 laundry-app/app/Http/Controllers/Controller.php create mode 100644 laundry-app/app/Http/Controllers/DashboardController.php create mode 100644 laundry-app/app/Http/Controllers/LaundryController.php create mode 100644 laundry-app/app/Http/Controllers/OrderListController.php create mode 100644 laundry-app/app/Http/Controllers/ProfileController.php create mode 100644 laundry-app/app/Http/Controllers/ReportController.php create mode 100644 laundry-app/app/Http/Controllers/StaffController.php create mode 100644 laundry-app/app/Http/Controllers/UserController.php create mode 100644 laundry-app/app/Http/Middleware/OnlyOwner.php create mode 100644 laundry-app/app/Http/Middleware/PreventBackHistory.php create mode 100644 laundry-app/app/Http/Requests/Auth/LoginRequest.php create mode 100644 laundry-app/app/Http/Requests/ProfileUpdateRequest.php create mode 100644 laundry-app/app/Livewire/ActiveOrders.php create mode 100644 laundry-app/app/Livewire/DashboardStats.php create mode 100644 laundry-app/app/Models/Order.php create mode 100644 laundry-app/app/Models/OrderItem.php create mode 100644 laundry-app/app/Models/Service.php create mode 100644 laundry-app/app/Models/Shop.php create mode 100644 laundry-app/app/Models/User.php create mode 100644 laundry-app/app/Notifications/CustomResetPassword.php create mode 100644 laundry-app/app/Providers/AppServiceProvider.php create mode 100644 laundry-app/app/View/Components/AppLayout.php create mode 100644 laundry-app/app/View/Components/GuestLayout.php create mode 100644 laundry-app/artisan create mode 100644 laundry-app/bootstrap/app.php create mode 100644 laundry-app/bootstrap/cache/.gitignore create mode 100644 laundry-app/bootstrap/providers.php create mode 100644 laundry-app/composer.json create mode 100644 laundry-app/composer.lock create mode 100644 laundry-app/config/app.php create mode 100644 laundry-app/config/auth.php create mode 100644 laundry-app/config/cache.php create mode 100644 laundry-app/config/database.php create mode 100644 laundry-app/config/filesystems.php create mode 100644 laundry-app/config/logging.php create mode 100644 laundry-app/config/mail.php create mode 100644 laundry-app/config/queue.php create mode 100644 laundry-app/config/sanctum.php create mode 100644 laundry-app/config/services.php create mode 100644 laundry-app/config/session.php create mode 100644 laundry-app/database/.gitignore create mode 100644 laundry-app/database/factories/UserFactory.php create mode 100644 laundry-app/database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 laundry-app/database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 laundry-app/database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 laundry-app/database/migrations/2026_02_08_073500_create_shops_table.php create mode 100644 laundry-app/database/migrations/2026_02_08_073610_create_services_table.php create mode 100644 laundry-app/database/migrations/2026_02_08_073659_create_orders_table.php create mode 100644 laundry-app/database/migrations/2026_02_14_044632_create_personal_access_tokens_table.php create mode 100644 laundry-app/database/migrations/2026_05_24_113000_create_order_items_table.php create mode 100644 laundry-app/database/migrations/2026_06_05_134732_drop_unused_columns_from_shops_table.php create mode 100644 laundry-app/database/seeders/DatabaseSeeder.php create mode 100644 laundry-app/envexample.txt create mode 100644 laundry-app/lang/en/auth.php create mode 100644 laundry-app/lang/en/pagination.php create mode 100644 laundry-app/lang/en/passwords.php create mode 100644 laundry-app/lang/en/validation.php create mode 100644 laundry-app/package-lock.json create mode 100644 laundry-app/package.json create mode 100644 laundry-app/phpunit.xml create mode 100644 laundry-app/postcss.config.js create mode 100644 laundry-app/public/.htaccess create mode 100644 laundry-app/public/app_icon.png create mode 100644 laundry-app/public/favicon.ico create mode 100644 laundry-app/public/index.php create mode 100644 laundry-app/public/robots.txt create mode 100644 laundry-app/resources/css/app.css create mode 100644 laundry-app/resources/js/app.js create mode 100644 laundry-app/resources/js/bootstrap.js create mode 100644 laundry-app/resources/views/auth/confirm-password.blade.php create mode 100644 laundry-app/resources/views/auth/forgot-password.blade.php create mode 100644 laundry-app/resources/views/auth/login.blade.php create mode 100644 laundry-app/resources/views/auth/register.blade.php create mode 100644 laundry-app/resources/views/auth/reset-password.blade.php create mode 100644 laundry-app/resources/views/auth/verify-email.blade.php create mode 100644 laundry-app/resources/views/components/application-logo.blade.php create mode 100644 laundry-app/resources/views/components/auth-session-status.blade.php create mode 100644 laundry-app/resources/views/components/danger-button.blade.php create mode 100644 laundry-app/resources/views/components/dropdown-link.blade.php create mode 100644 laundry-app/resources/views/components/dropdown.blade.php create mode 100644 laundry-app/resources/views/components/input-error.blade.php create mode 100644 laundry-app/resources/views/components/input-label.blade.php create mode 100644 laundry-app/resources/views/components/modal.blade.php create mode 100644 laundry-app/resources/views/components/nav-link.blade.php create mode 100644 laundry-app/resources/views/components/primary-button.blade.php create mode 100644 laundry-app/resources/views/components/responsive-nav-link.blade.php create mode 100644 laundry-app/resources/views/components/secondary-button.blade.php create mode 100644 laundry-app/resources/views/components/text-input.blade.php create mode 100644 laundry-app/resources/views/dashboard.blade.php create mode 100644 laundry-app/resources/views/laundry.blade.php create mode 100644 laundry-app/resources/views/laundry/create.blade.php create mode 100644 laundry-app/resources/views/laundry/edit.blade.php create mode 100644 laundry-app/resources/views/layouts/app.blade.php create mode 100644 laundry-app/resources/views/layouts/guest.blade.php create mode 100644 laundry-app/resources/views/layouts/navigation.blade.php create mode 100644 laundry-app/resources/views/livewire/active-orders.blade.php create mode 100644 laundry-app/resources/views/livewire/dashboard-stats.blade.php create mode 100644 laundry-app/resources/views/orders/status_list.blade.php create mode 100644 laundry-app/resources/views/profile/edit.blade.php create mode 100644 laundry-app/resources/views/profile/partials/delete-user-form.blade.php create mode 100644 laundry-app/resources/views/profile/partials/update-password-form.blade.php create mode 100644 laundry-app/resources/views/profile/partials/update-profile-information-form.blade.php create mode 100644 laundry-app/resources/views/reports.blade.php create mode 100644 laundry-app/resources/views/settings.blade.php create mode 100644 laundry-app/resources/views/staff/create.blade.php create mode 100644 laundry-app/resources/views/staff/edit.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/button.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/footer.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/header.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/layout.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/message.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/panel.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/subcopy.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/table.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/html/themes/default.css create mode 100644 laundry-app/resources/views/vendor/mail/text/button.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/footer.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/header.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/layout.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/message.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/panel.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/subcopy.blade.php create mode 100644 laundry-app/resources/views/vendor/mail/text/table.blade.php create mode 100644 laundry-app/resources/views/vendor/notifications/email.blade.php create mode 100644 laundry-app/routes/api.php create mode 100644 laundry-app/routes/auth.php create mode 100644 laundry-app/routes/console.php create mode 100644 laundry-app/routes/web.php create mode 100644 laundry-app/storage/app/.gitignore create mode 100644 laundry-app/storage/app/private/.gitignore create mode 100644 laundry-app/storage/app/public/.gitignore create mode 100644 laundry-app/storage/framework/.gitignore create mode 100644 laundry-app/storage/framework/cache/.gitignore create mode 100644 laundry-app/storage/framework/cache/data/.gitignore create mode 100644 laundry-app/storage/framework/sessions/.gitignore create mode 100644 laundry-app/storage/framework/testing/.gitignore create mode 100644 laundry-app/storage/framework/views/.gitignore create mode 100644 laundry-app/storage/logs/.gitignore create mode 100644 laundry-app/tailwind.config.js create mode 100644 laundry-app/tests/Feature/Auth/AuthenticationTest.php create mode 100644 laundry-app/tests/Feature/Auth/EmailVerificationTest.php create mode 100644 laundry-app/tests/Feature/Auth/PasswordConfirmationTest.php create mode 100644 laundry-app/tests/Feature/Auth/PasswordResetTest.php create mode 100644 laundry-app/tests/Feature/Auth/PasswordUpdateTest.php create mode 100644 laundry-app/tests/Feature/Auth/RegistrationTest.php create mode 100644 laundry-app/tests/Feature/ExampleTest.php create mode 100644 laundry-app/tests/Feature/ProfileTest.php create mode 100644 laundry-app/tests/TestCase.php create mode 100644 laundry-app/tests/Unit/ExampleTest.php create mode 100644 laundry-app/vite.config.js create mode 100644 laundry_mobile/.gitignore create mode 100644 laundry_mobile/.metadata create mode 100644 laundry_mobile/README.md create mode 100644 laundry_mobile/analysis_options.yaml create mode 100644 laundry_mobile/analyze_machine.json create mode 100644 laundry_mobile/android/.gitignore create mode 100644 laundry_mobile/android/app/build.gradle create mode 100644 laundry_mobile/android/app/google-services.json create mode 100644 laundry_mobile/android/app/src/debug/AndroidManifest.xml create mode 100644 laundry_mobile/android/app/src/main/AndroidManifest.xml create mode 100644 laundry_mobile/android/app/src/main/kotlin/com/example/laundry_mobile/MainActivity.kt create mode 100644 laundry_mobile/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 laundry_mobile/android/app/src/main/res/drawable/launch_background.xml create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 laundry_mobile/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 laundry_mobile/android/app/src/main/res/values-night/styles.xml create mode 100644 laundry_mobile/android/app/src/main/res/values/styles.xml create mode 100644 laundry_mobile/android/app/src/profile/AndroidManifest.xml create mode 100644 laundry_mobile/android/build.gradle create mode 100644 laundry_mobile/android/gradle.properties create mode 100644 laundry_mobile/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 laundry_mobile/android/settings.gradle create mode 100644 laundry_mobile/assets/app_icon.png create mode 100644 laundry_mobile/assets/beranda.jpg create mode 100644 laundry_mobile/assets/qris.png create mode 100644 laundry_mobile/ios/.gitignore create mode 100644 laundry_mobile/ios/Flutter/AppFrameworkInfo.plist create mode 100644 laundry_mobile/ios/Flutter/Debug.xcconfig create mode 100644 laundry_mobile/ios/Flutter/Release.xcconfig create mode 100644 laundry_mobile/ios/Runner.xcodeproj/project.pbxproj create mode 100644 laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 laundry_mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 laundry_mobile/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 laundry_mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 laundry_mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 laundry_mobile/ios/Runner/AppDelegate.swift create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 laundry_mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 laundry_mobile/ios/Runner/Base.lproj/Main.storyboard create mode 100644 laundry_mobile/ios/Runner/Info.plist create mode 100644 laundry_mobile/ios/Runner/Runner-Bridging-Header.h create mode 100644 laundry_mobile/ios/RunnerTests/RunnerTests.swift create mode 100644 laundry_mobile/lib/config.dart create mode 100644 laundry_mobile/lib/driver/beranda.dart create mode 100644 laundry_mobile/lib/driver/profile.dart create mode 100644 laundry_mobile/lib/login.dart create mode 100644 laundry_mobile/lib/main.dart create mode 100644 laundry_mobile/lib/staf/beranda.dart create mode 100644 laundry_mobile/lib/staf/home/order_list.dart create mode 100644 laundry_mobile/lib/staf/home/payments.dart create mode 100644 laundry_mobile/lib/staf/laundry.dart create mode 100644 laundry_mobile/lib/staf/laundry/map.dart create mode 100644 laundry_mobile/lib/staf/laundry/payment.dart create mode 100644 laundry_mobile/lib/staf/profile.dart create mode 100644 laundry_mobile/lib/staf/request_pickup.dart create mode 100644 laundry_mobile/linux/.gitignore create mode 100644 laundry_mobile/linux/CMakeLists.txt create mode 100644 laundry_mobile/linux/flutter/CMakeLists.txt create mode 100644 laundry_mobile/linux/flutter/generated_plugin_registrant.cc create mode 100644 laundry_mobile/linux/flutter/generated_plugin_registrant.h create mode 100644 laundry_mobile/linux/flutter/generated_plugins.cmake create mode 100644 laundry_mobile/linux/main.cc create mode 100644 laundry_mobile/linux/my_application.cc create mode 100644 laundry_mobile/linux/my_application.h create mode 100644 laundry_mobile/macos/.gitignore create mode 100644 laundry_mobile/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 laundry_mobile/macos/Flutter/Flutter-Release.xcconfig create mode 100644 laundry_mobile/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 laundry_mobile/macos/Runner.xcodeproj/project.pbxproj create mode 100644 laundry_mobile/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 laundry_mobile/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 laundry_mobile/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 laundry_mobile/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 laundry_mobile/macos/Runner/AppDelegate.swift create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 laundry_mobile/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 laundry_mobile/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 laundry_mobile/macos/Runner/Configs/Debug.xcconfig create mode 100644 laundry_mobile/macos/Runner/Configs/Release.xcconfig create mode 100644 laundry_mobile/macos/Runner/Configs/Warnings.xcconfig create mode 100644 laundry_mobile/macos/Runner/DebugProfile.entitlements create mode 100644 laundry_mobile/macos/Runner/Info.plist create mode 100644 laundry_mobile/macos/Runner/MainFlutterWindow.swift create mode 100644 laundry_mobile/macos/Runner/Release.entitlements create mode 100644 laundry_mobile/macos/RunnerTests/RunnerTests.swift create mode 100644 laundry_mobile/pubspec.lock create mode 100644 laundry_mobile/pubspec.yaml create mode 100644 laundry_mobile/test/widget_test.dart create mode 100644 laundry_mobile/web/favicon.png create mode 100644 laundry_mobile/web/icons/Icon-192.png create mode 100644 laundry_mobile/web/icons/Icon-512.png create mode 100644 laundry_mobile/web/icons/Icon-maskable-192.png create mode 100644 laundry_mobile/web/icons/Icon-maskable-512.png create mode 100644 laundry_mobile/web/index.html create mode 100644 laundry_mobile/web/manifest.json create mode 100644 laundry_mobile/windows/.gitignore create mode 100644 laundry_mobile/windows/CMakeLists.txt create mode 100644 laundry_mobile/windows/flutter/CMakeLists.txt create mode 100644 laundry_mobile/windows/flutter/generated_plugin_registrant.cc create mode 100644 laundry_mobile/windows/flutter/generated_plugin_registrant.h create mode 100644 laundry_mobile/windows/flutter/generated_plugins.cmake create mode 100644 laundry_mobile/windows/runner/CMakeLists.txt create mode 100644 laundry_mobile/windows/runner/Runner.rc create mode 100644 laundry_mobile/windows/runner/flutter_window.cpp create mode 100644 laundry_mobile/windows/runner/flutter_window.h create mode 100644 laundry_mobile/windows/runner/main.cpp create mode 100644 laundry_mobile/windows/runner/resource.h create mode 100644 laundry_mobile/windows/runner/resources/app_icon.ico create mode 100644 laundry_mobile/windows/runner/runner.exe.manifest create mode 100644 laundry_mobile/windows/runner/utils.cpp create mode 100644 laundry_mobile/windows/runner/utils.h create mode 100644 laundry_mobile/windows/runner/win32_window.cpp create mode 100644 laundry_mobile/windows/runner/win32_window.h create mode 100644 mylaundry.ino diff --git a/laundry-app/.editorconfig b/laundry-app/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/laundry-app/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/laundry-app/.gitattributes b/laundry-app/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/laundry-app/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/laundry-app/.gitignore b/laundry-app/.gitignore new file mode 100644 index 0000000..b71b1ea --- /dev/null +++ b/laundry-app/.gitignore @@ -0,0 +1,24 @@ +*.log +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +/.fleet +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/laundry-app/README.md b/laundry-app/README.md new file mode 100644 index 0000000..0165a77 --- /dev/null +++ b/laundry-app/README.md @@ -0,0 +1,59 @@ +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/laundry-app/app/Exports/ReportExport.php b/laundry-app/app/Exports/ReportExport.php new file mode 100644 index 0000000..263987e --- /dev/null +++ b/laundry-app/app/Exports/ReportExport.php @@ -0,0 +1,305 @@ +startDate = $startDate; + $this->endDate = $endDate; + $this->deliveryType = $deliveryType; + $this->paymentMethod = $paymentMethod; + $this->ids = $ids; + } + + public function startCell(): string + { + return 'A8'; + } + + public function query() + { + $query = \App\Models\Order::query()->whereIn('status', ['DIAMBIL', 'DITERIMA']); + + if (!empty($this->ids)) { + $query->whereIn('id', $this->ids); + } else { + $query->whereBetween('updated_at', [$this->startDate . ' 00:00:00', $this->endDate . ' 23:59:59']); + + if ($this->deliveryType !== 'all') { + if ($this->deliveryType === 'none') { + $query->where(function($q) { + $q->where('delivery_type', 'none')->orWhereNull('delivery_type'); + }); + } else { + $query->where('delivery_type', $this->deliveryType); + } + } + + if ($this->paymentMethod !== 'all') { + $query->where('payment_method', $this->paymentMethod); + } + } + + return $query; + } + public function headings(): array + { + $headers = [ + 'No. Order', 'Tanggal Selesai', 'Nama Pelanggan', + 'Layanan', 'Jumlah', 'Harga Layanan', + 'Metode', 'Layanan Driver' + ]; + + if (strtoupper($this->paymentMethod) !== 'QRIS') { + $headers[] = 'Uang Masuk'; + $headers[] = 'Kembalian'; + } + + $headers[] = 'Ongkir'; + $headers[] = 'Total Harga'; + + return $headers; + } + + public function map($order): array + { + $this->rowCount++; + + // 1. Ambil Data Layanan dari Order Items + $layananArr = []; + $jumlahArr = []; + $hargaLayananArr = []; + + if ($order->items) { + foreach ($order->items as $item) { + $layananArr[] = $item->service_name; + + // Format jumlah agar tidak ada 0 berlebih di belakang koma (misal 2.000 -> 2) + $qty = floatval($item->qty_or_weight); + $qtyStr = rtrim(rtrim(number_format($qty, 3, '.', ''), '0'), '.'); + $jumlahArr[] = $qtyStr . ' ' . $item->unit; + + $hargaLayananArr[] = $item->price; + } + } + + $layananStr = implode(",\n", $layananArr); + $jumlahStr = implode(",\n", $jumlahArr); + $hargaLayananStr = implode(",\n", $hargaLayananArr); + + // 2. Bersihkan Angka + $valTotal = (int) preg_replace('/[^0-9]/', '', $order->total_price); + $valReceived = (int) preg_replace('/[^0-9]/', '', $order->cash_received ?? $order->total_price); + $valChange = (int) preg_replace('/[^0-9]/', '', $order->cash_change ?? 0); + $valOngkir = (int) ($order->delivery_fee ?? 0); + + $method = strtoupper($order->payment_method); + + // 3. Klasifikasi Pendapatan + if ($method == 'CASH') { + $this->totalCash += $valTotal; + $uangMasuk = $valReceived; + $kembalian = $valChange; + } else { + $this->totalQRIS += $valTotal; + $uangMasuk = $valTotal; + $kembalian = 0; + } + + $this->totalDeliveryFee += $valOngkir; + $this->grandTotalHarga += $valTotal; + $this->totalUangMasuk += $uangMasuk; + $this->totalKembalian += $kembalian; + + $typeLabel = "Ambil Sendiri"; + if ($order->delivery_type === 'pickup') $typeLabel = "Pick-up"; + else if ($order->delivery_type === 'delivery') $typeLabel = "Delivery"; + else if ($order->delivery_type === 'both') $typeLabel = "Delivery & Pick-up"; + + // Return data dengan kolom baru + $row = [ + '#' . ($order->order_number ?? $order->invoice_number), + $order->updated_at->format('d/m/Y H:i'), + $order->customer_name, + $layananStr, + $jumlahStr, + $hargaLayananStr, + $method == 'CASH' ? 'TUNAI' : $method, + $typeLabel, + ]; + + if (strtoupper($this->paymentMethod) !== 'QRIS') { + $row[] = $uangMasuk; + $row[] = $kembalian; + } + + $row[] = $valOngkir; + $row[] = $valTotal; + + return $row; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function(AfterSheet $event) { + $lastDataRow = $this->rowCount + 8; + $summaryBottomRow = $lastDataRow + 1; + + $isQris = strtoupper($this->paymentMethod) === 'QRIS'; + $lastCol = $isQris ? 'J' : 'L'; + + // --- BAGIAN ATAS: JUDUL (Disesuaikan ke kolom L atau J) --- + $title = 'LAPORAN PENDAPATAN LAUNDRY'; + $filters = []; + + if ($this->deliveryType !== 'all') { + $deliveryLabel = ''; + if ($this->deliveryType === 'none') $deliveryLabel = 'Ambil Sendiri'; + else if ($this->deliveryType === 'pickup') $deliveryLabel = 'Pick-up'; + else if ($this->deliveryType === 'delivery') $deliveryLabel = 'Delivery'; + else if ($this->deliveryType === 'both') $deliveryLabel = 'Delivery & Pick-up'; + + if ($deliveryLabel) $filters[] = $deliveryLabel; + } + + if ($this->paymentMethod !== 'all') { + $paymentLabel = strtoupper($this->paymentMethod); + if ($paymentLabel === 'CASH') $paymentLabel = 'TUNAI'; + $filters[] = $paymentLabel; + } + + if (!empty($filters)) { + $title .= ' (' . implode(' - ', $filters) . ')'; + } + + $event->sheet->mergeCells("A1:{$lastCol}1"); + $event->sheet->setCellValue('A1', $title); + + $periode = Carbon::parse($this->startDate)->format('d M Y') . ' - ' . Carbon::parse($this->endDate)->format('d M Y'); + $event->sheet->mergeCells("A2:{$lastCol}2"); + $event->sheet->setCellValue('A2', 'Periode: ' . $periode); + + // Ringkasan Pendapatan di Atas (Baris 4-6) + $event->sheet->setCellValue('A4', 'TOTAL KESELURUHAN'); + $event->sheet->setCellValue('B4', ': Rp ' . number_format($this->grandTotalHarga, 0, ',', '.')); + + $event->sheet->setCellValue('A5', 'TOTAL JASA LAUNDRY'); + $event->sheet->setCellValue('B5', ': Rp ' . number_format($this->grandTotalHarga - $this->totalDeliveryFee, 0, ',', '.')); + + $event->sheet->setCellValue('A6', 'TOTAL ONGKIR (DRIVER)'); + $event->sheet->setCellValue('B6', ': Rp ' . number_format($this->totalDeliveryFee, 0, ',', '.')); + + $currentRow = 4; + if ($this->paymentMethod === 'all' || strtoupper($this->paymentMethod) === 'CASH') { + $event->sheet->setCellValue('D' . $currentRow, 'TOTAL TUNAI (Fisik)'); + $event->sheet->setCellValue('E' . $currentRow, ': Rp ' . number_format($this->totalCash, 0, ',', '.')); + $currentRow++; + } + + if ($this->paymentMethod === 'all' || strtoupper($this->paymentMethod) === 'QRIS') { + $event->sheet->setCellValue('D' . $currentRow, 'TOTAL QRIS (Digital)'); + $event->sheet->setCellValue('E' . $currentRow, ': Rp ' . number_format($this->totalQRIS, 0, ',', '.')); + $currentRow++; + } + + // --- BAGIAN BAWAH: TOTAL KESELURUHAN KOLOM --- + $event->sheet->mergeCells("A{$summaryBottomRow}:H{$summaryBottomRow}"); + $event->sheet->setCellValue("A{$summaryBottomRow}", "TOTAL KESELURUHAN"); + if ($isQris) { + $event->sheet->setCellValue("I{$summaryBottomRow}", $this->totalDeliveryFee); + $event->sheet->setCellValue("J{$summaryBottomRow}", $this->grandTotalHarga); + } else { + $event->sheet->setCellValue("I{$summaryBottomRow}", ""); + $event->sheet->setCellValue("J{$summaryBottomRow}", ""); + $event->sheet->setCellValue("K{$summaryBottomRow}", $this->totalDeliveryFee); + $event->sheet->setCellValue("L{$summaryBottomRow}", $this->grandTotalHarga); + } + + // --- STYLING --- + $event->sheet->getStyle('A1:A2')->getFont()->setBold(true)->setSize(14); + $event->sheet->getStyle('A1:A2')->getAlignment()->setHorizontal('center'); + + $event->sheet->getStyle('A4:A6')->getFont()->setBold(true); + $lastRowStyle = $currentRow - 1; + if ($lastRowStyle >= 4) { + $event->sheet->getStyle('D4:D' . $lastRowStyle)->getFont()->setBold(true); + $event->sheet->getStyle('E4:E' . $lastRowStyle)->getFont()->getColor()->setRGB('1D6F42'); + } + $event->sheet->getStyle('B4:B6')->getFont()->getColor()->setRGB('1D6F42'); + + // Styling Baris Total Bawah + $event->sheet->getStyle("A{$summaryBottomRow}:{$lastCol}{$summaryBottomRow}")->applyFromArray([ + 'font' => ['bold' => true], + 'fill' => ['fillType' => 'solid', 'startColor' => ['rgb' => 'E2EFDA']], // Warna hijau muda yang lebih rapi + 'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN]] + ]); + $event->sheet->getStyle("A{$summaryBottomRow}")->getAlignment()->setHorizontal('left'); + if ($isQris) { + $event->sheet->getStyle("I{$summaryBottomRow}:J{$summaryBottomRow}")->getNumberFormat()->setFormatCode('#,##0'); + } else { + $event->sheet->getStyle("I{$summaryBottomRow}:L{$summaryBottomRow}")->getNumberFormat()->setFormatCode('#,##0'); + } + + // Set wrap text agar comma-separated dengan \n tampil rapi + $event->sheet->getStyle("D8:F{$lastDataRow}")->getAlignment()->setWrapText(true); + }, + ]; + } + + public function styles(Worksheet $sheet) + { + $highestRow = $sheet->getHighestRow(); + $isQris = strtoupper($this->paymentMethod) === 'QRIS'; + $lastCol = $isQris ? 'J' : 'L'; + + // Header Tabel (Baris 8, disesuaikan sampai kolom L atau J) + $sheet->getStyle("A8:{$lastCol}8")->applyFromArray([ + 'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']], + 'fill' => ['fillType' => 'solid', 'startColor' => ['rgb' => '1D6F42']], + 'alignment' => ['horizontal' => 'center'], + ]); + + // Border Tabel + $sheet->getStyle("A8:{$lastCol}" . $highestRow)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN); + + // Format Ribuan Kolom Keuangan + $sheet->getStyle('F9:F' . $highestRow)->getNumberFormat()->setFormatCode('#,##0'); + if ($isQris) { + $sheet->getStyle('I9:J' . $highestRow)->getNumberFormat()->setFormatCode('#,##0'); + } else { + $sheet->getStyle('I9:L' . $highestRow)->getNumberFormat()->setFormatCode('#,##0'); + } + + return []; + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/Api/AuthController.php b/laundry-app/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..d742850 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,58 @@ +validate([ + 'email' => 'required|email', + 'password' => 'required', + ]); + + $user = User::where('email', $request->email)->first(); + + if (!$user || !Hash::check($request->password, $user->password)) { + return response()->json(['message' => 'Email atau password salah.'], 401); + } + + // --- PROTEKSI API --- + if (!in_array($user->role, ['staf', 'driver'])) { + return response()->json([ + 'message' => 'Akses ditolak. Aplikasi ini hanya untuk staf dan driver.' + ], 403); // 403 Forbidden + } + + // --- PERBAIKAN 1: Hapus token lama sebelum membuat yang baru --- + // Ini akan mencegah tabel personal_access_tokens menjadi penuh/numpuk + $user->tokens()->delete(); + + $token = $user->createToken('auth_token')->plainTextToken; + + return response()->json([ + 'success' => true, + 'access_token' => $token, + 'token_type' => 'Bearer', + 'user' => $user, + 'shop' => $user->getOwnerShop(), + ]); + } + + // --- PERBAIKAN 2: Tambahkan fungsi Logout --- + public function logout(Request $request) + { + // Menghapus token yang sedang dipakai oleh staf saat ini + $request->user()->currentAccessToken()->delete(); + + return response()->json([ + 'success' => true, + 'message' => 'Berhasil logout dan token telah dihapus.' + ]); + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/Api/DashboardController.php b/laundry-app/app/Http/Controllers/Api/DashboardController.php new file mode 100644 index 0000000..822e379 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Api/DashboardController.php @@ -0,0 +1,150 @@ + (int) Order::where('status', 'ANTRIAN')->count(), + 'proses' => (int) Order::where('status', 'PROSES')->count(), + 'selesai' => (int) Order::where('status', 'SELESAI')->count(), + ]; + + return response()->json([ + 'success' => true, + 'data' => $stats + ], 200); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal mengambil stats: ' . $e->getMessage() + ], 500); + } + } + + public function getActivities() + { + try { + // PERBAIKAN: Tambahkan estimation_time, created_at di dalam select + $activities = Order::with('items')->select('id', 'order_number', 'customer_name', 'phone', 'status', 'updated_at', 'delivery_fee', 'total_price', 'delivery_type', 'payment_method', 'cash_received', 'estimation_time', 'created_at') + ->orderBy('updated_at', 'desc') + ->limit(50) + ->get() + ->map(function ($order) { + $services = $order->items->map(function ($item) { + $qty = fmod($item->qty_or_weight, 1) == 0 ? (int)$item->qty_or_weight : $item->qty_or_weight; + return $item->service_name . ' (' . $qty . ' ' . $item->unit . ')'; + })->implode(' + '); + + $subtitle = $services; + if ($order->delivery_fee > 0) { + $ongkir = number_format($order->delivery_fee, 0, ',', '.'); + $subtitle .= ($subtitle ? " + " : "") . "Ongkir: Rp $ongkir"; + } + $isPaid = strtoupper($order->payment_method) !== 'BAYAR NANTI' || $order->cash_received > 0; + // Calculate estimation type + $tipeEstimasi = "Reguler"; + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) { + $tipeEstimasi = "Kilat"; + } elseif ($diffInHours <= 24) { + $tipeEstimasi = "Ekspres"; + } + } + + return [ + 'id' => $order->id, + 'order_number' => $order->order_number, + 'title' => (string) $order->customer_name, + 'subtitle' => $subtitle, + 'phone' => $order->phone ?? "-", + 'time' => $order->updated_at ? $order->updated_at->diffForHumans() : '-', + 'status' => (string) $order->status, + 'total' => $order->total_price, + 'delivery_type' => $order->delivery_type ?? 'none', + 'payment_status' => $isPaid ? 'PAID' : 'UNPAID', + 'payment_method' => $order->payment_method, + 'cash_received' => $order->cash_received, + 'estimation_time'=> $order->estimation_time ? $order->estimation_time->toDateTimeString() : '', + 'estimation_type'=> $tipeEstimasi, + ]; + }); + + return response()->json([ + 'success' => true, + 'data' => $activities + ], 200); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal mengambil aktivitas: ' . $e->getMessage() + ], 500); + } + } + + public function getOrdersByStatus($status) + { + try { + $orders = Order::with('items')->where('status', strtoupper($status)) + ->latest() + ->get() + ->map(function ($order) { + $rawService = $order->items->map(function ($item) { + return trim($item->service_name); + })->implode(', '); + + $berat = $order->total_weight ?? '0'; + $jasa = $rawService; + + // --- PERBAIKAN DI SINI --- + // Ambil data langsung dari kolom estimation_time di database + // Jika null, kirim string kosong agar ditangani Flutter sebagai "Belum diatur" + $estimationTime = $order->estimation_time ? $order->estimation_time->toDateTimeString() : ''; + + $tipeEstimasi = "Reguler"; + + // 1. Deteksi Tipe Estimasi berdasarkan selisih waktu + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) { + $tipeEstimasi = "Kilat"; + } elseif ($diffInHours <= 24) { + $tipeEstimasi = "Ekspres"; + } + } + + $isPaid = strtoupper($order->payment_method) !== 'BAYAR NANTI' || $order->cash_received > 0; + return [ + 'id' => $order->id, + 'order_number' => $order->order_number, + 'customer_name' => $order->customer_name, + 'phone' => $order->phone ?? "-", + 'status' => $order->status, + 'weight' => $berat, + 'service_name' => $jasa, + 'estimation_type' => $tipeEstimasi, + 'estimation_time' => $estimationTime, + 'total_price' => number_format($order->total_price ?? 0, 0, ',', '.'), + 'delivery_fee' => $order->delivery_fee ?? 0, + 'delivery_type' => $order->delivery_type ?? 'none', + 'payment_status' => $isPaid ? 'PAID' : 'UNPAID', + 'payment_method' => $order->payment_method, + 'cash_received' => $order->cash_received, + ]; + }); + + return response()->json(['success' => true, 'data' => $orders->values()->all()], 200); + } catch (\Exception $e) { + return response()->json(['success' => false, 'message' => $e->getMessage()], 500); + } + } +} diff --git a/laundry-app/app/Http/Controllers/Api/ServiceController.php b/laundry-app/app/Http/Controllers/Api/ServiceController.php new file mode 100644 index 0000000..b516ce7 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Api/ServiceController.php @@ -0,0 +1,32 @@ +get(); + + return response()->json([ + 'success' => true, + 'message' => 'Daftar Jasa Aktif Berhasil Dimuat', + 'data' => $services + ], 200); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal memuat data', + 'error' => $e->getMessage() + ], 500); + } + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/Api/ShopSettingsController.php b/laundry-app/app/Http/Controllers/Api/ShopSettingsController.php new file mode 100644 index 0000000..9650fb0 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Api/ShopSettingsController.php @@ -0,0 +1,96 @@ +getOwnerShop(); + + if (!$shop) { + return response()->json([ + 'status' => 'success', + 'data' => [ + 'shop_name' => null, + 'device_id' => null, + 'shop_latitude' => null, + 'shop_longitude' => null, + 'delivery_fee_per_km' => 0, + 'free_delivery_km' => 0, + 'is_delivery_active' => false, + 'is_estimation_active'=> false, + 'express_extra_price' => 0, + 'kilat_extra_price' => 0, + 'qris_image_url' => null, + ] + ], 200); + } + + return response()->json([ + 'status' => 'success', + 'data' => [ + 'shop_name' => $shop->shop_name, + 'device_id' => $shop->device_id, + 'shop_latitude' => $shop->latitude, + 'shop_longitude' => $shop->longitude, + 'delivery_fee_per_km' => $shop->delivery_fee_per_km, + 'free_delivery_km' => $shop->free_delivery_km ?? 0, + 'is_delivery_active' => $shop->is_delivery_active, + 'is_estimation_active'=> $shop->is_estimation_active ?? false, + 'express_extra_price' => $shop->express_extra_price ?? 0, + 'kilat_extra_price' => $shop->kilat_extra_price ?? 0, + 'qris_image_url' => $shop->qris_image ? asset('storage/' . $shop->qris_image) : null, + ] + ], 200); + } + + public function updateSettings(Request $request) + { + /** @var User $user */ + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + + $validated = $request->validate([ + 'shop_name' => 'nullable|string|max:100', + 'device_id' => 'nullable|string|max:50', + 'shop_latitude' => 'nullable|numeric', + 'shop_longitude' => 'nullable|numeric', + 'delivery_fee_per_km' => 'required|integer|min:0', + 'free_delivery_km' => 'required|integer|min:0', + 'is_delivery_active' => 'required|boolean', + 'is_estimation_active'=> 'required|boolean', + 'express_extra_price' => 'required|integer|min:0', + 'kilat_extra_price' => 'required|integer|min:0', + ]); + + Shop::updateOrCreate( + ['user_id' => $ownerId], + [ + 'shop_name' => $validated['shop_name'] ?? null, + 'device_id' => $validated['device_id'] ?? null, + 'latitude' => $validated['shop_latitude'] ?? null, + 'longitude' => $validated['shop_longitude'] ?? null, + 'delivery_fee_per_km' => $validated['delivery_fee_per_km'], + 'free_delivery_km' => $validated['free_delivery_km'], + 'is_delivery_active' => $validated['is_delivery_active'], + 'is_estimation_active'=> $validated['is_estimation_active'], + 'express_extra_price' => $validated['express_extra_price'], + 'kilat_extra_price' => $validated['kilat_extra_price'], + ] + ); + + return response()->json([ + 'status' => 'success', + 'message' => 'Pengaturan toko berhasil disimpan.', + ], 200); + } +} diff --git a/laundry-app/app/Http/Controllers/Api/TransactionController.php b/laundry-app/app/Http/Controllers/Api/TransactionController.php new file mode 100644 index 0000000..4661466 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Api/TransactionController.php @@ -0,0 +1,694 @@ +getOwnerId(); + + $orders = Order::with('items') + ->where('user_id', $ownerId) + ->orderBy('created_at', 'desc') + ->get() + ->map(function ($order) { + return [ + 'id' => $order->id, + 'order_number' => $order->order_number, + 'customer_name' => $order->customer_name, + 'phone' => $order->phone, + 'total_price' => $order->total_price, + 'status' => $order->status, + 'created_at' => $order->created_at, + ]; + }); + + return response()->json([ + 'status' => 'success', + 'data' => $orders + ], 200); + } + + // 1. Endpoint untuk Staf: Membuat Jadwal Jemput (Order Awal) + public function requestPickup(Request $request) + { + $validated = $request->validate([ + 'customer_name' => 'required|string', + 'phone' => 'required|string', + 'address' => 'nullable|string', + 'latitude' => 'nullable', + 'longitude' => 'nullable', + ]); + + /** @var User $user */ + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + + $today = Carbon::today(); + $prefix = 'ORD-' . $today->format('Ymd') . '-' . $ownerId . '-'; + $lastOrder = Order::withoutGlobalScopes() + ->where('user_id', $ownerId) + ->where('order_number', 'LIKE', $prefix . '%') + ->orderBy('order_number', 'desc') + ->first(); + + $nextNum = 1; + if ($lastOrder) { + $lastNum = (int) substr($lastOrder->order_number, -3); + $nextNum = $lastNum + 1; + } + $orderNumber = $prefix . str_pad($nextNum, 3, '0', STR_PAD_LEFT); + + $order = Order::create([ + 'order_number' => $orderNumber, + 'user_id' => $ownerId, + 'customer_name' => $validated['customer_name'], + 'phone' => $validated['phone'], + 'address' => $validated['address'], + 'latitude' => $validated['latitude'], + 'longitude' => $validated['longitude'], + 'status' => 'PICKUP', // Status awal + 'total_price' => 0, + 'total_weight' => 0, + ]); + + return response()->json([ + 'status' => 'success', + 'message' => 'Jadwal jemput berhasil dibuat', + 'data' => $order + ], 201); + } + + // 2. Endpoint untuk Driver: Mengambil daftar tugas (Jemput & Antar) + public function getDriverTasks() + { + /** @var User $user */ + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + + $tasks = Order::with('items')->where('user_id', $ownerId) + ->where(function($query) { + $query->whereIn('status', ['PICKUP', 'MENUNGGU JEMPUT', 'DI DRIVER', 'DELIVERY']) + ->orWhere(function($q) { + // Untuk kompatibilitas mundur jika ada pesanan lama + $q->where('status', 'SELESAI') + ->whereIn('delivery_type', ['delivery', 'both']); + }); + }) + ->orderBy('created_at', 'asc') + ->get() + ->map(function($order) { + $tipeEstimasi = "Reguler"; + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) $tipeEstimasi = "Kilat"; + elseif ($diffInHours <= 24) $tipeEstimasi = "Ekspres"; + } else { + $tipeEstimasi = "-"; + } + + $serviceNameStr = $order->items->map(function($item) { + $qtyStr = $item->unit === 'PCS' ? round($item->qty_or_weight) . ' PCS' : number_format($item->qty_or_weight, 3, '.', '') . ' KG'; + return "{$item->service_name} ({$qtyStr})||" . $item->subtotal; + })->implode("\n"); + + return [ + 'id' => $order->id, + 'order_number' => $order->order_number, + 'type_id' => (in_array($order->status, ['PICKUP', 'MENUNGGU JEMPUT']) ? 'P' : 'O') . $order->id, + 'task_type' => (in_array($order->status, ['PICKUP', 'MENUNGGU JEMPUT']) ? 'jemput' : 'antar'), + 'customer_name' => $order->customer_name, + 'phone' => $order->phone, + 'address' => $order->address, + 'latitude' => $order->latitude, + 'longitude' => $order->longitude, + 'status' => $order->status, + 'service_name' => $serviceNameStr, + 'weight' => $order->total_weight, + 'delivery_type' => $order->delivery_type, + 'delivery_fee' => $order->delivery_fee, + 'total_price' => $order->total_price, + 'payment_method'=> $order->payment_method, + 'cash_received' => $order->cash_received, + 'estimation_type'=> $tipeEstimasi, + ]; + }); + + return response()->json([ + 'status' => 'success', + 'data' => $tasks + ], 200); + } + + public function store(Request $request) + { + if (!$request->expectsJson()) { + return response()->json(['message' => 'Harus menggunakan header Accept application/json'], 406); + } + + $validated = $request->validate([ + 'customer_name' => 'required|string', + 'phone' => 'required|string', + 'items' => 'required|array', + 'items.*.service_id' => 'nullable', + 'items.*.service_name' => 'required|string', + 'items.*.price' => 'required|numeric', + 'items.*.qty_or_weight' => 'required|numeric', + 'items.*.unit' => 'required|string', + 'items.*.subtotal' => 'required|numeric', + 'total_price' => 'required', + 'total_weight' => 'required', + 'payment_method' => 'nullable|string', + 'cash_received' => 'nullable', + 'address' => 'nullable|string', + 'latitude' => 'nullable', + 'longitude' => 'nullable', + 'delivery_type' => 'nullable|string', + ]); + + /** @var User $user */ + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + $shop = $user->getOwnerShop(); + + if (!$shop) { + // Jika shop belum ada, buat default (agar tidak error) + $shop = Shop::create(['user_id' => $ownerId]); + } + + $deliveryFee = 0; + $deliveryDistance = 0; + $deliveryType = $request->delivery_type ?? 'none'; + + $shop_lat = $shop->latitude; + $shop_lng = $shop->longitude; + + if ($deliveryType !== 'none' && $shop->is_delivery_active && + $request->latitude && $request->longitude) { + + try { + $url = "http://router.project-osrm.org/route/v1/driving/{$shop_lng},{$shop_lat};{$request->longitude},{$request->latitude}?overview=false"; + $osrmResponse = Http::timeout(5)->get($url); + + if ($osrmResponse->successful()) { + $osrmData = $osrmResponse->json(); + if (isset($osrmData['routes'][0]['distance'])) { + $deliveryDistance = round($osrmData['routes'][0]['distance'] / 1000, 2); + + // Logika Gratis KM dinamis dari shop setting + $freeDeliveryKm = $shop->free_delivery_km ?? 0; + if ($deliveryDistance <= $freeDeliveryKm) { + $deliveryFee = 0; + } else { + $chargeableDistance = $deliveryDistance - $freeDeliveryKm; + $baseFee = $chargeableDistance * $shop->delivery_fee_per_km; + $multiplier = ($deliveryType === 'both') ? 2 : 1; + $rawFee = $baseFee * $multiplier; + $deliveryFee = (int) (ceil($rawFee / 500) * 500); + } + } + } + } catch (\Exception $e) { + Log::error("OSRM Error: " . $e->getMessage()); + } + } + + $today = Carbon::today(); + $isUpdate = ($request->has('order_id') && !empty($request->order_id)); + $orderNumber = ""; + + // Fungsi untuk generate nomor urut berikutnya yang aman per owner + $getNextOrderNumber = function() use ($today, $ownerId) { + $prefix = 'ORD-' . $today->format('Ymd') . '-' . $ownerId . '-'; + $lastOrder = Order::withoutGlobalScopes() + ->where('user_id', $ownerId) + ->where('order_number', 'LIKE', $prefix . '%') + ->orderBy('order_number', 'desc') + ->first(); + + $nextNum = 1; + if ($lastOrder) { + $lastNum = (int) substr($lastOrder->order_number, -3); + $nextNum = $lastNum + 1; + } + return $prefix . str_pad($nextNum, 3, '0', STR_PAD_LEFT); + }; + + if (!$isUpdate) { + $orderNumber = $getNextOrderNumber(); + } + + $estType = strtolower($request->estimation_type ?? ''); + if (str_contains($estType, 'none')) { + $estimationTime = Carbon::now()->addDays(3); + } elseif (str_contains($estType, 'kilat')) { + $estimationTime = Carbon::now()->addHours(6); + } elseif (str_contains($estType, 'ekspres') || str_contains($estType, 'express')) { + $estimationTime = Carbon::now()->addDays(1); + } else { + $estimationTime = Carbon::now()->addDays(3); + } + + $cashReceived = intval($request->cash_received ?? 0); + $totalPrice = intval($validated['total_price']) + $deliveryFee; + $totalPrice = (int) (ceil($totalPrice / 500) * 500); // Bulatkan ke atas kelipatan 500 + $cashChange = $cashReceived - $totalPrice; + + try { + if ($isUpdate) { + $order = Order::find($request->order_id); + if ($order) { + $updateData = [ + 'total_price' => $totalPrice, + 'total_weight' => $validated['total_weight'], + 'status' => 'ANTRIAN', + 'estimation_time' => $estimationTime, + 'payment_method' => strtoupper($request->payment_method ?? 'CASH'), + 'cash_received' => $cashReceived, + 'cash_change' => $cashChange < 0 ? 0 : $cashChange, + 'delivery_type' => $deliveryType, + 'delivery_fee' => $deliveryFee, + 'delivery_distance' => $deliveryDistance, + ]; + + // Jika sebelumnya masih format PCK, ubah ke ORD + if (str_starts_with($order->order_number, 'PCK')) { + $updateData['order_number'] = $getNextOrderNumber(); + } + + $order->update($updateData); + + // Recreate items + $order->items()->delete(); + foreach ($validated['items'] as $item) { + $order->items()->create([ + 'service_id' => $item['service_id'] ?? null, + 'service_name' => $item['service_name'], + 'price' => $item['price'], + 'qty_or_weight' => $item['qty_or_weight'], + 'unit' => $item['unit'], + 'subtotal' => $item['subtotal'], + 'estimation_name' => $item['estimation_name'] ?? null, + ]); + } + } else { + return response()->json(['message' => 'Pesanan tidak ditemukan.'], 404); + } + } else { + $order = Order::create([ + 'order_number' => $orderNumber, + 'user_id' => $ownerId, + 'customer_name' => $validated['customer_name'], + 'phone' => $validated['phone'], + 'total_price' => $totalPrice, + 'total_weight' => $validated['total_weight'], + 'status' => 'ANTRIAN', + 'estimation_time' => $estimationTime, + 'payment_method' => strtoupper($request->payment_method ?? 'CASH'), + 'cash_received' => $cashReceived, + 'cash_change' => $cashChange < 0 ? 0 : $cashChange, + 'address' => $request->address, + 'latitude' => $request->latitude, + 'longitude' => $request->longitude, + 'delivery_type' => $deliveryType, + 'delivery_fee' => $deliveryFee, + 'delivery_distance' => $deliveryDistance, + ]); + + foreach ($validated['items'] as $item) { + $order->items()->create([ + 'service_id' => $item['service_id'] ?? null, + 'service_name' => $item['service_name'], + 'price' => $item['price'], + 'qty_or_weight' => $item['qty_or_weight'], + 'unit' => $item['unit'], + 'subtotal' => $item['subtotal'], + 'estimation_name' => $item['estimation_name'] ?? null, + ]); + } + } + } catch (\Exception $e) { + Log::error("Save Order Error: " . $e->getMessage()); + return response()->json(['message' => 'Gagal menyimpan ke database: ' . $e->getMessage()], 500); + } + + try { + $shopName = $shop->shop_name ?? 'My Laundry'; + $estimasiStr = $order->estimation_time ? $order->estimation_time->format('d/m/Y H:i') : ''; + + $tipeEstimasiLabel = "Reguler"; + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) $tipeEstimasiLabel = "Kilat"; + elseif ($diffInHours <= 24) $tipeEstimasiLabel = "Ekspres"; + } + + $metodeBayar = $order->payment_method; + $hargaStr = number_format($order->total_price, 0, ',', '.'); + $ongkirStr = number_format($order->delivery_fee, 0, ',', '.'); + $uangMasukStr = number_format($order->cash_received, 0, ',', '.'); + $kembalianStr = number_format($order->cash_change, 0, ',', '.'); + + // Format berat menjadi 1 angka di belakang koma (misal 3.12 -> 3.1) + $weightFormatted = number_format((float)$order->total_weight, 1, '.', ''); + + // Format Layanan secara dinamis (Selalu Baris Baru & Rata Kiri) + $serviceInfo = "👕 *Layanan:*\n"; + + $i = 1; + foreach ($order->items as $item) { + $qtyStr = $item->unit === 'PCS' ? round($item->qty_or_weight) . ' PCS' : number_format($item->qty_or_weight, 3, '.', '') . ' KG'; + $priceStr = number_format($item->price, 0, ',', '.'); + $serviceInfo .= $i . ". {$item->service_name} ({$qtyStr}) - Rp $priceStr\n"; + $i++; + } + + $pesanBaru = "*NOTA $shopName*\n" + . "--------------------------------------\n" + . "Halo, ini konfirmasi atas pesanan bernama *{$order->customer_name}*.\n" + . "Pesanan laundry Anda telah kami terima! 🙏\n\n" + . "🧾 *No Order:* {$order->order_number}\n" + . $serviceInfo; + + if ($order->estimation_time) { + if (strtolower($request->estimation_type ?? '') === 'none') { + $pesanBaru .= "⏱️ *Estimasi Selesai:* $estimasiStr\n"; + } else { + $pesanBaru .= "⏱️ *Estimasi Selesai:* $tipeEstimasiLabel ($estimasiStr)\n"; + } + } + $pesanBaru .= "--------------------------------------\n"; + + // DETAIL PENGIRIMAN (Jika menggunakan jasa Driver) + if ($order->delivery_type !== 'none') { + $typeLabel = $this->getDeliveryTypeLabel($order->delivery_type); + + $pesanBaru .= "*DETAIL PENGIRIMAN*\n" + . "🛵 *Layanan:* $typeLabel\n"; + + if ($shop && $shop->is_delivery_active) { + $pesanBaru .= "📍 *Jarak:* {$order->delivery_distance} Km\n"; + } + + if ($order->delivery_fee > 0) { + $pesanBaru .= "🚚 *Ongkos Kirim:* Rp $ongkirStr\n"; + } else { + $pesanBaru .= "🚚 *Ongkos Kirim:* Gratis\n"; + } + $pesanBaru .= "--------------------------------------\n"; + } + + $pesanBaru .= "*RINCIAN PEMBAYARAN*\n" + . "💳 *Metode:* $metodeBayar\n" + . "💰 *Total Tagihan:* *Rp $hargaStr*\n"; + + // Hanya paparkan Uang Masuk & Kembalian jika pelanggan membayar secara Tunai (CASH) + if ($metodeBayar === 'CASH') { + $pesanBaru .= "💵 *Uang Tunai:* Rp $uangMasukStr\n" + . "🔄 *Kembalian:* Rp $kembalianStr\n"; + } + + $pesanBaru .= "--------------------------------------\n"; + if ($metodeBayar === 'BAYAR NANTI') { + $pesanBaru .= "Status Pembayaran: *BELUM LUNAS*\n"; + if (in_array(strtolower($order->delivery_type), ['delivery', 'both'])) { + $pesanBaru .= "Silakan melakukan pelunasan kepada Driver kami saat pesanan diantarkan.\n"; + } else { + $pesanBaru .= "Silakan melakukan pelunasan saat cucian diambil.\n"; + } + } else { + $pesanBaru .= "Status Pembayaran: *LUNAS*\n"; + } + + $pesanBaru .= "--------------------------------------\n" + . "Status saat ini: *DALAM ANTRIAN*\n" + . "Kami akan menginfokan kembali jika pesanan sudah diproses. Terima kasih!"; + + $this->sendWhatsAppMessage($order->phone, $pesanBaru); + } catch (\Exception $e) {} + + return response()->json([ + 'status' => 'success', + 'message' => 'Pesanan berhasil masuk', + 'data' => $order + ], 201); + } + + public function updateStatus(Request $request, $id) + { + $order = Order::find($id); + if (!$order) return response()->json(['message' => 'Data tidak ditemukan'], 404); + + $currentStatus = strtoupper($order->status); + $nextStatus = $currentStatus; + + if ($currentStatus === 'PICKUP' || $currentStatus === 'MENUNGGU JEMPUT') $nextStatus = 'TIBA DI TOKO'; + elseif ($currentStatus === 'TIBA DI TOKO') $nextStatus = 'ANTRIAN'; + elseif ($currentStatus === 'ANTRIAN') $nextStatus = 'PROSES'; + elseif ($currentStatus === 'PROSES') $nextStatus = 'SELESAI'; + elseif ($currentStatus === 'SELESAI') { + if (in_array(strtolower($order->delivery_type), ['delivery', 'both'])) { + $nextStatus = 'DELIVERY'; + } else { + $nextStatus = 'DIAMBIL'; + } + } + elseif ($currentStatus === 'DELIVERY' || $currentStatus === 'DI DRIVER') $nextStatus = 'DITERIMA'; + + $order->status = $nextStatus; + + // Cek jika ada data pembayaran tambahan (saat pelunasan) + if ($request->has('payment_method')) { + $order->payment_method = $request->payment_method; + $order->cash_received = $request->cash_received; + $order->cash_change = ($request->cash_received - $order->total_price); + } + + $order->save(); + + // --- KIRIM WA OTOMATIS SAAT STATUS BERUBAH --- + try { + /** @var User $shopUser */ + $shopUser = Auth::user(); + $shop = $shopUser->getOwnerShop(); + $shopName = $shop->shop_name ?? 'My Laundry'; + $namaPelanggan = $order->customer_name; + $pesanUpdate = "*UPDATE $shopName*\n\nHalo, ini update atas pesanan bernama *{$namaPelanggan}*.\n"; + + if ($nextStatus === 'PROSES') { + $pesanUpdate .= "Pesanan (No: *{$order->order_number}*) saat ini sedang *DIPROSES/DICUCI* 🫧\nKami akan infokan kembali jika sudah selesai."; + } elseif ($nextStatus === 'SELESAI') { + $pesanUpdate .= "Pesanan (No: *{$order->order_number}*) sudah *SELESAI* dikerjakan! 🎉\n\n"; + + $isDelivery = in_array(strtolower($order->delivery_type), ['delivery', 'both']); + + // Jika belum dibayar lunas + if (strtoupper($order->payment_method) === 'BAYAR NANTI' && $order->cash_received == 0) { + $hargaStr = number_format($order->total_price, 0, ',', '.'); + if ($isDelivery) { + $pesanUpdate .= "Tagihan sebesar *Rp $hargaStr* dapat dilunasi kepada Driver kami saat pesanan tiba nanti.\n\n"; + } else { + $pesanUpdate .= "Tagihan sebesar *Rp $hargaStr* dapat dilunasi saat pengambilan ya.\n\n"; + } + } + + if ($isDelivery) { + $pesanUpdate .= "Kami akan segera tugaskan driver untuk mengantar pesanan Anda. Mohon ditunggu ya!"; + } else { + $pesanUpdate .= "Silakan ambil cucian Anda di toko kami. Ditunggu kedatangannya!"; + } + } elseif ($nextStatus === 'DI DRIVER' || $nextStatus === 'DELIVERY') { + $pesanUpdate .= "Kami sudah menugaskan driver untuk mengantarkan Pesanan (No: *{$order->order_number}*) ke lokasi Anda! 🛵💨\n\n"; + if (strtoupper($order->payment_method) === 'BAYAR NANTI' && $order->cash_received == 0) { + $hargaStr = number_format($order->total_price, 0, ',', '.'); + $pesanUpdate .= "Jangan lupa siapkan pembayaran sebesar *Rp $hargaStr* untuk diberikan kepada Driver kami ya.\n\n"; + } + $pesanUpdate .= "Mohon ditunggu. Terima kasih! 🙏"; + } elseif ($nextStatus === 'TIBA DI TOKO') { + $pesanUpdate = "Halo *$namaPelanggan*,\n\n" + . "Pesanan Anda (No: *{$order->order_number}*) sudah sampai di toko kami dan akan segera kami input. ✅\n\n" + . "Terima kasih! 🙏"; + } elseif ($nextStatus === 'DIAMBIL' || $nextStatus === 'DITERIMA') { + if ($nextStatus === 'DITERIMA') { + $pesanUpdate .= "Pesanan (No: *{$order->order_number}*) telah *DITERIMA* oleh Anda.\n"; + } else { + $pesanUpdate .= "Pesanan (No: *{$order->order_number}*) telah *DIAMBIL*. ✅\n"; + } + $pesanUpdate .= "Terima kasih telah mempercayakan cucian Anda di $shopName! 🙏"; + } + + if ($nextStatus !== $currentStatus) { + $this->sendWhatsAppMessage($order->phone, $pesanUpdate); + } + } catch (\Exception $e) { + Log::error("WhatsApp Update Error: " . $e->getMessage()); + } + // --------------------------------------------- + + return response()->json(['status' => 'success', 'message' => 'Status diperbarui']); + } + + public function getOrdersByStatus($status) + { + /** @var User $user */ + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + + $orders = Order::with('items')->where('user_id', $ownerId) + ->where('status', strtoupper($status)) + ->get() + ->map(function ($order) { + $tipeEstimasi = "Reguler"; + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) $tipeEstimasi = "Kilat"; + elseif ($diffInHours <= 24) $tipeEstimasi = "Ekspres"; + } else { + $tipeEstimasi = "-"; + } + + $order->estimation_type = $tipeEstimasi; + $order->weight = $order->total_weight; + $order->service_name = $order->items->map(function($item) { + $qtyStr = $item->unit === 'PCS' ? round($item->qty_or_weight) . ' PCS' : number_format($item->qty_or_weight, 3, '.', '') . ' KG'; + return "{$item->service_name} ({$qtyStr}) - Rp " . number_format($item->price, 0, ',', '.'); + })->implode("\n"); + + return $order; + }); + + return response()->json(['status' => 'success', 'data' => $orders], 200); + } + + public function checkDeliveryFee(Request $request) + { + /** @var User $user */ + $user = Auth::user(); + $shop = $user->getOwnerShop(); + + if (!$shop || !$shop->is_delivery_active) { + return response()->json(['delivery_fee' => 0, 'distance' => 0]); + } + + $lat = $request->latitude; + $lng = $request->longitude; + $deliveryType = $request->delivery_type; // 'pickup', 'delivery', 'both' + + $shop_lat = $shop->latitude; + $shop_lng = $shop->longitude; + + if (!$lat || !$lng) { + return response()->json(['delivery_fee' => 0, 'distance' => 0]); + } + + try { + $url = "http://router.project-osrm.org/route/v1/driving/{$shop_lng},{$shop_lat};{$lng},{$lat}?overview=false"; + $response = Http::timeout(5)->get($url); + + if ($response->successful()) { + $data = $response->json(); + if (isset($data['routes'][0]['distance'])) { + $distance = round($data['routes'][0]['distance'] / 1000, 2); + + // Logika Gratis KM dinamis dari shop setting + $freeDeliveryKm = $shop->free_delivery_km ?? 0; + if ($distance <= $freeDeliveryKm) { + $finalFee = 0; + } else { + $chargeableDistance = $distance - $freeDeliveryKm; + $baseFee = $chargeableDistance * $shop->delivery_fee_per_km; + + $multiplier = ($deliveryType === 'both') ? 2 : 1; + $rawFee = $baseFee * $multiplier; + + // Pembulatan kelipatan 500 ke atas + $finalFee = (int) (ceil($rawFee / 500) * 500); + } + + return response()->json([ + 'delivery_fee' => $finalFee, + 'distance' => $distance + ]); + } + } + } catch (\Exception $e) { + return response()->json(['delivery_fee' => 0, 'distance' => 0, 'error' => $e->getMessage()], 500); + } + + return response()->json(['delivery_fee' => 0, 'distance' => 0]); + } + + public function sendManualWhatsApp(Request $request) + { + $request->validate([ + 'phone' => 'required', + 'task_type' => 'required', + 'customer_name' => 'required' + ]); + + $customerName = $request->customer_name; + /** @var User $shopUser */ + $shopUser = Auth::user(); + $shop = $shopUser->getOwnerShop(); + $shopName = $shop->shop_name ?? 'My Laundry'; + $message = ""; + + if ($request->task_type == 'jemput') { + $message = "Halo *$customerName* \nDriver dari *$shopName* saat ini sedang dalam perjalanan menuju lokasi Anda untuk *MENJEMPUT* cucian. 🛵💨\n\nMohon dibantu untuk menyiapkan cuciannya ya. Terima kasih! 🙏"; + } else { + $message = "Halo *$customerName* \nDriver dari *$shopName* saat ini sedang dalam perjalanan menuju lokasi Anda untuk *MENGANTARKAN* pesanan cucian yang sudah selesai. 🛵💨\n\nMohon ditunggu kedatangannya di lokasi ya. Terima kasih! 🙏"; + } + + $success = $this->sendWhatsAppMessage($request->phone, $message); + + return response()->json(['status' => $success ? 'success' : 'error']); + } + + /** + * Helper: Konversi delivery_type ke label Indonesia + */ + private function getDeliveryTypeLabel(string $type): string + { + return match($type) { + 'pickup' => 'Pick-up', + 'delivery' => 'Delivery', + 'both' => 'Pick-up & Delivery', + default => 'Takeaway', + }; + } + + private function sendWhatsAppMessage($phoneTarget, $messageText) + { + if (empty($phoneTarget)) return false; + + $token = "2HP5kgnwLfpvShg6eBgw"; // GANTI DENGAN TOKEN FONNTE ANDA + + if (empty($token)) return false; + + try { + $response = Http::withHeaders(['Authorization' => $token])->post('https://api.fonnte.com/send', [ + 'target' => $phoneTarget, + 'message' => $messageText, + 'countryCode' => '62', + ]); + return $response->successful(); + } catch (\Exception $e) { + return false; + } + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/laundry-app/app/Http/Controllers/Auth/AuthenticatedSessionController.php new file mode 100644 index 0000000..613bcd9 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -0,0 +1,47 @@ +authenticate(); + + $request->session()->regenerate(); + + return redirect()->intended(route('dashboard', absolute: false)); + } + + /** + * Destroy an authenticated session. + */ + public function destroy(Request $request): RedirectResponse + { + Auth::guard('web')->logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/laundry-app/app/Http/Controllers/Auth/ConfirmablePasswordController.php new file mode 100644 index 0000000..712394a --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -0,0 +1,40 @@ +validate([ + 'email' => $request->user()->email, + 'password' => $request->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + $request->session()->put('auth.password_confirmed_at', time()); + + return redirect()->intended(route('dashboard', absolute: false)); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/laundry-app/app/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 0000000..f64fa9b --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -0,0 +1,24 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false)); + } + + $request->user()->sendEmailVerificationNotification(); + + return back()->with('status', 'verification-link-sent'); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/laundry-app/app/Http/Controllers/Auth/EmailVerificationPromptController.php new file mode 100644 index 0000000..ee3cb6f --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -0,0 +1,21 @@ +user()->hasVerifiedEmail() + ? redirect()->intended(route('dashboard', absolute: false)) + : view('auth.verify-email'); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/NewPasswordController.php b/laundry-app/app/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 0000000..e8368bd --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,62 @@ + $request]); + } + + /** + * Handle an incoming new password request. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function store(Request $request): RedirectResponse + { + $request->validate([ + 'token' => ['required'], + 'email' => ['required', 'email'], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $status = Password::reset( + $request->only('email', 'password', 'password_confirmation', 'token'), + function (User $user) use ($request) { + $user->forceFill([ + 'password' => Hash::make($request->password), + 'remember_token' => Str::random(60), + ])->save(); + + event(new PasswordReset($user)); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $status == Password::PASSWORD_RESET + ? redirect()->route('login')->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/PasswordController.php b/laundry-app/app/Http/Controllers/Auth/PasswordController.php new file mode 100644 index 0000000..6916409 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/PasswordController.php @@ -0,0 +1,29 @@ +validateWithBag('updatePassword', [ + 'current_password' => ['required', 'current_password'], + 'password' => ['required', Password::defaults(), 'confirmed'], + ]); + + $request->user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + return back()->with('status', 'password-updated'); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/PasswordResetLinkController.php b/laundry-app/app/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 0000000..bf1ebfa --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/PasswordResetLinkController.php @@ -0,0 +1,44 @@ +validate([ + 'email' => ['required', 'email'], + ]); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $status = Password::sendResetLink( + $request->only('email') + ); + + return $status == Password::RESET_LINK_SENT + ? back()->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/RegisteredUserController.php b/laundry-app/app/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 0000000..d54dcd8 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/RegisteredUserController.php @@ -0,0 +1,51 @@ +validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:' . User::class], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'role' => 'owner', // PAKSA JADI OWNER DI SINI + ]); + + event(new Registered($user)); + + Auth::login($user); + + return redirect(route('dashboard', absolute: false)); + } +} diff --git a/laundry-app/app/Http/Controllers/Auth/VerifyEmailController.php b/laundry-app/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 0000000..784765e --- /dev/null +++ b/laundry-app/app/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,27 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + event(new Verified($request->user())); + } + + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } +} diff --git a/laundry-app/app/Http/Controllers/Controller.php b/laundry-app/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/laundry-app/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ += 0; $i--) { + $date = now()->subDays($i); + $days[] = $date->translatedFormat('D d M'); // Contoh: Sen 12 Mei + + // Hitung jumlah order pada tanggal tersebut + $chartData[] = \App\Models\Order::whereDate('created_at', $date->toDateString())->count(); + } + + // Mencari nilai tertinggi untuk skala grafik (minimal 10 agar tidak mentok ke atas) + $maxVal = max($chartData) > 0 ? max($chartData) : 10; + + // Konversi nilai data ke koordinat SVG (Tinggi SVG kita 200) + // Rumus: 200 - (nilai / maxVal * 150) -> 150 agar ada sisa ruang di atas + $points = ""; + foreach ($chartData as $index => $value) { + $x = $index * 166.6; + $y = 200 - ($value / $maxVal * 150); + $points .= "$x,$y "; + } + + return view('dashboard', [ + 'total' => \App\Models\Order::whereNotIn('status', ['DIAMBIL', 'DITERIMA'])->count(), + 'antrian' => \App\Models\Order::where('status', 'ANTRIAN')->count(), + 'proses' => \App\Models\Order::where('status', 'PROSES')->count(), + 'selesai' => \App\Models\Order::where('status', 'SELESAI')->count(), + 'latest' => \App\Models\Order::latest()->take(5)->get(), + 'chartPoints' => trim($points), + 'days' => $days, + 'chartData' => $chartData + ]); + } +} diff --git a/laundry-app/app/Http/Controllers/LaundryController.php b/laundry-app/app/Http/Controllers/LaundryController.php new file mode 100644 index 0000000..210ac3b --- /dev/null +++ b/laundry-app/app/Http/Controllers/LaundryController.php @@ -0,0 +1,101 @@ +validate([ + 'name' => 'required|string|max:255', + 'price' => 'required|numeric', + 'unit' => 'required|string', + ]); + + Service::create([ + 'name' => $request->name, + 'price' => $request->price, + 'unit' => $request->unit, + 'is_active' => true, + ]); + + return redirect()->route('laundry')->with('success', 'Layanan berhasil ditambahkan!'); + } + + /** + * --- FUNGSI EDIT (YANG TADI HILANG) --- + * Menampilkan halaman form edit layanan + */ + public function edit($id) + { + $service = Service::findOrFail($id); + return view('laundry.edit', compact('service')); + } + + /** + * --- FUNGSI UPDATE (UNTUK MENYIMPAN PERUBAHAN) --- + */ + public function update(Request $request, $id) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'price' => 'required|numeric', + 'unit' => 'required|string', + ]); + + $service = Service::findOrFail($id); + $service->update([ + 'name' => $request->name, + 'price' => $request->price, + 'unit' => $request->unit, + ]); + + return redirect()->route('laundry')->with('success', 'Layanan berhasil diperbarui!'); + } + + /** + * Mengubah status aktif/non-aktif (Toggle) + */ + public function updateStatus($id) + { + $service = Service::findOrFail($id); + $service->is_active = !$service->is_active; + $service->save(); + + return back()->with('success', 'Status layanan berhasil diperbarui!'); + } + + /** + * Menghapus layanan + */ + public function destroy($id) + { + $service = Service::findOrFail($id); + $service->delete(); + + return back()->with('success', 'Layanan berhasil dihapus!'); + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/OrderListController.php b/laundry-app/app/Http/Controllers/OrderListController.php new file mode 100644 index 0000000..3b3cf34 --- /dev/null +++ b/laundry-app/app/Http/Controllers/OrderListController.php @@ -0,0 +1,57 @@ +where('status', $statusUpper); + + // 3. Logika Pencarian (Jika ada input 'search') + if ($request->has('search') && $request->search != '') { + $searchTerm = $request->search; + $query->where(function($q) use ($searchTerm) { + $q->where('customer_name', 'like', '%' . $searchTerm . '%') + ->orWhere('order_number', 'like', '%' . $searchTerm . '%'); + }); + } + + // 4. Ambil data dengan Pagination & urutan terbaru + // appends() digunakan agar saat pindah halaman, hasil search tidak hilang + $orders = $query->latest() + ->paginate(10) + ->appends(['search' => $request->search]); + + // 5. Kirim ke view + return view('orders.status_list', compact('orders', 'statusUpper')); + } + + public function bulkDelete(Request $request) + { + $ids = is_array($request->selected_ids) ? array_unique($request->selected_ids) : []; + + if (empty($ids)) { + return redirect()->back()->with('error', 'Pilih minimal satu pesanan untuk dihapus.'); + } + + try { + Order::whereIn('id', $ids)->delete(); + return redirect()->back()->with('success', count($ids) . ' pesanan berhasil dihapus.'); + } catch (\Exception $e) { + return redirect()->back()->with('error', 'Terjadi kesalahan saat menghapus data.'); + } + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/ProfileController.php b/laundry-app/app/Http/Controllers/ProfileController.php new file mode 100644 index 0000000..a48eb8d --- /dev/null +++ b/laundry-app/app/Http/Controllers/ProfileController.php @@ -0,0 +1,60 @@ + $request->user(), + ]); + } + + /** + * Update the user's profile information. + */ + public function update(ProfileUpdateRequest $request): RedirectResponse + { + $request->user()->fill($request->validated()); + + if ($request->user()->isDirty('email')) { + $request->user()->email_verified_at = null; + } + + $request->user()->save(); + + return Redirect::route('profile.edit')->with('status', 'profile-updated'); + } + + /** + * Delete the user's account. + */ + public function destroy(Request $request): RedirectResponse + { + $request->validateWithBag('userDeletion', [ + 'password' => ['required', 'current_password'], + ]); + + $user = $request->user(); + + Auth::logout(); + + $user->delete(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return Redirect::to('/'); + } +} diff --git a/laundry-app/app/Http/Controllers/ReportController.php b/laundry-app/app/Http/Controllers/ReportController.php new file mode 100644 index 0000000..f6b9fd5 --- /dev/null +++ b/laundry-app/app/Http/Controllers/ReportController.php @@ -0,0 +1,140 @@ +get('start_date', Carbon::now()->startOfMonth()->format('Y-m-d')); + $endDate = $request->get('end_date', Carbon::now()->format('Y-m-d')); + $deliveryType = $request->get('delivery_type', 'all'); + $paymentMethod = $request->get('payment_method', 'all'); + + // Filter data yang statusnya selesai ('DIAMBIL' atau 'DITERIMA') + $query = Order::with('items') + ->whereIn('status', ['DIAMBIL', 'DITERIMA']) + ->whereBetween('updated_at', [$startDate . ' 00:00:00', $endDate . ' 23:59:59']); + + if ($deliveryType !== 'all') { + if ($deliveryType === 'none') { + $query->where(function($q) { + $q->where('delivery_type', 'none')->orWhereNull('delivery_type'); + }); + } else { + $query->where('delivery_type', $deliveryType); + } + } + + if ($paymentMethod !== 'all') { + $query->where('payment_method', $paymentMethod); + } + + $reports = $query->orderBy('updated_at', 'desc')->get(); + $totalRevenue = $query->sum('total_price'); + $totalDeliveryFee = $query->sum('delivery_fee'); + $totalLaundryRevenue = $totalRevenue - $totalDeliveryFee; + $totalOrders = $query->count(); + + return view('reports', compact('reports', 'totalRevenue', 'totalDeliveryFee', 'totalLaundryRevenue', 'totalOrders', 'startDate', 'endDate', 'deliveryType', 'paymentMethod')); + } + + public function store(Request $request) + { + $validated = $request->validate([ + 'customer_name' => 'required', + 'phone' => 'required', + 'service_name' => 'required', + 'total_price' => 'required|integer', + 'payment_method' => 'nullable|string', // Pastikan App mengirim ini + 'cash_received' => 'nullable|integer', // Pastikan App mengirim ini + ]); + + // Hitung kembalian + $total = $validated['total_price']; + $bayar = $request->cash_received ?? 0; + $kembali = ($bayar > $total) ? ($bayar - $total) : 0; + + $ownerId = auth()->check() ? (auth()->user()->getOwnerId() ?? auth()->id()) : null; + $orderCount = $ownerId ? Order::where('user_id', $ownerId)->count() : Order::count(); + $prefix = $ownerId ? 'ORD-' . date('Ymd') . '-' . $ownerId . '-' : 'ORD-' . date('Ymd') . '-'; + + $order = Order::create([ + 'order_number' => $prefix . str_pad($orderCount + 1, 3, '0', STR_PAD_LEFT), + 'user_id' => $ownerId, + 'customer_name' => $validated['customer_name'], + 'phone' => $validated['phone'], + 'service_name' => $validated['service_name'], + 'total_price' => $total, + 'status' => 'ANTRIAN', + 'payment_method' => strtoupper($request->payment_method ?? 'CASH'), + 'cash_received' => $bayar, + 'cash_change' => $kembali, + ]); + + + return response()->json(['status' => 'success', 'data' => $order]); + } + + public function export(Request $request) + { + $startDate = $request->get('start_date', now()->startOfMonth()->format('Y-m-d')); + $endDate = $request->get('end_date', now()->format('Y-m-d')); + $deliveryType = $request->get('delivery_type', 'all'); + $paymentMethod = $request->get('payment_method', 'all'); + + $paymentLabel = $paymentMethod !== 'all' ? '-' . strtoupper($paymentMethod) : ''; + if ($paymentLabel === '-CASH') $paymentLabel = '-TUNAI'; + + return Excel::download(new ReportExport($startDate, $endDate, $deliveryType, $paymentMethod), "laporan-laundry{$paymentLabel}-{$startDate}-to-{$endDate}.xlsx"); + } + + public function exportBulk(Request $request) + { + $request->validate([ + 'ids' => 'required|array', + 'ids.*' => 'exists:orders,id' + ]); + + $startDate = $request->get('start_date', now()->startOfMonth()->format('Y-m-d')); + $endDate = $request->get('end_date', now()->format('Y-m-d')); + $deliveryType = $request->get('delivery_type', 'all'); + $paymentMethod = $request->get('payment_method', 'all'); + + $paymentLabel = $paymentMethod !== 'all' ? '-' . strtoupper($paymentMethod) : ''; + if ($paymentLabel === '-CASH') $paymentLabel = '-TUNAI'; + + return Excel::download(new ReportExport($startDate, $endDate, $deliveryType, $paymentMethod, $request->ids), "laporan-laundry-terpilih{$paymentLabel}.xlsx"); + } + + // --- FUNGSI BARU UNTUK HAPUS BANYAK DATA SEKALIGUS --- + public function bulkDelete(Request $request) + { + // 1. Validasi apakah ada array 'ids' yang dikirim dari checkbox + $request->validate([ + 'ids' => 'required|array', + 'ids.*' => 'exists:orders,id' + ]); + + try { + // Ambil ID unik karena tampilan mobile & desktop mengirimkan ID ganda + $uniqueIds = is_array($request->ids) ? array_unique($request->ids) : []; + + // 2. Eksekusi penghapusan data + Order::whereIn('id', $uniqueIds)->delete(); + + // 3. Kembalikan ke halaman sebelumnya dengan pesan sukses + return redirect()->back()->with('success', count($uniqueIds) . ' data laporan berhasil dihapus.'); + } catch (\Exception $e) { + // Jika terjadi error (misalnya masalah database) + return redirect()->back()->with('error', 'Gagal menghapus data: ' . $e->getMessage()); + } + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Controllers/StaffController.php b/laundry-app/app/Http/Controllers/StaffController.php new file mode 100644 index 0000000..056e609 --- /dev/null +++ b/laundry-app/app/Http/Controllers/StaffController.php @@ -0,0 +1,84 @@ +validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|min:8', + 'role' => 'required|in:staf,driver', + ]); + + // 2. Simpan ke database + \App\Models\User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => \Illuminate\Support\Facades\Hash::make($request->password), + 'role' => $request->role, + // TAMBAHKAN BARIS DI BAWAH INI: + 'owner_id' => Auth::id(), + ]); + + // 3. Arahkan kembali + return redirect()->route('settings')->with('success', 'Akun ' . $request->role . ' berhasil ditambahkan!'); + } + + public function edit($id) + { + $staff = \App\Models\User::where('owner_id', Auth::id())->findOrFail($id); + return view('staff.edit', compact('staff')); + } + + public function update(Request $request, $id) + { + $staff = \App\Models\User::where('owner_id', Auth::id())->findOrFail($id); + + $request->validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users,email,' . $staff->id, + 'password' => 'nullable|min:8', + 'role' => 'required|in:staf,driver', + ]); + + $staff->name = $request->name; + $staff->email = $request->email; + $staff->role = $request->role; + + if ($request->filled('password')) { + $staff->password = \Illuminate\Support\Facades\Hash::make($request->password); + } + + $staff->save(); + + return redirect()->route('settings')->with('success', 'Akun berhasil diperbarui!'); + } + + public function destroy($id) + { + // Tambahkan filter owner_id agar Owner A tidak bisa menghapus staf Owner B lewat URL + $staff = \App\Models\User::where('owner_id', Auth::id())->findOrFail($id); + + if ($staff->id === Auth::id()) { + return redirect()->back()->with('error', 'Anda tidak bisa menghapus akun sendiri!'); + } + + $staff->delete(); + + return redirect()->route('settings')->with('success', 'Akun berhasil dihapus.'); + } +} diff --git a/laundry-app/app/Http/Controllers/UserController.php b/laundry-app/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..d4c8a29 --- /dev/null +++ b/laundry-app/app/Http/Controllers/UserController.php @@ -0,0 +1,75 @@ + $ownerId], + [ + 'shop_name' => '', + 'delivery_fee_per_km' => 0, + 'free_delivery_km' => 0, + 'is_delivery_active' => false, + 'is_estimation_active' => false, + 'express_extra_price' => 0, + 'kilat_extra_price' => 0, + ] + ); + + $staffs = User::where('owner_id', $ownerId)->get(); + + return view('settings', compact('staffs', 'shop')); + } + + public function updateShopSettings(Request $request) + { + $request->validate([ + 'shop_name' => 'nullable|string|max:255', + 'delivery_fee_per_km' => 'required_if:is_delivery_active,1|numeric|min:1', + 'free_delivery_km' => 'nullable|numeric|min:0', + 'is_delivery_active' => 'nullable', + 'is_estimation_active' => 'nullable', + 'express_extra_price' => 'required_if:is_estimation_active,1|numeric|min:1', + 'kilat_extra_price' => 'required_if:is_estimation_active,1|numeric|min:1', + 'latitude' => 'nullable|numeric', + 'longitude' => 'nullable|numeric', + ], [ + 'delivery_fee_per_km.required_if' => 'Tarif per KM harus diisi jika Ongkos Kirim diaktifkan.', + 'delivery_fee_per_km.min' => 'Tarif per KM harus lebih dari 0.', + 'express_extra_price.required_if' => 'Harga Express harus diisi jika Estimasi diaktifkan.', + 'express_extra_price.min' => 'Harga Express harus lebih dari 0.', + 'kilat_extra_price.required_if' => 'Harga Kilat harus diisi jika Estimasi diaktifkan.', + 'kilat_extra_price.min' => 'Harga Kilat harus lebih dari 0.', + ]); + + $shop = Shop::where('user_id', Auth::id())->first(); + if ($shop) { + $dataToUpdate = [ + 'shop_name' => $request->shop_name, + 'delivery_fee_per_km' => $request->delivery_fee_per_km ?? 0, + 'free_delivery_km' => $request->free_delivery_km ?? 0, + 'is_delivery_active' => $request->has('is_delivery_active'), + 'is_estimation_active' => $request->has('is_estimation_active'), + 'express_extra_price' => $request->express_extra_price ?? 0, + 'kilat_extra_price' => $request->kilat_extra_price ?? 0, + 'latitude' => $request->latitude, + 'longitude' => $request->longitude, + ]; + + $shop->update($dataToUpdate); + } + + return redirect()->back()->with('success', 'Pengaturan Toko berhasil diperbarui!'); + } +} diff --git a/laundry-app/app/Http/Middleware/OnlyOwner.php b/laundry-app/app/Http/Middleware/OnlyOwner.php new file mode 100644 index 0000000..31bc488 --- /dev/null +++ b/laundry-app/app/Http/Middleware/OnlyOwner.php @@ -0,0 +1,30 @@ +role !== 'owner') { + Auth::logout(); + + // Hancurkan session agar benar-benar bersih + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/login')->with('error', 'Akses Ditolak! Hanya Owner yang boleh masuk.'); + } + + return $next($request); + } +} \ No newline at end of file diff --git a/laundry-app/app/Http/Middleware/PreventBackHistory.php b/laundry-app/app/Http/Middleware/PreventBackHistory.php new file mode 100644 index 0000000..bbbc236 --- /dev/null +++ b/laundry-app/app/Http/Middleware/PreventBackHistory.php @@ -0,0 +1,25 @@ +headers->set('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0'); + $response->headers->set('Pragma', 'no-cache'); + $response->headers->set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT'); + + return $response; + } +} diff --git a/laundry-app/app/Http/Requests/Auth/LoginRequest.php b/laundry-app/app/Http/Requests/Auth/LoginRequest.php new file mode 100644 index 0000000..8a97209 --- /dev/null +++ b/laundry-app/app/Http/Requests/Auth/LoginRequest.php @@ -0,0 +1,88 @@ +|string> + */ + public function rules(): array + { + return [ + 'email' => ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]; + } + + /** + * Attempt to authenticate the request's credentials. + * + * @throws \Illuminate\Validation\ValidationException + */ + // app/Http/Requests/Auth/LoginRequest.php + + public function authenticate(): void + { + $this->ensureIsNotRateLimited(); + + // Baris ini yang bertugas mengecek checkbox 'remember' + if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + } + + /** + * Ensure the login request is not rate limited. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function ensureIsNotRateLimited(): void + { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout($this)); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the rate limiting throttle key for the request. + */ + public function throttleKey(): string + { + return Str::transliterate(Str::lower($this->string('email')) . '|' . $this->ip()); + } +} diff --git a/laundry-app/app/Http/Requests/ProfileUpdateRequest.php b/laundry-app/app/Http/Requests/ProfileUpdateRequest.php new file mode 100644 index 0000000..3622a8f --- /dev/null +++ b/laundry-app/app/Http/Requests/ProfileUpdateRequest.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'lowercase', + 'email', + 'max:255', + Rule::unique(User::class)->ignore($this->user()->id), + ], + ]; + } +} diff --git a/laundry-app/app/Livewire/ActiveOrders.php b/laundry-app/app/Livewire/ActiveOrders.php new file mode 100644 index 0000000..c3cdb6c --- /dev/null +++ b/laundry-app/app/Livewire/ActiveOrders.php @@ -0,0 +1,22 @@ + Order::with('items') + ->whereNotIn('status', ['DIAMBIL', 'DITERIMA']) + ->latest() + ->paginate(10), + ]); + } +} diff --git a/laundry-app/app/Livewire/DashboardStats.php b/laundry-app/app/Livewire/DashboardStats.php new file mode 100644 index 0000000..a5d3d92 --- /dev/null +++ b/laundry-app/app/Livewire/DashboardStats.php @@ -0,0 +1,19 @@ + Order::whereNotIn('status', ['DIAMBIL', 'DITERIMA'])->count(), + 'antrian' => Order::where('status', 'ANTRIAN')->count(), + 'proses' => Order::where('status', 'PROSES')->count(), + 'selesai' => Order::where('status', 'SELESAI')->count(), + ]); + } +} diff --git a/laundry-app/app/Models/Order.php b/laundry-app/app/Models/Order.php new file mode 100644 index 0000000..c10533f --- /dev/null +++ b/laundry-app/app/Models/Order.php @@ -0,0 +1,85 @@ + 'datetime', + 'total_price' => 'integer', + 'total_weight' => 'float', + ]; + + public function items() + { + return $this->hasMany(OrderItem::class); + } + + /** + * Accessor untuk mendapatkan service_name dari items + * Menghindari error di view karena kolom service_name dihapus dari tabel orders + */ + public function getServiceNameAttribute() + { + if ($this->items->isEmpty()) { + return 'Layanan Umum'; + } + + return $this->items->map(function ($item) { + $qty = $item->unit === 'PCS' ? round($item->qty_or_weight) . ' PCS' : number_format($item->qty_or_weight, 3, '.', '') . ' KG'; + return $item->service_name . ' (' . $qty . ')||' . $item->subtotal; + })->implode("\n"); + } + + /** + * Logic Booted untuk Multi-Tenancy + */ + protected static function booted() + { + static::addGlobalScope('owner', function (Builder $builder) { + if (Auth::check()) { + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + $builder->where('user_id', $ownerId); + } + }); + + static::creating(function ($order) { + if (Auth::check()) { + $user = Auth::user(); + $order->user_id = $user->getOwnerId(); + } + }); + } +} \ No newline at end of file diff --git a/laundry-app/app/Models/OrderItem.php b/laundry-app/app/Models/OrderItem.php new file mode 100644 index 0000000..1a3d87a --- /dev/null +++ b/laundry-app/app/Models/OrderItem.php @@ -0,0 +1,38 @@ + 'integer', + 'qty_or_weight' => 'float', + 'subtotal' => 'integer' + ]; + + public function order() + { + return $this->belongsTo(Order::class); + } + + public function service() + { + return $this->belongsTo(Service::class); + } +} diff --git a/laundry-app/app/Models/Service.php b/laundry-app/app/Models/Service.php new file mode 100644 index 0000000..e1400a9 --- /dev/null +++ b/laundry-app/app/Models/Service.php @@ -0,0 +1,51 @@ +hasMany(Order::class); + } + + /** + * Logic Booted untuk Multi-Tenancy + */ + protected static function booted() + { + static::addGlobalScope('owner', function (Builder $builder) { + if (Auth::check()) { + $user = Auth::user(); + $ownerId = $user->getOwnerId(); + $builder->where('user_id', $ownerId); + } + }); + + static::creating(function ($service) { + if (Auth::check()) { + $user = Auth::user(); + $service->user_id = $user->getOwnerId(); + } + }); + } +} diff --git a/laundry-app/app/Models/Shop.php b/laundry-app/app/Models/Shop.php new file mode 100644 index 0000000..5080979 --- /dev/null +++ b/laundry-app/app/Models/Shop.php @@ -0,0 +1,44 @@ + 'boolean', + 'is_estimation_active' => 'boolean', + 'free_delivery_km' => 'integer', + 'express_extra_price' => 'integer', + 'kilat_extra_price' => 'integer', + ]; + + /** + * Relasi: Shop milik seorang Owner + */ + public function owner(): BelongsTo + { + return $this->belongsTo(User::class, 'user_id'); + } +} diff --git a/laundry-app/app/Models/User.php b/laundry-app/app/Models/User.php new file mode 100644 index 0000000..6b3b7d5 --- /dev/null +++ b/laundry-app/app/Models/User.php @@ -0,0 +1,89 @@ + 'datetime', + 'password' => 'hashed', + ]; + } + + /** + * Relasi: Seorang Owner punya banyak Staff/Driver + */ + public function staffs(): HasMany + { + return $this->hasMany(User::class, 'owner_id'); + } + + /** + * Relasi: Seorang Staff/Driver punya satu Owner (Bos) + */ + public function owner(): BelongsTo + { + return $this->belongsTo(User::class, 'owner_id'); + } + + /** + * Relasi: Seorang Owner punya satu Toko + */ + public function shop(): HasOne + { + return $this->hasOne(Shop::class, 'user_id'); + } + + /** + * Helper: Dapatkan Owner ID (baik user ini owner atau staf/driver) + */ + public function getOwnerId(): int + { + return ($this->role === 'staf' || $this->role === 'driver') ? $this->owner_id : $this->id; + } + + /** + * Helper: Dapatkan data Shop milik Owner + */ + public function getOwnerShop(): ?Shop + { + $ownerId = $this->getOwnerId(); + return Shop::where('user_id', $ownerId)->first(); + } + + /** + * Send the password reset notification. + * + * @param string $token + * @return void + */ + public function sendPasswordResetNotification($token) + { + $this->notify(new \App\Notifications\CustomResetPassword($token)); + } +} diff --git a/laundry-app/app/Notifications/CustomResetPassword.php b/laundry-app/app/Notifications/CustomResetPassword.php new file mode 100644 index 0000000..b6f759a --- /dev/null +++ b/laundry-app/app/Notifications/CustomResetPassword.php @@ -0,0 +1,106 @@ +sendViaBrevoApi($notifiable, $apiKey); + // Kembalikan array kosong agar Laravel tidak memproses channel mail + return []; + } + + // Fallback: gunakan mail channel SMTP biasa (untuk lokal) + return ['mail']; + } + + /** + * Kirim email reset sandi menggunakan Brevo HTTP API. + * Menggunakan HTTP (bukan SMTP) sehingga tidak terblokir di Railway. + */ + protected function sendViaBrevoApi($notifiable, string $apiKey): void + { + $url = $this->resetUrl($notifiable); + $expire = config('auth.passwords.' . config('auth.defaults.passwords') . '.expire', 60); + + $htmlContent = " +
+

Permintaan Reset Kata Sandi

+

Halo, " . ($notifiable->name ?? '') . "!

+

Anda menerima email ini karena kami menerima permintaan untuk menyetel ulang kata sandi akun Anda di mylaundry.

+

+ + Reset Kata Sandi + +

+

Tautan ini akan kedaluwarsa dalam {$expire} menit.

+

Jika Anda tidak meminta reset kata sandi, abaikan email ini.

+
+

Salam hangat, mylaundry

+
+ "; + + try { + $response = Http::timeout(10)->withHeaders([ + 'api-key' => $apiKey, + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + ])->post('https://api.brevo.com/v3/smtp/email', [ + 'sender' => [ + 'name' => config('mail.from.name', 'mylaundry'), + 'email' => config('mail.from.address'), + ], + 'to' => [ + ['email' => $notifiable->email, 'name' => $notifiable->name ?? ''], + ], + 'subject' => 'Permintaan Reset Kata Sandi - mylaundry', + 'htmlContent' => $htmlContent, + ]); + + if ($response->successful()) { + Log::info('Brevo API: Email reset sandi berhasil dikirim ke ' . $notifiable->email); + } else { + Log::error('Brevo API Error [' . $response->status() . ']: ' . $response->body()); + } + } catch (\Exception $e) { + Log::error('Brevo API Exception: ' . $e->getMessage()); + } + } + + /** + * Build the mail representation (digunakan sebagai fallback SMTP lokal). + */ + public function toMail($notifiable): MailMessage + { + if (static::$toMailCallback) { + return call_user_func(static::$toMailCallback, $notifiable, $this->token); + } + + $url = $this->resetUrl($notifiable); + $expire = config('auth.passwords.' . config('auth.defaults.passwords') . '.expire', 60); + + return (new MailMessage) + ->subject('Permintaan Reset Kata Sandi - mylaundry') + ->greeting('Halo!') + ->line('Anda menerima email ini karena kami menerima permintaan untuk menyetel ulang kata sandi akun Anda.') + ->action('Reset Kata Sandi', $url) + ->line("Tautan reset kata sandi ini akan kedaluwarsa dalam waktu {$expire} menit.") + ->line('Jika Anda tidak meminta reset kata sandi, abaikan email ini.') + ->salutation('Salam hangat, mylaundry'); + } +} diff --git a/laundry-app/app/Providers/AppServiceProvider.php b/laundry-app/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..8ee7e32 --- /dev/null +++ b/laundry-app/app/Providers/AppServiceProvider.php @@ -0,0 +1,31 @@ +handleCommand(new ArgvInput); + +exit($status); diff --git a/laundry-app/bootstrap/app.php b/laundry-app/bootstrap/app.php new file mode 100644 index 0000000..3533a13 --- /dev/null +++ b/laundry-app/bootstrap/app.php @@ -0,0 +1,26 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware) { + // Trust all proxies when behind load balancers like Railway + $middleware->trustProxies(at: '*'); + + // Daftarkan alias middleware Anda di sini + $middleware->alias([ + 'owner' => \App\Http\Middleware\OnlyOwner::class, + 'prevent-back-history' => \App\Http\Middleware\PreventBackHistory::class, + ]); + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); \ No newline at end of file diff --git a/laundry-app/bootstrap/cache/.gitignore b/laundry-app/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/bootstrap/providers.php b/laundry-app/bootstrap/providers.php new file mode 100644 index 0000000..38b258d --- /dev/null +++ b/laundry-app/bootstrap/providers.php @@ -0,0 +1,5 @@ +=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.19.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0" + }, + "time": "2025-10-17T16:34:55+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v7.0.5", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-jwt.git", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpfastcache/phpfastcache": "^9.2", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5" + }, + "time": "2026-04-01T20:38:03+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:43:20+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "47ba23c7a55247e2e1b7407aca90e9bbed0d9d86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/47ba23c7a55247e2e1b7407aca90e9bbed0d9d86", + "reference": "47ba23c7a55247e2e1b7407aca90e9bbed0d9d86", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "guzzlehttp/test-server": "^0.3.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2026-05-20T22:59:19+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/09e8a212562fb1fb6a512c4156ed71525969d6c2", + "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.52 || ^9.6.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2026-05-20T22:57:30+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.10.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "73ab136360b5dfd858006eae9795e8fe43c80361" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/73ab136360b5dfd858006eae9795e8fe43c80361", + "reference": "73ab136360b5dfd858006eae9795e8fe43c80361", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "1.1.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.52 || ^9.6.34" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.10.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2026-05-20T09:27:36+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.60.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "b8b55ce32175cc00f834a56eeb6316f18ed6ea39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/b8b55ce32175cc00f834a56eeb6316f18ed6ea39", + "reference": "b8b55ce32175cc00f834a56eeb6316f18ed6ea39", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13|^0.14", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.8.1", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.34", + "symfony/polyfill-php85": "^1.34", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.9.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.1.41", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-05-20T11:48:19+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.18", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/a19af51bb144bf87f08397921fa619f85c7d4e72", + "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0|^8.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.18" + }, + "time": "2026-05-19T00:47:18+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v4.3.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "2a9bccc18e9907808e0018dd15fa643937886b1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/2a9bccc18e9907808e0018dd15fa643937886b1e", + "reference": "2a9bccc18e9907808e0018dd15fa643937886b1e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "symfony/console": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2026-04-30T11:46:25+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.13", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2026-04-16T14:03:50+00:00" + }, + { + "name": "laravel/socialite", + "version": "v5.27.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/socialite.git", + "reference": "40e0757a75637c7b2dff05d3286b0d8fc25e5c0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/socialite/zipball/40e0757a75637c7b2dff05d3286b0d8fc25e5c0e", + "reference": "40e0757a75637c7b2dff05d3286b0d8fc25e5c0e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "firebase/php-jwt": "^6.4|^7.0", + "guzzlehttp/guzzle": "^6.0|^7.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "league/oauth1-client": "^1.11", + "php": "^7.2|^8.0", + "phpseclib/phpseclib": "^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.12.23", + "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5|^12.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Socialite": "Laravel\\Socialite\\Facades\\Socialite" + }, + "providers": [ + "Laravel\\Socialite\\SocialiteServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Socialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.", + "homepage": "https://laravel.com", + "keywords": [ + "laravel", + "oauth" + ], + "support": { + "issues": "https://github.com/laravel/socialite/issues", + "source": "https://github.com/laravel/socialite" + }, + "time": "2026-04-24T14:05:47+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.11.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.11.1" + }, + "time": "2026-02-06T14:12:35+00:00" + }, + { + "name": "league/commonmark", + "version": "2.8.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.9-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2026-03-19T13:16:38+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.34.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", + "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.34.0" + }, + "time": "2026-05-14T10:28:08+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.31.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + }, + "time": "2026-01-23T15:30:45+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/oauth1-client", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth1-client.git", + "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/f9c94b088837eb1aae1ad7c4f23eb65cc6993055", + "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "guzzlehttp/psr7": "^1.7|^2.0", + "php": ">=7.1||>=8.0" + }, + "require-dev": { + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^2.17", + "mockery/mockery": "^1.3.3", + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5||9.5" + }, + "suggest": { + "ext-simplexml": "For decoding XML-based responses." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev", + "dev-develop": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth1\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Corlett", + "email": "bencorlett@me.com", + "homepage": "http://www.webcomm.com.au", + "role": "Developer" + } + ], + "description": "OAuth 1.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "bitbucket", + "identity", + "idp", + "oauth", + "oauth1", + "single sign on", + "trello", + "tumblr", + "twitter" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth1-client/issues", + "source": "https://github.com/thephpleague/oauth1-client/tree/v1.11.0" + }, + "time": "2024-12-10T19:59:05+00:00" + }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "livewire/livewire", + "version": "v4.3.0", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "19ebb1ee4d057debceccf70ff01950e6a6114edc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/19ebb1ee4d057debceccf70ff01950e6a6114edc", + "reference": "19ebb1ee4d057debceccf70ff01950e6a6114edc", + "shasum": "" + }, + "require": { + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/routing": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "illuminate/validation": "^10.0|^11.0|^12.0|^13.0", + "laravel/prompts": "^0.1.24|^0.2|^0.3", + "league/mime-type-detection": "^1.9", + "php": "^8.1", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/http-kernel": "^6.2|^7.0|^8.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^10.15.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^8.21.0|^9.0|^10.0|^11.0", + "orchestra/testbench-dusk": "^8.24|^9.1|^10.0|^11.0", + "phpunit/phpunit": "^10.4|^11.5|^12.5", + "psy/psysh": "^0.11.22|^0.12" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Livewire": "Livewire\\Livewire" + }, + "providers": [ + "Livewire\\LivewireServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v4.3.0" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2026-05-01T00:46:07+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.69", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "ae5d65b7c9a2fac43bff4d44f796ac95d7a8e760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/ae5d65b7c9a2fac43bff4d44f796ac95d7a8e760", + "reference": "ae5d65b7c9a2fac43bff4d44f796ac95d7a8e760", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0||^13.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.30.4", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0||^11.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0||^11.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.69" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2026-04-30T20:03:58+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.2" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-01-27T12:07:53+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-01-02T08:56:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.4", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-04-07T09:57:54+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.5" + }, + "time": "2026-02-23T03:47:12+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7", + "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.4" + }, + "time": "2026-05-11T20:49:54+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.4.4 || ^8.0.4" + }, + "require-dev": { + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "It's like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2026-02-16T23:10:27+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.30.4", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "02970383cc12e7bf0bc0707ea6e2e8ed23a7aec9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/02970383cc12e7bf0bc0707ea6e2e8ed23a7aec9", + "reference": "02970383cc12e7bf0bc0707ea6e2e8ed23a7aec9", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": ">=7.4.0 <8.5.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "doctrine/instantiator": "^1.5", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + }, + { + "name": "Owen Leibman" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.4" + }, + "time": "2026-04-19T06:00:39+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:41:33+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.52", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2adaefc83df2ec548558307690f376dd7d4f4fce", + "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.52" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2026-04-27T07:02:15+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.22", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.22" + }, + "time": "2026-03-22T23:03:24+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.2" + }, + "time": "2025-12-14T04:43:48+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "ed0107e43ab452aa77ae99e005b95e56b556e075" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/ed0107e43ab452aa77ae99e005b95e56b556e075", + "reference": "ed0107e43ab452aa77ae99e005b95e56b556e075", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-13T12:04:42+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b75663ed96cf4756e28e3105476f220f92886cc4", + "reference": "b75663ed96cf4756e28e3105476f220f92886cc4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-18T13:18:21+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-13T15:52:40+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e4a2e29753c7801f7a8340e066cfa788f3bc8101", + "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-18T13:18:21+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T13:30:16+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e0be088d22278583a82da281886e8c3592fbf149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "9381209597ec66c25be154cbf2289076e64d1eab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", + "reference": "9381209597ec66c25be154cbf2289076e64d1eab", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "7922b53e70d2ba2027af8bb6a59d91eb3541ea4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7922b53e70d2ba2027af8bb6a59d91eb3541ea4d", + "reference": "7922b53e70d2ba2027af8bb6a59d91eb3541ea4d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-20T09:27:11+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "5cefb712a25f320579615ba9e1942abaeade7dff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/5cefb712a25f320579615ba9e1942abaeade7dff", + "reference": "5cefb712a25f320579615ba9e1942abaeade7dff", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-20T07:20:23+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "b198dd66c211c97119bcaaff7c13431dbbb5e470" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/b198dd66c211c97119bcaaff7c13431dbbb5e470", + "reference": "b198dd66c211c97119bcaaff7c13431dbbb5e470", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-20T07:20:23+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-26T13:13:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T17:25:58+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T17:25:58+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T18:47:49+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/fcfa4973a9917cef23f2e38774da74a2b7d115ee", + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-26T13:10:57+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "d9593c9efa40499eb078b81144de42cbc28a31f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/d9593c9efa40499eb078b81144de42cbc28a31f0", + "reference": "d9593c9efa40499eb078b81144de42cbc28a31f0", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-11T16:55:21+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3b04a5ec4887a8135a12ebf0f4cbc5b8fc8ee204" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/3b04a5ec4887a8135a12ebf0f4cbc5b8fc8ee204", + "reference": "3b04a5ec4887a8135a12ebf0f4cbc5b8fc8ee204", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-20T07:20:23+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-28T09:44:51+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "965f7306a43383d02c6aca1e3f3bd2f0ea5dee15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/965f7306a43383d02c6aca1e3f3bd2f0ea5dee15", + "reference": "965f7306a43383d02c6aca1e3f3bd2f0ea5dee15", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-13T12:04:42+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "ada7578c30dd5feaa8259cff3e885069ea81ddde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/ada7578c30dd5feaa8259cff3e885069ea81ddde", + "reference": "ada7578c30dd5feaa8259cff3e885069ea81ddde", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-06T11:19:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/0ab302977a952b42fd51475c4ebac81f8da0a95d", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T13:30:16+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "2676b524340abcfe4d6151ec698463cebafee439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/2676b524340abcfe4d6151ec698463cebafee439", + "reference": "2676b524340abcfe4d6151ec698463cebafee439", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-30T15:19:22+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T13:44:50+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.3", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "955e7815d677a3eaa7075231212f2110983adecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", + "reference": "955e7815d677a3eaa7075231212f2110983adecc", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.4", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:49:13+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2026-04-26T05:33:54+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel/breeze", + "version": "v2.4.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/breeze.git", + "reference": "4f20e7b2cc8d25daa85d8647241a89c8e0930305" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/breeze/zipball/4f20e7b2cc8d25daa85d8647241a89c8e0930305", + "reference": "4f20e7b2cc8d25daa85d8647241a89c8e0930305", + "shasum": "" + }, + "require": { + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/filesystem": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "illuminate/validation": "^11.0|^12.0|^13.0", + "php": "^8.2.0", + "symfony/console": "^7.0|^8.0" + }, + "require-dev": { + "laravel/framework": "^11.0|^12.0|^13.0", + "orchestra/testbench-core": "^9.0|^10.0|^11.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Breeze\\BreezeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Breeze\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Minimal Laravel authentication scaffolding with Blade and Tailwind.", + "keywords": [ + "auth", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/breeze/issues", + "source": "https://github.com/laravel/breeze" + }, + "time": "2026-05-14T16:54:25+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2026-02-09T13:44:54+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.29.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/0770e9b7fafd50d4586881d456d6eb41c9247a80", + "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.95.1", + "illuminate/view": "^12.56.0", + "larastan/larastan": "^3.9.6", + "laravel-zero/framework": "^12.1.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.6", + "shipfastlabs/agent-detector": "^1.1.3" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "dev", + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2026-04-20T15:26:14+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.60.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "2a1538ed22eed4210ac1e17904235032571bd89c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/2a1538ed22eed4210ac1e17904235032571bd89c", + "reference": "2a1538ed22eed4210ac1e17904235032571bd89c", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^2.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2026-05-14T17:29:51+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.9.4", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "716af8f95a470e9094cfca09ed897b023be191a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/716af8f95a470e9094cfca09ed897b023be191a5", + "reference": "716af8f95a470e9094cfca09ed897b023be191a5", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", + "php": "^8.2.0", + "symfony/console": "^7.4.8 || ^8.0.8" + }, + "conflict": { + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.6", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.5.0", + "laravel/pint": "^1.29.1", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.2.1", + "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.3.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-04-21T14:04:20+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.1", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.3.1" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.46" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-12-24T07:01:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T13:52:54+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.55", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.1", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.3", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-02-18T12:37:06+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-01-24T09:26:40+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:12:51+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:42:22+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:55:48+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "8b6952b56ca6417f25f7a65758cadd0ce02edc51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8b6952b56ca6417f25f7a65758cadd0ce02edc51", + "reference": "8b6952b56ca6417f25f7a65758cadd0ce02edc51", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-20T07:20:23+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/laundry-app/config/app.php b/laundry-app/config/app.php new file mode 100644 index 0000000..c74a68d --- /dev/null +++ b/laundry-app/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'Asia/Jakarta', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/laundry-app/config/auth.php b/laundry-app/config/auth.php new file mode 100644 index 0000000..7d1eb0d --- /dev/null +++ b/laundry-app/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/laundry-app/config/cache.php b/laundry-app/config/cache.php new file mode 100644 index 0000000..b32aead --- /dev/null +++ b/laundry-app/config/cache.php @@ -0,0 +1,117 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", + | "failover", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/laundry-app/config/database.php b/laundry-app/config/database.php new file mode 100644 index 0000000..df933e7 --- /dev/null +++ b/laundry-app/config/database.php @@ -0,0 +1,183 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + 'transaction_mode' => 'DEFERRED', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => env('DB_SSLMODE', 'prefer'), + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/laundry-app/config/filesystems.php b/laundry-app/config/filesystems.php new file mode 100644 index 0000000..37d8fca --- /dev/null +++ b/laundry-app/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/laundry-app/config/logging.php b/laundry-app/config/logging.php new file mode 100644 index 0000000..9e998a4 --- /dev/null +++ b/laundry-app/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/laundry-app/config/mail.php b/laundry-app/config/mail.php new file mode 100644 index 0000000..522b284 --- /dev/null +++ b/laundry-app/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/laundry-app/config/queue.php b/laundry-app/config/queue.php new file mode 100644 index 0000000..79c2c0a --- /dev/null +++ b/laundry-app/config/queue.php @@ -0,0 +1,129 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", + | "deferred", "background", "failover", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'background' => [ + 'driver' => 'background', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/laundry-app/config/sanctum.php b/laundry-app/config/sanctum.php new file mode 100644 index 0000000..44527d6 --- /dev/null +++ b/laundry-app/config/sanctum.php @@ -0,0 +1,84 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort(), + // Sanctum::currentRequestHost(), + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/laundry-app/config/services.php b/laundry-app/config/services.php new file mode 100644 index 0000000..1abcafc --- /dev/null +++ b/laundry-app/config/services.php @@ -0,0 +1,47 @@ + [ + 'key' => env('POSTMARK_API_KEY'), + ], + + 'resend' => [ + 'key' => env('RESEND_API_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + 'google' => [ + 'client_id' => env('GOOGLE_CLIENT_ID'), + 'client_secret' => env('GOOGLE_CLIENT_SECRET'), + 'redirect' => env('GOOGLE_REDIRECT_URL'), + ], + + 'brevo' => [ + 'api_key' => env('BREVO_API_KEY'), + ], + +]; diff --git a/laundry-app/config/session.php b/laundry-app/config/session.php new file mode 100644 index 0000000..5b541b7 --- /dev/null +++ b/laundry-app/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain without subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/laundry-app/database/.gitignore b/laundry-app/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/laundry-app/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/laundry-app/database/factories/UserFactory.php b/laundry-app/database/factories/UserFactory.php new file mode 100644 index 0000000..584104c --- /dev/null +++ b/laundry-app/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/laundry-app/database/migrations/0001_01_01_000000_create_users_table.php b/laundry-app/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..a81b9c8 --- /dev/null +++ b/laundry-app/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,61 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->string('password'); + $table->timestamp('email_verified_at')->nullable(); + + // Role: owner, staf, driver + $table->enum('role', ['owner', 'staf', 'driver'])->default('staf'); + + // Relasi hierarki: Staf/Driver terhubung ke Owner + // Jika user adalah 'owner', maka kolom ini NULL. + // Jika user adalah 'staf' atau 'driver', kolom ini berisi ID Owner mereka. + $table->unsignedBigInteger('owner_id')->nullable(); + + $table->rememberToken(); + $table->timestamps(); + + // Relasi ke tabel itu sendiri + $table->foreign('owner_id')->references('id')->on('users')->onDelete('cascade'); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/laundry-app/database/migrations/0001_01_01_000001_create_cache_table.php b/laundry-app/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..ed758bd --- /dev/null +++ b/laundry-app/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration')->index(); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/laundry-app/database/migrations/0001_01_01_000002_create_jobs_table.php b/laundry-app/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/laundry-app/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/laundry-app/database/migrations/2026_02_08_073500_create_shops_table.php b/laundry-app/database/migrations/2026_02_08_073500_create_shops_table.php new file mode 100644 index 0000000..7719653 --- /dev/null +++ b/laundry-app/database/migrations/2026_02_08_073500_create_shops_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); // Owner ID + $table->string('shop_name')->nullable(); + $table->decimal('latitude', 10, 8)->nullable(); + $table->decimal('longitude', 11, 8)->nullable(); + $table->unsignedInteger('delivery_fee_per_km')->default(0); + $table->integer('free_delivery_km')->default(0); + $table->boolean('is_delivery_active')->default(false); + $table->boolean('is_estimation_active')->default(false); + $table->integer('express_extra_price')->default(0); + $table->integer('kilat_extra_price')->default(0); + $table->string('device_id')->nullable(); + $table->timestamps(); + + // Satu owner hanya punya satu toko + $table->unique('user_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('shops'); + } +}; diff --git a/laundry-app/database/migrations/2026_02_08_073610_create_services_table.php b/laundry-app/database/migrations/2026_02_08_073610_create_services_table.php new file mode 100644 index 0000000..c175418 --- /dev/null +++ b/laundry-app/database/migrations/2026_02_08_073610_create_services_table.php @@ -0,0 +1,28 @@ +id(); + // Menghubungkan jasa ke Owner (User) + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + + $table->string('name'); + $table->unsignedInteger('price'); + $table->string('unit'); + $table->boolean('is_active')->default(true); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('services'); + } +}; \ No newline at end of file diff --git a/laundry-app/database/migrations/2026_02_08_073659_create_orders_table.php b/laundry-app/database/migrations/2026_02_08_073659_create_orders_table.php new file mode 100644 index 0000000..b78cc08 --- /dev/null +++ b/laundry-app/database/migrations/2026_02_08_073659_create_orders_table.php @@ -0,0 +1,62 @@ +id(); + + // FK ke tabel users (Owner pemilik order ini) + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + + $table->string('order_number')->unique(); + $table->string('customer_name'); + $table->string('phone')->nullable(); + + // Layanan sekarang dipindah ke tabel order_items (1-to-many) + // Hanya menyimpan total harga dan total berat + $table->timestamp('estimation_time')->nullable(); + $table->decimal('total_weight', 8, 3)->default(0); + + // Harga & Pembayaran (unsigned karena tidak pernah negatif) + $table->unsignedInteger('delivery_fee')->default(0); + $table->unsignedInteger('total_price')->default(0); + $table->string('status')->default('ANTRIAN')->index(); + $table->string('payment_method')->default('CASH'); + $table->unsignedInteger('cash_received')->default(0); + $table->unsignedInteger('cash_change')->default(0); + + // Tipe Pengantaran (satu kolom saja, label Indonesia ditampilkan di UI) + // Values: none, pickup, delivery, both + $table->string('delivery_type')->default('none')->index(); + + // Kolom Lokasi untuk Fitur Map & Tracking Driver + $table->text('address')->nullable(); + $table->decimal('latitude', 10, 8)->nullable(); + $table->decimal('longitude', 11, 8)->nullable(); + $table->decimal('delivery_distance', 8, 2)->nullable(); // Jarak toko-pelanggan (km) + + $table->timestamps(); + + // Index untuk performa query laporan + $table->index('payment_method'); + $table->index('created_at'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('orders'); + } +}; \ No newline at end of file diff --git a/laundry-app/database/migrations/2026_02_14_044632_create_personal_access_tokens_table.php b/laundry-app/database/migrations/2026_02_14_044632_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/laundry-app/database/migrations/2026_02_14_044632_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/laundry-app/database/migrations/2026_05_24_113000_create_order_items_table.php b/laundry-app/database/migrations/2026_05_24_113000_create_order_items_table.php new file mode 100644 index 0000000..bf3c45a --- /dev/null +++ b/laundry-app/database/migrations/2026_05_24_113000_create_order_items_table.php @@ -0,0 +1,36 @@ +id(); + + // Relasi ke order + $table->foreignId('order_id')->constrained()->onDelete('cascade'); + + // Relasi opsional ke services + $table->foreignId('service_id')->nullable()->constrained()->nullOnDelete(); + + // Snapshot data untuk histori jika suatu saat service diubah/dihapus + $table->string('service_name'); + $table->unsignedInteger('price'); + $table->decimal('qty_or_weight', 8, 3); + $table->string('unit'); // 'PCS' atau 'KG' + $table->unsignedInteger('subtotal'); + $table->string('estimation_name')->nullable(); + + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('order_items'); + } +}; diff --git a/laundry-app/database/migrations/2026_06_05_134732_drop_unused_columns_from_shops_table.php b/laundry-app/database/migrations/2026_06_05_134732_drop_unused_columns_from_shops_table.php new file mode 100644 index 0000000..7fea749 --- /dev/null +++ b/laundry-app/database/migrations/2026_06_05_134732_drop_unused_columns_from_shops_table.php @@ -0,0 +1,30 @@ +dropColumn([ + 'device_id', + ]); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('shops', function (Blueprint $table) { + $table->string('device_id')->nullable(); + }); + } +}; diff --git a/laundry-app/database/seeders/DatabaseSeeder.php b/laundry-app/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..fd8c967 --- /dev/null +++ b/laundry-app/database/seeders/DatabaseSeeder.php @@ -0,0 +1,21 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/laundry-app/lang/en/pagination.php b/laundry-app/lang/en/pagination.php new file mode 100644 index 0000000..d481411 --- /dev/null +++ b/laundry-app/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/laundry-app/lang/en/passwords.php b/laundry-app/lang/en/passwords.php new file mode 100644 index 0000000..c21e98b --- /dev/null +++ b/laundry-app/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Kata sandi Anda telah berhasil diatur ulang.', + 'sent' => 'Kami telah mengirimkan tautan pengaturan ulang kata sandi ke email Anda.', + 'throttled' => 'Silakan tunggu sebelum mencoba lagi.', + 'token' => 'Token pengaturan ulang kata sandi ini tidak valid.', + 'user' => 'Kami tidak dapat menemukan pengguna dengan alamat email tersebut.', + +]; diff --git a/laundry-app/lang/en/validation.php b/laundry-app/lang/en/validation.php new file mode 100644 index 0000000..63ec29a --- /dev/null +++ b/laundry-app/lang/en/validation.php @@ -0,0 +1,200 @@ + 'The :attribute field must be accepted.', + 'accepted_if' => 'The :attribute field must be accepted when :other is :value.', + 'active_url' => 'The :attribute field must be a valid URL.', + 'after' => 'The :attribute field must be a date after :date.', + 'after_or_equal' => 'The :attribute field must be a date after or equal to :date.', + 'alpha' => 'The :attribute field must only contain letters.', + 'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.', + 'alpha_num' => 'The :attribute field must only contain letters and numbers.', + 'any_of' => 'The :attribute field is invalid.', + 'array' => 'The :attribute field must be an array.', + 'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.', + 'before' => 'The :attribute field must be a date before :date.', + 'before_or_equal' => 'The :attribute field must be a date before or equal to :date.', + 'between' => [ + 'array' => 'The :attribute field must have between :min and :max items.', + 'file' => 'The :attribute field must be between :min and :max kilobytes.', + 'numeric' => 'The :attribute field must be between :min and :max.', + 'string' => 'The :attribute field must be between :min and :max characters.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'can' => 'The :attribute field contains an unauthorized value.', + 'confirmed' => 'The :attribute field confirmation does not match.', + 'contains' => 'The :attribute field is missing a required value.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute field must be a valid date.', + 'date_equals' => 'The :attribute field must be a date equal to :date.', + 'date_format' => 'The :attribute field must match the format :format.', + 'decimal' => 'The :attribute field must have :decimal decimal places.', + 'declined' => 'The :attribute field must be declined.', + 'declined_if' => 'The :attribute field must be declined when :other is :value.', + 'different' => 'The :attribute field and :other must be different.', + 'digits' => 'The :attribute field must be :digits digits.', + 'digits_between' => 'The :attribute field must be between :min and :max digits.', + 'dimensions' => 'The :attribute field has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_contain' => 'The :attribute field must not contain any of the following: :values.', + 'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.', + 'email' => 'The :attribute field must be a valid email address.', + 'encoding' => 'The :attribute field must be encoded in :encoding.', + 'ends_with' => 'The :attribute field must end with one of the following: :values.', + 'enum' => 'The selected :attribute is invalid.', + 'exists' => 'The selected :attribute is invalid.', + 'extensions' => 'The :attribute field must have one of the following extensions: :values.', + 'file' => 'The :attribute field must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'array' => 'The :attribute field must have more than :value items.', + 'file' => 'The :attribute field must be greater than :value kilobytes.', + 'numeric' => 'The :attribute field must be greater than :value.', + 'string' => 'The :attribute field must be greater than :value characters.', + ], + 'gte' => [ + 'array' => 'The :attribute field must have :value items or more.', + 'file' => 'The :attribute field must be greater than or equal to :value kilobytes.', + 'numeric' => 'The :attribute field must be greater than or equal to :value.', + 'string' => 'The :attribute field must be greater than or equal to :value characters.', + ], + 'hex_color' => 'The :attribute field must be a valid hexadecimal color.', + 'image' => 'The :attribute field must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field must exist in :other.', + 'in_array_keys' => 'The :attribute field must contain at least one of the following keys: :values.', + 'integer' => 'The :attribute field must be an integer.', + 'ip' => 'The :attribute field must be a valid IP address.', + 'ipv4' => 'The :attribute field must be a valid IPv4 address.', + 'ipv6' => 'The :attribute field must be a valid IPv6 address.', + 'json' => 'The :attribute field must be a valid JSON string.', + 'list' => 'The :attribute field must be a list.', + 'lowercase' => 'The :attribute field must be lowercase.', + 'lt' => [ + 'array' => 'The :attribute field must have less than :value items.', + 'file' => 'The :attribute field must be less than :value kilobytes.', + 'numeric' => 'The :attribute field must be less than :value.', + 'string' => 'The :attribute field must be less than :value characters.', + ], + 'lte' => [ + 'array' => 'The :attribute field must not have more than :value items.', + 'file' => 'The :attribute field must be less than or equal to :value kilobytes.', + 'numeric' => 'The :attribute field must be less than or equal to :value.', + 'string' => 'The :attribute field must be less than or equal to :value characters.', + ], + 'mac_address' => 'The :attribute field must be a valid MAC address.', + 'max' => [ + 'array' => 'The :attribute field must not have more than :max items.', + 'file' => 'The :attribute field must not be greater than :max kilobytes.', + 'numeric' => 'The :attribute field must not be greater than :max.', + 'string' => 'The :attribute field must not be greater than :max characters.', + ], + 'max_digits' => 'The :attribute field must not have more than :max digits.', + 'mimes' => 'The :attribute field must be a file of type: :values.', + 'mimetypes' => 'The :attribute field must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute field must have at least :min items.', + 'file' => 'The :attribute field must be at least :min kilobytes.', + 'numeric' => 'The :attribute field must be at least :min.', + 'string' => 'The :attribute field must be at least :min characters.', + ], + 'min_digits' => 'The :attribute field must have at least :min digits.', + 'missing' => 'The :attribute field must be missing.', + 'missing_if' => 'The :attribute field must be missing when :other is :value.', + 'missing_unless' => 'The :attribute field must be missing unless :other is :value.', + 'missing_with' => 'The :attribute field must be missing when :values is present.', + 'missing_with_all' => 'The :attribute field must be missing when :values are present.', + 'multiple_of' => 'The :attribute field must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute field format is invalid.', + 'numeric' => 'The :attribute field must be a number.', + 'password' => [ + 'letters' => 'The :attribute field must contain at least one letter.', + 'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.', + 'numbers' => 'The :attribute field must contain at least one number.', + 'symbols' => 'The :attribute field must contain at least one symbol.', + 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', + ], + 'present' => 'The :attribute field must be present.', + 'present_if' => 'The :attribute field must be present when :other is :value.', + 'present_unless' => 'The :attribute field must be present unless :other is :value.', + 'present_with' => 'The :attribute field must be present when :values is present.', + 'present_with_all' => 'The :attribute field must be present when :values are present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.', + 'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => 'The :attribute field format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_array_keys' => 'The :attribute field must contain entries for: :values.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_if_accepted' => 'The :attribute field is required when :other is accepted.', + 'required_if_declined' => 'The :attribute field is required when :other is declined.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute field must match :other.', + 'size' => [ + 'array' => 'The :attribute field must contain :size items.', + 'file' => 'The :attribute field must be :size kilobytes.', + 'numeric' => 'The :attribute field must be :size.', + 'string' => 'The :attribute field must be :size characters.', + ], + 'starts_with' => 'The :attribute field must start with one of the following: :values.', + 'string' => 'The :attribute field must be a string.', + 'timezone' => 'The :attribute field must be a valid timezone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'uppercase' => 'The :attribute field must be uppercase.', + 'url' => 'The :attribute field must be a valid URL.', + 'ulid' => 'The :attribute field must be a valid ULID.', + 'uuid' => 'The :attribute field must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/laundry-app/package-lock.json b/laundry-app/package-lock.json new file mode 100644 index 0000000..e72f2d2 --- /dev/null +++ b/laundry-app/package-lock.json @@ -0,0 +1,3246 @@ +{ + "name": "laundry-app", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/vite": "^4.0.0", + "alpinejs": "^3.4.2", + "autoprefixer": "^10.4.2", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "postcss": "^8.4.31", + "tailwindcss": "^3.1.0", + "vite": "^7.0.7" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", + "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "dev": true + }, + "node_modules/alpinejs": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.8.tgz", + "integrity": "sha512-zxIfCRTBGvF1CCLIOMQOxAyBuqibxSEwS6Jm1a3HGA9rgrJVcjEWlwLcQTVGAWGS8YhAsTRLVrtQ5a5QT9bSSQ==", + "dev": true, + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.1.0.tgz", + "integrity": "sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/laundry-app/package.json b/laundry-app/package.json new file mode 100644 index 0000000..2ea7e1d --- /dev/null +++ b/laundry-app/package.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://www.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/vite": "^4.0.0", + "alpinejs": "^3.4.2", + "autoprefixer": "^10.4.2", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "postcss": "^8.4.31", + "tailwindcss": "^3.1.0", + "vite": "^7.0.7" + } +} diff --git a/laundry-app/phpunit.xml b/laundry-app/phpunit.xml new file mode 100644 index 0000000..d703241 --- /dev/null +++ b/laundry-app/phpunit.xml @@ -0,0 +1,35 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + diff --git a/laundry-app/postcss.config.js b/laundry-app/postcss.config.js new file mode 100644 index 0000000..49c0612 --- /dev/null +++ b/laundry-app/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/laundry-app/public/.htaccess b/laundry-app/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/laundry-app/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/laundry-app/public/app_icon.png b/laundry-app/public/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8109f2c4e8c21bf57a967f663516798cb1804e13 GIT binary patch literal 9232 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::capture()); diff --git a/laundry-app/public/robots.txt b/laundry-app/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/laundry-app/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/laundry-app/resources/css/app.css b/laundry-app/resources/css/app.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/laundry-app/resources/css/app.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/laundry-app/resources/js/app.js b/laundry-app/resources/js/app.js new file mode 100644 index 0000000..a8093be --- /dev/null +++ b/laundry-app/resources/js/app.js @@ -0,0 +1,7 @@ +import './bootstrap'; + +import Alpine from 'alpinejs'; + +window.Alpine = Alpine; + +Alpine.start(); diff --git a/laundry-app/resources/js/bootstrap.js b/laundry-app/resources/js/bootstrap.js new file mode 100644 index 0000000..5f1390b --- /dev/null +++ b/laundry-app/resources/js/bootstrap.js @@ -0,0 +1,4 @@ +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/laundry-app/resources/views/auth/confirm-password.blade.php b/laundry-app/resources/views/auth/confirm-password.blade.php new file mode 100644 index 0000000..3d38186 --- /dev/null +++ b/laundry-app/resources/views/auth/confirm-password.blade.php @@ -0,0 +1,27 @@ + +
+ {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} +
+ +
+ @csrf + + +
+ + + + + +
+ +
+ + {{ __('Confirm') }} + +
+
+
diff --git a/laundry-app/resources/views/auth/forgot-password.blade.php b/laundry-app/resources/views/auth/forgot-password.blade.php new file mode 100644 index 0000000..5c031c6 --- /dev/null +++ b/laundry-app/resources/views/auth/forgot-password.blade.php @@ -0,0 +1,77 @@ + + + + + + Lupa Kata Sandi - Laundry System + + + + + + + +
+
+
+
+ +
+
+
+ 🔑 +
+

Lupa Kata Sandi?

+

+ Masukkan email Anda dan kami akan mengirimkan tautan untuk mengatur ulang kata sandi Anda. +

+
+ + @if (session('status')) +
+ {{ session('status') }} +
+ @endif + +
+ @csrf + +
+ + + @error('email') +

{{ $message }}

+ @enderror +
+ + + + +
+
+
+ + + \ No newline at end of file diff --git a/laundry-app/resources/views/auth/login.blade.php b/laundry-app/resources/views/auth/login.blade.php new file mode 100644 index 0000000..e068e2c --- /dev/null +++ b/laundry-app/resources/views/auth/login.blade.php @@ -0,0 +1,136 @@ + + + + + + + Login - Laundry System + + + + + + + + + + + +
+
+
+
+
+ +
+
+

Login

+

Kelola pesanan, layanan, dan laporan Anda dengan efisien.

+
+ + @if (session('status')) +
+ {{ session('status') }} +
+ @endif + +
+ @csrf + +
+ + + @error('email') +

{{ $message }}

+ @enderror +
+ +
+ +
+ + +
+ visibility +
+
+ @error('password') +

{{ $message }}

+ @enderror +
+ +
+ + + @if (Route::has('password.request')) + Lupa Kata Sandi? + @endif +
+ + + +
+

+ Belum punya akun? + + Daftar Sekarang + +

+
+
+
+
+ + + + \ No newline at end of file diff --git a/laundry-app/resources/views/auth/register.blade.php b/laundry-app/resources/views/auth/register.blade.php new file mode 100644 index 0000000..6d452ec --- /dev/null +++ b/laundry-app/resources/views/auth/register.blade.php @@ -0,0 +1,119 @@ + + + + + + Daftar Akun - Laundry System + + + + + + + + + +
+
+
+
+
+ +
+
+

Daftar Akun

+

Buat akun untuk mulai mengelola sistem laundry Anda.

+
+ +
+ @csrf + +
+ + + @error('name')

{{ $message }}

@enderror +
+ +
+ + + @error('email')

{{ $message }}

@enderror +
+ +
+ +
+ +
+ visibility +
+
+ @error('password')

{{ $message }}

@enderror +
+ +
+ +
+ +
+ visibility +
+
+
+ + + +
+

+ Sudah memiliki akun? + + Masuk di sini + +

+
+
+
+
+ + + + + \ No newline at end of file diff --git a/laundry-app/resources/views/auth/reset-password.blade.php b/laundry-app/resources/views/auth/reset-password.blade.php new file mode 100644 index 0000000..11af45f --- /dev/null +++ b/laundry-app/resources/views/auth/reset-password.blade.php @@ -0,0 +1,39 @@ + +
+ @csrf + + + + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + +
+ +
+ + {{ __('Reset Password') }} + +
+
+
diff --git a/laundry-app/resources/views/auth/verify-email.blade.php b/laundry-app/resources/views/auth/verify-email.blade.php new file mode 100644 index 0000000..eaf811d --- /dev/null +++ b/laundry-app/resources/views/auth/verify-email.blade.php @@ -0,0 +1,31 @@ + +
+ {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }} +
+ + @if (session('status') == 'verification-link-sent') +
+ {{ __('A new verification link has been sent to the email address you provided during registration.') }} +
+ @endif + +
+
+ @csrf + +
+ + {{ __('Resend Verification Email') }} + +
+
+ +
+ @csrf + + +
+
+
diff --git a/laundry-app/resources/views/components/application-logo.blade.php b/laundry-app/resources/views/components/application-logo.blade.php new file mode 100644 index 0000000..d7ad58c --- /dev/null +++ b/laundry-app/resources/views/components/application-logo.blade.php @@ -0,0 +1 @@ +Logo diff --git a/laundry-app/resources/views/components/auth-session-status.blade.php b/laundry-app/resources/views/components/auth-session-status.blade.php new file mode 100644 index 0000000..c4bd6e2 --- /dev/null +++ b/laundry-app/resources/views/components/auth-session-status.blade.php @@ -0,0 +1,7 @@ +@props(['status']) + +@if ($status) +
merge(['class' => 'font-medium text-sm text-green-600']) }}> + {{ $status }} +
+@endif diff --git a/laundry-app/resources/views/components/danger-button.blade.php b/laundry-app/resources/views/components/danger-button.blade.php new file mode 100644 index 0000000..d17d288 --- /dev/null +++ b/laundry-app/resources/views/components/danger-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/laundry-app/resources/views/components/dropdown-link.blade.php b/laundry-app/resources/views/components/dropdown-link.blade.php new file mode 100644 index 0000000..e0f8ce1 --- /dev/null +++ b/laundry-app/resources/views/components/dropdown-link.blade.php @@ -0,0 +1 @@ +merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }} diff --git a/laundry-app/resources/views/components/dropdown.blade.php b/laundry-app/resources/views/components/dropdown.blade.php new file mode 100644 index 0000000..a46f7c8 --- /dev/null +++ b/laundry-app/resources/views/components/dropdown.blade.php @@ -0,0 +1,35 @@ +@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white']) + +@php +$alignmentClasses = match ($align) { + 'left' => 'ltr:origin-top-left rtl:origin-top-right start-0', + 'top' => 'origin-top', + default => 'ltr:origin-top-right rtl:origin-top-left end-0', +}; + +$width = match ($width) { + '48' => 'w-48', + default => $width, +}; +@endphp + +
+
+ {{ $trigger }} +
+ + +
diff --git a/laundry-app/resources/views/components/input-error.blade.php b/laundry-app/resources/views/components/input-error.blade.php new file mode 100644 index 0000000..9e6da21 --- /dev/null +++ b/laundry-app/resources/views/components/input-error.blade.php @@ -0,0 +1,9 @@ +@props(['messages']) + +@if ($messages) +
    merge(['class' => 'text-sm text-red-600 space-y-1']) }}> + @foreach ((array) $messages as $message) +
  • {{ $message }}
  • + @endforeach +
+@endif diff --git a/laundry-app/resources/views/components/input-label.blade.php b/laundry-app/resources/views/components/input-label.blade.php new file mode 100644 index 0000000..1cc65e2 --- /dev/null +++ b/laundry-app/resources/views/components/input-label.blade.php @@ -0,0 +1,5 @@ +@props(['value']) + + diff --git a/laundry-app/resources/views/components/modal.blade.php b/laundry-app/resources/views/components/modal.blade.php new file mode 100644 index 0000000..70704c1 --- /dev/null +++ b/laundry-app/resources/views/components/modal.blade.php @@ -0,0 +1,78 @@ +@props([ + 'name', + 'show' => false, + 'maxWidth' => '2xl' +]) + +@php +$maxWidth = [ + 'sm' => 'sm:max-w-sm', + 'md' => 'sm:max-w-md', + 'lg' => 'sm:max-w-lg', + 'xl' => 'sm:max-w-xl', + '2xl' => 'sm:max-w-2xl', +][$maxWidth]; +@endphp + +
+
+
+
+ +
+ {{ $slot }} +
+
diff --git a/laundry-app/resources/views/components/nav-link.blade.php b/laundry-app/resources/views/components/nav-link.blade.php new file mode 100644 index 0000000..5c101a2 --- /dev/null +++ b/laundry-app/resources/views/components/nav-link.blade.php @@ -0,0 +1,11 @@ +@props(['active']) + +@php +$classes = ($active ?? false) + ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out' + : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out'; +@endphp + +merge(['class' => $classes]) }}> + {{ $slot }} + diff --git a/laundry-app/resources/views/components/primary-button.blade.php b/laundry-app/resources/views/components/primary-button.blade.php new file mode 100644 index 0000000..d71f0b6 --- /dev/null +++ b/laundry-app/resources/views/components/primary-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/laundry-app/resources/views/components/responsive-nav-link.blade.php b/laundry-app/resources/views/components/responsive-nav-link.blade.php new file mode 100644 index 0000000..43b91e7 --- /dev/null +++ b/laundry-app/resources/views/components/responsive-nav-link.blade.php @@ -0,0 +1,11 @@ +@props(['active']) + +@php +$classes = ($active ?? false) + ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 text-start text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out' + : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out'; +@endphp + +merge(['class' => $classes]) }}> + {{ $slot }} + diff --git a/laundry-app/resources/views/components/secondary-button.blade.php b/laundry-app/resources/views/components/secondary-button.blade.php new file mode 100644 index 0000000..b32b69f --- /dev/null +++ b/laundry-app/resources/views/components/secondary-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/laundry-app/resources/views/components/text-input.blade.php b/laundry-app/resources/views/components/text-input.blade.php new file mode 100644 index 0000000..da1b12d --- /dev/null +++ b/laundry-app/resources/views/components/text-input.blade.php @@ -0,0 +1,3 @@ +@props(['disabled' => false]) + +merge(['class' => 'border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm']) }}> diff --git a/laundry-app/resources/views/dashboard.blade.php b/laundry-app/resources/views/dashboard.blade.php new file mode 100644 index 0000000..0b164c7 --- /dev/null +++ b/laundry-app/resources/views/dashboard.blade.php @@ -0,0 +1,132 @@ + + {{-- Wrapper utama disamakan persis dengan halaman Kelola Satuan --}} +
+ + {{-- Header Section --}} +
+
+

Beranda

+

Ringkasan performa dan pesanan aktif laundry Anda.

+
+
+ + {{-- Statistik Ringkas --}} +
+ +
+ + {{-- Section Grafik Pelanggan --}} +
+
+

Grafik Pelanggan

+

Jumlah pelanggan harian (7 Hari Terakhir)

+
+ +
+ + + + + + + + + + + + + + + + + + + + + @foreach(explode(' ', $chartPoints) as $point) + @php $coord = explode(',', $point); @endphp + @if(count($coord) == 2) + + + @endif + @endforeach + +
+ +
+ @foreach($days as $index => $day) +
+ {{ $day }} + {{ $chartData[$index] }} +
+ @endforeach +
+
+ + +
+ + {{-- STYLE DIPINDAH KE BAWAH AGAR TIDAK MENDORONG JUDUL KE BAWAH --}} + +
\ No newline at end of file diff --git a/laundry-app/resources/views/laundry.blade.php b/laundry-app/resources/views/laundry.blade.php new file mode 100644 index 0000000..a831b6e --- /dev/null +++ b/laundry-app/resources/views/laundry.blade.php @@ -0,0 +1,239 @@ + +
+ @if(session('success')) +
+
+
+
+ check_circle +
+
+

Berhasil

+

{{ session('success') }}

+
+
+ +
+
+ @endif + +
+
+ {{-- Judul: normal-case (Bukan kapital semua) --}} +

Kelola Satuan Laundry

+

Atur daftar harga dan kategori layanan laundry Anda.

+
+
+ {{-- Tombol: Ukuran lebih kecil (px-4 py-2, text-xs) --}} + + add + Tambah Layanan Baru + +
+
+ +
+
+
+ search + +
+ +
+ + + + {{-- Mobile Card Layout --}} +
+ @forelse($services as $item) +
+
+
+

{{ $item->name }}

+ + {{ $item->unit }} + +
+
+ Rp {{ number_format($item->price, 0, ',', '.') }} + /{{ strtolower($item->unit) }} +
+
+ + edit Edit + +
+ @csrf @method('DELETE') + +
+
+
+
+
+ @csrf + +
+
+
+ @empty +
Belum ada layanan.
+ @endforelse +
+
+

+ Total: {{ $services->count() }} Layanan +

+
+
+
+ + + + + +
\ No newline at end of file diff --git a/laundry-app/resources/views/laundry/create.blade.php b/laundry-app/resources/views/laundry/create.blade.php new file mode 100644 index 0000000..c3ae999 --- /dev/null +++ b/laundry-app/resources/views/laundry/create.blade.php @@ -0,0 +1,76 @@ + +
+ {{-- Header --}} +
+ + + arrow_back + + +
+

Tambah Layanan Baru

+

Input data jasa laundry baru

+
+
+ +
+
+
+
+ @csrf + + {{-- Nama Layanan --}} +
+ + + @error('name')

{{ $message }}

@enderror +
+ + {{-- Grid untuk Satuan dan Harga --}} +
+ {{-- Satuan (Tanpa Meter) --}} +
+ +
+ {{-- PERBAIKAN: Tambahkan bg-none dan pr-10 di sini --}} + + {{-- Hanya 1 Panah ke Bawah (Ikon Custom) --}} +
+ keyboard_arrow_down +
+
+
+ + {{-- Harga --}} +
+ +
+
Rp
+ +
+
+
+ + {{-- Action Buttons --}} +
+ + Batal + + +
+
+
+
+
+
+
\ No newline at end of file diff --git a/laundry-app/resources/views/laundry/edit.blade.php b/laundry-app/resources/views/laundry/edit.blade.php new file mode 100644 index 0000000..c6edd07 --- /dev/null +++ b/laundry-app/resources/views/laundry/edit.blade.php @@ -0,0 +1,88 @@ + +
+ {{-- Header: Disamakan dengan halaman Create --}} +
+ + + arrow_back + + +
+

Edit Layanan

+

Perbarui informasi jasa laundry

+
+
+ +
+
+
+
+ @csrf + @method('PUT') + + {{-- Nama Layanan --}} +
+ + + @error('name')

{{ $message }}

@enderror +
+ + {{-- Grid untuk Satuan dan Harga --}} +
+ {{-- Satuan --}} +
+ +
+ {{-- PERBAIKAN: Ditambahkan bg-none di sini --}} + + {{-- Hanya 1 Panah ke Bawah --}} +
+ keyboard_arrow_down +
+
+
+ + {{-- Harga --}} +
+ +
+
Rp
+ +
+ @error('price')

{{ $message }}

@enderror +
+
+ + {{-- Action Buttons: Di Sebelah Kanan --}} +
+ + Batal + + +
+
+
+
+
+
+ + +
\ No newline at end of file diff --git a/laundry-app/resources/views/layouts/app.blade.php b/laundry-app/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..643c6d0 --- /dev/null +++ b/laundry-app/resources/views/layouts/app.blade.php @@ -0,0 +1,253 @@ + + + + + + + My Laundry - Management System + + + + + + + @livewireStyles + + + + + + + + @if(session('success')) +
+
+
+
+ check_circle +
+
+

Berhasil

+

{{ session('success') }}

+
+
+ +
+
+ @endif + + @if(session('error')) +
+
+
+
+ error +
+
+

Gagal

+

{{ session('error') }}

+
+
+ +
+
+ @endif + + {{-- OVERLAY PUTAR LAYAR --}} + + +
+ +
+ + + +
+
+ +
+ Logo + My LAUNDRY +
+ +
+
+ +
+ {{ $slot }} +
+
+
+ + + @livewireScripts + + + + \ No newline at end of file diff --git a/laundry-app/resources/views/layouts/guest.blade.php b/laundry-app/resources/views/layouts/guest.blade.php new file mode 100644 index 0000000..4e4e77c --- /dev/null +++ b/laundry-app/resources/views/layouts/guest.blade.php @@ -0,0 +1,34 @@ + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + + +
+
+ + + +
+ +
+ {{ $slot }} +
+
+ + diff --git a/laundry-app/resources/views/layouts/navigation.blade.php b/laundry-app/resources/views/layouts/navigation.blade.php new file mode 100644 index 0000000..c2d3a65 --- /dev/null +++ b/laundry-app/resources/views/layouts/navigation.blade.php @@ -0,0 +1,100 @@ + diff --git a/laundry-app/resources/views/livewire/active-orders.blade.php b/laundry-app/resources/views/livewire/active-orders.blade.php new file mode 100644 index 0000000..3a0c68e --- /dev/null +++ b/laundry-app/resources/views/livewire/active-orders.blade.php @@ -0,0 +1,206 @@ +
+
+
+

Pesanan Aktif Terbaru

+
+
+ + + {{-- Mobile Card Layout --}} +
+ @forelse($latest as $order) +
+
+
+ #{{ $order->order_number }} +

{{ $order->customer_name }}

+
+
+ @if($order->status == 'PROSES') + + PROSES + + @elseif($order->status == 'ANTRIAN') + + ANTRIAN + + @elseif($order->status == 'SELESAI') + + SELESAI + + @elseif(in_array($order->status, ['PICKUP', 'MENUNGGU JEMPUT'])) + + PICKUP + + @elseif($order->status == 'TIBA DI TOKO' || $order->status == 'JEMPUTAN TIBA') + + TIBA DI TOKO + + @else + + {{ $order->status }} + + @endif +
+
+ +
+ @if(in_array($order->status, ['PICKUP', 'MENUNGGU JEMPUT', 'TIBA DI TOKO', 'JEMPUTAN TIBA'])) + - + @else + {!! nl2br(e(explode('||', $order->service_name ?? 'Layanan Umum')[0])) !!} + @endif +
+ @if(!in_array($order->status, ['PICKUP', 'MENUNGGU JEMPUT', 'TIBA DI TOKO', 'JEMPUTAN TIBA'])) + @if(strtoupper($order->payment_method) == 'BAYAR NANTI' && $order->cash_received == 0) + BELUM BAYAR + @else + LUNAS + @endif + + @php + $isSatuan = preg_match('/PCS|Satuan/i', $order->service_name); + $tipeEstimasi = "Reguler"; + if (!$isSatuan) { + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) $tipeEstimasi = "Kilat"; + elseif ($diffInHours <= 24) $tipeEstimasi = "Ekspres"; + } else { + if (preg_match('/Kilat/i', $order->service_name)) $tipeEstimasi = "Kilat"; + elseif (preg_match('/Ekspres|Express/i', $order->service_name)) $tipeEstimasi = "Ekspres"; + } + } + @endphp + @if(!$isSatuan) + + {{ $tipeEstimasi }} + + @endif + @endif + + @if($order->delivery_type && $order->delivery_type !== 'none') + @php + $typeLabel = ""; + if ($order->delivery_type === 'pickup') $typeLabel = "Pick-up"; + elseif ($order->delivery_type === 'delivery') $typeLabel = "Delivery"; + elseif ($order->delivery_type === 'both') $typeLabel = "Pick-up & Delivery"; + @endphp + + {{ $typeLabel }} + + @endif +
+
+
+ @empty +
Belum ada pesanan aktif saat ini.
+ @endforelse +
+ +
+ {{ $latest->links() }} +
+
diff --git a/laundry-app/resources/views/livewire/dashboard-stats.blade.php b/laundry-app/resources/views/livewire/dashboard-stats.blade.php new file mode 100644 index 0000000..d73f713 --- /dev/null +++ b/laundry-app/resources/views/livewire/dashboard-stats.blade.php @@ -0,0 +1,48 @@ +
+
+ + {{-- Card Total Pesanan --}} +
+
+ format_list_numbered +
+
+

{{ number_format($total) }}

+

Total Pesanan

+
+
+ + {{-- Card Antrian (Klik-able) --}} + +
+ hourglass_top +
+
+

{{ $antrian }}

+

Antrian

+
+
+ + {{-- Card Proses (Klik-able) --}} + +
+ waves +
+
+

{{ $proses }}

+

Proses

+
+
+ + {{-- Card Selesai (Klik-able) --}} + +
+ check_circle +
+
+

{{ number_format($selesai) }}

+

Selesai

+
+
+
+
diff --git a/laundry-app/resources/views/orders/status_list.blade.php b/laundry-app/resources/views/orders/status_list.blade.php new file mode 100644 index 0000000..bdf461a --- /dev/null +++ b/laundry-app/resources/views/orders/status_list.blade.php @@ -0,0 +1,346 @@ + +
+ @if(session('success')) +
+
+
+
+ check_circle +
+
+

Berhasil

+

{{ session('success') }}

+
+
+ +
+
+ @endif +
+ + arrow_back + +

Daftar {{ ucfirst(strtolower($statusUpper)) }}

+
+ +
+ + {{-- Toolbar: Tombol Hapus (Kiri) & Search (Kanan) --}} +
+ + {{-- Tombol Hapus Terpilih --}} + + + {{-- Form Pencarian --}} +
+ search + + {{-- autocomplete="off" untuk menghapus riwayat saran browser --}} + +
+
+ + {{-- Form pembungkus untuk fitur hapus massal --}} +
+ @csrf + @method('DELETE') + + + + {{-- Mobile Card Layout --}} +
+ @forelse($orders as $order) +
+
+ +
+
+ #{{ $order->order_number }} +

{{ $order->customer_name }}

+
+
Masuk: {{ $order->created_at->format('d M, H:i') }}
+ @if($order->estimation_time) +
Selesai: {{ \Carbon\Carbon::parse($order->estimation_time)->format('d M, H:i') }}
+ @endif +
+
+ +
+ {!! nl2br(e(explode('||', $order->service_name)[0])) !!} +
+ @php + $isSatuan = preg_match('/PCS|Satuan/i', $order->service_name); + $tipeEstimasi = "Reguler"; + if (!$isSatuan) { + if ($order->estimation_time && $order->created_at) { + $diffInHours = $order->created_at->diffInHours($order->estimation_time); + if ($diffInHours <= 6) $tipeEstimasi = "Kilat"; + elseif ($diffInHours <= 24) $tipeEstimasi = "Ekspres"; + } else { + if (preg_match('/Kilat/i', $order->service_name)) $tipeEstimasi = "Kilat"; + elseif (preg_match('/Ekspres|Express/i', $order->service_name)) $tipeEstimasi = "Ekspres"; + } + } + @endphp + @if(!$isSatuan) + + {{ $tipeEstimasi }} + + @endif + + @if($order->delivery_type && $order->delivery_type !== 'none') + @php + $typeLabel = ""; + if ($order->delivery_type === 'pickup') $typeLabel = "Pick-up"; + elseif ($order->delivery_type === 'delivery') $typeLabel = "Delivery"; + elseif ($order->delivery_type === 'both') $typeLabel = "Pick-up & Delivery"; + @endphp + + {{ $typeLabel }} + + @endif +
+
+ +
+
+ Rp {{ number_format($order->total_price, 0, ',', '.') }} + @if(strtoupper($order->payment_method) == 'BAYAR NANTI' && $order->cash_received == 0) + BELUM BAYAR + @else + LUNAS ({{ strtoupper($order->payment_method) == 'CASH' ? 'TUNAI' : $order->payment_method }}) + @endif +
+
+ @php + $color = [ + 'ANTRIAN' => 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400', + 'PROSES' => 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400', + 'SELESAI' => 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400', + 'PICKUP' => 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400', + 'TIBA DI TOKO' => 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400', + 'JEMPUTAN TIBA' => 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400', + ][$order->status] ?? 'bg-gray-100'; + @endphp + + {{ $order->status }} + +
+
+
+ @empty +
+ Tidak ada data pesanan @if(request('search')) untuk "{{ request('search') }}" @endif. +
+ @endforelse +
+ + @if($orders->hasPages()) +
+ {{ $orders->appends(request()->query())->links() }} +
+ @endif +
+
+
+ + + +
\ No newline at end of file diff --git a/laundry-app/resources/views/profile/edit.blade.php b/laundry-app/resources/views/profile/edit.blade.php new file mode 100644 index 0000000..e0e1d38 --- /dev/null +++ b/laundry-app/resources/views/profile/edit.blade.php @@ -0,0 +1,29 @@ + + +

+ {{ __('Profile') }} +

+
+ +
+
+
+
+ @include('profile.partials.update-profile-information-form') +
+
+ +
+
+ @include('profile.partials.update-password-form') +
+
+ +
+
+ @include('profile.partials.delete-user-form') +
+
+
+
+
diff --git a/laundry-app/resources/views/profile/partials/delete-user-form.blade.php b/laundry-app/resources/views/profile/partials/delete-user-form.blade.php new file mode 100644 index 0000000..edeeb4a --- /dev/null +++ b/laundry-app/resources/views/profile/partials/delete-user-form.blade.php @@ -0,0 +1,55 @@ +
+
+

+ {{ __('Delete Account') }} +

+ +

+ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }} +

+
+ + {{ __('Delete Account') }} + + +
+ @csrf + @method('delete') + +

+ {{ __('Are you sure you want to delete your account?') }} +

+ +

+ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} +

+ +
+ + + + + +
+ +
+ + {{ __('Cancel') }} + + + + {{ __('Delete Account') }} + +
+
+
+
diff --git a/laundry-app/resources/views/profile/partials/update-password-form.blade.php b/laundry-app/resources/views/profile/partials/update-password-form.blade.php new file mode 100644 index 0000000..e66aeff --- /dev/null +++ b/laundry-app/resources/views/profile/partials/update-password-form.blade.php @@ -0,0 +1,48 @@ +
+
+

+ {{ __('Update Password') }} +

+ +

+ {{ __('Ensure your account is using a long, random password to stay secure.') }} +

+
+ +
+ @csrf + @method('put') + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ {{ __('Save') }} + + @if (session('status') === 'password-updated') +

{{ __('Saved.') }}

+ @endif +
+
+
diff --git a/laundry-app/resources/views/profile/partials/update-profile-information-form.blade.php b/laundry-app/resources/views/profile/partials/update-profile-information-form.blade.php new file mode 100644 index 0000000..0394949 --- /dev/null +++ b/laundry-app/resources/views/profile/partials/update-profile-information-form.blade.php @@ -0,0 +1,64 @@ +
+
+

+ {{ __('Profile Information') }} +

+ +

+ {{ __("Update your account's profile information and email address.") }} +

+
+ +
+ @csrf +
+ +
+ @csrf + @method('patch') + +
+ + + +
+ +
+ + + + + @if ($user instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && ! $user->hasVerifiedEmail()) +
+

+ {{ __('Your email address is unverified.') }} + + +

+ + @if (session('status') === 'verification-link-sent') +

+ {{ __('A new verification link has been sent to your email address.') }} +

+ @endif +
+ @endif +
+ +
+ {{ __('Save') }} + + @if (session('status') === 'profile-updated') +

{{ __('Saved.') }}

+ @endif +
+
+
diff --git a/laundry-app/resources/views/reports.blade.php b/laundry-app/resources/views/reports.blade.php new file mode 100644 index 0000000..f23ceb7 --- /dev/null +++ b/laundry-app/resources/views/reports.blade.php @@ -0,0 +1,499 @@ + +
+ {{-- Header Section --}} +
+
+

Laporan Pendapatan

+

+ Periode: {{ \Carbon\Carbon::parse($startDate)->format('d M') }} - {{ \Carbon\Carbon::parse($endDate)->format('d M Y') }} +

+
+
+ + {{-- Statistik Ringkas --}} +
+ {{-- Pendapatan Laundry --}} +
+
+
+ local_laundry_service +
+
+

Pendapatan Laundry

+

+ Rp {{ number_format($totalLaundryRevenue, 0, ',', '.') }} +

+
+ + {{-- Pendapatan Driver --}} +
+
+
+ two_wheeler +
+
+

Pendapatan Driver

+

+ Rp {{ number_format($totalDeliveryFee, 0, ',', '.') }} +

+
+ + {{-- Total Keseluruhan --}} +
+
+
+ payments +
+
+

Total Keseluruhan

+

+ Rp {{ number_format($totalRevenue, 0, ',', '.') }} +

+
+ + {{-- Total Pesanan --}} +
+
+
+ shopping_cart +
+
+

Total Pesanan

+

{{ $totalOrders }}

+
+
+ + {{-- Filter Tanggal --}} +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ Reset + +
+
+
+ + {{-- Tabel Laporan --}} +
+ @csrf + @method('DELETE') +
+
+ {{-- Header Normal (Saat Tidak Ada Pilihan) --}} +
+

Data Detail Laporan

+ + table_view + Ekspor Semua + +
+ + {{-- Header Bulk Action (Muncul Saat Checklist Tercentang) --}} + +
+ + + + {{-- Mobile Card Layout --}} +
+ @php $currentMonthMobile = null; @endphp + + @forelse($reports as $report) + @php + $monthNameMobile = $report->updated_at->translatedFormat('F Y'); + @endphp + + @if($monthNameMobile !== $currentMonthMobile) +
+
+ + + {{ $monthNameMobile }} + +
+
+ @php $currentMonthMobile = $monthNameMobile; @endphp + @endif + +
+
+ +
+
+

#{{ $report->order_number ?? $report->invoice_number }}

+

{{ $report->customer_name }}

+

{{ $report->updated_at->format('d/m/Y H:i') }}

+
+ +
+ @if($report->items && $report->items->count() > 0) + @foreach($report->items as $item) + @php + $serviceName = explode('||', $item->service_name)[0]; + $unitDb = strtolower($item->unit ?? ''); + $isPcs = ($unitDb == 'pcs' || stripos($serviceName, 'satuan') !== false || stripos($serviceName, 'pcs') !== false); + $weightValue = $isPcs ? (int)$item->qty_or_weight : $item->qty_or_weight; + $alreadyHasUnit = preg_match('/\d+(\.\d+)?\s*(pcs|kg)/i', $serviceName); + @endphp + + @if($alreadyHasUnit) + {!! nl2br(e($serviceName)) !!} + @else + {!! nl2br(e($serviceName)) !!} ({{ $weightValue }} {{ $isPcs ? 'Pcs' : 'Kg' }}) + @endif + + @endforeach + @else + @php + $serviceName = explode('||', $report->service_name)[0]; + $unitDb = strtolower($report->unit ?? ''); + $isPcs = ($unitDb == 'pcs' || stripos($serviceName, 'satuan') !== false || stripos($serviceName, 'pcs') !== false); + $weightValue = $isPcs ? (int)$report->weight : $report->weight; + $alreadyHasUnit = preg_match('/\d+(\.\d+)?\s*(pcs|kg)/i', $serviceName); + @endphp + + @if($alreadyHasUnit) + {!! nl2br(e($serviceName)) !!} + @else + {!! nl2br(e($serviceName)) !!} ({{ $weightValue }} {{ $isPcs ? 'Pcs' : 'Kg' }}) + @endif + + @endif +
+ +
+ @if(strtolower($report->payment_method) == 'qris') + QRIS + @else + TUNAI + @endif + + @if($report->delivery_type == 'none' || !$report->delivery_type) + AMBIL SENDIRI + @else + @php + $typeLabel = "Ambil Sendiri"; + if ($report->delivery_type === 'pickup') $typeLabel = "Pick-up"; + elseif ($report->delivery_type === 'delivery') $typeLabel = "Delivery"; + elseif ($report->delivery_type === 'both') $typeLabel = "Pick-up & Delivery"; + @endphp + {{ $typeLabel }} + @endif +
+ +
+
+ @if(strtolower($report->payment_method) != 'qris') +
+ Uang: Rp {{ number_format($report->cash_received ?? 0, 0, ',', '.') }} + Kembali: Rp {{ number_format($report->cash_change ?? 0, 0, ',', '.') }} +
+ @else + Nominal Pas + @endif + @if($report->delivery_fee > 0) + Ongkir: Rp {{ number_format($report->delivery_fee, 0, ',', '.') }} + @endif +
+
+ Total Pembayaran + Rp {{ number_format($report->total_price, 0, ',', '.') }} +
+
+
+ @empty +
Belum ada transaksi untuk periode ini.
+ @endforelse +
+
+
+
+ + {{-- Script untuk Interaksi --}} + + +
\ No newline at end of file diff --git a/laundry-app/resources/views/settings.blade.php b/laundry-app/resources/views/settings.blade.php new file mode 100644 index 0000000..5d6bcef --- /dev/null +++ b/laundry-app/resources/views/settings.blade.php @@ -0,0 +1,378 @@ + +
+ + + + + + + + {{-- Header Section --}} +
+
+

Pengaturan Sistem

+

Kelola profil toko, lokasi peta, dan daftar akun staf Anda.

+
+
+ +
+ {{-- PENGATURAN TOKO SECTION --}} +
+
+
+ storefront +
+

Pengaturan Toko

+
+ +
+ @csrf + @method('PUT') + +
+ {{-- Kiri: Info Dasar & Lokasi --}} +
+
+ + +
+ +
+ +
+

Geser penanda di peta untuk mengatur titik lokasi toko Anda.

+ +
+
+ + +
+
+ + +
+
+
+
+ + {{-- Kanan: Pengaturan Ongkir & Estimasi --}} +
+
+
+
+

Pengaturan Ongkos Kirim

+

Aktifkan untuk menerapkan tarif berbayar.

+
+ +
+
+
+ + + @error('delivery_fee_per_km') +

{{ $message }}

+ @enderror +
+
+ + +
+
+
+ +
+
+
+

Estimasi Waktu & Layanan

+

Aktifkan layanan cuci Express dan Kilat.

+
+ +
+
+
+ + + @error('express_extra_price') +

{{ $message }}

+ @enderror +
+
+ + + @error('kilat_extra_price') +

{{ $message }}

+ @enderror +
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ badge +
+

Manajemen Akun Pengguna

+
+ + add + Tambah Akun + +
+ + + + {{-- Mobile Card Layout --}} +
+ @forelse($staffs as $staff) +
+
+
+

{{ $staff->name }}

+

{{ $staff->email }}

+
+ + {{ $staff->role }} + +
+
+ + edit Edit + +
+ @csrf + @method('DELETE') + +
+
+
+ @empty +
+ group_off +

Belum ada akun pengguna yang terdaftar.

+
+ @endforelse +
+
+ +
+
+
+
+ logout +
+
+

Keluar Akun

+

Selesaikan sesi aktif Anda di perangkat ini.

+
+
+ +
+ @csrf + +
+
+
+
+
+ + + +
\ No newline at end of file diff --git a/laundry-app/resources/views/staff/create.blade.php b/laundry-app/resources/views/staff/create.blade.php new file mode 100644 index 0000000..bc1652e --- /dev/null +++ b/laundry-app/resources/views/staff/create.blade.php @@ -0,0 +1,67 @@ + +
+
+ + + arrow_back + + +
+

Tambah Pengguna Baru

+

Manajemen Akses Aplikasi

+
+
+ +
+
+
+
+ @csrf + +
+ + + @error('name')

{{ $message }}

@enderror +
+ +
+ + + @error('email')

{{ $message }}

@enderror +
+ +
+ + + @error('password')

{{ $message }}

@enderror +
+ +
+ + + @error('role')

{{ $message }}

@enderror +
+ +
+ + Batal + + +
+
+
+
+
+
+
\ No newline at end of file diff --git a/laundry-app/resources/views/staff/edit.blade.php b/laundry-app/resources/views/staff/edit.blade.php new file mode 100644 index 0000000..b6b2564 --- /dev/null +++ b/laundry-app/resources/views/staff/edit.blade.php @@ -0,0 +1,69 @@ + +
+
+ + + arrow_back + + +
+

Edit Pengguna

+

Perbarui Data Akun

+
+
+ +
+
+
+
+ @csrf + @method('PUT') + +
+ + + @error('name')

{{ $message }}

@enderror +
+ +
+ + + @error('email')

{{ $message }}

@enderror +
+ +
+ + +

Isi hanya jika ingin mengubah kata sandi.

+ @error('password')

{{ $message }}

@enderror +
+ +
+ + + @error('role')

{{ $message }}

@enderror +
+ +
+ + Batal + + +
+
+
+
+
+
+
diff --git a/laundry-app/resources/views/vendor/mail/html/button.blade.php b/laundry-app/resources/views/vendor/mail/html/button.blade.php new file mode 100644 index 0000000..050e969 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/button.blade.php @@ -0,0 +1,24 @@ +@props([ + 'url', + 'color' => 'primary', + 'align' => 'center', +]) + + + + + diff --git a/laundry-app/resources/views/vendor/mail/html/footer.blade.php b/laundry-app/resources/views/vendor/mail/html/footer.blade.php new file mode 100644 index 0000000..3ff41f8 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/footer.blade.php @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/laundry-app/resources/views/vendor/mail/html/header.blade.php b/laundry-app/resources/views/vendor/mail/html/header.blade.php new file mode 100644 index 0000000..276d8ec --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/header.blade.php @@ -0,0 +1,8 @@ +@props(['url']) + + + + + + + diff --git a/laundry-app/resources/views/vendor/mail/html/layout.blade.php b/laundry-app/resources/views/vendor/mail/html/layout.blade.php new file mode 100644 index 0000000..037efe3 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/layout.blade.php @@ -0,0 +1,58 @@ + + + +{{ config('app.name') }} + + + + + +{!! $head ?? '' !!} + + + + + + + + + + diff --git a/laundry-app/resources/views/vendor/mail/html/message.blade.php b/laundry-app/resources/views/vendor/mail/html/message.blade.php new file mode 100644 index 0000000..a16bace --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/message.blade.php @@ -0,0 +1,27 @@ + +{{-- Header --}} + + +{{ config('app.name') }} + + + +{{-- Body --}} +{!! $slot !!} + +{{-- Subcopy --}} +@isset($subcopy) + + +{!! $subcopy !!} + + +@endisset + +{{-- Footer --}} + + +© {{ date('Y') }} {{ config('app.name') }}. {{ __('All rights reserved.') }} + + + diff --git a/laundry-app/resources/views/vendor/mail/html/panel.blade.php b/laundry-app/resources/views/vendor/mail/html/panel.blade.php new file mode 100644 index 0000000..2975a60 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/panel.blade.php @@ -0,0 +1,14 @@ + + + + + + diff --git a/laundry-app/resources/views/vendor/mail/html/subcopy.blade.php b/laundry-app/resources/views/vendor/mail/html/subcopy.blade.php new file mode 100644 index 0000000..790ce6c --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/subcopy.blade.php @@ -0,0 +1,7 @@ + + + + + diff --git a/laundry-app/resources/views/vendor/mail/html/table.blade.php b/laundry-app/resources/views/vendor/mail/html/table.blade.php new file mode 100644 index 0000000..a5f3348 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/table.blade.php @@ -0,0 +1,3 @@ +
+{{ Illuminate\Mail\Markdown::parse($slot) }} +
diff --git a/laundry-app/resources/views/vendor/mail/html/themes/default.css b/laundry-app/resources/views/vendor/mail/html/themes/default.css new file mode 100644 index 0000000..80465b2 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/html/themes/default.css @@ -0,0 +1,297 @@ +/* Base */ + +body, +body *:not(html):not(style):not(br):not(tr):not(code) { + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + position: relative; +} + +body { + -webkit-text-size-adjust: none; + background-color: #ffffff; + color: #52525b; + height: 100%; + line-height: 1.4; + margin: 0; + padding: 0; + width: 100% !important; +} + +p, +ul, +ol, +blockquote { + line-height: 1.4; + text-align: left; +} + +a { + color: #18181b; +} + +a img { + border: none; +} + +/* Typography */ + +h1 { + color: #18181b; + font-size: 18px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +h2 { + font-size: 16px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +h3 { + font-size: 14px; + font-weight: bold; + margin-top: 0; + text-align: left; +} + +p { + font-size: 16px; + line-height: 1.5em; + margin-top: 0; + text-align: left; +} + +p.sub { + font-size: 12px; +} + +img { + max-width: 100%; +} + +/* Layout */ + +.wrapper { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + background-color: #fafafa; + margin: 0; + padding: 0; + width: 100%; +} + +.content { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +/* Header */ + +.header { + padding: 25px 0; + text-align: center; +} + +.header a { + color: #18181b; + font-size: 19px; + font-weight: bold; + text-decoration: none; +} + +/* Logo */ + +.logo { + height: 75px; + margin-top: 15px; + margin-bottom: 10px; + max-height: 75px; + width: 75px; +} + +/* Body */ + +.body { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + background-color: #fafafa; + border-bottom: 1px solid #fafafa; + border-top: 1px solid #fafafa; + margin: 0; + padding: 0; + width: 100%; +} + +.inner-body { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; + background-color: #ffffff; + border-color: #e4e4e7; + border-radius: 4px; + border-width: 1px; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1); + margin: 0 auto; + padding: 0; + width: 570px; +} + +.inner-body a { + word-break: break-all; +} + +/* Subcopy */ + +.subcopy { + border-top: 1px solid #e4e4e7; + margin-top: 25px; + padding-top: 25px; +} + +.subcopy p { + font-size: 14px; +} + +/* Footer */ + +.footer { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 570px; + margin: 0 auto; + padding: 0; + text-align: center; + width: 570px; +} + +.footer p { + color: #a1a1aa; + font-size: 12px; + text-align: center; +} + +.footer a { + color: #a1a1aa; + text-decoration: underline; +} + +/* Tables */ + +.table table { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + margin: 30px auto; + width: 100%; +} + +.table th { + border-bottom: 1px solid #e4e4e7; + margin: 0; + padding-bottom: 8px; +} + +.table td { + color: #52525b; + font-size: 15px; + line-height: 18px; + margin: 0; + padding: 10px 0; +} + +.content-cell { + max-width: 100vw; + padding: 32px; +} + +/* Buttons */ + +.action { + -premailer-cellpadding: 0; + -premailer-cellspacing: 0; + -premailer-width: 100%; + margin: 30px auto; + padding: 0; + text-align: center; + width: 100%; + float: unset; +} + +.button { + -webkit-text-size-adjust: none; + border-radius: 4px; + color: #fff; + display: inline-block; + overflow: hidden; + text-decoration: none; +} + +.button-blue, +.button-primary { + background-color: #18181b; + border-bottom: 8px solid #18181b; + border-left: 18px solid #18181b; + border-right: 18px solid #18181b; + border-top: 8px solid #18181b; +} + +.button-green, +.button-success { + background-color: #16a34a; + border-bottom: 8px solid #16a34a; + border-left: 18px solid #16a34a; + border-right: 18px solid #16a34a; + border-top: 8px solid #16a34a; +} + +.button-red, +.button-error { + background-color: #dc2626; + border-bottom: 8px solid #dc2626; + border-left: 18px solid #dc2626; + border-right: 18px solid #dc2626; + border-top: 8px solid #dc2626; +} + +/* Panels */ + +.panel { + border-left: #18181b solid 4px; + margin: 21px 0; +} + +.panel-content { + background-color: #fafafa; + color: #52525b; + padding: 16px; +} + +.panel-content p { + color: #52525b; +} + +.panel-item { + padding: 0; +} + +.panel-item p:last-of-type { + margin-bottom: 0; + padding-bottom: 0; +} + +/* Utilities */ + +.break-all { + word-break: break-all; +} diff --git a/laundry-app/resources/views/vendor/mail/text/button.blade.php b/laundry-app/resources/views/vendor/mail/text/button.blade.php new file mode 100644 index 0000000..97444eb --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/button.blade.php @@ -0,0 +1 @@ +{{ $slot }}: {{ $url }} diff --git a/laundry-app/resources/views/vendor/mail/text/footer.blade.php b/laundry-app/resources/views/vendor/mail/text/footer.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/footer.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/laundry-app/resources/views/vendor/mail/text/header.blade.php b/laundry-app/resources/views/vendor/mail/text/header.blade.php new file mode 100644 index 0000000..97444eb --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/header.blade.php @@ -0,0 +1 @@ +{{ $slot }}: {{ $url }} diff --git a/laundry-app/resources/views/vendor/mail/text/layout.blade.php b/laundry-app/resources/views/vendor/mail/text/layout.blade.php new file mode 100644 index 0000000..ec58e83 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/layout.blade.php @@ -0,0 +1,9 @@ +{!! strip_tags($header ?? '') !!} + +{!! strip_tags($slot) !!} +@isset($subcopy) + +{!! strip_tags($subcopy) !!} +@endisset + +{!! strip_tags($footer ?? '') !!} diff --git a/laundry-app/resources/views/vendor/mail/text/message.blade.php b/laundry-app/resources/views/vendor/mail/text/message.blade.php new file mode 100644 index 0000000..80bce21 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/message.blade.php @@ -0,0 +1,27 @@ + + {{-- Header --}} + + + {{ config('app.name') }} + + + + {{-- Body --}} + {{ $slot }} + + {{-- Subcopy --}} + @isset($subcopy) + + + {{ $subcopy }} + + + @endisset + + {{-- Footer --}} + + + © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.') + + + diff --git a/laundry-app/resources/views/vendor/mail/text/panel.blade.php b/laundry-app/resources/views/vendor/mail/text/panel.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/panel.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/laundry-app/resources/views/vendor/mail/text/subcopy.blade.php b/laundry-app/resources/views/vendor/mail/text/subcopy.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/subcopy.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/laundry-app/resources/views/vendor/mail/text/table.blade.php b/laundry-app/resources/views/vendor/mail/text/table.blade.php new file mode 100644 index 0000000..3338f62 --- /dev/null +++ b/laundry-app/resources/views/vendor/mail/text/table.blade.php @@ -0,0 +1 @@ +{{ $slot }} diff --git a/laundry-app/resources/views/vendor/notifications/email.blade.php b/laundry-app/resources/views/vendor/notifications/email.blade.php new file mode 100644 index 0000000..79c2408 --- /dev/null +++ b/laundry-app/resources/views/vendor/notifications/email.blade.php @@ -0,0 +1,58 @@ + +{{-- Greeting --}} +@if (! empty($greeting)) +# {{ $greeting }} +@else +@if ($level === 'error') +# @lang('Whoops!') +@else +# @lang('Hello!') +@endif +@endif + +{{-- Intro Lines --}} +@foreach ($introLines as $line) +{{ $line }} + +@endforeach + +{{-- Action Button --}} +@isset($actionText) + $level, + default => 'primary', + }; +?> + +{{ $actionText }} + +@endisset + +{{-- Outro Lines --}} +@foreach ($outroLines as $line) +{{ $line }} + +@endforeach + +{{-- Salutation --}} +@if (! empty($salutation)) +{{ $salutation }} +@else +@lang('Regards,')
+{{ config('app.name') }} +@endif + +{{-- Subcopy --}} +@isset($actionText) + +@lang( + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n". + 'into your web browser:', + [ + 'actionText' => $actionText, + ] +) [{{ $displayableActionUrl }}]({{ $actionUrl }}) + +@endisset +
diff --git a/laundry-app/routes/api.php b/laundry-app/routes/api.php new file mode 100644 index 0000000..1390ad9 --- /dev/null +++ b/laundry-app/routes/api.php @@ -0,0 +1,45 @@ +group(function () { + + // User Profile (Opsional, untuk cek siapa yang login) + Route::get('/user', function (Request $request) { + return $request->user(); + }); + + // Jasa (Otomatis terfilter per Owner berkat Global Scope) + Route::get('/services', [ServiceController::class, 'index']); + + // Dashboard & Stats + Route::get('/dashboard/stats', [DashboardController::class, 'getStats']); + Route::get('/dashboard/activities', [DashboardController::class, 'getActivities']); + + // Driver & Pickup Tasks (Integrated into TransactionController) + Route::post('/pickups', [TransactionController::class, 'requestPickup']); + Route::get('/driver/tasks', [TransactionController::class, 'getDriverTasks']); + Route::put('/pickups/{id}/status', [TransactionController::class, 'updateStatus']); + Route::get('/pickups/arrived', [TransactionController::class, 'getOrdersByStatus'])->defaults('status', 'JEMPUTAN TIBA'); + + // Transaksi & Order + Route::get('/transactions', [TransactionController::class, 'index']); + Route::post('/transactions', [TransactionController::class, 'store']); + Route::get('/orders/status/{status}', [TransactionController::class, 'getOrdersByStatus']); + Route::put('/orders/{id}/update-status', [TransactionController::class, 'updateStatus']); + Route::post('/send-whatsapp', [TransactionController::class, 'sendManualWhatsApp']); + Route::post('/check-delivery-fee', [TransactionController::class, 'checkDeliveryFee']); + + // Pengaturan Toko (diakses oleh Staf dari aplikasi mobile) + Route::get('/shop/settings', [\App\Http\Controllers\Api\ShopSettingsController::class, 'getSettings']); + Route::put('/shop/settings', [\App\Http\Controllers\Api\ShopSettingsController::class, 'updateSettings']); +}); diff --git a/laundry-app/routes/auth.php b/laundry-app/routes/auth.php new file mode 100644 index 0000000..658523e --- /dev/null +++ b/laundry-app/routes/auth.php @@ -0,0 +1,59 @@ +group(function () { + Route::get('register', [RegisteredUserController::class, 'create']) + ->name('register'); + + Route::post('register', [RegisteredUserController::class, 'store']); + + Route::get('login', [AuthenticatedSessionController::class, 'create']) + ->name('login'); + + Route::post('login', [AuthenticatedSessionController::class, 'store']); + + Route::get('forgot-password', [PasswordResetLinkController::class, 'create']) + ->name('password.request'); + + Route::post('forgot-password', [PasswordResetLinkController::class, 'store']) + ->name('password.email'); + + Route::get('reset-password/{token}', [NewPasswordController::class, 'create']) + ->name('password.reset'); + + Route::post('reset-password', [NewPasswordController::class, 'store']) + ->name('password.store'); +}); + +Route::middleware('auth')->group(function () { + Route::get('verify-email', EmailVerificationPromptController::class) + ->name('verification.notice'); + + Route::get('verify-email/{id}/{hash}', VerifyEmailController::class) + ->middleware(['signed', 'throttle:6,1']) + ->name('verification.verify'); + + Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store']) + ->middleware('throttle:6,1') + ->name('verification.send'); + + Route::get('confirm-password', [ConfirmablePasswordController::class, 'show']) + ->name('password.confirm'); + + Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']); + + Route::put('password', [PasswordController::class, 'update'])->name('password.update'); + + Route::post('logout', [AuthenticatedSessionController::class, 'destroy']) + ->name('logout'); +}); diff --git a/laundry-app/routes/console.php b/laundry-app/routes/console.php new file mode 100644 index 0000000..3c9adf1 --- /dev/null +++ b/laundry-app/routes/console.php @@ -0,0 +1,8 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/laundry-app/routes/web.php b/laundry-app/routes/web.php new file mode 100644 index 0000000..8f06c34 --- /dev/null +++ b/laundry-app/routes/web.php @@ -0,0 +1,55 @@ +route('login'); +}); + +// 3. Route yang memerlukan Login DAN harus ROLE OWNER serta pencegahan cache +Route::middleware(['auth', 'verified', 'owner', 'prevent-back-history'])->group(function () { + + // Dashboard + Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); + Route::get('/orders/status/{status}', [OrderListController::class, 'showByStatus'])->name('orders.by_status'); + Route::delete('/orders/bulk-delete', [OrderListController::class, 'bulkDelete'])->name('orders.bulkDelete'); + + // --- MANAJEMEN LAUNDRY --- + Route::get('/laundry', [LaundryController::class, 'index'])->name('laundry'); + Route::get('/laundry/create', [LaundryController::class, 'create'])->name('laundry.create'); + Route::post('/laundry', [LaundryController::class, 'store'])->name('laundry.store'); + Route::get('/laundry/{id}/edit', [LaundryController::class, 'edit'])->name('laundry.edit'); + Route::put('/laundry/{id}', [LaundryController::class, 'update'])->name('laundry.update'); + Route::delete('/laundry/{id}', [LaundryController::class, 'destroy'])->name('laundry.destroy'); + Route::post('/laundry/status/{id}', [LaundryController::class, 'updateStatus'])->name('laundry.updateStatus'); + + // --- LAPORAN PENDAPATAN --- + Route::get('/reports', [ReportController::class, 'index'])->name('reports.index'); + Route::get('/reports/export', [ReportController::class, 'export'])->name('reports.export'); + Route::post('/reports/export-bulk', [ReportController::class, 'exportBulk'])->name('reports.exportBulk'); + Route::delete('/reports/bulk-delete', [ReportController::class, 'bulkDelete'])->name('reports.bulkDelete'); + + // --- MANAJEMEN STAF & PENGATURAN --- + Route::get('/settings', [UserController::class, 'settings'])->name('settings'); + Route::put('/settings/shop', [UserController::class, 'updateShopSettings'])->name('shop.settings.update'); + Route::get('/staff/create', [StaffController::class, 'create'])->name('staff.create'); + Route::post('/staff/store', [StaffController::class, 'store'])->name('staff.store'); + Route::get('/staff/{id}/edit', [StaffController::class, 'edit'])->name('staff.edit'); + Route::put('/staff/{id}', [StaffController::class, 'update'])->name('staff.update'); + Route::delete('/staff/{id}', [StaffController::class, 'destroy'])->name('staff.destroy'); + + // Profile + Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); + Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); + Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); +}); + +require __DIR__ . '/auth.php'; \ No newline at end of file diff --git a/laundry-app/storage/app/.gitignore b/laundry-app/storage/app/.gitignore new file mode 100644 index 0000000..fedb287 --- /dev/null +++ b/laundry-app/storage/app/.gitignore @@ -0,0 +1,4 @@ +* +!private/ +!public/ +!.gitignore diff --git a/laundry-app/storage/app/private/.gitignore b/laundry-app/storage/app/private/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/app/private/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/storage/app/public/.gitignore b/laundry-app/storage/app/public/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/storage/framework/.gitignore b/laundry-app/storage/framework/.gitignore new file mode 100644 index 0000000..05c4471 --- /dev/null +++ b/laundry-app/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/laundry-app/storage/framework/cache/.gitignore b/laundry-app/storage/framework/cache/.gitignore new file mode 100644 index 0000000..01e4a6c --- /dev/null +++ b/laundry-app/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/laundry-app/storage/framework/cache/data/.gitignore b/laundry-app/storage/framework/cache/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/storage/framework/sessions/.gitignore b/laundry-app/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/storage/framework/testing/.gitignore b/laundry-app/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/storage/framework/views/.gitignore b/laundry-app/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/storage/logs/.gitignore b/laundry-app/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/laundry-app/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/laundry-app/tailwind.config.js b/laundry-app/tailwind.config.js new file mode 100644 index 0000000..c29eb1a --- /dev/null +++ b/laundry-app/tailwind.config.js @@ -0,0 +1,21 @@ +import defaultTheme from 'tailwindcss/defaultTheme'; +import forms from '@tailwindcss/forms'; + +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', + './storage/framework/views/*.php', + './resources/views/**/*.blade.php', + ], + + theme: { + extend: { + fontFamily: { + sans: ['Figtree', ...defaultTheme.fontFamily.sans], + }, + }, + }, + + plugins: [forms], +}; diff --git a/laundry-app/tests/Feature/Auth/AuthenticationTest.php b/laundry-app/tests/Feature/Auth/AuthenticationTest.php new file mode 100644 index 0000000..13dcb7c --- /dev/null +++ b/laundry-app/tests/Feature/Auth/AuthenticationTest.php @@ -0,0 +1,54 @@ +get('/login'); + + $response->assertStatus(200); + } + + public function test_users_can_authenticate_using_the_login_screen(): void + { + $user = User::factory()->create(); + + $response = $this->post('/login', [ + 'email' => $user->email, + 'password' => 'password', + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(route('dashboard', absolute: false)); + } + + public function test_users_can_not_authenticate_with_invalid_password(): void + { + $user = User::factory()->create(); + + $this->post('/login', [ + 'email' => $user->email, + 'password' => 'wrong-password', + ]); + + $this->assertGuest(); + } + + public function test_users_can_logout(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/logout'); + + $this->assertGuest(); + $response->assertRedirect('/'); + } +} diff --git a/laundry-app/tests/Feature/Auth/EmailVerificationTest.php b/laundry-app/tests/Feature/Auth/EmailVerificationTest.php new file mode 100644 index 0000000..705570b --- /dev/null +++ b/laundry-app/tests/Feature/Auth/EmailVerificationTest.php @@ -0,0 +1,58 @@ +unverified()->create(); + + $response = $this->actingAs($user)->get('/verify-email'); + + $response->assertStatus(200); + } + + public function test_email_can_be_verified(): void + { + $user = User::factory()->unverified()->create(); + + Event::fake(); + + $verificationUrl = URL::temporarySignedRoute( + 'verification.verify', + now()->addMinutes(60), + ['id' => $user->id, 'hash' => sha1($user->email)] + ); + + $response = $this->actingAs($user)->get($verificationUrl); + + Event::assertDispatched(Verified::class); + $this->assertTrue($user->fresh()->hasVerifiedEmail()); + $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); + } + + public function test_email_is_not_verified_with_invalid_hash(): void + { + $user = User::factory()->unverified()->create(); + + $verificationUrl = URL::temporarySignedRoute( + 'verification.verify', + now()->addMinutes(60), + ['id' => $user->id, 'hash' => sha1('wrong-email')] + ); + + $this->actingAs($user)->get($verificationUrl); + + $this->assertFalse($user->fresh()->hasVerifiedEmail()); + } +} diff --git a/laundry-app/tests/Feature/Auth/PasswordConfirmationTest.php b/laundry-app/tests/Feature/Auth/PasswordConfirmationTest.php new file mode 100644 index 0000000..ff85721 --- /dev/null +++ b/laundry-app/tests/Feature/Auth/PasswordConfirmationTest.php @@ -0,0 +1,44 @@ +create(); + + $response = $this->actingAs($user)->get('/confirm-password'); + + $response->assertStatus(200); + } + + public function test_password_can_be_confirmed(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/confirm-password', [ + 'password' => 'password', + ]); + + $response->assertRedirect(); + $response->assertSessionHasNoErrors(); + } + + public function test_password_is_not_confirmed_with_invalid_password(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/confirm-password', [ + 'password' => 'wrong-password', + ]); + + $response->assertSessionHasErrors(); + } +} diff --git a/laundry-app/tests/Feature/Auth/PasswordResetTest.php b/laundry-app/tests/Feature/Auth/PasswordResetTest.php new file mode 100644 index 0000000..aa50350 --- /dev/null +++ b/laundry-app/tests/Feature/Auth/PasswordResetTest.php @@ -0,0 +1,73 @@ +get('/forgot-password'); + + $response->assertStatus(200); + } + + public function test_reset_password_link_can_be_requested(): void + { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class); + } + + public function test_reset_password_screen_can_be_rendered(): void + { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class, function ($notification) { + $response = $this->get('/reset-password/'.$notification->token); + + $response->assertStatus(200); + + return true; + }); + } + + public function test_password_can_be_reset_with_valid_token(): void + { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { + $response = $this->post('/reset-password', [ + 'token' => $notification->token, + 'email' => $user->email, + 'password' => 'password', + 'password_confirmation' => 'password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect(route('login')); + + return true; + }); + } +} diff --git a/laundry-app/tests/Feature/Auth/PasswordUpdateTest.php b/laundry-app/tests/Feature/Auth/PasswordUpdateTest.php new file mode 100644 index 0000000..ca28c6c --- /dev/null +++ b/laundry-app/tests/Feature/Auth/PasswordUpdateTest.php @@ -0,0 +1,51 @@ +create(); + + $response = $this + ->actingAs($user) + ->from('/profile') + ->put('/password', [ + 'current_password' => 'password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/profile'); + + $this->assertTrue(Hash::check('new-password', $user->refresh()->password)); + } + + public function test_correct_password_must_be_provided_to_update_password(): void + { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->from('/profile') + ->put('/password', [ + 'current_password' => 'wrong-password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ]); + + $response + ->assertSessionHasErrorsIn('updatePassword', 'current_password') + ->assertRedirect('/profile'); + } +} diff --git a/laundry-app/tests/Feature/Auth/RegistrationTest.php b/laundry-app/tests/Feature/Auth/RegistrationTest.php new file mode 100644 index 0000000..1489d0e --- /dev/null +++ b/laundry-app/tests/Feature/Auth/RegistrationTest.php @@ -0,0 +1,31 @@ +get('/register'); + + $response->assertStatus(200); + } + + public function test_new_users_can_register(): void + { + $response = $this->post('/register', [ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => 'password', + 'password_confirmation' => 'password', + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(route('dashboard', absolute: false)); + } +} diff --git a/laundry-app/tests/Feature/ExampleTest.php b/laundry-app/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..bd5d6f1 --- /dev/null +++ b/laundry-app/tests/Feature/ExampleTest.php @@ -0,0 +1,20 @@ +get('/'); + + $response->assertStatus(302); + } + +} diff --git a/laundry-app/tests/Feature/ProfileTest.php b/laundry-app/tests/Feature/ProfileTest.php new file mode 100644 index 0000000..262a1d8 --- /dev/null +++ b/laundry-app/tests/Feature/ProfileTest.php @@ -0,0 +1,100 @@ +create(['role' => 'owner']); + + $response = $this + ->actingAs($user) + ->get('/profile'); + + $response->assertOk(); + } + + public function test_profile_information_can_be_updated(): void + { + $user = User::factory()->create(['role' => 'owner']); + + + $response = $this + ->actingAs($user) + ->patch('/profile', [ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/profile'); + + $user->refresh(); + + $this->assertSame('Test User', $user->name); + $this->assertSame('test@example.com', $user->email); + $this->assertNull($user->email_verified_at); + } + + public function test_email_verification_status_is_unchanged_when_the_email_address_is_unchanged(): void + { + $user = User::factory()->create(['role' => 'owner']); + + $response = $this + ->actingAs($user) + ->patch('/profile', [ + 'name' => 'Test User', + 'email' => $user->email, + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/profile'); + + $this->assertNotNull($user->refresh()->email_verified_at); + } + + public function test_user_can_delete_their_account(): void + { + $user = User::factory()->create(['role' => 'owner']); + + $response = $this + ->actingAs($user) + ->delete('/profile', [ + 'password' => 'password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/'); + + $this->assertGuest(); + $this->assertNull($user->fresh()); + } + + public function test_correct_password_must_be_provided_to_delete_account(): void + { + $user = User::factory()->create(['role' => 'owner']); + + $response = $this + ->actingAs($user) + ->from('/profile') + ->delete('/profile', [ + 'password' => 'wrong-password', + ]); + + $response + ->assertSessionHasErrorsIn('userDeletion', 'password') + ->assertRedirect('/profile'); + + $this->assertNotNull($user->fresh()); + } +} diff --git a/laundry-app/tests/TestCase.php b/laundry-app/tests/TestCase.php new file mode 100644 index 0000000..fe1ffc2 --- /dev/null +++ b/laundry-app/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/laundry-app/vite.config.js b/laundry-app/vite.config.js new file mode 100644 index 0000000..421b569 --- /dev/null +++ b/laundry-app/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], +}); diff --git a/laundry_mobile/.gitignore b/laundry_mobile/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/laundry_mobile/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/laundry_mobile/.metadata b/laundry_mobile/.metadata new file mode 100644 index 0000000..d044da8 --- /dev/null +++ b/laundry_mobile/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + - platform: android + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + - platform: ios + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + - platform: linux + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + - platform: macos + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + - platform: web + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + - platform: windows + create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/laundry_mobile/README.md b/laundry_mobile/README.md new file mode 100644 index 0000000..fb487cc --- /dev/null +++ b/laundry_mobile/README.md @@ -0,0 +1,16 @@ +# laundry_mobile + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/laundry_mobile/analysis_options.yaml b/laundry_mobile/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/laundry_mobile/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/laundry_mobile/analyze_machine.json b/laundry_mobile/analyze_machine.json new file mode 100644 index 0000000000000000000000000000000000000000..37e6cd79b89c091591e0c9f6e8fb91b74c236aa6 GIT binary patch literal 1190 zcmb`GPfHv@5XIj)knhl^sOTxQa2>w^*-`ZALP&3 zD)1Vx8uSj|5BCt;~{8?{vE2|Z_Q7ui~Bdc?<> zPB^RMd=`0(S`$0a6`%3?(T6@&kI)+sdfL^Y_E`_KhreTTx0Z2lR#=xRZ^{0&R7;Q8 zT|V=labi~HoAWuUi)C}c!+ultdssi?zZIQ3j;hUiO1#-64XM>^y>piB$h(T|%F4|f zw}VWK={{3&uzK6wJO5JH*cszO5AV)cw!$ zx7HPBSl2iEts7y#GTrXn34A?$GOi& z8MWW$8*`BJ<%qZEp$Ag#YQbpY*2c_A(xtAo!}^U{{H9&gsa~*T83wBgt}Ri%xx&)t z?!*~WQ6qC*pm}<7MXutMd3&uZvGcn-k2jb*;V$0k8C1W!2~t>k%`eSaa%9H#{~w>$ Bw6XvI literal 0 HcmV?d00001 diff --git a/laundry_mobile/android/.gitignore b/laundry_mobile/android/.gitignore new file mode 100644 index 0000000..55afd91 --- /dev/null +++ b/laundry_mobile/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/laundry_mobile/android/app/build.gradle b/laundry_mobile/android/app/build.gradle new file mode 100644 index 0000000..44da1c3 --- /dev/null +++ b/laundry_mobile/android/app/build.gradle @@ -0,0 +1,46 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" + id "com.google.gms.google-services" +} + +android { + namespace = "com.example.laundry_mobile" + compileSdkVersion 36 + ndkVersion = "26.1.10909125" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.laundry_mobile" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdkVersion 23 + targetSdkVersion 36 + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} + diff --git a/laundry_mobile/android/app/google-services.json b/laundry_mobile/android/app/google-services.json new file mode 100644 index 0000000..1f9e228 --- /dev/null +++ b/laundry_mobile/android/app/google-services.json @@ -0,0 +1,30 @@ +{ + "project_info": { + "project_number": "735903066829", + "firebase_url": "https://mylaundry-d02fb-default-rtdb.asia-southeast1.firebasedatabase.app", + "project_id": "mylaundry-d02fb", + "storage_bucket": "mylaundry-d02fb.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:735903066829:android:10c85ce58e5069323c1784", + "android_client_info": { + "package_name": "com.example.laundry_mobile" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyD3Up1sdJB9tmO2Zw2eR8z-obOWGGzgjd0" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/laundry_mobile/android/app/src/debug/AndroidManifest.xml b/laundry_mobile/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/laundry_mobile/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/laundry_mobile/android/app/src/main/AndroidManifest.xml b/laundry_mobile/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5c237ae --- /dev/null +++ b/laundry_mobile/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/laundry_mobile/android/app/src/main/kotlin/com/example/laundry_mobile/MainActivity.kt b/laundry_mobile/android/app/src/main/kotlin/com/example/laundry_mobile/MainActivity.kt new file mode 100644 index 0000000..4ff8e6d --- /dev/null +++ b/laundry_mobile/android/app/src/main/kotlin/com/example/laundry_mobile/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.laundry_mobile + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/laundry_mobile/android/app/src/main/res/drawable-v21/launch_background.xml b/laundry_mobile/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/laundry_mobile/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/laundry_mobile/android/app/src/main/res/drawable/launch_background.xml b/laundry_mobile/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/laundry_mobile/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/laundry_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/laundry_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/laundry_mobile/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/laundry_mobile/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..72c9a6f19cd6a0d2903dfb6260c696e68246edd7 GIT binary patch literal 2307 zcmV+e3HOp*{u0l5Ew*b%-tPLQ>NRg~Yv*7S4Jwe)RQ|K%!W{=x znuMt`gvJyQh2xprXI?bsJiVc({x6kX7hm1S`SV@7XI0h##*i~hm_T&o)Aq2eK znjV`#6xJus+*CzRE?&`AyKWV0xpH%0j7T6#&Crudk9??|ID2W-m?{iSLhgdhvQO)7 zRzFqhzH_NQ@K}&QWaZp%;`pIbGm|Hk9<8}q{nSGDolDpK<3R!?FW9x~eiX+Km6}P* zC^>Yz`Pk!yoV(izfdY|)Y@GJwZxv-21Hg3J%+#WNRc$qEo(I1`lqP{D)k;XnQV2DE zkH#3XmTuB#E;(#(`K(S5i1-|#luK2saH`n77egiGZ++F?^4TIx9CG|aYc~!$*?kDj zgoleX$#WjS^rXiMRB9$iX+p6G!;~j}j_Hg=B}x+^@T9eXGp8PS6$|RyS)jZ6Fd&Xn zl#@1j&O)r2I6Gfa765`Uz4@nv9Tdq5L@YM71(+|F0aDPzt0&CJ!{L`Bgpit)d0H_B zq@KFyko^mlQ&DOHaKAYm+*FOCF{9i%&|aGfF4O<|L;AR=tO=lLHT5;WqR3|;aDV45 zbSjL3F*AH!1S-1`T+`|ikG(v(tn}tb0kK$2Ey`w6wxbvgkV-{2%m%vg5&3p%lo1mG z#WKbPlEH`xq|+cMEzrOtIT#q4f=&wu|7m35l-UCwc9bp~gdlG!hQ+hgFf~O5ULOxv zZu;Qkb8cw=!8anO7!iTyPmhD$>y41a1Q&%h#ad|Z;b7p6-AC=^@ET!MG7{+Mmg=wbPGR{A#?O{1t%At--LD;y$Z`2LvlSG@4y85b;@tAWRV5*Ij)5VNvK z1MzwUzdK+Pl4>~TA}C*^g_oZ-02Od9KW=nz@XqH>n3Al5iY3}0J~`r(=#!|)4@N0!_C9y{Z_E_a_~`|OSr6FdRn}nS~5osdp8)RMUsGD9I2oCt8ZD@ z{H7HguD*G)(^NuL3&i{x5(0&Zhy^lbs6=CgED^_#zg9cI<*ebFrvh^(SW5wSqY@#1b@OQ$%oyj$ZGuHS7Dh%{7j2)^$W`yVN;;UZ#z zXpNY*JA@%TRO5sMJq26JbfRNHA_eFhi8us434f@@@*De5h*%&_BEJoGsl0x|A>^!Q zi?yO-evw`{U=zOJVB*w$>j^1NA20D(IC(A+ip#lZ_X zY2egSCQ!Jn_S=3GX9z|yU?9xz6^vnY6#2WuKN>SW^fqF^Jg;X;xkwhy{V5-%OIt>mOF?g%$?s z9sU08=vJ#xhzWrR-v7c0NB`{t4Mt$GhuZ2#A2A~kfy)Ena>tH15NiU(BE|)hfg(n6 z=;s=G%$PTdqZ)Is7{#%Gae-toE|3hy1(HF;0!gNA<#z@n&LLufTJMM*@9iIycfq&1 zeZX;iP*ooeuZRWu^t>BZEz$~4a}Zo^^1|QGxg#brQs}a9aQLJPRxj@BSX%5nyz#Lk z;`t&riXJb(>M9H5n=numg7a5cB-~Dp0i*cxVLKeJbE8B9f^V*Q!Rp|ZFp7P*SjfWx zG4vA3-I&YQWqKv!MsZ|-c>s6hx7F@_V4tJihUwIFrHRBMcpiA{b=C{}M$;2Xf zpR)~ndK%5ziL;g{O(qt>TCX=^$F0++7*qL+N|T92xH`T*i|s8nwLIswAqpFnCKPM1 zx7Pj>llQ}IO~(&1rj?;z36Fs{k)s{sb9H~`XstOT_@M6p?%iq3{>6GkVe#{FF=zs# z5z}pcqmuWzIYA)S@?E>7;oy#h8PB~k=%n`vJl3YV9`jp=A#k(Wb@8=5^yHEiY9_l- zQFaQ0=e)h`r#G(y-YcxGy8>~nm2LZ?qI~kQ6Ll&zlc6X}#eleuvs>4>IxaN&M}qcZ zp6>dVw%UrN>BR>>SE-p4MK~%1azCc~@}GZgZFuKM;J9eB>TEk>CVvr=QF7=6rqdpZ zDocgHb6$JL*{u}=#eq-_GxwcKSDTM5o|{^2pY~Uo?i{u{ND0Imgv;p+V|+ z$aV+k?y|Sltl6l~TK*pSqYq6&?)*_@8fExg-B-KKZ&vo0_rLE?$WoB)2icoH`O@C} z$wF<)ya(yb;xb)o;Q~$K^gK#4VG2SJ^fHDlD}`c&`@LRgJ8NxfaCKZfM;x-FwdOSM dbIZPU_kXy81ZCnKg`EHZ002ovPDHLkV1l^#U&8i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Um{aq&P&6Ao9)g1*L<7cE>V7W%1UEKhS4Dj*Z;&ceD6DD2dla_OZ{3tUo^YEKTVwQSuENX;CAEjn7=Ek4>LTo09YL zA~o8K1wufK$*b4W+~j3B;V9s?+(g&BbC5Iw*qSux8)m6qgG+ooi`GtK0TS&7TRRVwOCOF>;V~dX^>T>1 zm>I6-`x%viXaj+fBWUjMK=6!B07ZZV3kA0bwAx1A*oX{FiKVb>T@*4>84yC??Dn9v zq6bA~JY2$vYh%rmdc3`oLtHfF-Ttp$z=vNu@$YrzjVU%D7x}ipjJRk`|Gp@e!W+vu zJetbjts)279g?E9I2};9!HA{v10OFQno6VOeKXb<+Hs*ynF+-Pw&!vI;{8dR!Qf~? zH1Z4WXu36g3|KAj#U?WrJ;)6DyIxDM>*Xk{*lAOwOOXLR13bNOptsIma-pQ62k)-p zFnf}(iRlwHII_)*HM?!N)j9Z;U^KvijivzcEjAH*j`MgVnZ`>?Snoc$%{kL(T)J`R ztDwk0>Qov!hV*amJHg}PH38LE+&H+&g!Ea=fQhYU}UxZHpNj4$)lPFf)noSk?=~P17B_qjZ=rigUsOA6o!f)Evn7LvWdas zXGpA(XMbc-%r>Kj2HI}M4I~sB8?&gQpn;VJos0UBxN-f8K||25Iqt!6hULVh@Rfj zN*tc6O#-IH`BtOXZiJei})clvt1kC3H=+g5Ykdg_^#`nZK@ z@_Se=ad8%7N=hMwjO!>RNs?ROo9pDE(sA{8iG0J#nGfcFWT_{-&Gf({00000NkvXX Hu0mjf*5u_n literal 0 HcmV?d00001 diff --git a/laundry_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/laundry_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..09d4391482be68e9e4a07fab769b5de337d16eb1 GIT binary patch literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/laundry_mobile/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/laundry_mobile/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6700a75175d95efb250fc1c45d8e635a61a373 GIT binary patch literal 2786 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 oX0AC=YOFqf(0u>Y?be*@|BpK<8SeAyeE{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/laundry_mobile/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/laundry_mobile/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcb8378d35974c124c2da9052885fce21cc8a4d GIT binary patch literal 4266 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/laundry_mobile/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0dc75f953cbd259dc2c482910949dc1d1d221c GIT binary patch literal 5330 zcmch5WmMEp*!FKhLK^8#1*LOo5K$JDMna@Sa!Ki4q+z9`K^g^VrEBTNr9onskOl#% z1=i)^f8KBJInUSU!!`5antNuhx#ygFu8GmnQYR;2CIJ9|Tmzz}ciVUV2V%n8R&U9P z2moj^HPjv(_~sle-}R*R$|X8FL>vlyCcT%;nV3&SOrnOz|Cnf+P32CTx}~=whlcXHNyV8_KlateX zU`m!XpMCK9-&H4tC;Y?6X43o!Q~vDEx(ielR(>fSJ-oC^`1&0aH~Xm-@yEW*u-Nby zzU84rZ6lAzaP{ZRPyHZ41~S8DDCe*h*)lLYmL;cvBw0Eb%_4IvJ!_$Gah2^jTi%TI zk@kgNNDsYAZ~{S?zpu0u3y_jB&7T3D@7slA@W__OVt#>7l<%e^FJJ6YE?PKX2X^gl zRnX}n>WV?4^HcDj!Bc!P*P7YRp6{0UH=s%LoiJb1*SMhBI_xiJsrw?$9l`Dqt?#Em zW#-z+0OR`g-rA3^V-QBkEo#Ekv^6P+lQnE6D;bRRH$y2PS{>DUa2pXHiP8>fuf5bL zVMWN|k;(p!I(9fYbpT2&8y*kWeaMrC8J*ZmA8}L;*|y5t(0!7 zWDuriduZT|160c;`-aH%AU6xL$>0toM+!4$rydL{wFa!F;wi=gAs}AC<0b zar}9Ei7R2y5BQcfB|8Dwzh`KZWI}~5;58;@pV1g$-nc(+ZqeZD81!pWkL!er76=m> zoAj8x4v|=pctDz&OI0fxi5qH;Xw|&?i_*aL^VyrGDN+)ZtERJZ`&GW(u2XlDPkCp} z!_d8v*x3jP8)MMQ92VQ{sx{gnu+Mxq$ym>2^*MmM`d&z0phfc@z~tsFuov2r)$nc6 zSAp-JXB)NKoSziD{Es3xe~rS`5T8xqxe#qm>xhob*4?E>R6mV3jy^xVU zH)Zmfm!6T0sYt(C_>l|_m%@My-fz3zV6HR`+>GmmSNLFOmb7C`JF=HjF*O^phrRH? z>$K?4$k0D3t(c+amLgPN%Wn=jHE_xOb&1@%14BeIz|T_ZWmMl;Y7DiGq>LZpehv`+ zBv-j{@UW?dQ!$AW#{EE_W_q=9T<%m%zBKv{Z+bkx9cS4m^Q8C0KGO^Sz0^| z)S8xq3CL!?>f_GXqN0)!BBA5%JayA+U&^^he%XXuu#Z2m=S;u*C>>bPU6KA ztTbau>&(xk@(*RU+|Am2~(x15$d z#PTZ-!AEB@u^4T>t`)7sA~j9%`6(i%(J~%SOUdwN1H3PWO;JJ23*BfxxmK1xtEP!H z8}vhtQ*s`GH%f#7SKCg^bNX_X{}6ZVj!3i8&^qTn@*r!omTfO;oMSD{gb-#{;>lGT zJ9RzbzcWWYR#bvckNyfkN;nYYDu-2Sfjj6h2@=!myj5-4F7=($eh@W-HT{#xM6`Tr z6_4TNCvL?o6tF2{l;Mm|3vpn~Qp3DI7@u0OP$lfoFyG;Ro7((cdC4d+7&XPNYV&O< zpQrm?p^u@e9D?Z!P5Wx=@8}i3jD#t_$9jbTWYkcJwgXP0!hlM$yrUiO(HVFuuCdGg zRTtp3tF2FO444 zV)VI#`z0E*3GN=xAhUL6HijwPlbvX-1kAF@)2!><%L!?LLWlniVhq415aaYBY($(4 z;w>&yL1swvBuFCan?9S&>#5Kuuh{Gz@80~bGfq#c=qcIpe=}*8kmAd><|K$wYBrV4 z@gz7JoA3?{P{oujJJL#kAlj2w=e`0i%vO<8vuFH=2W+gdh@-d5v(kaDehHg?bnK;! z_xndh^CiCaty;+X(>x2^J1}A+|ocU&0S_e(VgO#69p$x^Jk$;X0(Dd9tqS!;QsXQ{vu@|OCjoOPV z32R=EX~ND@qD{0@51gfXgis)cQws`qx{inKYd&4qJZOPM{6erx3R0~hVcCAO$wCVzz=wNL9Vzs2-) z*97L$^gOZmQtb-~5d2KX;8cQIVh`eqZUK51jonsn`sf~LY$|U(W2qXJE_6#}N#(P) z3v*o(rD4z9RRMpM^y%_<%ECXEW-|<#CJ~PHA1WmQ5K(p;|Fp;s1W?TTfsv5|X-%V=F z=eF1&3(s(vt0%oy{dz;7jmve~95R~7^@r6E%dTrgAve$%FJ7cx_5L4yL=(jn z;?Rq7ooUzX6v1l$bmMP0$`ga;khA!FL(u630iI+{dkn+q&SdnU>4}QMX0^@*I5ZiG z`=QBZ-L+orpCVlJ;u~dWY3Q?eXFBScfyB82(LMi0W*9z5I3rJMcbOnQe<2dFDEr58 zM(w8fyT;#J-2Ul!Ew{&@MGZ~mi_;pmoG8jE=FD9T&M5A@B7(Vw^i$AxEP9NoR~omL zNHvAOK@CKs-`L&#v!0N$u)rm@$Zm1HLqh;Q{JRG6Qa|c6Sv`=3kJ5Xuh$#=Kfv959 z*@=%V*XQ=OewxT6%=(6HUH(3ovRpMFdhf4(ZejF9p4WTv+7<$7o12$M~SVW~43bz!{74iMF)%&H{ez$zWgFPKG3I3=n`;0`T2_wNE@`4i4 zb{K3wfIAfFklwsrJSJuNU?={}->@v_ATh&Po3qnu^~S%(Dqv0kE`eI!preH?bv&!M zGsV)Q3^_Z9@h;{K zZ*)$Z&?IW7*d`7?dY4%y4aB&2P}2=*av z_1(D6qIjby+U9_v`Mp*_CY*3Z5q%qrjSx|-y9{q1!h#>KezQH*)HjmneY(iwxw>^+ z1SL+|pYGbwMMu`$Dib^!E`d}%)3cT@j%@fU@uPG3Du%)f1vjb(jgu;zm~4YPnH(LW zrl-$6A9xZJ&5rQCVgaf<<7%=@c|yLXxKP%)>Ei`SpbOXsCI%3zq9F?F7gn1 z3FE{V0kNTFin98H7#mtxTw*z!p2s512tUA;Si~0F*TBcD1E})8l0Q9G;;2_7DFnhF z$9mf@2Ituuwd*d@D3PdS^twd#8e_^1sN?ZCVHpQH#ia)^WCSXlVv7Y3okbcZ5|ul> zPEp-YofBmE0cyQMw!#K=1zLc5aG64Pk%yfG2DwdA=>atdfr^@5!;|TANEjZcc-aD% zV?gm^P~z>BRP~CJx3y0V?j60rzH?jZXdUF$oD)v@fqU{(6vr1^2WW}9#%x6J`3B|d zvV$ZLfeK-uyypowLvG$)+cpe=?M7@%foENGw{$+#M&fbO;IdcH7WUmO-5B9R-I}#_ z`qvm6HBcfo#|MX}A2TGo;ZR|)mAwUijl0=)dI9-)i!xcN#gX|0}owiz&8Q0+YdAM ze|Og8o4Kb9eZsW-MwPzyw7FCc5T=aE)CODqYS;RG+Tm8l(onxzYqb1*_KVH`v}b1H({`uq!WtT};~?Q9f{fs{$p~uhsD`Ze#feK# z`?=86?0ZCG1pt*0agzWF1^)?h<9HaXC}#IlPjsGE=p$8(9}7jtZrKu6QI06T(px(S z)+5K(BlxtONA2w&p1wFF_S()U{PWV)qMbiH=+c5IOe1NSIEit9;C%W}K+bLRB9EZc z%mk}xsyQSuJKgpx)<8YFm-$@eMt=*9Y<@6bA95K-3*3v7i7$72WMR5=>AH0%zuwk| zX@Fpuaf&>(UQU&F_Vo|DkBH+Vq>F)@7Jv!E_iAM~8xQ(jm;h}549-a`?R7`b99$s_ zf7}G3taRTHrMYUbAI~$hO(9cCWK@gkN`-`4mQ79le*#nttPI=prgPY;TQgWqU>$T{ zB!TMg<kCd9?Mdu|s;5HskgfHXoR|AKrvUe&p1R#s5~`I2ydIn&2ZVzEqYx zpj2n^ewk&ncYpEzt^bUfNf-8;H*NiTu9{%sY2T|~62}4IXx)7zI;(%WOPrM0xVrM< z;|BC*Va7w48PML?wB~CVWzAIbp79o)Ri7rgn-q;UtH*7d7K!*P2o!g@-}=CEtyH1R z+??xiyEBudw1i~ ziaf!*-D_4qGQ7iUw)ZhIw2Qmxxhij`yNrQRi*H+NAqG-96&@4aB*hJ&A8&lqsXbiiR(p*7{bsx>Mukpc~4?W&WD>tPnP5RxNq@!3G zx|%FhmQ1TQquFUwYu3nZ^w$0_5*dqpXq+Tdy5d*FW8K7fa{sp=DDN7xuq*U~<9E8O zm@WUV88-{1pooKPhmFB-Y2Qhu;@>>Wy7H9hi1qmCbm7aHvY;0)dUGnb8#T_r?2gs` zhnw61c^cU*3BFkBqN1$>PkF<8p`V2KUYLJdtgjg~Z8bV&k$c`?>HjE>@)lngu3xqx zv%~|Rb?1K|fY%z7nJ4tp$CK_m&m*v9U;cWzUbBqg>$S)KhT7hyUG5eonj6))bROtr zrA9NQQfFsX%9WRf=U-{oz%eu3HwG5oI8x)@2d2<9sNls+I$is$F>Y>-HB + + + + + + diff --git a/laundry_mobile/android/app/src/main/res/values/styles.xml b/laundry_mobile/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/laundry_mobile/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/laundry_mobile/android/app/src/profile/AndroidManifest.xml b/laundry_mobile/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/laundry_mobile/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/laundry_mobile/android/build.gradle b/laundry_mobile/android/build.gradle new file mode 100644 index 0000000..b2a9909 --- /dev/null +++ b/laundry_mobile/android/build.gradle @@ -0,0 +1,32 @@ + + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.ext.flutter = [ + compileSdkVersion: 36, + targetSdkVersion: 36, + minSdkVersion: 23, +] + +ext { + compileSdkVersion = 36 + targetSdkVersion = 36 + minSdkVersion = 23 +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/laundry_mobile/android/gradle.properties b/laundry_mobile/android/gradle.properties new file mode 100644 index 0000000..86c765c --- /dev/null +++ b/laundry_mobile/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true +kotlin.incremental=false diff --git a/laundry_mobile/android/gradle/wrapper/gradle-wrapper.properties b/laundry_mobile/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..afa1e8e --- /dev/null +++ b/laundry_mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/laundry_mobile/android/settings.gradle b/laundry_mobile/android/settings.gradle new file mode 100644 index 0000000..9425689 --- /dev/null +++ b/laundry_mobile/android/settings.gradle @@ -0,0 +1,26 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.6.0" apply false + id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "com.google.gms.google-services" version "4.4.1" apply false +} + +include ":app" diff --git a/laundry_mobile/assets/app_icon.png b/laundry_mobile/assets/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8109f2c4e8c21bf57a967f663516798cb1804e13 GIT binary patch literal 9232 zcmeHt`9IWK{QsFDGp-ovT0)jK6&VVVWhNDMWw|J1Em^WJ$!s&WM5{w z*}|X*ligS|XiS!2%zWOu*L{5dfbaL0@8k2sJZ8>0ujQQA>vdk|oY!;io0%92{wDbw z06_5E+0*6#z@eXTfaHU|eui|fL0_;yb3=Vl&@Md#HF(`l8lME9C|-blc^lN`_d9D7 z2!PPX%@3@}H|r_@do#|RK4}@^FgNJ<(7rcF)=6*jPoDux)iE=n1+%c`7(mht9ka++ z_=vT@qWJFA1Unr>4!jeR=2v%8xo2PX=(2{71=ZcD!Ow|W;N5UfzS95F9^5t2xWvED zj%!>HMf`T>Sn$3-o{c{_c;6yV`_1|JW2e$81G#yT?d5osu&cqxW5KQqOVv~Kl8z^P zbE;0%ov54bbB`DcQ~Vg0pqS3sg|C$IN%d+w=_wVQ6qsn9b7ruzD#~#C>krv+h>Hfa zK*f&~=FW7A5kxD5O)O}4iTS+x3W;hmkXk_s>AI>Io0JOcHG8ZVb;H=OAI$1=iXs z5)L)!p*M+v73PS7iplFs%c7Ypu*0enak7uJ3tF`7vr{e(Bw#AVacT}|ZWhQoN6#o; zBGw|hjTI%iUxU}f**jonC7*^AZ{n-!#!&h+#Pt2q)uO)i4EnYl!_xlMa+zyvf6y5T z8Lp^3moAv|QJos-NJET#ALJ>Tb)qU--aS0T=zoR6*Pa&kGax#PhMzNCrVZ1?g+OoY zvHE3^X{>$ZVp=~7XyPeGMU-%=h2=KUe*JHyDE!Cgbmi$6JVD)8TZaa_Hg3%GI2n}5 z{B$3y4+`oZ%1j|?0?qeJAqUP=!@ETk&8b(1rzX(?z|~VTs*Q^0EvLNl;K8bhI#)QT5_=OStSV2Yk@F5(?8TpIs z~)7@qnqbFATkcs@%Xjtwe{hrC}-56a03d6M@NLG&CmDJ!1J&J9}9AT`GFf!+RZ z>5;XCA%8B1yaGfEzI4VZ7Zlz58VCHmFFf)d10qYyg39RkYqN6&ILYYWz)vi?Txh8F zYljC8g!xqX7t^1-%3pnP*5^B)5PBt6G@*#fpBWg z^@yMdE2?&GVaS`p%rzL9Gqyc+Ds7LZgtx9ahX}BjHS2_ZlUwyJxd@tgr}?n)fE?AH zSo^-}!5KlH6&`#{_8R}q>R3+RDgqzVUt>8J26{JOBf=hbsF5lRXgjSt3$t56;HlYH zbn&y$j66m25PpNQU{a152I5z?;VVyAEDvS$Ud;J?knp*Uh0|g9ob@=qNC94F?{Z=1~;G zm)lyZaiH1L#|>7qj=0rBt{p!eSYHNq*JuH(^B58rg-AZXYg!=^w z9%`V~>!5be=dW@7t!Yuj;yEa(Zr(kL|9w@>bv9z(hp)l!Av zq2+AD;GwmNVQS?ZiPLzbb}5%I#G2v$KG1EEAi=ub{5+V~sp|?8YnX2DAFUndhiXX^pW`)> zS(gVn1X9JZ)kIk}jxkYYGm%5WpU!g43JI)yU*n;oq`2^Bd#r2b%1M-R?!HsVNL(o&E6zV%S0;P`ELv-prH5`7Y9d<&Fs*VmO4 zfLYz4HMOAOi}yV_{)JK0dr61>Zti%=!NfUlTio?fgHR(6>Jgg+Ha~BY%C2-oBNZkX z@EI=>m0hR@d&h>$y{PzF=vDKAUD6Tx%D)Y(*JRZcYz)T^h?qr*H1GGRPHE!9l(_a{ zo6$EogM#2ACA`%XURf`Mb19)T+dy&b=Ru1eoaJU}$Q;D*kM9tmdxWguD7$4jxs4s* zYVp#@*KK&(-4p_E@jb-iQ)7)1+}b*+e{~oB^c|W&HH>@=$d&d56?zrFXrTTU%!_rk zBJis~q2~kXm(!pglJXK9;-uhuR&DS)H^gC&8v7>{@X}*5;VyysCw25H*ie7LHhd%0 zSvM+YlpIB#c9N@vSGKBd-KoZVA@>ZTkT21LS} z?$-6X=cqHXoSIuT$dCIvqQ)5p7Wtn#*wq*x_IZf$QCy=!3kt4PvoW0JtM)ayX3ipB zBkF)00%DJ~n0B$qKc`dsj{O2J{U~qyag%4Vya8E3JBglNe7vFj;PLZnfDhF=s#zLZ z1!=EeM{6W|7>^yg6Gz}bD}Mu~V-Y3Xy!S@8qLk+m9bx362#~A%CbKOf&Jcde2M+dG z&AtTl06)MBn&&sfgNGKU4W$G%v^!v%U0Gz)NX{#R7>ZJwlQm~MRv8W~iDgHkyV3zG(<+9h|j&+im zjMQTS0HU$pH206I@WSJ$79p*yMWzW;|^KVdSeFKl8l@%X75 z4?74X-&}_8-wwRM=kS4qF2cs>n{!R4k1aefV>B@P6Yl5fh-F(*Fk zI`p}Q$z$UCmsP52Y}dN~HAUM7)dp(K;`13a41d3ZqZd2-gjpc&PVwL(t;$`?NfA-IK&>6^hbV6+J*Ngt4au@Xl;7Ycs>aDAfxEDpEhX*w`4uGH5 zH3H8Y{@}P=tf2*5N^rS1`GOHZJ$bliwSHIWqFcHwFJ2~R$(~C&JpZC>?8TXTq!R1Y zZy67cNwo8A%0E^lS+N|vv3?;Bb#I&XM920L5x11Fg}hi%H=b1ES#cQA@QUchQQuix zOD!pKUJxUX8nx6ZyOG6Uc0p;;^!nV>iToBSaNXaYd}Q5$bH?hHyMR}}ly=HO04p&-g#6DOuP~O&U46;&fIj*+c z^<61x*Dt8$RuJqd1!G^FStl$|Fya-}S2jzS^3#@0l$0+c6gZgr{i~9GgL3B0YyXGg#c+s%vrBb7r(wW>ZV9+Py^QDk#EYAcv^raBm{`MzS!GJ!b{epqbp(xhy8 zcjV+}S!0vTCd~)obmwUMBffAYzPuRdAdoyz?an?Pu5woG6Ozw9BBDt6ou<7vhjILO zL9VOw!Kh`)dES6sL?JkK+v}pMh3@nT|KangyFy$C^0g&z;aRg+nDN@-LRGOt(*puC z!92SD+`u^60m!p()xKlBCsVjfW8Aqfd*g27Su+rA7rSdnLp){vYTZ7+=b_OJ!r<^@ zRuReHYl0zTnYzesUqL4gSA7$KyB2ydSpV$;8 z@gk=Eq!IG@%K~+-uO6qRdtq(muO+IS|Bcr=7a_vGV(;&vmDXv#4Yi}iigxrDPOgV$ z9+DsVQPsnCM#nF@>EwmP6)Wd0c|qqTe!O^|Bi^gr>ijbCxthal^BPv(Da_uJGbN+N zo+#e9TKl_7tkJEuc<^|jsqX2*GXivzDX~p-9Zk|(s}b&WhDc?(Ek_Ci)8sxkCam4o{;0ht#^U~)wgnpBTn+7S&`KDMoB z%f7jV-w4WPk=DMoj~~6rI@WGGaQSh*80$`S%ns-tvvQZ9*!1O#XId=R=YT%BF~i48 zVjr*CCI`DEF+;ufVG?ZYc?)eH0+RetF`TARyQnF?Umx3Ow5RK-@DFEu503v^4;u>R zs*dNh3BHCGUtc^36YdpHiqthlPK!}+%f*9&!b$sEoPWu%_9kQ(4}96ndp%|nBTJo( zbIFr>y&DqlmEio=EkXbm)Wx1skoh|yd#vqp=)-Y2uulxN{gWjlZ*fr~=^QdEVG`r$ zuS4~qCJ9kfz+>yO?8)qIQ}$$k})7GWD3q6rg;qIQ6P?(Ns?v}kK@}1 zw#lu|S6RIHH?Ol@a_F{UzriZ6ablP1Eh^`EttaO`(l@zm!M({#GR_+MSd(P#m`nc- zzw7h28&!)V;8^n~&yRiW5@#ata=hcOS!hGAx`b@8CG0*S1BkKzS(^G_t0M0>k%jJ9 zh+H?Eh=13;X7}3m9!nJ_mu<>Uva1H1K}?T7--x8VQ>7YrVy%TR`EC2OEw{@Dzl$H7 zi{!)y?q4ObPU^aWf*tT@rTPAUb3g)=i^+%4W^+uG&h&(_?2K1 z^qdU2g{OXD2exS7PRkvNe=@NX{MDj?r-igQ=OqfONG0POCQ;vn!Cy!5Q$|QlX$s~z z6XA^n=XQ~q3cTkHnH?SMlTwgMz8_bRFhn}5_rq3u3<;Za=Paq2>G0s}zPiOysC*kQUS9ZAHm6vPEA^kEd?R_{@)vf>f1(t4 zl}Kvb+AV^D7~yv{U)U>d|H`S5(I<}?F-clmQw!Pw7qd#{=KseKFRa4-!tUR)jGcnK zQ&a}4{67H>`eeEh6C?4TfSqtxNWh2x1Q3M%R==<_owqbf-NMfpF$rl~tD6^w3qfbp z=$5VL#pH>R*Eo0o(-3|OZ<{oUk=pWg^*Ll8v?l7-lm_heu_aLZ=)cYz@YW~CLmG6q zrZlJkS(|xfYXY)s(vWjl|FO$PZihi<^wxyulk{!_3XZd7!WC0lef%UzVoUvcb}Qse zN9ir;8($kBZ=s)UttV>M9Et_;tM69FCcEhR^T}K?AIr+m9z@N(B7V$ zU0Vx$8;67?IYgwhgO0pWCe@|06kPr_&GWK7yk4ZR40a-=)B)%0HU*t35j5-Ot!<-% zV02(2u1zg^#`43g3h4B_jb(v2XF1fCEu_1D9WaZY6TUuWq7<$bhWW9PWURckoEMGv z9dS3@m@HNve_vgMi^$OyTtdWu)0Z&SQSY~aaVwS@+qE%2ylBJn3jc||SYwN!Q}Go| zTxS%idv$1hYqveOVI3!}jI|H5M@oBUd4?*AOPDKCg$ogrf0CG&wpQ&bGnR){TW%uZ zLiY@f8fxC-a#{$rSE3yaw_L;bcFPVD&$qnk&&hBB(N6$ECo`7RGKSen9 zivOU}sm&*X`Xj++3j0Go65Ow4@@SdRDx(lfs=sIgP#d4)TNv*<*AfR|=Q!HKB)dn|FDz5b5(ZvXx5?U>LN!#c0@c>9wT|md?_N4lp-q+-dLce3 zBW(AlKUJ3J!$0%=FYtKt!`E*;AuQ^B0UhTRwv$xo{Z;+KyPL9NUvJf zr^34T%o*RBh?v!o?aPZ?7;-W`Y6k$sySxBQ%fkQ&I|~3_M&$oa*L3qpcO%aP0*3d| zF5bi=qJ+V;#-^5Os081r`_D*#mzv(6nG^)`Wk_`fY zm+x1WxSqcVJB$mtj=3M)nV%MMyuhP0bmlF@d4axjfK7nmB?S#^k9D68B?I!S{7h>|+-}F+ z!xPY76WT7eSa4ma2PA;22cv((#C8*w*Np;TMD9+?RI5x%RUQK1Pqju4;z-3Z0KBzo z2;y$EgaPpU58d946~$Q?7y%yD^CU+b6ae{OLm|SdstfNj`QT(uS#BLPke}y0PF zwnfjl7a4-j*%>hMdkEC-8d|b4FWPv$n-`|}rtcBwVdmaAya=h}U#w46K$#F8FWa(Kl=WKGLfxKhk6+`2CFqF$scyzZ`(v z%?Z4?vhrrn=p2Ny@`AN%%rEoWQE{ZCpd-loBQg{yxmCFZ99lh}x$Xyf^6-Bk>leqeEy(Ikqxb&&f5Sl=97)%W81{7JZEZCob#$W3T_ zQ@nj`{Cn12ellI~cn8YFTgNHaA@TJATOq=?5IK&D6fO^(N2e`Tl?7>}HM^-2{%|bv zaVnlAHtpn*ZvLuW)ZUQBmaNOE8bhs8u)>NK3U2&L2YJJM!vjv>RzBss-54INepVP} z=F1l|+W0BgO+cmu0qayx=+CA>`S?;Kgow6)(mZPD=h=qkUF{3jL08m8SFf{enhx#!hJl*Z#E-*�fLt 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 z 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�q&|^yYDO|mpD{XneE%bV@qRk) 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 f-*fcuc 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..1333c42fcc25537047219655b7b4adcb5d789bbd GIT binary patch literal 1651 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 aod5r#8aMvwKWfwf0000qBxv@*2hu6Fi@JH@UVN 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..72c9a6f19cd6a0d2903dfb6260c696e68246edd7 GIT binary patch literal 2307 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 TboBVUf}!$SQ=v}IGW>r4Mk$OU literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..49def81dc2160b6bd148495dd625b46ce10c8376 GIT binary patch literal 4825 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 Jtdchm{U2kJM)m*z literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/laundry_mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/laundry_mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard b/laundry_mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/laundry_mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/laundry_mobile/ios/Runner/Base.lproj/Main.storyboard b/laundry_mobile/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/laundry_mobile/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/laundry_mobile/ios/Runner/Info.plist b/laundry_mobile/ios/Runner/Info.plist new file mode 100644 index 0000000..7c9fcd3 --- /dev/null +++ b/laundry_mobile/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + MyLaundry + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + MyLaundry + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/laundry_mobile/ios/Runner/Runner-Bridging-Header.h b/laundry_mobile/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/laundry_mobile/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/laundry_mobile/ios/RunnerTests/RunnerTests.swift b/laundry_mobile/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/laundry_mobile/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/laundry_mobile/lib/config.dart b/laundry_mobile/lib/config.dart new file mode 100644 index 0000000..86ef13c --- /dev/null +++ b/laundry_mobile/lib/config.dart @@ -0,0 +1,23 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +class AppConfig { + static String _ip = "192.168.1.4"; // IP Default + static String _port = "8000"; + + static String get baseUrl => "http://$_ip:$_port/api"; + static String get rawIp => _ip; + + // Memuat IP dari penyimpanan HP + static Future loadConfig() async { + final prefs = await SharedPreferences.getInstance(); + _ip = prefs.getString('server_ip') ?? _ip; + _port = prefs.getString('server_port') ?? _port; + } + + // Menyimpan IP baru ke HP + static Future setIp(String newIp) async { + _ip = newIp; + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('server_ip', newIp); + } +} diff --git a/laundry_mobile/lib/driver/beranda.dart b/laundry_mobile/lib/driver/beranda.dart new file mode 100644 index 0000000..ce0f51f --- /dev/null +++ b/laundry_mobile/lib/driver/beranda.dart @@ -0,0 +1,1055 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import 'dart:async'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../config.dart'; + +import 'profile.dart'; +import '../staf/home/payments.dart'; + +class BerandaPage extends StatefulWidget { + final Map userData; + const BerandaPage({super.key, required this.userData}); + + @override + State createState() => _BerandaPageState(); +} + +class _BerandaPageState extends State { + int _selectedIndex = 0; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xFFF7F9FB), // Matches staff background + body: IndexedStack( + index: _selectedIndex, + children: [ + HomeDriverTab(userData: widget.userData), + ProfilePage(userData: widget.userData), + ], + ), + bottomNavigationBar: _buildPersistentBottomNav(), + ); + } + + Widget _buildPersistentBottomNav() { + return Container( + height: 64 + MediaQuery.of(context).padding.bottom, + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF).withOpacity(0.95), + border: + const Border(top: BorderSide(color: Color(0xFFE6E8EA), width: 1.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, -1)) + ], + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _navItem(Icons.home, "Beranda", _selectedIndex == 0, () { + setState(() => _selectedIndex = 0); + }), + _navItem(Icons.person, "Profil", _selectedIndex == 1, () { + setState(() => _selectedIndex = 1); + }), + ], + ), + ), + ), + ); + } + + Widget _navItem( + IconData icon, String label, bool isActive, VoidCallback onTap) { + return InkWell( + onTap: onTap, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + child: Container( + width: 64, + padding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + size: 24, + color: isActive + ? const Color(0xFF0058BE) + : const Color(0xFF424754).withOpacity(0.6), + ), + const SizedBox(height: 2), + Text( + label, + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: isActive ? FontWeight.w700 : FontWeight.w500, + color: isActive + ? const Color(0xFF0058BE) + : const Color(0xFF424754).withOpacity(0.6), + ), + ), + ], + ), + ), + ); + } +} + +class HomeDriverTab extends StatefulWidget { + final Map userData; + const HomeDriverTab({super.key, required this.userData}); + + @override + State createState() => _HomeDriverTabState(); +} + +class _HomeDriverTabState extends State + with SingleTickerProviderStateMixin { + final Color bgLight = const Color(0xFFF7F9FB); + final Color surfaceColor = const Color(0xFFFFFFFF); + final Color primaryColor = const Color(0xFF0058BE); + final Color primaryDark = const Color(0xFF004395); + final Color textDark = const Color(0xFF191C1E); + final Color textGray = const Color(0xFF424754); + final Color borderLight = const Color(0xFFE6E8EA); + + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF2F4F6); + final Color surfaceContainerHigh = const Color(0xFFE6E8EA); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + final Color secondaryContainer = const Color(0xFFC3ECD7); + final Color onSecondaryContainer = const Color(0xFF476C5B); + + List tasks = []; + Set _sentMessages = {}; + bool isLoading = true; + late TabController _tabController; + final Set _submittingTaskIds = {}; + final Set _sendingWhatsAppTaskIds = {}; + + String formatHarga(dynamic value) { + if (value == null) return "0"; + String val = value.toString(); + RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'); + return val.replaceAllMapped(reg, (Match m) => '${m[1]}.'); + } + + Widget _buildPaymentBadge(Map task) { + final payMethod = (task['payment_method'] ?? "").toString().toUpperCase(); + final cashRec = num.tryParse(task['cash_received']?.toString() ?? "0") ?? 0; + final isUnpaid = payMethod == "BAYAR NANTI" && cashRec == 0; + + if (isUnpaid) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: const Color(0xFFFFDAD6), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: const Color(0xFF93000A).withOpacity(0.2)), + ), + child: Text( + "BELUM BAYAR", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: const Color(0xFF93000A), + ), + ), + ); + } else { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: secondaryContainer, + borderRadius: BorderRadius.circular(999), + border: Border.all(color: onSecondaryContainer.withOpacity(0.2)), + ), + child: Text( + "LUNAS", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: onSecondaryContainer, + ), + ), + ); + } + } + + Timer? _refreshTimer; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 2, vsync: this); + _loadSentMessages(); + _fetchTasks(); + + _refreshTimer = Timer.periodic(const Duration(seconds: 3), (_) { + _fetchTasks(showLoading: false); + }); + } + + @override + void dispose() { + _refreshTimer?.cancel(); + _tabController.dispose(); + super.dispose(); + } + + // Mengambil data pesan terkirim dari memori HP + Future _loadSentMessages() async { + try { + final prefs = await SharedPreferences.getInstance(); + final List? sentList = prefs.getStringList('sent_wa_messages_v2'); + if (sentList != null) { + setState(() { + _sentMessages = sentList.toSet(); + }); + } + } catch (e) { + // ignore: empty_catches + } + } + + // Menyimpan data pesan terkirim ke memori HP + Future _saveSentMessage(String taskId) async { + try { + final prefs = await SharedPreferences.getInstance(); + setState(() { + _sentMessages.add(taskId); + }); + await prefs.setStringList('sent_wa_messages_v2', _sentMessages.toList()); + } catch (e) { + // ignore: empty_catches + } + } + + Future _fetchTasks({bool showLoading = true}) async { + if (!mounted) return; + if (showLoading) setState(() => isLoading = true); + try { + final String? token = widget.userData['access_token']; + final response = await http.get( + Uri.parse('${AppConfig.baseUrl}/driver/tasks'), + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + }, + ); + + if (response.statusCode == 200) { + final data = json.decode(response.body); + if (mounted) { + setState(() { + tasks = data['data'] ?? []; + if (showLoading) isLoading = false; + }); + } + } else { + if (mounted && showLoading) setState(() => isLoading = false); + } + } catch (e) { + if (mounted && showLoading) setState(() => isLoading = false); + } + } + + void _showSnackBar(String msg, Color bg) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Icon( + bg == const Color(0xFF10B981) + ? Icons.check_circle_outline + : Icons.error_outline_rounded, + color: Colors.white, + size: 28, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bg == const Color(0xFF10B981) ? "Berhasil" : "Peringatan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 14, + color: Colors.white), + ), + Text( + msg, + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white.withOpacity(0.9), + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ], + ), + ), + behavior: SnackBarBehavior.floating, + backgroundColor: bg.withOpacity(0.95), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white.withOpacity(0.2), width: 1), + ), + duration: const Duration(seconds: 3), + )); + } + + Future _updateTaskStatus(Map task) async { + final String taskId = task['type_id'] ?? ''; + if (_submittingTaskIds.contains(taskId)) return; + + setState(() { + _submittingTaskIds.add(taskId); + }); + + final String? token = widget.userData['access_token']; + final id = task['type_id'].substring(1); + final isJemput = task['task_type'] == 'jemput'; + final url = isJemput + ? '${AppConfig.baseUrl}/pickups/$id/status' + : '${AppConfig.baseUrl}/orders/$id/update-status'; + + try { + final response = await http.put( + Uri.parse(url), + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + body: json.encode({'status': isJemput ? 'SELESAI' : 'DITERIMA'}), + ); + + if (response.statusCode == 200) { + if (mounted) { + _showSnackBar( + "Tugas berhasil diselesaikan!", const Color(0xFF10B981)); + _fetchTasks(); + } + } + } catch (e) { + // ignore: empty_catches + } finally { + if (mounted) { + setState(() { + _submittingTaskIds.remove(taskId); + }); + } + } + } + + Future _openGoogleMaps(String address, String lat, String lng) async { + Uri navUri = (lat.isNotEmpty && lng.isNotEmpty && lat != '0.0') + ? Uri.parse('google.navigation:q=$lat,$lng') + : Uri.parse('google.navigation:q=${Uri.encodeComponent(address)}'); + + if (await canLaunchUrl(navUri)) { + await launchUrl(navUri); + } else { + // Fallback jika tidak ada aplikasi Google Maps terinstall + Uri webUri = (lat.isNotEmpty && lng.isNotEmpty && lat != '0.0') + ? Uri.parse( + 'https://www.google.com/maps/dir/?api=1&destination=$lat,$lng') + : Uri.parse( + 'https://www.google.com/maps/search/?api=1&query=${Uri.encodeComponent(address)}'); + if (await canLaunchUrl(webUri)) { + await launchUrl(webUri, mode: LaunchMode.externalApplication); + } + } + } + + Future _sendWhatsApp(String phone, String customerName, + String orderNumber, String taskType, String taskId) async { + if (_sendingWhatsAppTaskIds.contains(taskId)) return; + + setState(() { + _sendingWhatsAppTaskIds.add(taskId); + }); + + final String? token = widget.userData['access_token']; + try { + final response = await http.post( + Uri.parse('${AppConfig.baseUrl}/send-whatsapp'), + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + body: json.encode({ + 'phone': phone, + 'customer_name': customerName, + 'task_type': taskType, + }), + ); + + if (response.statusCode == 200) { + if (mounted) { + _saveSentMessage(taskId); + _showSnackBar("Pesan WhatsApp terkirim", const Color(0xFF10B981)); + } + } + } catch (e) { + // ignore: empty_catches + } finally { + if (mounted) { + setState(() { + _sendingWhatsAppTaskIds.remove(taskId); + }); + } + } + } + + @override + Widget build(BuildContext context) { + String userName = widget.userData['user']?['name'] ?? "Driver"; + List pickupTasks = + tasks.where((t) => t['task_type'] == 'jemput').toList(); + List deliveryTasks = + tasks.where((t) => t['task_type'] == 'antar').toList(); + + return SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(20, 24, 20, 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Halo, $userName!", + style: GoogleFonts.inter( + fontSize: 24, + fontWeight: FontWeight.w600, + color: onSurface, + letterSpacing: -0.5)), + const SizedBox(height: 4), + Text("Siap bertugas hari ini?", + style: GoogleFonts.inter( + fontSize: 13, + color: onSurfaceVariant, + fontWeight: FontWeight.w500)), + ], + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Container( + height: 48, + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: surfaceContainerHigh, + borderRadius: BorderRadius.circular(999), + ), + child: TabBar( + controller: _tabController, + indicator: BoxDecoration( + borderRadius: BorderRadius.circular(999), + color: primary, + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.2), + blurRadius: 12, + offset: const Offset(0, 4)) + ], + ), + labelColor: Colors.white, + unselectedLabelColor: onSurfaceVariant, + labelStyle: GoogleFonts.inter( + fontWeight: FontWeight.w500, fontSize: 13), + unselectedLabelStyle: GoogleFonts.inter( + fontWeight: FontWeight.w500, fontSize: 13), + indicatorSize: TabBarIndicatorSize.tab, + dividerColor: Colors.transparent, + splashBorderRadius: BorderRadius.circular(999), + tabs: [ + Tab(text: "Pick-up (${pickupTasks.length})"), + Tab(text: "Delivery (${deliveryTasks.length})"), + ], + ), + ), + ), + const SizedBox(height: 16), + Expanded( + child: isLoading + ? const Center(child: CircularProgressIndicator()) + : TabBarView( + controller: _tabController, + children: [ + _buildTaskList(pickupTasks, "Tidak ada tugas pick up"), + _buildTaskList(deliveryTasks, "Tidak ada tugas antar"), + ], + ), + ), + ], + ), + ); + } + + Widget _buildTaskList(List list, String emptyMessage) { + if (list.isEmpty) { + return RefreshIndicator( + onRefresh: _fetchTasks, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Container( + height: MediaQuery.of(context).size.height * 0.5, + width: double.infinity, + padding: const EdgeInsets.all(24), + alignment: Alignment.center, + child: Text(emptyMessage, + style: GoogleFonts.inter(fontSize: 13, color: outline)), + ), + ), + ); + } + return RefreshIndicator( + onRefresh: _fetchTasks, + child: ListView.separated( + padding: const EdgeInsets.fromLTRB(20, 0, 20, 20), + itemCount: list.length, + separatorBuilder: (_, __) => const SizedBox(height: 12), + itemBuilder: (context, index) => _buildTaskCard(list[index]), + ), + ); + } + + Widget _buildTaskCard(Map task) { + bool isJemput = task['task_type'] == 'jemput'; + String customerName = task['customer_name'] ?? '-'; + String address = task['address'] ?? '-'; + String phone = task['phone'] ?? ''; + String orderNumber = task['order_number'] ?? ''; + if (!orderNumber.startsWith('#') && orderNumber.isNotEmpty) { + orderNumber = '#$orderNumber'; + } + String lat = task['latitude']?.toString() ?? ''; + String lng = task['longitude']?.toString() ?? ''; + + final payMethod = (task['payment_method'] ?? "").toString().toUpperCase(); + final cashRec = num.tryParse(task['cash_received']?.toString() ?? "0") ?? 0; + final isUnpaid = payMethod == "BAYAR NANTI" && cashRec == 0; + + return Container( + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: outlineVariant.withOpacity(0.3)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.04), + blurRadius: 8, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Header (Order #, Name, Phone, Badges) + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(orderNumber, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.bold, + color: primary, + letterSpacing: -0.2)), + const SizedBox(height: 2), + Text(customerName, + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: onSurface)), + if (phone.isNotEmpty) ...[ + const SizedBox(height: 2), + Row( + children: [ + Icon(Icons.call_rounded, + size: 14, color: outline), + const SizedBox(width: 6), + Text(phone, + style: GoogleFonts.inter( + fontSize: 11, color: outline)), + ], + ), + ], + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + if (!isJemput) _buildPaymentBadge(task), + if (isJemput) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: primary.withOpacity(0.1), + borderRadius: BorderRadius.circular(999), + border: + Border.all(color: primary.withOpacity(0.2)), + ), + child: Text( + "PICK-UP", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: primary, + ), + ), + ), + if (!isJemput) ...[ + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 2), + decoration: BoxDecoration( + color: secondaryContainer.withOpacity(0.5), + borderRadius: BorderRadius.circular(6), + ), + child: Row( + children: [ + Icon(Icons.local_shipping_rounded, + size: 14, color: onSecondaryContainer), + const SizedBox(width: 4), + Text("Delivery", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.w500, + color: onSecondaryContainer)), + ], + ), + ), + ], + ], + ), + ], + ), + const SizedBox(height: 12), + + // Nota for Delivery + if (!isJemput) ...[ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: surfaceContainerLow.withOpacity(0.5), + borderRadius: BorderRadius.circular(12), + border: + Border.all(color: outlineVariant.withOpacity(0.1)), + ), + child: Column( + children: [ + // Services + if (task['service_name'] != null && + task['service_name'].toString().isNotEmpty) ...[ + ...task['service_name'] + .toString() + .split(RegExp(r' \+ |\n')) + .map((item) { + List parts = item.split('||'); + String namePart = parts[0]; + String pricePart = parts.length > 1 ? parts[1] : ""; + return Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + Icon(Icons.dry_cleaning_rounded, + size: 18, color: primary), + const SizedBox(width: 8), + Expanded( + child: Text(namePart, + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: onSurface)), + ), + ], + ), + ), + if (pricePart.isNotEmpty) + Text("Rp ${formatHarga(pricePart)}", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.bold, + color: primary)), + ], + ), + ); + }), + ], + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.only(top: 8), + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: outlineVariant.withOpacity(0.1))), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("TOTAL TAGIHAN", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: outline, + letterSpacing: 1.0)), + Text("Rp ${formatHarga(task['total_price'])}", + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.bold, + color: onSurface)), + ], + ), + ), + ], + ), + ), + const SizedBox(height: 8), + ], + + // Address + if (isJemput) + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: surfaceContainerLow.withOpacity(0.5), + borderRadius: BorderRadius.circular(12), + border: + Border.all(color: outlineVariant.withOpacity(0.1)), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.location_on_rounded, + size: 18, color: primary), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("ALAMAT PICK UP", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: outline, + letterSpacing: 0.5)), + const SizedBox(height: 2), + Text(address, + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: onSurface)), + ], + ), + ), + ], + ), + ) + else + Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.location_on_rounded, + size: 16, color: outline), + const SizedBox(width: 6), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("ALAMAT DELIVERY", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: outline, + letterSpacing: 0.5)), + const SizedBox(height: 2), + Text(address, + style: GoogleFonts.inter( + fontSize: 11, + color: onSurface, + height: 1.2)), + ], + ), + ), + ], + ), + ), + + // Buttons Map & WA + const SizedBox(height: 16), + Row( + children: [ + Expanded( + child: InkWell( + onTap: () => _openGoogleMaps(address, lat, lng), + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + color: surfaceContainerHigh, + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.map_rounded, + size: 18, color: onSurfaceVariant), + const SizedBox(width: 8), + Text("Rute", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: onSurfaceVariant)), + ], + ), + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: InkWell( + onTap: (_sentMessages.contains(task['type_id']) || + _sendingWhatsAppTaskIds.contains(task['type_id'])) + ? null + : () => _sendWhatsApp(phone, customerName, + orderNumber, task['task_type'], task['type_id']), + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + color: _sentMessages.contains(task['type_id']) + ? surfaceContainerHigh + : (_sendingWhatsAppTaskIds.contains(task['type_id']) + ? secondaryContainer.withOpacity(0.25) + : secondaryContainer.withOpacity(0.5)), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (_sendingWhatsAppTaskIds.contains(task['type_id'])) ...[ + SizedBox( + height: 14, + width: 14, + child: CircularProgressIndicator( + color: onSecondaryContainer, + strokeWidth: 2, + ), + ), + const SizedBox(width: 8), + Text( + "Mengirim...", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: onSecondaryContainer, + ), + ), + ] else ...[ + Icon( + _sentMessages.contains(task['type_id']) + ? Icons.check_circle_rounded + : Icons.chat_rounded, + size: 18, + color: _sentMessages.contains(task['type_id']) + ? outline + : onSecondaryContainer, + ), + const SizedBox(width: 8), + Text( + _sentMessages.contains(task['type_id']) + ? "Terkirim" + : "Konfirmasi", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: _sentMessages.contains(task['type_id']) + ? outline + : onSecondaryContainer, + ), + ), + ], + ], + ), + ), + ), + ), + ], + ), + + if (isJemput) ...[ + const SizedBox(height: 12), + InkWell( + onTap: _submittingTaskIds.contains(task['type_id']) + ? null + : () => _updateTaskStatus(task), + borderRadius: BorderRadius.circular(12), + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: _submittingTaskIds.contains(task['type_id']) + ? primary.withOpacity(0.6) + : primary, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 2, + offset: const Offset(0, 1)) + ], + ), + child: Center( + child: _submittingTaskIds.contains(task['type_id']) + ? const SizedBox( + height: 16, + width: 16, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : Text("Finish Pick-up", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: onPrimary)), + ), + ), + ), + ], + ], + ), + ), + if (!isJemput) + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: surfaceContainerLowest, + border: Border( + top: BorderSide(color: outlineVariant.withOpacity(0.1))), + borderRadius: + const BorderRadius.vertical(bottom: Radius.circular(16)), + ), + child: InkWell( + onTap: _submittingTaskIds.contains(task['type_id']) + ? null + : () { + if (isUnpaid) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomePaymentPage( + order: task, + userData: widget.userData, + ), + ), + ).then((_) => _fetchTasks()); + } else { + _updateTaskStatus(task); + } + }, + borderRadius: BorderRadius.circular(12), + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 14), + decoration: BoxDecoration( + color: _submittingTaskIds.contains(task['type_id']) + ? primary.withOpacity(0.6) + : primary, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 2, + offset: const Offset(0, 1)) + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: _submittingTaskIds.contains(task['type_id']) + ? [ + const SizedBox( + height: 16, + width: 16, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + ] + : [ + Text("Finish Delivery", + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w600, + color: onPrimary)), + const SizedBox(width: 8), + Icon(Icons.check_circle_rounded, + size: 18, color: onPrimary), + ], + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/laundry_mobile/lib/driver/profile.dart b/laundry_mobile/lib/driver/profile.dart new file mode 100644 index 0000000..8f0c98e --- /dev/null +++ b/laundry_mobile/lib/driver/profile.dart @@ -0,0 +1,199 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import '../login.dart'; + +class ProfilePage extends StatelessWidget { + final Map userData; + final bool isTab; + const ProfilePage({super.key, required this.userData, this.isTab = true}); + + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color background = const Color(0xFFF7F9FB); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF0F4F8); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + final Color error = const Color(0xFFBA1A1A); + + @override + Widget build(BuildContext context) { + String displayName = userData['user']?['name'] ?? 'Driver'; + String email = userData['user']?['email'] ?? "Tidak ada email"; + + Widget content = SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildProfileHero(displayName, email), + const SizedBox(height: 24), + _buildLogoutButton(context), + const SizedBox(height: 32), + _buildVersionFooter(), + const SizedBox(height: 24), // padding for bottom nav + ], + ), + ), + ); + + if (isTab) return content; + + return Scaffold( + backgroundColor: surface, + body: content, + ); + } + + Widget _buildProfileHero(String name, String email) { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [ + Color(0xFF2170E4), + Color(0xFF004395) + ], // Matches HTML linear-gradient + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 4, + offset: const Offset(0, 2)) + ], + ), + child: Stack( + children: [ + // Decorative circle + Positioned( + right: -16, + top: -16, + child: Container( + width: 96, + height: 96, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white.withOpacity(0.05), + ), + ), + ), + Row( + children: [ + Container( + width: 64, + height: 64, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.white.withOpacity(0.3), width: 2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), blurRadius: 2) + ], + ), + child: CircleAvatar( + backgroundColor: Colors.white, + child: Icon(Icons.person, color: primary, size: 40), + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: Colors.white, + letterSpacing: -0.5), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Text( + email, + style: GoogleFonts.inter( + fontSize: 13, color: Colors.white.withOpacity(0.9)), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ) + ], + ) + ], + ), + ); + } + + Widget _buildLogoutButton(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () async { + final prefs = await SharedPreferences.getInstance(); + await prefs.remove('userData'); + await prefs.remove('sent_wa_messages'); + await prefs.remove('sent_wa_messages_v2'); + if (!context.mounted) return; + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (_) => const LoginPage()), + (route) => false); + }, + borderRadius: BorderRadius.circular(12), + highlightColor: error.withOpacity(0.1), + splashColor: error.withOpacity(0.05), + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 14), + decoration: BoxDecoration( + border: Border.all(color: outlineVariant.withOpacity(0.3)), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.logout, color: error, size: 20), + const SizedBox(width: 8), + Text( + "Keluar", + style: GoogleFonts.inter( + fontSize: 14, fontWeight: FontWeight.w500, color: error), + ), + ], + ), + ), + ), + ); + } + + Widget _buildVersionFooter() { + return Center( + child: Text( + "", + textAlign: TextAlign.center, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w500, + letterSpacing: 0.5, + color: onSurfaceVariant.withOpacity(0.4), + ), + ), + ); + } +} diff --git a/laundry_mobile/lib/login.dart b/laundry_mobile/lib/login.dart new file mode 100644 index 0000000..83c5b2f --- /dev/null +++ b/laundry_mobile/lib/login.dart @@ -0,0 +1,445 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import 'dart:async'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import 'staf/beranda.dart'; +import 'driver/beranda.dart' as driver_beranda; +import 'config.dart'; + +class LoginPage extends StatefulWidget { + const LoginPage({super.key}); + + @override + State createState() => _LoginPageState(); +} + +class _LoginPageState extends State with TickerProviderStateMixin { + final TextEditingController _emailController = TextEditingController(); + final TextEditingController _passwordController = TextEditingController(); + bool _isLoading = false; + bool _obscureText = true; + + // --- UNIFIED DESIGN TOKENS (Matched with other pages) --- + final Color bgLight = const Color(0xFFF7F9FB); + final Color surfaceColor = const Color(0xFFFFFFFF); + final Color primaryColor = const Color(0xFF0058BE); + final Color primaryDark = const Color(0xFF004596); + final Color textDark = const Color(0xFF191C1E); + final Color textGray = const Color(0xFF424754); + final Color borderLight = const Color(0xFFC2C6D6); + + late AnimationController _headerController; + late Animation _headerAnimation; + + @override + void initState() { + super.initState(); + _headerController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1200), + ); + _headerAnimation = + CurvedAnimation(parent: _headerController, curve: Curves.easeOutBack); + _headerController.forward(); + } + + @override + void dispose() { + _headerController.dispose(); + super.dispose(); + } + + Future _login() async { + if (_emailController.text.isEmpty || _passwordController.text.isEmpty) { + _showSnackBar("Harap isi semua bidang", Colors.orange); + return; + } + + setState(() => _isLoading = true); + try { + final response = await http.post( + Uri.parse("${AppConfig.baseUrl}/login"), + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + body: jsonEncode({ + 'email': _emailController.text.trim(), + 'password': _passwordController.text, + }), + ); + + if (response.statusCode == 200) { + final data = json.decode(response.body); + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('userData', response.body); + + if (!mounted) return; + + String userRole = data['user']?['role'] ?? 'staf'; + + if (userRole == 'driver') { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + driver_beranda.BerandaPage(userData: data))); + } else { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => BerandaPage(userData: data))); + } + } else { + _showSnackBar("Email atau password salah", Colors.redAccent); + } + } catch (e) { + _showSnackBar("Terjadi kesalahan koneksi", Colors.redAccent); + } finally { + if (mounted) setState(() => _isLoading = false); + } + } + + void _showSnackBar(String msg, Color bg) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Icon( + bg == Colors.green + ? Icons.check_circle_outline + : Icons.error_outline_rounded, + color: Colors.white, + size: 28, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bg == Colors.green ? "Berhasil" : "Peringatan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 14, + color: Colors.white), + ), + Text( + msg, + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white.withOpacity(0.9), + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ], + ), + ), + behavior: SnackBarBehavior.floating, + backgroundColor: bg.withOpacity(0.95), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white.withOpacity(0.2), width: 1), + ), + duration: const Duration(seconds: 3), + )); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: bgLight, + body: Stack( + children: [ + _buildBackgroundGradient(), + SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + children: [ + const SizedBox(height: 60), + _buildHeaderLogo(), + const SizedBox(height: 48), + _buildLoginCard(), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _buildBackgroundGradient() { + return Container( + height: MediaQuery.of(context).size.height * 0.4, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [primaryColor, primaryDark]), + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(40), bottomRight: Radius.circular(40)), + boxShadow: [ + BoxShadow( + color: primaryColor.withOpacity(0.3), + blurRadius: 20, + offset: const Offset(0, 10)) + ], + ), + ); + } + + Widget _buildHeaderLogo() { + return ScaleTransition( + scale: _headerAnimation, + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.15), + shape: BoxShape.circle), + child: GestureDetector( + onDoubleTap: () => + _showIPDialog(context), // Rahasia: Tap 2x di logo + child: SizedBox( + width: 48, + height: 48, + child: CustomPaint(painter: MLogoPainter())), + )), + const SizedBox(height: 16), + // NAMA APLIKASI DIUBAH DI SINI + Text("My Laundry", + style: GoogleFonts.inter( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.w800, + letterSpacing: -1)), + Text("Laundry Management System", + style: GoogleFonts.inter( + color: Colors.white.withOpacity(0.7), + fontSize: 13, + fontWeight: FontWeight.w500)), + ], + ), + ); + } + + Widget _buildLoginCard() { + return Container( + padding: const EdgeInsets.all(32), + decoration: BoxDecoration( + color: surfaceColor, + borderRadius: BorderRadius.circular(24), + border: Border.all( + color: borderLight, width: 1.0), // Border tipis sesuai standar + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.06), + blurRadius: 20, + offset: const Offset(0, 8)) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Selamat Datang", + style: GoogleFonts.inter( + color: textDark, + fontSize: 22, + fontWeight: FontWeight.w800, + letterSpacing: -0.5)), + const SizedBox(height: 4), + Text("Masuk untuk mulai mengelola outlet", + style: GoogleFonts.inter( + color: textGray, fontSize: 13, fontWeight: FontWeight.w500)), + const SizedBox(height: 32), + _buildField( + "Email Address", Icons.alternate_email_rounded, _emailController), + const SizedBox(height: 16), + _buildField( + "Password", Icons.lock_outline_rounded, _passwordController, + isPass: true), + const SizedBox(height: 32), + _buildSubmitButton(), + ], + ), + ); + } + + Widget _buildField(String label, IconData icon, TextEditingController ctrl, + {bool isPass = false}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, + style: GoogleFonts.inter( + color: textDark, fontWeight: FontWeight.w700, fontSize: 12)), + const SizedBox(height: 8), + TextField( + controller: ctrl, + obscureText: isPass && _obscureText, + style: GoogleFonts.inter( + color: textDark, fontWeight: FontWeight.w600, fontSize: 14), + decoration: InputDecoration( + prefixIcon: Icon(icon, color: textGray, size: 20), + suffixIcon: isPass + ? IconButton( + icon: Icon( + _obscureText + ? Icons.visibility_off_rounded + : Icons.visibility_rounded, + color: textGray, + size: 18), + onPressed: () => + setState(() => _obscureText = !_obscureText)) + : null, + filled: true, + fillColor: bgLight, + hintText: "Masukkan $label", + hintStyle: GoogleFonts.inter( + color: textGray.withOpacity(0.5), + fontSize: 13), // Opacity disesuaikan sedikit agar lebih terbaca + contentPadding: const EdgeInsets.symmetric(vertical: 16), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: borderLight, + width: 1.0)), // Diubah dari none ke borderLight tipis + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: borderLight, width: 1.0)), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: primaryColor, + width: 1.0)), // Menyesuaikan style input + ), + ), + ], + ); + } + + Widget _buildSubmitButton() { + return SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primaryColor, + elevation: 0, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + onPressed: _isLoading ? null : _login, + child: _isLoading + ? const SizedBox( + height: 24, + width: 24, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 2.5)) + : Text("MASUK SEKARANG", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + color: Colors.white, + letterSpacing: 0.5)), + ), + ); + } + + void _showIPDialog(BuildContext context) { + final controller = TextEditingController(text: AppConfig.rawIp); + showDialog( + context: context, + builder: (context) => AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + title: Text("Pengaturan IP Server", + style: GoogleFonts.inter(fontWeight: FontWeight.w800)), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Masukkan IP laptop Anda untuk menghubungkan aplikasi ke server.", + style: GoogleFonts.inter(fontSize: 13, color: textGray)), + const SizedBox(height: 20), + TextField( + controller: controller, + decoration: InputDecoration( + hintText: "Contoh: 192.168.1.XX", + filled: true, + fillColor: bgLight, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none), + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text("BATAL", + style: GoogleFonts.inter( + fontWeight: FontWeight.bold, color: textGray)), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primaryColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + onPressed: () async { + await AppConfig.setIp(controller.text.trim()); + if (!context.mounted) return; + Navigator.pop(context); + _showSnackBar("IP Server berhasil diperbarui!", Colors.green); + }, + child: Text("SIMPAN", + style: GoogleFonts.inter( + fontWeight: FontWeight.bold, color: Colors.white)), + ), + ], + ), + ); + } +} + +class MLogoPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final paintLine = Paint() + ..color = Colors.white + ..strokeWidth = size.width * 0.1 + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeJoin = StrokeJoin.round; + final paintDot = Paint() + ..color = const Color(0xFF10B981) + ..style = PaintingStyle.fill; + double scale = size.width / 512.0; + Path path = Path() + ..moveTo(120 * scale, 360 * scale) + ..lineTo(120 * scale, 220 * scale) + ..cubicTo(120 * scale, 180 * scale, 150 * scale, 160 * scale, 180 * scale, + 190 * scale) + ..lineTo(256 * scale, 266 * scale) + ..lineTo(332 * scale, 190 * scale) + ..cubicTo(362 * scale, 160 * scale, 392 * scale, 180 * scale, 392 * scale, + 220 * scale) + ..lineTo(392 * scale, 360 * scale); + canvas.drawPath(path, paintLine); + canvas.drawCircle(Offset(256 * scale, 110 * scale), 32 * scale, paintDot); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/laundry_mobile/lib/main.dart b/laundry_mobile/lib/main.dart new file mode 100644 index 0000000..614051a --- /dev/null +++ b/laundry_mobile/lib/main.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'dart:convert'; +import 'package:firebase_database/firebase_database.dart'; + +import 'login.dart'; +import 'staf/beranda.dart'; +import 'config.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + try { + await Firebase.initializeApp(); + FirebaseDatabase.instance + .ref('laundry/screen_status') + .onDisconnect() + .set("RESTART"); + FirebaseDatabase.instance + .ref('laundry/status_hp') + .onDisconnect() + .set("-|-|-|0.000|Rp0"); + } catch (e) { + debugPrint("Firebase failed to initialize: $e"); + } + await AppConfig.loadConfig(); + + // Cek apakah ada data sesi login yang tersimpan + final prefs = await SharedPreferences.getInstance(); + final String? userDataString = prefs.getString('userData'); + + Widget initialPage = const LoginPage(); + + if (userDataString != null) { + try { + final userData = jsonDecode(userDataString); + // Jika berhasil decode, langsung masuk ke Beranda + initialPage = BerandaPage(userData: userData); + } catch (e) { + // Jika gagal decode (misal corrupted), biarkan tetap di LoginPage + } + } + + runApp(MyApp(initialPage: initialPage)); +} + +class MyApp extends StatefulWidget { + final Widget initialPage; + + const MyApp({super.key, required this.initialPage}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State with WidgetsBindingObserver { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.paused || + state == AppLifecycleState.detached) { + try { + FirebaseDatabase.instance.ref('laundry/screen_status').set("RESTART"); + FirebaseDatabase.instance + .ref('laundry/status_hp') + .set("-|-|-|0.000|Rp0"); + } catch (e) { + debugPrint("Failed to send RESTART on exit: $e"); + } + } + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + title: 'Management Laundry', + theme: ThemeData( + fontFamily: 'Manrope', + useMaterial3: true, + scaffoldBackgroundColor: const Color(0xFFF2F7FB), + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.android: CupertinoPageTransitionsBuilder(), + TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), + }, + ), + ), + home: widget.initialPage, + ); + } +} diff --git a/laundry_mobile/lib/staf/beranda.dart b/laundry_mobile/lib/staf/beranda.dart new file mode 100644 index 0000000..4516135 --- /dev/null +++ b/laundry_mobile/lib/staf/beranda.dart @@ -0,0 +1,1033 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import '../config.dart'; +import 'dart:async'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:firebase_database/firebase_database.dart'; + +import 'home/order_list.dart'; +import 'home/payments.dart'; +import 'laundry.dart'; +import 'profile.dart'; +import 'request_pickup.dart'; + +class BerandaPage extends StatefulWidget { + final Map userData; + const BerandaPage({super.key, required this.userData}); + + @override + State createState() => _BerandaPageState(); +} + +class _BerandaPageState extends State { + int _selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xFFF7F9FB), // bg-surface + body: AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: _selectedIndex == 0 + ? HomeTab(key: const ValueKey("home"), userData: widget.userData) + : _selectedIndex == 1 + ? LaundryPage( + key: const ValueKey("laundry"), + userData: widget.userData, + isTab: true) + : ProfilePage( + key: const ValueKey("profile"), + userData: widget.userData, + isTab: true), + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition(opacity: animation, child: child); + }, + ), + bottomNavigationBar: _buildPersistentBottomNav(), + ); + } + + Widget _buildPersistentBottomNav() { + return Container( + height: 64 + MediaQuery.of(context).padding.bottom, + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF).withOpacity(0.95), + border: + const Border(top: BorderSide(color: Color(0xFFE6E8EA), width: 1.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, -1)) + ], + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _navItem(Icons.home, "Beranda", _selectedIndex == 0, () { + setState(() => _selectedIndex = 0); + }), + _navItem(Icons.add_circle, "Input", _selectedIndex == 1, + () async { + setState(() => _selectedIndex = 1); + try { + await FirebaseDatabase.instance + .ref('laundry/screen_status') + .set("RESTART"); + // Otomatis kembalikan ke ON dari sisi HP agar tidak nyangkut + await Future.delayed(const Duration(milliseconds: 500)); + await FirebaseDatabase.instance + .ref('laundry/screen_status') + .set("ON"); + // ignore: empty_catches + } catch (e) {} + }), + _navItem(Icons.person, "Profil", _selectedIndex == 2, () { + setState(() => _selectedIndex = 2); + }), + ], + ), + ), + ), + ); + } + + Widget _navItem( + IconData icon, String label, bool isActive, VoidCallback onTap) { + return InkWell( + onTap: onTap, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + child: Container( + width: 64, + padding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + size: 24, + color: isActive + ? const Color(0xFF0058BE) + : const Color(0xFF424754).withOpacity(0.6), + ), + const SizedBox(height: 2), + Text( + label, + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: isActive ? FontWeight.w700 : FontWeight.w500, + color: isActive + ? const Color(0xFF0058BE) + : const Color(0xFF424754).withOpacity(0.6), + ), + ), + ], + ), + ), + ); + } +} + +class HomeTab extends StatefulWidget { + final Map userData; + const HomeTab({super.key, required this.userData}); + + @override + State createState() => _HomeTabState(); +} + +class _HomeTabState extends State { + // Tailwind Colors + final Color primary = const Color(0xFF0058BE); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerHigh = const Color(0xFFE6E8EA); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color primaryFixed = const Color(0xFFD8E2FF); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF2F4F6); + final Color secondaryContainer = const Color(0xFFC3ECD7); + final Color onSecondaryContainer = const Color(0xFF294E3F); + final Color outline = const Color(0xFF727785); + + int countAntrian = 0; + int countProses = 0; + int countSelesai = 0; + List aktivitasTerbaru = []; + List pesananTiba = []; + bool isLoading = true; + Timer? _refreshTimer; + + String _selectedTab = 'antrian'; + + static Map? _cachedStats; + static Map? _cachedActs; + static Map? _cachedTiba; + + @override + void initState() { + super.initState(); + if (_cachedStats != null && _cachedActs != null) { + _loadFromCache(); + } + fetchAllData(showLoading: _cachedStats == null); + _startRefreshTimer(); + } + + void _loadFromCache() { + countAntrian = _cachedStats!['data']['antrian'] ?? 0; + countProses = _cachedStats!['data']['proses'] ?? 0; + countSelesai = _cachedStats!['data']['selesai'] ?? 0; + aktivitasTerbaru = _cachedActs!['data'] ?? []; + pesananTiba = _cachedTiba!['data'] ?? []; + isLoading = false; + } + + void _startRefreshTimer() { + _refreshTimer?.cancel(); + _refreshTimer = Timer.periodic(const Duration(seconds: 3), (timer) { + if (mounted) fetchAllData(showLoading: false); + }); + } + + @override + void dispose() { + _refreshTimer?.cancel(); + super.dispose(); + } + + Future fetchAllData({bool showLoading = true}) async { + if (showLoading) setState(() => isLoading = true); + String baseUrl = AppConfig.baseUrl; + + try { + final String? token = widget.userData['access_token']; + final responses = await Future.wait([ + http.get(Uri.parse('$baseUrl/dashboard/stats'), headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + }), + http.get(Uri.parse('$baseUrl/dashboard/activities'), headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + }), + http.get(Uri.parse('$baseUrl/orders/status/TIBA%20DI%20TOKO'), + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + }), + http.get(Uri.parse('$baseUrl/shop/settings'), headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + }), + ]); + + if (responses[0].statusCode == 200 && responses[1].statusCode == 200) { + final dataStats = json.decode(responses[0].body); + final dataActs = json.decode(responses[1].body); + final dataTiba = responses.length > 2 && responses[2].statusCode == 200 + ? json.decode(responses[2].body) + : {'data': []}; + + if (responses.length > 3 && responses[3].statusCode == 200) { + final dataSettings = json.decode(responses[3].body); + if (dataSettings['data'] != null) { + widget.userData['shop'] = dataSettings['data']; + } + } + + _cachedStats = dataStats; + _cachedActs = dataActs; + _cachedTiba = dataTiba; + + setState(() { + countAntrian = dataStats['data']['antrian'] ?? 0; + countProses = dataStats['data']['proses'] ?? 0; + countSelesai = dataStats['data']['selesai'] ?? 0; + + aktivitasTerbaru = dataActs['data'] ?? []; + + pesananTiba = dataTiba['data'] ?? []; + isLoading = false; + }); + } else { + if (mounted && _cachedStats == null) setState(() => isLoading = false); + } + } catch (e) { + if (mounted && _cachedStats == null) setState(() => isLoading = false); + } + } + + String formatHarga(dynamic value) { + if (value == null) return "0"; + String val = value.toString(); + RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'); + return val.replaceAllMapped(reg, (Match m) => '${m[1]}.'); + } + + String formatWeightInString(String input) { + return input.replaceAllMapped(RegExp(r'\((\d+\.?\d*)\s*([a-zA-Z]+)\)'), + (match) { + double val = double.tryParse(match.group(1) ?? "0") ?? 0; + String unit = match.group(2) ?? "Kg"; + if (unit.toUpperCase() == 'PCS') return "(${val.toInt()} $unit)"; + + // Format the display string exactly with 3 decimal places (e.g. 2.500 instead of 2.5) + String valStr = val.toStringAsFixed(3); + + return "($valStr $unit)"; + }); + } + + List get _filteredActivities { + List filtered = aktivitasTerbaru.where((item) { + String status = item['status']?.toString().toUpperCase() ?? ""; + if (_selectedTab == 'antrian' && + (status == 'ANTRIAN' || status == 'MENUNGGU JEMPUT')) return true; + if (_selectedTab == 'proses' && + (status == 'PROSES' || + status == 'JEMPUTAN TIBA' || + status == 'MENCUCI' || + status == 'MENYETRIKA')) return true; + if (_selectedTab == 'selesai' && status == 'SELESAI') return true; + return false; + }).toList(); + + filtered.sort((a, b) { + int priority(String type) { + String t = type.toLowerCase(); + if (t.contains('kilat')) return 1; + if (t.contains('ekspres') || t.contains('express')) return 2; + return 3; + } + + int pA = priority((a['estimation_type'] ?? '').toString()); + int pB = priority((b['estimation_type'] ?? '').toString()); + if (pA != pB) return pA.compareTo(pB); + + final fallbackTime = DateTime(2100, 1, 1); + DateTime parseTime(dynamic timeStr) { + if (timeStr == null || timeStr.toString().isEmpty) { + return fallbackTime; + } + return DateTime.tryParse(timeStr.toString()) ?? fallbackTime; + } + + DateTime timeA = parseTime(a['estimation_time']); + DateTime timeB = parseTime(b['estimation_time']); + int comp = timeA.compareTo(timeB); + if (comp != 0) return comp; + return (a['id'] as int) + .compareTo(b['id'] as int); // tertiary sort oldest first + }); + + return filtered; + } + + @override + Widget build(BuildContext context) { + return isLoading + ? Center(child: CircularProgressIndicator(color: primary)) + : Column( + children: [ + _buildAppBar(), + Expanded( + child: RefreshIndicator( + onRefresh: () => fetchAllData(), + color: primary, + backgroundColor: Colors.white, + child: CustomScrollView( + physics: const AlwaysScrollableScrollPhysics( + parent: BouncingScrollPhysics()), + slivers: [ + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 80), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // HERO BANNER + GestureDetector( + onTap: () async { + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + RequestPickupPage( + userData: widget.userData))); + if (result == true) fetchAllData(); + }, + child: Container( + width: double.infinity, + height: 160, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: + Border.all(color: surfaceContainerHigh), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.02), + blurRadius: 4, + offset: const Offset(0, 2)) + ], + image: const DecorationImage( + image: AssetImage('assets/beranda.jpg'), + fit: BoxFit.cover, + ), + ), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(12), + gradient: LinearGradient( + colors: [ + primary.withOpacity(0.8), + primary.withOpacity(0.4), + Colors.transparent + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 24), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Text( + "Halo, ${(widget.userData['user']?['name'] ?? 'Staf').toString().split(' ')[0]}", + style: GoogleFonts.inter( + fontSize: 22, + fontWeight: FontWeight.w700, + color: Colors.white, + height: 1.1, + ), + ), + const SizedBox(height: 4), + Text( + "Siap mengelola pesanan hari ini?", + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white + .withOpacity(0.9), + ), + ), + const SizedBox(height: 12), + Container( + padding: + const EdgeInsets.symmetric( + horizontal: 20, + vertical: 8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.circular(999), + boxShadow: [ + BoxShadow( + color: Colors.black + .withOpacity(0.05), + blurRadius: 4, + offset: + const Offset(0, 2)) + ], + ), + child: Text( + "Buat Jadwal Pickup", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w700, + color: primary, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + const SizedBox(height: 24), + + // ORDER TABS + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("Status Pesanan", + style: GoogleFonts.inter( + fontSize: 16, + fontWeight: FontWeight.w600, + color: onSurface)), + GestureDetector( + onTap: () { + String initialFilter = "Semua"; + if (_selectedTab == 'antrian') { + initialFilter = "Antrian"; + } + if (_selectedTab == 'proses') { + initialFilter = "Proses"; + } + if (_selectedTab == 'selesai') { + initialFilter = "Selesai"; + } + Navigator.push( + context, + MaterialPageRoute( + builder: (c) => OrderListPage( + initialFilter: initialFilter, + userData: widget.userData))); + }, + child: Text("Lihat Semua", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: primary)), + ), + ], + ), + const SizedBox(height: 12), + Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: surfaceContainerLow, + borderRadius: BorderRadius.circular(12), + ), + child: Row( + children: [ + _buildTabItem( + 'antrian', 'Antrian ($countAntrian)'), + _buildTabItem( + 'proses', 'Proses ($countProses)'), + _buildTabItem( + 'selesai', 'Selesai ($countSelesai)'), + ], + ), + ), + const SizedBox(height: 12), + + // TAB CONTENT (Filtered Orders) + AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: _buildFilteredList( + key: ValueKey(_selectedTab)), + ), + + const SizedBox(height: 24), + + // PESANAN TIBA DI TOKO + if (pesananTiba.isNotEmpty) ...[ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("Tiba di Toko (Belum Diinput)", + style: GoogleFonts.inter( + fontSize: 15, + fontWeight: FontWeight.w700, + color: onSurface)), + if (pesananTiba.length > 3) + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (c) => OrderListPage( + initialFilter: "Proses", + userData: + widget.userData))); + }, + child: Text("Lihat Semua", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: primary)), + ), + ], + ), + const SizedBox(height: 12), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: primary.withOpacity(0.2)), + ), + child: Column( + children: pesananTiba + .take(3) + .toList() + .asMap() + .entries + .map((entry) { + return _buildTibaRow( + entry.value, + entry.key == + (pesananTiba.take(3).length - 1)); + }).toList(), + ), + ), + const SizedBox(height: 24), + ], + + // LAST ACTIVITY + Text("Aktivitas Terakhir", + style: GoogleFonts.inter( + fontSize: 16, + fontWeight: FontWeight.w600, + color: onSurface)), + const SizedBox(height: 12), + _buildRecentActivityList(), + ], + ), + ), + ), + ], + ), + ), // End of RefreshIndicator + ), // End of Expanded + ], // End of Column children + ); // End of Column + } + + Widget _buildTabItem(String tabId, String label) { + bool isActive = _selectedTab == tabId; + return Expanded( + child: GestureDetector( + onTap: () => setState(() => _selectedTab = tabId), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 6), + decoration: BoxDecoration( + color: isActive ? surfaceContainerLowest : Colors.transparent, + borderRadius: BorderRadius.circular(8), + boxShadow: isActive + ? [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 2, + offset: const Offset(0, 1)) + ] + : null, + ), + alignment: Alignment.center, + child: Text( + label, + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: isActive ? primary : onSurfaceVariant, + ), + ), + ), + ), + ); + } + + Widget _buildFilteredList({Key? key}) { + List items = _filteredActivities; + if (items.isEmpty) { + return Container( + key: key, + width: double.infinity, + padding: const EdgeInsets.all(24), + alignment: Alignment.center, + child: Text("Belum ada pesanan", + style: GoogleFonts.inter(fontSize: 13, color: outline)), + ); + } + + return Column( + key: key, + children: + items.take(2).map((item) => _buildOrderCard(item)).toList(), + ); + } + + Widget _buildRecentActivityList() { + if (aktivitasTerbaru.isEmpty) { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(24), + alignment: Alignment.center, + child: Text("Belum ada aktivitas", + style: GoogleFonts.inter(fontSize: 13, color: outline)), + ); + } + + return Column( + children: aktivitasTerbaru + .take(5) + .map((item) => _buildOrderCard(item, isClickable: false)) + .toList(), + ); + } + + Widget _buildOrderCard(dynamic item, {bool isClickable = true}) { + String title = item['title']?.toString() ?? "Pesanan"; + String rawSubtitle = item['subtitle']?.toString() ?? "-"; + String subtitle = formatWeightInString(rawSubtitle.split('||').first); + String status = item['status']?.toString().toUpperCase() ?? "PROSES"; + String orderId = "#${item['order_number'] ?? item['id'] ?? 'ACT'}"; + + String price = ""; + if (item['total'] != null) { + price = "Rp ${formatHarga(item['total'])}"; + } + + if (status == 'MENUNGGU JEMPUT') status = 'PICKUP'; + if (status == 'JEMPUTAN TIBA') status = 'DI TOKO'; + + IconData icon = Icons.local_laundry_service; + if (status == 'ANTRIAN' || status == 'PICKUP') icon = Icons.dry_cleaning; + if (status == 'SELESAI') icon = Icons.checkroom; + if (status == 'DI DRIVER') icon = Icons.delivery_dining; + + return InkWell( + onTap: isClickable + ? () { + if (item['status']?.toString().toUpperCase() == 'ANTRIAN' || + item['status']?.toString().toUpperCase() == 'PROSES' || + item['status']?.toString().toUpperCase() == 'SELESAI') { + _showUpdateStatusDialog(item); + } + } + : null, + child: Container( + margin: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: surfaceContainerHigh), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: primary.withOpacity(0.05), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: primary.withOpacity(0.1)), + ), + alignment: Alignment.center, + child: Icon(icon, color: primary, size: 22), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(orderId, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w500, + color: onSurfaceVariant.withOpacity(0.7), + letterSpacing: 0.5)), + Text(title, + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w600, + color: onSurface, + height: 1.2), + maxLines: 1, + overflow: TextOverflow.ellipsis), + if (subtitle.isNotEmpty && subtitle != "-") ...[ + const SizedBox(height: 2), + Text(subtitle, + style: + GoogleFonts.inter(fontSize: 11, color: outline), + maxLines: 1, + overflow: TextOverflow.ellipsis), + ] + ], + ), + ), + const SizedBox(width: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + padding: + const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + decoration: BoxDecoration( + color: secondaryContainer.withOpacity(0.5), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + status, + style: GoogleFonts.inter( + fontSize: 9, + fontWeight: FontWeight.w700, + color: onSecondaryContainer, + letterSpacing: 0.5), + ), + ), + if (price.isNotEmpty && price != "Rp 0") ...[ + const SizedBox(height: 4), + Text(price, + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w700, + color: primary)), + ] + ], + ), + ], + ), + )); + } + + void _showUpdateStatusDialog(dynamic item) { + String currentStatus = item['status']?.toString().toUpperCase() ?? ""; + String orderIdStr = + item['order_number']?.toString() ?? item['id']?.toString() ?? ""; + int id = int.tryParse(item['id']?.toString() ?? "0") ?? 0; + if (id == 0) return; + + String promptText = ""; + bool isUnpaid = false; + + if (currentStatus == 'ANTRIAN') { + promptText = + "Mulai proses cucian (Mencuci/Menyetrika) untuk pesanan #$orderIdStr?"; + } else if (currentStatus == 'PROSES') { + promptText = "Tandai pesanan #$orderIdStr sebagai SELESAI?"; + } else if (currentStatus == 'SELESAI') { + String deliveryType = + item['delivery_type']?.toString().toLowerCase() ?? 'none'; + if (deliveryType == 'delivery' || deliveryType == 'both') { + promptText = + "Tugaskan pesanan #$orderIdStr ke Driver untuk pengiriman (DELIVERY)?"; + } else { + String paymentStatus = + item['payment_status']?.toString().toUpperCase() ?? "UNPAID"; + if (paymentStatus != 'PAID') { + isUnpaid = true; + promptText = + "Pesanan #$orderIdStr belum lunas. Lanjutkan ke halaman pelunasan?"; + } else { + promptText = + "Selesaikan pesanan #$orderIdStr dan ubah menjadi DIAMBIL?"; + } + } + } else { + return; + } + + showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: Text("Lanjutkan Pesanan?", + style: GoogleFonts.inter(fontWeight: FontWeight.w700)), + content: Text(promptText, style: GoogleFonts.inter(fontSize: 14)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + actions: [ + TextButton( + onPressed: () => Navigator.pop(ctx), + child: Text("Batal", + style: GoogleFonts.inter(color: Colors.grey)), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primary, foregroundColor: Colors.white), + onPressed: () { + Navigator.pop(ctx); + if (isUnpaid) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomePaymentPage( + order: item, + userData: widget.userData, + ), + ), + ).then((_) => fetchAllData()); + } else { + _updateOrderStatus(id); + } + }, + child: Text("Ya, Lanjutkan", + style: GoogleFonts.inter(fontWeight: FontWeight.w600)), + ), + ], + )); + } + + Future _updateOrderStatus(int id) async { + setState(() => isLoading = true); + try { + final String? token = widget.userData['access_token']; + final response = await http.put( + Uri.parse('${AppConfig.baseUrl}/orders/$id/update-status'), + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + ); + if (response.statusCode == 200) { + fetchAllData(); + } else { + setState(() => isLoading = false); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("Gagal memperbarui status"))); + } + } + } catch (e) { + if (mounted) setState(() => isLoading = false); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("Terjadi kesalahan jaringan"))); + } + } + } + + Widget _buildTibaRow(dynamic order, bool isLast) { + String orderId = "#${order['order_number'] ?? order['id'] ?? 'ACT'}"; + String name = order['customer_name'] ?? "Pelanggan"; + + return InkWell( + onTap: () async { + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (c) => Scaffold( + appBar: AppBar( + title: Text("Input Layanan Pickup", + style: GoogleFonts.inter( + fontWeight: FontWeight.w700, fontSize: 16)), + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded, + size: 20), + onPressed: () => Navigator.pop(c)), + ), + body: LaundryPage( + userData: widget.userData, + isTab: false, + pickupData: order)))); + if (result == true) fetchAllData(); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + border: isLast + ? null + : Border( + bottom: + BorderSide(color: surfaceContainerHigh.withOpacity(0.5))), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: primary.withOpacity(0.1), + borderRadius: BorderRadius.circular(8)), + child: Icon(Icons.inventory_2_rounded, color: primary, size: 20), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(name, + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + fontSize: 14, + color: onSurface)), + const SizedBox(height: 2), + Text(orderId, + style: GoogleFonts.inter(fontSize: 11, color: outline)), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: primary, borderRadius: BorderRadius.circular(6)), + child: Text("Input", + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w700, + color: Colors.white)), + ) + ], + ), + ), + ); + } + + Widget _buildAppBar() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: surface.withOpacity(0.9), + border: Border( + bottom: BorderSide( + color: const Color(0xFFE6E8EA) + .withOpacity(0.5), // surfaceContainerHigh + width: 1.0, + ), + ), + ), + child: SafeArea( + bottom: false, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + width: 32, + height: 32, + decoration: const BoxDecoration( + color: Color(0xFFD8E2FF), // primaryFixed + shape: BoxShape.circle, + ), + clipBehavior: Clip.hardEdge, + child: Image.asset( + 'assets/app_icon.png', + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => Icon( + Icons.local_laundry_service_rounded, + color: primary, + size: 20), + ), + ), + const SizedBox(width: 8), + Text("My Laundry", + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: primary, + )), + ], + ), + const SizedBox( + width: + 48), // Padding equivalent to empty action area to align center if needed, or just leave it empty. + ], + ), + ), + ); + } +} diff --git a/laundry_mobile/lib/staf/home/order_list.dart b/laundry_mobile/lib/staf/home/order_list.dart new file mode 100644 index 0000000..f1164ca --- /dev/null +++ b/laundry_mobile/lib/staf/home/order_list.dart @@ -0,0 +1,846 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import '../../config.dart'; +import 'dart:async'; + +import 'package:google_fonts/google_fonts.dart'; +import 'payments.dart'; + +class OrderListPage extends StatefulWidget { + final String initialFilter; + final Map userData; + + const OrderListPage({ + super.key, + required this.initialFilter, + required this.userData, + }); + + @override + State createState() => _OrderListPageState(); +} + +class _OrderListPageState extends State { + late String _currentFilter; + + // --- UNIFIED DESIGN TOKENS --- + final Color bgBackground = const Color(0xFFf7f9fb); + final Color surfaceLowest = const Color(0xFFffffff); + final Color surfaceLow = const Color(0xFFf2f4f6); + final Color outlineVariant = const Color(0xFFc2c6d6); + final Color outlineColor = const Color(0xFF727785); + final Color primaryColor = const Color(0xFF0058be); + final Color primaryContainer = const Color(0xFF2170e4); + final Color errorColor = const Color(0xFFba1a1a); + final Color secondaryContainer = const Color(0xFFc3ecd7); + final Color onSecondaryContainer = const Color(0xFF476c5b); + final Color onSurface = const Color(0xFF191c1e); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color surfaceContainerHigh = const Color(0xFFe6e8ea); + final Color surfaceContainer = const Color(0xFFeceef0); + + String formatHarga(dynamic value) { + if (value == null) return "0"; + String val = value.toString(); + RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'); + return val.replaceAllMapped(reg, (Match m) => '${m[1]}.'); + } + + final TextEditingController _searchController = TextEditingController(); + List allOrders = []; + List filteredOrders = []; + bool isLoading = true; + Timer? _timer; + int _fetchGeneration = 0; // untuk menghindari race condition saat ganti filter + + @override + void initState() { + super.initState(); + _currentFilter = widget.initialFilter; + fetchOrders(); + _searchController.addListener(_onSearchChanged); + _timer = Timer.periodic(const Duration(seconds: 3), (timer) { + if (mounted) { + fetchOrders(showLoading: false); + } + }); + } + + @override + void dispose() { + _timer?.cancel(); + _searchController.removeListener(_onSearchChanged); + _searchController.dispose(); + super.dispose(); + } + + void _onSearchChanged() { + String query = _searchController.text.toLowerCase(); + setState(() { + filteredOrders = allOrders.where((order) { + String name = (order['customer_name'] ?? "").toString().toLowerCase(); + String orderNum = (order['order_number'] ?? order['id'] ?? "") + .toString() + .toLowerCase(); + return name.contains(query) || orderNum.contains(query); + }).toList(); + }); + } + + String _calculateRemainingTime(String? estimationTime) { + if (estimationTime == null || estimationTime.isEmpty) return "Belum diatur"; + try { + DateTime target = DateTime.parse(estimationTime); + DateTime now = DateTime.now(); + Duration diff = target.difference(now); + if (diff.isNegative) return "Waktu Habis!"; + if (diff.inHours >= 24) return "${(diff.inHours / 24).ceil()} hari lagi"; + String hours = diff.inHours.toString().padLeft(2, '0'); + String minutes = (diff.inMinutes % 60).toString().padLeft(2, '0'); + return "$hours jam $minutes menit lagi"; + } catch (e) { + return "Format error"; + } + } + + Future fetchOrders({bool showLoading = true}) async { + if (!mounted) return; + // Naikkan generation agar response lama bisa diabaikan (race condition fix) + final int myGeneration = ++_fetchGeneration; + if (showLoading) setState(() => isLoading = true); + String baseUrl = AppConfig.baseUrl; + final String? token = widget.userData['access_token']; + // Simpan filter yang sedang aktif saat request dikirim + final String requestedFilter = _currentFilter; + + try { + final response = await http.get( + Uri.parse('$baseUrl/orders/status/${requestedFilter.toUpperCase()}'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $token', + }, + ); + + // Buang response jika ada request yang lebih baru (filter sudah diganti) + if (myGeneration != _fetchGeneration) return; + + if (response.statusCode == 200) { + final Map responseData = json.decode(response.body); + if (mounted) { + setState(() { + List fetchedOrders = responseData['data'] ?? []; + fetchedOrders.sort((a, b) { + int priority(String type) { + String t = type.toLowerCase(); + if (t.contains('kilat')) return 1; + if (t.contains('ekspres') || t.contains('express')) return 2; + return 3; + } + + int pA = priority((a['estimation_type'] ?? '').toString()); + int pB = priority((b['estimation_type'] ?? '').toString()); + if (pA != pB) return pA.compareTo(pB); + + final fallbackTime = DateTime(2100, 1, 1); + DateTime parseTime(dynamic timeStr) { + if (timeStr == null || timeStr.toString().isEmpty) { + return fallbackTime; + } + return DateTime.tryParse(timeStr.toString()) ?? fallbackTime; + } + + DateTime timeA = parseTime(a['estimation_time']); + DateTime timeB = parseTime(b['estimation_time']); + + int comp = timeA.compareTo(timeB); + if (comp != 0) return comp; + return (a['id'] as int) + .compareTo(b['id'] as int); // tertiary sort oldest first + }); + allOrders = fetchedOrders; + // Pertahankan filter pencarian yang sedang aktif + String query = _searchController.text.toLowerCase(); + if (query.isEmpty) { + filteredOrders = allOrders; + } else { + filteredOrders = allOrders.where((order) { + String name = + (order['customer_name'] ?? "").toString().toLowerCase(); + String orderNum = (order['order_number'] ?? order['id'] ?? "") + .toString() + .toLowerCase(); + return name.contains(query) || orderNum.contains(query); + }).toList(); + } + isLoading = false; + }); + } + } else { + if (myGeneration == _fetchGeneration && mounted) { + setState(() => isLoading = false); + } + } + } catch (e) { + if (myGeneration == _fetchGeneration && mounted) { + setState(() => isLoading = false); + } + } + } + + Future updateOrderStatus(int id, + {Map? paymentData}) async { + String baseUrl = AppConfig.baseUrl; + final String? token = widget.userData['access_token']; + try { + final response = await http.put( + Uri.parse('$baseUrl/orders/$id/update-status'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $token', + }, + body: paymentData != null ? json.encode(paymentData) : null, + ); + if (response.statusCode == 200) fetchOrders(); + } catch (e) { + debugPrint("Update Error: $e"); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: bgBackground, + appBar: _buildAppBar(), + body: Column( + children: [ + _buildSearchBar(), + _buildFilterChips(), + const SizedBox(height: 12), + Expanded( + child: isLoading + ? Center( + child: CircularProgressIndicator( + color: primaryColor, strokeWidth: 3)) + : RefreshIndicator( + onRefresh: fetchOrders, + color: primaryColor, + child: filteredOrders.isEmpty + ? _buildEmptyState() + : ListView.separated( + padding: const EdgeInsets.fromLTRB(20, 8, 20, 24), + itemCount: filteredOrders.length, + separatorBuilder: (_, __) => + const SizedBox(height: 16), + itemBuilder: (context, i) => + _buildOrderCard(filteredOrders[i]), + ), + ), + ), + ], + ), + ); + } + + PreferredSizeWidget _buildAppBar() { + return AppBar( + backgroundColor: surfaceLowest, + elevation: 0, + centerTitle: false, + title: Text("Daftar Pesanan", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w600, fontSize: 18)), + leading: IconButton( + icon: Icon(Icons.arrow_back, color: primaryColor, size: 24), + onPressed: () => Navigator.pop(context), + ), + bottom: PreferredSize( + preferredSize: const Size.fromHeight(1.0), + child: Container(color: surfaceContainerHigh, height: 1.0), + ), + ); + } + + Widget _buildSearchBar() { + return Padding( + padding: const EdgeInsets.fromLTRB(20, 16, 20, 0), + child: Container( + decoration: BoxDecoration( + color: surfaceLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: outlineVariant.withOpacity(0.3)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.02), + blurRadius: 4, + offset: const Offset(0, 2), + ) + ], + ), + child: TextField( + controller: _searchController, + decoration: InputDecoration( + hintText: "Cari pelanggan atau no pesanan...", + hintStyle: GoogleFonts.inter(fontSize: 13, color: outlineColor), + prefixIcon: Icon(Icons.search, color: outlineColor, size: 20), + border: InputBorder.none, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + ), + style: GoogleFonts.inter(fontSize: 13), + ), + ), + ); + } + + Widget _buildFilterChips() { + final filters = ['Antrian', 'Proses', 'Selesai']; + return Padding( + padding: const EdgeInsets.fromLTRB(20, 16, 20, 12), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: filters.map((filter) { + bool active = _currentFilter.toLowerCase() == filter.toLowerCase(); + return GestureDetector( + onTap: () { + setState(() => _currentFilter = filter); + fetchOrders(); + }, + child: Container( + margin: const EdgeInsets.only(right: 8), + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 8), + decoration: BoxDecoration( + color: active ? primaryColor : surfaceContainerHigh, + borderRadius: BorderRadius.circular(20), + boxShadow: active + ? [ + BoxShadow( + color: primaryColor.withOpacity(0.2), + blurRadius: 12, + offset: const Offset(0, 4)) + ] + : null, + ), + alignment: Alignment.center, + child: Text( + filter, + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: active ? Colors.white : onSurfaceVariant, + ), + ), + ), + ); + }).toList(), + ), + ), + ); + } + + Widget _buildOrderCard(dynamic order) { + String title = order['customer_name']?.toString() ?? "Pelanggan"; + + String rawSubtitle = order['service_name']?.toString() ?? "-"; + String formatWeightInString(String input) { + return input.replaceAllMapped(RegExp(r'\((\d+\.?\d*)\s*([a-zA-Z]+)\)'), + (match) { + double val = double.tryParse(match.group(1) ?? "0") ?? 0; + String unit = match.group(2) ?? "Kg"; + if (unit.toUpperCase() == 'PCS') return "(${val.toInt()} $unit)"; + + String valStr = val.toStringAsFixed(3); + + return "($valStr $unit)"; + }); + } + + List serviceItems = rawSubtitle + .split(RegExp(r' \+ |\n')) + .map((e) => formatWeightInString(e)) + .toList(); + + String status = order['status']?.toString().toUpperCase() ?? "PROSES"; + String orderId = "#${order['order_number'] ?? order['id'] ?? 'ACT'}"; + String phone = order['phone']?.toString() ?? "-"; + + String price = "Rp 0"; + if (order['total_price'] != null) { + price = "Rp ${formatHarga(order['total_price'])}"; + } + + String paymentMethod = + (order['payment_method'] ?? "").toString().toUpperCase(); + double cashReceived = + num.tryParse(order['cash_received']?.toString() ?? "0")?.toDouble() ?? + 0.0; + bool isPaid = !(paymentMethod == "BAYAR NANTI" && cashReceived == 0); + + String deliveryType = + order['delivery_type']?.toString().toLowerCase() ?? "none"; + String estimasiTipe = order['estimation_type']?.toString() ?? "Reguler"; + String estimasiWaktu = _calculateRemainingTime(order['estimation_time']); + + if (status == 'MENUNGGU JEMPUT') status = 'PICKUP'; + if (status == 'JEMPUTAN TIBA') status = 'DI TOKO'; + + // Format delivery label + String deliveryLabel = "Drop-off"; + IconData deliveryIcon = Icons.store; + if (deliveryType == 'diantar' || deliveryType == 'delivery') { + deliveryLabel = "Delivery"; + deliveryIcon = Icons.moped; + } else if (deliveryType == 'keduanya' || + deliveryType == 'both' || + deliveryType == 'dijemput' || + deliveryType == 'pickup') { + deliveryLabel = deliveryType == 'dijemput' || deliveryType == 'pickup' + ? "Pick Up" + : "Pick Up & Delivery"; + deliveryIcon = Icons.moped; + } + + bool hasDriverService = deliveryLabel != "Drop-off"; + + Color paymentColor = isPaid ? onSecondaryContainer : errorColor; + Color paymentBg = isPaid ? secondaryContainer : errorColor.withOpacity(0.1); + String paymentText = isPaid ? "LUNAS" : "BELUM BAYAR"; + + String buttonText = "Proses"; + if (status == 'ANTRIAN' || status == 'PICKUP') { + buttonText = "Proses"; + } else if (status == 'PROSES') { + buttonText = "Selesai"; + } else if (status == 'SELESAI') { + buttonText = (deliveryType == 'delivery' || + deliveryType == 'both' || + deliveryType == 'diantar' || + deliveryType == 'keduanya') + ? "Delivery" + : "Diambil"; + } else if (status == 'DI DRIVER') { + buttonText = "Selesai"; + } + + String address = order['address']?.toString() ?? ""; + if (address.isEmpty) address = "Alamat tidak tersedia"; + + return Container( + decoration: BoxDecoration( + color: surfaceLowest, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: outlineVariant.withOpacity(0.5)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.04), + blurRadius: 8, + offset: const Offset(0, 2), + ) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(orderId, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.bold, + color: primaryColor, + letterSpacing: -0.2)), + const SizedBox(height: 2), + Text(title, + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: onSurface), + maxLines: 1, + overflow: TextOverflow.ellipsis), + const SizedBox(height: 2), + Row( + children: [ + Icon(Icons.call, size: 14, color: outlineColor), + const SizedBox(width: 4), + Text(phone, + style: GoogleFonts.inter( + fontSize: 11, color: outlineColor)), + ], + ) + ], + ), + ), + const SizedBox(width: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: paymentBg, + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: paymentColor.withOpacity(0.2)), + ), + child: Text(paymentText, + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.bold, + color: paymentColor)), + ), + const SizedBox(height: 8), + if (hasDriverService) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: isPaid + ? surfaceContainer + : secondaryContainer.withOpacity(0.5), + borderRadius: BorderRadius.circular(6), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(deliveryIcon, + size: 14, + color: isPaid + ? onSurfaceVariant + : onSecondaryContainer), + const SizedBox(width: 4), + Text(deliveryLabel, + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.w600, + color: isPaid + ? onSurfaceVariant + : onSecondaryContainer)), + ], + ), + ) + ], + ) + ], + ), + const SizedBox(height: 12), + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: surfaceLow.withOpacity(0.5), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: outlineVariant.withOpacity(0.3)), + ), + child: Column( + children: [ + ...serviceItems.map((item) { + List parts = item.split('||'); + String namePart = parts[0]; + String pricePart = parts.length > 1 + ? "Rp ${formatHarga(parts[1])}" + : ""; + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + Icon(Icons.dry_cleaning, + size: 18, color: primaryColor), + const SizedBox(width: 8), + Expanded( + child: Text(namePart, + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: onSurface), + maxLines: 1, + overflow: TextOverflow.ellipsis)), + ], + ), + ), + if (pricePart.isNotEmpty) ...[ + const SizedBox(width: 8), + Text(pricePart, + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.bold, + color: primaryColor)), + ] + ], + ), + ); + }), + if ((num.tryParse( + order['delivery_fee']?.toString() ?? "0") ?? + 0) > + 0) + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + Icon(Icons.two_wheeler, + size: 18, color: Colors.teal.shade700), + const SizedBox(width: 8), + Expanded( + child: Text("Tarif Driver", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: onSurface))), + ], + ), + ), + const SizedBox(width: 8), + Text("Rp ${formatHarga(order['delivery_fee'])}", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.bold, + color: Colors.teal.shade700)), + ], + ), + ), + const SizedBox(height: 10), + Divider( + height: 1, + thickness: 1, + color: outlineVariant.withOpacity(0.3)), + const SizedBox(height: 10), + Row( + children: [ + Row( + children: [ + Icon(Icons.bolt, + size: 14, color: onSurfaceVariant), + const SizedBox(width: 4), + Text(estimasiTipe, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w600, + color: onSurfaceVariant)), + ], + ), + const SizedBox(width: 16), + Row( + children: [ + Icon(Icons.schedule, + size: 14, + color: estimasiWaktu.contains('Habis') + ? errorColor + : onSurfaceVariant), + const SizedBox(width: 4), + Text(estimasiWaktu, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w600, + color: estimasiWaktu.contains('Habis') + ? errorColor + : onSurfaceVariant)), + ], + ), + ], + ) + ], + ), + ), + if (hasDriverService) ...[ + const SizedBox(height: 12), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 2), + child: Icon(Icons.location_on, + size: 16, color: outlineColor), + ), + const SizedBox(width: 6), + Expanded( + child: Text(address, + style: GoogleFonts.inter( + fontSize: 11, color: outlineColor), + maxLines: 2, + overflow: TextOverflow.ellipsis), + ) + ], + ) + ] + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: surfaceLowest, + border: Border( + top: BorderSide(color: outlineVariant.withOpacity(0.3))), + borderRadius: + const BorderRadius.vertical(bottom: Radius.circular(16)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("TAGIHAN", + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.w800, + color: outlineColor, + letterSpacing: 1.0)), + Text(price, + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w700, + color: onSurface)), + ], + ), + if (status != 'DIAMBIL' && status != 'DITERIMA' && status != 'TIBA DI TOKO') + ElevatedButton( + onPressed: () async { + bool isDelivery = (deliveryType == 'delivery' || + deliveryType == 'both' || + deliveryType == 'diantar' || + deliveryType == 'keduanya'); + + if (status == 'SELESAI' && !isPaid && !isDelivery) { + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomePaymentPage( + order: order, + userData: widget.userData, + ), + ), + ); + if (result == true) fetchOrders(); + return; + } + + String dialogTitle = "Lanjutkan Pesanan?"; + String dialogContent = + "Apakah Anda yakin ingin melanjutkan pesanan ini ke tahap selanjutnya?"; + + if (status == 'SELESAI') { + if (isDelivery) { + dialogTitle = "Tugaskan ke Driver?"; + dialogContent = + "Pesanan ini akan diteruskan ke tugas Driver untuk diantar. Lanjutkan?"; + } else { + dialogTitle = "Pesanan Diambil?"; + dialogContent = + "Apakah pesanan ini akan diserahkan ke pelanggan? Status akan menjadi Diambil."; + } + } else if (status == 'PROSES') { + dialogTitle = "Selesaikan Cucian?"; + dialogContent = + "Apakah proses cuci sudah selesai dan siap untuk dikemas/diambil?"; + } else if (status == 'ANTRIAN' || status == 'PICKUP') { + dialogTitle = "Mulai Proses?"; + dialogContent = + "Apakah Anda ingin mulai memproses pesanan ini sekarang?"; + } + + showDialog( + context: context, + builder: (ctx) => AlertDialog( + backgroundColor: surfaceLowest, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + title: Text(dialogTitle, + style: GoogleFonts.inter( + fontWeight: FontWeight.w700, + color: onSurface)), + content: Text(dialogContent, + style: + GoogleFonts.inter(color: onSurfaceVariant)), + actions: [ + TextButton( + onPressed: () => Navigator.pop(ctx), + child: Text("Batal", + style: GoogleFonts.inter( + color: outlineColor, + fontWeight: FontWeight.w600)), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primaryColor, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8)), + ), + onPressed: () { + Navigator.pop(ctx); + updateOrderStatus(order['id']); + }, + child: Text("Ya, Lanjutkan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600)), + ), + ], + ), + ); + }, + style: ElevatedButton.styleFrom( + backgroundColor: primaryColor, + foregroundColor: Colors.white, + elevation: 0, + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 8), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + ), + child: Row( + children: [ + Text(buttonText, + style: GoogleFonts.inter( + fontSize: 12, fontWeight: FontWeight.w600)), + const SizedBox(width: 6), + const Icon(Icons.arrow_forward, size: 16), + ], + ), + ) + ], + ), + ) + ], + ), + ); + } + + Widget _buildEmptyState() { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.inventory_2_outlined, + size: 48, color: outlineColor.withOpacity(0.2)), + const SizedBox(height: 16), + Text("Belum ada pesanan", + style: GoogleFonts.inter( + color: outlineColor, fontWeight: FontWeight.w600)), + ], + ), + ); + } +} diff --git a/laundry_mobile/lib/staf/home/payments.dart b/laundry_mobile/lib/staf/home/payments.dart new file mode 100644 index 0000000..1abceb3 --- /dev/null +++ b/laundry_mobile/lib/staf/home/payments.dart @@ -0,0 +1,701 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import '../../config.dart'; +import 'dart:convert'; +import 'package:google_fonts/google_fonts.dart'; +import '../beranda.dart'; +import '../../driver/beranda.dart' as driver_beranda; + +class HomePaymentPage extends StatefulWidget { + final dynamic order; + final Map userData; + + const HomePaymentPage({ + super.key, + required this.order, + required this.userData, + }); + + @override + State createState() => _HomePaymentPageState(); +} + +class _HomePaymentPageState extends State { + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color background = const Color(0xFFF7F9FB); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF0F4F8); // changed + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + final Color successGreen = const Color(0xFF10B981); + final Color errorRed = const Color(0xFFBA1A1A); + + // State + String selectedMethod = "Tunai"; + bool _isSubmitting = false; + int change = 0; + final TextEditingController _cashReceivedController = TextEditingController(); + + @override + void initState() { + super.initState(); + _cashReceivedController.text = "0"; + _calculateChange("0"); + } + + void _calculateChange(String value) { + int total = widget.order['total_price'] ?? widget.order['total'] ?? 0; + int received = int.tryParse(value.replaceAll(RegExp(r'[^0-9]'), '')) ?? 0; + setState(() { + change = received - total; + }); + } + + String formatHarga(dynamic value) { + if (value == null) return "0"; + String val = value.toString(); + RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'); + return val.replaceAllMapped(reg, (Match m) => '${m[1]}.'); + } + + Future _submitPayment() async { + if (selectedMethod == "Tunai") { + int received = int.tryParse( + _cashReceivedController.text.replaceAll(RegExp(r'[^0-9]'), '')) ?? + 0; + int total = widget.order['total_price'] ?? widget.order['total'] ?? 0; + + if (received <= 0) { + _showSnackBar("Masukkan nominal uang!", errorRed); + return; + } + + if (received < total) { + _showSnackBar( + "Uang tidak cukup! Tagihan: Rp ${formatHarga(total)}", errorRed); + return; + } + } + setState(() => _isSubmitting = true); + try { + String baseUrl = AppConfig.baseUrl; + final String? token = widget.userData['access_token']; + final int orderId = widget.order['id']; + + final response = await http.put( + Uri.parse('$baseUrl/orders/$orderId/update-status'), + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer $token', + }, + body: json.encode({ + 'payment_method': selectedMethod == "Tunai" ? "CASH" : "QRIS", + 'cash_received': selectedMethod == "Tunai" + ? (int.tryParse(_cashReceivedController.text + .replaceAll(RegExp(r'[^0-9]'), '')) ?? + (widget.order['total_price'] ?? widget.order['total'] ?? 0)) + : (widget.order['total_price'] ?? widget.order['total'] ?? 0), + }), + ); + + if (response.statusCode == 200) { + _showSnackBar("Pelunasan Berhasil!", successGreen); + await Future.delayed(const Duration(seconds: 1)); + if (mounted) { + final String userRole = widget.userData['user']?['role'] ?? 'staf'; + if (userRole == 'driver') { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + builder: (context) => + driver_beranda.BerandaPage(userData: widget.userData), + ), + (route) => false, + ); + } else { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + builder: (context) => BerandaPage(userData: widget.userData), + ), + (route) => false, + ); + } + } + } else { + _showSnackBar( + "Gagal memproses pelunasan: ${response.statusCode}", errorRed); + } + } catch (e) { + _showSnackBar("Error koneksi: $e", errorRed); + } finally { + if (mounted) setState(() => _isSubmitting = false); + } + } + + void _showSnackBar(String message, Color color) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Icon( + color == successGreen + ? Icons.check_circle_outline + : Icons.error_outline_rounded, + color: Colors.white, + size: 28, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + color == successGreen ? "Berhasil" : "Peringatan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 14, + color: Colors.white), + ), + Text( + message, + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white.withOpacity(0.9), + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ], + ), + ), + behavior: SnackBarBehavior.floating, + backgroundColor: color.withOpacity(0.95), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white.withOpacity(0.2), width: 1), + ), + duration: const Duration(seconds: 3), + )); + } + + String _formatWeightInString(String input) { + return input.replaceAllMapped(RegExp(r'\(([\d\.]+)\s*([a-zA-Z]+)\)'), + (match) { + double val = double.tryParse(match.group(1) ?? "0") ?? 0; + String unit = match.group(2) ?? "Kg"; + if (unit.toUpperCase() == 'PCS') return "(${val.toInt()} $unit)"; + return "(${val.toStringAsFixed(3)} $unit)"; // updated to 3 decimals + }); + } + + @override + Widget build(BuildContext context) { + int total = widget.order['total_price'] ?? widget.order['total'] ?? 0; + + return Scaffold( + backgroundColor: background, + appBar: _buildAppBar(), + body: SafeArea( + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildOrderSummary(total), + const SizedBox(height: 24), + _buildPaymentMethods(), + const SizedBox(height: 16), + if (selectedMethod == "Tunai") + _buildCashPanel(total) + else + _buildQRISPanel(), + const SizedBox(height: 40), // extra padding for scrolling + ], + ), + ), + ), + _buildBottomAction(), + ], + ), + ), + ); + } + + PreferredSizeWidget _buildAppBar() { + return AppBar( + backgroundColor: Colors.white.withOpacity(0.9), + elevation: 0, + scrolledUnderElevation: 1, + centerTitle: true, + leading: IconButton( + onPressed: () => Navigator.pop(context), + icon: + Icon(Icons.arrow_back_ios_new_rounded, color: onSurface, size: 20), + ), + title: Text("Pelunasan", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w700, fontSize: 18)), + ); + } + + Widget _buildOrderSummary(int total) { + int deliveryFee = + int.tryParse(widget.order['delivery_fee']?.toString() ?? "0") ?? 0; + + // Parse multiple services if needed (like in order_list) + String rawSubtitle = widget.order['service_name']?.toString() ?? + widget.order['subtitle']?.toString() ?? + "-"; + + // Ekstrak ongkir jika berasal dari API dashboard (tergabung di subtitle) + if (deliveryFee == 0 && rawSubtitle.toLowerCase().contains('ongkir')) { + final ongkirMatch = + RegExp(r'Ongkir:\s*Rp\s*([\d\.]+)').firstMatch(rawSubtitle); + if (ongkirMatch != null) { + deliveryFee = + int.tryParse(ongkirMatch.group(1)!.replaceAll('.', '')) ?? 0; + } + } + + String deliveryType = + widget.order['delivery_type']?.toString().toLowerCase() ?? 'none'; + if (deliveryType == 'none' && deliveryFee > 0) { + deliveryType = + 'delivery'; // Asumsi delivery jika ada ongkir tapi tipe kosong + } + + String driverLabel = "Ambil di Toko"; + if (deliveryType == 'pickup' || deliveryType == 'dijemput') { + driverLabel = "Pick-up"; + } else if (deliveryType == 'delivery' || deliveryType == 'diantar') { + driverLabel = "Delivery"; + } else if (deliveryType == 'both' || deliveryType == 'keduanya') { + driverLabel = "Pick-up & Delivery"; + } + + List serviceItems = rawSubtitle + .split(RegExp(r' \+ |\n')) + .where((e) => !e + .toLowerCase() + .contains('ongkir')) // Hapus ongkir dari list layanan + .map((e) => _formatWeightInString(e)) + .toList(); + + return Container( + decoration: BoxDecoration( + color: surfaceContainerLowest, + border: Border.all(color: outlineVariant), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: primary.withOpacity(0.08), + borderRadius: + const BorderRadius.vertical(top: Radius.circular(11)), + border: Border( + bottom: BorderSide(color: outlineVariant.withOpacity(0.5))), + ), + child: Text( + "RINCIAN PESANAN", + textAlign: TextAlign.center, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w700, + color: primary, + letterSpacing: 1.5, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildSummaryRow( + "Pelanggan", + widget.order['customer_name']?.toString() ?? + widget.order['title']?.toString() ?? + "-"), + const SizedBox(height: 12), + _buildSummaryRow("ID Pesanan", + "#${widget.order['order_number'] ?? widget.order['id'] ?? 'ACT'}"), + const SizedBox(height: 16), + Text("Layanan & Harga", + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurfaceVariant)), + const SizedBox(height: 8), + Container( + decoration: BoxDecoration( + color: surface, + border: Border.all(color: outlineVariant), + borderRadius: BorderRadius.circular(8), + ), + child: Column( + children: serviceItems.asMap().entries.map((entry) { + int idx = entry.key; + String item = entry.value; + List parts = item.split('||'); + String namePart = parts[0].trim(); + String pricePart = parts.length > 1 + ? "Rp ${formatHarga(parts[1].trim())}" + : ""; + + // Jika harga per jasa tidak tersedia dari API Beranda, + // hitung otomatis (Total Harga - Ongkos Kirim) jika hanya ada 1 jasa + if (pricePart.isEmpty && serviceItems.length == 1) { + int servicesPrice = total - deliveryFee; + if (servicesPrice > 0) { + pricePart = "Rp ${formatHarga(servicesPrice)}"; + } + } + + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 10), + decoration: BoxDecoration( + border: idx != serviceItems.length - 1 + ? Border( + bottom: BorderSide( + color: outlineVariant.withOpacity(0.5))) + : null, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text(namePart, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurface))), + Text(pricePart, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurface)), + ], + ), + ); + }).toList(), + ), + ), + const SizedBox(height: 16), + _buildSummaryRow("Opsi Driver", driverLabel), + if (deliveryFee > 0) ...[ + const SizedBox(height: 12), + _buildSummaryRow( + "Ongkos Kirim", "Rp ${formatHarga(deliveryFee)}"), + ], + const SizedBox(height: 16), + _buildDashedLine(), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("Total Tagihan", + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w600, + color: primary)), + Text("Rp ${formatHarga(total)}", + style: GoogleFonts.inter( + fontSize: 22, + fontWeight: FontWeight.w700, + color: primary, + letterSpacing: -0.5)), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildSummaryRow(String label, String value) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurfaceVariant)), + const SizedBox(width: 16), + Flexible( + child: Text(value, + textAlign: TextAlign.right, + style: GoogleFonts.inter( + fontSize: 14, fontWeight: FontWeight.w600, color: onSurface)), + ), + ], + ); + } + + Widget _buildDashedLine() { + return LayoutBuilder( + builder: (context, constraints) { + final boxWidth = constraints.constrainWidth(); + const dashWidth = 12.0; + const dashHeight = 1.0; + final dashCount = (boxWidth / (2 * dashWidth)).floor(); + return Flex( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + children: List.generate(dashCount, (_) { + return SizedBox( + width: dashWidth, + height: dashHeight, + child: DecoratedBox( + decoration: BoxDecoration(color: outlineVariant)), + ); + }), + ); + }, + ); + } + + Widget _buildPaymentMethods() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Metode Pelunasan", + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w600, + color: onSurfaceVariant)), + const SizedBox(height: 12), + Row( + children: [ + _methodOption("Tunai", Icons.payments_outlined), + const SizedBox(width: 16), + _methodOption("QRIS", Icons.qr_code_2_rounded), + ], + ) + ], + ); + } + + Widget _methodOption(String label, IconData icon) { + bool isSelected = selectedMethod == label; + return Expanded( + child: InkWell( + onTap: () => setState(() => selectedMethod = label), + borderRadius: BorderRadius.circular(16), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration( + color: isSelected ? primary.withOpacity(0.08) : Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isSelected ? primary : outlineVariant, + width: isSelected ? 1.5 : 1.0), + boxShadow: [ + BoxShadow( + color: isSelected + ? primary.withOpacity(0.15) + : primary.withOpacity(0.04), + blurRadius: 15, + offset: const Offset(0, 5)) + ], + ), + child: Column( + children: [ + Icon(icon, + color: isSelected ? primary : onSurfaceVariant, size: 28), + const SizedBox(height: 8), + Text(label, + style: GoogleFonts.inter( + color: isSelected ? primary : onSurface, + fontWeight: FontWeight.w600, + fontSize: 14)), + ], + ), + ), + ), + ); + } + + Widget _buildCashPanel(int total) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: outlineVariant, width: 1.0), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), + blurRadius: 20, + offset: const Offset(0, 6)) + ]), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Uang Diterima", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w600)), + Container( + width: 140, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + color: background, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: outlineVariant, width: 1.0)), + child: TextField( + controller: _cashReceivedController, + onChanged: _calculateChange, + keyboardType: TextInputType.number, + textAlign: TextAlign.right, + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: primary, + fontSize: 16), + decoration: InputDecoration( + prefixText: "Rp ", + prefixStyle: GoogleFonts.inter( + color: onSurfaceVariant, fontWeight: FontWeight.w500), + border: InputBorder.none, + isDense: true, + contentPadding: const EdgeInsets.symmetric(vertical: 12)), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Divider(color: outlineVariant, height: 1.0), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Kembalian", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w600)), + Text(change < 0 ? "Rp 0" : "Rp ${formatHarga(change)}", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: change < 0 + ? onSurfaceVariant.withOpacity(0.5) + : successGreen, + fontSize: 18)), + ], + ) + ], + ), + ); + } + + Widget _buildQRISPanel() { + return Container( + width: double.infinity, + margin: const EdgeInsets.only(top: 16), + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: const Color(0xFFF7F9FB), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: const Color(0xFFE6E8EA)), + ), + child: Column( + children: [ + Container( + width: 200, + height: 200, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: const Color(0xFFE6E8EA)), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Image.asset( + 'assets/qris.png', + fit: BoxFit.contain, + ), + ), + ), + const SizedBox(height: 16), + Text( + "Scan QRIS untuk membayar", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: const Color(0xFF424754), + ), + ), + ], + ), + ); + } + + Widget _buildBottomAction() { + return Container( + padding: const EdgeInsets.fromLTRB(20, 16, 20, 24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + border: Border(top: BorderSide(color: outlineVariant, width: 1.0)), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), + blurRadius: 24, + offset: const Offset(0, -8)) + ], + ), + child: SafeArea( + child: SizedBox( + width: double.infinity, + height: 54, + child: ElevatedButton( + onPressed: _isSubmitting ? null : _submitPayment, + style: ElevatedButton.styleFrom( + backgroundColor: primary, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + elevation: 0, + ), + child: _isSubmitting + ? const SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 3)) + : Text("SELESAIKAN", + style: GoogleFonts.inter( + color: Colors.white, + fontWeight: FontWeight.w700, + fontSize: 15, + letterSpacing: 0.5)), + ), + ), + ), + ); + } +} diff --git a/laundry_mobile/lib/staf/laundry.dart b/laundry_mobile/lib/staf/laundry.dart new file mode 100644 index 0000000..4b75078 --- /dev/null +++ b/laundry_mobile/lib/staf/laundry.dart @@ -0,0 +1,1503 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import '../config.dart'; +import 'dart:convert'; +import 'dart:async'; +import 'package:firebase_database/firebase_database.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import 'laundry/payment.dart'; +import 'profile.dart'; + +class LaundryPage extends StatefulWidget { + final Map userData; + final bool isTab; + final Map? pickupData; + const LaundryPage( + {super.key, required this.userData, this.isTab = false, this.pickupData}); + + @override + State createState() => _LaundryPageState(); +} + +class _LaundryPageState extends State { + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color primaryLight = const Color(0xFFD8E2FF); + final Color background = const Color(0xFFF7F9FB); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainer = const Color(0xFFECEEF0); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + final Color error = const Color(0xFFBA1A1A); + final Color secondary = const Color(0xFF416656); + final Color tertiary = const Color(0xFF545C72); + final Color successGreen = const Color(0xFF10B981); // for status + final Color surfaceVariant = const Color(0xFFE0E3E5); // added + + // State Data + String? selectedServiceId; + String? selectedEstimationId = "1"; + double weight = 0.0; + int quantity = 1; + int currentItemPrice = 0; + bool isLoading = true; + List services = []; + static List? _cachedServices; + + // Keranjang Layanan + List> cartItems = []; + int grandTotalPrice = 0; + + String selectedDeliveryOption = "Ambil di Toko"; + final List deliveryOptions = ["Ambil di Toko", "Antar ke Rumah"]; + + // Hitung delivery_type otomatis: pickup dari pickupData, delivery dari pilihan + String get deliveryType { + bool hasPickup = widget.pickupData != null; + bool isDelivery = selectedDeliveryOption == "Antar ke Rumah"; + if (hasPickup && isDelivery) return 'both'; + if (hasPickup) return 'pickup'; + if (isDelivery) return 'delivery'; + return 'none'; + } + + final DatabaseReference _dbRef = FirebaseDatabase.instance.ref(); + StreamSubscription? _weightSubscription; + bool isScaleConnected = false; + Timer? _refreshTimer; + + String get _devicePath => 'laundry'; + + bool get _isEstimationActive { + final active = widget.userData['shop']?['is_estimation_active']; + if (active == null) return false; + return active == 1 || active == true; + } + + bool get _shouldShowEstimation { + if (selectedServiceId == null) return false; + return _isEstimationActive && + !isSatuanService() && + (_expressExtraPrice > 0 || _kilatExtraPrice > 0); + } + + int get _expressExtraPrice { + final price = widget.userData['shop']?['express_extra_price']; + return price != null ? int.tryParse(price.toString()) ?? 0 : 0; + } + + int get _kilatExtraPrice { + final price = widget.userData['shop']?['kilat_extra_price']; + return price != null ? int.tryParse(price.toString()) ?? 0 : 0; + } + + final List> estimations = [ + { + "id": "1", + "name": "Reguler (3 Hari)", + "multiplier": 1.0, + "desc": "Normal" + }, + {"id": "2", "name": "Express (24 Jam)", "multiplier": 1.5, "desc": "Cepat"}, + {"id": "3", "name": "Kilat (6 Jam)", "multiplier": 2.0, "desc": "Priority"}, + ]; + + String formatHarga(dynamic value) { + if (value == null) return "0"; + String val = value.toString(); + RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'); + return val.replaceAllMapped(reg, (Match m) => '${m[1]}.'); + } + + void _checkAndInitScale() { + if (_weightSubscription == null) { + _dbRef.child('$_devicePath/current_weight').set(0.0); + _dbRef.child('$_devicePath/status_hp').set("-|-|-|-|Rp0"); + _listenToScale(); + } + } + + @override + void initState() { + super.initState(); + if (_cachedServices != null) { + services = _cachedServices!; + isLoading = false; + } + fetchServices(showLoading: _cachedServices == null); + _checkAndInitScale(); + _refreshTimer = Timer.periodic(const Duration(seconds: 3), (_) { + if (mounted) fetchServices(showLoading: false); + }); + } + + void _listenToScale() { + if (_devicePath.isEmpty) return; + _weightSubscription = + _dbRef.child('$_devicePath/current_weight').onValue.listen((event) { + if (event.snapshot.value != null && mounted) { + setState(() { + isScaleConnected = true; + double newWeight = + double.tryParse(event.snapshot.value.toString()) ?? 0.0; + + if (newWeight > 20.0) newWeight = 20.0; + if (newWeight < 0.1) newWeight = 0.0; + + if (!isSatuanService()) { + weight = newWeight; + _calculateCurrentPrice(); + } + }); + } + }); + } + + void _calculateCurrentPrice() { + if (selectedServiceId == null) return; + final dynamic service; + try { + service = + services.firstWhere((s) => s['id'].toString() == selectedServiceId); + } catch (e) { + return; + } + + double basePrice = double.tryParse(service['price'].toString()) ?? 0.0; + bool isSatuan = isSatuanService(); + double amount = isSatuan + ? quantity.toDouble() + : double.parse(weight.toStringAsFixed(2)); + + String estId = _shouldShowEstimation ? (selectedEstimationId ?? "1") : "1"; + double extraPrice = 0; + if (estId == "2") { + extraPrice = _expressExtraPrice.toDouble(); + } else if (estId == "3") { + extraPrice = _kilatExtraPrice.toDouble(); + } + + setState(() { + double rawPrice = (basePrice * amount) + (extraPrice * amount); + currentItemPrice = _roundTo500(rawPrice.round()); + }); + + //String namaJasa = service['name'].toString(); + //if (namaJasa.length > 8) namaJasa = namaJasa.substring(0, 8); + //String textUntukOLED = + //"$namaJasa|${est['name'].toString().split(' ')[0]}|${isSatuan ? 'Satuan' : 'Beban'}|${isSatuan ? '$quantity p' : '${weight.toStringAsFixed(3)} kg'}|Rp$currentItemPrice"; + //_dbRef.child('laundry/status_hp').set(textUntukOLED); + _updateOLEDDisplay(); + } + + void _addItemToCart() { + if (selectedServiceId == null) return; + if (!isSatuanService() && weight <= 0) { + _showSnackBar("Berat belum terdeteksi dari timbangan!", Colors.orange); + return; + } + + final service = + services.firstWhere((s) => s['id'].toString() == selectedServiceId); + + String estId = _shouldShowEstimation ? (selectedEstimationId ?? "1") : "1"; + final est = estimations.firstWhere((e) => e['id'].toString() == estId, + orElse: () => estimations.first); + + String getCategory(String name) { + name = name.toLowerCase(); + if (name.contains('express') || name.contains('ekspres')) return 'Express'; + if (name.contains('kilat')) return 'Kilat'; + return 'Reguler'; + } + + String newItemCategory = getCategory(_shouldShowEstimation ? est['name'].toString() : ""); + + if (cartItems.isNotEmpty) { + String firstItemCategory = getCategory(cartItems.first['estimation_name'].toString()); + if (newItemCategory != firstItemCategory) { + _showSnackBar( + "Gagal: Layanan $newItemCategory tidak bisa digabung dengan layanan $firstItemCategory. Mohon buat nota terpisah.", + Colors.red); + return; + } + } + + setState(() { + cartItems.add({ + 'service_id': selectedServiceId, + 'service_name': service['name'], + 'estimation_name': + _shouldShowEstimation ? est['name'].toString().split(' ')[0] : "", + 'unit': service['unit'], + 'weight': isSatuanService() ? quantity.toDouble() : weight, + 'price': currentItemPrice, + }); + _calculateGrandTotal(); + _resetInputForm(); + }); + } + + void _calculateGrandTotal() { + int total = 0; + for (var item in cartItems) { + total += (item['price'] as int); + } + setState(() { + grandTotalPrice = _roundTo500(total); + }); + } + + /// Membulatkan harga ke atas kelipatan 500 + int _roundTo500(int value) { + if (value <= 0) return 0; + return ((value / 500).ceil() * 500).toInt(); + } + + void _removeItem(int index) { + setState(() { + cartItems.removeAt(index); + _calculateGrandTotal(); + _updateOLEDDisplay(); // <--- Tambahkan baris ini + }); + } + + void _resetInputForm() { + setState(() { + selectedServiceId = null; + weight = 0.0; + quantity = 1; + currentItemPrice = 0; + }); + // Panggil fungsi update untuk mencerminkan status keranjang saat ini + _updateOLEDDisplay(); + } + + void _updateOLEDDisplay() { + List listJasa = []; + List listBerat = []; + int totalHarga = grandTotalPrice; + + // 1. Ambil SEMUA riwayat pesanan dari keranjang (Cart) + for (var item in cartItems) { + listJasa.add(item['service_name'].toString()); + if (item['unit'] == 'PCS') { + listBerat.add("${(item['weight'] as num).toInt()} pcs"); + } else { + listBerat.add("${(item['weight'] as num).toStringAsFixed(3)} kg"); + } + } + + // 2. Tambah jasa yang SEDANG DIPILIH di form (jika ada) + // TAPI: Hanya jika user sedang memilih jasa (selectedServiceId != null) + if (selectedServiceId != null) { + try { + final service = + services.firstWhere((s) => s['id'].toString() == selectedServiceId); + listJasa.add(service['name'].toString()); + totalHarga += + currentItemPrice; // Tambahkan harga item yang sedang dipilih + + if (service['unit'] == 'PCS') { + listBerat.add("$quantity pcs"); + } else { + listBerat + .add(weight > 0 ? "${weight.toStringAsFixed(3)} kg" : "0 kg"); + } + } catch (e) { + // ignore: empty_catches + } + } + + // 3. Gabungkan semua jadi String + String strJasa = listJasa.isNotEmpty ? listJasa.join(", ") : "-"; + if (strJasa.length > 50) { + strJasa = + "${strJasa.substring(0, 47)}..."; // Membatasi string agar memori OLED/ESP32 tidak lambat + } + String strBerat = listBerat.isNotEmpty ? listBerat.join(", ") : "0"; + String strEst = "-"; + if (selectedServiceId != null || cartItems.isNotEmpty) { + strEst = "Reguler"; // Default ke Reguler jika ada barang + } + + if (selectedServiceId != null && _shouldShowEstimation) { + String estId = selectedEstimationId ?? "1"; + strEst = estimations.firstWhere((e) => e['id'].toString() == estId, orElse: () => estimations.first)['name'].toString().split(' ')[0]; + } else if (cartItems.isNotEmpty) { + bool hasKilat = cartItems.any((item) => item['estimation_name']?.toString().toUpperCase() == 'KILAT'); + bool hasExpress = cartItems.any((item) => item['estimation_name']?.toString().toUpperCase() == 'EXPRESS'); + + if (hasKilat) { + strEst = "Kilat"; + } else if (hasExpress) { + strEst = "Express"; + } + } + + // Menentukan tipe layanan dinamis (Satuan / Beban) + String tipeLayanan = "Beban"; + if (selectedServiceId != null) { + tipeLayanan = isSatuanService() ? "Satuan" : "Beban"; + } else if (cartItems.isNotEmpty) { + bool hasKiloan = cartItems.any((item) => item['unit'] != 'PCS'); + tipeLayanan = hasKiloan ? "Beban" : "Satuan"; + } + + // 4. Kirim ke Firebase + String textUntukOLED = + "$strJasa|$strEst|$tipeLayanan|$strBerat|Rp${_roundTo500(totalHarga)}"; + if (_devicePath.isNotEmpty) { + _dbRef.child('$_devicePath/status_hp').set(textUntukOLED); + } + } + + @override + void dispose() { + _refreshTimer?.cancel(); + _weightSubscription?.cancel(); + super.dispose(); + } + + bool isSatuanService() { + if (selectedServiceId == null) return false; + try { + final service = + services.firstWhere((s) => s['id'].toString() == selectedServiceId); + return service['unit']?.toString().toUpperCase() == 'PCS'; + } catch (e) { + return false; + } + } + + Future fetchServices({bool showLoading = true}) async { + if (!mounted) return; + if (showLoading) setState(() => isLoading = true); + try { + final response = + await http.get(Uri.parse("${AppConfig.baseUrl}/services"), headers: { + 'Authorization': 'Bearer ${widget.userData['access_token']}', + }); + if (response.statusCode == 200) { + final decoded = json.decode(response.body); + _cachedServices = (decoded is Map && decoded.containsKey('data')) + ? decoded['data'] + : decoded; + setState(() { + services = _cachedServices!; + isLoading = false; + }); + } + } catch (e) { + if (mounted && _cachedServices == null) setState(() => isLoading = false); + } + } + + @override + Widget build(BuildContext context) { + _checkAndInitScale(); + bool isSatuan = isSatuanService(); + + Widget content = isLoading + ? Center(child: CircularProgressIndicator(color: primary)) + : Column( + children: [ + if (widget.pickupData == null) _buildAppBar(), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.fromLTRB( + 20, 24, 20, 100), // added bottom padding + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.pickupData != null + ? "Input Pesanan Pick Up" + : "Buat Pesanan", + style: GoogleFonts.inter( + fontSize: 28, + fontWeight: FontWeight.w700, + color: onSurface, + letterSpacing: -0.02)), + const SizedBox(height: 4), + Text( + widget.pickupData != null + ? "Selesaikan data pesanan dari layanan penjemputan." + : "Pilih layanan laundry untuk pesanan pelanggan.", + style: GoogleFonts.inter( + fontSize: 16, + color: onSurfaceVariant, + fontWeight: FontWeight.w400)), + const SizedBox(height: 24), + + if (widget.pickupData != null) ...[ + _buildPickupCustomerCard(), + const SizedBox(height: 24), + ], + + _buildSectionTitle("Pilih Layanan"), + const SizedBox(height: 12), + _buildServiceDropdown(), + + const SizedBox(height: 24), + if (_shouldShowEstimation) ...[ + _buildSectionTitle("Estimasi Waktu"), + const SizedBox(height: 12), + _buildEstimationCards(), + const SizedBox(height: 24), + ], + if (selectedServiceId != null) ...[ + _buildSectionTitle("Detail Input"), + const SizedBox(height: 12), + _buildInputDisplay(isSatuan), + const SizedBox(height: 16), + _buildAddButton(), + const SizedBox(height: 32), + ], + if (cartItems.isNotEmpty) ...[ + _buildSectionTitle("Keranjang"), + const SizedBox(height: 12), + _buildCartList(), + const SizedBox(height: 32), + ], + _buildSectionTitle("Metode Pengiriman"), + const SizedBox(height: 12), + _buildDeliveryOptions(), + const SizedBox(height: 32), + + // No longer need _buildPaymentSummaryCard here, we will show it dynamically above or floating if needed. Wait, HTML puts summary inside Cart. + + if (widget.isTab) const SizedBox(height: 100), + ], + ), + ), + ), + ], + ); + + return Scaffold( + backgroundColor: background, + body: Stack( + children: [ + content, + if (cartItems.isNotEmpty) + Positioned( + bottom: (widget.isTab || widget.pickupData != null) + ? 20 + : 0, // HTML uses fixed bottom-24 floating button + left: 20, + right: 20, + child: _buildFloatingPayButton(), + ), + ], + ), + bottomNavigationBar: + isLoading || widget.isTab || widget.pickupData != null + ? null + : _buildModernBottomBar(), + ); + } + + // --- WIDGET COMPONENTS --- + + Widget _buildPickupCustomerCard() { + final order = widget.pickupData!; + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: outlineVariant.withOpacity(0.5)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.person_pin_circle_rounded, color: primary, size: 24), + const SizedBox(width: 8), + Text("Informasi Pelanggan", + style: GoogleFonts.inter( + fontSize: 15, + fontWeight: FontWeight.w700, + color: onSurface)), + ], + ), + const SizedBox(height: 16), + _infoRow(Icons.person_outline_rounded, "Nama", + order['customer_name'] ?? '-'), + const SizedBox(height: 8), + _infoRow(Icons.phone_outlined, "Telepon", order['phone'] ?? '-'), + const SizedBox(height: 8), + _infoRow( + Icons.location_on_outlined, "Alamat", order['address'] ?? '-', + maxLines: 2), + ], + ), + ); + } + + Widget _infoRow(IconData icon, String label, String value, + {int maxLines = 1}) { + return Row( + crossAxisAlignment: + maxLines > 1 ? CrossAxisAlignment.start : CrossAxisAlignment.center, + children: [ + Icon(icon, size: 16, color: onSurfaceVariant), + const SizedBox(width: 8), + SizedBox( + width: 70, + child: Text(label, + style: GoogleFonts.inter(fontSize: 13, color: onSurfaceVariant)), + ), + const Text(": "), + Expanded( + child: Text(value, + maxLines: maxLines, + overflow: maxLines > 1 ? TextOverflow.ellipsis : null, + style: GoogleFonts.inter( + fontSize: 13, fontWeight: FontWeight.w600, color: onSurface)), + ), + ], + ); + } + + Widget _buildAppBar() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: surface.withOpacity(0.9), + border: Border( + bottom: BorderSide( + color: const Color(0xFFE6E8EA) + .withOpacity(0.5), // surfaceContainerHigh + width: 1.0, + ), + ), + ), + child: SafeArea( + bottom: false, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + width: 32, + height: 32, + decoration: const BoxDecoration( + color: Color(0xFFD8E2FF), // primaryFixed + shape: BoxShape.circle, + ), + clipBehavior: Clip.hardEdge, + child: Image.asset( + 'assets/app_icon.png', + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => Icon( + Icons.local_laundry_service_rounded, + color: primary, + size: 20), + ), + ), + const SizedBox(width: 8), + Text("My Laundry", + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: primary, + )), + ], + ), + const SizedBox(width: 48), // Empty space for alignment + ], + ), + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Text(title, + style: GoogleFonts.inter( + fontSize: 16, fontWeight: FontWeight.w600, color: onSurface)); + } + + Widget _buildServiceDropdown() { + final dynamic selectedService = selectedServiceId == null + ? null + : services.firstWhere((s) => s['id'].toString() == selectedServiceId, + orElse: () => null); + + return GestureDetector( + onTap: _showServicePicker, + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: selectedServiceId != null + ? primary + : outlineVariant.withOpacity(0.5), + width: 1.0), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: primary.withOpacity(0.1), + borderRadius: BorderRadius.circular(12)), + child: Icon(Icons.local_laundry_service_rounded, + color: primary, size: 24), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + selectedService != null + ? selectedService['name'] + : "Pilih Layanan Laundry", + style: GoogleFonts.inter( + fontSize: 15, + fontWeight: FontWeight.w600, + color: selectedService != null + ? onSurface + : onSurfaceVariant), + ), + if (selectedService != null) + Text( + "Rp ${formatHarga(selectedService['price'])} / ${selectedService['unit']}", + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: primary), + ) + else + Text( + "Ketuk untuk melihat daftar layanan", + style: GoogleFonts.inter( + fontSize: 12, + color: onSurfaceVariant.withOpacity(0.8), + fontWeight: FontWeight.w400), + ), + ], + ), + ), + Icon(Icons.keyboard_arrow_down_rounded, + color: onSurfaceVariant, size: 24), + ], + ), + ), + ); + } + + void _showServicePicker() { + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + isScrollControlled: true, + builder: (context) => Container( + height: MediaQuery.of(context).size.height * 0.7, + decoration: BoxDecoration( + color: background, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), + child: Column( + children: [ + const SizedBox(height: 12), + Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: outlineVariant, + borderRadius: BorderRadius.circular(2)), + ), + Padding( + padding: const EdgeInsets.all(24), + child: Row( + children: [ + Text("Pilih Layanan", + style: GoogleFonts.inter( + fontSize: 20, + fontWeight: FontWeight.w700, + color: onSurface)), + const Spacer(), + IconButton( + onPressed: () => Navigator.pop(context), + icon: Icon(Icons.close_rounded, color: onSurfaceVariant), + style: IconButton.styleFrom( + backgroundColor: surfaceContainerLowest), + ) + ], + ), + ), + Expanded( + child: ListView.separated( + padding: const EdgeInsets.fromLTRB(24, 0, 24, 40), + itemCount: services.length, + separatorBuilder: (_, __) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final s = services[index]; + bool isSelected = selectedServiceId == s['id'].toString(); + + Color iconBg = primary.withOpacity(0.1); + Color iconColor = primary; + IconData iconData = Icons.local_laundry_service_rounded; + if (s['unit'].toString().toUpperCase() == 'PCS') { + iconBg = tertiary.withOpacity(0.1); + iconColor = tertiary; + iconData = Icons.dry_cleaning; + } else if (s['name'] + .toString() + .toLowerCase() + .contains('setrika')) { + iconBg = primary.withOpacity(0.1); + iconColor = primary; + iconData = Icons.iron; + } else { + iconBg = secondary.withOpacity(0.1); + iconColor = secondary; + iconData = Icons.local_laundry_service; + } + + return GestureDetector( + onTap: () { + setState(() { + selectedServiceId = s['id'].toString(); + _calculateCurrentPrice(); + }); + Navigator.pop(context); + }, + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: isSelected + ? primary + : outlineVariant.withOpacity(0.5), + width: isSelected ? 1.5 : 1.0), + boxShadow: isSelected + ? [ + BoxShadow( + color: primary.withOpacity(0.1), + blurRadius: 4) + ] + : null, + ), + child: Row( + children: [ + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: isSelected ? iconColor : iconBg, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + iconData, + color: isSelected ? onPrimary : iconColor, + size: 20, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + s['name'], + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + fontSize: 14, + color: onSurface), + ), + Text( + s['unit'].toString().toUpperCase() == 'PCS' + ? 'Perawatan premium' + : 'Bersih & harum', + style: GoogleFonts.inter( + fontSize: 11, color: onSurfaceVariant), + ), + ], + ), + ), + Text( + "Rp ${formatHarga(s['price'])}/${s['unit'].toString().toLowerCase() == 'kg' ? 'kg' : 'pc'}", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + fontSize: 14, + color: primary), + ), + ], + ), + ), + ); + }, + ), + ), + ], + ), + ), + ); + } + + Widget _buildEstimationCards() { + // Filter estimasi berdasarkan konfigurasi harga tambahan di pengaturan + final availableEstimations = estimations.where((est) { + if (est['id'].toString() == "1") return true; // Reguler selalu tampil + if (est['id'].toString() == "2") return _expressExtraPrice > 0; + if (est['id'].toString() == "3") return _kilatExtraPrice > 0; + return true; + }).toList(); + + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: availableEstimations.map((est) { + bool isSelected = selectedEstimationId == est['id'].toString(); + + // Memberi warna aksen berbeda untuk tiap estimasi + Color estColor; + if (est['id'].toString() == "1") { + estColor = successGreen; + } else if (est['id'].toString() == "2") { + estColor = error; + } else { + estColor = error; + } + + return GestureDetector( + onTap: () => setState(() { + selectedEstimationId = est['id'].toString(); + _calculateCurrentPrice(); + }), + child: Container( + width: 140, + margin: const EdgeInsets.only(right: 12, bottom: 4), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: isSelected + ? estColor.withOpacity(0.08) + : surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: + isSelected ? estColor : outlineVariant.withOpacity(0.3), + width: 1.0, + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon( + isSelected + ? Icons.bolt_rounded + : Icons.schedule_rounded, + color: isSelected ? estColor : onSurfaceVariant), + Container( + width: 22, + height: 22, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isSelected ? estColor : Colors.transparent, + border: Border.all( + color: isSelected ? estColor : outlineVariant, + width: 1.5), + ), + child: isSelected + ? const Icon(Icons.check, + size: 14, color: Colors.white) + : null, + ) + ], + ), + const SizedBox(height: 12), + Text(est['name'].toString().split(' ')[0], + style: GoogleFonts.inter( + fontWeight: FontWeight.w700, + fontSize: 15, + color: isSelected ? estColor : onSurface)), + Text( + est['name'] + .toString() + .replaceAll(est['name'].toString().split(' ')[0], '') + .trim(), + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w500, + color: isSelected ? estColor : onSurfaceVariant)), + const SizedBox(height: 12), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: isSelected + ? estColor + : outlineVariant.withOpacity(0.5), + borderRadius: BorderRadius.circular(8), + ), + child: Text(est['desc'], + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: FontWeight.w700, + color: isSelected ? Colors.white : onSurfaceVariant, + letterSpacing: 0.5)), + ) + ], + ), + ), + ); + }).toList(), + ), + ); + } + + Widget _buildInputDisplay(bool isSatuan) { + // Variasi warna untuk membedakan mode satuan dan mode kiloan + Color inputAccentColor = isSatuan ? error : primary; + + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: outlineVariant.withOpacity(0.3), width: 1.0), + ), + child: Column( + children: [ + isSatuan + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: inputAccentColor.withOpacity(0.1), + border: Border.all( + color: inputAccentColor.withOpacity(0.3), + width: 1.0), + borderRadius: BorderRadius.circular(12)), + child: Icon(Icons.checkroom_rounded, + color: inputAccentColor), + ), + const SizedBox(width: 16), + Text("Jumlah Pcs", + style: GoogleFonts.inter( + fontWeight: FontWeight.w700, + fontSize: 15, + color: onSurface)), + ], + ), + Container( + decoration: BoxDecoration( + color: background, + border: Border.all(color: outlineVariant, width: 1.0), + borderRadius: BorderRadius.circular(30)), + child: Row( + children: [ + IconButton( + icon: const Icon(Icons.remove, size: 20), + color: inputAccentColor, + onPressed: () { + if (quantity > 1) { + setState(() { + quantity--; + _calculateCurrentPrice(); + }); + } + }, + ), + SizedBox( + width: 24, + child: Text("$quantity", + textAlign: TextAlign.center, + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + fontSize: 16))), + IconButton( + icon: const Icon(Icons.add, size: 20), + color: Colors.white, + style: IconButton.styleFrom( + backgroundColor: inputAccentColor), + onPressed: () { + setState(() { + quantity++; + _calculateCurrentPrice(); + }); + }, + ), + ], + ), + ) + ], + ) + : Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: inputAccentColor.withOpacity(0.1), + border: Border.all( + color: inputAccentColor.withOpacity(0.3), + width: 1.0), + borderRadius: BorderRadius.circular(12)), + child: Icon(Icons.scale_rounded, color: inputAccentColor), + ), + const SizedBox(width: 16), + Expanded( + child: Text("Berat Pakaian", + style: GoogleFonts.inter( + fontWeight: FontWeight.w700, + fontSize: 15, + color: onSurface)), + ), + Text("${weight.toStringAsFixed(3)} kg", + style: GoogleFonts.inter( + fontSize: 24, + fontWeight: FontWeight.w600, + color: inputAccentColor, + letterSpacing: -0.5)), + ], + ), + const SizedBox(height: 16), + Divider(color: outlineVariant, height: 1.0), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Subtotal", + style: GoogleFonts.inter( + color: onSurfaceVariant, + fontWeight: FontWeight.w500, + fontSize: 14)), + Text("Rp ${formatHarga(currentItemPrice)}", + style: GoogleFonts.inter( + color: primary, + fontWeight: FontWeight.w700, + fontSize: 18)), + ], + ) + ], + ), + ); + } + + Widget _buildAddButton() { + return SizedBox( + width: double.infinity, + height: 48, + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: primary.withOpacity(0.1), + foregroundColor: primary, + elevation: 0, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + onPressed: _addItemToCart, + icon: const Icon(Icons.add_circle_outline, size: 20), + label: Text("Tambahkan Item Ini", + style: + GoogleFonts.inter(fontWeight: FontWeight.w600, fontSize: 14)), + ), + ); + } + + Widget _buildCartList() { + int subtotal = + cartItems.fold(0, (sum, item) => sum + (item['price'] as int)); + int totalEstimasi = subtotal; // Delivery fee is set later + + return Container( + decoration: BoxDecoration( + color: surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: outlineVariant.withOpacity(0.5), width: 1.0), + boxShadow: [ + BoxShadow( + color: onSurface.withOpacity(0.02), + blurRadius: 4, + offset: const Offset(0, 2)) + ], + ), + child: Column( + children: [ + ListView.separated( + padding: const EdgeInsets.all(12), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: cartItems.length, + separatorBuilder: (_, __) => + Divider(color: outlineVariant.withOpacity(0.3), height: 24), + itemBuilder: (context, index) { + final item = cartItems[index]; + + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(item['service_name'], + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: onSurface, + fontSize: 14)), + Text( + item['estimation_name'].toString().isNotEmpty + ? "${item['estimation_name']} • ${item['unit'] == 'PCS' ? item['weight'].toInt() : item['weight'].toStringAsFixed(3)} ${item['unit']}" + : "${item['unit'] == 'PCS' ? item['weight'].toInt() : item['weight'].toStringAsFixed(3)} ${item['unit']}", + style: GoogleFonts.inter( + color: onSurfaceVariant, + fontSize: 11, + fontWeight: FontWeight.w400)), + ], + ), + ), + Text("Rp ${formatHarga(item['price'])}", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: onSurface, + fontSize: 14)), + const SizedBox(width: 12), + InkWell( + onTap: () => _removeItem(index), + borderRadius: BorderRadius.circular(20), + child: Container( + width: 28, + height: 28, + decoration: BoxDecoration( + border: Border.all(color: outlineVariant), + shape: BoxShape.circle), + child: + Icon(Icons.remove, color: onSurfaceVariant, size: 16), + ), + ) + ], + ); + }, + ), + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: surfaceContainer.withOpacity(0.5), + border: Border( + top: BorderSide(color: outlineVariant.withOpacity(0.3))), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Total Estimasi", + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w600, + color: onSurface)), + Text("Rp ${formatHarga(_roundTo500(totalEstimasi))}", + style: GoogleFonts.inter( + fontSize: 20, + fontWeight: FontWeight.w600, + color: primary)), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildDeliveryOptions() { + return Row( + children: deliveryOptions.map((option) { + bool isSelected = selectedDeliveryOption == option; + + return Expanded( + child: GestureDetector( + onTap: () => setState(() => selectedDeliveryOption = option), + child: Container( + margin: EdgeInsets.only( + right: option == deliveryOptions.first ? 6 : 0, + left: option == deliveryOptions.last ? 6 : 0), + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 8), + decoration: BoxDecoration( + color: isSelected + ? primary.withOpacity(0.05) + : surfaceContainerLowest, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: isSelected ? primary : outlineVariant.withOpacity(0.3), + width: 1.0, + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + option == "Ambil di Toko" + ? Icons.store + : Icons.moped_rounded, + color: isSelected ? primary : onSurfaceVariant, + size: 24), + const SizedBox(height: 4), + Text( + option, + textAlign: TextAlign.center, + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w500, + color: isSelected ? primary : onSurface, + ), + ), + ], + ), + ), + ), + ); + }).toList(), + ); + } + + Widget _buildModernBottomBar() { + return Container( + decoration: BoxDecoration( + color: surfaceContainerLowest, + border: Border(top: BorderSide(color: surfaceVariant.withOpacity(0.5))), + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _navItem(Icons.home_outlined, "Beranda", false, () { + if (_devicePath.isNotEmpty) { + _dbRef.child('$_devicePath/screen_status').set("OFF"); + } + Navigator.pop(context); + }), + _navItem(Icons.add_circle, "Input", true, () {}), + _navItem(Icons.person_outline, "Profil", false, () { + if (_devicePath.isNotEmpty) { + _dbRef.child('$_devicePath/screen_status').set("OFF"); + } + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (_) => + ProfilePage(userData: widget.userData))); + }), + ], + ), + ), + ), + ); + } + + Widget _navItem( + IconData icon, String label, bool isActive, VoidCallback onTap) { + if (isActive) { + return InkWell( + onTap: onTap, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + decoration: BoxDecoration( + color: primary.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Icon(icon, color: primary, size: 24), + ), + const SizedBox(height: 4), + Text(label, + style: GoogleFonts.inter( + fontSize: 12, fontWeight: FontWeight.w600, color: primary)), + ], + ), + ); + } + + return InkWell( + onTap: onTap, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 24, color: onSurfaceVariant), + const SizedBox(height: 4), + Text(label, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w500, + color: onSurfaceVariant)), + ], + ), + ); + } + + Widget _buildFloatingPayButton() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primary, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + elevation: 0, + ), + onPressed: () { + double totalWeight = cartItems.fold( + 0, (sum, item) => sum + (item['weight'] as double)); + + String estType = "Reguler"; + if (cartItems + .every((e) => e['estimation_name'].toString().trim().isEmpty)) { + estType = "None"; + } else if (cartItems.any((e) => e['estimation_name'] + .toString() + .toLowerCase() + .contains('kilat'))) { + estType = "Kilat"; + } else if (cartItems.any((e) => + e['estimation_name'] + .toString() + .toLowerCase() + .contains('ekspres') || + e['estimation_name'] + .toString() + .toLowerCase() + .contains('express'))) { + estType = "Ekspres"; + } + + int totalBill = _roundTo500( + cartItems.fold(0, (sum, item) => sum + (item['price'] as int))); + + // Bersihkan item yang menggantung (tidak jadi di-add) agar OLED update hanya sesuai isi keranjang valid + _resetInputForm(); + + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => PaymentPage( + totalBill: totalBill, + cartItems: cartItems, + userData: widget.userData, + weight: totalWeight, + deliveryType: deliveryType, + estimationType: estType, + pickupData: widget.pickupData, + ), + )).then((result) { + if (result == true) { + setState(() { + cartItems = []; + grandTotalPrice = 0; + _resetInputForm(); + }); + } + }); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Proses Pesanan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + fontSize: 16, + color: onPrimary)), + ], + ), + ), + ); + } + + void _showSnackBar(String msg, Color bg) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Icon( + bg == successGreen + ? Icons.check_circle_outline + : Icons.error_outline_rounded, + color: Colors.white, + size: 28, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bg == successGreen ? "Berhasil" : "Peringatan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 14, + color: Colors.white), + ), + Text( + msg, + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white.withOpacity(0.9), + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ], + ), + ), + behavior: SnackBarBehavior.floating, + backgroundColor: bg.withOpacity(0.95), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white.withOpacity(0.2), width: 1), + ), + duration: const Duration(seconds: 3), + )); + } +} diff --git a/laundry_mobile/lib/staf/laundry/map.dart b/laundry_mobile/lib/staf/laundry/map.dart new file mode 100644 index 0000000..8846f60 --- /dev/null +++ b/laundry_mobile/lib/staf/laundry/map.dart @@ -0,0 +1,507 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import 'dart:async'; +import 'package:google_fonts/google_fonts.dart'; +import 'dart:ui' as ui; // Solusi untuk mengatasi bentrok Path +import 'package:shared_preferences/shared_preferences.dart'; + +class MapPickerPage extends StatefulWidget { + final LatLng? initialLocation; + const MapPickerPage({super.key, this.initialLocation}); + + @override + State createState() => _MapPickerPageState(); +} + +class _MapPickerPageState extends State { + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color background = const Color(0xFFF7F9FB); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF0F4F8); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + + LatLng _selectedLocation = + const LatLng(-6.200000, 106.816666); // Default Jakarta + final MapController _mapController = MapController(); + bool _isLoading = true; + + // Search variables + final TextEditingController _searchController = TextEditingController(); + List _searchResults = []; + Timer? _debounce; + + @override + void initState() { + super.initState(); + if (widget.initialLocation != null) { + _selectedLocation = widget.initialLocation!; + } else { + _loadShopLocation(); + } + _isLoading = false; + } + + Future _loadShopLocation() async { + try { + final prefs = await SharedPreferences.getInstance(); + final userStr = prefs.getString('userData'); + if (userStr != null) { + final userData = json.decode(userStr); + final shop = userData['shop']; + if (shop != null) { + final lat = shop['shop_latitude'] ?? shop['latitude']; + final lng = shop['shop_longitude'] ?? shop['longitude']; + if (lat != null && lng != null) { + setState(() { + _selectedLocation = LatLng( + double.parse(lat.toString()), double.parse(lng.toString())); + _mapController.move(_selectedLocation, 15.0); + }); + } + } + } + } catch (e) { + debugPrint("Gagal memuat lokasi toko: $e"); + } + } + + @override + void dispose() { + _searchController.dispose(); + _debounce?.cancel(); + super.dispose(); + } + + Future _determinePosition() async { + bool serviceEnabled; + LocationPermission permission; + + setState(() => _isLoading = true); + + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + setState(() => _isLoading = false); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Layanan lokasi (GPS) tidak aktif. Silakan aktifkan terlebih dahulu.'))); + } + return; + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + setState(() => _isLoading = false); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Izin lokasi ditolak oleh pengguna.'))); + } + return; + } + } + + if (permission == LocationPermission.deniedForever) { + setState(() => _isLoading = false); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text('Izin lokasi ditolak permanen. Buka pengaturan untuk mengizinkan.'), + action: SnackBarAction( + label: 'PENGATURAN', + textColor: Colors.white, + onPressed: () { + Geolocator.openAppSettings(); + }, + ), + ), + ); + } + return; + } + + try { + Position position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.high, + timeLimit: Duration(seconds: 10), + ), + ); + if (mounted) { + setState(() { + _selectedLocation = LatLng(position.latitude, position.longitude); + _isLoading = false; + }); + _mapController.move(_selectedLocation, 16.0); + } + } catch (e) { + if (mounted) { + setState(() => _isLoading = false); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Gagal mendapatkan lokasi saat ini: $e'))); + } + } + } + + Future _searchAddress(String query) async { + if (query.isEmpty) { + setState(() { + _searchResults = []; + }); + return; + } + + try { + final response = await http.get( + Uri.parse( + 'https://nominatim.openstreetmap.org/search?q=$query&format=json&limit=5&addressdetails=1'), + headers: {'User-Agent': 'laundry_mobile_app'}, + ); + + if (response.statusCode == 200) { + setState(() { + _searchResults = json.decode(response.body); + }); + } + // ignore: empty_catches + } catch (e) {} + } + + void _onSearchChanged(String query) { + if (_debounce?.isActive ?? false) _debounce?.cancel(); + _debounce = Timer(const Duration(milliseconds: 500), () { + _searchAddress(query); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: background, + appBar: AppBar( + backgroundColor: Colors.white.withOpacity(0.95), + elevation: 0, + scrolledUnderElevation: 1, + centerTitle: true, + leading: IconButton( + onPressed: () => Navigator.pop(context), + icon: + Icon(Icons.arrow_back_ios_new_rounded, color: onSurface, size: 20), + ), + title: Text("Pilih Lokasi Alamat", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w700, fontSize: 16)), + bottom: PreferredSize( + preferredSize: const Size.fromHeight(1.0), + child: Container(color: outlineVariant, height: 1.0), + ), + ), + body: Stack( + children: [ + FlutterMap( + mapController: _mapController, + options: MapOptions( + initialCenter: _selectedLocation, + initialZoom: 15, + onPositionChanged: (position, hasGesture) { + if (hasGesture) { + setState(() { + _selectedLocation = position.center; + }); + } + }, + ), + children: [ + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'com.example.laundry_mobile', + ), + ], + ), + + // Search Bar + Positioned( + top: 20, + left: 20, + right: 20, + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: outlineVariant, width: 2.0), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), + blurRadius: 20, + offset: const Offset(0, 8), + ) + ], + ), + child: TextField( + controller: _searchController, + onChanged: _onSearchChanged, + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: onSurface, + fontSize: 14), + decoration: InputDecoration( + hintText: "Cari alamat atau nama tempat...", + hintStyle: GoogleFonts.inter( + color: onSurfaceVariant.withOpacity(0.6), + fontWeight: FontWeight.w500, + fontSize: 14), + prefixIcon: Icon(Icons.search_rounded, + color: primary, size: 22), + suffixIcon: _searchController.text.isNotEmpty + ? IconButton( + icon: Icon(Icons.cancel_rounded, + size: 20, color: onSurfaceVariant), + onPressed: () { + _searchController.clear(); + setState(() => _searchResults = []); + }, + ) + : null, + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric(vertical: 16), + ), + ), + ), + + // Hasil Pencarian + if (_searchResults.isNotEmpty) + Container( + margin: const EdgeInsets.only(top: 8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: outlineVariant, width: 2.0), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), + blurRadius: 20, + offset: const Offset(0, 8), + ) + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(14), + child: ListView.separated( + shrinkWrap: true, + padding: EdgeInsets.zero, + itemCount: _searchResults.length, + separatorBuilder: (context, index) => + Divider(height: 1, color: outlineVariant), + itemBuilder: (context, index) { + final item = _searchResults[index]; + return ListTile( + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 4), + leading: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: background, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: outlineVariant)), + child: Icon(Icons.location_on_rounded, + size: 20, color: primary), + ), + title: Text( + item['display_name'], + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w500, + color: onSurface), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + onTap: () { + final lat = double.parse(item['lat']); + final lon = double.parse(item['lon']); + final newPos = LatLng(lat, lon); + setState(() { + _selectedLocation = newPos; + _searchResults = []; + _searchController.text = item['display_name']; + }); + _mapController.move(newPos, 16.0); + FocusScope.of(context).unfocus(); + }, + ); + }, + ), + ), + ), + ], + ), + ), + + // Center Marker + Center( + child: Padding( + padding: const EdgeInsets.only(bottom: 35), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: primary, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.4), + blurRadius: 12, + offset: const Offset(0, 6)) + ], + border: Border.all(color: Colors.white, width: 3)), + child: const Icon(Icons.location_on_rounded, + color: Colors.white, size: 28), + ), + // Segitiga kecil dibawah marker + ClipPath( + clipper: _TriangleClipper(), + child: Container( + width: 14, + height: 10, + color: primary, + ), + ) + ], + ), + ), + ), + + // Loading Overlay + if (_isLoading) + Container( + color: Colors.white.withOpacity(0.8), + child: + Center(child: CircularProgressIndicator(color: primary)), + ), + + // UI Buttons Bottom + Positioned( + bottom: 24, + left: 20, + right: 20, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + // Tombol My Location + InkWell( + onTap: _determinePosition, + borderRadius: BorderRadius.circular(16), + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: outlineVariant, width: 2.0), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), + blurRadius: 15, + offset: const Offset(0, 5), + ) + ], + ), + child: Icon(Icons.my_location_rounded, + color: primary, size: 24), + ), + ), + const SizedBox(height: 16), + + // Panel Konfirmasi + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + border: Border.all(color: outlineVariant, width: 2.0), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.08), + blurRadius: 24, + offset: const Offset(0, 10), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Geser peta untuk menentukan titik alamat", + textAlign: TextAlign.center, + style: GoogleFonts.inter( + color: onSurfaceVariant, + fontSize: 13, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 16), + SizedBox( + width: double.infinity, + height: 54, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primary, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + elevation: 0, + ), + onPressed: () { + Navigator.pop(context, _selectedLocation); + }, + child: Text( + "KONFIRMASI LOKASI", + style: GoogleFonts.inter( + color: Colors.white, + fontWeight: FontWeight.w700, + fontSize: 15, + letterSpacing: 0.5, + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} + +// Menggunakan ui.Path agar tidak tertukar dengan Path milik latlong2 +class _TriangleClipper extends CustomClipper { + @override + ui.Path getClip(Size size) { + final path = ui.Path(); + path.lineTo(size.width, 0.0); + path.lineTo(size.width / 2, size.height); + path.close(); + return path; + } + + @override + bool shouldReclip(_TriangleClipper oldClipper) => false; +} diff --git a/laundry_mobile/lib/staf/laundry/payment.dart b/laundry_mobile/lib/staf/laundry/payment.dart new file mode 100644 index 0000000..b20889e --- /dev/null +++ b/laundry_mobile/lib/staf/laundry/payment.dart @@ -0,0 +1,954 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import '../../config.dart'; +import 'dart:convert'; +import 'dart:async'; +import 'package:firebase_database/firebase_database.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'map.dart'; +import '../beranda.dart'; + +class PaymentPage extends StatefulWidget { + final int totalBill; + final List cartItems; + final Map userData; + final double weight; + final String deliveryType; + final String estimationType; + final Map? pickupData; + + const PaymentPage({ + super.key, + required this.totalBill, + required this.cartItems, + required this.userData, + required this.weight, + required this.deliveryType, + required this.estimationType, + this.pickupData, + }); + + @override + State createState() => _PaymentPageState(); +} + +class _PaymentPageState extends State { + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color background = const Color(0xFFF7F9FB); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF0F4F8); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + final Color successGreen = const Color(0xFF10B981); + final Color errorRed = const Color(0xFFBA1A1A); + + // State + String selectedMethod = "Tunai"; + bool _isSubmitting = false; + // ignore: unused_field + bool _isLoadingFee = false; + int change = 0; + int _deliveryFee = 0; + + String formatHarga(dynamic value) { + if (value == null) return "0"; + String val = value.toString(); + RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'); + return val.replaceAllMapped(reg, (Match m) => '${m[1]}.'); + } + + /// Membulatkan harga ke atas kelipatan 500 + int _roundTo500(int value) { + return ((value / 500).ceil() * 500).toInt(); + } + + // Controllers + final TextEditingController _cashReceivedController = TextEditingController(); + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _phoneController = TextEditingController(); + final TextEditingController _addressController = TextEditingController(); + + LatLng? _selectedCoordinates; + + @override + void initState() { + super.initState(); + _cashReceivedController.text = "0"; + _calculateChange("0"); + + if (widget.pickupData != null) { + _nameController.text = widget.pickupData!['customer_name'] ?? ''; + _phoneController.text = widget.pickupData!['phone'] ?? ''; + _addressController.text = widget.pickupData!['address'] ?? ''; + + if (widget.pickupData!['latitude'] != null && + widget.pickupData!['longitude'] != null) { + _selectedCoordinates = LatLng( + double.tryParse(widget.pickupData!['latitude'].toString()) ?? 0.0, + double.tryParse(widget.pickupData!['longitude'].toString()) ?? 0.0, + ); + _checkDeliveryFee(_selectedCoordinates!); + } + } + } + + Future _checkDeliveryFee(LatLng loc) async { + setState(() => _isLoadingFee = true); + try { + final String? token = widget.userData['access_token']; + final response = await http.post( + Uri.parse("${AppConfig.baseUrl}/check-delivery-fee"), + headers: { + "Content-Type": "application/json", + "Accept": "application/json", + "Authorization": "Bearer $token", + }, + body: json.encode({ + "latitude": loc.latitude, + "longitude": loc.longitude, + "delivery_type": widget.deliveryType, + }), + ); + + if (response.statusCode == 200) { + final data = json.decode(response.body); + setState(() { + _deliveryFee = + _roundTo500((data['delivery_fee'] as num?)?.toInt() ?? 0); + }); + _calculateChange(_cashReceivedController.text); + } + } catch (e) { + debugPrint("Error check delivery fee: $e"); + } finally { + if (mounted) setState(() => _isLoadingFee = false); + } + } + + void _calculateChange(String value) { + int received = int.tryParse(value.replaceAll(RegExp(r'[^0-9]'), '')) ?? 0; + int roundedTotal = _roundTo500(widget.totalBill + _deliveryFee); + setState(() { + change = received - roundedTotal; + if (change < 0) change = 0; + }); + } + + Future _submitTransaction() async { + if (_nameController.text.isEmpty || _phoneController.text.isEmpty) { + _showSnackBar("Nama dan Nomor WA wajib diisi!", Colors.orange); + return; + } + + if (widget.deliveryType != 'none' && _addressController.text.isEmpty) { + _showSnackBar( + "Alamat lengkap wajib diisi untuk layanan driver!", Colors.orange); + return; + } + + if (selectedMethod == "Tunai") { + int received = int.tryParse( + _cashReceivedController.text.replaceAll(RegExp(r'[^0-9]'), '')) ?? + 0; + int roundedTotal = _roundTo500(widget.totalBill + _deliveryFee); + + if (received <= 0) { + _showSnackBar("Masukkan nominal uang!", Colors.orange); + return; + } + + if (received < roundedTotal) { + _showSnackBar( + "Uang tidak cukup! Tagihan: Rp ${formatHarga(roundedTotal)}", + Colors.red); + return; + } + } + + setState(() => _isSubmitting = true); + try { + final String? token = widget.userData['access_token']; + final response = await http.post( + Uri.parse("${AppConfig.baseUrl}/transactions"), + headers: { + "Content-Type": "application/json", + "Accept": "application/json", + "Authorization": "Bearer $token", + }, + body: json.encode({ + "customer_name": _nameController.text.trim(), + "phone": _phoneController.text.trim(), + "address": widget.deliveryType != 'none' + ? _addressController.text.trim() + : null, + "items": widget.cartItems + .map((item) => { + "service_id": item['service_id'], + "service_name": item['service_name'], + "price": item['price'], // Note: this is subtotal price + "qty_or_weight": item['weight'], + "unit": item['unit'], + "subtotal": item['price'], + "estimation_name": item['estimation_name'], + }) + .toList(), + "total_weight": widget.weight, + "total_price": _roundTo500(widget.totalBill), + "latitude": _selectedCoordinates?.latitude, + "longitude": _selectedCoordinates?.longitude, + "status": "ANTRIAN", + "payment_method": selectedMethod == "Tunai" + ? "CASH" + : (selectedMethod == "QRIS" ? "QRIS" : "BAYAR NANTI"), + "estimation_type": widget.estimationType, + "delivery_type": widget.deliveryType, + if (widget.pickupData != null && widget.pickupData!['id'] != null) + "order_id": widget.pickupData!['id'], + "cash_received": selectedMethod == "Tunai" + ? (int.tryParse(_cashReceivedController.text + .replaceAll(RegExp(r'[^0-9]'), '')) ?? + widget.totalBill) + : (selectedMethod == "QRIS" ? widget.totalBill : 0), + "cash_change": selectedMethod == "Tunai" ? change : 0, + }), + ); + + if (response.statusCode == 200 || response.statusCode == 201) { + _showSnackBar("Transaksi Berhasil & WA Terkirim!", successGreen); + + try { + final dbRef = FirebaseDatabase.instance.ref(); + await dbRef.child('laundry/screen_status').set("RESTART"); + } catch(e) { + debugPrint("Failed to send RESTART command: $e"); + } + + await Future.delayed(const Duration(seconds: 1)); + if (mounted) { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + builder: (context) => BerandaPage(userData: widget.userData), + ), + (route) => false, + ); + } + } else { + _showSnackBar( + "Gagal simpan transaksi: ${response.statusCode}", Colors.red); + } + } catch (e) { + _showSnackBar("Error koneksi: $e", Colors.red); + } finally { + if (mounted) setState(() => _isSubmitting = false); + } + } + + void _showSnackBar(String message, Color color) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Icon( + color == successGreen + ? Icons.check_circle_outline + : Icons.error_outline_rounded, + color: Colors.white, + size: 28, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + color == successGreen ? "Berhasil" : "Peringatan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 14, + color: Colors.white), + ), + Text( + message, + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white.withOpacity(0.9), + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ], + ), + ), + behavior: SnackBarBehavior.floating, + backgroundColor: color.withOpacity(0.95), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white.withOpacity(0.2), width: 1), + ), + duration: const Duration(seconds: 3), + )); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: background, + appBar: _buildModernAppBar(), + body: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildBillCard(), + const SizedBox(height: 32), + _buildSectionHeader("Data Pelanggan"), + const SizedBox(height: 12), + _buildCustomerForm(), + if (widget.deliveryType != 'none') ...[ + const SizedBox(height: 24), + _buildSectionHeader("Alamat"), + const SizedBox(height: 12), + _buildAddressForm(), + ], + const SizedBox(height: 24), + _buildSectionHeader("Metode Pembayaran"), + const SizedBox(height: 12), + _buildPaymentMethodSection(), + const SizedBox(height: 40), + ], + ), + ), + bottomNavigationBar: _buildBottomAction(), + ); + } + + // --- WIDGET COMPONENTS --- + + PreferredSizeWidget _buildModernAppBar() { + return AppBar( + backgroundColor: Colors.white.withOpacity(0.95), + elevation: 0, + scrolledUnderElevation: 1, + centerTitle: true, + leading: IconButton( + onPressed: () => Navigator.pop(context), + icon: + Icon(Icons.arrow_back_ios_new_rounded, color: onSurface, size: 20), + ), + title: Text("Konfirmasi Bayar", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w700, fontSize: 18)), + ); + } + + Widget _buildSectionHeader(String title) { + return Text(title, + style: GoogleFonts.inter( + color: onSurface, fontSize: 16, fontWeight: FontWeight.w700)); + } + + Widget _buildBillCard() { + // Tentukan label layanan driver + String driverLabel; + switch (widget.deliveryType) { + case 'pickup': + driverLabel = 'Pick-up'; + break; + case 'delivery': + driverLabel = 'Delivery'; + break; + case 'both': + driverLabel = 'Pick-up & Delivery'; + break; + default: + driverLabel = 'Ambil di Toko'; + } + + return Container( + decoration: BoxDecoration( + color: surfaceContainerLowest, + border: Border.all(color: outlineVariant), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: primary.withOpacity(0.08), + borderRadius: + const BorderRadius.vertical(top: Radius.circular(11)), + border: Border( + bottom: BorderSide(color: outlineVariant.withOpacity(0.5))), + ), + child: Text( + "RINCIAN PESANAN", + textAlign: TextAlign.center, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w700, + color: primary, + letterSpacing: 1.5, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text("Layanan & Harga", + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurfaceVariant)), + const SizedBox(height: 8), + Container( + decoration: BoxDecoration( + color: surface, + border: Border.all(color: outlineVariant), + borderRadius: BorderRadius.circular(8), + ), + child: Column( + children: widget.cartItems.asMap().entries.map((entry) { + int idx = entry.key; + var item = entry.value; + String qtyStr = item['unit'] == 'PCS' + ? "${item['weight'].toInt()} PCS" + : "${item['weight'].toStringAsFixed(3)} KG"; + String namePart = "${item['service_name']} ($qtyStr)"; + String pricePart = "Rp ${formatHarga(item['price'])}"; + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 10), + decoration: BoxDecoration( + border: idx != widget.cartItems.length - 1 + ? Border( + bottom: BorderSide( + color: outlineVariant.withOpacity(0.5))) + : null, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text(namePart, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurface))), + Text(pricePart, + style: GoogleFonts.inter( + fontSize: 12, + fontWeight: FontWeight.w600, + color: onSurface)), + ], + ), + ); + }).toList(), + ), + ), + const SizedBox(height: 16), + _buildReceiptRow("Opsi Pengiriman", driverLabel), + if (widget.deliveryType != 'none') ...[ + const SizedBox(height: 12), + _buildReceiptRow( + "Tarif Driver", + _selectedCoordinates == null + ? "Pilih Lokasi" + : (_deliveryFee > 0 + ? "Rp ${formatHarga(_deliveryFee)}" + : "Gratis Ongkir"), + isHighlight: + _deliveryFee == 0 && _selectedCoordinates != null, + ), + ], + const SizedBox(height: 16), + _buildDashedLine(), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("Total Tagihan", + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.w600, + color: primary)), + Text( + "Rp ${formatHarga(_roundTo500(widget.totalBill + _deliveryFee))}", + style: GoogleFonts.inter( + fontSize: 22, + fontWeight: FontWeight.w700, + color: primary, + letterSpacing: -0.5)), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildReceiptRow(String label, String value, + {bool isHighlight = false}) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, + style: GoogleFonts.inter( + color: onSurfaceVariant, + fontSize: 12, + fontWeight: FontWeight.w600)), + const SizedBox(width: 16), + Flexible( + child: Text(value, + textAlign: TextAlign.right, + style: GoogleFonts.inter( + color: isHighlight ? successGreen : onSurface, + fontSize: 14, + fontWeight: FontWeight.w600)), + ), + ], + ); + } + + Widget _buildDashedLine() { + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + final boxWidth = constraints.constrainWidth(); + const dashWidth = 5.0; + const dashHeight = 1.0; + final dashCount = (boxWidth / (2 * dashWidth)).floor(); + return Flex( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + children: List.generate(dashCount, (_) { + return SizedBox( + width: dashWidth, + height: dashHeight, + child: DecoratedBox( + decoration: BoxDecoration(color: outlineVariant), + ), + ); + }), + ); + }, + ); + } + + Widget _buildCustomerForm() { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: outlineVariant, width: 1.0), // Dipertipis + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), // Diperlembut + blurRadius: 20, + offset: const Offset(0, 6)) + ], + ), + child: Column( + children: [ + _buildInputField( + "Nama Pelanggan", Icons.person_outline_rounded, _nameController), + const SizedBox(height: 16), + _buildInputField( + "Nomor WhatsApp", Icons.phone_outlined, _phoneController, + type: TextInputType.phone), + ], + ), + ); + } + + Widget _buildAddressForm() { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: outlineVariant, width: 1.0), // Dipertipis + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), // Diperlembut + blurRadius: 20, + offset: const Offset(0, 6)) + ], + ), + child: Column( + children: [ + TextField( + controller: _addressController, + maxLines: 3, + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w500, fontSize: 14), + decoration: InputDecoration( + hintText: "Masukkan alamat lengkap beserta patokan...", + hintStyle: GoogleFonts.inter( + color: onSurfaceVariant.withOpacity(0.5), + fontWeight: FontWeight.w400), + filled: true, + fillColor: background, + contentPadding: const EdgeInsets.all(16), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: outlineVariant, width: 1.0)), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: outlineVariant, width: 1.0)), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: primary, width: 1.0)), + ), + ), + const SizedBox(height: 16), + InkWell( + onTap: () async { + final result = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => const MapPickerPage()), + ); + if (result != null && result is LatLng) { + setState(() { + _selectedCoordinates = result; + }); + _checkDeliveryFee(result); + } + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 14, horizontal: 16), + decoration: BoxDecoration( + color: _selectedCoordinates != null + ? successGreen.withOpacity(0.1) + : background, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: _selectedCoordinates != null + ? successGreen + : outlineVariant, + width: 1.0, // Dipertipis + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + _selectedCoordinates != null + ? Icons.location_on_rounded + : Icons.map_outlined, + size: 20, + color: + _selectedCoordinates != null ? successGreen : onSurface, + ), + const SizedBox(width: 8), + Text( + _selectedCoordinates != null + ? "Lokasi Sudah Disematkan" + : "Sematkan Lokasi di Map", + style: GoogleFonts.inter( + fontSize: 13, + fontWeight: FontWeight.w600, + color: _selectedCoordinates != null + ? successGreen + : onSurface, + ), + ), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _buildInputField( + String hint, IconData icon, TextEditingController ctrl, + {TextInputType type = TextInputType.text}) { + return TextField( + controller: ctrl, + keyboardType: type, + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w500, fontSize: 14), + decoration: InputDecoration( + prefixIcon: Icon(icon, color: onSurfaceVariant, size: 22), + hintText: hint, + hintStyle: GoogleFonts.inter( + color: onSurfaceVariant.withOpacity(0.5), + fontWeight: FontWeight.w400), + filled: true, + fillColor: background, + contentPadding: const EdgeInsets.symmetric(vertical: 16), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: + BorderSide(color: outlineVariant, width: 1.0)), // Dipertipis + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: outlineVariant, width: 1.0)), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: primary, width: 1.0)), + ), + ); + } + + Widget _buildPaymentMethodSection() { + return Column( + children: [ + Row( + children: [ + _methodOption("Tunai", Icons.payments_outlined), + const SizedBox(width: 8), + _methodOption("QRIS", Icons.qr_code_2_rounded), + const SizedBox(width: 8), + _methodOption("Bayar Nanti", Icons.history_rounded), + ], + ), + const SizedBox(height: 16), + if (selectedMethod == "Tunai") + _buildCashInput() + else if (selectedMethod == "QRIS") + _buildQRISView() + else + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.orange.withOpacity(0.05), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: Colors.orange.withOpacity(0.2))), + child: Row( + children: [ + const Icon(Icons.info_outline_rounded, color: Colors.orange), + const SizedBox(width: 12), + Expanded( + child: Text( + "Pembayaran akan ditagihkan saat cucian diambil di toko atau saat diantar oleh Driver.", + style: GoogleFonts.inter( + fontSize: 13, + color: Colors.orange.shade900, + fontWeight: FontWeight.w500)), + ), + ], + ), + ), + ], + ); + } + + Widget _methodOption(String label, IconData icon) { + bool isSelected = selectedMethod == label; + return Expanded( + child: InkWell( + onTap: () => setState(() => selectedMethod = label), + borderRadius: BorderRadius.circular(16), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration( + color: isSelected ? primary.withOpacity(0.08) : Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isSelected ? primary : outlineVariant, + width: isSelected ? 1.5 : 1.0), // Dipertipis + boxShadow: [ + BoxShadow( + color: isSelected + ? primary.withOpacity(0.15) + : primary.withOpacity(0.04), // Diperlembut + blurRadius: 15, + offset: const Offset(0, 5)) + ], + ), + child: Column( + children: [ + Icon(icon, + color: isSelected ? primary : onSurfaceVariant, size: 28), + const SizedBox(height: 8), + Text(label, + style: GoogleFonts.inter( + color: isSelected ? primary : onSurface, + fontWeight: FontWeight.w600, + fontSize: 14)), + ], + ), + ), + ), + ); + } + + Widget _buildCashInput() { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: outlineVariant, width: 1.0), // Dipertipis + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), // Diperlembut + blurRadius: 20, + offset: const Offset(0, 6)) + ]), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Uang Diterima", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w600)), + Container( + width: 140, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + color: background, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: outlineVariant, width: 1.0)), // Dipertipis + child: TextField( + controller: _cashReceivedController, + onChanged: _calculateChange, + keyboardType: TextInputType.number, + textAlign: TextAlign.right, + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: primary, + fontSize: 16), + decoration: InputDecoration( + prefixText: "Rp ", + prefixStyle: GoogleFonts.inter( + color: onSurfaceVariant, fontWeight: FontWeight.w500), + border: InputBorder.none, + isDense: true, + contentPadding: const EdgeInsets.symmetric(vertical: 12)), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Divider(color: outlineVariant, height: 1.0), // Dipertipis + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Kembalian", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w600)), + Text("Rp ${formatHarga(change)}", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: successGreen, + fontSize: 18)), + ], + ), + ], + ), + ); + } + + Widget _buildQRISView() { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(32), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: outlineVariant, width: 1.0), + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), + blurRadius: 20, + offset: const Offset(0, 6)) + ]), + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: outlineVariant, width: 1.0)), + child: Image.asset( + 'assets/qris.png', + width: 160, + fit: BoxFit.contain, + ), + ), + const SizedBox(height: 16), + Text("Scan QR untuk pembayaran", + style: GoogleFonts.inter( + color: onSurfaceVariant, + fontWeight: FontWeight.w500, + fontSize: 13)), + ], + ), + ); + } + + Widget _buildBottomAction() { + return Container( + padding: const EdgeInsets.fromLTRB(20, 16, 20, 24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + border: Border( + top: BorderSide(color: outlineVariant, width: 1.0)), // Dipertipis + boxShadow: [ + BoxShadow( + color: primary.withOpacity(0.06), // Diperlembut + blurRadius: 24, + offset: const Offset(0, -8)) + ], + ), + child: SafeArea( + child: SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + onPressed: _isSubmitting ? null : _submitTransaction, + style: ElevatedButton.styleFrom( + backgroundColor: primary, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + elevation: 0, + ), + child: _isSubmitting + ? const SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 3)) + : Text("SIMPAN TRANSAKSI", + style: GoogleFonts.inter( + fontWeight: FontWeight.w700, + fontSize: 15, + letterSpacing: 0.5)), + ), + ), + ), + ); + } +} diff --git a/laundry_mobile/lib/staf/profile.dart b/laundry_mobile/lib/staf/profile.dart new file mode 100644 index 0000000..740372d --- /dev/null +++ b/laundry_mobile/lib/staf/profile.dart @@ -0,0 +1,342 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'dart:ui' as ui; +import 'laundry.dart'; +import '../login.dart'; + +class ProfilePage extends StatefulWidget { + final Map userData; + final bool isTab; + const ProfilePage({super.key, required this.userData, this.isTab = false}); + + @override + State createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color primaryContainer = const Color(0xFF2170E4); + final Color background = const Color(0xFFF7F9FB); + final Color surface = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color surfaceContainerLow = const Color(0xFFF0F4F8); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color outline = const Color(0xFF727785); + final Color error = const Color(0xFFBA1A1A); + final Color primaryFixed = const Color(0xFFD8E2FF); + final Color surfaceContainerHigh = const Color(0xFFE6E8EA); + final Color successGreen = const Color(0xFF10B981); + final Color dangerRed = const Color(0xFFBA1A1A); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + String displayName = widget.userData['user']?['name'] ?? 'User'; + String email = widget.userData['user']?['email'] ?? "Tidak ada email"; + + Widget content = Column( + children: [ + _buildAppBar(), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildProfileHero(displayName, email), + const SizedBox(height: 24), + _buildMenuList(context), + const SizedBox(height: 32), + _buildVersionFooter(), + const SizedBox(height: 24), + ], + ), + ), + ), + ], + ); + + if (widget.isTab) return content; + + return Scaffold( + backgroundColor: surface, + body: content, + bottomNavigationBar: _buildBottomNav(context), + ); + } + + Widget _buildAppBar() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: surface.withOpacity(0.9), + border: Border( + bottom: BorderSide( + color: const Color(0xFFE6E8EA).withOpacity(0.5), + width: 1.0, + ), + ), + ), + child: SafeArea( + bottom: false, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + width: 32, + height: 32, + decoration: const BoxDecoration( + color: Color(0xFFD8E2FF), + shape: BoxShape.circle, + ), + clipBehavior: Clip.hardEdge, + child: Image.asset( + 'assets/app_icon.png', + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => Icon( + Icons.local_laundry_service_rounded, + color: primary, + size: 20), + ), + ), + const SizedBox(width: 8), + Text("My Laundry", + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: primary, + )), + ], + ), + const SizedBox(width: 48), + ], + ), + ), + ); + } + + Widget _buildProfileHero(String name, String email) { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [Color(0xFF2170E4), Color(0xFF004395)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 4, + offset: const Offset(0, 2)) + ], + ), + child: Stack( + children: [ + Positioned( + right: -16, + top: -16, + child: Container( + width: 96, + height: 96, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white.withOpacity(0.05), + ), + ), + ), + Row( + children: [ + Container( + width: 64, + height: 64, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.white.withOpacity(0.3), width: 2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), blurRadius: 2) + ], + ), + child: CircleAvatar( + backgroundColor: Colors.white, + child: Icon(Icons.person, color: primary, size: 40), + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: GoogleFonts.inter( + fontSize: 18, + fontWeight: FontWeight.w600, + color: Colors.white, + letterSpacing: -0.5), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Text( + email, + style: GoogleFonts.inter( + fontSize: 13, color: Colors.white.withOpacity(0.9)), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ) + ], + ) + ], + ), + ); + } + + Widget _buildMenuList(BuildContext context) { + return Column( + children: [ + _buildLogoutButton(context), + ], + ); + } + + Widget _buildLogoutButton(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () async { + final prefs = await SharedPreferences.getInstance(); + await prefs.remove('userData'); + if (!context.mounted) return; + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (_) => const LoginPage()), + (route) => false); + }, + borderRadius: BorderRadius.circular(12), + highlightColor: error.withOpacity(0.1), + splashColor: error.withOpacity(0.05), + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 14), + decoration: BoxDecoration( + border: Border.all(color: outlineVariant.withOpacity(0.3)), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.logout, color: error, size: 20), + const SizedBox(width: 8), + Text( + "Keluar", + style: GoogleFonts.inter( + fontSize: 14, fontWeight: FontWeight.w500, color: error), + ), + ], + ), + ), + ), + ); + } + + Widget _buildVersionFooter() { + return Center( + child: Text( + "", + textAlign: TextAlign.center, + style: GoogleFonts.inter( + fontSize: 11, + fontWeight: FontWeight.w500, + letterSpacing: 0.5, + color: onSurfaceVariant.withOpacity(0.4), + ), + ), + ); + } + + Widget _buildBottomNav(BuildContext context) { + return ClipRect( + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + decoration: BoxDecoration( + color: surface.withOpacity(0.9), + border: + Border(top: BorderSide(color: outlineVariant.withOpacity(0.1))), + ), + child: SafeArea( + child: SizedBox( + height: 64, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _navItem(Icons.home_rounded, "Beranda", false, () { + Navigator.popUntil(context, (route) => route.isFirst); + }), + _navItem(Icons.add_circle, "Input", false, () { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (_) => + LaundryPage(userData: widget.userData)), + ); + }), + _navItem(Icons.person_rounded, "Profil", true, () {}), + ], + ), + ), + ), + ), + ), + ); + } + + Widget _navItem( + IconData icon, String label, bool isActive, VoidCallback onTap) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + child: SizedBox( + width: 64, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, + size: 24, color: isActive ? primary : onSurfaceVariant), + const SizedBox(height: 2), + Text( + label, + style: GoogleFonts.inter( + fontSize: 10, + fontWeight: isActive ? FontWeight.w600 : FontWeight.w500, + color: isActive ? primary : onSurfaceVariant, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/laundry_mobile/lib/staf/request_pickup.dart b/laundry_mobile/lib/staf/request_pickup.dart new file mode 100644 index 0000000..5237509 --- /dev/null +++ b/laundry_mobile/lib/staf/request_pickup.dart @@ -0,0 +1,287 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import '../config.dart'; +import 'laundry/map.dart'; +import 'package:latlong2/latlong.dart'; + +class RequestPickupPage extends StatefulWidget { + final Map userData; + const RequestPickupPage({super.key, required this.userData}); + + @override + State createState() => _RequestPickupPageState(); +} + +class _RequestPickupPageState extends State { + final _formKey = GlobalKey(); + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _phoneController = TextEditingController(); + final TextEditingController _addressController = TextEditingController(); + + double? _latitude; + double? _longitude; + bool _isLoading = false; + + // --- Tailwind DESIGN TOKENS --- + final Color primary = const Color(0xFF0058BE); + final Color onPrimary = const Color(0xFFFFFFFF); + final Color background = const Color(0xFFF7F9FB); + final Color surfaceContainerLowest = const Color(0xFFFFFFFF); + final Color onSurface = const Color(0xFF191C1E); + final Color onSurfaceVariant = const Color(0xFF424754); + final Color outlineVariant = const Color(0xFFC2C6D6); + final Color successGreen = const Color(0xFF10B981); + + void _showSnackBar(String msg, Color bg) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Container( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Icon( + bg == const Color(0xFF10B981) + ? Icons.check_circle_outline + : Icons.error_outline_rounded, + color: Colors.white, + size: 28, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bg == const Color(0xFF10B981) ? "Berhasil" : "Peringatan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 14, + color: Colors.white), + ), + Text( + msg, + style: GoogleFonts.inter( + fontSize: 12, + color: Colors.white.withOpacity(0.9), + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ], + ), + ), + behavior: SnackBarBehavior.floating, + backgroundColor: bg.withOpacity(0.95), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white.withOpacity(0.2), width: 1), + ), + duration: const Duration(seconds: 3), + )); + } + + Future _submitPickup() async { + if (!_formKey.currentState!.validate()) return; + + setState(() => _isLoading = true); + + try { + final response = await http.post( + Uri.parse("${AppConfig.baseUrl}/pickups"), + headers: { + 'Authorization': 'Bearer ${widget.userData['access_token']}', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, + body: json.encode({ + 'customer_name': _nameController.text.trim(), + 'phone': _phoneController.text.trim(), + 'address': _addressController.text.trim(), + 'latitude': _latitude, + 'longitude': _longitude, + }), + ); + + if (response.statusCode == 201) { + if (!mounted) return; + _showSnackBar( + "Jadwal jemput berhasil ditambahkan!", const Color(0xFF10B981)); + Navigator.pop(context, true); // Return true indicating success + } else { + if (!mounted) return; + _showSnackBar("Gagal menambahkan jadwal jemput", Colors.redAccent); + } + } catch (e) { + if (!mounted) return; + _showSnackBar("Terjadi kesalahan koneksi", Colors.redAccent); + } finally { + if (mounted) setState(() => _isLoading = false); + } + } + + void _pickLocation() async { + LatLng? initial = _latitude != null && _longitude != null + ? LatLng(_latitude!, _longitude!) + : null; + + final selectedLoc = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MapPickerPage(initialLocation: initial))); + + if (selectedLoc != null && selectedLoc is LatLng) { + setState(() { + _latitude = selectedLoc.latitude; + _longitude = selectedLoc.longitude; + // Optionally update address field text if you implemented reverse geocoding, + // but here we just store the coords. + }); + _showSnackBar("Lokasi Peta berhasil dipilih!", const Color(0xFF10B981)); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: background, + appBar: AppBar( + backgroundColor: surfaceContainerLowest, + elevation: 0, + iconTheme: IconThemeData(color: onSurface), + title: Text("Jadwalkan Jemput", + style: GoogleFonts.inter( + color: onSurface, fontWeight: FontWeight.w700, fontSize: 18)), + ), + body: SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Informasi Pelanggan", + style: GoogleFonts.inter( + fontSize: 16, + fontWeight: FontWeight.w700, + color: onSurface)), + const SizedBox(height: 16), + _buildTextField( + "Nama Pelanggan", Icons.person_rounded, _nameController), + const SizedBox(height: 16), + _buildTextField("Nomor WhatsApp", Icons.phone_android_rounded, + _phoneController, + isNumber: true), + const SizedBox(height: 24), + + Text("Alamat Penjemputan", + style: GoogleFonts.inter( + fontSize: 16, + fontWeight: FontWeight.w700, + color: onSurface)), + const SizedBox(height: 16), + _buildTextField( + "Detail Alamat", Icons.home_rounded, _addressController, + maxLines: 3), + const SizedBox(height: 12), + + // Map Picker Button + SizedBox( + width: double.infinity, + child: OutlinedButton.icon( + onPressed: _pickLocation, + icon: Icon(Icons.pin_drop_rounded, + color: _latitude != null + ? successGreen + : primary), + label: Text( + _latitude != null + ? "Lokasi Maps Tersimpan" + : "Tandai Lokasi Penjemputan", + style: GoogleFonts.inter( + fontWeight: FontWeight.w600, + color: _latitude != null + ? successGreen + : primary)), + style: OutlinedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 14), + side: BorderSide( + color: _latitude != null + ? successGreen + : outlineVariant, + width: 1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + ), + ), + + const SizedBox(height: 40), + + SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: primary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + elevation: 0, + ), + onPressed: _isLoading ? null : _submitPickup, + child: _isLoading + ? SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + color: onPrimary, strokeWidth: 2.5)) + : Text("Kirim Tugas ke Driver", + style: GoogleFonts.inter( + fontSize: 16, + fontWeight: FontWeight.w800, + color: onPrimary)), + ), + ), + ], + ), + ), + ), + ), + ); + } + + Widget _buildTextField( + String label, IconData icon, TextEditingController controller, + {bool isNumber = false, int maxLines = 1}) { + return TextFormField( + controller: controller, + keyboardType: isNumber ? TextInputType.phone : TextInputType.text, + maxLines: maxLines, + style: GoogleFonts.inter( + fontSize: 14, fontWeight: FontWeight.w600, color: onSurface), + decoration: InputDecoration( + labelText: label, + labelStyle: GoogleFonts.inter(color: onSurfaceVariant, fontSize: 13), + prefixIcon: + maxLines == 1 ? Icon(icon, color: onSurfaceVariant, size: 20) : null, + filled: true, + fillColor: surfaceContainerLowest, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: outlineVariant)), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: outlineVariant.withOpacity(0.5))), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: primary)), + ), + validator: (val) => + (val == null || val.isEmpty) ? "Harap isi bidang ini" : null, + ); + } +} diff --git a/laundry_mobile/linux/.gitignore b/laundry_mobile/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/laundry_mobile/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/laundry_mobile/linux/CMakeLists.txt b/laundry_mobile/linux/CMakeLists.txt new file mode 100644 index 0000000..a312193 --- /dev/null +++ b/laundry_mobile/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "laundry_mobile") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.laundry_mobile") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/laundry_mobile/linux/flutter/CMakeLists.txt b/laundry_mobile/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/laundry_mobile/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/laundry_mobile/linux/flutter/generated_plugin_registrant.cc b/laundry_mobile/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..f6f23bf --- /dev/null +++ b/laundry_mobile/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/laundry_mobile/linux/flutter/generated_plugin_registrant.h b/laundry_mobile/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/laundry_mobile/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/laundry_mobile/linux/flutter/generated_plugins.cmake b/laundry_mobile/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..f16b4c3 --- /dev/null +++ b/laundry_mobile/linux/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/laundry_mobile/linux/main.cc b/laundry_mobile/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/laundry_mobile/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/laundry_mobile/linux/my_application.cc b/laundry_mobile/linux/my_application.cc new file mode 100644 index 0000000..c478e40 --- /dev/null +++ b/laundry_mobile/linux/my_application.cc @@ -0,0 +1,124 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "laundry_mobile"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "laundry_mobile"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/laundry_mobile/linux/my_application.h b/laundry_mobile/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/laundry_mobile/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/laundry_mobile/macos/.gitignore b/laundry_mobile/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/laundry_mobile/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/laundry_mobile/macos/Flutter/Flutter-Debug.xcconfig b/laundry_mobile/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/laundry_mobile/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/laundry_mobile/macos/Flutter/Flutter-Release.xcconfig b/laundry_mobile/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/laundry_mobile/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/laundry_mobile/macos/Flutter/GeneratedPluginRegistrant.swift b/laundry_mobile/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..fb0420b --- /dev/null +++ b/laundry_mobile/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,24 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import firebase_core +import firebase_database +import geolocator_apple +import mobile_scanner +import path_provider_foundation +import shared_preferences_foundation +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseDatabasePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseDatabasePlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/laundry_mobile/macos/Runner.xcodeproj/project.pbxproj b/laundry_mobile/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3e64445 --- /dev/null +++ b/laundry_mobile/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* laundry_mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "laundry_mobile.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* laundry_mobile.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* laundry_mobile.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/laundry_mobile.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/laundry_mobile"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/laundry_mobile.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/laundry_mobile"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/laundry_mobile.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/laundry_mobile"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/laundry_mobile/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/laundry_mobile/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/laundry_mobile/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/laundry_mobile/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/laundry_mobile/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..33456c1 --- /dev/null +++ b/laundry_mobile/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/laundry_mobile/macos/Runner.xcworkspace/contents.xcworkspacedata b/laundry_mobile/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/laundry_mobile/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/laundry_mobile/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/laundry_mobile/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/laundry_mobile/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/laundry_mobile/macos/Runner/AppDelegate.swift b/laundry_mobile/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..8e02df2 --- /dev/null +++ b/laundry_mobile/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/laundry_mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/laundry_mobile/macos/Runner/Configs/AppInfo.xcconfig b/laundry_mobile/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..b6434dd --- /dev/null +++ b/laundry_mobile/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = laundry_mobile + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2026 com.example. All rights reserved. diff --git a/laundry_mobile/macos/Runner/Configs/Debug.xcconfig b/laundry_mobile/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/laundry_mobile/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/laundry_mobile/macos/Runner/Configs/Release.xcconfig b/laundry_mobile/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/laundry_mobile/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/laundry_mobile/macos/Runner/Configs/Warnings.xcconfig b/laundry_mobile/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/laundry_mobile/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/laundry_mobile/macos/Runner/DebugProfile.entitlements b/laundry_mobile/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/laundry_mobile/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/laundry_mobile/macos/Runner/Info.plist b/laundry_mobile/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/laundry_mobile/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/laundry_mobile/macos/Runner/MainFlutterWindow.swift b/laundry_mobile/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/laundry_mobile/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/laundry_mobile/macos/Runner/Release.entitlements b/laundry_mobile/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/laundry_mobile/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/laundry_mobile/macos/RunnerTests/RunnerTests.swift b/laundry_mobile/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/laundry_mobile/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/laundry_mobile/pubspec.lock b/laundry_mobile/pubspec.lock new file mode 100644 index 0000000..1d35ea3 --- /dev/null +++ b/laundry_mobile/pubspec.lock @@ -0,0 +1,778 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: bda3b7b55958bfd867addc40d067b4b11f7b8846d57671f5b5a6e7f9a56fe3ad + url: "https://pub.dev" + source: hosted + version: "1.3.69" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: d5a94b884dcb1e6d3430298e94bfe002238094cdfd5e29202d536ee2120f9158 + url: "https://pub.dev" + source: hosted + version: "4.7.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "0ecda14c1bfc9ed8cac303dd0f8d04a320811b479362a9a4efb14fd331a473ce" + url: "https://pub.dev" + source: hosted + version: "6.0.3" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: dc5096257cd67292d34d78ceeb90836f02a4be921b5f3934311a02bb2376118c + url: "https://pub.dev" + source: hosted + version: "3.6.0" + firebase_database: + dependency: "direct main" + description: + name: firebase_database + sha256: "9b527722dfb154692f4e9f3a3c38dd6f6a49c1849b01d9b4fe1b9e420bb98030" + url: "https://pub.dev" + source: hosted + version: "12.3.0" + firebase_database_platform_interface: + dependency: transitive + description: + name: firebase_database_platform_interface + sha256: b39da15c2a7399aac55f437ebd48d9b325f8c6310d792d80d1812efd91d4a8cf + url: "https://pub.dev" + source: hosted + version: "0.3.1+1" + firebase_database_web: + dependency: transitive + description: + name: firebase_database_web + sha256: c592343817b0fef558715d752b11d054b55aef393c4b0b826659b106a1e4d79c + url: "https://pub.dev" + source: hosted + version: "0.2.7+6" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" + source: hosted + version: "0.13.1" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + url: "https://pub.dev" + source: hosted + version: "13.0.4" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + url: "https://pub.dev" + source: hosted + version: "4.6.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: df9763500dadba0155373e9cb44e202ce21bd9ed5de6bdbd05c5854e86839cb8 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" + intl: + dependency: transitive + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + logger: + dependency: transitive + description: + name: logger + sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mobile_scanner: + dependency: "direct main" + description: + name: mobile_scanner + sha256: "0b466a0a8a211b366c2e87f3345715faef9b6011c7147556ad22f37de6ba3173" + url: "https://pub.dev" + source: hosted + version: "6.0.11" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + url: "https://pub.dev" + source: hosted + version: "2.2.15" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "9f9f3d372d4304723e6136663bb291c0b93f5e4c8a4a6314347f481a33bda2b1" + url: "https://pub.dev" + source: hosted + version: "2.4.7" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + url: "https://pub.dev" + source: hosted + version: "6.3.14" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" + url: "https://pub.dev" + source: hosted + version: "6.3.3" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + uuid: + dependency: transitive + description: + name: uuid + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" + source: hosted + version: "4.5.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.5.4 <4.0.0" + flutter: ">=3.24.0" diff --git a/laundry_mobile/pubspec.yaml b/laundry_mobile/pubspec.yaml new file mode 100644 index 0000000..d9567a9 --- /dev/null +++ b/laundry_mobile/pubspec.yaml @@ -0,0 +1,105 @@ +name: laundry_mobile +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.5.4 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + google_fonts: ^6.1.0 + http: ^1.1.0 + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + firebase_core: ^4.5.0 + firebase_database: ^12.1.4 + shared_preferences: ^2.5.3 + flutter_map: ^7.0.2 + latlong2: ^0.9.1 + geolocator: ^13.0.1 + url_launcher: ^6.2.5 + mobile_scanner: ^6.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_launcher_icons: ^0.13.1 + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^4.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + assets: + - assets/ + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/app_icon.png" diff --git a/laundry_mobile/test/widget_test.dart b/laundry_mobile/test/widget_test.dart new file mode 100644 index 0000000..4f91cb5 --- /dev/null +++ b/laundry_mobile/test/widget_test.dart @@ -0,0 +1,31 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:laundry_mobile/main.dart'; +import 'package:laundry_mobile/login.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp(initialPage: LoginPage())); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/laundry_mobile/web/favicon.png b/laundry_mobile/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/laundry_mobile/web/icons/Icon-192.png b/laundry_mobile/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/web/icons/Icon-512.png b/laundry_mobile/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/web/icons/Icon-maskable-192.png b/laundry_mobile/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/laundry_mobile/web/icons/Icon-maskable-512.png b/laundry_mobile/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 zcmeFZ_gj-)&^4Nb2tlbLMU<{!p(#yjqEe+=0IA_oih%ScH9@5#MNp&}Y#;;(h=A0@ zh7{>lT2MkSQ344eAvrhici!td|HJuyvJm#Y_w1Q9Yu3!26dNlO-oxUDK_C#XnW^Co z5C{VN6#{~B0)K2j7}*1Xq(Nqemv23A-6&=ZpEijkVnSwVGqLv40?n0=p;k3-U5e5+ z+z3>aS`u9DS=!wg8ROu?X4TFoW6CFLL&{GzoVT)ldhLekLM|+j3tIxRd|*5=c{=s&*vfPdBr(Fyj(v@%eQj1Soy7m4^@VRl1~@-PV7y+c!xz$8436WBn$t{=}mEdK#k`aystimGgI{(IBx$!pAwFoE9Y`^t^;> zKAD)C(Dl^s%`?q5$P|fZf8Xymrtu^Pv(7D`rn>Z-w$Ahs!z9!94WNVxrJuXfHAaxg zC6s@|Z1$7R$(!#t%Jb{{s6(Y?NoQXDYq)!}X@jKPhe`{9KQ@sAU8y-5`xt?S9$jKH zoi}6m5PcG*^{kjvt+kwPpyQzVg4o)a>;LK`aaN2x4@itBD3Aq?yWTM20VRn1rrd+2 zKO=P0rMjEGq_UqpMa`~7B|p?xAN1SCoCp}QxAv8O`jLJ5CVh@umR%c%i^)6!o+~`F zaalSTQcl5iwOLC&H)efzd{8(88mo`GI(56T<(&p7>Qd^;R1hn1Y~jN~tApaL8>##U zd65bo8)79CplWxr#z4!6HvLz&N7_5AN#x;kLG?zQ(#p|lj<8VUlKY=Aw!ATqeL-VG z42gA!^cMNPj>(`ZMEbCrnkg*QTsn*u(nQPWI9pA{MQ=IsPTzd7q5E#7+z>Ch=fx$~ z;J|?(5jTo5UWGvsJa(Sx0?S#56+8SD!I^tftyeh_{5_31l6&Hywtn`bbqYDqGZXI( zCG7hBgvksX2ak8+)hB4jnxlO@A32C_RM&g&qDSb~3kM&)@A_j1*oTO@nicGUyv+%^ z=vB)4(q!ykzT==Z)3*3{atJ5}2PV*?Uw+HhN&+RvKvZL3p9E?gHjv{6zM!A|z|UHK z-r6jeLxbGn0D@q5aBzlco|nG2tr}N@m;CJX(4#Cn&p&sLKwzLFx1A5izu?X_X4x8r@K*d~7>t1~ zDW1Mv5O&WOxbzFC`DQ6yNJ(^u9vJdj$fl2dq`!Yba_0^vQHXV)vqv1gssZYzBct!j zHr9>ydtM8wIs}HI4=E}qAkv|BPWzh3^_yLH(|kdb?x56^BlDC)diWyPd*|f!`^12_U>TD^^94OCN0lVv~Sgvs94ecpE^}VY$w`qr_>Ue zTfH~;C<3H<0dS5Rkf_f@1x$Gms}gK#&k()IC0zb^QbR!YLoll)c$Agfi6MKI0dP_L z=Uou&u~~^2onea2%XZ@>`0x^L8CK6=I{ge;|HXMj)-@o~h&O{CuuwBX8pVqjJ*o}5 z#8&oF_p=uSo~8vn?R0!AMWvcbZmsrj{ZswRt(aEdbi~;HeVqIe)-6*1L%5u$Gbs}| zjFh?KL&U(rC2izSGtwP5FnsR@6$-1toz?RvLD^k~h9NfZgzHE7m!!7s6(;)RKo2z} zB$Ci@h({l?arO+vF;s35h=|WpefaOtKVx>l399}EsX@Oe3>>4MPy%h&^3N_`UTAHJ zI$u(|TYC~E4)|JwkWW3F!Tib=NzjHs5ii2uj0^m|Qlh-2VnB#+X~RZ|`SA*}}&8j9IDv?F;(Y^1=Z0?wWz;ikB zewU>MAXDi~O7a~?jx1x=&8GcR-fTp>{2Q`7#BE#N6D@FCp`?ht-<1|y(NArxE_WIu zP+GuG=Qq>SHWtS2M>34xwEw^uvo4|9)4s|Ac=ud?nHQ>ax@LvBqusFcjH0}{T3ZPQ zLO1l<@B_d-(IS682}5KA&qT1+{3jxKolW+1zL4inqBS-D>BohA!K5++41tM@ z@xe<-qz27}LnV#5lk&iC40M||JRmZ*A##K3+!j93eouU8@q-`W0r%7N`V$cR&JV;iX(@cS{#*5Q>~4BEDA)EikLSP@>Oo&Bt1Z~&0d5)COI%3$cLB_M?dK# z{yv2OqW!al-#AEs&QFd;WL5zCcp)JmCKJEdNsJlL9K@MnPegK23?G|O%v`@N{rIRa zi^7a}WBCD77@VQ-z_v{ZdRsWYrYgC$<^gRQwMCi6);%R~uIi31OMS}=gUTE(GKmCI z$zM>mytL{uNN+a&S38^ez(UT=iSw=l2f+a4)DyCA1Cs_N-r?Q@$3KTYosY!;pzQ0k zzh1G|kWCJjc(oZVBji@kN%)UBw(s{KaYGy=i{g3{)Z+&H8t2`^IuLLKWT6lL<-C(! zSF9K4xd-|VO;4}$s?Z7J_dYqD#Mt)WCDnsR{Kpjq275uUq6`v0y*!PHyS(}Zmv)_{>Vose9-$h8P0|y;YG)Bo}$(3Z%+Gs0RBmFiW!^5tBmDK-g zfe5%B*27ib+7|A*Fx5e)2%kIxh7xWoc3pZcXS2zik!63lAG1;sC1ja>BqH7D zODdi5lKW$$AFvxgC-l-)!c+9@YMC7a`w?G(P#MeEQ5xID#<}W$3bSmJ`8V*x2^3qz zVe<^^_8GHqYGF$nIQm0Xq2kAgYtm#UC1A(=&85w;rmg#v906 zT;RyMgbMpYOmS&S9c38^40oUp?!}#_84`aEVw;T;r%gTZkWeU;;FwM@0y0adt{-OK z(vGnPSlR=Nv2OUN!2=xazlnHPM9EWxXg2EKf0kI{iQb#FoP>xCB<)QY>OAM$Dcdbm zU6dU|%Mo(~avBYSjRc13@|s>axhrPl@Sr81{RSZUdz4(=|82XEbV*JAX6Lfbgqgz584lYgi0 z2-E{0XCVON$wHfvaLs;=dqhQJ&6aLn$D#0i(FkAVrXG9LGm3pSTf&f~RQb6|1_;W> z?n-;&hrq*~L=(;u#jS`*Yvh@3hU-33y_Kv1nxqrsf>pHVF&|OKkoC)4DWK%I!yq?P z=vXo8*_1iEWo8xCa{HJ4tzxOmqS0&$q+>LroMKI*V-rxhOc%3Y!)Y|N6p4PLE>Yek>Y(^KRECg8<|%g*nQib_Yc#A5q8Io z6Ig&V>k|~>B6KE%h4reAo*DfOH)_01tE0nWOxX0*YTJgyw7moaI^7gW*WBAeiLbD?FV9GSB zPv3`SX*^GRBM;zledO`!EbdBO_J@fEy)B{-XUTVQv}Qf~PSDpK9+@I`7G7|>Dgbbu z_7sX9%spVo$%qwRwgzq7!_N;#Td08m5HV#?^dF-EV1o)Q=Oa+rs2xH#g;ykLbwtCh znUnA^dW!XjspJ;otq$yV@I^s9Up(5k7rqhQd@OLMyyxVLj_+$#Vc*}Usevp^I(^vH zmDgHc0VMme|K&X?9&lkN{yq_(If)O`oUPW8X}1R5pSVBpfJe0t{sPA(F#`eONTh_) zxeLqHMfJX#?P(@6w4CqRE@Eiza; z;^5)Kk=^5)KDvd9Q<`=sJU8rjjxPmtWMTmzcH={o$U)j=QBuHarp?=}c??!`3d=H$nrJMyr3L-& zA#m?t(NqLM?I3mGgWA_C+0}BWy3-Gj7bR+d+U?n*mN$%5P`ugrB{PeV>jDUn;eVc- zzeMB1mI4?fVJatrNyq|+zn=!AiN~<}eoM#4uSx^K?Iw>P2*r=k`$<3kT00BE_1c(02MRz4(Hq`L^M&xt!pV2 zn+#U3@j~PUR>xIy+P>51iPayk-mqIK_5rlQMSe5&tDkKJk_$i(X&;K(11YGpEc-K= zq4Ln%^j>Zi_+Ae9eYEq_<`D+ddb8_aY!N;)(&EHFAk@Ekg&41ABmOXfWTo)Z&KotA zh*jgDGFYQ^y=m)<_LCWB+v48DTJw*5dwMm_YP0*_{@HANValf?kV-Ic3xsC}#x2h8 z`q5}d8IRmqWk%gR)s~M}(Qas5+`np^jW^oEd-pzERRPMXj$kS17g?H#4^trtKtq;C?;c ztd|%|WP2w2Nzg@)^V}!Gv++QF2!@FP9~DFVISRW6S?eP{H;;8EH;{>X_}NGj^0cg@ z!2@A>-CTcoN02^r6@c~^QUa={0xwK0v4i-tQ9wQq^=q*-{;zJ{Qe%7Qd!&X2>rV@4 z&wznCz*63_vw4>ZF8~%QCM?=vfzW0r_4O^>UA@otm_!N%mH)!ERy&b!n3*E*@?9d^ zu}s^By@FAhG(%?xgJMuMzuJw2&@$-oK>n z=UF}rt%vuaP9fzIFCYN-1&b#r^Cl6RDFIWsEsM|ROf`E?O(cy{BPO2Ie~kT+^kI^i zp>Kbc@C?}3vy-$ZFVX#-cx)Xj&G^ibX{pWggtr(%^?HeQL@Z( zM-430g<{>vT*)jK4aY9(a{lSy{8vxLbP~n1MXwM527ne#SHCC^F_2@o`>c>>KCq9c(4c$VSyMl*y3Nq1s+!DF| z^?d9PipQN(mw^j~{wJ^VOXDCaL$UtwwTpyv8IAwGOg<|NSghkAR1GSNLZ1JwdGJYm zP}t<=5=sNNUEjc=g(y)1n5)ynX(_$1-uGuDR*6Y^Wgg(LT)Jp><5X|}bt z_qMa&QP?l_n+iVS>v%s2Li_;AIeC=Ca^v1jX4*gvB$?H?2%ndnqOaK5-J%7a} zIF{qYa&NfVY}(fmS0OmXA70{znljBOiv5Yod!vFU{D~*3B3Ka{P8?^ zfhlF6o7aNT$qi8(w<}OPw5fqA7HUje*r*Oa(YV%*l0|9FP9KW@U&{VSW{&b0?@y)M zs%4k1Ax;TGYuZ9l;vP5@?3oQsp3)rjBeBvQQ>^B;z5pc=(yHhHtq6|0m(h4envn_j787fizY@V`o(!SSyE7vlMT zbo=Z1c=atz*G!kwzGB;*uPL$Ei|EbZLh8o+1BUMOpnU(uX&OG1MV@|!&HOOeU#t^x zr9=w2ow!SsTuJWT7%Wmt14U_M*3XiWBWHxqCVZI0_g0`}*^&yEG9RK9fHK8e+S^m? zfCNn$JTswUVbiC#>|=wS{t>-MI1aYPLtzO5y|LJ9nm>L6*wpr_m!)A2Fb1RceX&*|5|MwrvOk4+!0p99B9AgP*9D{Yt|x=X}O% zgIG$MrTB=n-!q%ROT|SzH#A$Xm;|ym)0>1KR}Yl0hr-KO&qMrV+0Ej3d@?FcgZ+B3 ztEk16g#2)@x=(ko8k7^Tq$*5pfZHC@O@}`SmzT1(V@x&NkZNM2F#Q-Go7-uf_zKC( zB(lHZ=3@dHaCOf6C!6i8rDL%~XM@rVTJbZL09?ht@r^Z_6x}}atLjvH^4Vk#Ibf(^LiBJFqorm?A=lE zzFmwvp4bT@Nv2V>YQT92X;t9<2s|Ru5#w?wCvlhcHLcsq0TaFLKy(?nzezJ>CECqj zggrI~Hd4LudM(m{L@ezfnpELsRFVFw>fx;CqZtie`$BXRn#Ns%AdoE$-Pf~{9A8rV zf7FbgpKmVzmvn-z(g+&+-ID=v`;6=)itq8oM*+Uz**SMm_{%eP_c0{<%1JGiZS19o z@Gj7$Se~0lsu}w!%;L%~mIAO;AY-2i`9A*ZfFs=X!LTd6nWOZ7BZH2M{l2*I>Xu)0 z`<=;ObglnXcVk!T>e$H?El}ra0WmPZ$YAN0#$?|1v26^(quQre8;k20*dpd4N{i=b zuN=y}_ew9SlE~R{2+Rh^7%PA1H5X(p8%0TpJ=cqa$65XL)$#ign-y!qij3;2>j}I; ziO@O|aYfn&up5F`YtjGw68rD3{OSGNYmBnl?zdwY$=RFsegTZ=kkzRQ`r7ZjQP!H( zp4>)&zf<*N!tI00xzm-ME_a{_I!TbDCr;8E;kCH4LlL-tqLxDuBn-+xgPk37S&S2^ z2QZumkIimwz!c@!r0)j3*(jPIs*V!iLTRl0Cpt_UVNUgGZzdvs0(-yUghJfKr7;=h zD~y?OJ-bWJg;VdZ^r@vlDoeGV&8^--!t1AsIMZ5S440HCVr%uk- z2wV>!W1WCvFB~p$P$$_}|H5>uBeAe>`N1FI8AxM|pq%oNs;ED8x+tb44E) zTj{^fbh@eLi%5AqT?;d>Es5D*Fi{Bpk)q$^iF!!U`r2hHAO_?#!aYmf>G+jHsES4W zgpTKY59d?hsb~F0WE&dUp6lPt;Pm zcbTUqRryw^%{ViNW%Z(o8}dd00H(H-MmQmOiTq{}_rnwOr*Ybo7*}3W-qBT!#s0Ie z-s<1rvvJx_W;ViUD`04%1pra*Yw0BcGe)fDKUK8aF#BwBwMPU;9`!6E(~!043?SZx z13K%z@$$#2%2ovVlgFIPp7Q6(vO)ud)=*%ZSucL2Dh~K4B|%q4KnSpj#n@(0B})!9 z8p*hY@5)NDn^&Pmo;|!>erSYg`LkO?0FB@PLqRvc>4IsUM5O&>rRv|IBRxi(RX(gJ ztQ2;??L~&Mv;aVr5Q@(?y^DGo%pO^~zijld41aA0KKsy_6FeHIn?fNHP-z>$OoWer zjZ5hFQTy*-f7KENRiCE$ZOp4|+Wah|2=n@|W=o}bFM}Y@0e62+_|#fND5cwa3;P{^pEzlJbF1Yq^}>=wy8^^^$I2M_MH(4Dw{F6hm+vrWV5!q;oX z;tTNhz5`-V={ew|bD$?qcF^WPR{L(E%~XG8eJx(DoGzt2G{l8r!QPJ>kpHeOvCv#w zr=SSwMDaUX^*~v%6K%O~i)<^6`{go>a3IdfZ8hFmz&;Y@P%ZygShQZ2DSHd`m5AR= zx$wWU06;GYwXOf(%MFyj{8rPFXD};JCe85Bdp4$YJ2$TzZ7Gr#+SwCvBI1o$QP0(c zy`P51FEBV2HTisM3bHqpmECT@H!Y2-bv2*SoSPoO?wLe{M#zDTy@ujAZ!Izzky~3k zRA1RQIIoC*Mej1PH!sUgtkR0VCNMX(_!b65mo66iM*KQ7xT8t2eev$v#&YdUXKwGm z7okYAqYF&bveHeu6M5p9xheRCTiU8PFeb1_Rht0VVSbm%|1cOVobc8mvqcw!RjrMRM#~=7xibH&Fa5Imc|lZ{eC|R__)OrFg4@X_ ze+kk*_sDNG5^ELmHnZ7Ue?)#6!O)#Nv*Dl2mr#2)w{#i-;}0*_h4A%HidnmclH#;Q zmQbq+P4DS%3}PpPm7K_K3d2s#k~x+PlTul7+kIKol0@`YN1NG=+&PYTS->AdzPv!> zQvzT=)9se*Jr1Yq+C{wbK82gAX`NkbXFZ)4==j4t51{|-v!!$H8@WKA={d>CWRW+g z*`L>9rRucS`vbXu0rzA1#AQ(W?6)}1+oJSF=80Kf_2r~Qm-EJ6bbB3k`80rCv(0d` zvCf3;L2ovYG_TES%6vSuoKfIHC6w;V31!oqHM8-I8AFzcd^+_86!EcCOX|Ta9k1!s z_Vh(EGIIsI3fb&dF$9V8v(sTBC%!#<&KIGF;R+;MyC0~}$gC}}= zR`DbUVc&Bx`lYykFZ4{R{xRaUQkWCGCQlEc;!mf=+nOk$RUg*7 z;kP7CVLEc$CA7@6VFpsp3_t~m)W0aPxjsA3e5U%SfY{tp5BV5jH-5n?YX7*+U+Zs%LGR>U- z!x4Y_|4{gx?ZPJobISy991O znrmrC3otC;#4^&Rg_iK}XH(XX+eUHN0@Oe06hJk}F?`$)KmH^eWz@@N%wEc)%>?Ft z#9QAroDeyfztQ5Qe{m*#R#T%-h*&XvSEn@N$hYRTCMXS|EPwzF3IIysD2waj`vQD{ zv_#^Pgr?s~I*NE=acf@dWVRNWTr(GN0wrL)Z2=`Dr>}&ZDNX|+^Anl{Di%v1Id$_p zK5_H5`RDjJx`BW7hc85|> zHMMsWJ4KTMRHGu+vy*kBEMjz*^K8VtU=bXJYdhdZ-?jTXa$&n)C?QQIZ7ln$qbGlr zS*TYE+ppOrI@AoPP=VI-OXm}FzgXRL)OPvR$a_=SsC<3Jb+>5makX|U!}3lx4tX&L z^C<{9TggZNoeX!P1jX_K5HkEVnQ#s2&c#umzV6s2U-Q;({l+j^?hi7JnQ7&&*oOy9 z(|0asVTWUCiCnjcOnB2pN0DpuTglKq;&SFOQ3pUdye*eT<2()7WKbXp1qq9=bhMWlF-7BHT|i3TEIT77AcjD(v=I207wi-=vyiw5mxgPdTVUC z&h^FEUrXwWs9en2C{ywZp;nvS(Mb$8sBEh-*_d-OEm%~p1b2EpcwUdf<~zmJmaSTO zSX&&GGCEz-M^)G$fBvLC2q@wM$;n4jp+mt0MJFLuJ%c`tSp8$xuP|G81GEd2ci$|M z4XmH{5$j?rqDWoL4vs!}W&!?!rtj=6WKJcE>)?NVske(p;|#>vL|M_$as=mi-n-()a*OU3Okmk0wC<9y7t^D(er-&jEEak2!NnDiOQ99Wx8{S8}=Ng!e0tzj*#T)+%7;aM$ z&H}|o|J1p{IK0Q7JggAwipvHvko6>Epmh4RFRUr}$*2K4dz85o7|3#Bec9SQ4Y*;> zXWjT~f+d)dp_J`sV*!w>B%)#GI_;USp7?0810&3S=WntGZ)+tzhZ+!|=XlQ&@G@~3 z-dw@I1>9n1{+!x^Hz|xC+P#Ab`E@=vY?3%Bc!Po~e&&&)Qp85!I|U<-fCXy*wMa&t zgDk!l;gk;$taOCV$&60z+}_$ykz=Ea*)wJQ3-M|p*EK(cvtIre0Pta~(95J7zoxBN zS(yE^3?>88AL0Wfuou$BM{lR1hkrRibz=+I9ccwd`ZC*{NNqL)3pCcw^ygMmrG^Yp zn5f}Xf>%gncC=Yq96;rnfp4FQL#{!Y*->e82rHgY4Zwy{`JH}b9*qr^VA{%~Z}jtp z_t$PlS6}5{NtTqXHN?uI8ut8rOaD#F1C^ls73S=b_yI#iZDOGz3#^L@YheGd>L;<( z)U=iYj;`{>VDNzIxcjbTk-X3keXR8Xbc`A$o5# zKGSk-7YcoBYuAFFSCjGi;7b<;n-*`USs)IX z=0q6WZ=L!)PkYtZE-6)azhXV|+?IVGTOmMCHjhkBjfy@k1>?yFO3u!)@cl{fFAXnRYsWk)kpT?X{_$J=|?g@Q}+kFw|%n!;Zo}|HE@j=SFMvT8v`6Y zNO;tXN^036nOB2%=KzxB?n~NQ1K8IO*UE{;Xy;N^ZNI#P+hRZOaHATz9(=)w=QwV# z`z3+P>9b?l-@$@P3<;w@O1BdKh+H;jo#_%rr!ute{|YX4g5}n?O7Mq^01S5;+lABE+7`&_?mR_z7k|Ja#8h{!~j)| zbBX;*fsbUak_!kXU%HfJ2J+G7;inu#uRjMb|8a){=^))y236LDZ$$q3LRlat1D)%7K0!q5hT5V1j3qHc7MG9 z_)Q=yQ>rs>3%l=vu$#VVd$&IgO}Za#?aN!xY>-<3PhzS&q!N<=1Q7VJBfHjug^4|) z*fW^;%3}P7X#W3d;tUs3;`O&>;NKZBMR8au6>7?QriJ@gBaorz-+`pUWOP73DJL=M z(33uT6Gz@Sv40F6bN|H=lpcO z^AJl}&=TIjdevuDQ!w0K*6oZ2JBOhb31q!XDArFyKpz!I$p4|;c}@^bX{>AXdt7Bm zaLTk?c%h@%xq02reu~;t@$bv`b3i(P=g}~ywgSFpM;}b$zAD+=I!7`V~}ARB(Wx0C(EAq@?GuxOL9X+ffbkn3+Op0*80TqmpAq~EXmv%cq36celXmRz z%0(!oMp&2?`W)ALA&#|fu)MFp{V~~zIIixOxY^YtO5^FSox8v$#d0*{qk0Z)pNTt0QVZ^$`4vImEB>;Lo2!7K05TpY-sl#sWBz_W-aDIV`Ksabi zvpa#93Svo!70W*Ydh)Qzm{0?CU`y;T^ITg-J9nfWeZ-sbw)G@W?$Eomf%Bg2frfh5 zRm1{|E0+(4zXy){$}uC3%Y-mSA2-^I>Tw|gQx|7TDli_hB>``)Q^aZ`LJC2V3U$SABP}T)%}9g2pF9dT}aC~!rFFgkl1J$ z`^z{Arn3On-m%}r}TGF8KQe*OjSJ=T|caa_E;v89A{t@$yT^(G9=N9F?^kT*#s3qhJq!IH5|AhnqFd z0B&^gm3w;YbMNUKU>naBAO@fbz zqw=n!@--}o5;k6DvTW9pw)IJVz;X}ncbPVrmH>4x);8cx;q3UyiML1PWp%bxSiS|^ zC5!kc4qw%NSOGQ*Kcd#&$30=lDvs#*4W4q0u8E02U)7d=!W7+NouEyuF1dyH$D@G& zaFaxo9Ex|ZXA5y{eZT*i*dP~INSMAi@mvEX@q5i<&o&#sM}Df?Og8n8Ku4vOux=T% zeuw~z1hR}ZNwTn8KsQHKLwe2>p^K`YWUJEdVEl|mO21Bov!D0D$qPoOv=vJJ`)|%_ z>l%`eexY7t{BlVKP!`a^U@nM?#9OC*t76My_E_<16vCz1x_#82qj2PkWiMWgF8bM9 z(1t4VdHcJ;B~;Q%x01k_gQ0>u2*OjuEWNOGX#4}+N?Gb5;+NQMqp}Puqw2HnkYuKA zzKFWGHc&K>gwVgI1Sc9OT1s6fq=>$gZU!!xsilA$fF`kLdGoX*^t}ao@+^WBpk>`8 z4v_~gK|c2rCq#DZ+H)$3v~Hoi=)=1D==e3P zpKrRQ+>O^cyTuWJ%2}__0Z9SM_z9rptd*;-9uC1tDw4+A!=+K%8~M&+Zk#13hY$Y$ zo-8$*8dD5@}XDi19RjK6T^J~DIXbF5w&l?JLHMrf0 zLv0{7*G!==o|B%$V!a=EtVHdMwXLtmO~vl}P6;S(R2Q>*kTJK~!}gloxj)m|_LYK{ zl(f1cB=EON&wVFwK?MGn^nWuh@f95SHatPs(jcwSY#Dnl1@_gkOJ5=f`%s$ZHljRH0 z+c%lrb=Gi&N&1>^L_}#m>=U=(oT^vTA&3!xXNyqi$pdW1BDJ#^{h|2tZc{t^vag3& zAD7*8C`chNF|27itjBUo^CCDyEpJLX3&u+(L;YeeMwnXEoyN(ytoEabcl$lSgx~Ltatn}b$@j_yyMrBb03)shJE*$;Mw=;mZd&8e>IzE+4WIoH zCSZE7WthNUL$|Y#m!Hn?x7V1CK}V`KwW2D$-7&ODy5Cj;!_tTOOo1Mm%(RUt)#$@3 zhurA)t<7qik%%1Et+N1?R#hdBB#LdQ7{%-C zn$(`5e0eFh(#c*hvF>WT*07fk$N_631?W>kfjySN8^XC9diiOd#s?4tybICF;wBjp zIPzilX3{j%4u7blhq)tnaOBZ_`h_JqHXuI7SuIlNTgBk9{HIS&3|SEPfrvcE<@}E` zKk$y*nzsqZ{J{uWW9;#n=de&&h>m#A#q)#zRonr(?mDOYU&h&aQWD;?Z(22wY?t$U3qo`?{+amA$^TkxL+Ex2dh`q7iR&TPd0Ymwzo#b? zP$#t=elB5?k$#uE$K>C$YZbYUX_JgnXA`oF_Ifz4H7LEOW~{Gww&3s=wH4+j8*TU| zSX%LtJWqhr-xGNSe{;(16kxnak6RnZ{0qZ^kJI5X*It_YuynSpi(^-}Lolr{)#z_~ zw!(J-8%7Ybo^c3(mED`Xz8xecP35a6M8HarxRn%+NJBE;dw>>Y2T&;jzRd4FSDO3T zt*y+zXCtZQ0bP0yf6HRpD|WmzP;DR^-g^}{z~0x~z4j8m zucTe%k&S9Nt-?Jb^gYW1w6!Y3AUZ0Jcq;pJ)Exz%7k+mUOm6%ApjjSmflfKwBo6`B zhNb@$NHTJ>guaj9S{@DX)!6)b-Shav=DNKWy(V00k(D!v?PAR0f0vDNq*#mYmUp6> z76KxbFDw5U{{qx{BRj(>?|C`82ICKbfLxoldov-M?4Xl+3;I4GzLHyPOzYw7{WQST zPNYcx5onA%MAO9??41Po*1zW(Y%Zzn06-lUp{s<3!_9vv9HBjT02On0Hf$}NP;wF) zP<`2p3}A^~1YbvOh{ePMx$!JGUPX-tbBzp3mDZMY;}h;sQ->!p97GA)9a|tF(Gh{1$xk7 zUw?ELkT({Xw!KIr);kTRb1b|UL`r2_`a+&UFVCdJ)1T#fdh;71EQl9790Br0m_`$x z9|ZANuchFci8GNZ{XbP=+uXSJRe(;V5laQz$u18#?X*9}x7cIEbnr%<=1cX3EIu7$ zhHW6pe5M(&qEtsqRa>?)*{O;OJT+YUhG5{km|YI7I@JL_3Hwao9aXneiSA~a* z|Lp@c-oMNyeAEuUz{F?kuou3x#C*gU?lon!RC1s37gW^0Frc`lqQWH&(J4NoZg3m8 z;Lin#8Q+cFPD7MCzj}#|ws7b@?D9Q4dVjS4dpco=4yX5SSH=A@U@yqPdp@?g?qeia zH=Tt_9)G=6C2QIPsi-QipnK(mc0xXIN;j$WLf@n8eYvMk;*H-Q4tK%(3$CN}NGgO8n}fD~+>?<3UzvsrMf*J~%i;VKQHbF%TPalFi=#sgj)(P#SM^0Q=Tr>4kJVw8X3iWsP|e8tj}NjlMdWp z@2+M4HQu~3!=bZpjh;;DIDk&X}=c8~kn)FWWH z2KL1w^rA5&1@@^X%MjZ7;u(kH=YhH2pJPFQe=hn>tZd5RC5cfGYis8s9PKaxi*}-s6*W zRA^PwR=y^5Z){!(4D9-KC;0~;b*ploznFOaU`bJ_7U?qAi#mTo!&rIECRL$_y@yI27x2?W+zqDBD5~KCVYKFZLK+>ABC(Kj zeAll)KMgIlAG`r^rS{loBrGLtzhHY8$)<_S<(Dpkr(Ym@@vnQ&rS@FC*>2@XCH}M+an74WcRDcoQ+a3@A z9tYhl5$z7bMdTvD2r&jztBuo37?*k~wcU9GK2-)MTFS-lux-mIRYUuGUCI~V$?s#< z?1qAWb(?ZLm(N>%S%y10COdaq_Tm5c^%ooIxpR=`3e4C|@O5wY+eLik&XVi5oT7oe zmxH)Jd*5eo@!7t`x8!K=-+zJ-Sz)B_V$)s1pW~CDU$=q^&ABvf6S|?TOMB-RIm@CoFg>mjIQE)?+A1_3s6zmFU_oW&BqyMz1mY*IcP_2knjq5 zqw~JK(cVsmzc7*EvTT2rvpeqhg)W=%TOZ^>f`rD4|7Z5fq*2D^lpCttIg#ictgqZ$P@ru6P#f$x#KfnfTZj~LG6U_d-kE~`;kU_X)`H5so@?C zWmb!7x|xk@0L~0JFall*@ltyiL^)@3m4MqC7(7H0sH!WidId1#f#6R{Q&A!XzO1IAcIx;$k66dumt6lpUw@nL2MvqJ5^kbOVZ<^2jt5-njy|2@`07}0w z;M%I1$FCoLy`8xp8Tk)bFr;7aJeQ9KK6p=O$U0-&JYYy8woV*>b+FB?xLX`=pirYM z5K$BA(u)+jR{?O2r$c_Qvl?M{=Ar{yQ!UVsVn4k@0!b?_lA;dVz9uaQUgBH8Oz(Sb zrEs;&Ey>_ex8&!N{PmQjp+-Hlh|OA&wvDai#GpU=^-B70V0*LF=^bi+Nhe_o|azZ%~ZZ1$}LTmWt4aoB1 zPgccm$EwYU+jrdBaQFxQfn5gd(gM`Y*Ro1n&Zi?j=(>T3kmf94vdhf?AuS8>$Va#P zGL5F+VHpxdsCUa}+RqavXCobI-@B;WJbMphpK2%6t=XvKWWE|ruvREgM+|V=i6;;O zx$g=7^`$XWn0fu!gF=Xe9cMB8Z_SelD>&o&{1XFS`|nInK3BXlaeD*rc;R-#osyIS zWv&>~^TLIyBB6oDX+#>3<_0+2C4u2zK^wmHXXDD9_)kmLYJ!0SzM|%G9{pi)`X$uf zW}|%%#LgyK7m(4{V&?x_0KEDq56tk|0YNY~B(Sr|>WVz-pO3A##}$JCT}5P7DY+@W z#gJv>pA5>$|E3WO2tV7G^SuymB?tY`ooKcN3!vaQMnBNk-WATF{-$#}FyzgtJ8M^; zUK6KWSG)}6**+rZ&?o@PK3??uN{Q)#+bDP9i1W&j)oaU5d0bIWJ_9T5ac!qc?x66Q z$KUSZ`nYY94qfN_dpTFr8OW~A?}LD;Yty-BA)-be5Z3S#t2Io%q+cAbnGj1t$|qFR z9o?8B7OA^KjCYL=-!p}w(dkC^G6Nd%_I=1))PC0w5}ZZGJxfK)jP4Fwa@b-SYBw?% zdz9B-<`*B2dOn(N;mcTm%Do)rIvfXRNFX&1h`?>Rzuj~Wx)$p13nrDlS8-jwq@e@n zNIj_|8or==8~1h*Ih?w*8K7rYkGlwlTWAwLKc5}~dfz3y`kM&^Q|@C%1VAp_$wnw6zG~W4O+^ z>i?NY?oXf^Puc~+fDM$VgRNBpOZj{2cMP~gCqWAX4 z7>%$ux8@a&_B(pt``KSt;r+sR-$N;jdpY>|pyvPiN)9ohd*>mVST3wMo)){`B(&eX z1?zZJ-4u9NZ|~j1rdZYq4R$?swf}<6(#ex%7r{kh%U@kT)&kWuAszS%oJts=*OcL9 zaZwK<5DZw%1IFHXgFplP6JiL^dk8+SgM$D?8X+gE4172hXh!WeqIO>}$I9?Nry$*S zQ#f)RuH{P7RwA3v9f<-w>{PSzom;>(i&^l{E0(&Xp4A-*q-@{W1oE3K;1zb{&n28dSC2$N+6auXe0}e4b z)KLJ?5c*>@9K#I^)W;uU_Z`enquTUxr>mNq z1{0_puF-M7j${rs!dxxo3EelGodF1TvjV;Zpo;s{5f1pyCuRp=HDZ?s#IA4f?h|-p zGd|Mq^4hDa@Bh!c4ZE?O&x&XZ_ptZGYK4$9F4~{%R!}G1leCBx`dtNUS|K zL-7J5s4W@%mhXg1!}a4PD%!t&Qn%f_oquRajn3@C*)`o&K9o7V6DwzVMEhjVdDJ1fjhr#@=lp#@4EBqi=CCQ>73>R(>QKPNM&_Jpe5G`n4wegeC`FYEPJ{|vwS>$-`fuRSp3927qOv|NC3T3G-0 zA{K`|+tQy1yqE$ShWt8ny&5~)%ITb@^+x$w0)f&om;P8B)@}=Wzy59BwUfZ1vqw87 za2lB8J(&*l#(V}Id8SyQ0C(2amzkz3EqG&Ed0Jq1)$|&>4_|NIe=5|n=3?siFV0fI z{As5DLW^gs|B-b4C;Hd(SM-S~GQhzb>HgF2|2Usww0nL^;x@1eaB)=+Clj+$fF@H( z-fqP??~QMT$KI-#m;QC*&6vkp&8699G3)Bq0*kFZXINw=b9OVaed(3(3kS|IZ)CM? zJdnW&%t8MveBuK21uiYj)_a{Fnw0OErMzMN?d$QoPwkhOwcP&p+t>P)4tHlYw-pPN z^oJ=uc$Sl>pv@fZH~ZqxSvdhF@F1s=oZawpr^-#l{IIOGG=T%QXjtwPhIg-F@k@uIlr?J->Ia zpEUQ*=4g|XYn4Gez&aHr*;t$u3oODPmc2Ku)2Og|xjc%w;q!Zz+zY)*3{7V8bK4;& zYV82FZ+8?v)`J|G1w4I0fWdKg|2b#iaazCv;|?(W-q}$o&Y}Q5d@BRk^jL7#{kbCK zSgkyu;=DV+or2)AxCBgq-nj5=@n^`%T#V+xBGEkW4lCqrE)LMv#f;AvD__cQ@Eg3`~x| zW+h9mofSXCq5|M)9|ez(#X?-sxB%Go8};sJ?2abp(Y!lyi>k)|{M*Z$c{e1-K4ky` MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/laundry_mobile/web/index.html b/laundry_mobile/web/index.html new file mode 100644 index 0000000..1559308 --- /dev/null +++ b/laundry_mobile/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + mylaundry + + + + + + diff --git a/laundry_mobile/web/manifest.json b/laundry_mobile/web/manifest.json new file mode 100644 index 0000000..3ec05c7 --- /dev/null +++ b/laundry_mobile/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "MyLaundry", + "short_name": "MyLaundry", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} \ No newline at end of file diff --git a/laundry_mobile/windows/.gitignore b/laundry_mobile/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/laundry_mobile/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/laundry_mobile/windows/CMakeLists.txt b/laundry_mobile/windows/CMakeLists.txt new file mode 100644 index 0000000..82f07f2 --- /dev/null +++ b/laundry_mobile/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(laundry_mobile LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "laundry_mobile") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/laundry_mobile/windows/flutter/CMakeLists.txt b/laundry_mobile/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/laundry_mobile/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/laundry_mobile/windows/flutter/generated_plugin_registrant.cc b/laundry_mobile/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..d461042 --- /dev/null +++ b/laundry_mobile/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FirebaseDatabasePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseDatabasePluginCApi")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/laundry_mobile/windows/flutter/generated_plugin_registrant.h b/laundry_mobile/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/laundry_mobile/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/laundry_mobile/windows/flutter/generated_plugins.cmake b/laundry_mobile/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..0d5fd8e --- /dev/null +++ b/laundry_mobile/windows/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + firebase_core + firebase_database + geolocator_windows + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/laundry_mobile/windows/runner/CMakeLists.txt b/laundry_mobile/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/laundry_mobile/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/laundry_mobile/windows/runner/Runner.rc b/laundry_mobile/windows/runner/Runner.rc new file mode 100644 index 0000000..cfd1ef4 --- /dev/null +++ b/laundry_mobile/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "laundry_mobile" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "laundry_mobile" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "laundry_mobile.exe" "\0" + VALUE "ProductName", "laundry_mobile" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/laundry_mobile/windows/runner/flutter_window.cpp b/laundry_mobile/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/laundry_mobile/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/laundry_mobile/windows/runner/flutter_window.h b/laundry_mobile/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/laundry_mobile/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/laundry_mobile/windows/runner/main.cpp b/laundry_mobile/windows/runner/main.cpp new file mode 100644 index 0000000..cec8457 --- /dev/null +++ b/laundry_mobile/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"laundry_mobile", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/laundry_mobile/windows/runner/resource.h b/laundry_mobile/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/laundry_mobile/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/laundry_mobile/windows/runner/resources/app_icon.ico b/laundry_mobile/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/windows/runner/runner.exe.manifest b/laundry_mobile/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/laundry_mobile/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/laundry_mobile/windows/runner/utils.cpp b/laundry_mobile/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/laundry_mobile/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/laundry_mobile/windows/runner/utils.h b/laundry_mobile/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/laundry_mobile/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/laundry_mobile/windows/runner/win32_window.cpp b/laundry_mobile/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/laundry_mobile/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/laundry_mobile/windows/runner/win32_window.h b/laundry_mobile/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/laundry_mobile/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/mylaundry.ino b/mylaundry.ino new file mode 100644 index 0000000..6bf1791 --- /dev/null +++ b/mylaundry.ino @@ -0,0 +1,543 @@ +#include "HX711.h" +#include +#include +#include +#include +#include +#include +#include + +#include "addons/RTDBHelper.h" +#include "addons/TokenHelper.h" + +// KONFIGURASI FIREBASE +#define API_KEY "AIzaSyDtb-5Qs13elSodm8gRJ-rGj0kornwd1BY" +#define DATABASE_URL "mylaundry-d02fb-default-rtdb.asia-southeast1.firebasedatabase.app" + +// PIN HARDWARE +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +#define OLED_RESET -1 +#define I2C_ADDRESS 0x3C +#define LOADCELL_DOUT_PIN 32 +#define LOADCELL_SCK_PIN 33 +#define BUTTON_PIN 27 +#define BUZZER_PIN 25 + +// OBJEK GLOBAL +Adafruit_SH1106G display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +HX711 scale; + +float calibration_factor = 103500.00; + +Preferences preferences; +FirebaseData fbdo; +FirebaseData streamDo; +FirebaseAuth auth; +FirebaseConfig config; + +// BERAT REALTIME & FITUR LOCK +float currentWeight = 0.000; +bool isLocked = false; +float lockedWeight = 0.000; +float lastWeight = 0.000; +unsigned long stableStartTime = 0; + +// PENGATURAN SENSITIVITAS LOCK +const float TOLERANSI_STABIL = 0.005f; +const float TOLERANSI_UNLOCK = 0.02f; +const unsigned long WAKTU_STABIL = 2000; + +// SERIAL MONITOR +unsigned long lastSerialTime = 0; +#define SERIAL_PRINT_INTERVAL 500 + +// STATE DISPLAY +String strJasa = "-"; +String strEst = "-"; +String strTipeLayanan = "-"; +String strBerat = "0.000"; +String strHarga = "Rp0"; + +// FIREBASE PATH +String firebasePath = "/laundry"; + +// TEXT +int scrollPosX_Jasa = 42; +int scrollPosX_Berat = 42; +unsigned long lastScrollTime = 0; + +// STREAM HEALTH CHECK +unsigned long lastStreamCheck = 0; +#define STREAM_CHECK_INTERVAL 30000 + +void beepBuzzer(int times) { + for (int i = 0; i < times; i++) { + digitalWrite(BUZZER_PIN, HIGH); + delay(150); + digitalWrite(BUZZER_PIN, LOW); + delay(100); + } +} + +String getValue(String data, char separator, int index) { + int found = 0; + int strIndex[] = {0, -1}; + int maxIndex = data.length() - 1; + for (int i = 0; i <= maxIndex && found <= index; i++) { + if (data.charAt(i) == separator || i == maxIndex) { + found++; + strIndex[0] = strIndex[1] + 1; + strIndex[1] = (i == maxIndex) ? i + 1 : i; + } + } + return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; +} + +void printDisplayState() { + Serial.println("-----------------------------"); + Serial.println("[DISPLAY STATE]"); + Serial.print(" Jasa : "); Serial.println(strJasa); + Serial.print(" Est : "); Serial.println(strEst); + Serial.print(" Tipe : "); Serial.println(strTipeLayanan); + Serial.print(" Berat : "); Serial.println(strBerat); + Serial.print(" Harga : "); Serial.println(strHarga); + Serial.println("-----------------------------"); +} + +void reconnectStream() { + Serial.println("[STREAM] Menyambung ulang stream Firebase..."); + Firebase.RTDB.endStream(&streamDo); + delay(200); + + if (Firebase.RTDB.getString(&fbdo, firebasePath + "/status_hp")) { + String rawData = fbdo.stringData(); + Serial.print("[STREAM] Data status_hp saat reconnect: "); + Serial.println(rawData); + strJasa = getValue(rawData, '|', 0); strJasa.trim(); + strEst = getValue(rawData, '|', 1); strEst.trim(); + strTipeLayanan = getValue(rawData, '|', 2); strTipeLayanan.trim(); + strBerat = getValue(rawData, '|', 3); strBerat.trim(); + strHarga = getValue(rawData, '|', 4); strHarga.trim(); + printDisplayState(); + } else { + Serial.println("[STREAM] Gagal baca status_hp saat reconnect"); + } + + if (Firebase.RTDB.beginMultiPathStream(&streamDo, firebasePath)) { + Serial.println("[STREAM] Stream berhasil disambung ulang"); + } else { + Serial.println("[STREAM] GAGAL menyambung ulang stream!"); + } +} + +void setup() { + Serial.begin(9600); + Serial.println("\n============================="); + Serial.println("[BOOT] Sistem mulai..."); + Wire.begin(21, 22); + + pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(BUZZER_PIN, OUTPUT); + digitalWrite(BUZZER_PIN, LOW); + + display.begin(I2C_ADDRESS, true); + display.setTextWrap(false); + display.clearDisplay(); + display.setTextColor(SH110X_WHITE); + display.setTextSize(1); + + // CEK RESET WIFI + if (digitalRead(BUTTON_PIN) == LOW) { + Serial.println("[BOOT] Tombol ditekan saat boot — mode reset WiFi"); + display.clearDisplay(); + display.setCursor(10, 30); + display.print("Tahan 5 detik = Reset"); + display.display(); + + unsigned long pressStart = millis(); + while (digitalRead(BUTTON_PIN) == LOW && (millis() - pressStart < 5000)) { + delay(10); + } + + if (millis() - pressStart >= 5000) { + Serial.println("[BOOT] WiFi direset!"); + display.clearDisplay(); + display.setCursor(10, 30); + display.print("WiFi Direset!"); + display.setCursor(10, 45); + display.print("Lepas Tombol..."); + display.display(); + beepBuzzer(3); + + WiFiManager wm; + wm.resetSettings(); + delay(1000); + + while (digitalRead(BUTTON_PIN) == LOW) { delay(10); } + delay(500); + ESP.restart(); + } + } + +// WIFI MANAGER + Serial.println("[WIFI] Menghubungkan ke WiFi..."); + display.clearDisplay(); + display.setCursor(0, 14); display.print("Menghubungkan WiFi"); + display.setCursor(0, 28); display.print("Jika gagal,"); + display.setCursor(0, 42); display.print("buka: laundry.net"); + display.display(); + + WiFiManager wm; + wm.setCaptivePortalEnable(true); + wm.setHostname("laundry"); + + wm.setConnectTimeout(15); + wm.setConfigPortalTimeout(60); + bool connected = wm.autoConnect("MyLaundry"); + + if (!connected) { + Serial.println("[WIFI] GAGAL terhubung! Restart..."); + display.clearDisplay(); + display.setCursor(10, 30); display.print("WiFi Gagal!"); + display.setCursor(10, 42); display.print("Restart..."); + display.display(); + delay(3000); + ESP.restart(); + } + + Serial.print("[WIFI] Terhubung! IP: "); + Serial.println(WiFi.localIP()); + + // FIREBASE + Serial.println("[FIREBASE] Inisialisasi Firebase..."); + config.api_key = API_KEY; + config.database_url = DATABASE_URL; + config.signer.test_mode = true; + config.token_status_callback = tokenStatusCallback; + fbdo.setBSSLBufferSize(4096, 1024); + Firebase.begin(&config, &auth); + Firebase.reconnectWiFi(true); + Serial.println("[FIREBASE] Firebase siap"); + + // LOAD CELL + Serial.println("[LOADCELL] Inisialisasi load cell..."); + scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); + scale.set_scale(calibration_factor); + + display.clearDisplay(); + display.setCursor(10, 35); display.print("Tunggu 5 detik"); + display.display(); + Serial.println("[LOADCELL] Warm-up 5 detik..."); + delay(5000); + + scale.tare(); + Serial.println("[LOADCELL] Tare selesai, siap menimbang"); + + // CEK STATUS + Serial.println("[FIREBASE] Membaca status_hp awal..."); + if (Firebase.RTDB.getString(&fbdo, firebasePath + "/status_hp")) { + String rawData = fbdo.stringData(); + Serial.print("[FIREBASE] status_hp awal: "); + Serial.println(rawData); + strJasa = getValue(rawData, '|', 0); strJasa.trim(); + strEst = getValue(rawData, '|', 1); strEst.trim(); + strTipeLayanan = getValue(rawData, '|', 2); strTipeLayanan.trim(); + strBerat = getValue(rawData, '|', 3); strBerat.trim(); + strHarga = getValue(rawData, '|', 4); strHarga.trim(); + printDisplayState(); + } else { + Serial.println("[FIREBASE] Gagal baca status_hp awal"); + } + + if (Firebase.RTDB.beginMultiPathStream(&streamDo, firebasePath)) { + Serial.println("[STREAM] Stream Firebase aktif"); + } else { + Serial.println("[STREAM] GAGAL memulai stream Firebase!"); + } + + display.clearDisplay(); + display.setCursor(10, 35); + display.print("Sistem Siap!"); + display.display(); + beepBuzzer(2); + delay(1000); + + lastStreamCheck = millis(); + Serial.println("[BOOT] Setup selesai, masuk loop"); + Serial.println("=============================\n"); +} + +void loop() { + + // CEK STREAM + if (millis() - lastStreamCheck > STREAM_CHECK_INTERVAL) { + lastStreamCheck = millis(); + + if (WiFi.status() != WL_CONNECTED) { + Serial.println("[WIFI] Koneksi terputus! Mencoba reconnect..."); + WiFi.reconnect(); + delay(2000); + if (WiFi.status() == WL_CONNECTED) { + Serial.print("[WIFI] Reconnect berhasil! IP: "); + Serial.println(WiFi.localIP()); + } else { + Serial.println("[WIFI] Reconnect GAGAL"); + } + } else { + Serial.println("[HEALTH] WiFi OK | Stream check..."); + } + + if (!streamDo.httpConnected()) { + Serial.println("[STREAM] Stream terputus, reconnect..."); + reconnectStream(); + } else { + Serial.println("[HEALTH] Stream OK"); + } + } + + // BACA STREAM FIREBASE + if (Firebase.ready() && Firebase.RTDB.readStream(&streamDo)) { + if (streamDo.streamAvailable()) { + String dPath = streamDo.dataPath(); + String dType = streamDo.dataType(); + + Serial.print("[STREAM] Event masuk — path: "); + Serial.print(dPath); + Serial.print(" | type: "); + Serial.println(dType); + + if (dPath == "/status_hp" && dType == "string") { + String rawData = streamDo.stringData(); + Serial.print("[STREAM] status_hp baru: "); + Serial.println(rawData); + + String newJasa = getValue(rawData, '|', 0); newJasa.trim(); + if (newJasa != strJasa) { + Serial.print("[DISPLAY] Jasa berubah: "); Serial.print(strJasa); + Serial.print(" → "); Serial.println(newJasa); + strJasa = newJasa; + scrollPosX_Jasa = 42; + } + + strEst = getValue(rawData, '|', 1); strEst.trim(); + strTipeLayanan = getValue(rawData, '|', 2); strTipeLayanan.trim(); + + String newBerat = getValue(rawData, '|', 3); newBerat.trim(); + if (newBerat != strBerat) { + Serial.print("[DISPLAY] Berat berubah: "); Serial.print(strBerat); + Serial.print(" → "); Serial.println(newBerat); + strBerat = newBerat; + scrollPosX_Berat = 42; + } + + strHarga = getValue(rawData, '|', 4); strHarga.trim(); + printDisplayState(); + + } else if (dPath == "/screen_status" && dType == "string") { + String screenCmd = streamDo.stringData(); + Serial.print("[STREAM] screen_status: "); + Serial.println(screenCmd); + + if (screenCmd == "RESTART") { + Serial.println("[CMD] RESTART diterima — reset nilai & reconnect stream"); + + strJasa = "-"; + strEst = "-"; + strTipeLayanan = "-"; + strBerat = "0.000"; + strHarga = "Rp0"; + scrollPosX_Jasa = 42; + scrollPosX_Berat = 42; + + Firebase.RTDB.setStringAsync(&fbdo, firebasePath + "/screen_status", "ON"); + Serial.println("[CMD] screen_status di-set ke ON"); + + reconnectStream(); + } else { + Serial.print("[CMD] screen_status '"); + Serial.print(screenCmd); + Serial.println("' diterima tapi tidak ada aksi"); + } + + } else if (dPath == "/current_weight" && dType == "float") { + Serial.print("[STREAM] current_weight update dari Firebase: "); + Serial.println(streamDo.floatData(), 3); + + } else { + Serial.print("[STREAM] Path tidak dihandle: "); + Serial.println(dPath); + } + } + } + + // LOAD CELL & LOGIKA AUTO-LOCK + if (scale.is_ready()) { + float raw_weight = scale.get_units(2); + + // Cegah nilai minus + if (raw_weight < 0.005f) { + raw_weight = 0.00f; + } + + if (isLocked) { + // Jika beban diangkat atau ditambah drastis, LEPASKAN KUNCI + if (abs(raw_weight - lockedWeight) > TOLERANSI_UNLOCK) { + isLocked = false; + Serial.println("[LOCK] Kunci terlepas!"); + } else { + currentWeight = lockedWeight; + } + } + + if (!isLocked) { + currentWeight = raw_weight; + + // Cek apakah berat mulai stabil (perubahan di bawah toleransi 20 gram) + if (abs(raw_weight - lastWeight) <= TOLERANSI_STABIL) { + + // Jika sudah stabil selama 2 detik, dan berat di atas 0.1 kg (jangan kunci timbangan kosong) + if (millis() - stableStartTime > WAKTU_STABIL && raw_weight > 0.1f) { + isLocked = true; + lockedWeight = raw_weight; + + Serial.print("[LOCK] Berat dikunci di: "); + Serial.println(lockedWeight, 3); + } + } else { + // Jika berat masih naik-turun, reset timer kestabilan + stableStartTime = millis(); + lastWeight = raw_weight; + } + } + } + // PANTAUAN SERIAL MONITOR + if (millis() - lastSerialTime > SERIAL_PRINT_INTERVAL) { + lastSerialTime = millis(); + Serial.print("Berat : "); + Serial.print(currentWeight, 3); + Serial.println(" kg"); + } + + // TICK SCROLL + bool tickScroll = false; + if (millis() - lastScrollTime > 30) { + tickScroll = true; + lastScrollTime = millis(); + } + + display.clearDisplay(); + display.setTextSize(1); + + //TEXT JASA + int textWidthJasa = strJasa.length() * 6; + if (textWidthJasa > (128 - 42)) { + if (tickScroll) { + scrollPosX_Jasa--; + if (scrollPosX_Jasa < -textWidthJasa) scrollPosX_Jasa = 128; + } + display.setCursor(scrollPosX_Jasa, 10); + display.print(strJasa); + display.fillRect(0, 10, 42, 9, SH110X_BLACK); + } else { + scrollPosX_Jasa = 42; + display.setCursor(42, 10); + display.print(strJasa); + } + display.setCursor(0, 10); + display.print("Jasa : "); + + // ESTIMASI + display.setCursor(0, 21); + display.print("Est : "); + display.print(strEst); + + // TOTAL RINCIAN + String fullBerat = "-"; + if (strJasa != "-" && strJasa != "") { + if (strBerat != "" && strBerat != "0" && strBerat != "0.0" && strBerat != "0.000") { + fullBerat = strBerat; + } + } + + int textWidthBerat = fullBerat.length() * 6; + if (textWidthBerat > (128 - 42)) { + if (tickScroll) { + scrollPosX_Berat--; + if (scrollPosX_Berat < -textWidthBerat) scrollPosX_Berat = 128; + } + display.setCursor(scrollPosX_Berat, 32); + display.print(fullBerat); + display.fillRect(0, 32, 42, 9, SH110X_BLACK); + } else { + scrollPosX_Berat = 42; + display.setCursor(42, 32); + display.print(fullBerat); + } + display.setCursor(0, 32); + display.print("Total: "); + + // HARGA + display.setCursor(0, 43); + display.print("Harga: "); + display.print(strHarga); + + // GARIS & STATUS BAR + display.drawLine(0, 52, 128, 52, SH110X_WHITE); + display.setCursor(0, 55); + + display.print("Berat: "); + display.print(currentWeight, 3); + display.print(" Kg"); + + if (currentWeight >= 20.0f) { + display.print(" OVL!"); + } + + // TOMBOL KIRIM BERAT + if (digitalRead(BUTTON_PIN) == LOW) { + delay(50); + if (digitalRead(BUTTON_PIN) == LOW) { + Serial.print("[BUTTON] Tombol ditekan — kirim berat: "); + Serial.print(currentWeight, 3); + Serial.println(" kg"); + + display.fillRect(0, 54, 128, 10, SH110X_BLACK); + display.setCursor(0, 55); + display.print("Mengirim..."); + display.display(); + + bool berhasil = false; + if (Firebase.ready()) { + unsigned long startSend = millis(); + if (Firebase.RTDB.setFloat(&fbdo, firebasePath + "/current_weight", currentWeight)) { + if (millis() - startSend < 5000) { + berhasil = true; + } + } + } + + if (berhasil) { + Serial.println("[BUTTON] Kirim berat BERHASIL"); + beepBuzzer(2); + } else { + Serial.println("[BUTTON] Kirim berat GAGAL — reconnect stream"); + display.fillRect(0, 54, 128, 10, SH110X_BLACK); + display.setCursor(0, 55); + display.print("GAGAL! Coba lagi"); + display.display(); + beepBuzzer(1); + delay(1500); + reconnectStream(); + } + + unsigned long startWait = millis(); + while (digitalRead(BUTTON_PIN) == LOW && (millis() - startWait < 2000)) { + delay(10); + } + } + } + + display.display(); + delay(10); +}

6V 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 z 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�~;zC9KorUGE9t(`)(*2}A=E@b=r$@UA*A;4` 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 literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/.gitignore b/laundry_mobile/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/laundry_mobile/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/laundry_mobile/ios/Flutter/AppFrameworkInfo.plist b/laundry_mobile/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/laundry_mobile/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/laundry_mobile/ios/Flutter/Debug.xcconfig b/laundry_mobile/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/laundry_mobile/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/laundry_mobile/ios/Flutter/Release.xcconfig b/laundry_mobile/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/laundry_mobile/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/laundry_mobile/ios/Runner.xcodeproj/project.pbxproj b/laundry_mobile/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ed7b0af --- /dev/null +++ b/laundry_mobile/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,616 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.laundryMobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/laundry_mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/laundry_mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/laundry_mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..8e3ca5d --- /dev/null +++ b/laundry_mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/laundry_mobile/ios/Runner.xcworkspace/contents.xcworkspacedata b/laundry_mobile/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/laundry_mobile/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/laundry_mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/laundry_mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/laundry_mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/laundry_mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/laundry_mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/laundry_mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/laundry_mobile/ios/Runner/AppDelegate.swift b/laundry_mobile/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/laundry_mobile/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5acfb7cab56f31c4e3a866d73656180951bb3a80 GIT binary patch literal 38146 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 h`rM)Th?wg5-6l8dH`b+d+_2xu^tR?fMVj! zlSoV?!2pSpc<^AnctJxvNR*@!D8!(}zP68jjcHXZC3ai%f1Lfk-+nWbT?zn%H&;14 z*ZlTfXM84Gql<7nhcd#L&Qxh7oCr;ht<4S(FeNF`99G{p@xrom|KW0w!Vtp2WOFu& zo~yU4&epc@^ofJi;py~m1uKqO+~XDZ^#*9o?z0_6#hJ!WV7v;;=a!On_NJ5PD77`X zjKEa$Tj=JDAxJIT>nI@{F#?6x#{r@nmE}*B7B9JLdE98XLRJ`p6DfqgXyDVf_2+dW zhwjr>Y_k#!K9w-Hq-~tC7`*GVq1M4cXTX!|0(?U;d<_3=YS_WyagP8(04c)|yky7G zK(sWt*F|w}Qo_`mEJpkSM!E!a1Y=0c45QrwWEJ_B9B472|AHOWW+0U<0rEWZP2ZCY zzQGtCcGcjKUx1=9q_PaYp*U8fI+R~Kg+{tgxms1iua#=a&Oo{dLl`T|kjx0%Ak#>UaevJ}j0sUO zY}wp2Cc0^G3{-R~L}$hv1h>I97@BM_Mk1pFl-lR*>t1s&6j~@R?EbQvT-wf3eL{8~ZAeTZ83P+_oKgt^-W&AX9rlb|ZgcC~jFpf+xE zdgAu_W=gvvVY$KPk}hs@ZgRnQzgo}jDRJID^ZgW{v~#hB3yGjKhBezhY#3_Znd2F5 z>y!Z{x84hIArU0QnsaJD9c;+TpmpZV3@PSf4K-6zTpCl0ifL0?NvT>1A!ywYNdc6{ zsD?RksYSbJHX%Dt4P$)rO*k@t0tgZMUJDGrSrpsUnJw8gZA?m01JIM!1CZiG`@wEi z04WV;rb$YxQ-Kf6csv4eR=G`&$EjgbN*97&#HdBdaBT}HrwJk*fUbX&T4tddAR$s< z`_k1iH>E`b=040|%LWbn0TDl5@u7Plu%v|^h$rz>rWPxWB)a? zS<|6fp3kDLmB(9kE(C(}&z0&|#nUV*3-q9=iE38*IE#*4AIfU&@cI=3?yzVg;N(RK z0?+5MNLWeXe44)<=O3%pOn8zlyLH@0PH zaA>ay6-Vp{3bW@*vyZ9m>C=Rgt!inFxJ0oNx{^3&rL4c#&goym=@kNorp|O> zOP5b}?cseU=rq%iR-1s`Pq0&P2T!_i>O3FSrrcg2lNHs$)*e6h9=7Ay{z%CA;Fc=I zg}VKBKlXoM$I(iY>~2iPoa9!eaH;@eawnzud%v6mMFKTnxg%muiBvo4q{JyWXalPy z&^x%aQ)WJ?1}N#4b%A5$Ur1HJ<nn+J!rR1<}Yn|JKmB`G27H|jo< c+#3Ghx z(O%THe`sq}>@gno8nJfjkx~z=5*#9gfg_Tb;F|c78)+q6n#KXkMOj(7ZfctV-Y{^%H;)0-RKPtI8! z{oGcQS$pD}x|_SUQ-%i>zS{W|mL+D7i=D9ddt9tcbKrVq?Yd7nDo-u=9=2>Ox zf|Wui;uCFcHu_3L0Bdq(Fnaizbzl!FFct;_53k&*}&WlLcD5lc|{gBE@>n-(_8``cxt-#cIehZA7>n2symQDxi8x<9)uxc{-uCqWChJ$YO{&L+0f zUzmWveOKDtWQ2$RIRmb2OW!{F^3{JwaCU3iQKdh7I~*FD=ys#AzsiOZPVc4NmA2Sv zc=h?#!G@WqnTIF;lsjP29s|^yxswGx77vW{$AxD0xu>)zjO^T<2Da*4!`o_U{UP7d z?#l8Z3w#Q@E6uF1UK!skefuGQm371WdYF;^U1JA@1i`86c3x#c2w`R#In%{eR4C}# z@#yaK2zPgSgu6RE!kxkFKYQW`?KX6W*c~*uXc{ooy6|9jT7n^H;lr1jV8wJP`@Fo` z2^uZcX`4`CcL1EeZinpj=H=$K`xI2v1h@Ykv~a;O3;c11f+!_|a~cY)!EX&e5zHEU zVw#QJ>0oYAdD#HCTFPHl+rnHzXKr@=)|8-Wnnnl(@Ye1DK|5`Yh#*x$2jL6CVb)cN zB2xMY9fS{Pm%~8V8}5~eB2q>P9fl7mqxLRgsXTv1o}9B#=rDX>t^V^8VJbU*B06(x zBfKx!TfK)tUYl^(SO!5p#yOVWqwp*sk~6k&ck(@f^G7?FU?07ArU$l zSJZ0?HiCr7f`Fn*9#s!wD%SR2Rg+GAjomSoTZTrZmp`&F9Q|1er zF2vZ4+LEfX3+Dmde9!H5YpFlKY-wE9L9wjQq}f6R3?3;Mu*+_=Ri1i% zPITthI}w8yu4jIkBuLT_V5z$N6H{52tp>$$BWdX)^8zWMovZS z?_Qq{n9;cY?}AN+yM;&Gr?Dq~S4&oX@eN&3c8*w`HbCBQR<5+y*esDMH4P&qv0R4^ w2HNE`QAX_@YxUJj%sgwUyl|Nrjs3mONB{r;07*qoM6N<$f&fo%d;kCd literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4934ceac53105bd9490de770706630c3442f3ef9 GIT binary patch literal 882 zcmV-&1C9KNP)*l4VI*sU&@=q%5M0p!$#mB^E^n zn%E0{F-QuvSFMN&B8%+B+0xRc^X}#D#R3a8!W^5kj3H@lp)+w+J)LUXzAKWHiV81?pp+X%OxEIZs*PW|LT=1UK@3u6QM~xz!=Cd_eD3$l zlOEcj$I3LdbU#0V;#|2A`!5Znsog#1-DNfz>SA)WLN_`WWwtYc-3(!>5|5>wK{Cd z)=KwGSb1?+&NA{_hKW@aQjJ+k*$(9rQJ=CJU%AV}{ylU{L`BMoR5&T=WcYuiZXf%P zBf{$&=j?~U;|;`l!o-J^vU=^V9meN=AtGsY;|N;1+<4mU3oR8zQ6z+nnYi_M>^F9z zboUC<6%H!!0|QhWn-H-x!c-blLB>INvrjN~hP+R}K$p))b3-elcUrZF$ctZ!zDRsVWXkbFdFO$M8&=M!0cK`qY07*qo IM6N<$f}(?|*#H0l literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..06e511b091b69d2631723f315c78a4b0e454df26 GIT binary patch literal 1762 zcmV<81|9i{P)Y?+pC0=>&9<$W(r)NYre}63wRK#26UUZGV|%GP5kx zkwBPBSeVP^baS9Wj4Te7iAszaNW{rcK@gMzExrEkaz_d+P~Zx84a85P)xllvpymb#tT_4^HE-)4gh^z)Wb7s)%*$6qsY1k*YB3oSz0E%=<7>M8 z*5#M?PafAlzw=C~4ruj!6Ie{>VT!_Rc3qlAdm9g6hWlW-`{$hUD?PEu+ z26eyVF;1cg^Oh*%e=a1I>vjpA?G%6j;XV;59}$XGF|8$AH=DJs?e={`qDX|Mv!o+p zN)LA`4)8!9oHxFF6$_L)UE-BA5-Vpj~+b^x?J4eE{&TV31dA29c5A zJ+`;vjaXdbyKourkpRG;dII{0+QDseU3h0OLRk|1Wq5Iz)L(d zjxAQ<>~Gh4Z#bN%f$Ao+TM5nbL2&AT54^cR>{PyXi3HwSEQY)*G@SZV$N9XRMU?>} z_~t`rNk>8hFgW{(9QK{=gFAKH{{3J-5nERkh>g0Rxk02Q5Kz-(hO!4nPUq$9_gmK9G4v1Ep1CC-s^VgMth>D11du<+mOh;fr7T!B2*u@MAeh@PU)h zSK_cN3};(*qHq$OtH3}m9ZIH0YlXrxJy>l3C(rAEHUb<Rq=i(~_e} z-l#D`T23FBEC7uFaI?k;aZy8m^73#VMVbETNJEE(m9+C+k&bQ2z41e{N=7y(%?I{< z*9&*+oD*aEBy+hAm%Q`H1nId0l6Iavvp`(b&~}KwbDi|xukV!ML3nGqw~ueZUWBx3OGgV@gE%+=pIo0QU=`zn%nV--wPZ%=KXx*+qZTjeB!EH91!Gqr~ z3I=Z0wfBgn${BZ42G;&lNHxI@!|+@qxvtZPzvyUt(`B-4DJ!P6n?{ zfEn1TJvDjRR#TsW6{Vk*-`6x>`GE>c-0$hcrV^8;^Y_?YO@GJ)4Ys>WXC zGzB#E{@2!eIVmRS?c97aBzlKOvYaF)O-psh_5JTUO2TM!U9;}l%eInjsZ>PjmVlL? zo?yOD7c^5hv6{5)>gv2~b#+dj%}kGYrs{H1uc^OKqG|Y}R5~Yqoh&RNl?YxNi_7LL zKnMx)?cjLWm^X*|?k2jk>UMu~=_PGbago*7XK;1=|DexkyP>tn%>V!Z07*qoM6N<$ Ef~wa=xc~qF literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2727ad823ced77de10048decfae359e65368e943 GIT binary patch literal 2607 zcmV+~3efe5P) zeNYp39*4jCLN*Cx6AXv}6~Pyja#ehxFM1YfQQ_)Kom#D6JJzbTSEg#M$5h9;>2e(!8Z=q02gK3b75JBw0}ofJmLk0B%~HK~YKVi-pC_MCjfFpSe>)9LMoYkHSe zS7*I*<-Fkp=St{=CjkQ@=vNdl7={5ssequy zp+BFJ$32r1nX&?$Hhq1^^^$$MD|>cZS}LjnJzqd_aj9CSPF?p7os_d0C#V5^c>`jE zkkCWukuR;IN4&Jw)O7m0w*P#v-r8DG?eBShKtLW8I;ht>u5%=(ODK@OHRYxwuqKX)<;d$Td@5N zZYrzvbeu=Igj7w(Wgj>|MUI}vc~TKW%A!Wc&iwXN+Vp?fN1lHaKvCQfe{_f2=={k!sUcw{&jrCRdrf>;-x3 zlvj93C~|OuijA4N^Dp&>GGFZ6c3-Z$xiumGW8TvB1EkU8=Fy`TJ*ThUdjz`5Rj0nY zmXOd1yrvUBn0n%d?S@~AQy7=c<(5l^$I^6C?kc{M^#@2<^cXrRXTGj-&o^$l%F#=5 zAH|**SEwFanRj1qMBv11LS->*<5`4EysXnGz8^ie~b5>e1n06#0V+PcMh*GeyReO zV55{_CQoFM;(7!$C8kd&@#02Z$X&xP@P+v%~5y3~-a>51duG7zXh1G6iH$ z^1T+1BrsT#DT67=VX%C=9vW`5e-)z-dBe-$kTXr@_t>$CVeq$n6)fDOWmPb%a$lbz z^DDM1BjZRYUax}O%{r)U^xO;U4I}}u<4px*j14@?Kot(#-=JaspS9p*$uDbi)iegb zpC#|b^Kkg#}Jke zqLn!8%U8k59eOCQwD&rLQjWprc{EHM+56#=CDUcF?}UYw3XV0ozf1FcrTkKBhgAgz zcMZLCh79IDCG~h5`d|w3Xjt)C?*t>UU%jJ*$Kt)erP@XZeDa+MDr)TRmdx98dk(b6 z4~1L}5AFG!slSm3NABpsqG{)tfA8J(!rlaEl6kBcI|aYFLl4WdWj@7TzTt3pNO~)l zO#~qq@!260v>RNoaZ$Ke!QZ~8^ti8+vdcDiN5stWU{Ih4MlPc0*xhcYH^KhIq7DdK z>u2><71tH3XdqqTKg!hg{S5W1J%2=Tk1zi!OTnL~Q z0W7o%xJIyY!H-~}iv^*}g?ob0Y|)}FGYWN04tRBoUeIDe3~~{FEb4&o&srfhF$`LD zE+{=`1&hEcFHeXPLqc*nBqWzZ zLUK7IB$q>2k!!Pi9-U%qDJECg9o}-YGupv>FpV*e29k;1H5w7{=FPix9mBUAYFnL-bcjo32JrsYdagqd&rsF3X*(03gh} z@Q4_OVVX#5+xhddK~F5;J4}DWrmea{qTfMKrL6dn?=bxhOG`x=X}WddXP493fD=?4 z-+}rQrpD7pNXBVpj8_kRLywrhhVMZA1*c8l&~c;WCwC`8U-k8F#qjy7Fbsr!qb`xq zalPa##%{cOb7FH-*(K}k3x}jpW9RZ6OzbcWV`{&+Z7X!`{8+4V6ex<{BqqHC*er6u8=|qgnVQIL1ZqrAde|H$Ndnw!m?o4Uz$ni}=ZCsw|o$^7~xj()o;M8Ie(cds|p7XPd3wjM){ zriSDHYd-n*?3mwf`w=H7#Y0UfQjGOSx3re$Z+dXM$MIZa?f#Q4OM8YUv+xI;pkf|M zLNUUCOI!KnhSu_Yk3C$kgXN}%V-+_JJexY`nVkjFsIjv+4Jkrg4$Cc6#u{piOT8WA zb0)&Bt!k`4_}pxIRL)HG#0}d>S=1vxHi_D?`s$+1s8!%JH=BGN8_+b5zPhNyaP?ra za#YSjW%ANI2|X7b`a z$~BX-$Mz_q3r;iwKl%8PhhM;CK{}1D!xmF^a RoX!9M002ovPDHLkV1i8p`Ktf` literal 0 HcmV?d00001 diff --git a/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/laundry_mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..57807bca9bd25b884920d0a02a0fd6d23332b843 GIT binary patch literal 1214 zcmV;v1VQ_WP)kjx0%Ak#>UaevJ}j0sUO zY}wp2Cc0^G3{-R~L}$hv1h>I97@BM_Mk1pFl-lR*>t1s&6j~@R?EbQvT-wf3eL{8~ZAeTZ83P+_oKgt^-W&AX9rlb|ZgcC~jFpf+xE zdgAu_W=gvvVY$KPk}hs@ZgRnQzgo}jDRJID^ZgW{v~#hB3yGjKhBezhY#3_Znd2F5 z>y!Z{x84hIArU0QnsaJD9c;+TpmpZV3@PSf4K-6zTpCl0ifL0?NvT>1A!ywYNdc6{ zsD?RksYSbJHX%Dt4P$)rO*k@t0tgZMUJDGrSrpsUnJw8gZA?m01JIM!1CZiG`@wEi z04WV;rb$YxQ-Kf6csv4eR=G`&$EjgbN*97&#HdBdaBT}HrwJk*fUbX&T4tddAR$s< z`_k1iH>E`b=040|%LWbn0TDl5@u7Plu%v|^h$rz>rWPxWB)a? zS<|6fp3kDLmB(9kE(C(}&z0&|#nUV*3-q9=iE38*IE#*4AIfU&@cI=3?yzVg;N(RK z0?+5MNLWeXe44)<=O3%pOn8zlyLH@0PH zaA>ay6-Vp{3bW@*vyZ9m>C=Rgt!inFxJ0oNx{^3&rL4c#&goym=@kNorp|O> zOP5b}?cseU=rq%iR-1s`Pq0&P2T!_i>O3FSrrcg2lNHs$)*e6h9=7Ay{z%CA;Fc=I zg}VKBKlXoM$I(iY>~2iPoa9!eaH;@eawnzud%v6mMFKTnxg%muiBvo4q{JyWXalPy z&^x%aQ)WJ?1}N#4b%A5$Ur1HJ<nn+J!rR1<}Yn|JKmB`G27H|jo< c+#3Go;F^4cdzAtC(g9xKCKd{h#r$<829>iRb2W41Ym@r6AuWb&