@liujitcn/kratos-uni-app-core 0.1.1 → 0.1.2
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 +3 -3
- package/dist/module.mjs +4 -4
- package/package.json +1 -1
- package/src/api/base/v1/account.ts +38 -0
- package/src/components/KratosSettingsPage.vue +19 -16
- package/src/locales/en-US.json +1 -1
- package/src/locales/ja-JP.json +1 -1
- package/src/locales/zh-CN.json +1 -1
- package/src/locales/zh-TW.json +1 -1
- package/src/navigation.ts +12 -0
- package/src/rpc/base/v1/account.ts +49 -0
- package/src/styles/base.scss +55 -0
- package/src/styles/components.scss +4 -5
- package/src/views/pages/login/login.vue +2 -2
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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\
|
|
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\
|
|
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
|
@@ -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
|
|
307
|
+
padding: 0 20rpx calc(40rpx + env(safe-area-inset-bottom));
|
|
305
308
|
background: var(--kratos-bg-gradient);
|
|
306
309
|
}
|
|
307
310
|
.settings-content {
|
package/src/locales/en-US.json
CHANGED
|
@@ -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
|
|
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",
|
package/src/locales/ja-JP.json
CHANGED
|
@@ -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/locales/zh-CN.json
CHANGED
|
@@ -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/locales/zh-TW.json
CHANGED
|
@@ -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
|
+
}
|
package/src/styles/base.scss
CHANGED
|
@@ -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
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
font-
|
|
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;
|
|
@@ -1167,7 +1167,7 @@ onUnload(() => {
|
|
|
1167
1167
|
flex-direction: column;
|
|
1168
1168
|
justify-content: center;
|
|
1169
1169
|
min-height: 100vh;
|
|
1170
|
-
padding: 48rpx
|
|
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)
|
|
1186
|
+
padding: env(safe-area-inset-top) 20rpx 0;
|
|
1187
1187
|
box-sizing: content-box;
|
|
1188
1188
|
}
|
|
1189
1189
|
|