af-mobile-client-vue3 1.0.54

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 (156) hide show
  1. package/.editorconfig +38 -0
  2. package/.env +7 -0
  3. package/.env.development +4 -0
  4. package/.env.envoiceShow +7 -0
  5. package/.env.production +7 -0
  6. package/.husky/commit-msg +1 -0
  7. package/.husky/pre-commit +1 -0
  8. package/.vscode/extensions.json +7 -0
  9. package/.vscode/settings.json +61 -0
  10. package/LICENSE +21 -0
  11. package/README.md +181 -0
  12. package/af-example-mobile-vue-web.iml +9 -0
  13. package/build/vite/index.ts +91 -0
  14. package/build/vite/vconsole.ts +44 -0
  15. package/eslint.config.js +7 -0
  16. package/index.html +17 -0
  17. package/mock/data.ts +20 -0
  18. package/mock/index.ts +5 -0
  19. package/mock/modules/prose.mock.ts +16 -0
  20. package/mock/modules/user.mock.ts +152 -0
  21. package/netlify.toml +12 -0
  22. package/package.json +107 -0
  23. package/public/favicon-dark.svg +4 -0
  24. package/public/favicon.ico +0 -0
  25. package/public/favicon.svg +4 -0
  26. package/public/pwa-192x192.png +0 -0
  27. package/public/pwa-512x512.png +0 -0
  28. package/public/safari-pinned-tab.svg +32 -0
  29. package/scripts/verifyCommit.js +19 -0
  30. package/src/App.vue +43 -0
  31. package/src/api/mock/index.ts +30 -0
  32. package/src/api/user/index.ts +40 -0
  33. package/src/assets/common/default-user-profile.png +0 -0
  34. package/src/assets/img/apps/apply-web.png +0 -0
  35. package/src/assets/img/apps/example-web.png +0 -0
  36. package/src/assets/img/apps/iot-web.png +0 -0
  37. package/src/assets/img/apps/linepatrol-web.png +0 -0
  38. package/src/assets/img/apps/monitor-web.png +0 -0
  39. package/src/assets/img/apps/oa-web.png +0 -0
  40. package/src/assets/img/apps/revenue-web.png +0 -0
  41. package/src/assets/img/apps/safe-check-web.png +0 -0
  42. package/src/assets/img/component/logo.png +0 -0
  43. package/src/assets/img/home/banner1.png +0 -0
  44. package/src/assets/img/home/banner2.png +0 -0
  45. package/src/assets/img/home/banner3.png +0 -0
  46. package/src/assets/img/home/banner4.png +0 -0
  47. package/src/assets/img/home/notice/icon.png +0 -0
  48. package/src/assets/img/user/login/background-shadow-1.svg +20 -0
  49. package/src/assets/img/user/login/logo-background.svg +20 -0
  50. package/src/assets/img/user/login/logo.png +0 -0
  51. package/src/assets/img/user/my/exit-login.png +0 -0
  52. package/src/assets/img/user/my/setting-arrow.png +0 -0
  53. package/src/assets/img/user/my/setting.png +0 -0
  54. package/src/bootstrap.ts +32 -0
  55. package/src/components/core/App/MicroAppView.vue +59 -0
  56. package/src/components/core/BeautifulLoading/index.vue +47 -0
  57. package/src/components/core/NavBar/index.vue +12 -0
  58. package/src/components/core/SvgIcon/index.vue +61 -0
  59. package/src/components/core/Tabbar/index.vue +38 -0
  60. package/src/components/core/Uploader/index.vue +104 -0
  61. package/src/components/core/XMultiSelect/index.vue +196 -0
  62. package/src/components/core/XSelect/index.vue +130 -0
  63. package/src/components/data/XBadge/index.vue +85 -0
  64. package/src/components/data/XCellDetail/index.vue +106 -0
  65. package/src/components/data/XCellList/index.vue +358 -0
  66. package/src/components/data/XCellListFilter/index.vue +392 -0
  67. package/src/components/data/XForm/index.vue +127 -0
  68. package/src/components/data/XFormItem/index.vue +472 -0
  69. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -0
  70. package/src/components/data/XReportForm/index.vue +1058 -0
  71. package/src/components/layout/NormalDataLayout/index.vue +70 -0
  72. package/src/components/layout/TabBarLayout/index.vue +40 -0
  73. package/src/components.d.ts +53 -0
  74. package/src/enums/requestEnum.ts +25 -0
  75. package/src/env.d.ts +16 -0
  76. package/src/font-style/PingFangSC-Regular.woff2 +0 -0
  77. package/src/font-style/font.css +4 -0
  78. package/src/hooks/useCommon.ts +9 -0
  79. package/src/hooks/useLogin.ts +97 -0
  80. package/src/icons/svg/bird.svg +1 -0
  81. package/src/icons/svg/check-in.svg +33 -0
  82. package/src/icons/svg/dark.svg +5 -0
  83. package/src/icons/svg/github.svg +5 -0
  84. package/src/icons/svg/light.svg +5 -0
  85. package/src/icons/svg/link.svg +5 -0
  86. package/src/icons/svg/loadError.svg +1 -0
  87. package/src/icons/svg/notFound.svg +1 -0
  88. package/src/icons/svgo.yml +22 -0
  89. package/src/layout/PageLayout.vue +51 -0
  90. package/src/layout/SingleLayout.vue +35 -0
  91. package/src/locales/en-US.json +25 -0
  92. package/src/locales/zh-CN.json +25 -0
  93. package/src/main.ts +48 -0
  94. package/src/plugins/AppData.ts +38 -0
  95. package/src/plugins/GetLoginInfoService.ts +10 -0
  96. package/src/plugins/index.ts +11 -0
  97. package/src/router/README.md +8 -0
  98. package/src/router/guards.ts +60 -0
  99. package/src/router/index.ts +60 -0
  100. package/src/router/invoiceRoutes.ts +33 -0
  101. package/src/router/routes.ts +84 -0
  102. package/src/services/api/Login.ts +6 -0
  103. package/src/services/api/common.ts +98 -0
  104. package/src/services/api/index.ts +7 -0
  105. package/src/services/api/manage.ts +8 -0
  106. package/src/services/restTools.ts +37 -0
  107. package/src/settings.ts +1 -0
  108. package/src/stores/index.ts +7 -0
  109. package/src/stores/modules/cachedView.ts +31 -0
  110. package/src/stores/modules/counter.ts +19 -0
  111. package/src/stores/modules/routeTransitionName.ts +26 -0
  112. package/src/stores/modules/setting.ts +28 -0
  113. package/src/stores/modules/user.ts +180 -0
  114. package/src/stores/mutation-type.ts +7 -0
  115. package/src/styles/app.less +67 -0
  116. package/src/styles/login.less +81 -0
  117. package/src/typing.ts +3 -0
  118. package/src/utils/Storage.ts +124 -0
  119. package/src/utils/authority-utils.ts +87 -0
  120. package/src/utils/common.ts +41 -0
  121. package/src/utils/crypto.ts +39 -0
  122. package/src/utils/dataUtil.ts +42 -0
  123. package/src/utils/dictUtil.ts +51 -0
  124. package/src/utils/http/index.ts +158 -0
  125. package/src/utils/i18n.ts +41 -0
  126. package/src/utils/indexedDB.ts +180 -0
  127. package/src/utils/local-storage.ts +9 -0
  128. package/src/utils/mobileUtil.ts +26 -0
  129. package/src/utils/progress.ts +19 -0
  130. package/src/utils/routerUtil.ts +271 -0
  131. package/src/utils/set-page-title.ts +7 -0
  132. package/src/utils/validate.ts +6 -0
  133. package/src/views/chat/index.vue +153 -0
  134. package/src/views/common/LoadError.vue +64 -0
  135. package/src/views/common/NotFound.vue +68 -0
  136. package/src/views/component/EvaluateRecordView/index.vue +40 -0
  137. package/src/views/component/XCellDetailView/index.vue +216 -0
  138. package/src/views/component/XCellListView/index.vue +36 -0
  139. package/src/views/component/XFormView/index.vue +478 -0
  140. package/src/views/component/XReportFormIframeView/index.vue +45 -0
  141. package/src/views/component/XReportFormView/index.vue +295 -0
  142. package/src/views/component/index.vue +111 -0
  143. package/src/views/component/menu.vue +117 -0
  144. package/src/views/component/notice.vue +46 -0
  145. package/src/views/component/topNav.vue +36 -0
  146. package/src/views/invoiceShow/index.vue +62 -0
  147. package/src/views/user/login/ForgetPasswordForm.vue +93 -0
  148. package/src/views/user/login/LoginForm.vue +145 -0
  149. package/src/views/user/login/LoginTitle.vue +68 -0
  150. package/src/views/user/login/LoginWave.vue +109 -0
  151. package/src/views/user/login/index.vue +22 -0
  152. package/src/views/user/my/index.vue +230 -0
  153. package/src/vue-router.d.ts +9 -0
  154. package/tsconfig.json +43 -0
  155. package/uno.config.ts +32 -0
  156. package/vite.config.ts +110 -0
@@ -0,0 +1,106 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ Col as VanCol,
4
+ Icon as VanIcon,
5
+ Row as VanRow,
6
+ Skeleton as VanSkeleton,
7
+ } from 'vant'
8
+ import 'animate.css'
9
+
10
+ const { title, describe, extra, loading, statusBar } = defineProps<{
11
+ title?: string
12
+ describe?: string
13
+ extra?: string
14
+ loading?: boolean
15
+ statusBar?: { icon: string, color: string }
16
+ }>()
17
+ </script>
18
+
19
+ <template>
20
+ <div class="main">
21
+ <VanSkeleton title :row="20" :loading="loading" class="skeleton-box">
22
+ <VanIcon
23
+ v-if="statusBar"
24
+ :color="statusBar.color"
25
+ :name="statusBar.icon"
26
+ class="status-icon animate__animated animate__rotateInDownRight"
27
+ size="70"
28
+ />
29
+ <VanRow class="detail-header">
30
+ <VanCol span="16">
31
+ <slot name="detailHeaderTitle">
32
+ <div class="detail-header-title">
33
+ {{ title }}
34
+ </div>
35
+ </slot>
36
+ <slot name="detailHeaderDescribe">
37
+ <div class="detail-header-describe">
38
+ {{ describe }}
39
+ </div>
40
+ </slot>
41
+ </VanCol>
42
+ <VanCol span="8">
43
+ <span class="detail-header-extra">
44
+ {{ extra }}
45
+ </span>
46
+ </VanCol>
47
+ </VanRow>
48
+ <div class="detail-content-box">
49
+ <slot name="detailContent" />
50
+ </div>
51
+ <slot name="extraAction"/>
52
+ </VanSkeleton>
53
+ </div>
54
+ </template>
55
+
56
+ <style scoped lang="less">
57
+ .main {
58
+ background-color: #f7f8fa;
59
+ overflow-y: auto;
60
+ height: 92vh;
61
+ .skeleton-box {
62
+ margin-top: 1vh;
63
+ }
64
+ .status-icon {
65
+ opacity: 0.5;
66
+ position: absolute;
67
+ top: 13vh;
68
+ right: 3vh;
69
+ transform: translate(-50%, -50%) rotate(-20deg);
70
+ }
71
+ .status-icon:before {
72
+ opacity: 0.5;
73
+ transform: rotate(-20deg);
74
+ }
75
+ .status-icon:after {
76
+ opacity: 0.5;
77
+ transform: rotate(-20deg);
78
+ }
79
+ .detail-header {
80
+ margin-top: 1vh;
81
+ padding: 1vh 2vh 1vh 2vh;
82
+ background-color: white;
83
+ .detail-header-title {
84
+ font-size: 15px;
85
+ margin-bottom: 5px;
86
+ }
87
+ .detail-header-describe {
88
+ font-size: 13px;
89
+ color: var(--van-text-color-2);
90
+ }
91
+ .detail-header-extra {
92
+ width: 100%;
93
+ display: inline-block;
94
+ text-align: right;
95
+ font-size: 28px;
96
+ color: #1989fa;
97
+ font-weight: bold;
98
+ }
99
+ }
100
+ .detail-content-box {
101
+ background-color: white;
102
+ margin-top: 1vh;
103
+ padding: 1vh 2vh 2vh 2vh;
104
+ }
105
+ }
106
+ </style>
@@ -0,0 +1,358 @@
1
+ <script setup lang="ts">
2
+ import { defineEmits, defineProps, ref, watch } from 'vue'
3
+ import {
4
+ BackTop as VanBackTop,
5
+ Col as VanCol,
6
+ List as VanList,
7
+ PullRefresh as VanPullRefresh,
8
+ Row as VanRow,
9
+ Search as VanSearch,
10
+ } from 'vant'
11
+ import XBadge from '@af-mobile-client-vue3/components/data/XBadge/index.vue'
12
+ import { getConfigByName, query } from '@af-mobile-client-vue3/services/api/common'
13
+ import LoadError from '@af-mobile-client-vue3/views/common/LoadError.vue'
14
+ import XCellListFilter from '@af-mobile-client-vue3/components/data/XCellListFilter/index.vue'
15
+
16
+ const { configName, serviceName } = withDefaults(defineProps<{
17
+ configName?: string
18
+ fixQueryForm?: object
19
+ idKey?: string
20
+ serviceName?: string
21
+ }>(), {
22
+ configName: '',
23
+ fixQueryForm: null,
24
+ idKey: 'o_id',
25
+ serviceName: undefined,
26
+ })
27
+
28
+ const emit = defineEmits(['toDetail'])
29
+
30
+ const orderVal = ref(undefined)
31
+
32
+ const sortordVal = ref(undefined)
33
+
34
+ // 配置内容
35
+ const configContent = ref({})
36
+
37
+ // 主列
38
+ const mainColumns = ref([])
39
+
40
+ // 副标题列
41
+ const subTitleColumns = ref([])
42
+
43
+ // 详情列
44
+ const detailColumns = ref([])
45
+
46
+ // 底部列
47
+ const footColumns = ref([])
48
+
49
+ // 数据集
50
+ const list = ref([])
51
+
52
+ // 排序集
53
+ const orderList = ref([])
54
+
55
+ // 表单查询数组
56
+ const formQueryList = ref([])
57
+
58
+ // 当前页数
59
+ const pageNo = ref(1)
60
+
61
+ // 每页数量
62
+ const pageSize = 20
63
+
64
+ const searchValue = ref('')
65
+
66
+ const inputSpan = ref(22)
67
+
68
+ // 数据加载状态
69
+ const loading = ref(false)
70
+ const refreshing = ref(false)
71
+ const finished = ref(false)
72
+ const isError = ref(false)
73
+ const finishedText = ref('加载完成')
74
+ // 避免查询多次
75
+ const isLastPage = ref(false)
76
+
77
+ const conditionParams = ref(undefined)
78
+
79
+ initComponent()
80
+
81
+ // 组件初始化
82
+ function initComponent() {
83
+ getConfigByName(configName, (result) => {
84
+ for (let i = 0; i < result.columnJson.length; i++) {
85
+ const item = result.columnJson[i]
86
+ item.span = item.flexSpan
87
+ if (item.slotType === 'badge')
88
+ item.dictName = item.slotKeyMap
89
+
90
+ if (item.mobileColumnType === 'mobile_header_column')
91
+ mainColumns.value.push(item)
92
+
93
+ else if (item.mobileColumnType === 'mobile_subtitle_column')
94
+ subTitleColumns.value.push(item)
95
+
96
+ else if (item.mobileColumnType === 'mobile_details_column')
97
+ detailColumns.value.push(item)
98
+
99
+ else if (item.mobileColumnType === 'mobile_footer_column')
100
+ footColumns.value.push(item)
101
+
102
+ if (item.sortable) {
103
+ orderList.value.push({
104
+ title: item.title,
105
+ value: item.dataIndex,
106
+ })
107
+ }
108
+ }
109
+ if (orderList.value.length === 0)
110
+ inputSpan.value = 24
111
+ configContent.value = result
112
+ formQueryList.value = result.formJson
113
+ })
114
+ }
115
+
116
+ // 刷新数据
117
+ function onRefresh() {
118
+ isError.value = false
119
+ setTimeout(() => {
120
+ // 重新加载数据
121
+ // 将 loading 设置为 true,表示处于加载状态
122
+ refreshing.value = true
123
+ finishedText.value = '加载完成'
124
+ finished.value = false
125
+ loading.value = true
126
+ onLoad()
127
+ }, 100)
128
+ }
129
+
130
+ // 加载数据
131
+ function onLoad() {
132
+ if (refreshing.value) {
133
+ list.value = []
134
+ pageNo.value = 1
135
+ isLastPage.value = false
136
+ }
137
+ if (!isLastPage.value) {
138
+ let searchVal = searchValue.value
139
+ if (searchVal === '')
140
+ searchVal = undefined
141
+ query({
142
+ queryParamsName: configName,
143
+ pageNo: pageNo.value,
144
+ pageSize,
145
+ conditionParams: {
146
+ $queryValue: searchVal,
147
+ ...conditionParams.value,
148
+ },
149
+ sortField: orderVal?.value,
150
+ sortOrder: sortordVal?.value,
151
+ }, serviceName).then((res: any) => {
152
+ if (res.data.length === 0) {
153
+ isLastPage.value = true
154
+ }
155
+ for (const item of res.data)
156
+ list.value.push(item)
157
+ if (list.value.length >= res.totalCount)
158
+ finished.value = true
159
+ else
160
+ pageNo.value = pageNo.value + 1
161
+ }).catch(() => {
162
+ finishedText.value = ''
163
+ finished.value = true
164
+ isError.value = true
165
+ }).finally(() => {
166
+ // 加载状态结束
167
+ loading.value = false
168
+ refreshing.value = false
169
+ })
170
+ }
171
+ }
172
+
173
+ watch(() => searchValue.value, (newVal) => {
174
+ if (newVal === '')
175
+ onRefresh()
176
+ })
177
+
178
+ function handleFunctionStyle(funcString, param) {
179
+ try {
180
+ if (!funcString || funcString === '')
181
+ return {}
182
+
183
+ // 匹配参数名、函数体
184
+ const innerFuncRegex = /function\s+\w*\((\w+)\)\s*\{([\s\S]*)\}/
185
+ const matches = funcString.match(innerFuncRegex)
186
+
187
+ const paramName = matches[1] // 提取参数名
188
+
189
+ // eslint-disable-next-line no-new-func
190
+ const func = new Function(paramName, matches[2])
191
+
192
+ return func(param)
193
+ }
194
+ catch (error) {
195
+ return {}
196
+ }
197
+ }
198
+ </script>
199
+
200
+ <template>
201
+ <div id="XCellList">
202
+ <VanRow class="filter-condition">
203
+ <VanCol :span="inputSpan">
204
+ <VanSearch
205
+ v-model="searchValue"
206
+ class="title-search"
207
+ clearable
208
+ @search="onRefresh"
209
+ />
210
+ </VanCol>
211
+ <VanCol v-if="orderList.length > 0" span="2">
212
+ <XCellListFilter
213
+ v-model:sortord-val="sortordVal"
214
+ v-model:order-val="orderVal"
215
+ v-model:condition-params="conditionParams"
216
+ :order-list="orderList"
217
+ :form-query="formQueryList"
218
+ @on-refresh="onRefresh"
219
+ />
220
+ </VanCol>
221
+ </VanRow>
222
+ <div class="main">
223
+ <VanPullRefresh v-model="refreshing" :success-text="finishedText" head-height="70" @refresh="onRefresh">
224
+ <template v-if="!isError">
225
+ <VanList
226
+ v-model:loading="loading"
227
+ class="list_main"
228
+ :finished="finished"
229
+ finished-text="本来无一物,何处惹尘埃"
230
+ @load="onLoad"
231
+ >
232
+ <div v-for="(item, index) in list" :key="`card_${index}`" class="card_item_main" @click="emit('toDetail', item)">
233
+ <VanRow gutter="20" class="card_item_header" align="center">
234
+ <VanCol v-for="(column) in mainColumns" :key="`main_${column.dataIndex}`" :span="18">
235
+ <p class="card_item_title" :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])">
236
+ {{ item[column.dataIndex] }}
237
+ </p>
238
+ </VanCol>
239
+ <VanCol v-for="(column) in subTitleColumns" :key="`subtitle_${column.dataIndex}`" :span="6">
240
+ <p class="card_item_subtitle" :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])">
241
+ <XBadge :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])" :dict-name="column.dictName" :dict-value="item[column.dataIndex]" />
242
+ </p>
243
+ </VanCol>
244
+ </VanRow>
245
+ <VanRow gutter="20" class="card_item_details">
246
+ <VanCol v-for="column of detailColumns" :key="`details_${column.dataIndex}`" :span="column.span">
247
+ <p>
248
+ <span :style="handleFunctionStyle(column.styleFunctionForTitle, item[column.dataIndex])">{{ column.title }}: </span>
249
+ <XBadge :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])" :dict-name="column.dictName" :dict-value="item[column.dataIndex]" />
250
+ </p>
251
+ </VanCol>
252
+ </VanRow>
253
+ <VanRow gutter="20" class="card_item_footer">
254
+ <VanCol v-for="column of footColumns" :key="`foot_${column.dataIndex}`" :span="12">
255
+ <p>
256
+ <span :style="handleFunctionStyle(column.styleFunctionForTitle, item[column.dataIndex])">{{ column.title }}: </span>
257
+ <XBadge :style="handleFunctionStyle(column.styleFunctionForValue, item[column.dataIndex])" :dict-name="column.dictName" :dict-value="item[column.dataIndex]" />
258
+ </p>
259
+ </VanCol>
260
+ </VanRow>
261
+ </div>
262
+ </VanList>
263
+ </template>
264
+ <template v-else>
265
+ <LoadError />
266
+ </template>
267
+ </VanPullRefresh>
268
+ <VanBackTop />
269
+ </div>
270
+ </div>
271
+ </template>
272
+
273
+ <style scoped lang="less">
274
+ #XCellList {
275
+ height: calc(94vh - var(--van-nav-bar-height) - 5px);
276
+ .main {
277
+ overflow-y: auto;
278
+ height: 100%;
279
+ background-color: var(--van-background);
280
+ padding: var(--van-padding-base) var(--van-padding-sm);
281
+
282
+ p {
283
+ white-space: nowrap;
284
+ overflow: hidden;
285
+ text-overflow: ellipsis;
286
+ margin: 0;
287
+ }
288
+
289
+ .card_item_main {
290
+ background-color: var(--van-background-2);
291
+ border-radius: var(--van-radius-lg);
292
+ margin: 0 0 var(--van-padding-xs) 0;
293
+ padding: var(--van-padding-sm);
294
+ .card_item_header {
295
+ margin-bottom: var(--van-padding-base);
296
+ .card_item_title {
297
+ font-size: var(--van-font-size-lg);
298
+ }
299
+ .card_item_subtitle {
300
+ font-size: var(--van-font-size-xs);
301
+ color: var(--van-text-color-2);
302
+ text-align: right;
303
+ }
304
+ }
305
+ .card_item_details {
306
+ margin-bottom: var(--van-padding-base);
307
+ font-size: var(--van-font-size-sm);
308
+ color: #666;
309
+ .van-col {
310
+ margin-bottom: 2px;
311
+ }
312
+ }
313
+ .card_item_footer {
314
+ font-size: var(--van-font-size-sm);
315
+ color: var(--van-text-color-2);
316
+ .van-col:last-child {
317
+ text-align: right;
318
+ }
319
+ .van-col:first-child {
320
+ text-align: left;
321
+ }
322
+ }
323
+ }
324
+ }
325
+ .filter-condition {
326
+ :deep(.van-search) {
327
+ padding: 0 var(--van-search-padding);
328
+ }
329
+ :deep(.van-search__content) {
330
+ border-radius: 8px;
331
+ }
332
+ .title-search {
333
+ height: 4vh;
334
+ }
335
+ :deep(.van-dropdown-menu__bar) {
336
+ height: calc(4vh - 4px);
337
+ box-shadow: none;
338
+ }
339
+ :deep(.van-dropdown-menu__title) {
340
+ padding: 0;
341
+ }
342
+ :deep(.van-dropdown-menu__title--down:after) {
343
+ display: none;
344
+ }
345
+ :deep(.van-dropdown-menu__title:after) {
346
+ display: none;
347
+ }
348
+ :deep(.van-dropdown-item__content) {
349
+ position: absolute;
350
+ max-height: var(--van-dropdown-menu-content-max-height);
351
+ }
352
+ :deep(.van-dropdown-menu__item) {
353
+ align-items: flex-start;
354
+ justify-content: flex-start;
355
+ }
356
+ }
357
+ }
358
+ </style>