LightMatrix.vue 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052
  1. <template>
  2. <div class="light-matrix">
  3. <div class="panel">
  4. <div class="dot left top"></div>
  5. <div class="dot left bottom"></div>
  6. <div class="dot right top"></div>
  7. <div class="dot right bottom"></div>
  8. <Row>
  9. <Col :span="3">
  10. <div class="panel-item-gf">
  11. <div class="panel-item-gf-left">
  12. <div class="loop"></div>
  13. <span class="svg-icon svg-icon-gray svg-icon-md">
  14. <SvgIcon svgid="svg-photovoltaic"></SvgIcon>
  15. </span>
  16. </div>
  17. <div class="panel-item-gf-right">
  18. <div class="panel-item-gf-up">接入光伏</div>
  19. <div class="panel-item-gf-down">{{ sourceMap[panelData.first.key] || "---" }}</div>
  20. </div>
  21. </div>
  22. <!-- <div class="panel-item-gf-new">
  23. <div class="panel-left">
  24. <i class="svg-icon svg-icon-write">
  25. <SvgIcon :svgid="'svg-photovoltaic'"></SvgIcon>
  26. </i>
  27. </div>
  28. <div class="panel-right">
  29. <span class="text">接入光伏</span>
  30. <span class="value">
  31. {{ sourceMap[panelData.first.key] || "---" }}
  32. <span class="unit">台</span>
  33. </span>
  34. </div>
  35. </div> -->
  36. </Col>
  37. <Col :span="3" v-for="(data, index) of panelData.datas" :key="index">
  38. <div class="panel-item-new" :class="data.color">
  39. <div class="panel-left">
  40. <i class="svg-icon" :class="'svg-icon-' + data.color">
  41. <SvgIcon :svgid="data.nameIcon"></SvgIcon>
  42. </i>
  43. <!-- <span class="text">{{ data.text1 }}</span> -->
  44. </div>
  45. <div class="panel-right">
  46. <span class="text">台数</span>
  47. <span class="value">
  48. {{ sourceMap[data.key1] || "---" }}
  49. </span>
  50. <span class="unit">台</span>
  51. </div>
  52. </div>
  53. </Col>
  54. </Row>
  55. </div>
  56. <el-scrollbar>
  57. <div class="panel-box">
  58. <div v-for="(pItem, pIndex) in sourceMap.fjmap" :key="pIndex">
  59. <div class="panel-title">
  60. <div class="panel-title-name">
  61. <i class="svg-icon svg-icon-sm svg-icon-green">
  62. <SvgIcon svgid="svg-photovoltaic"></SvgIcon>
  63. </i>
  64. <span>{{ sourceMap.fczbmap[pItem[pIndex].wpId].name }}</span>
  65. <div class="sub-title-item" v-for="(data, index) of tables.subTitleDatas" :key="index">
  66. <span class="sub-title">{{ data.text }}</span>
  67. <span class="sub-count" :class="data.color">{{ sourceMap.fczbmap[pItem[pIndex].wpId][data.key] }}</span>
  68. </div>
  69. </div>
  70. </div>
  71. <div class="panel-body">
  72. <div class="card" v-for="(cItem, cIndex) in pItem" :key="cIndex" :class="cItem.color">
  73. <div class="card-panel">
  74. <div class="card-left">
  75. <div class="tag">{{ cItem.wtnum }}</div>
  76. <div class="icon">
  77. <span class="svg-icon svg-icon-sm" :class="cItem.color == 'black' ? 'svg-icon-black' : cItem.color == 'gray' ? 'svg-icon-gray' : 'svg-icon-write'">
  78. <SvgIcon :svgid="cItem.icon"></SvgIcon>
  79. </span>
  80. </div>
  81. </div>
  82. <div class="card-right">
  83. <div class="num">
  84. <i class="svg-icon svg-icon-sm" :class="cItem.color != 'red' ? 'svg-icon-' + cItem.color : 'svg-icon-white'">
  85. <SvgIcon svgid="svg-A"></SvgIcon>
  86. </i>
  87. <span>{{ cItem.fdl }}</span>
  88. </div>
  89. <div class="num">
  90. <i class="svg-icon svg-icon-sm" :class="cItem.color != 'red' ? 'svg-icon-' + cItem.color : 'svg-icon-white'">
  91. <SvgIcon svgid="svg-W"></SvgIcon>
  92. </i>
  93. <span>{{ cItem.gl }}</span>
  94. </div>
  95. <div class="num">
  96. <i class="svg-icon svg-icon-sm" :class="cItem.color != 'red' ? 'svg-icon-' + cItem.color : 'svg-icon-white'">
  97. <SvgIcon svgid="svg-V"></SvgIcon>
  98. </i>
  99. <span>{{ cItem.fs }}</span>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. <!-- 站位用 保证卡片布局最后一行不会有问题 -->
  105. <i class="blank" v-for="i in pItem.length" :key="i"></i>
  106. </div>
  107. </div>
  108. </div>
  109. </el-scrollbar>
  110. </div>
  111. </template>
  112. <script>
  113. import Row from "@com/coms/grid/row.vue";
  114. import Col from "@com/coms/grid/col.vue";
  115. import SvgIcon from "@com/coms/icon/svg-icon.vue";
  116. import util from "@/helper/util.js";
  117. import store from "@store/index.js";
  118. export default {
  119. // 名称
  120. name: "LightMatrix",
  121. // 使用组件
  122. components: {
  123. Row,
  124. Col,
  125. SvgIcon,
  126. },
  127. // 数据
  128. data() {
  129. return {
  130. timmer: null, // 计时器
  131. sourceMap: {}, // 核心数据
  132. panelData: {
  133. first: {
  134. icon: "svg-photovoltaic",
  135. text: "接入光伏",
  136. key: "gfjrnum",
  137. },
  138. datas: [
  139. {
  140. color: "green",
  141. name: "待机",
  142. nameIcon: "svg-standby",
  143. numIcon: "svg-manual",
  144. text1: "待风",
  145. key1: "gfdjts",
  146. text2: "手动停机",
  147. key2: "gfsdtjnum",
  148. },
  149. {
  150. color: "purple",
  151. name: "运行",
  152. nameIcon: "svg-normal-power",
  153. numIcon: "svg-drop-output",
  154. text1: "正常发电",
  155. key1: "gfyxts",
  156. text2: "降出力运行",
  157. key2: "gfqxjclnum",
  158. },
  159. {
  160. color: "pink",
  161. name: "限电",
  162. nameIcon: "svg-limit-power",
  163. numIcon: "svg-downtime",
  164. text1: "限电降出力",
  165. key1: "gfxdts",
  166. text2: "停机",
  167. key2: "gfxdtjnum",
  168. },
  169. {
  170. color: "red",
  171. name: "故障",
  172. nameIcon: "svg-gz-downtime",
  173. numIcon: "svg-field-involved",
  174. text1: "故障停机",
  175. key1: "gfgzts",
  176. text2: "场内受累",
  177. key2: "gfcnsltjnum",
  178. },
  179. {
  180. color: "orange",
  181. name: "检休",
  182. nameIcon: "svg-jx-downtime",
  183. numIcon: "svg-field-involved",
  184. text1: "检修停机",
  185. key1: "gfwhts",
  186. text2: "产内受累",
  187. key2: "gfcnsljxnum",
  188. },
  189. {
  190. color: "write",
  191. name: "受累",
  192. nameIcon: "svg-intranet-involvement",
  193. numIcon: "svg-environment",
  194. text1: "电网",
  195. key1: "gfslts",
  196. text2: "环境",
  197. key2: "gfhjslnum",
  198. },
  199. {
  200. color: "gray",
  201. name: "离线",
  202. nameIcon: "svg-offline",
  203. key: "gflxnum",
  204. numIcon: "svg-unknown",
  205. text1: "离线",
  206. key1: "gflxts",
  207. text2: "未知",
  208. key2: "gfwznum",
  209. },
  210. ],
  211. },
  212. tables: [
  213. {
  214. col: 15,
  215. subTitleDatas: [
  216. {
  217. text: "接入台数",
  218. color: "write",
  219. key: "jrts",
  220. },
  221. {
  222. text: "待机台数",
  223. color: "green",
  224. key: "djts",
  225. },
  226. {
  227. text: "并网台数",
  228. color: "blue",
  229. key: "yxts",
  230. },
  231. {
  232. text: "限电台数",
  233. color: "purple",
  234. key: "xdts",
  235. },
  236. {
  237. text: "故障台数",
  238. color: "red",
  239. key: "gzts",
  240. },
  241. {
  242. text: "检修台数",
  243. color: "orange",
  244. key: "whts",
  245. },
  246. {
  247. text: "受累台数",
  248. color: "write",
  249. key: "slts",
  250. },
  251. {
  252. text: "离线台数",
  253. color: "gray",
  254. key: "lxts",
  255. },
  256. {
  257. text: "风速",
  258. color: "gray",
  259. key: "ssfs",
  260. },
  261. {
  262. text: "预测功率",
  263. color: "gray",
  264. key: "ycgl",
  265. },
  266. {
  267. text: "保证功率",
  268. color: "gray",
  269. key: "bzgl",
  270. },
  271. {
  272. text: "应发功率",
  273. color: "gray",
  274. key: "yfgl",
  275. },
  276. {
  277. text: "实际功率",
  278. color: "gray",
  279. key: "sjgl",
  280. },
  281. {
  282. text: "AGC指令",
  283. color: "gray",
  284. key: "agcygsd",
  285. },
  286. {
  287. text: "出线功率",
  288. color: "gray",
  289. key: "agccxyg",
  290. },
  291. ],
  292. datas: [
  293. {
  294. tag: "01#",
  295. num1: 3262.8,
  296. num2: 12.6,
  297. num3: 12.6,
  298. icon: "svg-photovoltaic",
  299. color: "blue",
  300. },
  301. ],
  302. },
  303. ],
  304. };
  305. },
  306. // 函数
  307. methods: {
  308. // 根据风机状态码返回对应 class
  309. getColor(fjzt) {
  310. switch (fjzt) {
  311. case 0:
  312. return "green";
  313. break;
  314. case 1:
  315. return "blue";
  316. break;
  317. case 2:
  318. return "red";
  319. break;
  320. case 3:
  321. return "gray";
  322. break;
  323. case 4:
  324. return "orange";
  325. break;
  326. case 5:
  327. return "pink";
  328. break;
  329. case 6:
  330. return "write";
  331. break;
  332. }
  333. },
  334. // 请求服务
  335. requestData(showLoading) {
  336. let that = this;
  337. that.API.requestData({
  338. showLoading,
  339. method: "POST",
  340. subUrl: "matrix/matrixDetialGfPush",
  341. success(res) {
  342. if (res.data) {
  343. let sourceMap = res.data;
  344. for (let key in sourceMap) {
  345. if (key !== "fczbmap" && key !== "fjmap") {
  346. sourceMap[key] += "";
  347. } else if (key === "fjmap") {
  348. sourceMap[key].forEach((pItem) => {
  349. pItem.forEach((cItem) => {
  350. cItem.icon = "svg-photovoltaic";
  351. cItem.color = that.getColor(cItem.fjzt);
  352. cItem.isShow = true;
  353. });
  354. });
  355. }
  356. }
  357. that.sourceMap = sourceMap;
  358. } else {
  359. that.sourceMap = {};
  360. }
  361. },
  362. });
  363. },
  364. },
  365. created() {
  366. let that = this;
  367. that.$nextTick(() => {
  368. that.requestData(false);
  369. that.timmer = setInterval(() => {
  370. that.requestData(false);
  371. }, that.$store.state.websocketTimeSec);
  372. });
  373. },
  374. mounted() {},
  375. unmounted() {
  376. clearInterval(this.timmer);
  377. this.timmer = null;
  378. },
  379. };
  380. </script>
  381. <style lang="less" scoped>
  382. @panelHeight: 60px;
  383. @titleHeight: 3.704vh;
  384. .light-matrix {
  385. width: calc(100% - 1.111vh);
  386. height: calc(100vh - 7.222vh);
  387. display: flex;
  388. flex-direction: column;
  389. .panel {
  390. width: 100%;
  391. border: 0.093vh solid @darkgray;
  392. position: relative;
  393. padding: 8px 16px;
  394. background-color: fade(@darkgray, 20%);
  395. .dot {
  396. width: 2px;
  397. height: 2px;
  398. border-radius: 50%;
  399. background-color: @write;
  400. position: absolute;
  401. &.left {
  402. left: 4px;
  403. }
  404. &.right {
  405. right: 4px;
  406. }
  407. &.top {
  408. top: 4px;
  409. }
  410. &.bottom {
  411. bottom: 4px;
  412. }
  413. }
  414. .panel-item-gf {
  415. flex: 0 0 auto;
  416. margin: 0 24px;
  417. display: flex;
  418. height: @panelHeight;
  419. .panel-item-gf-left {
  420. width: @panelHeight;
  421. height: @panelHeight;
  422. display: flex;
  423. align-items: center;
  424. justify-content: center;
  425. position: relative;
  426. .loop {
  427. position: absolute;
  428. width: 4.444vh;
  429. height: 4.444vh;
  430. border-radius: 50%;
  431. border: 0.093vh solid @darkgray;
  432. background-color: fade(@darkgray, 20);
  433. left: calc(50% - 2.222vh);
  434. top: calc(50% - 2.222vh);
  435. }
  436. }
  437. .panel-item-gf-right {
  438. color: @write;
  439. text-align: right;
  440. margin-left: 24px;
  441. .panel-item-gf-up {
  442. color: @gray;
  443. height: @panelHeight / 2;
  444. line-height: @panelHeight / 2;
  445. font-size: 14px;
  446. }
  447. .panel-item-gf-down {
  448. height: @panelHeight / 2;
  449. line-height: @panelHeight / 2;
  450. font-weight: 600;
  451. font-size: 16px;
  452. }
  453. }
  454. }
  455. .panel-item-gf-new {
  456. display: flex;
  457. height: @panelHeight;
  458. align-items: center;
  459. justify-content: center;
  460. .panel-left {
  461. i {
  462. width: 100%;
  463. height: 100%;
  464. display: block;
  465. padding: 10px 15px;
  466. border-radius: 50%;
  467. box-shadow: inset 1.5px -1px 1px 0px @green;
  468. svg {
  469. margin-top: 0.7407vh;
  470. }
  471. }
  472. }
  473. .panel-right {
  474. display: flex;
  475. flex-direction: column;
  476. padding-left: 2.2222vh;
  477. .text {
  478. color: @green;
  479. font-size: @fontsize-s;
  480. padding-bottom: 0.7407vh;
  481. }
  482. .value {
  483. font-size: 2.2222vh;
  484. .unit {
  485. font-size: @fontsize-s;
  486. padding-left: 0.7407vh;
  487. }
  488. }
  489. }
  490. }
  491. .panel-item-new {
  492. display: flex;
  493. height: 60px;
  494. flex-direction: column;
  495. align-items: center;
  496. justify-content: center;
  497. border: 1px solid;
  498. .panel-left {
  499. width: 100%;
  500. display: flex;
  501. flex-direction: column;
  502. align-items: center;
  503. justify-content: center;
  504. height: 30px;
  505. line-height: 30px;
  506. flex: 1 0 auto;
  507. i svg {
  508. width: 16px;
  509. height: 16px;
  510. }
  511. .text {
  512. font-size: 12px;
  513. line-height: 1;
  514. margin-top: 4px;
  515. }
  516. }
  517. .panel-right {
  518. display: flex;
  519. justify-content: space-between;
  520. width: 100%;
  521. height: 100%;
  522. line-height: 30px;
  523. padding: 0 8px;
  524. .text {
  525. font-size: 14px;
  526. }
  527. .value {
  528. color: @white;
  529. font-size: 16px;
  530. }
  531. .unit {
  532. }
  533. }
  534. &.green {
  535. border-color: fade(@green, 50);
  536. i svg {
  537. margin-left: 8px;
  538. }
  539. .panel-left {
  540. background-color: fade(@green, 25);
  541. border-color: fade(@green, 50);
  542. }
  543. .panel-right {
  544. background-color: fade(@green, 15);
  545. }
  546. }
  547. &.purple {
  548. border-color: fade(@purple, 50);
  549. .panel-left {
  550. background-color: fade(@purple, 25);
  551. border-color: fade(@purple, 50);
  552. }
  553. .panel-right {
  554. background-color: fade(@purple, 15);
  555. }
  556. }
  557. &.pink {
  558. border-color: fade(@pink, 50);
  559. .panel-left {
  560. background-color: fade(@pink, 25);
  561. border-color: fade(@pink, 50);
  562. }
  563. .panel-right {
  564. background-color: fade(@pink, 15);
  565. }
  566. }
  567. &.red {
  568. border-color: fade(@red, 50);
  569. .panel-left {
  570. background-color: fade(@red, 25);
  571. border-color: fade(@red, 50);
  572. }
  573. .panel-right {
  574. background-color: fade(@red, 15);
  575. }
  576. }
  577. &.orange {
  578. border-color: fade(@orange, 50);
  579. .panel-left {
  580. background-color: fade(@orange, 25);
  581. border-color: fade(@orange, 50);
  582. }
  583. .panel-right {
  584. background-color: fade(@orange, 15);
  585. }
  586. }
  587. &.gray {
  588. border-color: fade(@gray, 50);
  589. .panel-left {
  590. background-color: fade(@gray, 25);
  591. border-color: fade(@gray, 50);
  592. }
  593. .panel-right {
  594. background-color: fade(@gray, 15);
  595. }
  596. }
  597. &.white {
  598. border-color: fade(@white, 50);
  599. .panel-left {
  600. background-color: fade(@white, 25);
  601. border-color: fade(@white, 50);
  602. }
  603. .panel-right {
  604. background-color: fade(@white, 15);
  605. }
  606. }
  607. }
  608. }
  609. .panel-box {
  610. margin-top: 1.481vh;
  611. flex-grow: 1;
  612. .panel-title {
  613. width: 100%;
  614. height: @titleHeight;
  615. line-height: @titleHeight;
  616. background-color: fade(@darkgray, 40%);
  617. .panel-title-name {
  618. font-size: @fontsize-s;
  619. color: @green;
  620. display: flex;
  621. align-items: center;
  622. padding: 0 16px;
  623. i {
  624. margin-right: 0.7407vh;
  625. }
  626. .sub-title-item {
  627. display: flex;
  628. flex: 1;
  629. .sub-title {
  630. flex: 0 0 auto;
  631. font-size: 12px;
  632. color: @gray;
  633. margin: 0 0.556vh 0 1.481vh;
  634. padding-top: 1px;
  635. }
  636. .sub-count {
  637. font-size: 14px;
  638. font-family: "Bicubik";
  639. font-weight: 500;
  640. flex: 1 0 auto;
  641. &.write {
  642. color: @write;
  643. }
  644. &.green {
  645. color: @green;
  646. }
  647. &.blue {
  648. color: @darkBlue;
  649. }
  650. &.pink {
  651. color: @pink;
  652. }
  653. &.red {
  654. color: @red;
  655. }
  656. &.orange {
  657. color: @orange;
  658. }
  659. &.gray {
  660. color: @gray;
  661. }
  662. }
  663. }
  664. }
  665. }
  666. .panel-body {
  667. background-color: fade(@darkgray, 20%);
  668. padding: 4px 8px 8px 8px;
  669. margin-bottom: 8px;
  670. width: 100%;
  671. display: flex;
  672. flex-direction: row;
  673. flex-wrap: wrap;
  674. justify-content: space-between;
  675. .blank {
  676. margin-right: 4px;
  677. flex: 1 0 105px;
  678. }
  679. .card {
  680. margin-right: 4px;
  681. margin-top: 4px;
  682. flex: 1 0 105px;
  683. }
  684. .card {
  685. border: 1px solid;
  686. .card-panel {
  687. display: flex;
  688. flex-grow: row;
  689. .card-left {
  690. width: 40px;
  691. border-right: 0.093vh dotted;
  692. display: flex;
  693. flex-direction: column;
  694. .tag {
  695. color: @write;
  696. font-size: 12px;
  697. width: 100%;
  698. text-align: center;
  699. line-height: 1.5;
  700. }
  701. .icon {
  702. flex-grow: 1;
  703. display: flex;
  704. align-items: center;
  705. justify-content: center;
  706. i {
  707. font-size: 14px;
  708. }
  709. }
  710. }
  711. .card-right {
  712. margin-top: 2px;
  713. .num {
  714. width: 100%;
  715. font-size: 12px;
  716. text-align: left;
  717. padding-right: 0.278vh;
  718. display: flex;
  719. align-items: center;
  720. justify-content: space-around;
  721. i {
  722. margin: 0 2px 0 4px;
  723. }
  724. span {
  725. flex: 1;
  726. }
  727. }
  728. }
  729. }
  730. .card-percent {
  731. height: 0.926vh;
  732. padding: 0.093vh 0.185vh;
  733. position: relative;
  734. border-top: 1px solid;
  735. background-color: transparent;
  736. .percent {
  737. height: 0.648vh;
  738. background-color: @green;
  739. position: absolute;
  740. left: 0.185vh;
  741. top: 0.093vh;
  742. }
  743. }
  744. &.blue {
  745. border-color: @darkBlue;
  746. background-color: fade(@darkBlue, 15%);
  747. .card-panel {
  748. .card-left {
  749. border-color: @darkBlue;
  750. .tag {
  751. background-color: fade(@darkBlue, 30);
  752. }
  753. .icon {
  754. svg {
  755. use {
  756. fill: @write;
  757. }
  758. }
  759. }
  760. }
  761. .card-right {
  762. .num {
  763. color: @darkBlue;
  764. }
  765. }
  766. }
  767. .card-percent {
  768. border-color: @darkBlue;
  769. }
  770. }
  771. &.pink {
  772. border-color: @pink;
  773. background-color: fade(@pink, 15%);
  774. .card-panel {
  775. .card-left {
  776. border-color: @pink;
  777. .tag {
  778. background-color: fade(@pink, 30);
  779. }
  780. .icon {
  781. svg {
  782. use {
  783. fill: @write;
  784. }
  785. }
  786. }
  787. }
  788. .card-right {
  789. .num {
  790. color: @pink;
  791. }
  792. }
  793. }
  794. .card-percent {
  795. border-color: @pink;
  796. }
  797. }
  798. &.orange {
  799. border-color: @orange;
  800. background-color: fade(@orange, 15%);
  801. .card-panel {
  802. .card-left {
  803. border-color: @orange;
  804. .tag {
  805. background-color: fade(@orange, 30);
  806. }
  807. .icon {
  808. use {
  809. fill: @write;
  810. }
  811. }
  812. }
  813. .card-right {
  814. .num {
  815. color: @orange;
  816. }
  817. }
  818. }
  819. .card-percent {
  820. border-color: @orange;
  821. }
  822. }
  823. &.green {
  824. border-color: @green;
  825. background-color: fade(@green, 15%);
  826. .card-panel {
  827. .card-left {
  828. border-color: @green;
  829. .tag {
  830. background-color: fade(@green, 30);
  831. }
  832. .icon {
  833. use {
  834. fill: @write;
  835. }
  836. }
  837. }
  838. .card-right {
  839. .num {
  840. color: @green;
  841. }
  842. }
  843. }
  844. .card-percent {
  845. border-color: @green;
  846. }
  847. }
  848. &.gray {
  849. border-color: @darkgray;
  850. background-color: fade(@darkgray, 15%);
  851. .card-panel {
  852. .card-left {
  853. border-color: @darkgray;
  854. .tag {
  855. background-color: fade(@darkgray, 30%);
  856. }
  857. .icon {
  858. use {
  859. fill: @black;
  860. }
  861. }
  862. }
  863. .card-right {
  864. .num {
  865. color: @gray;
  866. }
  867. }
  868. }
  869. .card-percent {
  870. border-color: @darkgray;
  871. }
  872. }
  873. &.red {
  874. border-color: @red;
  875. .card-panel {
  876. background-color: @red;
  877. .card-left {
  878. border-color: @darkRed;
  879. .tag {
  880. background-color: fade(@darkRed, 50%);
  881. }
  882. .icon {
  883. use {
  884. fill: @write;
  885. }
  886. }
  887. }
  888. .card-right {
  889. .num {
  890. color: @write;
  891. }
  892. }
  893. }
  894. .card-percent {
  895. border-color: @red;
  896. }
  897. }
  898. &.black {
  899. border-color: @write;
  900. .card-panel {
  901. background-color: @write;
  902. .card-left {
  903. border-color: @black;
  904. .tag {
  905. background-color: fade(@darkgray, 80%);
  906. }
  907. .icon {
  908. .svg-icon {
  909. svg {
  910. use {
  911. fill: @black;
  912. }
  913. }
  914. }
  915. }
  916. }
  917. .card-right {
  918. .num {
  919. color: @black;
  920. }
  921. }
  922. }
  923. }
  924. }
  925. }
  926. }
  927. }
  928. </style>