@liujitcn/kratos-taro-app-system 0.0.78 → 0.0.80

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.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/build.mjs +2 -2
  3. package/dist/module.mjs +54 -6
  4. package/package.json +3 -3
  5. package/src/api/base/v1/ai_knowledge.ts +25 -0
  6. package/src/locales/en-US.json +13 -1
  7. package/src/locales/ja-JP.json +13 -1
  8. package/src/locales/zh-CN.json +13 -1
  9. package/src/locales/zh-TW.json +13 -1
  10. package/src/pages.ts +2 -2
  11. package/src/rpc/base/v1/ai_knowledge.ts +33 -0
  12. package/src/rpc/base/v1/ai_message.ts +1 -1
  13. package/src/rpc/base/v1/ai_provider.ts +1 -1
  14. package/src/rpc/base/v1/ai_search.ts +1 -1
  15. package/src/rpc/base/v1/ai_session.ts +1 -1
  16. package/src/rpc/base/v1/ai_tool.ts +1 -1
  17. package/src/rpc/base/v1/notification.ts +1 -1
  18. package/src/rpc/google/protobuf/empty.ts +1 -1
  19. package/src/rpc/google/protobuf/timestamp.ts +1 -1
  20. package/src/views/pages/my/my.scss +28 -109
  21. package/src/views/pages/my/my.tsx +62 -49
  22. package/src/views/pagesMember/ai/components/Composer.tsx +52 -3
  23. package/src/views/pagesMember/ai/components/KnowledgePicker.tsx +58 -0
  24. package/src/views/pagesMember/ai/components/SessionDrawer.tsx +8 -5
  25. package/src/views/pagesMember/ai/components/WelcomePanel.tsx +7 -4
  26. package/src/views/pagesMember/ai/components/composer.scss +28 -23
  27. package/src/views/pagesMember/ai/components/knowledge-picker.scss +139 -0
  28. package/src/views/pagesMember/ai/components/model-picker.scss +24 -18
  29. package/src/views/pagesMember/ai/components/session-drawer.scss +44 -22
  30. package/src/views/pagesMember/ai/components/welcome-panel.scss +28 -17
  31. package/src/views/pagesMember/ai/index.scss +35 -72
  32. package/src/views/pagesMember/ai/index.tsx +47 -14
  33. package/src/views/pagesMember/message/detail.tsx +43 -25
  34. package/src/views/pagesMember/message/index.tsx +107 -98
  35. package/src/views/pagesMember/message/message.scss +78 -179
  36. package/src/views/pagesMember/profile/profile.scss +43 -99
  37. package/src/views/pagesMember/profile/profile.tsx +68 -48
  38. package/src/views/pagesMember/settings/components/PasswordVerifyDialog.scss +14 -13
  39. package/src/views/pagesMember/settings/settings.scss +27 -68
  40. package/src/views/pagesMember/settings/settings.tsx +161 -36
@@ -1,135 +1,79 @@
1
1
  .profile-viewport {
2
- display: flex;
3
- flex-direction: column;
4
2
  min-height: 100vh;
5
- background-color: #f4f4f4;
6
- background-size: auto 420px;
7
- background-repeat: no-repeat;
3
+ background: var(--kratos-bg-gradient);
4
+ color: var(--kratos-color-text);
8
5
  }
9
6
 
10
- .profile-navbar {
11
- position: relative;
7
+ /* k-page-nav 自带安全区顶部内边距,这里只补水平与底部 */
8
+ .profile-content {
9
+ padding: 0 32px calc(40px + env(safe-area-inset-bottom));
12
10
  }
13
11
 
14
- .profile-navbar__title {
15
- display: flex;
16
- height: 40PX;
17
- align-items: center;
18
- justify-content: center;
19
- color: #fff;
20
- font-size: 16PX;
21
- font-weight: 500;
12
+ /* 头像卡 */
13
+ .profile-id {
14
+ margin-top: 8px;
15
+ padding: 36px 30px;
22
16
  }
23
17
 
24
- .profile-back {
25
- position: absolute;
26
- left: 0;
27
- bottom: 0;
18
+ .profile-id__main {
28
19
  display: flex;
29
- width: 40PX;
30
- height: 40PX;
31
20
  align-items: center;
32
- justify-content: center;
33
- color: #fff;
34
- font-size: 30PX;
21
+ gap: 24px;
22
+ min-width: 0;
35
23
  }
36
24
 
37
- .profile-avatar {
38
- display: flex;
39
- width: 100%;
40
- height: 260px;
41
- align-items: center;
42
- justify-content: center;
43
- text-align: center;
25
+ .profile-id__meta {
26
+ min-width: 0;
44
27
  }
45
28
 
46
- .profile-avatar__image {
47
- width: 160px;
48
- height: 160px;
49
- border-radius: 50%;
50
- background-color: #eee;
51
- }
52
-
53
- .profile-avatar__text {
54
- display: block;
55
- padding-top: 20px;
56
- color: #fff;
57
- font-size: 26px;
58
- line-height: 1;
29
+ .profile-av-img {
30
+ width: 100%;
31
+ height: 100%;
32
+ border-radius: 22px;
59
33
  }
60
34
 
35
+ /* 表单卡 */
61
36
  .profile-form {
62
- background-color: #f4f4f4;
37
+ margin-top: 24px;
38
+ padding: 10px 28px 28px;
63
39
  }
64
40
 
65
- .profile-form__content {
66
- padding: 0 20px;
67
- margin: 20px 20px 0;
68
- border-radius: 10px;
69
- background-color: #fff;
70
- }
71
-
72
- .profile-form__item {
73
- display: flex;
74
- height: 96px;
75
- padding: 25px 10px;
76
- border-bottom: 1px solid #ddd;
77
- background-color: #fff;
78
- color: #333;
79
- font-size: 28px;
80
- line-height: 46px;
81
-
82
- &:last-child {
83
- border: 0;
84
- }
85
- }
86
-
87
- .profile-label {
88
- width: 180px;
89
- color: #333;
90
- }
91
-
92
- .profile-account {
93
- color: #666;
94
- }
95
-
96
- .profile-placeholder {
97
- color: #808080;
41
+ /* 子项字段包在 Picker 中会命中 :first-child,恢复分隔线 */
42
+ .profile-field--sub {
43
+ border-top: 1PX solid var(--kratos-color-border);
98
44
  }
99
45
 
100
46
  .profile-input {
101
- display: block;
102
47
  flex: 1;
103
- height: 46px;
48
+ min-height: 46px;
104
49
  }
105
50
 
106
- .profile-radio {
107
- margin-right: 20px;
51
+ .profile-radios {
52
+ display: flex;
53
+ flex-wrap: wrap;
54
+ justify-content: flex-end;
55
+ gap: 24px;
108
56
  }
109
57
 
110
- .profile-form__button {
111
- height: 80px;
112
- margin: 30px 20px;
113
- border-radius: 80px;
114
- color: #fff;
115
- font-size: 30px;
116
- line-height: 80px;
117
- text-align: center;
118
- background-color: #27ba9b;
58
+ .profile-radio {
59
+ display: flex;
60
+ align-items: center;
61
+ color: var(--kratos-color-text);
62
+ font-size: 25px;
119
63
  }
120
64
 
121
65
  .profile-auth-button {
122
66
  height: 60px;
123
- padding: 0 20px;
124
67
  margin: 0;
125
- border: 1px solid #27ba9b;
126
- border-radius: 30px;
127
- color: #27ba9b;
128
- font-size: 26px;
129
- line-height: 60px;
130
- background: none;
68
+ padding: 0 24px;
69
+ border: 1PX solid var(--kratos-color-border-accent);
70
+ border-radius: 999px;
71
+ background: var(--kratos-color-primary-soft);
72
+ color: var(--kratos-color-primary);
73
+ font-size: 24px;
74
+ line-height: 58px;
131
75
 
132
76
  &::after {
133
- border: 0;
77
+ border: none;
134
78
  }
135
79
  }
@@ -12,7 +12,6 @@ import {
12
12
  import Taro, { useLoad } from '@tarojs/taro'
13
13
  import { useEffect, useRef, useState } from 'react'
14
14
  import defaultAvatar from '@liujitcn/kratos-taro-app-core/static/images/avatar.png'
15
- import navigatorBackground from '@liujitcn/kratos-taro-app-core/static/images/navigator_bg.png'
16
15
  import { defAuthService } from '@liujitcn/kratos-taro-app-core/api/system/app/v1/auth'
17
16
  import { defBaseDictService } from '@liujitcn/kratos-taro-app-core/api/system/app/v1/base_dict'
18
17
  import type { BaseDictForm_DictItem } from '@liujitcn/kratos-taro-app-core/rpc/system/app/v1/base_dict'
@@ -23,6 +22,7 @@ import {
23
22
  navigateToLogin,
24
23
  uploadFile,
25
24
  useI18n,
25
+ useThemeStore,
26
26
  useUserStore,
27
27
  } from '@liujitcn/kratos-taro-app-core'
28
28
  import './profile.scss'
@@ -33,7 +33,8 @@ const ID_CODE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9-]{0,63}$/
33
33
 
34
34
  /** 用户个人资料编辑页。 */
35
35
  export default function ProfilePage() {
36
- const { locale, t } = useI18n()
36
+ const { t } = useI18n()
37
+ const themeStore = useThemeStore()
37
38
  const [userInfo, setUserInfo] = useState<UserProfileForm>({
38
39
  user_name: '',
39
40
  nick_name: '',
@@ -48,7 +49,6 @@ export default function ProfilePage() {
48
49
  const submittingRef = useRef(false)
49
50
  const navigateBackTimerRef = useRef<ReturnType<typeof setTimeout>>()
50
51
  const ensureAuthenticated = useUserStore((state) => state.ensureAuthenticated)
51
- const safeTop = Taro.getWindowInfo().safeArea?.top || 0
52
52
  const idTypeOptions = [
53
53
  { label: t('system.profile.id_type.unspecified'), value: BaseUserIDType.BASE_USER_ID_TYPE_UNSPECIFIED },
54
54
  { label: t('system.profile.id_type.id_card'), value: BaseUserIDType.BASE_USER_ID_TYPE_ID_CARD },
@@ -63,10 +63,6 @@ export default function ProfilePage() {
63
63
  ]
64
64
  const idTypeIndex = Math.max(0, idTypeOptions.findIndex((item) => item.value === userInfo.id_type))
65
65
 
66
- useEffect(() => {
67
- void Taro.setNavigationBarTitle({ title: t('system.profile.title') })
68
- }, [locale, t])
69
-
70
66
  useEffect(() => {
71
67
  return () => {
72
68
  if (navigateBackTimerRef.current) clearTimeout(navigateBackTimerRef.current)
@@ -153,44 +149,63 @@ export default function ProfilePage() {
153
149
  }
154
150
 
155
151
  return (
156
- <View className='profile-viewport' style={{ backgroundImage: `url(${navigatorBackground})` }}>
157
- <View className='profile-navbar' style={{ paddingTop: `${safeTop}px` }}>
158
- <View className='profile-back' onClick={() => void Taro.navigateBack()}>‹</View>
159
- <View className='profile-navbar__title'>{t('system.profile.title')}</View>
160
- </View>
161
- <View className='profile-avatar'>
162
- <View className='profile-avatar__content' onClick={() => void onAvatarChange()}>
163
- <Image className='profile-avatar__image' src={userInfo.avatar ? formatSrc(userInfo.avatar) : defaultAvatar} mode='aspectFill' />
164
- <Text className='profile-avatar__text'>{t('system.profile.avatar_change')}</Text>
152
+ <View
153
+ className={`profile-viewport ${themeStore.theme === 'light' ? 'theme-light' : 'theme-dark'}`}
154
+ >
155
+ <View className='profile-content'>
156
+ <View className={`k-page-nav ${process.env.TARO_ENV === 'weapp' ? 'k-page-nav--weapp' : ''}`}>
157
+ <View
158
+ className='k-page-nav__back'
159
+ aria-label={t('common.action.back')}
160
+ onClick={() => void Taro.navigateBack()}
161
+ />
162
+ <View className='k-page-nav__title'>{t('system.profile.title')}</View>
163
+ <View className='k-page-nav__side' aria-hidden />
165
164
  </View>
166
- </View>
167
- <View className='profile-form'>
168
- <View className='profile-form__content'>
165
+
166
+ <View className='k-glass k-glass--lit k-pfx profile-id' onClick={() => void onAvatarChange()}>
167
+ <View className='k-cnr k-cnr--tl' aria-hidden />
168
+ <View className='k-cnr k-cnr--br' aria-hidden />
169
+ <View className='profile-id__main'>
170
+ <View className='k-pfx__av'>
171
+ <Image className='profile-av-img' src={userInfo.avatar ? formatSrc(userInfo.avatar) : defaultAvatar} mode='aspectFill' />
172
+ </View>
173
+ <View className='profile-id__meta'>
174
+ <View className='k-pfx__nm'>{userInfo.nick_name || t('system.profile.title')}</View>
175
+ <View className='k-pfx__ac'>{userInfo.user_name}</View>
176
+ </View>
177
+ </View>
178
+ <View className='k-pfx__ent'>{t('system.profile.avatar_change')}</View>
179
+ </View>
180
+
181
+ <View className='k-glass profile-form'>
182
+ <View className='k-phd'>
183
+ <View className='k-phd__title'>{t('system.profile.title')}</View>
184
+ </View>
185
+
169
186
  {userInfo.user_name ? (
170
- <View className='profile-form__item'>
171
- <Text className='profile-label'>{t('system.profile.account')}</Text>
172
- <Text className='profile-account profile-placeholder'>{userInfo.user_name}</Text>
187
+ <View className='k-field'>
188
+ <Text className='k-field__k'>{t('system.profile.account')}</Text>
189
+ <Text className='k-field__v'>{userInfo.user_name}</Text>
173
190
  </View>
174
191
  ) : null}
175
192
  {process.env.TARO_ENV === 'weapp' ? (
176
- <View className='profile-form__item'>
177
- <Text className='profile-label'>{t('system.profile.mobile')}</Text>
178
- <View className='profile-input'>
179
- {userInfo.phone ? (
180
- <Text className='profile-account'>{userInfo.phone}</Text>
181
- ) : (
182
- <Button className='profile-auth-button' openType='getPhoneNumber' onGetPhoneNumber={onGetPhoneNumber}>{t('system.profile.phone_authorization')}</Button>
183
- )}
184
- </View>
193
+ <View className='k-field'>
194
+ <Text className='k-field__k'>{t('system.profile.mobile')}</Text>
195
+ {userInfo.phone ? (
196
+ <Text className='k-field__v'>{userInfo.phone}</Text>
197
+ ) : (
198
+ <Button className='profile-auth-button' openType='getPhoneNumber' onGetPhoneNumber={onGetPhoneNumber}>{t('system.profile.phone_authorization')}</Button>
199
+ )}
185
200
  </View>
186
201
  ) : null}
187
- <View className='profile-form__item'>
188
- <Text className='profile-label'>{t('system.profile.nick_name')}</Text>
189
- <Input className='profile-input' placeholder={t('system.profile.nick_name_placeholder')} value={userInfo.nick_name} onInput={(event) => setUserInfo((current) => ({ ...current, nick_name: event.detail.value }))} />
202
+ <View className='k-field'>
203
+ <Text className='k-field__k'>{t('system.profile.nick_name')}</Text>
204
+ <Input className='k-field__v profile-input' placeholder={t('system.profile.nick_name_placeholder')} value={userInfo.nick_name} onInput={(event) => setUserInfo((current) => ({ ...current, nick_name: event.detail.value }))} />
190
205
  </View>
191
- <View className='profile-form__item'>
192
- <Text className='profile-label'>{t('system.profile.email')}</Text>
193
- <Input className='profile-input' type='text' placeholder={t('system.profile.email_placeholder')} value={userInfo.email} onInput={(event) => setUserInfo((current) => ({ ...current, email: event.detail.value }))} />
206
+ <View className='k-field'>
207
+ <Text className='k-field__k'>{t('system.profile.email')}</Text>
208
+ <Input className='k-field__v profile-input' type='text' placeholder={t('system.profile.email_placeholder')} value={userInfo.email} onInput={(event) => setUserInfo((current) => ({ ...current, email: event.detail.value }))} />
194
209
  </View>
195
210
  <Picker
196
211
  mode='selector'
@@ -198,28 +213,33 @@ export default function ProfilePage() {
198
213
  value={idTypeIndex}
199
214
  onChange={(event) => setUserInfo((current) => ({ ...current, id_type: idTypeOptions[Number(event.detail.value)]?.value ?? BaseUserIDType.BASE_USER_ID_TYPE_UNSPECIFIED }))}
200
215
  >
201
- <View className='profile-form__item'>
202
- <Text className='profile-label'>{t('system.profile.id_type')}</Text>
203
- <Text className='profile-input profile-account'>{idTypeOptions[idTypeIndex]?.label}</Text>
216
+ <View className='k-field profile-field--sub'>
217
+ <Text className='k-field__k'>{t('system.profile.id_type')}</Text>
218
+ <Text className='k-field__v'>{idTypeOptions[idTypeIndex]?.label}</Text>
204
219
  </View>
205
220
  </Picker>
206
- <View className='profile-form__item'>
207
- <Text className='profile-label'>{t('system.profile.id_code')}</Text>
208
- <Input className='profile-input' type='text' placeholder={t('system.profile.id_code_placeholder')} value={userInfo.id_code} onInput={(event) => setUserInfo((current) => ({ ...current, id_code: event.detail.value }))} />
221
+ <View className='k-field'>
222
+ <Text className='k-field__k'>{t('system.profile.id_code')}</Text>
223
+ <Input className='k-field__v profile-input' type='text' placeholder={t('system.profile.id_code_placeholder')} value={userInfo.id_code} onInput={(event) => setUserInfo((current) => ({ ...current, id_code: event.detail.value }))} />
209
224
  </View>
210
- <View className='profile-form__item'>
211
- <Text className='profile-label'>{t('system.profile.gender')}</Text>
212
- <RadioGroup onChange={(event) => setUserInfo((current) => ({ ...current, gender: Number(event.detail.value) }))}>
225
+ <View className='k-field'>
226
+ <Text className='k-field__k'>{t('system.profile.gender')}</Text>
227
+ <RadioGroup className='profile-radios' onChange={(event) => setUserInfo((current) => ({ ...current, gender: Number(event.detail.value) }))}>
213
228
  {genderList.map((item) => (
214
229
  <Label className='profile-radio' key={item.value}>
215
- <Radio value={item.value} color='#27ba9b' checked={userInfo.gender === Number(item.value)} />
230
+ <Radio
231
+ value={item.value}
232
+ color={themeStore.theme === 'light' ? '#039e8c' : '#28f0d4'}
233
+ checked={userInfo.gender === Number(item.value)}
234
+ />
216
235
  {item.label}
217
236
  </Label>
218
237
  ))}
219
238
  </RadioGroup>
220
239
  </View>
240
+
241
+ <Button className='k-save' onClick={() => void onSubmit()}>{t('common.action.save')}</Button>
221
242
  </View>
222
- <Button className='profile-form__button' onClick={() => void onSubmit()}>{t('common.action.save')}</Button>
223
243
  </View>
224
244
  </View>
225
245
  )
@@ -17,7 +17,7 @@
17
17
  max-width: 680px;
18
18
  overflow: hidden;
19
19
  border-radius: 16px;
20
- background-color: #fff;
20
+ background-color: var(--kratos-color-surface-solid);
21
21
  box-shadow: 0 20px 64px rgba(0, 0, 0, 0.2);
22
22
  }
23
23
 
@@ -26,18 +26,18 @@
26
26
  align-items: center;
27
27
  justify-content: space-between;
28
28
  padding: 28px 32px;
29
- border-bottom: 1px solid #eee;
29
+ border-bottom: 1PX solid var(--kratos-color-border);
30
30
  }
31
31
 
32
32
  .mfa-bind-dialog__title {
33
- color: #222;
33
+ color: var(--kratos-color-text);
34
34
  font-size: 34px;
35
35
  font-weight: 600;
36
36
  }
37
37
 
38
38
  .mfa-bind-dialog__close {
39
39
  padding: 0 8px;
40
- color: #999;
40
+ color: var(--kratos-color-text-muted);
41
41
  font-size: 42px;
42
42
  line-height: 1;
43
43
  }
@@ -53,16 +53,17 @@
53
53
  .mfa-bind-dialog__label {
54
54
  display: block;
55
55
  margin-bottom: 12px;
56
- color: #333;
56
+ color: var(--kratos-color-text);
57
57
  font-size: 28px;
58
58
  }
59
59
 
60
60
  .mfa-bind-dialog__input {
61
61
  width: 100%;
62
62
  padding: 20px 24px;
63
- color: #222;
63
+ color: var(--kratos-color-text);
64
64
  font-size: 30px;
65
- border: 1px solid #ddd;
65
+ border: 1PX solid var(--kratos-color-border);
66
+ background-color: var(--kratos-color-surface-2);
66
67
  border-radius: 8px;
67
68
  box-sizing: border-box;
68
69
  }
@@ -83,7 +84,7 @@
83
84
  }
84
85
 
85
86
  .mfa-bind-dialog__error {
86
- color: #e64340;
87
+ color: var(--kratos-color-danger);
87
88
  }
88
89
 
89
90
  .mfa-bind-dialog__footer {
@@ -105,17 +106,17 @@
105
106
  }
106
107
 
107
108
  .mfa-bind-dialog__button--cancel {
108
- color: #555;
109
- background-color: #f3f3f3;
109
+ color: var(--kratos-color-text-muted);
110
+ background-color: var(--kratos-color-track);
110
111
  }
111
112
 
112
113
  .mfa-bind-dialog__button--confirm {
113
- color: #fff;
114
- background-color: #27ba9b;
114
+ color: var(--kratos-color-on-primary);
115
+ background-color: var(--kratos-color-primary);
115
116
  }
116
117
 
117
118
  .mfa-bind-dialog__button--danger {
118
- background-color: #e64340;
119
+ background-color: var(--kratos-color-danger);
119
120
  }
120
121
 
121
122
  .mfa-bind-dialog__button[disabled] {
@@ -1,82 +1,41 @@
1
- .settings-viewport {
2
- min-height: 100vh;
3
- padding: 20px;
4
- background-color: #f4f4f4;
5
- }
6
-
7
- .settings-list {
8
- padding: 0 20px;
9
- margin-bottom: 20px;
10
- border-radius: 10px;
11
- background-color: #fff;
12
- }
13
-
14
- .settings-item {
15
- position: relative;
16
- padding-left: 10px;
17
- border-top: 1px solid #ddd;
18
- border-radius: 0;
19
- color: #333;
20
- font-size: 30px;
21
- line-height: 90px;
22
- text-align: left;
23
- background-color: #fff;
24
-
25
- &:first-child {
26
- border: 0;
27
- }
28
-
29
- &::after {
30
- border: 0;
31
- }
32
- }
33
-
34
- .settings-arrow::before {
35
- content: '›';
36
- position: absolute;
37
- top: 50%;
38
- right: 5px;
39
- color: #ccc;
40
- font-size: 36px;
41
- transform: translateY(-50%);
42
- }
43
-
44
- .settings-action {
45
- margin-top: 40px;
46
- color: #333;
47
- font-size: 32px;
48
- line-height: 90px;
49
- text-align: center;
1
+ page {
2
+ min-height: 100%;
3
+ background-color: #eef3f8;
50
4
  }
51
5
 
52
- .settings-locale {
53
- display: flex;
54
- justify-content: space-between;
55
- padding-right: 42px;
6
+ .settings-viewport {
7
+ min-height: 100vh;
8
+ box-sizing: border-box;
9
+ padding: 0 32px calc(40px + env(safe-area-inset-bottom));
10
+ background: var(--kratos-bg-gradient);
56
11
  }
57
12
 
58
- .settings-locale__value {
59
- color: #888;
13
+ .settings-content {
14
+ padding-bottom: 20px;
60
15
  }
61
16
 
62
- .settings-mfa {
63
- display: flex;
64
- align-items: center;
65
- justify-content: space-between;
66
- padding-right: 42px;
17
+ /* 行图标图片尺寸(挂在 .k-set-row__icon 内的 Image 上) */
18
+ .settings-row__icon {
19
+ width: 38px;
20
+ height: 38px;
67
21
  }
68
22
 
69
- .settings-mfa__value {
70
- max-width: 55%;
23
+ /* 行尾值文本截断(配合全局 .k-set-row__value 使用) */
24
+ .settings-row__value {
25
+ min-width: 0;
26
+ max-width: 45%;
71
27
  overflow: hidden;
72
- color: #888;
73
- font-size: 26px;
74
28
  text-overflow: ellipsis;
75
29
  white-space: nowrap;
76
30
  }
77
31
 
78
- .settings-button {
79
- margin-bottom: 20px;
80
- border-radius: 10px;
81
- background-color: #fff;
32
+ /* 小程序 Button 皮肤为 .k-set-row:去掉原生边框,保留箭头 ::after */
33
+ .settings-row--button {
34
+ line-height: normal;
35
+
36
+ &::after {
37
+ position: static;
38
+ border-left: 0;
39
+ border-bottom: 0;
40
+ }
82
41
  }