xto-fronted 0.4.71 → 0.4.73

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 (97) hide show
  1. package/dist/assets/404-CrBiLyvr.js +1 -0
  2. package/dist/assets/404-Cw_4ZCL6.css +1 -0
  3. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  4. package/dist/assets/index-9XqWtCGs.js +1 -0
  5. package/dist/assets/index-BBGKF0l-.js +1 -0
  6. package/dist/assets/index-BRR97dc6.js +1 -0
  7. package/dist/assets/index-BlRslYYI.css +1 -0
  8. package/dist/assets/index-BudArKxR.css +1 -0
  9. package/dist/assets/index-CFhWBbxk.css +1 -0
  10. package/dist/assets/index-CRJFI4iz.js +2 -0
  11. package/dist/assets/index-CmknWHK0.js +1 -0
  12. package/dist/assets/index-D7epoF1g.js +1 -0
  13. package/dist/assets/index-D9XBi20Y.css +1 -0
  14. package/dist/assets/index-DkkuYBgT.css +1 -0
  15. package/dist/assets/index-O9wpAB3Q.js +1 -0
  16. package/dist/assets/index-_aYxnqzF.css +1 -0
  17. package/dist/assets/index-rfC7s9zA.js +1 -0
  18. package/dist/assets/index-vfvEFrCH.css +1 -0
  19. package/dist/assets/vendor-42ANG6Sg.js +6 -0
  20. package/dist/assets/vue-vendor-D8SAgT8u.js +29 -0
  21. package/dist/assets/xto-base-BD3OH0V6.js +1 -0
  22. package/dist/assets/xto-base-CojW9IFO.css +1 -0
  23. package/dist/assets/xto-business--V1F5Gwb.css +1 -0
  24. package/dist/assets/xto-core-Boim7B0B.js +1 -0
  25. package/dist/assets/xto-data-CnAQAQH2.css +1 -0
  26. package/dist/assets/xto-data-DuG2QJrr.js +1 -0
  27. package/dist/assets/xto-feedback-C-ESp-Y1.css +1 -0
  28. package/dist/assets/xto-feedback-XZPSQcJN.js +1 -0
  29. package/dist/assets/xto-form-BmTGLIm_.js +1 -0
  30. package/dist/assets/xto-form-CrsyAjyr.css +1 -0
  31. package/dist/assets/xto-layout-D1stVnJI.css +1 -0
  32. package/dist/assets/xto-navigation-BRzSCpAw.css +1 -0
  33. package/dist/assets/xto-navigation-nPmjRi-J.js +1 -0
  34. package/dist/index.html +28 -0
  35. package/package.json +90 -87
  36. package/src/App.vue +30 -1
  37. package/src/assets/styles/_root.scss +141 -97
  38. package/src/assets/styles/_variables.scss +44 -19
  39. package/src/assets/styles/index.scss +267 -42
  40. package/src/components/Layout/Sidebar.vue +29 -10
  41. package/src/views/dashboard/index.vue +417 -155
  42. package/src/views/error/403.vue +251 -56
  43. package/src/views/error/404.vue +253 -56
  44. package/src/views/login/index.vue +586 -194
  45. package/src/views/system/menu/index.vue +403 -94
  46. package/src/views/system/role/index.vue +348 -69
  47. package/src/views/system/user/index.vue +402 -73
  48. package/dist/App.vue.d.ts +0 -2
  49. package/dist/api/auth.d.ts +0 -8
  50. package/dist/api/system.d.ts +0 -16
  51. package/dist/api/user.d.ts +0 -13
  52. package/dist/components/Layout/Footer.vue.d.ts +0 -2
  53. package/dist/components/Layout/Header.vue.d.ts +0 -5
  54. package/dist/components/Layout/MixTopMenu.vue.d.ts +0 -5
  55. package/dist/components/Layout/Sidebar.vue.d.ts +0 -11
  56. package/dist/components/Layout/SidebarMenuItem.vue.d.ts +0 -5
  57. package/dist/components/Layout/Tabs.vue.d.ts +0 -2
  58. package/dist/components/Layout/TopMenu.vue.d.ts +0 -5
  59. package/dist/components/Layout/index.vue.d.ts +0 -2
  60. package/dist/composables/useApp.d.ts +0 -29
  61. package/dist/composables/useAuth.d.ts +0 -6
  62. package/dist/composables/useForm.d.ts +0 -20
  63. package/dist/composables/useTable.d.ts +0 -29
  64. package/dist/directives/permission.d.ts +0 -4
  65. package/dist/enums/index.d.ts +0 -32
  66. package/dist/index-BgbSp2mz.js +0 -372
  67. package/dist/index-By874kXD.js +0 -142
  68. package/dist/index-COz0Cbj7.js +0 -345
  69. package/dist/index-CgbSCzIp.js +0 -3159
  70. package/dist/index-CzOd0mGb.js +0 -475
  71. package/dist/index.d.ts +0 -54
  72. package/dist/index.es.js +0 -91
  73. package/dist/index.umd.js +0 -1
  74. package/dist/main.d.ts +0 -0
  75. package/dist/router/dynamicRoutes.d.ts +0 -30
  76. package/dist/router/guards.d.ts +0 -17
  77. package/dist/router/index.d.ts +0 -6
  78. package/dist/router/layoutRoute.d.ts +0 -18
  79. package/dist/router/staticRoutes.d.ts +0 -2
  80. package/dist/stores/app.d.ts +0 -93
  81. package/dist/stores/auth.d.ts +0 -41
  82. package/dist/stores/index.d.ts +0 -9
  83. package/dist/stores/menu.d.ts +0 -77
  84. package/dist/stores/user.d.ts +0 -92
  85. package/dist/style.css +0 -1
  86. package/dist/utils/auth.d.ts +0 -27
  87. package/dist/utils/config.d.ts +0 -30
  88. package/dist/utils/permission.d.ts +0 -18
  89. package/dist/utils/request.d.ts +0 -24
  90. package/dist/utils/storage.d.ts +0 -24
  91. package/dist/views/dashboard/index.vue.d.ts +0 -2
  92. package/dist/views/error/403.vue.d.ts +0 -2
  93. package/dist/views/error/404.vue.d.ts +0 -2
  94. package/dist/views/login/index.vue.d.ts +0 -4
  95. package/dist/views/system/menu/index.vue.d.ts +0 -4
  96. package/dist/views/system/role/index.vue.d.ts +0 -4
  97. package/dist/views/system/user/index.vue.d.ts +0 -4
@@ -1,57 +1,252 @@
1
- <script setup lang="ts">
2
- import { useRouter } from 'vue-router'
3
- import { Button } from '@xto/base'
4
-
5
- const router = useRouter()
6
-
7
- const goBack = () => {
8
- router.push('/')
9
- }
10
- </script>
11
-
12
- <template>
13
- <div class="error-page">
14
- <div class="error-page__content">
15
- <div class="error-page__code">403</div>
16
- <div class="error-page__title">无访问权限</div>
17
- <div class="error-page__desc">抱歉,您没有权限访问此页面</div>
18
- <Button type="primary" @click="goBack">返回首页</Button>
19
- </div>
20
- </div>
21
- </template>
22
-
23
- <style lang="scss" scoped>
24
- .error-page {
25
- width: 100%;
26
- height: 100%;
27
- display: flex;
28
- align-items: center;
29
- justify-content: center;
30
- background-color: var(--bg-color-page);
31
-
32
- &__content {
33
- text-align: center;
34
- }
35
-
36
- &__code {
37
- font-size: 120px;
38
- font-weight: 600;
39
- color: var(--color-warning);
40
- line-height: 1;
41
- margin-bottom: 20px;
42
- }
43
-
44
- &__title {
45
- font-size: 24px;
46
- font-weight: 500;
47
- color: var(--color-text-primary);
48
- margin-bottom: 10px;
49
- }
50
-
51
- &__desc {
52
- font-size: 14px;
53
- color: var(--color-text-secondary);
54
- margin-bottom: 30px;
55
- }
56
- }
1
+ <script setup lang="ts">
2
+ import { useRouter } from 'vue-router'
3
+ import { Button } from '@xto/base'
4
+
5
+ const router = useRouter()
6
+
7
+ const goBack = () => {
8
+ router.push('/')
9
+ }
10
+ </script>
11
+
12
+ <template>
13
+ <div class="error-page">
14
+ <div class="error-container">
15
+ <!-- 装饰背景 -->
16
+ <div class="error-bg">
17
+ <div class="bg-circle circle-1"></div>
18
+ <div class="bg-circle circle-2"></div>
19
+ <div class="bg-circle circle-3"></div>
20
+ </div>
21
+
22
+ <!-- 内容 -->
23
+ <div class="error-content">
24
+ <div class="error-code">
25
+ <span class="code-digit">4</span>
26
+ <span class="code-zero warning">
27
+ <span class="zero-inner">0</span>
28
+ </span>
29
+ <span class="code-digit">3</span>
30
+ </div>
31
+
32
+ <div class="error-illustration">
33
+ <svg viewBox="0 0 200 120" fill="none" xmlns="http://www.w3.org/2000/svg">
34
+ <!-- 盾牌 -->
35
+ <path d="M100 15 L150 35 L150 70 C150 95 100 110 100 110 C100 110 50 95 50 70 L50 35 Z"
36
+ fill="var(--color-warning-lighter)" stroke="var(--color-warning)" stroke-width="2"/>
37
+ <!-- 锁 -->
38
+ <rect x="85" y="55" width="30" height="25" rx="4" fill="var(--color-warning)"/>
39
+ <path d="M92 55 V48 A8 8 0 0 1 108 48 V55" fill="none" stroke="var(--color-warning)" stroke-width="3"/>
40
+ <!-- 禁止符号 -->
41
+ <circle cx="100" cy="67" r="6" fill="none" stroke="#fff" stroke-width="2"/>
42
+ <line x1="96" y1="63" x2="104" y2="71" stroke="#fff" stroke-width="2"/>
43
+ </svg>
44
+ </div>
45
+
46
+ <h1 class="error-title">无访问权限</h1>
47
+ <p class="error-desc">抱歉,您没有权限访问此页面,请联系管理员获取权限</p>
48
+
49
+ <div class="error-actions">
50
+ <Button type="primary" size="large" @click="goBack">
51
+ <template #icon>
52
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
53
+ <path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"/>
54
+ <polyline points="9,22 9,12 15,12 15,22"/>
55
+ </svg>
56
+ </template>
57
+ 返回首页
58
+ </Button>
59
+ <Button size="large" @click="router.go(-1)">
60
+ <template #icon>
61
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
62
+ <path d="M19 12H5M12 19l-7-7 7-7"/>
63
+ </svg>
64
+ </template>
65
+ 返回上一页
66
+ </Button>
67
+ </div>
68
+
69
+ <!-- 提示 -->
70
+ <div class="error-tip">
71
+ <p>可能的原因:</p>
72
+ <ul>
73
+ <li>您的账号权限不足</li>
74
+ <li>该页面需要特定角色才能访问</li>
75
+ <li>您的登录状态已过期</li>
76
+ </ul>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ </template>
82
+
83
+ <style lang="scss" scoped>
84
+ .error-page {
85
+ width: 100%;
86
+ height: 100%;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ background: var(--bg-color-page);
91
+ position: relative;
92
+ overflow: hidden;
93
+ }
94
+
95
+ .error-container {
96
+ position: relative;
97
+ z-index: 2;
98
+ max-width: 600px;
99
+ padding: 40px;
100
+ }
101
+
102
+ .error-bg {
103
+ position: absolute;
104
+ inset: 0;
105
+ z-index: 1;
106
+ overflow: hidden;
107
+
108
+ .bg-circle {
109
+ position: absolute;
110
+ border-radius: 50%;
111
+ opacity: 0.1;
112
+
113
+ &.circle-1 {
114
+ width: 400px;
115
+ height: 400px;
116
+ top: -100px;
117
+ right: -100px;
118
+ background: var(--color-warning);
119
+ }
120
+
121
+ &.circle-2 {
122
+ width: 300px;
123
+ height: 300px;
124
+ bottom: -50px;
125
+ left: -50px;
126
+ background: var(--color-warning);
127
+ }
128
+
129
+ &.circle-3 {
130
+ width: 200px;
131
+ height: 200px;
132
+ top: 50%;
133
+ left: 50%;
134
+ transform: translate(-50%, -50%);
135
+ background: var(--color-warning-light);
136
+ }
137
+ }
138
+ }
139
+
140
+ .error-content {
141
+ text-align: center;
142
+ }
143
+
144
+ .error-code {
145
+ display: flex;
146
+ justify-content: center;
147
+ align-items: center;
148
+ gap: 8px;
149
+ margin-bottom: 32px;
150
+
151
+ .code-digit {
152
+ font-size: 80px;
153
+ font-weight: 700;
154
+ color: var(--color-text-primary);
155
+ line-height: 1;
156
+ }
157
+
158
+ .code-zero {
159
+ position: relative;
160
+ width: 80px;
161
+ height: 80px;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ background: linear-gradient(135deg, var(--color-warning) 0%, var(--color-warning-light) 100%);
166
+ border-radius: 50%;
167
+
168
+ .zero-inner {
169
+ font-size: 48px;
170
+ font-weight: 700;
171
+ color: #fff;
172
+ }
173
+ }
174
+ }
175
+
176
+ .error-illustration {
177
+ width: 200px;
178
+ height: 120px;
179
+ margin: 0 auto 24px;
180
+ }
181
+
182
+ .error-title {
183
+ font-size: 24px;
184
+ font-weight: 600;
185
+ color: var(--color-text-primary);
186
+ margin-bottom: 12px;
187
+ }
188
+
189
+ .error-desc {
190
+ font-size: 14px;
191
+ color: var(--color-text-secondary);
192
+ margin-bottom: 32px;
193
+ }
194
+
195
+ .error-actions {
196
+ display: flex;
197
+ justify-content: center;
198
+ gap: 16px;
199
+ margin-bottom: 32px;
200
+
201
+ :deep(.x-button) {
202
+ padding: 12px 24px;
203
+ border-radius: 8px;
204
+
205
+ svg {
206
+ width: 18px;
207
+ height: 18px;
208
+ margin-right: 8px;
209
+ }
210
+ }
211
+ }
212
+
213
+ .error-tip {
214
+ padding: 20px;
215
+ background: var(--color-warning-lighter);
216
+ border-radius: var(--border-radius-large);
217
+
218
+ p {
219
+ font-size: 14px;
220
+ font-weight: 500;
221
+ color: var(--color-text-primary);
222
+ margin-bottom: 12px;
223
+ }
224
+
225
+ ul {
226
+ list-style: none;
227
+ padding: 0;
228
+ margin: 0;
229
+
230
+ li {
231
+ font-size: 13px;
232
+ color: var(--color-text-secondary);
233
+ padding: 4px 0;
234
+ position: relative;
235
+ padding-left: 16px;
236
+
237
+ &:before {
238
+ content: '';
239
+ position: absolute;
240
+ left: 0;
241
+ top: 50%;
242
+ transform: translateY(-50%);
243
+ width: 6px;
244
+ height: 6px;
245
+ background: var(--color-warning);
246
+ border-radius: 50%;
247
+ opacity: 0.6;
248
+ }
249
+ }
250
+ }
251
+ }
57
252
  </style>
@@ -1,57 +1,254 @@
1
- <script setup lang="ts">
2
- import { useRouter } from 'vue-router'
3
- import { Button } from '@xto/base'
4
-
5
- const router = useRouter()
6
-
7
- const goBack = () => {
8
- router.push('/')
9
- }
10
- </script>
11
-
12
- <template>
13
- <div class="error-page">
14
- <div class="error-page__content">
15
- <div class="error-page__code">404</div>
16
- <div class="error-page__title">页面不存在</div>
17
- <div class="error-page__desc">抱歉,您访问的页面不存在或已被删除</div>
18
- <Button type="primary" @click="goBack">返回首页</Button>
19
- </div>
20
- </div>
21
- </template>
22
-
23
- <style lang="scss" scoped>
24
- .error-page {
25
- width: 100%;
26
- height: 100%;
27
- display: flex;
28
- align-items: center;
29
- justify-content: center;
30
- background-color: var(--bg-color-page);
31
-
32
- &__content {
33
- text-align: center;
34
- }
35
-
36
- &__code {
37
- font-size: 120px;
38
- font-weight: 600;
39
- color: var(--color-primary);
40
- line-height: 1;
41
- margin-bottom: 20px;
42
- }
43
-
44
- &__title {
45
- font-size: 24px;
46
- font-weight: 500;
47
- color: var(--color-text-primary);
48
- margin-bottom: 10px;
49
- }
50
-
51
- &__desc {
52
- font-size: 14px;
53
- color: var(--color-text-secondary);
54
- margin-bottom: 30px;
55
- }
56
- }
1
+ <script setup lang="ts">
2
+ import { useRouter } from 'vue-router'
3
+ import { Button } from '@xto/base'
4
+
5
+ const router = useRouter()
6
+
7
+ const goBack = () => {
8
+ router.push('/')
9
+ }
10
+ </script>
11
+
12
+ <template>
13
+ <div class="error-page">
14
+ <div class="error-container">
15
+ <!-- 装饰背景 -->
16
+ <div class="error-bg">
17
+ <div class="bg-circle circle-1"></div>
18
+ <div class="bg-circle circle-2"></div>
19
+ <div class="bg-circle circle-3"></div>
20
+ </div>
21
+
22
+ <!-- 内容 -->
23
+ <div class="error-content">
24
+ <div class="error-code">
25
+ <span class="code-digit">4</span>
26
+ <span class="code-zero">
27
+ <span class="zero-inner">0</span>
28
+ </span>
29
+ <span class="code-digit">4</span>
30
+ </div>
31
+
32
+ <div class="error-illustration">
33
+ <svg viewBox="0 0 200 120" fill="none" xmlns="http://www.w3.org/2000/svg">
34
+ <!-- 页面图标 -->
35
+ <rect x="40" y="20" width="120" height="80" rx="8" fill="var(--color-fill)" stroke="var(--color-border)" stroke-width="2"/>
36
+ <rect x="50" y="30" width="100" height="60" rx="4" fill="var(--bg-color)"/>
37
+ <line x1="60" y1="45" x2="140" y2="45" stroke="var(--color-border-light)" stroke-width="2"/>
38
+ <line x1="60" y1="55" x2="120" y2="55" stroke="var(--color-border-light)" stroke-width="2"/>
39
+ <line x1="60" y1="65" x2="100" y2="65" stroke="var(--color-border-light)" stroke-width="2"/>
40
+ <!-- 问号 -->
41
+ <text x="100" y="75" text-anchor="middle" fill="var(--color-primary)" font-size="24" font-weight="600">?</text>
42
+ <!-- 搜索图标 -->
43
+ <circle cx="150" cy="35" r="12" stroke="var(--color-primary)" stroke-width="2" fill="none"/>
44
+ <line x1="158" y1="43" x2="168" y2="53" stroke="var(--color-primary)" stroke-width="2" stroke-linecap="round"/>
45
+ </svg>
46
+ </div>
47
+
48
+ <h1 class="error-title">页面不存在</h1>
49
+ <p class="error-desc">抱歉,您访问的页面不存在或已被删除</p>
50
+
51
+ <div class="error-actions">
52
+ <Button type="primary" size="large" @click="goBack">
53
+ <template #icon>
54
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
55
+ <path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"/>
56
+ <polyline points="9,22 9,12 15,12 15,22"/>
57
+ </svg>
58
+ </template>
59
+ 返回首页
60
+ </Button>
61
+ <Button size="large" @click="router.go(-1)">
62
+ <template #icon>
63
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
64
+ <path d="M19 12H5M12 19l-7-7 7-7"/>
65
+ </svg>
66
+ </template>
67
+ 返回上一页
68
+ </Button>
69
+ </div>
70
+
71
+ <!-- 提示 -->
72
+ <div class="error-tip">
73
+ <p>您可以尝试:</p>
74
+ <ul>
75
+ <li>检查您输入的网址是否正确</li>
76
+ <li>返回首页重新浏览</li>
77
+ <li>联系管理员反馈问题</li>
78
+ </ul>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+ </template>
84
+
85
+ <style lang="scss" scoped>
86
+ .error-page {
87
+ width: 100%;
88
+ height: 100%;
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ background: var(--bg-color-page);
93
+ position: relative;
94
+ overflow: hidden;
95
+ }
96
+
97
+ .error-container {
98
+ position: relative;
99
+ z-index: 2;
100
+ max-width: 600px;
101
+ padding: 40px;
102
+ }
103
+
104
+ .error-bg {
105
+ position: absolute;
106
+ inset: 0;
107
+ z-index: 1;
108
+ overflow: hidden;
109
+
110
+ .bg-circle {
111
+ position: absolute;
112
+ border-radius: 50%;
113
+ opacity: 0.1;
114
+
115
+ &.circle-1 {
116
+ width: 400px;
117
+ height: 400px;
118
+ top: -100px;
119
+ right: -100px;
120
+ background: var(--color-primary);
121
+ }
122
+
123
+ &.circle-2 {
124
+ width: 300px;
125
+ height: 300px;
126
+ bottom: -50px;
127
+ left: -50px;
128
+ background: var(--color-info);
129
+ }
130
+
131
+ &.circle-3 {
132
+ width: 200px;
133
+ height: 200px;
134
+ top: 50%;
135
+ left: 50%;
136
+ transform: translate(-50%, -50%);
137
+ background: var(--color-primary-light-3);
138
+ }
139
+ }
140
+ }
141
+
142
+ .error-content {
143
+ text-align: center;
144
+ }
145
+
146
+ .error-code {
147
+ display: flex;
148
+ justify-content: center;
149
+ align-items: center;
150
+ gap: 8px;
151
+ margin-bottom: 32px;
152
+
153
+ .code-digit {
154
+ font-size: 80px;
155
+ font-weight: 700;
156
+ color: var(--color-text-primary);
157
+ line-height: 1;
158
+ }
159
+
160
+ .code-zero {
161
+ position: relative;
162
+ width: 80px;
163
+ height: 80px;
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-light-1) 100%);
168
+ border-radius: 50%;
169
+
170
+ .zero-inner {
171
+ font-size: 48px;
172
+ font-weight: 700;
173
+ color: #fff;
174
+ }
175
+ }
176
+ }
177
+
178
+ .error-illustration {
179
+ width: 200px;
180
+ height: 120px;
181
+ margin: 0 auto 24px;
182
+ }
183
+
184
+ .error-title {
185
+ font-size: 24px;
186
+ font-weight: 600;
187
+ color: var(--color-text-primary);
188
+ margin-bottom: 12px;
189
+ }
190
+
191
+ .error-desc {
192
+ font-size: 14px;
193
+ color: var(--color-text-secondary);
194
+ margin-bottom: 32px;
195
+ }
196
+
197
+ .error-actions {
198
+ display: flex;
199
+ justify-content: center;
200
+ gap: 16px;
201
+ margin-bottom: 32px;
202
+
203
+ :deep(.x-button) {
204
+ padding: 12px 24px;
205
+ border-radius: 8px;
206
+
207
+ svg {
208
+ width: 18px;
209
+ height: 18px;
210
+ margin-right: 8px;
211
+ }
212
+ }
213
+ }
214
+
215
+ .error-tip {
216
+ padding: 20px;
217
+ background: var(--color-fill-light);
218
+ border-radius: var(--border-radius-large);
219
+
220
+ p {
221
+ font-size: 14px;
222
+ font-weight: 500;
223
+ color: var(--color-text-primary);
224
+ margin-bottom: 12px;
225
+ }
226
+
227
+ ul {
228
+ list-style: none;
229
+ padding: 0;
230
+ margin: 0;
231
+
232
+ li {
233
+ font-size: 13px;
234
+ color: var(--color-text-secondary);
235
+ padding: 4px 0;
236
+ position: relative;
237
+ padding-left: 16px;
238
+
239
+ &:before {
240
+ content: '';
241
+ position: absolute;
242
+ left: 0;
243
+ top: 50%;
244
+ transform: translateY(-50%);
245
+ width: 6px;
246
+ height: 6px;
247
+ background: var(--color-primary);
248
+ border-radius: 50%;
249
+ opacity: 0.6;
250
+ }
251
+ }
252
+ }
253
+ }
57
254
  </style>