vue2-client 1.22.2 → 1.22.3

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