LightMatrix.vue 22 KB

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