统一弹窗风格:Material Design 3 规范,消除颜色不一致

- 所有 AlertDialog 替换为 ModernDialog
- ConfirmDialog/AssetDialogs 去掉 GlassPanel,统一 surfaceContainer 背景
- 按钮统一 FilledButton + TextButton
- 修复 import 路径
This commit is contained in:
2026-04-16 11:47:17 +08:00
parent 491fcfdb5d
commit 1793fb727e
32 changed files with 75614 additions and 69129 deletions

View File

@@ -1 +1 @@
"DRgHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYWRhLnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2FkYS5wbmcHHGFzc2V0cy9pY29ucy9jcnlwdG8vYXRvbS5wbmcMAQ0BBwVhc3NldAccYXNzZXRzL2ljb25zL2NyeXB0by9hdG9tLnBuZwccYXNzZXRzL2ljb25zL2NyeXB0by9hdmF4LnBuZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL2F2YXgucG5nBxthc3NldHMvaWNvbnMvY3J5cHRvL2JuYi5wbmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by9ibmIucG5nBxthc3NldHMvaWNvbnMvY3J5cHRvL2J0Yy5wbmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by9idGMucG5nBxxhc3NldHMvaWNvbnMvY3J5cHRvL2RvZ2UucG5nDAENAQcFYXNzZXQHHGFzc2V0cy9pY29ucy9jcnlwdG8vZG9nZS5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vZG90LnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2RvdC5wbmcHJWFzc2V0cy9pY29ucy9jcnlwdG8vZG93bmxvYWRfaWNvbnMuc2gMAQ0BBwVhc3NldAclYXNzZXRzL2ljb25zL2NyeXB0by9kb3dubG9hZF9pY29ucy5zaAcbYXNzZXRzL2ljb25zL2NyeXB0by9ldGgucG5nDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vZXRoLnBuZwccYXNzZXRzL2ljb25zL2NyeXB0by9saW5rLnBuZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL2xpbmsucG5nBxthc3NldHMvaWNvbnMvY3J5cHRvL2x0Yy5wbmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by9sdGMucG5nBx1hc3NldHMvaWNvbnMvY3J5cHRvL21hdGljLnBuZwwBDQEHBWFzc2V0Bx1hc3NldHMvaWNvbnMvY3J5cHRvL21hdGljLnBuZwccYXNzZXRzL2ljb25zL2NyeXB0by9zaGliLnBuZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL3NoaWIucG5nBxthc3NldHMvaWNvbnMvY3J5cHRvL3NvbC5wbmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by9zb2wucG5nBxthc3NldHMvaWNvbnMvY3J5cHRvL3VuaS5wbmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by91bmkucG5nBxxhc3NldHMvaWNvbnMvY3J5cHRvL3VzZHQucG5nDAENAQcFYXNzZXQHHGFzc2V0cy9pY29ucy9jcnlwdG8vdXNkdC5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8veHJwLnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL3hycC5wbmcHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXcxMDAudHRmDAENAQcFYXNzZXQHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXcxMDAudHRmB0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13MjAwLnR0ZgwBDQEHBWFzc2V0B0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13MjAwLnR0ZgdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzMwMC50dGYMAQ0BBwVhc3NldAdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzMwMC50dGYHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXc0MDAudHRmDAENAQcFYXNzZXQHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXc0MDAudHRmB0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13NTAwLnR0ZgwBDQEHBWFzc2V0B0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13NTAwLnR0ZgdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzYwMC50dGYMAQ0BBwVhc3NldAdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzYwMC50dGYHL3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9sdWNpZGUudHRmDAENAQcFYXNzZXQHL3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9sdWNpZGUudHRm"
"DSgHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYWRhLnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2FkYS5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYWRhLnN2ZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2FkYS5zdmcHHGFzc2V0cy9pY29ucy9jcnlwdG8vYXRvbS5wbmcMAQ0BBwVhc3NldAccYXNzZXRzL2ljb25zL2NyeXB0by9hdG9tLnBuZwccYXNzZXRzL2ljb25zL2NyeXB0by9hdG9tLnN2ZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL2F0b20uc3ZnBxxhc3NldHMvaWNvbnMvY3J5cHRvL2F2YXgucG5nDAENAQcFYXNzZXQHHGFzc2V0cy9pY29ucy9jcnlwdG8vYXZheC5wbmcHHGFzc2V0cy9pY29ucy9jcnlwdG8vYXZheC5zdmcMAQ0BBwVhc3NldAccYXNzZXRzL2ljb25zL2NyeXB0by9hdmF4LnN2ZwcbYXNzZXRzL2ljb25zL2NyeXB0by9ibmIucG5nDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYm5iLnBuZwcbYXNzZXRzL2ljb25zL2NyeXB0by9ibmIuc3ZnDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYm5iLnN2ZwcbYXNzZXRzL2ljb25zL2NyeXB0by9idGMucG5nDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYnRjLnBuZwcbYXNzZXRzL2ljb25zL2NyeXB0by9idGMuc3ZnDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vYnRjLnN2ZwccYXNzZXRzL2ljb25zL2NyeXB0by9kb2dlLnBuZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL2RvZ2UucG5nBxxhc3NldHMvaWNvbnMvY3J5cHRvL2RvZ2Uuc3ZnDAENAQcFYXNzZXQHHGFzc2V0cy9pY29ucy9jcnlwdG8vZG9nZS5zdmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vZG90LnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2RvdC5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vZG90LnN2ZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2RvdC5zdmcHJWFzc2V0cy9pY29ucy9jcnlwdG8vZG93bmxvYWRfaWNvbnMuc2gMAQ0BBwVhc3NldAclYXNzZXRzL2ljb25zL2NyeXB0by9kb3dubG9hZF9pY29ucy5zaAcbYXNzZXRzL2ljb25zL2NyeXB0by9ldGgucG5nDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vZXRoLnBuZwcbYXNzZXRzL2ljb25zL2NyeXB0by9ldGguc3ZnDAENAQcFYXNzZXQHG2Fzc2V0cy9pY29ucy9jcnlwdG8vZXRoLnN2ZwccYXNzZXRzL2ljb25zL2NyeXB0by9saW5rLnBuZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL2xpbmsucG5nBxxhc3NldHMvaWNvbnMvY3J5cHRvL2xpbmsuc3ZnDAENAQcFYXNzZXQHHGFzc2V0cy9pY29ucy9jcnlwdG8vbGluay5zdmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vbHRjLnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2x0Yy5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vbHRjLnN2ZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL2x0Yy5zdmcHHWFzc2V0cy9pY29ucy9jcnlwdG8vbWF0aWMucG5nDAENAQcFYXNzZXQHHWFzc2V0cy9pY29ucy9jcnlwdG8vbWF0aWMucG5nBx1hc3NldHMvaWNvbnMvY3J5cHRvL21hdGljLnN2ZwwBDQEHBWFzc2V0Bx1hc3NldHMvaWNvbnMvY3J5cHRvL21hdGljLnN2ZwccYXNzZXRzL2ljb25zL2NyeXB0by9zaGliLnBuZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL3NoaWIucG5nBxxhc3NldHMvaWNvbnMvY3J5cHRvL3NoaWIuc3ZnDAENAQcFYXNzZXQHHGFzc2V0cy9pY29ucy9jcnlwdG8vc2hpYi5zdmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vc29sLnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL3NvbC5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vc29sLnN2ZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL3NvbC5zdmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vdW5pLnBuZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL3VuaS5wbmcHG2Fzc2V0cy9pY29ucy9jcnlwdG8vdW5pLnN2ZwwBDQEHBWFzc2V0Bxthc3NldHMvaWNvbnMvY3J5cHRvL3VuaS5zdmcHHGFzc2V0cy9pY29ucy9jcnlwdG8vdXNkdC5wbmcMAQ0BBwVhc3NldAccYXNzZXRzL2ljb25zL2NyeXB0by91c2R0LnBuZwccYXNzZXRzL2ljb25zL2NyeXB0by91c2R0LnN2ZwwBDQEHBWFzc2V0Bxxhc3NldHMvaWNvbnMvY3J5cHRvL3VzZHQuc3ZnBxthc3NldHMvaWNvbnMvY3J5cHRvL3hycC5wbmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by94cnAucG5nBxthc3NldHMvaWNvbnMvY3J5cHRvL3hycC5zdmcMAQ0BBwVhc3NldAcbYXNzZXRzL2ljb25zL2NyeXB0by94cnAuc3ZnB0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13MTAwLnR0ZgwBDQEHBWFzc2V0B0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13MTAwLnR0ZgdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzIwMC50dGYMAQ0BBwVhc3NldAdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzIwMC50dGYHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXczMDAudHRmDAENAQcFYXNzZXQHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXczMDAudHRmB0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13NDAwLnR0ZgwBDQEHBWFzc2V0B0dwYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvYnVpbGRfZm9udC9MdWNpZGVWYXJpYWJsZS13NDAwLnR0ZgdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzUwMC50dGYMAQ0BBwVhc3NldAdHcGFja2FnZXMvbHVjaWRlX2ljb25zX2ZsdXR0ZXIvYXNzZXRzL2J1aWxkX2ZvbnQvTHVjaWRlVmFyaWFibGUtdzUwMC50dGYHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXc2MDAudHRmDAENAQcFYXNzZXQHR3BhY2thZ2VzL2x1Y2lkZV9pY29uc19mbHV0dGVyL2Fzc2V0cy9idWlsZF9mb250L0x1Y2lkZVZhcmlhYmxlLXc2MDAudHRmBy9wYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvbHVjaWRlLnR0ZgwBDQEHBWFzc2V0By9wYWNrYWdlcy9sdWNpZGVfaWNvbnNfZmx1dHRlci9hc3NldHMvbHVjaWRlLnR0Zg=="

View File

@@ -1268,6 +1268,38 @@ xxhash
Copyright 2019 The ANGLE Project Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
--------------------------------------------------------------------------------
args
logging
Copyright 2013, the Dart project authors.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of Google LLC nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------------
async
collection
@@ -1907,6 +1939,8 @@ path_provider_foundation
shared_preferences
shared_preferences_android
shared_preferences_foundation
vector_graphics
vector_graphics_compiler
Copyright 2013 The Flutter Authors
@@ -5497,6 +5531,7 @@ shared_preferences_linux
shared_preferences_platform_interface
shared_preferences_web
shared_preferences_windows
vector_graphics_codec
xdg_directories
Copyright 2013 The Flutter Authors. All rights reserved.
@@ -5525,6 +5560,28 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------------
flutter_svg
Copyright (c) 2018 Dan Field
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
--------------------------------------------------------------------------------
freetype2
@@ -23797,37 +23854,6 @@ CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.
--------------------------------------------------------------------------------
logging
Copyright 2013, the Dart project authors.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of Google LLC nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------------
lucide_icons_flutter
@@ -24601,6 +24627,29 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------------
path_parsing
Copyright (c) 2018 Dan Field
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
--------------------------------------------------------------------------------
perfetto
@@ -25003,6 +25052,32 @@ perfetto
Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
for details. All rights reserved. Use of this source code is governed by a
BSD-style license that can be found in the LICENSE file.
--------------------------------------------------------------------------------
petitparser
The MIT License
Copyright (c) 2006-2024 Lukas Renggli.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
--------------------------------------------------------------------------------
platform
@@ -31327,6 +31402,32 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
--------------------------------------------------------------------------------
xml
The MIT License
Copyright (c) 2006-2025 Lukas Renggli.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
--------------------------------------------------------------------------------
xxhash

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><filter x="-7.5%" y="-6%" width="115.5%" height="117.2%" filterUnits="objectBoundingBox" id="a"><feOffset dy=".5" in="SourceAlpha" result="shadowOffsetOuter1"/><feGaussianBlur stdDeviation=".5" in="shadowOffsetOuter1" result="shadowBlurOuter1"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.204257246 0" in="shadowBlurOuter1"/></filter><path d="M15.725 6.06c.479-.247 1.064.324.81.795-.149.384-.71.486-.996.193-.303-.28-.204-.836.186-.989zm-5.155.546c.291-.118.66.144.63.457.03.338-.39.588-.687.427-.393-.15-.348-.778.057-.884zm10.558.893c-.455-.054-.527-.758-.09-.9.34-.162.652.143.702.46-.072.27-.302.518-.612.44zm-9.385 1.265c.487-.303 1.181.148 1.106.705-.025.561-.783.887-1.211.507-.414-.298-.351-.982.105-1.212zm7.43.322c.217-.55 1.097-.568 1.344-.032.245.417-.056.934-.491 1.076-.577.106-1.124-.508-.853-1.044zm-4.069 1.013c-.005-.474.433-.826.89-.859.304.06.634.187.764.488.243.416.027.987-.41 1.178-.2.11-.438.069-.656.056-.333-.16-.614-.477-.588-.863zm-7.666.69c.445-.27 1.045.22.876.696-.092.411-.654.578-.975.316-.343-.246-.289-.837.1-1.013zm16.462-.002c.377-.288 1 .043.954.511.026.427-.513.75-.887.53-.412-.183-.455-.807-.067-1.04zm-6.64.851c.622-.22 1.362.043 1.716.59.468.667.22 1.683-.507 2.066-.752.453-1.851.07-2.13-.758-.315-.74.145-1.666.92-1.898zm-3.653.073c.69-.32 1.619-.052 1.952.642.392.676.089 1.617-.612 1.966-.702.393-1.693.095-2.032-.63-.381-.702-.043-1.655.692-1.978zM9.95 12.94c.053-.437.472-.722.895-.752a.98.98 0 01.87.857c-.03.45-.383.888-.867.886-.533.045-1-.477-.898-.991zm10.802-.656c.547-.313 1.306.142 1.282.76.037.655-.803 1.116-1.347.732-.566-.32-.522-1.22.065-1.492zm-8.63 2.307c.638-.173 1.37.123 1.683.701.343.582.203 1.39-.33 1.818-.685.626-1.946.374-2.31-.48-.419-.783.09-1.833.956-2.04zm6.927-.003c.621-.175 1.351.06 1.685.617.442.637.231 1.588-.426 1.998-.69.477-1.756.227-2.136-.519-.46-.771.003-1.861.877-2.096zm-11.04.726c.552-.205 1.164.394.94.933-.136.49-.839.672-1.202.31-.425-.34-.268-1.095.262-1.243zm14.969.782a.836.836 0 01.788-.874c.378.06.746.36.716.765.035.535-.62.898-1.084.647-.217-.109-.328-.328-.42-.538zM5.294 15.58c.332-.143.743.14.667.503-.018.411-.635.57-.861.226-.2-.239-.08-.606.194-.73zm20.949-.009c.234-.163.61-.046.702.223.157.294-.131.696-.467.647-.472.042-.624-.665-.235-.87zm-12.317 1.973c.874-.223 1.814.494 1.82 1.38.056.895-.87 1.688-1.764 1.482-.692-.11-1.235-.766-1.212-1.453-.002-.658.502-1.27 1.156-1.409zm3.462-.001c.887-.244 1.855.486 1.841 1.392.047.878-.85 1.645-1.726 1.47-.825-.104-1.433-.995-1.203-1.783.116-.524.562-.95 1.088-1.08zm-6.676.545c.614-.103 1.19.57.941 1.144-.182.612-1.086.777-1.486.278-.468-.48-.118-1.356.545-1.422zm10.154.027c.548-.226 1.22.24 1.178.825.022.643-.808 1.087-1.343.711-.607-.337-.496-1.33.165-1.536zm2.838 2.8c-.214-.393.175-.914.62-.841.22-.004.375.167.516.311.029.233.078.511-.119.69-.267.333-.872.238-1.017-.16zm-16.268-.732c.415-.271 1.012.134.918.61-.05.423-.59.664-.945.424-.382-.217-.368-.836.027-1.034zm8.193.883c.543-.235 1.235.23 1.183.818.04.65-.815 1.1-1.346.71-.59-.335-.491-1.321.163-1.528zm-3.794.871c.462-.239 1.082.174 1.04.684.014.418-.4.774-.82.712-.347-.007-.573-.314-.685-.605.006-.317.139-.67.465-.79zm7.686.008c.476-.29 1.152.126 1.107.67.012.57-.752.934-1.195.56-.428-.293-.376-.997.088-1.23zm1.337 3.25c-.212-.314.037-.693.38-.765.277.055.57.26.511.574-.04.427-.674.557-.891.192zm-10.611-.273c.084-.25.288-.497.587-.432.435.03.564.676.183.875-.342.227-.74-.084-.77-.443zm5.12.287c.083-.37.568-.549.888-.353.212.09.274.322.328.52a8.822 8.822 0 00-.08.31c-.131.152-.3.305-.518.3-.405.047-.771-.404-.619-.777z" id="b"/></defs><g fill="none"><circle cx="16" cy="16" r="16" fill="#0D1E30"/><use fill="#000" filter="url(#a)" xlink:href="#b"/><use fill="#FFF" xlink:href="#b"/></g></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle cx="16" cy="16" r="16" fill="#2E3148"/><g transform="translate(6 5)" fill="#FFF"><path d="M10.02.53c-1.295 0-2.345 4.697-2.345 10.49s1.05 10.49 2.345 10.49c1.294 0 2.344-4.697 2.344-10.49S11.314.53 10.02.53zm.162 20.387c-.148.198-.297.05-.297.05-.596-.692-.894-1.975-.894-1.975-1.043-3.357-.795-10.564-.795-10.564.49-5.721 1.382-7.073 1.685-7.373a.185.185 0 01.238-.019c.44.313.81 1.617.81 1.617 1.09 4.048.991 7.848.991 7.848.099 3.308-.546 7.01-.546 7.01-.497 2.814-1.192 3.406-1.192 3.406z"/><path d="M19.118 5.8c-.645-1.124-5.24.303-10.267 3.186-5.027 2.883-8.573 6.13-7.93 7.254.645 1.124 5.241-.303 10.268-3.186 5.027-2.883 8.574-6.131 7.93-7.254zM1.515 16.085c-.246-.03-.19-.234-.19-.234.302-.86 1.266-1.758 1.266-1.758 2.393-2.575 8.769-5.946 8.769-5.946 5.206-2.422 6.823-2.32 7.233-2.208a.185.185 0 01.135.198c-.05.537-1 1.507-1 1.507-2.966 2.961-6.312 4.768-6.312 4.768-2.82 1.732-6.353 3.013-6.353 3.013-2.688.968-3.548.66-3.548.66z"/><path d="M19.095 16.277c.65-1.12-2.887-4.383-7.898-7.288C6.187 6.085 1.593 4.641.944 5.763c-.65 1.123 2.888 4.383 7.9 7.288 5.013 2.904 9.602 4.348 10.251 3.226zM1.375 6.196c-.097-.228.106-.283.106-.283.897-.17 2.157.217 2.157.217 3.427.78 9.538 4.608 9.538 4.608 4.705 3.292 5.427 4.743 5.535 5.154a.185.185 0 01-.103.215c-.49.225-1.805-.11-1.805-.11-4.05-1.086-7.289-3.075-7.289-3.075-2.91-1.57-5.788-3.985-5.788-3.985-2.187-1.842-2.35-2.74-2.35-2.74l-.002-.001z"/><circle cx="9.995" cy="10.995" r="1.234"/><circle cx="15.055" cy="6.256" r="1"/><circle cx="3.306" cy="8.774" r="1"/><circle cx="8.539" cy="17.856" r="1"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><circle fill="#E84142" fill-rule="nonzero" cx="16" cy="16" r="16"/><path d="M11.518 22.75H8.49c-.636 0-.95 0-1.142-.123A.77.77 0 017 22.025c-.012-.226.145-.503.46-1.055l7.472-13.193c.318-.56.48-.84.682-.944a.77.77 0 01.698 0c.203.104.364.384.682.944l1.536 2.686.008.014c.343.6.517.906.593 1.226a2.26 2.26 0 010 1.066c-.076.323-.249.63-.597 1.24l-3.926 6.95-.01.017c-.346.606-.52.913-.764 1.145a2.284 2.284 0 01-.93.54c-.319.089-.675.089-1.387.089zm7.643 0h4.336c.64 0 .962 0 1.154-.126a.768.768 0 00.348-.607c.011-.219-.142-.484-.443-1.005l-.032-.054-2.172-3.722-.025-.042c-.305-.517-.46-.778-.657-.879a.762.762 0 00-.693 0c-.2.104-.36.377-.678.925l-2.165 3.722-.007.013c-.317.548-.476.821-.464 1.046a.777.777 0 00.348.606c.188.123.51.123 1.15.123z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 891 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g fill="none"><circle cx="16" cy="16" r="16" fill="#F3BA2F"/><path fill="#FFF" d="M12.116 14.404L16 10.52l3.886 3.886 2.26-2.26L16 6l-6.144 6.144 2.26 2.26zM6 16l2.26-2.26L10.52 16l-2.26 2.26L6 16zm6.116 1.596L16 21.48l3.886-3.886 2.26 2.259L16 26l-6.144-6.144-.003-.003 2.263-2.257zM21.48 16l2.26-2.26L26 16l-2.26 2.26L21.48 16zm-3.188-.002h.002V16L16 18.294l-2.291-2.29-.004-.004.004-.003.401-.402.195-.195L16 13.706l2.293 2.293z"/></g></svg>

After

Width:  |  Height:  |  Size: 505 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="16" r="16" fill="#F7931A"/><path fill="#FFF" fill-rule="nonzero" d="M23.189 14.02c.314-2.096-1.283-3.223-3.465-3.975l.708-2.84-1.728-.43-.69 2.765c-.454-.114-.92-.22-1.385-.326l.695-2.783L15.596 6l-.708 2.839c-.376-.086-.746-.17-1.104-.26l.002-.009-2.384-.595-.46 1.846s1.283.294 1.256.312c.7.175.826.638.805 1.006l-.806 3.235c.048.012.11.03.18.057l-.183-.045-1.13 4.532c-.086.212-.303.531-.793.41.018.025-1.256-.313-1.256-.313l-.858 1.978 2.25.561c.418.105.828.215 1.231.318l-.715 2.872 1.727.43.708-2.84c.472.127.93.245 1.378.357l-.706 2.828 1.728.43.715-2.866c2.948.558 5.164.333 6.097-2.333.752-2.146-.037-3.385-1.588-4.192 1.13-.26 1.98-1.003 2.207-2.538zm-3.95 5.538c-.533 2.147-4.148.986-5.32.695l.95-3.805c1.172.293 4.929.872 4.37 3.11zm.535-5.569c-.487 1.953-3.495.96-4.47.717l.86-3.45c.975.243 4.118.696 3.61 2.733z"/></g></svg>

After

Width:  |  Height:  |  Size: 953 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="16" r="16" fill="#C3A634"/><path fill="#FFF" d="M13.248 14.61h4.314v2.286h-4.314v4.818h2.721c1.077 0 1.958-.145 2.644-.437.686-.291 1.224-.694 1.615-1.21a4.4 4.4 0 00.796-1.815 11.4 11.4 0 00.21-2.252 11.4 11.4 0 00-.21-2.252 4.396 4.396 0 00-.796-1.815c-.391-.516-.93-.919-1.615-1.21-.686-.292-1.567-.437-2.644-.437h-2.721v4.325zm-2.766 2.286H9v-2.285h1.482V8h6.549c1.21 0 2.257.21 3.142.627.885.419 1.607.99 2.168 1.715.56.724.977 1.572 1.25 2.543.273.971.409 2.01.409 3.115a11.47 11.47 0 01-.41 3.115c-.272.97-.689 1.819-1.25 2.543-.56.725-1.282 1.296-2.167 1.715-.885.418-1.933.627-3.142.627h-6.549v-7.104z"/></g></svg>

After

Width:  |  Height:  |  Size: 738 B

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle fill="#E6007A" cx="16" cy="16" r="16"/><path d="M16.272 6.625c-3.707 0-6.736 3.012-6.736 6.736 0 .749.124 1.48.356 2.192a.95.95 0 001.194.589.95.95 0 00.588-1.194 4.745 4.745 0 01-.267-1.73c.071-2.512 2.103-4.58 4.616-4.704a4.86 4.86 0 015.115 4.847 4.862 4.862 0 01-4.58 4.848s-.945.053-1.408.125c-.232.035-.41.071-.535.089-.054.018-.107-.036-.09-.09l.161-.783.873-4.028a.934.934 0 00-.712-1.105.934.934 0 00-1.105.713s-2.103 9.802-2.121 9.909a.934.934 0 00.713 1.105.934.934 0 001.105-.713c.017-.107.303-1.408.303-1.408a2.367 2.367 0 011.996-1.854 21.43 21.43 0 011.051-.089 6.744 6.744 0 006.22-6.719c0-3.724-3.03-6.736-6.737-6.736zm.481 15.505a1.122 1.122 0 00-1.336.873c-.125.606.25 1.212.873 1.337a1.122 1.122 0 001.337-.874c.124-.623-.25-1.212-.874-1.336z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 893 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="16" r="16" fill="#627EEA"/><g fill="#FFF" fill-rule="nonzero"><path fill-opacity=".602" d="M16.498 4v8.87l7.497 3.35z"/><path d="M16.498 4L9 16.22l7.498-3.35z"/><path fill-opacity=".602" d="M16.498 21.968v6.027L24 17.616z"/><path d="M16.498 27.995v-6.028L9 17.616z"/><path fill-opacity=".2" d="M16.498 20.573l7.497-4.353-7.497-3.348z"/><path fill-opacity=".602" d="M9 16.22l7.498 4.353v-7.701z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 525 B

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle fill="#2A5ADA" cx="16" cy="16" r="16"/><path d="M16 6l-1.799 1.055L9.3 9.945 7.5 11v10l1.799 1.055 4.947 2.89L16.045 26l1.799-1.055 4.857-2.89L24.5 21V11l-1.799-1.055-4.902-2.89L16 6zm-4.902 12.89v-5.78L16 10.22l4.902 2.89v5.78L16 21.78l-4.902-2.89z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 380 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="16" r="16" fill="#BFBBBB"/><path fill="#FFF" d="M10.427 19.214L9 19.768l.688-2.759 1.444-.58L13.213 8h5.129l-1.519 6.196 1.41-.571-.68 2.75-1.427.571-.848 3.483H23L22.127 24H9.252z"/></g></svg>

After

Width:  |  Height:  |  Size: 331 B

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle fill="#6F41D8" cx="16" cy="16" r="16"/><path d="M21.092 12.693c-.369-.215-.848-.215-1.254 0l-2.879 1.654-1.955 1.078-2.879 1.653c-.369.216-.848.216-1.254 0l-2.288-1.294c-.369-.215-.627-.61-.627-1.042V12.19c0-.431.221-.826.627-1.042l2.25-1.258c.37-.216.85-.216 1.256 0l2.25 1.258c.37.216.628.611.628 1.042v1.654l1.955-1.115v-1.653a1.16 1.16 0 00-.627-1.042l-4.17-2.372c-.369-.216-.848-.216-1.254 0l-4.244 2.372A1.16 1.16 0 006 11.076v4.78c0 .432.221.827.627 1.043l4.244 2.372c.369.215.849.215 1.254 0l2.879-1.618 1.955-1.114 2.879-1.617c.369-.216.848-.216 1.254 0l2.251 1.258c.37.215.627.61.627 1.042v2.552c0 .431-.22.826-.627 1.042l-2.25 1.294c-.37.216-.85.216-1.255 0l-2.251-1.258c-.37-.216-.628-.611-.628-1.042v-1.654l-1.955 1.115v1.653c0 .431.221.827.627 1.042l4.244 2.372c.369.216.848.216 1.254 0l4.244-2.372c.369-.215.627-.61.627-1.042v-4.78a1.16 1.16 0 00-.627-1.042l-4.28-2.409z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 1016 B

View File

@@ -0,0 +1 @@
Couldn't find the requested file /svg/color/shib.svg in spothq/cryptocurrency-icons.

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle fill="#66F9A1" cx="16" cy="16" r="16"/><path d="M9.925 19.687a.59.59 0 01.415-.17h14.366a.29.29 0 01.207.497l-2.838 2.815a.59.59 0 01-.415.171H7.294a.291.291 0 01-.207-.498l2.838-2.815zm0-10.517A.59.59 0 0110.34 9h14.366c.261 0 .392.314.207.498l-2.838 2.815a.59.59 0 01-.415.17H7.294a.291.291 0 01-.207-.497L9.925 9.17zm12.15 5.225a.59.59 0 00-.415-.17H7.294a.291.291 0 00-.207.498l2.838 2.815c.11.109.26.17.415.17h14.366a.291.291 0 00.207-.498l-2.838-2.815z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 589 B

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><circle fill="#FF007A" fill-rule="nonzero" cx="16" cy="16" r="16"/><g fill="#FFF"><path d="M12.261 5.767c-.285-.044-.297-.05-.163-.07.257-.04.865.015 1.284.114.977.233 1.866.828 2.816 1.885l.252.28.36-.057c1.52-.245 3.067-.05 4.36.547.356.164.917.491.987.576.023.026.064.199.091.383.096.637.048 1.125-.146 1.49-.106.198-.112.26-.041.43a.416.416 0 00.372.236c.322 0 .668-.52.828-1.243l.064-.287.126.143c.692.784 1.235 1.853 1.328 2.613l.025.199-.117-.18c-.2-.31-.4-.522-.658-.693-.464-.307-.955-.411-2.255-.48-1.174-.062-1.839-.162-2.497-.377-1.121-.365-1.686-.852-3.018-2.599-.591-.776-.957-1.205-1.32-1.55-.827-.786-1.639-1.198-2.678-1.36z" fill-rule="nonzero"/><path d="M22.422 7.5c.03-.52.1-.863.242-1.176.056-.124.109-.226.117-.226a.773.773 0 01-.055.204c-.103.304-.12.72-.049 1.203.09.614.142.702.79 1.365.305.311.659.703.787.872l.233.306-.233-.219c-.285-.267-.941-.79-1.086-.864-.097-.05-.112-.049-.172.01-.055.056-.067.138-.074.529-.012.608-.095 1-.296 1.39-.108.21-.125.166-.027-.073.073-.178.08-.256.08-.845 0-1.184-.141-1.468-.966-1.956a9.046 9.046 0 00-.764-.396 2.916 2.916 0 01-.374-.182c.023-.023.827.211 1.15.336.482.185.561.209.62.186.039-.015.058-.129.077-.464zm-9.607 2.025c-.579-.797-.937-2.02-.86-2.934l.024-.283.132.024c.248.045.675.204.875.326.548.333.786.772 1.027 1.898.071.33.164.703.207.83.068.203.328.678.54.987.152.222.05.327-.286.297-.514-.047-1.21-.527-1.659-1.145zm8.905 5.935c-2.707-1.09-3.66-2.036-3.66-3.632 0-.235.008-.427.017-.427.01 0 .115.077.233.172.549.44 1.164.628 2.865.876 1.001.147 1.565.265 2.085.437 1.652.548 2.674 1.66 2.918 3.174.07.44.029 1.265-.086 1.7-.09.344-.367.963-.44.987-.02.006-.04-.071-.046-.178-.028-.568-.315-1.122-.798-1.537-.549-.471-1.286-.847-3.089-1.572zm-1.9.452a4.808 4.808 0 00-.131-.572l-.07-.206.129.144c.177.2.318.454.436.794.091.259.101.336.1.757 0 .414-.011.5-.095.734a2.32 2.32 0 01-.571.908c-.495.504-1.13.782-2.048.898-.16.02-.624.054-1.033.075-1.03.054-1.707.164-2.316.378a.488.488 0 01-.174.042c-.024-.025.39-.272.733-.437.483-.233.963-.36 2.04-.539.532-.089 1.082-.196 1.221-.239 1.318-.404 1.995-1.446 1.778-2.737z" fill-rule="nonzero"/><path d="M21.06 18.116c-.36-.773-.442-1.52-.245-2.216.021-.074.055-.135.075-.135a.73.73 0 01.189.102c.166.112.498.3 1.383.782 1.105.603 1.735 1.07 2.164 1.602.375.467.607.999.719 1.647.063.367.026 1.25-.068 1.62-.297 1.166-.988 2.082-1.972 2.616a2.53 2.53 0 01-.288.143c-.014 0 .038-.133.117-.297.33-.692.369-1.366.118-2.116-.153-.459-.466-1.02-1.097-1.966-.734-1.1-.914-1.394-1.095-1.782zm-10.167 4.171c1.005-.848 2.254-1.45 3.393-1.635.49-.08 1.308-.048 1.762.068.728.186 1.38.604 1.719 1.101.33.486.473.91.62 1.852.06.372.123.745.142.83.11.488.327.879.595 1.075.425.311 1.158.33 1.878.05a.981.981 0 01.236-.074c.026.026-.336.269-.592.397a2.014 2.014 0 01-.983.238c-.66 0-1.208-.335-1.665-1.02-.09-.135-.292-.538-.45-.897-.482-1.1-.72-1.436-1.28-1.803-.489-.32-1.118-.377-1.591-.145-.622.305-.795 1.1-.35 1.603.177.2.507.373.777.406a.83.83 0 00.939-.83c0-.332-.128-.52-.448-.665-.437-.197-.907.033-.905.444.001.175.077.285.253.365.113.05.115.055.023.036-.401-.084-.495-.567-.172-.888.387-.386 1.188-.216 1.463.31.116.221.129.662.028.928-.225.595-.883.907-1.55.737-.454-.116-.639-.241-1.186-.805-.951-.98-1.32-1.17-2.692-1.384l-.263-.041.3-.253z" fill-rule="nonzero"/><path d="M6.196 3.35l.096.117c3.708 4.54 5.624 6.896 5.746 7.064.2.278.125.527-.219.723-.191.109-.585.219-.781.219-.223 0-.474-.107-.657-.28-.129-.123-.65-.901-1.853-2.768a188.53 188.53 0 00-1.712-2.633c-.049-.046-.048-.045 1.618 2.936 1.046 1.872 1.4 2.533 1.4 2.622 0 .18-.05.274-.272.522-.37.413-.535.877-.655 1.837-.134 1.077-.51 1.837-1.554 3.138-.61.762-.71.902-.865 1.209-.194.386-.247.603-.269 1.091-.023.516.022.85.18 1.343.138.432.282.718.65 1.288.318.493.501.859.501 1.002 0 .114.022.114.515.003 1.179-.266 2.136-.735 2.675-1.309.333-.355.411-.551.414-1.038.001-.318-.01-.385-.096-.568-.14-.298-.395-.546-.957-.93-.737-.504-1.051-.91-1.138-1.467-.072-.457.011-.78.419-1.634.421-.884.526-1.26.597-2.151.045-.576.108-.803.274-.985.172-.19.328-.255.755-.313.696-.095 1.139-.275 1.503-.61.316-.292.448-.573.468-.995l.016-.32-.177-.206c-.254-.296-2.355-2.614-6.304-6.956l-.106-.115-.212.165zM7.91 19.732a.566.566 0 00-.174-.746c-.228-.152-.583-.08-.583.118 0 .06.033.104.108.143.127.065.136.139.037.288-.101.152-.093.286.023.377.186.146.45.065.59-.18zm5.524-7.176c-.327.1-.644.447-.743.81-.06.221-.026.61.064.73.145.194.286.245.666.242.744-.005 1.39-.324 1.466-.723.062-.327-.223-.78-.614-.98-.202-.102-.631-.143-.839-.079zm.87.68c.115-.163.064-.34-.13-.458-.372-.227-.934-.04-.934.312 0 .174.293.365.561.365.18 0 .424-.107.503-.219z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="16" r="16" fill="#26A17B"/><path fill="#FFF" d="M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117"/></g></svg>

After

Width:  |  Height:  |  Size: 648 B

View File

@@ -0,0 +1 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g fill="none"><circle cx="16" cy="16" r="16" fill="#23292F"/><path d="M23.07 8h2.89l-6.015 5.957a5.621 5.621 0 01-7.89 0L6.035 8H8.93l4.57 4.523a3.556 3.556 0 004.996 0L23.07 8zM8.895 24.563H6l6.055-5.993a5.621 5.621 0 017.89 0L26 24.562h-2.895L18.5 20a3.556 3.556 0 00-4.996 0l-4.61 4.563z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 399 B

View File

@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"e4b8dca3f1b4ede4c30371002441c88c12187e
_flutter.loader.load({
serviceWorkerSettings: {
serviceWorkerVersion: "494072610" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
serviceWorkerVersion: "3768417549" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
}
});

File diff suppressed because one or more lines are too long

View File

@@ -9,8 +9,7 @@ import '../../../../core/theme/app_color_scheme.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/utils/toast_utils.dart';
import '../../../../providers/asset_provider.dart';
import '../../../components/glass_panel.dart';
import '../../../components/neon_glow.dart';
import '../../../shared/ui_constants.dart';
// ============================================
@@ -135,10 +134,13 @@ void showDepositDialog(BuildContext context) {
showDialog(
context: context,
builder: (ctx) => Dialog(
backgroundColor: Colors.transparent,
child: GlassPanel(
borderRadius: BorderRadius.circular(AppRadius.lg),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.xl),
),
backgroundColor: colorScheme.surfaceContainer,
child: Container(
padding: const EdgeInsets.all(AppSpacing.lg),
constraints: const BoxConstraints(maxWidth: 400),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -198,19 +200,17 @@ void showDepositDialog(BuildContext context) {
Row(
children: [
Expanded(
child: NeonButton(
text: '取消',
type: NeonButtonType.outline,
child: TextButton(
onPressed: () => Navigator.of(ctx).pop(),
height: 48,
showGlow: false,
style: TextButton.styleFrom(
minimumSize: const Size.fromHeight(48),
),
child: const Text('取消'),
),
),
const SizedBox(width: AppSpacing.sm),
Expanded(
child: NeonButton(
text: '下一步',
type: NeonButtonType.primary,
child: FilledButton(
onPressed: () async {
if (formKey.currentState!.validate()) {
Navigator.of(ctx).pop();
@@ -226,8 +226,10 @@ void showDepositDialog(BuildContext context) {
}
}
},
height: 48,
showGlow: true,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(48),
),
child: const Text('下一步'),
),
),
],
@@ -250,18 +252,21 @@ void showDepositResultDialog(BuildContext context, Map<String, dynamic> data) {
showDialog(
context: context,
builder: (ctx) => Dialog(
backgroundColor: Colors.transparent,
child: GlassPanel(
borderRadius: BorderRadius.circular(AppRadius.lg),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.xl),
),
backgroundColor: colorScheme.surfaceContainer,
child: Container(
padding: const EdgeInsets.all(AppSpacing.lg),
constraints: const BoxConstraints(maxWidth: 400),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
NeonIcon(
icon: Icons.check_circle,
Icon(
Icons.check_circle,
color: context.appColors.up,
size: 24,
),
@@ -316,19 +321,17 @@ void showDepositResultDialog(BuildContext context, Map<String, dynamic> data) {
Row(
children: [
Expanded(
child: NeonButton(
text: '稍後確認',
type: NeonButtonType.outline,
child: TextButton(
onPressed: () => Navigator.of(ctx).pop(),
height: 44,
showGlow: false,
style: TextButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
child: const Text('稍後確認'),
),
),
const SizedBox(width: AppSpacing.sm),
Expanded(
child: NeonButton(
text: '已打款',
type: NeonButtonType.primary,
child: FilledButton(
onPressed: () async {
Navigator.of(ctx).pop();
final response = await context.read<AssetProvider>().confirmPay(orderNo);
@@ -340,8 +343,10 @@ void showDepositResultDialog(BuildContext context, Map<String, dynamic> data) {
);
}
},
height: 44,
showGlow: true,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
child: const Text('已打款'),
),
),
],
@@ -386,10 +391,13 @@ void showWithdrawDialog(BuildContext context, String? balance) {
showDialog(
context: context,
builder: (ctx) => Dialog(
backgroundColor: Colors.transparent,
child: GlassPanel(
borderRadius: BorderRadius.circular(AppRadius.lg),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.xl),
),
backgroundColor: colorScheme.surfaceContainer,
child: Container(
padding: const EdgeInsets.all(AppSpacing.lg),
constraints: const BoxConstraints(maxWidth: 400),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
@@ -562,19 +570,17 @@ void showWithdrawDialog(BuildContext context, String? balance) {
Row(
children: [
Expanded(
child: NeonButton(
text: '取消',
type: NeonButtonType.outline,
child: TextButton(
onPressed: () => Navigator.of(ctx).pop(),
height: 44,
showGlow: false,
style: TextButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
child: const Text('取消'),
),
),
const SizedBox(width: AppSpacing.sm),
Expanded(
child: NeonButton(
text: '提交',
type: NeonButtonType.primary,
child: FilledButton(
onPressed: () async {
if (formKey.currentState!.validate()) {
Navigator.of(ctx).pop();
@@ -595,8 +601,10 @@ void showWithdrawDialog(BuildContext context, String? balance) {
}
}
},
height: 44,
showGlow: true,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
child: const Text('提交'),
),
),
],
@@ -628,10 +636,13 @@ void showResultDialog(BuildContext context, String title, String? message) {
showDialog(
context: context,
builder: (ctx) => Dialog(
backgroundColor: Colors.transparent,
child: GlassPanel(
borderRadius: BorderRadius.circular(AppRadius.lg),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.xl),
),
backgroundColor: colorScheme.surfaceContainer,
child: Container(
padding: const EdgeInsets.all(AppSpacing.lg),
constraints: const BoxConstraints(maxWidth: 400),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -654,12 +665,12 @@ void showResultDialog(BuildContext context, String title, String? message) {
const SizedBox(height: AppSpacing.lg),
SizedBox(
width: double.infinity,
child: NeonButton(
text: '確定',
type: NeonButtonType.primary,
child: FilledButton(
onPressed: () => Navigator.of(ctx).pop(),
height: 44,
showGlow: false,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
child: const Text('確定'),
),
),
],

View File

@@ -7,6 +7,7 @@ import '../../../core/theme/app_spacing.dart';
import '../../../core/utils/toast_utils.dart';
import '../../../providers/asset_provider.dart';
import '../../components/material_input.dart';
import '../../shared/modern_dialog.dart';
/// 充值页面
class DepositPage extends StatefulWidget {
@@ -88,22 +89,12 @@ class _DepositPageState extends State<DepositPage> {
Future<void> _confirmPay() async {
if (_orderNo == null) return;
final confirmed = await showDialog<bool>(
final confirmed = await ModernDialog.confirm(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('確認已打款'),
content: const Text('確認您已完成向指定地址的轉賬?'),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx, false),
child: const Text('取消'),
),
TextButton(
onPressed: () => Navigator.pop(ctx, true),
child: const Text('確認'),
),
],
),
title: '確認已打款',
description: '確認您已完成向指定地址的轉賬?',
confirmText: '確認',
cancelText: '取消',
);
if (confirmed != true || !mounted) return;

View File

@@ -7,6 +7,7 @@ import '../../../core/theme/app_theme.dart';
import '../../../core/theme/app_theme_extension.dart';
import '../../../providers/auth_provider.dart';
import '../../components/material_input.dart';
import '../../shared/modern_dialog.dart';
import '../main/main_page.dart';
import 'register_page.dart';
@@ -296,18 +297,10 @@ class _LoginPageState extends State<LoginPage> {
}
void _showErrorDialog(String message) {
showDialog(
ModernDialog.info(
context: context,
builder: (context) => AlertDialog(
title: const Text('登錄失敗'),
content: Text(message),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('確定'),
),
],
),
title: '登錄失敗',
description: message,
);
}
}

View File

@@ -11,6 +11,7 @@ import '../../../providers/auth_provider.dart';
import '../../components/glass_panel.dart';
import '../../components/neon_glow.dart';
import '../../components/material_input.dart';
import '../../shared/modern_dialog.dart';
import '../main/main_page.dart';
/// 註冊頁面(兩步註冊:賬號信息 + 身份證上傳)
@@ -590,34 +591,18 @@ class _RegisterPageState extends State<RegisterPage> {
MaterialPageRoute(builder: (_) => const MainPage()),
);
} else {
showDialog(
ModernDialog.info(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('註冊失敗'),
content: Text(response.message ?? '請稍後重試'),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('確定'),
),
],
),
title: '註冊失敗',
description: response.message ?? '請稍後重試',
);
}
} catch (e) {
if (mounted) {
showDialog(
ModernDialog.info(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('註冊失敗'),
content: Text(e.toString()),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('確定'),
),
],
),
title: '註冊失敗',
description: e.toString(),
);
}
} finally {

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import '../kyc_page.dart';
import '../welfare_center_page.dart';
import '../../../shared/modern_dialog.dart';
import 'menu_group_container.dart';
import 'menu_row.dart';
import 'menu_trailing_widgets.dart';
@@ -74,17 +75,10 @@ class MenuGroup1 extends StatelessWidget {
}
void _showKycStatusDialog(BuildContext context) {
showDialog(
ModernDialog.info(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('實名認證'),
content: const Text('您的實名認證已通過'),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('確定'),
),
],
),
title: '實名認證',
description: '您的實名認證已通過',
buttonText: '確定',
);
}

View File

@@ -10,6 +10,7 @@ import '../../../core/theme/app_theme.dart';
import '../../../providers/auth_provider.dart';
import '../../components/glass_panel.dart';
import '../../components/neon_glow.dart';
import '../../shared/modern_dialog.dart';
/// KYC 實名認證頁面
class KycPage extends StatefulWidget {
@@ -431,61 +432,41 @@ class _KycPageState extends State<KycPage> {
if (!mounted) return;
if (response.success) {
showDialog(
ModernDialog.show(
context: context,
builder: (ctx) => AlertDialog(
title: Row(
children: [
NeonIcon(
icon: Icons.check_circle,
color: AppColorScheme.up,
size: 20,
),
SizedBox(width: AppSpacing.sm),
const Text('認證成功'),
],
),
content: const Text('您的實名認證已通過,現在可以進行提現操作'),
actions: [
TextButton(
child: const Text('確定'),
onPressed: () {
Navigator.of(ctx).pop();
Navigator.of(context).pop();
},
titleWidget: Row(
children: [
NeonIcon(
icon: Icons.check_circle,
color: AppColorScheme.up,
size: 20,
),
SizedBox(width: AppSpacing.sm),
const Text('認證成功'),
],
),
description: '您的實名認證已通過,現在可以進行提現操作',
actions: [
ModernDialogAction(
label: '確定',
isPrimary: true,
onPressed: () => Navigator.of(context).pop(),
),
],
);
} else {
showDialog(
ModernDialog.info(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('認證失敗'),
content: Text(response.message ?? '請稍後重試'),
actions: [
TextButton(
child: const Text('確定'),
onPressed: () => Navigator.of(ctx).pop(),
),
],
),
title: '認證失敗',
description: response.message ?? '請稍後重試',
);
}
} catch (e) {
if (mounted) {
showDialog(
ModernDialog.info(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('認證失敗'),
content: Text(e.toString()),
actions: [
TextButton(
child: const Text('確定'),
onPressed: () => Navigator.of(ctx).pop(),
),
],
),
title: '認證失敗',
description: e.toString(),
);
}
} finally {

View File

@@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import '../../../core/theme/app_theme.dart';
import '../../../core/theme/app_spacing.dart';
import '../../../providers/auth_provider.dart';
import '../../shared/modern_dialog.dart';
import '../auth/login_page.dart';
import 'components/avatar_circle.dart';
import 'components/logout_button.dart';
@@ -61,80 +62,60 @@ class _MinePageState extends State<MinePage>
}
void _showComingSoon(String feature) {
showDialog(
ModernDialog.info(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('功能開發中'),
content: Text('$feature功能正在開發中,敬請期待'),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('知道了'),
),
],
),
title: '功能開發中',
description: '$feature功能正在開發中,敬請期待',
);
}
void _showAboutDialog() {
showDialog(
ModernDialog.show(
context: context,
builder: (ctx) => AlertDialog(
title: Row(
children: [
AvatarCircle(radius: 16, fontSize: 12),
const SizedBox(width: 8),
const Text('模擬所'),
],
),
content: const Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('虛擬貨幣模擬交易平臺'),
SizedBox(height: 8),
Text('版本: 1.0.0'),
],
),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('確定'),
),
titleWidget: Row(
children: [
AvatarCircle(radius: 16, fontSize: 12),
const SizedBox(width: 8),
const Text('模擬所'),
],
),
content: const Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('虛擬貨幣模擬交易平臺'),
SizedBox(height: 8),
Text('版本: 1.0.0'),
],
),
actions: [
ModernDialogAction(label: '確定', isPrimary: true),
],
);
}
void _handleLogout(AuthProvider auth) {
final colorScheme = Theme.of(context).colorScheme;
showDialog(
ModernDialog.show(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('退出登錄'),
content: const Text('確定要退出登錄嗎?'),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: Text('取消',
style: TextStyle(color: colorScheme.onSurfaceVariant)),
),
TextButton(
onPressed: () async {
Navigator.of(ctx).pop();
await auth.logout();
if (ctx.mounted) {
Navigator.of(ctx).pushAndRemoveUntil(
MaterialPageRoute(builder: (_) => const LoginPage()),
(route) => false,
);
}
},
child: Text('退出', style: TextStyle(color: colorScheme.error)),
),
],
),
title: '退出登錄',
description: '確定要退出登錄嗎?',
actions: [
ModernDialogAction(label: '取消'),
ModernDialogAction(
label: '退出',
isPrimary: true,
isDestructive: true,
onPressed: () async {
await auth.logout();
if (context.mounted) {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (_) => const LoginPage()),
(route) => false,
);
}
},
),
],
);
}
}

View File

@@ -11,6 +11,7 @@ import '../../../core/utils/toast_utils.dart';
import '../../../core/event/app_event_bus.dart';
import '../../../providers/asset_provider.dart';
import '../../../data/models/order_models.dart';
import '../../shared/modern_dialog.dart';
/// 充提訂單頁面
class FundOrdersPage extends StatefulWidget {
@@ -502,28 +503,19 @@ class _FundOrdersPageState extends State<FundOrdersPage> {
}
}
Future<bool?> showShadConfirmDialog({
Future<bool> showShadConfirmDialog({
required BuildContext context,
required String title,
required String description,
bool destructive = false,
}) {
return showDialog<bool>(
return ModernDialog.confirm(
context: context,
builder: (context) => AlertDialog(
title: Text(title),
content: Text(description),
actions: [
TextButton(
child: const Text('取消'),
onPressed: () => Navigator.pop(context, false),
),
TextButton(
child: Text(destructive ? '確定取消' : '確認'),
onPressed: () => Navigator.pop(context, true),
),
],
),
title: title,
description: description,
confirmText: destructive ? '確定取消' : '確認',
cancelText: '取消',
isDestructive: destructive,
);
}
}

View File

@@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import '../../../../core/theme/app_spacing.dart';
import '../../../../core/theme/app_theme.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../components/glass_panel.dart';
import '../../../components/neon_glow.dart';
/// 交易確認對話框
///
@@ -27,15 +25,19 @@ class ConfirmDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final actionColor = isBuy
? context.appColors.up
: context.appColors.down;
return Dialog(
backgroundColor: Colors.transparent,
child: GlassPanel(
borderRadius: BorderRadius.circular(AppRadius.lg),
padding: EdgeInsets.all(AppSpacing.lg),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppRadius.xl),
),
backgroundColor: theme.colorScheme.surfaceContainer,
child: Container(
padding: const EdgeInsets.all(AppSpacing.lg),
constraints: const BoxConstraints(maxWidth: 400),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -59,22 +61,23 @@ class ConfirmDialog extends StatelessWidget {
Row(
children: [
Expanded(
child: NeonButton(
text: '取消',
type: NeonButtonType.outline,
child: TextButton(
onPressed: () => Navigator.of(context).pop(false),
height: 44,
showGlow: false,
style: TextButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
child: const Text('取消'),
),
),
SizedBox(width: AppSpacing.sm),
Expanded(
child: NeonButton(
text: '確認${isBuy ? '買入' : '賣出'}',
type: isBuy ? NeonButtonType.tertiary : NeonButtonType.error,
child: FilledButton(
onPressed: () => Navigator.of(context).pop(true),
height: 44,
showGlow: true,
style: FilledButton.styleFrom(
backgroundColor: actionColor,
minimumSize: const Size.fromHeight(44),
),
child: Text('確認${isBuy ? '買入' : '賣出'}'),
),
),
],

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:provider/provider.dart';
import '../../../core/theme/app_spacing.dart';
import '../../../core/theme/app_theme_extension.dart';
@@ -9,6 +8,7 @@ import '../../../providers/market_provider.dart';
import '../../../providers/asset_provider.dart';
import '../../../data/services/trade_service.dart';
import '../../components/neon_glow.dart';
import '../../shared/modern_dialog.dart';
import 'components/coin_selector.dart';
import 'components/price_card.dart';
import 'components/placeholder_card.dart';
@@ -283,30 +283,26 @@ class _TradePageState extends State<TradePage>
}
void _showResultDialog(bool success, String title, String message) {
showDialog(
final colorScheme = Theme.of(context).colorScheme;
ModernDialog.show(
context: context,
builder: (ctx) => AlertDialog(
title: Row(
children: [
NeonIcon(
icon: success ? Icons.check_circle : Icons.error,
color: success
? ctx.appColors.up
: Theme.of(ctx).colorScheme.error,
size: 24,
),
SizedBox(width: AppSpacing.sm),
Text(title),
],
),
content: Text(message),
actions: [
TextButton(
child: const Text('確定'),
onPressed: () => Navigator.of(ctx).pop(),
titleWidget: Row(
children: [
NeonIcon(
icon: success ? Icons.check_circle : Icons.error,
color: success
? context.appColors.up
: colorScheme.error,
size: 24,
),
SizedBox(width: AppSpacing.sm),
Text(title),
],
),
description: message,
actions: [
ModernDialogAction(label: '確定', isPrimary: true),
],
);
}
}

View File

@@ -169,8 +169,8 @@ class ModernDialog extends StatelessWidget {
final theme = Theme.of(context);
if (action.isPrimary) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
return FilledButton(
style: FilledButton.styleFrom(
backgroundColor: action.isDestructive ? theme.colorScheme.error : theme.colorScheme.primary,
),
onPressed: () {
@@ -181,7 +181,7 @@ class ModernDialog extends StatelessWidget {
);
}
return OutlinedButton(
return TextButton(
onPressed: () {
Navigator.of(context).pop(action.returnValue);
action.onPressed?.call();