LightMatrix3.vue 25 KB

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