@liujitcn/kratos-uni-app-core 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,7 +38,7 @@ packages/core
38
38
  - 页面装配插件在编译配置中移除宿主的原生 `tabBar`,退出后恢复宿主原文件。导航按模块注册的 `viewKey` 解析物理页面,支持业务模块覆盖首页和扩展 tab;引用项目升级 core 包后即可使用相同策略。
39
39
  - 按匿名态、登录态缓存导航,并在远端不可用时回退到最近缓存或默认菜单。
40
40
  - 统一认证、token、MFA、HTTP、上传、配置、Pinia 和基础页面能力。
41
- - 提供可复用的 `KratosSettingsPage`,统一语言、MFA、微信设置和退出登录,并允许产品在最上方追加业务设置。
41
+ - 提供可复用的 `KratosSettingsPage`,统一账户安全、语言、主题外观、MFA、微信设置和退出登录,并允许产品在最上方或账户安全分组追加业务设置。
42
42
  - 公开通用密码弹窗、MFA 绑定面板与恢复码弹窗,供登录页和业务模块复用同一套绑定界面。
43
43
  - 登录阶段支持 TOTP、WebAuthn 和一次性恢复码校验;WebAuthn 编解码封装在 `src/utils/webauthn.ts`。
44
44
  - 构建时扫描模块 `src/views/**/*.vue`,逐文件合并模块 static,生成宿主页并在退出时按事务精确恢复。
@@ -100,7 +100,7 @@ const combinedAction: KratosNavBarAction = { icon: 'history', label: '历史', d
100
100
 
101
101
  ## 公共设置页
102
102
 
103
- 产品设置页通过公开子路径引用 `KratosSettingsPage`。`extensions` 是唯一业务扩展插槽,固定直接渲染在页面视口最上方;没有传入内容时不会生成容器或额外间距。
103
+ 产品设置页通过公开子路径引用 `KratosSettingsPage`。`extensions` 用于页面最上方扩展,`security` 用于账户安全分组内扩展;没有传入内容时不会生成容器或额外间距。
104
104
 
105
105
  ```vue
106
106
  <script setup lang="ts">
@@ -116,7 +116,7 @@ import KratosSettingsPage from '@liujitcn/kratos-uni-app-core/components/KratosS
116
116
  </template>
117
117
  ```
118
118
 
119
- 扩展内容由产品模块自行组织完整卡片。页面顺序固定为业务扩展、MFA 与语言、微信设置、退出登录;产品模块可以注册自己的物理页面,并通过后注册的 `SETTINGS` viewKey 覆盖 system 默认包装页。
119
+ 扩展内容由产品模块自行组织完整卡片。页面顺序固定为业务扩展、账户安全、外观(主题与语言)、微信设置、退出登录;产品模块可以注册自己的物理页面,并通过后注册的 `SETTINGS` viewKey 覆盖 system 默认包装页。
120
120
 
121
121
  构建与验证命令见 [workspace 文档](../../README.md)。
122
122
 
package/dist/module.mjs CHANGED
@@ -142,7 +142,7 @@ var zh_CN_default = {
142
142
  "core.settings.feedback": "\u95EE\u9898\u53CD\u9988",
143
143
  "core.settings.section_appearance": "\u5916\u89C2",
144
144
  "core.settings.section_security": "\u8D26\u6237\u5B89\u5168",
145
- "core.settings.section_more": "\u66F4\u591A \xB7 \u5C0F\u7A0B\u5E8F\u7AEF",
145
+ "core.settings.section_more": "\u66F4\u591A\u670D\u52A1",
146
146
  "core.settings.logout_confirm": "\u662F\u5426\u9000\u51FA\u767B\u5F55\uFF1F",
147
147
  "core.settings.logout_failed": "\u9000\u51FA\u767B\u5F55\u5931\u8D25",
148
148
  "core.settings.mfa_bind_success": "\u591A\u56E0\u7D20\u8BA4\u8BC1\u7ED1\u5B9A\u6210\u529F",
@@ -290,7 +290,7 @@ var en_US_default = {
290
290
  "core.settings.feedback": "Feedback",
291
291
  "core.settings.section_appearance": "Appearance",
292
292
  "core.settings.section_security": "Account security",
293
- "core.settings.section_more": "More \xB7 Mini Program",
293
+ "core.settings.section_more": "More Services",
294
294
  "core.settings.logout_confirm": "Log out now?",
295
295
  "core.settings.logout_failed": "Logout failed",
296
296
  "core.settings.mfa_bind_success": "Multi-factor authentication enabled",
@@ -438,7 +438,7 @@ var ja_JP_default = {
438
438
  "core.settings.feedback": "\u554F\u984C\u306E\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF",
439
439
  "core.settings.section_appearance": "\u5916\u89B3",
440
440
  "core.settings.section_security": "\u30A2\u30AB\u30A6\u30F3\u30C8\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3",
441
- "core.settings.section_more": "\u305D\u306E\u4ED6\u30FB\u30DF\u30CB\u30D7\u30ED\u30B0\u30E9\u30E0",
441
+ "core.settings.section_more": "\u305D\u306E\u4ED6\u306E\u30B5\u30FC\u30D3\u30B9",
442
442
  "core.settings.logout_confirm": "\u30ED\u30B0\u30A2\u30A6\u30C8\u3057\u307E\u3059\u304B?",
443
443
  "core.settings.logout_failed": "\u30ED\u30B0\u30A2\u30A6\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
444
444
  "core.settings.mfa_bind_success": "\u591A\u8981\u7D20\u8A8D\u8A3C\u3092\u6709\u52B9\u306B\u3057\u307E\u3057\u305F",
@@ -586,7 +586,7 @@ var zh_TW_default = {
586
586
  "core.settings.feedback": "\u554F\u984C\u53CD\u994B",
587
587
  "core.settings.section_appearance": "\u5916\u89C0",
588
588
  "core.settings.section_security": "\u5E33\u6236\u5B89\u5168",
589
- "core.settings.section_more": "\u66F4\u591A\u30FB\u5C0F\u7A0B\u5F0F\u7AEF",
589
+ "core.settings.section_more": "\u66F4\u591A\u670D\u52D9",
590
590
  "core.settings.logout_confirm": "\u662F\u5426\u9000\u51FA\u767B\u5165\uFF1F",
591
591
  "core.settings.logout_failed": "\u9000\u51FA\u767B\u5165\u5931\u6557",
592
592
  "core.settings.mfa_bind_success": "\u591A\u56E0\u7D20\u8A8D\u8B49\u7D81\u5B9A\u6210\u529F",
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "type": "git",
8
8
  "url": "git@github.com:liujitcn/kratos-admin.git"
9
9
  },
10
- "version": "0.1.1",
10
+ "version": "0.1.4",
11
11
  "type": "module",
12
12
  "files": [
13
13
  "dist",
@@ -0,0 +1,38 @@
1
+ import { http } from '../../../utils/http'
2
+ import type {
3
+ AccountService,
4
+ CurrentPasswordPolicy,
5
+ GetCurrentPasswordPolicyRequest,
6
+ UpdateUserPasswordRequest,
7
+ } from '../../../rpc/base/v1/account'
8
+ import type { Empty } from '../../../rpc/google/protobuf/empty'
9
+
10
+ const ACCOUNT_URL = '/v1/base/account'
11
+
12
+ /** 账户安全公共服务。 */
13
+ export class AccountServiceImpl implements AccountService {
14
+ /** 获取当前用户生效的密码策略。 */
15
+ GetCurrentPasswordPolicy(
16
+ request: GetCurrentPasswordPolicyRequest,
17
+ ): Promise<CurrentPasswordPolicy> {
18
+ return http<CurrentPasswordPolicy>({
19
+ url: `${ACCOUNT_URL}/password-policy`,
20
+ method: 'GET',
21
+ authMode: 'required',
22
+ data: request,
23
+ })
24
+ }
25
+
26
+ /** 修改当前用户密码。 */
27
+ UpdateUserPassword(request: UpdateUserPasswordRequest): Promise<Empty> {
28
+ return http<Empty>({
29
+ url: `${ACCOUNT_URL}/password`,
30
+ method: 'PUT',
31
+ authMode: 'required',
32
+ data: request.user_password,
33
+ })
34
+ }
35
+ }
36
+
37
+ /** 当前用户账户安全公共服务实例。 */
38
+ export const defAccountService = new AccountServiceImpl()
@@ -13,6 +13,8 @@ defineOptions({ name: 'KratosSettingsPage' })
13
13
  defineSlots<{
14
14
  /** 在所有公共设置卡片之前渲染的业务扩展内容。 */
15
15
  extensions?: () => unknown
16
+ /** 在账户安全分组中 MFA 卡片之后渲染的业务扩展内容。 */
17
+ security?: () => unknown
16
18
  }>()
17
19
 
18
20
  const userStore = useUserStore()
@@ -202,21 +204,6 @@ const onLogout = () => {
202
204
  <slot name="extensions" />
203
205
  <KratosNavBar :title="t('core.settings.title')" />
204
206
  <view class="settings-content">
205
- <view class="k-set-cat">{{ t('core.settings.section_appearance') }}</view>
206
- <picker :range="themeModeLabels" :value="themeModeIndex" @change="onThemeModeChange">
207
- <view class="k-set-row k-set-row--arrow">
208
- <view class="k-set-row__lead">
209
- <view class="k-set-row__icon">
210
- <image class="settings-row__icon" :src="settingsIcons.theme" mode="aspectFit" />
211
- </view>
212
- <text class="k-set-row__title">{{ t('core.settings.theme') }}</text>
213
- </view>
214
- <text class="k-set-row__value settings-row__value">{{
215
- themeModeLabels[themeModeIndex]
216
- }}</text>
217
- </view>
218
- </picker>
219
-
220
207
  <view class="k-set-cat">{{ t('core.settings.section_security') }}</view>
221
208
  <view v-if="userStore.isAuthenticated()" class="k-set-row k-set-row--arrow" @tap="onMfaTap">
222
209
  <view class="k-set-row__lead">
@@ -231,6 +218,22 @@ const onLogout = () => {
231
218
  >{{ mfaStatusText }}</text
232
219
  >
233
220
  </view>
221
+ <slot name="security" />
222
+
223
+ <view class="k-set-cat">{{ t('core.settings.section_appearance') }}</view>
224
+ <picker :range="themeModeLabels" :value="themeModeIndex" @change="onThemeModeChange">
225
+ <view class="k-set-row k-set-row--arrow">
226
+ <view class="k-set-row__lead">
227
+ <view class="k-set-row__icon">
228
+ <image class="settings-row__icon" :src="settingsIcons.theme" mode="aspectFit" />
229
+ </view>
230
+ <text class="k-set-row__title">{{ t('core.settings.theme') }}</text>
231
+ </view>
232
+ <text class="k-set-row__value settings-row__value">{{
233
+ themeModeLabels[themeModeIndex]
234
+ }}</text>
235
+ </view>
236
+ </picker>
234
237
  <picker :range="localeLabels" :value="localeIndex" @change="onLocaleChange">
235
238
  <view class="k-set-row k-set-row--arrow">
236
239
  <view class="k-set-row__lead">
@@ -301,7 +304,7 @@ const onLogout = () => {
301
304
  .settings-page {
302
305
  min-height: 100vh;
303
306
  box-sizing: border-box;
304
- padding: 0 32rpx calc(40rpx + env(safe-area-inset-bottom));
307
+ padding: 0 20rpx var(--kratos-tab-bar-space, calc(104rpx + env(safe-area-inset-bottom)));
305
308
  background: var(--kratos-bg-gradient);
306
309
  }
307
310
  .settings-content {
@@ -89,18 +89,17 @@ const messageBadge = useAppMenuBadge('MESSAGE_INBOX')
89
89
  --kratos-tab-bar-active-color: var(--kratos-color-primary, #28f0d4);
90
90
 
91
91
  position: fixed;
92
- right: 20rpx;
93
- bottom: env(safe-area-inset-bottom);
94
- left: 20rpx;
92
+ right: 0;
93
+ bottom: 0;
94
+ left: 0;
95
95
  z-index: 999;
96
96
  display: flex;
97
97
  box-sizing: border-box;
98
- height: 104rpx;
98
+ height: var(--kratos-tab-bar-space, calc(104rpx + env(safe-area-inset-bottom)));
99
99
  padding: 0 8rpx;
100
- border: 1rpx solid var(--kratos-color-border-accent, rgba(120, 230, 215, 0.16));
101
- border-radius: 30rpx;
102
- background: var(--kratos-dock-bg, rgba(10, 18, 30, 0.72));
103
- box-shadow: 0 12rpx 32rpx rgba(0, 0, 0, 0.2);
100
+ border-top: 1rpx solid var(--kratos-color-border-accent, rgba(120, 230, 215, 0.16));
101
+ background: var(--kratos-color-surface-solid, #070d18);
102
+ box-shadow: 0 -8rpx 24rpx rgba(0, 0, 0, 0.12);
104
103
  }
105
104
  .kratos-tab-bar__item {
106
105
  position: relative;
@@ -109,7 +108,7 @@ const messageBadge = useAppMenuBadge('MESSAGE_INBOX')
109
108
  align-items: center;
110
109
  justify-content: center;
111
110
  flex-direction: column;
112
- height: 100%;
111
+ height: 104rpx;
113
112
  padding: 10rpx 0 8rpx;
114
113
  box-sizing: border-box;
115
114
  color: var(--kratos-tab-bar-color);
@@ -153,7 +152,7 @@ const messageBadge = useAppMenuBadge('MESSAGE_INBOX')
153
152
  height: 10rpx;
154
153
  border-right: 2rpx solid var(--kratos-tab-bar-color);
155
154
  border-bottom: 2rpx solid var(--kratos-tab-bar-color);
156
- background: var(--kratos-dock-bg, rgba(10, 18, 30, 0.72));
155
+ background: var(--kratos-color-surface-solid, #070d18);
157
156
  content: '';
158
157
  transform: rotate(45deg);
159
158
  }
@@ -186,7 +185,7 @@ const messageBadge = useAppMenuBadge('MESSAGE_INBOX')
186
185
  width: 16rpx;
187
186
  height: 16rpx;
188
187
  box-sizing: border-box;
189
- border: 2rpx solid var(--kratos-dock-bg, rgba(10, 18, 30, 0.72));
188
+ border: 2rpx solid var(--kratos-color-surface-solid, #070d18);
190
189
  border-radius: 50%;
191
190
  background: var(--kratos-color-danger, #ff4d6d);
192
191
  box-shadow: 0 0 12rpx var(--kratos-color-danger, #ff4d6d);
@@ -115,7 +115,7 @@
115
115
  "core.settings.feedback": "Feedback",
116
116
  "core.settings.section_appearance": "Appearance",
117
117
  "core.settings.section_security": "Account security",
118
- "core.settings.section_more": "More · Mini Program",
118
+ "core.settings.section_more": "More Services",
119
119
  "core.settings.logout_confirm": "Log out now?",
120
120
  "core.settings.logout_failed": "Logout failed",
121
121
  "core.settings.mfa_bind_success": "Multi-factor authentication enabled",
@@ -115,7 +115,7 @@
115
115
  "core.settings.feedback": "問題のフィードバック",
116
116
  "core.settings.section_appearance": "外観",
117
117
  "core.settings.section_security": "アカウントセキュリティ",
118
- "core.settings.section_more": "その他・ミニプログラム",
118
+ "core.settings.section_more": "その他のサービス",
119
119
  "core.settings.logout_confirm": "ログアウトしますか?",
120
120
  "core.settings.logout_failed": "ログアウトに失敗しました",
121
121
  "core.settings.mfa_bind_success": "多要素認証を有効にしました",
@@ -115,7 +115,7 @@
115
115
  "core.settings.feedback": "问题反馈",
116
116
  "core.settings.section_appearance": "外观",
117
117
  "core.settings.section_security": "账户安全",
118
- "core.settings.section_more": "更多 · 小程序端",
118
+ "core.settings.section_more": "更多服务",
119
119
  "core.settings.logout_confirm": "是否退出登录?",
120
120
  "core.settings.logout_failed": "退出登录失败",
121
121
  "core.settings.mfa_bind_success": "多因素认证绑定成功",
@@ -115,7 +115,7 @@
115
115
  "core.settings.feedback": "問題反饋",
116
116
  "core.settings.section_appearance": "外觀",
117
117
  "core.settings.section_security": "帳戶安全",
118
- "core.settings.section_more": "更多・小程式端",
118
+ "core.settings.section_more": "更多服務",
119
119
  "core.settings.logout_confirm": "是否退出登入?",
120
120
  "core.settings.logout_failed": "退出登入失敗",
121
121
  "core.settings.mfa_bind_success": "多因素認證綁定成功",
package/src/navigation.ts CHANGED
@@ -125,6 +125,16 @@ const createDefaultMenus = (): AppMenu[] => [
125
125
  access: 'AUTHENTICATED',
126
126
  inTabBar: false,
127
127
  },
128
+ {
129
+ id: 99090400,
130
+ parentId: 99090000,
131
+ name: 'AppPassword',
132
+ path: 'app/password',
133
+ viewKey: 'PASSWORD',
134
+ title: t('system.settings.password_title'),
135
+ access: 'AUTHENTICATED',
136
+ inTabBar: false,
137
+ },
128
138
  {
129
139
  id: 99090200,
130
140
  parentId: 99090000,
@@ -175,6 +185,7 @@ const pageTitleKeys: Record<string, string> = {
175
185
  'pagesMember/message/detail': 'system.notification.title',
176
186
  'pagesMember/message/index': 'system.notification.title',
177
187
  'pagesMember/profile/profile': 'system.profile.title',
188
+ 'pagesMember/password/password': 'system.settings.password_title',
178
189
  'pagesMember/settings/settings': 'core.settings.title',
179
190
  }
180
191
 
@@ -182,6 +193,7 @@ const fallbackMenuTitleKeys: Record<string, string> = {
182
193
  HOME: 'core.navigation.home',
183
194
  MESSAGE_INBOX: 'core.navigation.message',
184
195
  PROFILE_HOME: 'core.navigation.my',
196
+ PASSWORD: 'system.settings.password_title',
185
197
  }
186
198
 
187
199
  /** 替换导航远端适配器,供宿主接入自定义契约。 */
@@ -0,0 +1,49 @@
1
+ // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
2
+ // versions:
3
+ // protoc-gen-ts_proto v2.12.1
4
+ // protoc unknown
5
+ // source: base/v1/account.proto
6
+
7
+ /* eslint-disable */
8
+ import type { SecretCrypto } from "../../common/v1/types";
9
+ import type { Empty } from "../../google/protobuf/empty";
10
+
11
+ /** 获取当前用户密码策略请求参数。 */
12
+ export interface GetCurrentPasswordPolicyRequest {
13
+ }
14
+
15
+ /** 当前用户生效的密码策略。 */
16
+ export interface CurrentPasswordPolicy {
17
+ /** 密码最小长度 */
18
+ min_length: number;
19
+ /** 密码至少满足的字符类别数量 */
20
+ min_complexity_classes: number;
21
+ /** 禁止重复使用的历史密码数量 */
22
+ history_count: number;
23
+ /** 密码有效期天数 */
24
+ max_age_days: number;
25
+ }
26
+
27
+ /** 更新当前用户密码请求参数。 */
28
+ export interface UpdateUserPasswordRequest {
29
+ /** 当前用户密码 */
30
+ user_password: UserPasswordForm | undefined;
31
+ }
32
+
33
+ /** 当前用户密码表单。 */
34
+ export interface UserPasswordForm {
35
+ /** 原密码 */
36
+ old_pwd:
37
+ | SecretCrypto
38
+ | undefined;
39
+ /** 新密码 */
40
+ new_pwd: SecretCrypto | undefined;
41
+ }
42
+
43
+ /** Base 账户安全服务。 */
44
+ export interface AccountService {
45
+ /** 获取当前用户生效的密码策略。 */
46
+ GetCurrentPasswordPolicy(request: GetCurrentPasswordPolicyRequest): Promise<CurrentPasswordPolicy>;
47
+ /** 修改当前用户密码。 */
48
+ UpdateUserPassword(request: UpdateUserPasswordRequest): Promise<Empty>;
49
+ }
@@ -1,6 +1,18 @@
1
1
  @use './theme.scss';
2
2
  @use './components.scss';
3
3
 
4
+ html,
5
+ body,
6
+ #app,
7
+ uni-app,
8
+ uni-page,
9
+ uni-page-wrapper,
10
+ uni-page-body,
11
+ page {
12
+ min-height: 100%;
13
+ background-color: var(--kratos-color-background, #eef3f8);
14
+ }
15
+
4
16
  page,
5
17
  body,
6
18
  uni-page-body {
@@ -64,6 +76,49 @@ html.theme-dark page {
64
76
  background-color: #060a12;
65
77
  }
66
78
 
79
+ html .uni-modal {
80
+ background-color: var(--kratos-color-surface-solid, #ffffff);
81
+ color: var(--kratos-color-text, #102232);
82
+ font-family: var(--kratos-font-sans, sans-serif);
83
+ }
84
+
85
+ html .uni-modal__hd {
86
+ padding: 16px 24px 8px;
87
+ }
88
+
89
+ html .uni-modal__title {
90
+ color: var(--kratos-color-text, #102232);
91
+ font-size: 18px;
92
+ line-height: 25px;
93
+ }
94
+
95
+ html .uni-modal__bd {
96
+ min-height: 40px;
97
+ padding: 8px 24px 16px;
98
+ color: var(--kratos-color-text-muted, #5a7083);
99
+ font-size: 15px;
100
+ line-height: 21px;
101
+ }
102
+
103
+ html .uni-modal__ft {
104
+ font-size: 18px;
105
+ line-height: 48px;
106
+ }
107
+
108
+ html .uni-modal__ft::after,
109
+ html .uni-modal__btn::after {
110
+ border-color: var(--kratos-color-border, #e3eaf2);
111
+ color: var(--kratos-color-border, #e3eaf2);
112
+ }
113
+
114
+ html .uni-modal__btn_primary {
115
+ color: var(--kratos-color-primary, #039e8c) !important;
116
+ }
117
+
118
+ html .uni-modal__btn_default {
119
+ color: var(--kratos-color-text-muted, #5a7083) !important;
120
+ }
121
+
67
122
  html.theme-dark .uni-modal {
68
123
  background-color: #070d18;
69
124
  }
@@ -529,11 +529,10 @@
529
529
  * ============================================================ */
530
530
  .k-set-cat {
531
531
  margin: 32rpx 4rpx 20rpx;
532
- font-size: 21rpx;
533
- letter-spacing: 2rpx;
534
- color: var(--kratos-color-text-dim);
535
- font-family: var(--kratos-font-mono);
536
- text-transform: uppercase;
532
+ color: var(--kratos-color-text-muted);
533
+ font-size: 26rpx;
534
+ font-family: var(--kratos-font-sans);
535
+ font-weight: 700;
537
536
  }
538
537
  .k-set-row {
539
538
  display: flex;
@@ -29,6 +29,7 @@
29
29
  --kratos-color-track: rgba(255, 255, 255, 0.06);
30
30
  --kratos-color-mask: rgba(2, 6, 12, 0.55);
31
31
  --kratos-dock-bg: rgba(10, 18, 30, 0.72);
32
+ --kratos-tab-bar-space: calc(104rpx + env(safe-area-inset-bottom));
32
33
  --kratos-glow: 0 0 24px rgba(40, 240, 212, 0.35);
33
34
  --kratos-glow-soft: 0 0 40px rgba(40, 240, 212, 0.06);
34
35
  --kratos-font-sans:
@@ -63,6 +64,7 @@
63
64
  --kratos-color-track: #e8eef5;
64
65
  --kratos-color-mask: rgba(16, 34, 50, 0.45);
65
66
  --kratos-dock-bg: rgba(255, 255, 255, 0.82);
67
+ --kratos-tab-bar-space: calc(104rpx + env(safe-area-inset-bottom));
66
68
  --kratos-glow: 0 10px 26px rgba(0, 120, 110, 0.14);
67
69
  --kratos-glow-soft: none;
68
70
  --kratos-font-sans:
@@ -1167,7 +1167,7 @@ onUnload(() => {
1167
1167
  flex-direction: column;
1168
1168
  justify-content: center;
1169
1169
  min-height: 100vh;
1170
- padding: 48rpx 40rpx calc(56rpx + env(safe-area-inset-bottom));
1170
+ padding: 48rpx 20rpx calc(56rpx + env(safe-area-inset-bottom));
1171
1171
  background: var(--kratos-bg-gradient);
1172
1172
  box-sizing: border-box;
1173
1173
  }
@@ -1183,7 +1183,7 @@ onUnload(() => {
1183
1183
  align-items: center;
1184
1184
  justify-content: space-between;
1185
1185
  height: 44px;
1186
- padding: env(safe-area-inset-top) 28rpx 0;
1186
+ padding: env(safe-area-inset-top) 20rpx 0;
1187
1187
  box-sizing: content-box;
1188
1188
  }
1189
1189