You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

773 lines
22 KiB

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
  1. <template>
  2. <div class="productContent">
  3. <div class="selectBox" @click="handelMenu" :class="{ 'active': isOpen }">
  4. <span class="placeholder" :style="{ color: selectedItem ? '#333' : '#A8ABB2' }">
  5. {{ selectedItem || placeholder }}
  6. </span>
  7. <span class="arrow">
  8. <el-icon>
  9. <ArrowDown />
  10. </el-icon>
  11. </span>
  12. </div>
  13. <div class="menu" v-show="isOpen">
  14. <div class="coinselect" @click="coinhandelMenu" :class="{ 'active': coinisOpen, 'disabled-menu': restrictType === 'software' }">
  15. <div class="cointxt">
  16. {{ t('cash.goldProduct') }}
  17. </div>
  18. <span class="coin-arrow">
  19. <el-icon>
  20. <ArrowDown />
  21. </el-icon>
  22. </span>
  23. </div>
  24. <div class="coinoption" v-show="coinisOpen">
  25. <el-radio v-model="selectedValue" :label="t('cash.coinRecharge')" size="large" />
  26. </div>
  27. <div class="product">
  28. <div class="coinselect" @click="producthandelMenu" :class="{ 'active': productisOpen, 'disabled-menu': restrictType === 'gold' }">
  29. <div class="cointxt">
  30. {{ t('cash.softwareProduct') }}
  31. </div>
  32. <span class="coin-arrow">
  33. <el-icon>
  34. <ArrowDown />
  35. </el-icon>
  36. </span>
  37. </div>
  38. <div class="productOption" v-show="productisOpen">
  39. <hr class="line">
  40. <div class="checktxt">{{ t('cash.software') }}</div>
  41. <div class="marketprodut">
  42. <div class="fistlevel" v-for="(menu, index) in menuData" :key="menu.name" @click="clickmenu(index)"
  43. :class="{ 'selected': menu.options.includes(selectedValue) }">
  44. <div class="label">
  45. {{ menu.name }}
  46. <el-icon :class="{ 'rotate': activeIndex === index }">
  47. <ArrowDown />
  48. </el-icon>
  49. </div>
  50. <div v-show="activeIndex == index" class="selectoption" @click.stop>
  51. <el-radio-group v-model="selectedValue">
  52. <div class="option" v-for="product in menu.options" :key="product">
  53. <el-radio :label="product">
  54. {{ product }}
  55. </el-radio>
  56. </div>
  57. </el-radio-group>
  58. </div>
  59. </div>
  60. </div>
  61. <hr class="line">
  62. <div class="ai">
  63. <div class="checktxt">{{ t('cash.aiService.aiDetectionTool') }}</div>
  64. <hr class="line">
  65. <el-radio-group v-model="selectedValue">
  66. <el-radio v-for="ai in AIProduct" :key="ai" :label="ai" :value="ai">
  67. {{ ai }}
  68. </el-radio>
  69. </el-radio-group>
  70. </div>
  71. <div class="ai">
  72. <div class="checktxt">{{ t('cash.aiService.superDetectionTool') }}</div>
  73. <hr class="line">
  74. <el-radio-group v-model="selectedValue">
  75. <el-radio v-for="ai in superProduct" :key="ai" :label="ai" :value="ai">
  76. {{ ai }}
  77. </el-radio>
  78. </el-radio-group>
  79. </div>
  80. <div class="ai">
  81. <div class="checktxt">{{ t('cash.other') }}</div>
  82. <hr class="line">
  83. <!-- Native implementation replacing el-radio-group -->
  84. <div class="native-radio-group">
  85. <div v-for="ai in InfoFee" :key="ai" class="radio-wrapper native-wrapper">
  86. <div class="native-radio-item" @click="handleClick(ai)">
  87. <span class="native-radio-input" :class="{ 'is-checked': selectedValue === ai }">
  88. <span class="native-radio-inner"></span>
  89. </span>
  90. <span class="native-radio-label" :class="{ 'is-checked': selectedValue === ai }">{{ ai }}</span>
  91. </div>
  92. </div>
  93. <div class="native-radio-item" @click=" showPanel = !showPanel">
  94. <span class="native-radio-input" :class="{ 'is-checked': ifHcInfo }">
  95. <span class="native-radio-inner"></span>
  96. </span>
  97. <span class="native-radio-label" :class="{ 'is-checked': ifHcInfo }">{{ t('cash.HC')
  98. }}</span>
  99. <div v-if="showPanel" class="native-cascader-panel" @click.stop>
  100. <div class="cascader-menu">
  101. <div v-for="opt in cascaderOptions" :key="opt.value" class="cascader-node"
  102. :class="{ 'is-active': activeCascaderOption?.value === opt.value }"
  103. @mouseenter="activeCascaderOption = opt">
  104. <span class="cascader-label">{{ opt.label }}</span>
  105. <el-icon class="cascader-icon">
  106. <ArrowRight />
  107. </el-icon>
  108. </div>
  109. </div>
  110. <div class="cascader-menu sub-menu" v-if="activeCascaderOption">
  111. <div v-for="child in activeCascaderOption.children" :key="child.value" class="cascader-node"
  112. @click="handlePanelChange([activeCascaderOption.value, child.value])">
  113. <span class="cascader-label">{{ child.label }}</span>
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. <hr>
  123. <div class="selected-value">{{ t('common.selectedValue') }}{{ selectedValue ? `${selectedValue}` :
  124. t('common.none') }}</div>
  125. <div class="confirm">
  126. <el-button type="info" @click="cancelSelection">{{ t('common.cancel') }}</el-button>
  127. <el-button type="primary" @click="confirmSelection">{{ t('common.confirm') }}</el-button>
  128. </div>
  129. </div>
  130. </div>
  131. </template>
  132. <script setup>
  133. import { ref, watch, onMounted, computed, onUnmounted, nextTick } from 'vue';
  134. import { ArrowDown, ArrowRight } from '@element-plus/icons-vue';
  135. import { useFormItem } from 'element-plus';
  136. // 国际化
  137. import { useI18n } from 'vue-i18n'
  138. const { t } = useI18n()
  139. const { formItem } = useFormItem()
  140. const searchData = ref('')
  141. const isOpen = ref(false)
  142. const coinisOpen = ref(false)
  143. const productisOpen = ref(false)
  144. const selectedItem = ref('')
  145. const dropdownRef = ref(null)
  146. const placeholder = ref(t('common_add.productNamePlaceholder'))
  147. const handelMenu = () => {
  148. isOpen.value = !isOpen.value
  149. ifselectAndOpen()
  150. }
  151. const coinhandelMenu = () => {
  152. if (props.restrictType === 'software') return;
  153. coinisOpen.value = !coinisOpen.value
  154. }
  155. const producthandelMenu = () => {
  156. if (props.restrictType === 'gold') return;
  157. productisOpen.value = !productisOpen.value
  158. }
  159. // 接收父组件通过 v-model 传入的值
  160. const props = defineProps({
  161. modelValue: {
  162. type: String,
  163. default: ''
  164. },
  165. restrictType: {
  166. type: String,
  167. default: 'all' // 'all', 'gold', 'software'
  168. }
  169. })
  170. const emit = defineEmits(['update:modelValue', 'change'])
  171. const selectedValue = ref('')
  172. const confirmSelection = () => {
  173. emit('update:modelValue', selectedValue.value)
  174. emit('change', selectedValue.value)
  175. selectedItem.value = selectedValue.value
  176. formItem?.validate('change').catch(() => { })
  177. isOpen.value = false
  178. }
  179. const cancelSelection = () => {
  180. selectedValue.value = props.modelValue
  181. selectedItem.value = props.modelValue || ''
  182. isOpen.value = false
  183. showPanel.value = false
  184. }
  185. const AIProduct = [
  186. t('cash.aiService.aiTracking'),
  187. t('cash.aiService.aiAttack'),
  188. t('cash.aiService.aiFunds'),
  189. t('cash.aiService.aiActivity'),
  190. t('cash.aiService.aiDetectionTool')
  191. ]
  192. const superProduct = [
  193. t('cash.aiService.superPerspective'),
  194. t('cash.aiService.superAmbush'),
  195. t('cash.aiService.superHunting'),
  196. t('cash.aiService.superPulse'),
  197. t('cash.aiService.superCompass'),
  198. t('cash.aiService.superDetectionTool')
  199. ]
  200. const InfoFee = [
  201. t('cash.staticInfoFee'),
  202. t('cash.BGmember'),
  203. ]
  204. const showPanel = ref(false)
  205. const activeCascaderOption = ref(null)
  206. const handleClick = (ai) => {
  207. selectedValue.value = ai;
  208. }
  209. const cascaderValue = ref([])
  210. const handlePanelChange = (val) => {
  211. selectedValue.value = val[val.length - 1]
  212. showPanel.value = false // 选择后关闭面板
  213. console.log('selectedValue.value', selectedValue.value);
  214. }
  215. const ifHcInfo = ref(false)
  216. const checkIfHcINFO = () => {
  217. ifHcInfo.value = cascaderOptions.some(group =>
  218. group.children && group.children.some(child => child.value === selectedValue.value)
  219. )
  220. console.log('ifHcInfo.value', ifHcInfo.value);
  221. }
  222. // 级联选择器数据源
  223. const cascaderOptions = [
  224. {
  225. value: 'realTime',
  226. label: t('cash.aiService.realTime'),
  227. children: [
  228. { value: t('cash.aiService.HCInfoFeeRealTimeUS'), label: t('cash.softwareMenu.usStock') },
  229. { value: t('cash.aiService.HCInfoFeeRealTimeHK'), label: t('cash.softwareMenu.hkStock') },
  230. { value: t('cash.aiService.HCInfoFeeRealTimeMalaysiaStock'), label: t('cash.softwareMenu.malaysiaStock') },
  231. { value: t('cash.aiService.HCInfoFeeRealTimeAStock'), label: t('cash.softwareMenu.aStock') },
  232. { value: t('cash.aiService.HCInfoFeeRealTimeSingaporeStock'), label: t('cash.softwareMenu.singaporeStock') },
  233. { value: t('cash.aiService.HCInfoFeeRealTimeJapanStock'), label: t('cash.softwareMenu.japanStock') },
  234. { value: t('cash.aiService.HCInfoFeeRealTimeThailandStock'), label: t('cash.softwareMenu.thailandStock') },
  235. { value: t('cash.aiService.HCInfoFeeRealTimeVietnamStock'), label: t('cash.softwareMenu.vietnamStock') },
  236. { value: t('cash.aiService.HCInfoFeeRealTimeIndonesiaStock'), label: t('cash.softwareMenu.indonesiaStock') },
  237. { value: t('cash.aiService.HCInfoFeeRealTimeKoreaStock'), label: t('cash.softwareMenu.koreaStock') },
  238. { value: t('cash.aiService.HCInfoFeeRealTimeTaiwanStock'), label: t('cash.softwareMenu.taiwanStock') }
  239. ]
  240. },
  241. {
  242. value: 'delayed',
  243. label: t('cash.aiService.delayed'),
  244. children: [
  245. { value: t('cash.aiService.HCInfoFeeDelayUS'), label: t('cash.softwareMenu.usStock') },
  246. { value: t('cash.aiService.HCInfoFeeDelayHK'), label: t('cash.softwareMenu.hkStock') },
  247. { value: t('cash.aiService.HCInfoFeeDelayMalaysiaStock'), label: t('cash.softwareMenu.malaysiaStock') },
  248. { value: t('cash.aiService.HCInfoFeeDelayAStock'), label: t('cash.softwareMenu.aStock') },
  249. { value: t('cash.aiService.HCInfoFeeDelaySingaporeStock'), label: t('cash.softwareMenu.singaporeStock') },
  250. { value: t('cash.aiService.HCInfoFeeDelayJapanStock'), label: t('cash.softwareMenu.japanStock') },
  251. { value: t('cash.aiService.HCInfoFeeDelayThailandStock'), label: t('cash.softwareMenu.thailandStock') },
  252. { value: t('cash.aiService.HCInfoFeeDelayVietnamStock'), label: t('cash.softwareMenu.vietnamStock') },
  253. { value: t('cash.aiService.HCInfoFeeDelayIndonesiaStock'), label: t('cash.softwareMenu.indonesiaStock') },
  254. { value: t('cash.aiService.HCInfoFeeDelayKoreaStock'), label: t('cash.softwareMenu.koreaStock') },
  255. { value: t('cash.aiService.HCInfoFeeDelayTaiwanStock'), label: t('cash.softwareMenu.taiwanStock') }
  256. ]
  257. }
  258. ]
  259. watch(selectedValue, () => {
  260. checkIfHcINFO();
  261. }, { immediate: true });
  262. // 使用多语言字段重新构建menuData
  263. const menuData = [
  264. {
  265. name: t('cash.softwareMenu.usStock'),
  266. options: [
  267. t('cash.softwareMenu.usStockSoftware'),
  268. t('cash.softwareMenu.usStockGoldCard'),
  269. t('cash.softwareMenu.usStockPackage')
  270. ]
  271. },
  272. {
  273. name: t('cash.softwareMenu.hkStock'),
  274. options: [
  275. t('cash.softwareMenu.hkStockSoftware'),
  276. t('cash.softwareMenu.hkStockGoldCard'),
  277. t('cash.softwareMenu.hkStockPackage')
  278. ]
  279. },
  280. {
  281. name: t('cash.softwareMenu.aStock'),
  282. options: [
  283. t('cash.softwareMenu.aStockSoftware'),
  284. t('cash.softwareMenu.aStockGoldCard'),
  285. t('cash.softwareMenu.aStockPackage')
  286. ]
  287. },
  288. {
  289. name: t('cash.softwareMenu.singaporeStock'),
  290. options: [
  291. t('cash.softwareMenu.singaporeStockSoftware'),
  292. t('cash.softwareMenu.singaporeStockGoldCard'),
  293. t('cash.softwareMenu.singaporeStockPackage')
  294. ]
  295. },
  296. {
  297. name: t('cash.softwareMenu.malaysiaStock'),
  298. options: [
  299. t('cash.softwareMenu.malaysiaStockSoftware'),
  300. t('cash.softwareMenu.malaysiaStockGoldCard'),
  301. t('cash.softwareMenu.malaysiaStockPackage')
  302. ]
  303. },
  304. {
  305. name: t('cash.softwareMenu.japanStock'),
  306. options: [
  307. t('cash.softwareMenu.japanStockSoftware'),
  308. t('cash.softwareMenu.japanStockGoldCard'),
  309. t('cash.softwareMenu.japanStockPackage')
  310. ]
  311. },
  312. {
  313. name: t('cash.softwareMenu.thailandStock'),
  314. options: [
  315. t('cash.softwareMenu.thailandStockSoftware'),
  316. t('cash.softwareMenu.thailandStockGoldCard'),
  317. t('cash.softwareMenu.thailandStockPackage')
  318. ]
  319. },
  320. {
  321. name: t('cash.softwareMenu.vietnamStock'),
  322. options: [
  323. t('cash.softwareMenu.vietnamStockSoftware'),
  324. t('cash.softwareMenu.vietnamStockGoldCard'),
  325. t('cash.softwareMenu.vietnamStockPackage')
  326. ]
  327. },
  328. {
  329. name: t('cash.softwareMenu.indonesiaStock'),
  330. options: [
  331. t('cash.softwareMenu.indonesiaStockSoftware'),
  332. t('cash.softwareMenu.indonesiaStockGoldCard'),
  333. t('cash.softwareMenu.indonesiaStockPackage')
  334. ]
  335. },
  336. {
  337. name: t('cash.softwareMenu.koreaStock'),
  338. options: [
  339. t('cash.softwareMenu.koreaStockSoftware'),
  340. t('cash.softwareMenu.koreaStockGoldCard'),
  341. t('cash.softwareMenu.koreaStockPackage')
  342. ]
  343. },
  344. {
  345. name: t('cash.softwareMenu.taiwanStock'),
  346. options: [
  347. t('cash.softwareMenu.taiwanStockSoftware'),
  348. t('cash.softwareMenu.taiwanStockGoldCard'),
  349. t('cash.softwareMenu.taiwanStockPackage')
  350. ]
  351. }
  352. ];
  353. //全局事件实现点击外部关闭选项
  354. const closeSoftwareSubmenu = () => {
  355. activeIndex.value = -1; // 将展开的二级菜单索引重置为 -1,实现关闭
  356. };
  357. const closeWholeDropdown = () => {
  358. isOpen.value = false; // 关闭整个弹窗
  359. // 可选:同时关闭弹窗内的子面板(如金币产品、软件产品展开面板)
  360. coinisOpen.value = false;
  361. productisOpen.value = false;
  362. closeSoftwareSubmenu(); // 同时关闭软件二级选项框
  363. };
  364. const handleGlobalClick = (e) => {
  365. // --- 原有:处理软件二级选项框外部关闭逻辑 ---
  366. if (productisOpen.value) {
  367. const submenuContainers = document.querySelectorAll('.selectoption');
  368. const firstLevelContainers = document.querySelectorAll('.fistlevel');
  369. let isClickInsideSubmenu = false;
  370. let isClickInsideFirstLevel = false;
  371. submenuContainers.forEach(container => container.contains(e.target) && (isClickInsideSubmenu = true));
  372. firstLevelContainers.forEach(container => container.contains(e.target) && (isClickInsideFirstLevel = true));
  373. if (!isClickInsideSubmenu && !isClickInsideFirstLevel) {
  374. closeSoftwareSubmenu();
  375. }
  376. }
  377. // --- 新增:处理整个弹窗外部关闭逻辑 ---
  378. if (isOpen.value) { // 仅当弹窗处于打开状态时判断
  379. // 获取整个下拉弹窗的 DOM 容器
  380. const dropdownContainer = document.querySelector('.menu');
  381. // 获取弹窗触发按钮(类名 .selectBox),点击按钮需正常切换弹窗,不触发关闭
  382. const triggerButton = document.querySelector('.selectBox');
  383. // 点击位置不在弹窗内,且不在触发按钮内 → 关闭整个弹窗
  384. if (!dropdownContainer?.contains(e.target) && !triggerButton?.contains(e.target)) {
  385. closeWholeDropdown();
  386. }
  387. }
  388. };
  389. const ifselectAndOpen = async () => {
  390. await nextTick();
  391. if (selectedValue.value == t('cash.coinRecharge')) {
  392. coinisOpen.value = true
  393. } else if (selectedValue.value) {
  394. productisOpen.value = true
  395. } else {
  396. //不做处理
  397. }
  398. }
  399. //软件相关
  400. const activeIndex = ref(-1)
  401. const clickmenu = (index) => {
  402. activeIndex.value = activeIndex.value === index ? -1 : index;
  403. }
  404. const resetSelect = () => {
  405. selectedValue.value = ''; // 重置选中值
  406. selectedItem.value = ''; // 重置显示文本
  407. isOpen.value = false; // 关闭下拉菜单
  408. coinisOpen.value = false; // 关闭金币产品子菜单
  409. productisOpen.value = false; // 关闭软件产品子菜单
  410. activeIndex.value = -1; // 关闭二级菜单
  411. };
  412. watch(() => props.modelValue, (newVal) => {
  413. selectedItem.value = newVal;
  414. selectedValue.value = newVal;
  415. checkIfHcINFO();
  416. }, { immediate: true });
  417. onMounted(async () => {
  418. console.log('打开组件', props.modelValue);
  419. selectedValue.value = props.modelValue;
  420. selectedItem.value = selectedValue.value || '';
  421. document.addEventListener('click', handleGlobalClick); // 绑定全局事件
  422. });
  423. onUnmounted(() => {
  424. selectedValue.value = '';
  425. document.removeEventListener('click', handleGlobalClick); // 解绑全局事件
  426. });
  427. defineExpose({ resetSelect });
  428. </script>
  429. <style scoped lang="scss">
  430. .productContent {
  431. position: relative;
  432. width: 450px;
  433. font-family: 'Arial', sans-serif;
  434. }
  435. .selectBox {
  436. border: 1px solid #e5e7eb;
  437. padding: 4px 12px;
  438. height: 23px;
  439. cursor: pointer;
  440. display: flex;
  441. justify-content: space-between;
  442. align-items: center;
  443. background-color: #fff;
  444. border-radius: 6px;
  445. transition: all 0.3s ease;
  446. .placeholder {
  447. flex: 1;
  448. font-size: 14px;
  449. line-height: 18px;
  450. color: #A8ABB2;
  451. }
  452. }
  453. .arrow {
  454. margin-left: 8px;
  455. color: #999;
  456. transition: transform 0.3s ease;
  457. }
  458. .selectBox.active .arrow {
  459. transform: rotate(180deg);
  460. }
  461. .menu {
  462. position: absolute;
  463. top: 100%;
  464. left: 0;
  465. width: 200%;
  466. min-height: 200px;
  467. display: flex;
  468. padding: 10px;
  469. flex-direction: column;
  470. align-items: flex-start;
  471. gap: 10px;
  472. flex-shrink: 0;
  473. border-radius: 8px;
  474. background: #E4F0FC;
  475. box-shadow: 0 0 4px 0 #00000040;
  476. z-index: 3000;
  477. .coinselect {
  478. width: 126px;
  479. height: 20px;
  480. border: 1px solid #175BE5;
  481. padding: 5px 0 5px 12px;
  482. display: flex;
  483. border-radius: 5px;
  484. &.disabled-menu {
  485. cursor: not-allowed;
  486. opacity: 0.5;
  487. background-color: #f5f7fa;
  488. }
  489. .cointxt {
  490. width: 100px;
  491. height: 100%;
  492. display: flex;
  493. justify-content: center;
  494. align-items: center;
  495. color: #175be5;
  496. text-align: center;
  497. font-family: "PingFang SC";
  498. font-size: 14px;
  499. font-style: normal;
  500. font-weight: 700;
  501. line-height: 20px;
  502. }
  503. }
  504. .coin-arrow {
  505. flex: 1;
  506. display: flex;
  507. justify-content: center;
  508. align-items: center;
  509. color: #175BE5;
  510. }
  511. .coinselect.active .coin-arrow {
  512. transform: rotate(-90deg);
  513. }
  514. .product {
  515. width: 100%;
  516. .line {
  517. display: flex;
  518. height: 1px;
  519. padding: 0 16px;
  520. align-items: flex-start;
  521. align-content: flex-start;
  522. gap: 8px 60px;
  523. flex-shrink: 0;
  524. align-self: stretch;
  525. flex-wrap: wrap;
  526. border-top: 1px solid #7E91FF;
  527. }
  528. .checktxt {
  529. color: #5870ff;
  530. font-family: "PingFang SC";
  531. font-size: 13px;
  532. font-style: normal;
  533. font-weight: 700;
  534. line-height: 22px;
  535. margin: 10px 20px;
  536. }
  537. .productOption {
  538. width: 100%;
  539. .ai {
  540. width: 100%;
  541. .radio-wrapper {
  542. position: relative;
  543. display: inline-block;
  544. margin-right: 32px;
  545. }
  546. }
  547. .marketprodut {
  548. width: 100%;
  549. display: flex;
  550. flex-wrap: wrap;
  551. gap: 10px;
  552. .fistlevel {
  553. position: relative;
  554. width: 130px;
  555. .label .el-icon {
  556. margin-left: 5px;
  557. transition: transform 0.3s ease;
  558. }
  559. .label .rotate {
  560. transform: rotate(-90deg); // 箭头旋转效果
  561. }
  562. .label {
  563. margin-left: 10px;
  564. }
  565. .selectoption {
  566. width: 100px;
  567. background-color: #fff;
  568. padding: 5px 20px;
  569. position: absolute;
  570. left: 60px;
  571. top: 0;
  572. z-index: 999;
  573. border: 1px solid #175BE5;
  574. border-radius: 6px;
  575. :deep(.el-checkbox__label) {
  576. color: #333333;
  577. font-family: "PingFang SC";
  578. font-size: 13px;
  579. font-style: normal;
  580. font-weight: 400;
  581. line-height: 22px;
  582. }
  583. }
  584. }
  585. .fistlevel.selected .label {
  586. color: #175BE5;
  587. }
  588. }
  589. }
  590. }
  591. .selected-value {
  592. width: 100%;
  593. color: #5870ff;
  594. font-size: 12px;
  595. text-align: center;
  596. border-top: 1px solid #7E91FF;
  597. padding-top: 10px;
  598. }
  599. .confirm {
  600. width: 100%;
  601. padding: 10px 0;
  602. display: flex;
  603. justify-content: center;
  604. gap: 50px;
  605. }
  606. }
  607. /* Native Radio Styles */
  608. .native-radio-group {
  609. display: inline-block;
  610. }
  611. .native-radio-item {
  612. position: relative;
  613. display: inline-flex;
  614. align-items: center;
  615. cursor: pointer;
  616. margin-right: 0;
  617. }
  618. .native-radio-input {
  619. white-space: nowrap;
  620. cursor: pointer;
  621. outline: none;
  622. display: inline-flex;
  623. position: relative;
  624. vertical-align: middle;
  625. width: 14px;
  626. height: 14px;
  627. background-color: #fff;
  628. border: 1px solid #dcdfe6;
  629. border-radius: 50%;
  630. box-sizing: border-box;
  631. margin-right: 8px;
  632. &.is-checked {
  633. border-color: #409eff;
  634. background: #409eff;
  635. .native-radio-inner {
  636. width: 4px;
  637. height: 4px;
  638. border-radius: 50%;
  639. background-color: #fff;
  640. position: absolute;
  641. left: 50%;
  642. top: 50%;
  643. transform: translate(-50%, -50%);
  644. }
  645. }
  646. }
  647. .native-radio-label {
  648. font-size: 14px;
  649. color: #606266;
  650. &.is-checked {
  651. color: #409eff;
  652. }
  653. }
  654. /* Native Cascader Styles */
  655. .native-cascader-panel {
  656. position: absolute;
  657. top: -36px;
  658. left: 100px;
  659. /* Adjust as needed */
  660. z-index: 1000;
  661. background: #E4F0FC;
  662. border: 1px solid #e4e7ed;
  663. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  664. border-radius: 4px;
  665. display: flex;
  666. max-height: 100px;
  667. }
  668. .cascader-menu {
  669. min-width: 150px;
  670. padding: 6px 0;
  671. background: #E4F0FC;
  672. border-right: 1px solid #e4e7ed;
  673. &:last-child {
  674. border-right: none;
  675. }
  676. &.sub-menu {
  677. /* Slightly different bg for submenu */
  678. overflow-y: auto;
  679. height: 150px;
  680. }
  681. }
  682. .cascader-node {
  683. padding: 8px 15px;
  684. display: flex;
  685. align-items: center;
  686. justify-content: space-between;
  687. cursor: pointer;
  688. font-size: 14px;
  689. color: #606266;
  690. &:hover,
  691. &.is-active {
  692. background-color: #f5f7fa;
  693. color: #409eff;
  694. }
  695. .cascader-icon {
  696. font-size: 12px;
  697. margin-left: 10px;
  698. color: #c0c4cc;
  699. }
  700. }
  701. </style>