LightMatrix.vue 23 KB

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