vue2-client 1.22.19 → 1.22.21

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 (88) hide show
  1. package/.env.his +19 -19
  2. package/.env.message +19 -19
  3. package/.history/.eslintrc_20260521171150.js +74 -0
  4. package/.history/.eslintrc_20260521171213.js +74 -0
  5. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +726 -0
  6. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +478 -0
  7. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175435.vue +706 -0
  8. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175450.vue +694 -0
  9. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +755 -0
  10. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513145941.vue +524 -0
  11. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513153133.vue +731 -0
  12. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513160316.vue +525 -0
  13. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260601144150.vue +1046 -0
  14. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +512 -0
  15. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +511 -0
  16. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +696 -0
  17. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +693 -0
  18. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +677 -0
  19. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260625173703.vue +767 -0
  20. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260626112425.vue +803 -0
  21. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140637.vue +1455 -0
  22. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140935.vue +1441 -0
  23. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513150818.vue +1441 -0
  24. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153119.vue +1442 -0
  25. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153126.vue +1486 -0
  26. package/.history/src/base-client/components/common/XForm/XFormItem_20260513140854.vue +1607 -0
  27. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +643 -0
  28. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +628 -0
  29. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +104 -0
  30. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +102 -0
  31. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +1241 -0
  32. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +1223 -0
  33. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +472 -0
  34. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +538 -0
  35. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +650 -0
  36. package/.history/src/base-client/components/his/HAi/HAi_20260618140214.vue +1396 -0
  37. package/.history/src/base-client/components/his/HAi/HAi_20260618140556.vue +1396 -0
  38. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +1469 -0
  39. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +788 -0
  40. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +780 -0
  41. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +585 -0
  42. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +787 -0
  43. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +739 -0
  44. package/.history/src/components/STable/index_20260409155138.js +806 -0
  45. package/.history/src/components/STable/index_20260409155218.js +814 -0
  46. package/.history/src/expression/core/Expression_20260305164427.js +1371 -0
  47. package/.history/src/expression/core/Expression_20260305170258.js +1358 -0
  48. package/.history/src/expression/core/Program_20260305111830.js +944 -0
  49. package/.history/src/expression/core/Program_20260305112041.js +931 -0
  50. package/.history/src/logic/LogicRunner_20260304154306.js +170 -0
  51. package/.history/src/logic/LogicRunner_20260304155553.js +112 -0
  52. package/.history/src/logic/LogicRunner_20260305105834.js +112 -0
  53. package/.history/src/logic/LogicRunner_20260305112718.js +129 -0
  54. package/.history/src/logic/LogicRunner_20260305182436.js +133 -0
  55. package/.history/src/logic/LogicRunner_20260306151301.js +213 -0
  56. package/.history/src/logic/LogicRunner_20260306152419.js +213 -0
  57. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +61 -0
  58. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +44 -0
  59. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +44 -0
  60. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +80 -0
  61. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +75 -0
  62. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +75 -0
  63. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +72 -0
  64. package/.history/src/services/api/restTools_20260427142149.js +245 -0
  65. package/.history/src/services/api/restTools_20260427142853.js +230 -0
  66. package/.history/src/services/api/restTools_20260519135558.js +230 -0
  67. package/.history/src/services/api/restTools_20260519140825.js +230 -0
  68. package/.history/src/services/api/restTools_20260519151223.js +230 -0
  69. package/.history/src/utils/indexedDB_20260306150918.js +593 -0
  70. package/.history/src/utils/indexedDB_20260306151301.js +586 -0
  71. package/.idea/af-vue2-client.iml +4 -7
  72. package/.idea/codeStyles/Project.xml +62 -0
  73. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  74. package/.idea/misc.xml +6 -0
  75. package/CHANGELOG.md +837 -837
  76. package/package.json +117 -117
  77. package/preview-input-box.html +180 -0
  78. package/src/base-client/components/common/HIS/HForm/HForm.vue +1186 -1186
  79. package/src/base-client/components/common/HIS/HTab/HTab.vue +790 -757
  80. package/src/base-client/components/common/ImagePreviewModal/index.js +3 -3
  81. package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
  82. package/src/base-client/components/his/HAi/HAi.vue +159 -30
  83. package/src/base-client/components/his/XTransfer/index.md +327 -327
  84. package/src/components/MarkdownEditor/demo.vue +300 -300
  85. package/src/components/MarkdownEditor/index.vue +590 -590
  86. package/src/router/async/router.map.js +141 -141
  87. package/src/services/api/restTools.js +1 -1
  88. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
@@ -0,0 +1,803 @@
1
+ <script setup>
2
+ import XTab from '@vue2-client/base-client/components/common/XTab/XTab.vue'
3
+ import { ref, computed, useAttrs, useSlots, onMounted } from 'vue'
4
+ import { getConfigByName } from '@vue2-client/services/api/common'
5
+
6
+ const props = defineProps({
7
+ // 标签栏右侧附加区域的配置名(可选)。提供时将自动加载配置并渲染到 tabBar 右侧。
8
+ tabBarExtraConfig: {
9
+ type: String,
10
+ default: undefined
11
+ },
12
+ // 控制标签间距,覆盖内部 XTab 的默认 10px;默认置 0 清除外边距
13
+ tabBarGutter: {
14
+ type: Number,
15
+ default: 0
16
+ }
17
+ })
18
+
19
+ // 兼容多种样式配置
20
+ const attrs = useAttrs()
21
+ const wrapperClassObject = computed(() => {
22
+ const a = attrs
23
+ const classes = {}
24
+
25
+ // 通用布尔样式开关(以存在/空字符串/'true' 为真)
26
+ // hasTopMargin: 标签增加顶部外边距,同时调整 ant-card-body 内边距
27
+ // useStyle7: 细下划线指示器样式,透明背景,支持配合 useCycle 显示圆点
28
+ // useCycle: 与 useStyle7 配合使用,在标签左侧显示蓝色圆点指示器
29
+ // useStyle8: 等宽卡片式标签,带边框和圆角,激活项高亮并隐藏底部边框
30
+ // out-tab: 去除标签栏所有外边距与内边距,实现紧凑贴边效果
31
+ // no-underline: 隐藏底部边框与 ink-bar 下划线指示器
32
+ // useStyle9: 圆角卡片标签,带边框,激活项填充品牌色,禁用切换动画
33
+ // useStyle10: 无下划线 + 左侧蓝色圆点,透明背景,激活项高亮品牌色
34
+ // useStyle11: 去除边框,选中显示蓝色下划线,字体 #313131 / #0057FE,标签宽度平均分配
35
+ const booleanStyleKeys = [
36
+ 'hasTopMargin', 'useStyle7', 'useCycle', 'useStyle8', 'out-tab', 'no-underline', 'useStyle9', 'useStyle10', 'useStyle11'
37
+ ]
38
+ for (const key of booleanStyleKeys) {
39
+ const val = a[key]
40
+ const truthy = val === true || val === '' || val === 'true'
41
+ if (truthy) classes[`h-tab-${key}`] = true
42
+ }
43
+ return classes
44
+ })
45
+
46
+ // 创建对XTab组件的引用
47
+ const xTabRef = ref()
48
+
49
+ // 获取插槽(避免模板中直接使用 $slots 触发类型检查错误)
50
+ const slots = useSlots()
51
+ const slotNames = computed(() => {
52
+ try {
53
+ return Object.keys(slots || {})
54
+ } catch (e) {
55
+ return []
56
+ }
57
+ })
58
+
59
+ // 右侧附加区域的动态配置
60
+ const extraConfig = ref(null)
61
+ const extraItems = computed(() => {
62
+ const cfg = extraConfig.value
63
+ return cfg && cfg.value ? cfg.value : []
64
+ })
65
+
66
+ // 本地异步组件映射(未全局注册时生效)
67
+ const localMap = {
68
+ 'x-input': () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
69
+ 'x-select': () => import('@vue2-client/base-client/components/his/XSelect/XSelect.vue'),
70
+ 'x-radio': () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
71
+ 'x-buttons': () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
72
+ 'x-time-select': () => import('@vue2-client/base-client/components/his/XTimeSelect/XTimeSelect.vue'),
73
+ 'h-buttons': () => import('@vue2-client/base-client/components/common/HIS/HButtons/HButtons.vue')
74
+ }
75
+
76
+ // 从 attrs 中读取 serverName 与 env(保持向后兼容)
77
+ const serverName = computed(() => (attrs && attrs.serverName))
78
+ const env = computed(() => (attrs && attrs.env) || 'prod')
79
+
80
+ const loadExtraConfig = (configName) => {
81
+ if (!configName) {
82
+ extraConfig.value = null
83
+ return
84
+ }
85
+ getConfigByName(configName, serverName.value, (res) => {
86
+ extraConfig.value = res
87
+ }, env.value === 'dev')
88
+ }
89
+
90
+ onMounted(() => {
91
+ loadExtraConfig(props.tabBarExtraConfig)
92
+ })
93
+
94
+ // 暴露方法给父组件使用
95
+ defineExpose({
96
+ // 为了兼容性,保留getXTabInstance方法
97
+ getXTabInstance: () => xTabRef.value,
98
+ })
99
+ </script>
100
+
101
+ <template>
102
+ <div
103
+ class="h-tab-wrapper"
104
+ :class="[wrapperClassObject, extraItems.length > 1 ? 'h-tab-extra-wrapper-multiple' : '']">
105
+ <x-tab
106
+ ref="xTabRef"
107
+ :tabBarGutter="props.tabBarGutter"
108
+ v-bind="$attrs"
109
+ v-on="$listeners"
110
+ >
111
+ <template v-if="extraItems.length" #tabBarExtraContent>
112
+ <!-- 父级可接管渲染;未提供则按配置兜底渲染 -->
113
+ <slot name="tabBarExtraContent" :config="extraConfig" :items="extraItems">
114
+ <div class="h-tab-extra-wrapper">
115
+ <component
116
+ v-for="(item, idx) in extraItems"
117
+ :is="localMap[item.slotType] || item.slotType"
118
+ :key="idx"
119
+ :ref="item.slotRef || `extra_${idx}`"
120
+ :serviceName="item.serviceName || serverName"
121
+ :serverName="item.serviceName || serverName"
122
+ :queryParamsName="item.slotConfig"
123
+ :env="env"
124
+ v-on="$listeners"
125
+ v-bind="item.attrs"
126
+ />
127
+ </div>
128
+ </slot>
129
+ </template>
130
+ <template v-for="name in slotNames" #[name]="slotData">
131
+ <slot :name="name" v-bind="slotData" />
132
+ </template>
133
+ </x-tab>
134
+ </div>
135
+ </template>
136
+
137
+ <style scoped lang="less">
138
+ .h-tab-wrapper {
139
+ width: 100%;
140
+ overflow: visible !important;
141
+
142
+ // 基础样式
143
+ :deep(.ant-tabs-tab-next) {
144
+ display: none;
145
+ }
146
+ :deep(.ant-tabs-nav-wrap) {
147
+ margin-top: 18px;
148
+ margin-bottom: 0;
149
+ }
150
+ :deep(.ant-tabs-nav) {
151
+ // 去除导航容器默认左右内边距,避免收缩时左侧多出一截
152
+ .ant-tabs-nav-container,
153
+ .ant-tabs-nav-scroll {
154
+ margin: 0px;
155
+ }
156
+
157
+ // 移除左右切换箭头带来的占位
158
+ .ant-tabs-tab-prev,
159
+ .ant-tabs-tab-next {
160
+ display: none !important;
161
+ width: 0 !important;
162
+ }
163
+ .ant-tabs-tab-next-icon {
164
+ display: none;
165
+ }
166
+ .ant-tabs-tab {
167
+ background-color: transparent;
168
+ border-radius: 6px 6px 0 0;
169
+ color: #5D5C5C;
170
+ font-weight: bold;
171
+ min-width: 134px;
172
+ width: auto;
173
+ font-size: 18px;
174
+ line-height: 26px;
175
+ font-family: "Source Han Sans";
176
+ transition: all 0.3s;
177
+ height: 32px;
178
+ text-align: center;
179
+ margin: 0 !important;
180
+ padding: 0 12px !important;
181
+ }
182
+ .ant-tabs-tab-active {
183
+ background-color: #0057FE;
184
+ color: #ffffff;
185
+ min-width: 134px;
186
+ width: auto;
187
+ line-height: 26px;
188
+ height: 32px;
189
+ text-align: center;
190
+ margin: 0 !important;
191
+ padding: 0 12px !important;
192
+ }
193
+ }
194
+
195
+ :deep(.ant-tabs-bar) {
196
+ border-bottom: 2px solid #0057FE;
197
+ margin: 0px 0px;
198
+ width: 100%;
199
+ height: 50px;
200
+ }
201
+
202
+ // 滚动状态下的容器左右内边距清零,避免左侧多出一截
203
+ :deep(.ant-tabs-nav-container-scrolling) {
204
+ padding-left: 0 !important;
205
+ padding-right: 0 !important;
206
+ }
207
+
208
+ :deep(.ant-tabs-tab-arrow-show) {
209
+ display: none;
210
+ }
211
+
212
+ :deep(.ant-tabs-ink-bar) {
213
+ background-color: transparent;
214
+ bottom: 0px;
215
+ display: none;
216
+ height: 0;
217
+ }
218
+
219
+ :deep(.ant-tabs-tab-prev-icon-target) {
220
+ display: none;
221
+ }
222
+
223
+ // 带顶部边距的样式
224
+ &.h-tab-hasTopMargin {
225
+ :deep(.ant-tabs-nav) {
226
+ margin-top: 6px;
227
+ }
228
+
229
+ :deep(.ant-tabs-bar) {
230
+ margin: 0 6px;
231
+ }
232
+
233
+ :deep(.ant-card-body) {
234
+ padding: 6px 0;
235
+
236
+ .ant-card-body {
237
+ padding: 6px;
238
+ }
239
+ }
240
+ }
241
+
242
+ // 通用样式7:细下划线、透明背景、可配置宽度
243
+ &.h-tab-useStyle7 {
244
+ :deep(.ant-tabs-tab-next),
245
+ :deep(.ant-tabs-tab-prev-icon-target),
246
+ :deep(.ant-tabs-tab-next-icon) { display: none; }
247
+
248
+ :deep(.ant-tabs-bar) {
249
+ border-bottom: none !important;
250
+ margin: 0 !important;
251
+ }
252
+
253
+ :deep(.ant-tabs-ink-bar) {
254
+ display: none !important;
255
+ }
256
+
257
+ :deep(.ant-tabs-nav-wrap) {
258
+ margin-top: 0 !important;
259
+ margin-bottom: 0 !important;
260
+ padding-left: 0 !important;
261
+ padding-right: 0 !important;
262
+ overflow: visible !important;
263
+ height: auto !important;
264
+ }
265
+
266
+ :deep(.ant-tabs-nav-container) {
267
+ padding-left: 0 !important;
268
+ padding-right: 0 !important;
269
+ margin: 0 !important;
270
+ height: auto !important;
271
+ }
272
+
273
+ :deep(.ant-tabs-nav-scroll) {
274
+ height: auto !important;
275
+ }
276
+
277
+ :deep(.ant-tabs-nav) {
278
+ width: 100% !important;
279
+ display: flex !important;
280
+ flex-direction: row !important;
281
+ flex-wrap: nowrap !important;
282
+
283
+ .ant-tabs-nav-list {
284
+ width: 100% !important;
285
+ display: flex !important;
286
+ flex-direction: row !important;
287
+ flex-wrap: nowrap !important;
288
+ gap: 0 !important;
289
+ }
290
+
291
+ .ant-tabs-tab {
292
+ position: relative !important;
293
+ background-color: transparent !important;
294
+ border-radius: 0 !important;
295
+ color: #313131 !important;
296
+ font-weight: bold !important;
297
+ min-width: var(--tab-min-width, 108px) !important;
298
+ width: var(--tab-width, auto) !important;
299
+ padding: 0 12px 12px !important;
300
+ font-size: 16px !important;
301
+ line-height: 38px !important;
302
+ font-family: "Source Han Sans" !important;
303
+ transition: all 0.3s !important;
304
+ height: 38px !important;
305
+ opacity: 1 !important;
306
+ text-align: center !important;
307
+ margin-right: 0 !important;
308
+ letter-spacing: 0em !important;
309
+ font-variation-settings: "opsz" auto !important;
310
+ font-feature-settings: "kern" on !important;
311
+ display: inline-flex !important;
312
+ align-items: center !important;
313
+ justify-content: center !important;
314
+ box-sizing: border-box !important;
315
+ }
316
+ .ant-tabs-tab-active {
317
+ background-color: transparent !important;
318
+ color: #0057FE !important;
319
+ font-weight: bold !important;
320
+ width: var(--tab-width, auto) !important;
321
+ padding: 0 12px 12px !important;
322
+ line-height: 38px !important;
323
+ height: 38px !important;
324
+ opacity: 1 !important;
325
+ text-align: center !important;
326
+ letter-spacing: 0em !important;
327
+ font-variation-settings: "opsz" auto !important;
328
+ font-feature-settings: "kern" on !important;
329
+ display: inline-flex !important;
330
+ align-items: center !important;
331
+ justify-content: center !important;
332
+ box-sizing: border-box !important;
333
+
334
+ &::after {
335
+ content: "" !important;
336
+ position: absolute !important;
337
+ left: 0 !important;
338
+ right: 0 !important;
339
+ bottom: 0 !important;
340
+ width: 100% !important;
341
+ height: 2px !important;
342
+ background-color: #0057FE !important;
343
+ }
344
+ }
345
+ }
346
+
347
+ // 可选:标签左侧圆点
348
+ &.h-tab-useCycle {
349
+ :deep(.ant-tabs-tab) {
350
+ position: relative !important;
351
+ padding-left: 16px !important;
352
+ margin-right: 0 !important;
353
+ height: 38px !important;
354
+ display: inline-flex !important;
355
+ align-items: center !important;
356
+ opacity: 1;
357
+ }
358
+ :deep(.ant-tabs-tab::before) {
359
+ content: "" !important;
360
+ position: absolute !important;
361
+ left: 4px !important;
362
+ width: 8px !important;
363
+ height: 8px !important;
364
+ background: #3362DA !important;
365
+ border-radius: 50% !important;
366
+ opacity: 1 !important;
367
+ display: block !important;
368
+ z-index: 1 !important;
369
+ top: auto !important;
370
+ bottom: auto !important;
371
+ transform: none !important;
372
+ }
373
+ :deep(.ant-tabs-tab-active::before) {
374
+ background: #0057FE !important;
375
+ }
376
+ :deep(.ant-tabs-nav) {
377
+ flex-wrap: nowrap !important;
378
+ }
379
+ }
380
+ }
381
+ // 用户词条使用样式
382
+ &.h-tab-useStyle8 {
383
+ :deep(.ant-tabs-tab-next),
384
+ :deep(.ant-tabs-tab-prev-icon-target),
385
+ :deep(.ant-tabs-tab-next-icon) {
386
+ display: none;
387
+ }
388
+
389
+ :deep(.ant-tabs-nav-wrap) {
390
+ margin-top: 0;
391
+ }
392
+
393
+ // Make the main Ant Design tabs container a flex column to arrange tab bar and content vertically
394
+ :deep(.ant-tabs) {
395
+ display: flex !important;
396
+ flex-direction: column !important; // 确保选项卡栏在顶部,内容区域在下方
397
+ height: auto !important; // 高度自适应
398
+ }
399
+
400
+ :deep(.ant-tabs-bar) {
401
+ border-bottom: 1px solid #d9d9d9; // 底部边框
402
+ border-right: none; // 移除右侧边框
403
+ margin-right: 0 !important; // 移除重叠修复
404
+ flex-shrink: 1 !important; // 允许收缩
405
+ height: auto !important; // 高度自适应
406
+ margin-bottom: 0px !important;
407
+ }
408
+
409
+ :deep(.ant-tabs-content) {
410
+ flex: none !important; // 移除 flex: 1,允许内容区域自然流淌
411
+ }
412
+
413
+ :deep(.ant-tabs-nav) {
414
+ .ant-tabs-nav-container,
415
+ .ant-tabs-nav-wrap,
416
+ .ant-tabs-nav-scroll,
417
+ & > div:first-child {
418
+ display: flex !important;
419
+ flex-direction: row !important;
420
+ flex-wrap: nowrap !important; // 确保不换行
421
+ width: 100% !important; // 占据全部宽度
422
+ height: auto !important;
423
+ }
424
+
425
+ height: auto !important; // 高度自适应内容
426
+ width: 100% !important; // 确保容器占据全部宽度
427
+
428
+ .ant-tabs-tab {
429
+ flex: 1 !important; // 宽度等分布局
430
+ margin-right: 0 !important;
431
+ margin-bottom: 0 !important; // 移除底部间距
432
+ border-top: 1px solid #d9d9d9;
433
+ border-left: 1px solid #d9d9d9;
434
+ border-bottom: 1px solid #d9d9d9; // 所有选项卡都有底部边框
435
+ border-right: none; // 默认没有右边框
436
+ &:last-child {
437
+ border-right: 1px solid #d9d9d9; // 最后一个选项卡有右边框
438
+ }
439
+ border-radius: 0; // 默认无圆角,避免中间相邻处出现圆角
440
+ background-color: #f5f5f5;
441
+ color: #333333;
442
+ font-weight: 500;
443
+ font-size: 16px;
444
+ height: 40px; // 固定高度
445
+ width: auto !important; // 移除固定宽度,以便等分
446
+ display: flex;
447
+ justify-content: center;
448
+ align-items: center;
449
+ padding: 0;
450
+ }
451
+ // 首项:仅左侧圆角
452
+ .ant-tabs-tab:first-child {
453
+ border-top-left-radius: 10px;
454
+ border-bottom-left-radius: 10px;
455
+ }
456
+ // 末项:仅右侧圆角
457
+ .ant-tabs-tab:last-child {
458
+ border-top-right-radius: 10px;
459
+ border-bottom-right-radius: 10px;
460
+ }
461
+ .ant-tabs-tab-active {
462
+ border-bottom: 1px solid transparent; // 激活时隐藏底部边框,与 ant-tabs-bar 的边框衔接
463
+ background-color: #0057FE;
464
+ color: #ffffff;
465
+ font-weight: 600;
466
+ }
467
+ }
468
+ :deep(.ant-tabs-ink-bar) {
469
+ display: none; // 隐藏下划线
470
+ }
471
+ }
472
+ &.h-tab-extra-wrapper-multiple {
473
+ :deep(.h-tab-extra-wrapper){
474
+ display: flex;
475
+ justify-content: end;
476
+ gap: 8px;
477
+ }
478
+ :deep(.x-radio-group){
479
+ height: 32px;
480
+ }
481
+ :deep(.x-radio-item){
482
+ height: 32px;
483
+ display: flex;
484
+ align-items: center;
485
+ margin-bottom: 0px;
486
+ }
487
+ :deep(.ant-tabs-tab){
488
+ height: 34px;
489
+ }
490
+ :deep(.ant-tabs-nav-container){
491
+ padding-top: 2px;
492
+ }
493
+ :deep(.ant-tabs-extra-content){
494
+ line-height: 0px !important;
495
+ }
496
+ }
497
+
498
+ &.h-tab-out-tab {
499
+ :deep(.ant-tabs-nav-wrap) {
500
+ margin-top: 0px !important;
501
+ margin-bottom: 0px !important;
502
+ }
503
+ :deep(.ant-tabs-nav) {
504
+ margin-bottom: 0px !important;
505
+ }
506
+ :deep(.ant-tabs-nav-container) {
507
+ padding-top: 0px !important;
508
+ padding-bottom: 0px !important;
509
+ }
510
+
511
+ :deep(.ant-tabs-bar) {
512
+ margin-top: 0px !important;
513
+ margin-bottom: 0px !important;
514
+ height: auto !important;
515
+ min-height: 0px !important;
516
+ }
517
+
518
+ :deep(.ant-tabs-content) {
519
+ margin-top: 0px !important;
520
+ }
521
+ }
522
+
523
+ // 无下划线样式:隐藏底部指示器线条和边框
524
+ &.h-tab-no-underline {
525
+ :deep(.ant-tabs-bar) {
526
+ border-bottom: none !important;
527
+ }
528
+ :deep(.ant-tabs-ink-bar) {
529
+ display: none !important;
530
+ }
531
+ }
532
+
533
+ // 样式9:圆角卡片式标签(带边框、居中文字、字体切换)
534
+ &.h-tab-useStyle9 {
535
+ :deep(.ant-tabs-tab-next),
536
+ :deep(.ant-tabs-tab-prev-icon-target),
537
+ :deep(.ant-tabs-tab-next-icon) { display: none; }
538
+
539
+ // 保持 ant-tabs 为 column 布局
540
+ :deep(.ant-tabs) {
541
+ display: flex !important;
542
+ flex-direction: column !important;
543
+ height: auto !important;
544
+ width: 100% !important;
545
+ }
546
+
547
+ // 移除 a-card 的默认样式影响
548
+ :deep(.ant-card) {
549
+ overflow: visible !important;
550
+ width: 100% !important;
551
+ }
552
+ :deep(.ant-card-body) {
553
+ padding: 0 !important;
554
+ overflow: visible !important;
555
+ }
556
+
557
+ :deep(.ant-tabs-bar) {
558
+ border-bottom: none !important;
559
+ flex-shrink: 0 !important;
560
+ height: auto !important;
561
+ margin-bottom: 0 !important;
562
+ width: 100% !important;
563
+ overflow: visible !important;
564
+ }
565
+
566
+ :deep(.ant-tabs-content) {
567
+ flex: 1 !important;
568
+ height: auto !important;
569
+ overflow: visible !important;
570
+ }
571
+
572
+ :deep(.ant-tabs-tabpane) {
573
+ overflow: visible !important;
574
+ display: block !important;
575
+ }
576
+
577
+ :deep(.ant-tabs-tabpane-active) {
578
+ overflow: visible !important;
579
+ }
580
+
581
+ // 禁用切换动画,避免抖动
582
+ :deep(.ant-tabs) {
583
+ transition: none !important;
584
+ }
585
+ :deep(.ant-tabs-tabpane) {
586
+ transition: none !important;
587
+ }
588
+
589
+ :deep(.ant-tabs-nav-wrap) {
590
+ margin: 0 !important;
591
+ padding: 0 !important;
592
+ overflow: visible !important;
593
+ position: relative !important;
594
+ display: block !important;
595
+ }
596
+
597
+ :deep(.ant-tabs-nav-container) {
598
+ padding: 0 !important;
599
+ overflow: visible !important;
600
+ display: block !important;
601
+ }
602
+
603
+ :deep(.ant-tabs-nav) {
604
+ display: flex !important;
605
+ flex-direction: row !important;
606
+ flex-wrap: nowrap !important;
607
+ width: auto !important;
608
+ max-width: 100% !important;
609
+ height: auto !important;
610
+ margin: 0 !important;
611
+ overflow: visible !important;
612
+
613
+ .ant-tabs-tab {
614
+ flex: none;
615
+ width: auto;
616
+ min-width: 100px;
617
+ box-sizing: border-box;
618
+ border: 1px solid #E5E9F0;
619
+ border-radius: 6px;
620
+ background: #FFFFFF;
621
+ color: #333333;
622
+ font-family: "Source Han Sans";
623
+ font-size: 18px;
624
+ font-weight: bold;
625
+ line-height: 32px;
626
+ height: 32px;
627
+ text-align: center;
628
+ margin: 0 !important;
629
+ padding: 0 16px !important;
630
+ overflow: hidden !important;
631
+ }
632
+ .ant-tabs-tab-active {
633
+ background-color: #0057FE;
634
+ color: #ffffff;
635
+ font-weight: bold;
636
+ border: 1px solid #0057FE;
637
+ }
638
+ }
639
+
640
+ :deep(.ant-tabs-ink-bar) {
641
+ display: none;
642
+ }
643
+ }
644
+ // 样式10:无下划线、左侧绿色圆点、字体样式切换
645
+ &.h-tab-useStyle10 {
646
+ :deep(.ant-tabs-tab-next),
647
+ :deep(.ant-tabs-tab-prev-icon-target),
648
+ :deep(.ant-tabs-tab-next-icon) { display: none; }
649
+
650
+ :deep(.ant-tabs-bar) {
651
+ border-bottom: none !important;
652
+ }
653
+
654
+ :deep(.ant-tabs-ink-bar) {
655
+ display: none !important;
656
+ }
657
+
658
+ :deep(.ant-tabs-nav-wrap) {
659
+ margin-top: 0;
660
+ padding-left: 0 !important;
661
+ padding-right: 0 !important;
662
+ }
663
+
664
+ :deep(.ant-tabs-nav-container) {
665
+ padding-left: 0 !important;
666
+ padding-right: 0 !important;
667
+ }
668
+
669
+ :deep(.ant-tabs-nav) {
670
+ display: flex;
671
+ flex-wrap: wrap;
672
+ gap: 8px;
673
+ .ant-tabs-tab {
674
+ position: relative;
675
+ background-color: transparent;
676
+ border-radius: 0;
677
+ color: #313131;
678
+ font-family: "Source Han Sans";
679
+ font-size: 16px;
680
+ font-weight: bold;
681
+ line-height: normal;
682
+ letter-spacing: 0em;
683
+ font-feature-settings: "kern" on;
684
+ font-variation-settings: "opsz" auto;
685
+ width: auto;
686
+ padding: 0 12px 6px;
687
+ padding-left: 18px !important;
688
+ transition: all 0.3s;
689
+ height: 40px;
690
+ text-align: center;
691
+ margin-right: 0px !important;
692
+ display: inline-flex !important;
693
+ align-items: center;
694
+ vertical-align: top;
695
+ }
696
+ .ant-tabs-tab::before {
697
+ content: "" !important;
698
+ position: absolute !important;
699
+ left: 0 !important;
700
+ top: 50% !important;
701
+ transform: translateY(-50%) !important;
702
+ width: 8px !important;
703
+ height: 8px !important;
704
+ background: #0057FE !important;
705
+ border-radius: 50% !important;
706
+ display: block !important;
707
+ z-index: 1 !important;
708
+ }
709
+ .ant-tabs-tab-active {
710
+ background-color: transparent;
711
+ color: #0057FE;
712
+ font-weight: bold;
713
+ width: auto;
714
+ padding: 0 12px 6px;
715
+ padding-left: 18px !important;
716
+ height: 40px;
717
+ text-align: center;
718
+ }
719
+ .ant-tabs-tab-active::before {
720
+ background: #0057FE !important;
721
+ }
722
+ }
723
+ }
724
+
725
+ // 样式11:去除边框、选中显示蓝色下划线,标签宽度平均分配
726
+ &.h-tab-useStyle11 {
727
+ :deep(.ant-tabs-tab-next),
728
+ :deep(.ant-tabs-tab-prev-icon-target),
729
+ :deep(.ant-tabs-tab-next-icon) { display: none; }
730
+
731
+ :deep(.ant-tabs-bar) {
732
+ border-bottom: none !important;
733
+ height: 32px !important;
734
+ line-height: 32px !important;
735
+ }
736
+
737
+ :deep(.ant-tabs-ink-bar) {
738
+ display: block !important;
739
+ background-color: #0057FE !important;
740
+ bottom: 0px !important;
741
+ height: 2px !important;
742
+ margin-left: 0 !important;
743
+ }
744
+
745
+ :deep(.ant-tabs-nav-wrap) {
746
+ margin-top: 0;
747
+ padding-left: 0 !important;
748
+ padding-right: 0 !important;
749
+ width: 100% !important;
750
+ }
751
+
752
+ :deep(.ant-tabs-nav-container) {
753
+ padding-left: 0 !important;
754
+ padding-right: 0 !important;
755
+ width: 100% !important;
756
+ }
757
+
758
+ :deep(.ant-tabs-nav-container-scrolling) {
759
+ padding-left: 0 !important;
760
+ padding-right: 0 !important;
761
+ }
762
+
763
+ :deep(.ant-tabs-nav) {
764
+ width: 100% !important;
765
+
766
+ .ant-tabs-nav-list {
767
+ width: 100% !important;
768
+ display: grid !important;
769
+ grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
770
+ }
771
+
772
+ .ant-tabs-tab {
773
+ width: 50%;
774
+ height: 32px;
775
+ box-sizing: border-box !important;
776
+ opacity: 1;
777
+ font-family: "Source Han Sans";
778
+ font-size: 16px;
779
+ font-weight: bold;
780
+ line-height: normal;
781
+ text-align: center;
782
+ letter-spacing: 0em;
783
+ color: #313131;
784
+ background-color: transparent;
785
+ border: none;
786
+ border-radius: 0;
787
+ padding: 0 12px 6px;
788
+ margin-right: 16px !important;
789
+ display: inline-flex !important;
790
+ align-items: center;
791
+ justify-content: center;
792
+ transition: all 0.3s;
793
+ }
794
+
795
+ .ant-tabs-tab-active {
796
+ color: #0057FE;
797
+ background-color: transparent;
798
+ border: none;
799
+ }
800
+ }
801
+ }
802
+ }
803
+ </style>