verce-vue-test 0.0.30 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verce-vue-test",
3
- "version": "0.0.30",
3
+ "version": "0.0.31",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -4,23 +4,16 @@ import type { ComponentPublicInstance } from 'vue'
4
4
  import * as echarts from 'echarts'
5
5
  import type { ECharts, EChartsOption } from 'echarts'
6
6
 
7
- interface MetricExtraRow {
7
+ interface MetricRow {
8
8
  label: string
9
9
  value: string
10
- unit?: string
11
10
  }
12
11
 
13
12
  interface MetricCard {
14
13
  tone: 'blue' | 'green' | 'purple' | 'bank'
15
14
  title: string
16
- value: string
17
- unit: string
18
- subLabel?: string
19
- subValue?: string
20
- subUnit?: string
21
- extraRows?: MetricExtraRow[]
15
+ rows: MetricRow[]
22
16
  progress: number
23
- visual: 'line' | 'bars' | 'bank'
24
17
  }
25
18
 
26
19
  interface GaugeCard {
@@ -50,47 +43,39 @@ const metricCards: MetricCard[] = [
50
43
  {
51
44
  tone: 'blue',
52
45
  title: '资金余额',
53
- value: '891.17',
54
- unit: '亿',
55
- subLabel: '当日净流入',
56
- subValue: '1,455.26',
57
- subUnit: '亿',
46
+ rows: [
47
+ { label: '资金余额(亿):', value: '891.17' },
48
+ { label: '当日净流入(亿):', value: '1455.26' },
49
+ ],
58
50
  progress: 78,
59
- visual: 'line',
60
51
  },
61
52
  {
62
53
  tone: 'green',
63
54
  title: '报备收款',
64
- value: '5,624.57',
65
- unit: '亿',
66
- subLabel: '实际收款',
67
- subValue: '62,606,103,98.41',
68
- subUnit: '亿',
55
+ rows: [
56
+ { label: '报备收款(亿):', value: '5624.57' },
57
+ { label: '实际收款(亿):', value: '6260610398.41' },
58
+ ],
69
59
  progress: 92,
70
- visual: 'bars',
71
60
  },
72
61
  {
73
62
  tone: 'purple',
74
- title: '报告付款',
75
- value: '4,733.39',
76
- unit: '亿',
77
- subLabel: '实际付款',
78
- subValue: '62,606,089,43.15',
79
- subUnit: '亿',
63
+ title: '报备扎金',
64
+ rows: [
65
+ { label: '报备扎金(亿):', value: '4733.39' },
66
+ { label: '实际扎金(亿):', value: '6260608943.15' },
67
+ ],
80
68
  progress: 87,
81
- visual: 'line',
82
69
  },
83
70
  {
84
71
  tone: 'bank',
85
72
  title: '人行账户余额',
86
- value: '0.00',
87
- unit: '亿',
88
- extraRows: [
89
- { label: '法定存款准备金', value: '0.00', unit: '亿' },
90
- { label: '超额准备金', value: '0.00', unit: '亿' },
73
+ rows: [
74
+ { label: '人行账户余额(亿):', value: '0.00' },
75
+ { label: '法定存款准备金(亿):', value: '0.00' },
76
+ { label: '超额准备金(亿):', value: '0.00' },
91
77
  ],
92
78
  progress: 0,
93
- visual: 'bank',
94
79
  },
95
80
  ]
96
81
 
@@ -279,60 +264,68 @@ function createCashflowOption(): EChartsOption {
279
264
  }
280
265
  }
281
266
 
282
- function createGaugeOption(card: GaugeCard): EChartsOption {
267
+ function createLiquidityRingOption(card: GaugeCard): EChartsOption {
268
+ const progress = Math.min(Math.max(card.needle, 0), card.max)
269
+ const rest = Math.max(card.max - progress, 0)
270
+ const ringGradient = new echarts.graphic.LinearGradient(0, 0, 1, 1, [
271
+ { offset: 0, color: '#1278ff' },
272
+ { offset: 0.5, color: '#33f0ff' },
273
+ { offset: 1, color: '#58ff86' },
274
+ ])
275
+
283
276
  return {
284
277
  animationDuration: 900,
278
+ graphic: [
279
+ {
280
+ type: 'text',
281
+ left: 'center',
282
+ top: '44%',
283
+ style: {
284
+ text: card.value,
285
+ fill: '#34eaff',
286
+ fontSize: 30,
287
+ fontWeight: 800,
288
+ textAlign: 'center',
289
+ textShadowBlur: 14,
290
+ textShadowColor: 'rgba(47, 233, 255, .55)',
291
+ },
292
+ },
293
+ ],
285
294
  series: [
286
295
  {
287
- type: 'gauge',
288
- min: 0,
289
- max: card.max,
290
- radius: '82%',
291
- center: ['50%', '55%'],
292
- splitNumber: 5,
293
- axisLine: {
294
- lineStyle: {
295
- width: 15,
296
- color: [
297
- [0.38, '#1679ff'],
298
- [0.74, '#3fe8f2'],
299
- [1, '#ff5b5c'],
300
- ],
301
- },
296
+ type: 'pie',
297
+ radius: ['62%', '78%'],
298
+ center: ['50%', '52%'],
299
+ startAngle: 90,
300
+ clockwise: true,
301
+ silent: true,
302
+ label: { show: false },
303
+ labelLine: { show: false },
304
+ itemStyle: {
305
+ borderRadius: 10,
306
+ borderColor: 'rgba(2, 14, 33, .5)',
307
+ borderWidth: 3,
302
308
  },
303
- pointer: {
304
- length: '54%',
305
- width: 5,
306
- itemStyle: {
307
- color: '#68f7ff',
309
+ data: [
310
+ { value: progress, itemStyle: { color: ringGradient } },
311
+ { value: rest, itemStyle: { color: 'rgba(33, 79, 124, .28)' } },
312
+ ],
313
+ },
314
+ {
315
+ type: 'pie',
316
+ radius: ['46%', '47%'],
317
+ center: ['50%', '52%'],
318
+ silent: true,
319
+ label: { show: false },
320
+ labelLine: { show: false },
321
+ data: [
322
+ {
323
+ value: 1,
324
+ itemStyle: {
325
+ color: 'rgba(58, 216, 255, .18)',
326
+ },
308
327
  },
309
- },
310
- axisTick: {
311
- distance: -18,
312
- length: 6,
313
- lineStyle: { color: '#cbe7ff', width: 2 },
314
- },
315
- splitLine: {
316
- distance: -18,
317
- length: 15,
318
- lineStyle: { color: '#dff6ff', width: 3 },
319
- },
320
- axisLabel: {
321
- color: 'inherit',
322
- distance: -34,
323
- fontSize: 13,
324
- },
325
- anchor: { show: false },
326
- title: { show: false },
327
- detail: {
328
- valueAnimation: true,
329
- offsetCenter: [0, '42%'],
330
- color: '#30dcff',
331
- fontSize: 28,
332
- fontWeight: 700,
333
- formatter: () => card.value,
334
- },
335
- data: [{ value: card.needle }],
328
+ ],
336
329
  },
337
330
  ],
338
331
  }
@@ -421,9 +414,9 @@ onMounted(async () => {
421
414
  updateCockpitScale()
422
415
  await nextTick()
423
416
  createChart(cashflowChart.value, createCashflowOption())
424
- createChart(liquidityGauge.value, createGaugeOption(gaugeCards[0]!))
425
- createChart(coverageGauge.value, createGaugeOption(gaugeCards[1]!))
426
- createChart(stableGauge.value, createGaugeOption(gaugeCards[2]!))
417
+ createChart(liquidityGauge.value, createLiquidityRingOption(gaugeCards[0]!))
418
+ createChart(coverageGauge.value, createLiquidityRingOption(gaugeCards[1]!))
419
+ createChart(stableGauge.value, createLiquidityRingOption(gaugeCards[2]!))
427
420
  createChart(maturityChart.value, createMaturityOption())
428
421
  window.addEventListener('resize', handleViewportChange)
429
422
  window.visualViewport?.addEventListener('resize', handleViewportChange)
@@ -443,12 +436,9 @@ onUnmounted(() => {
443
436
  <div class="brand">
444
437
  <span class="logo-mark">C</span>
445
438
  <h1>资金驾驶舱</h1>
446
- <p>资金盘位等流动性管理平台</p>
447
439
  </div>
448
440
 
449
441
  <div class="toolbar">
450
- <span class="toolbar-item calendar-icon">2026-06-04(周三)</span>
451
- <span class="toolbar-item clock-icon">10:30:45</span>
452
442
  <button class="export-button" type="button">
453
443
  <span class="download-icon"></span>
454
444
  导出报表
@@ -463,19 +453,14 @@ onUnmounted(() => {
463
453
  <span class="metric-icon-symbol"></span>
464
454
  </div>
465
455
  <div class="metric-content">
466
- <h2>{{ card.title }}</h2>
467
- <div class="metric-value">
468
- <strong>{{ card.value }}</strong>
469
- <span>{{ card.unit }}</span>
470
- </div>
471
- <p v-if="card.subLabel" class="metric-sub-label">{{ card.subLabel }}</p>
472
- <p v-if="card.subValue" class="metric-sub-value">{{ card.subValue }} {{ card.subUnit }}</p>
473
- </div>
474
- <div class="metric-visual" :class="`is-${card.visual}`">
475
- <span v-for="index in 6" :key="index"></span>
456
+ <p v-for="row in card.rows" :key="row.label" class="metric-row">
457
+ <span>{{ row.label }}</span>
458
+ <b>{{ row.value }}</b>
459
+ </p>
476
460
  </div>
461
+ <span class="metric-divider"></span>
477
462
  <div class="metric-progress">
478
- <span>进度</span>
463
+ <span>进度:</span>
479
464
  <div class="progress-track">
480
465
  <i :style="{ width: `${card.progress}%` }"></i>
481
466
  </div>
@@ -490,27 +475,14 @@ onUnmounted(() => {
490
475
  <span class="metric-icon-symbol"></span>
491
476
  </div>
492
477
  <div class="metric-content">
493
- <h2>{{ card.title }}</h2>
494
- <div class="metric-value">
495
- <strong>{{ card.value }}</strong>
496
- <span>{{ card.unit }}</span>
497
- </div>
498
- <template v-if="card.extraRows">
499
- <p v-for="row in card.extraRows" :key="row.label" class="metric-extra-row">
500
- <span>{{ row.label }}</span>
501
- <b>{{ row.value }} {{ row.unit }}</b>
502
- </p>
503
- </template>
504
- <template v-else>
505
- <p v-if="card.subLabel" class="metric-sub-label">{{ card.subLabel }}</p>
506
- <p v-if="card.subValue" class="metric-sub-value">{{ card.subValue }} {{ card.subUnit }}</p>
507
- </template>
508
- </div>
509
- <div class="metric-visual" :class="`is-${card.visual}`">
510
- <span v-for="index in 6" :key="index"></span>
478
+ <p v-for="row in card.rows" :key="row.label" class="metric-row">
479
+ <span>{{ row.label }}</span>
480
+ <b>{{ row.value }}</b>
481
+ </p>
511
482
  </div>
483
+ <span class="metric-divider"></span>
512
484
  <div class="metric-progress">
513
- <span>进度</span>
485
+ <span>进度:</span>
514
486
  <div class="progress-track">
515
487
  <i :style="{ width: `${card.progress}%` }"></i>
516
488
  </div>
@@ -523,7 +495,6 @@ onUnmounted(() => {
523
495
  <section class="cashflow-section">
524
496
  <div class="section-title-row">
525
497
  <h2>未来现金流</h2>
526
- <button class="range-button" type="button">近15天 <span></span></button>
527
498
  </div>
528
499
  <span class="axis-unit">(亿元)</span>
529
500
  <div ref="cashflowChart" class="cashflow-chart"></div>
@@ -546,7 +517,6 @@ onUnmounted(() => {
546
517
  </section>
547
518
 
548
519
  <section class="table-section shibor-section">
549
- <h2><span></span>利率/SHIBOR/FTP 数据</h2>
550
520
  <div class="table-shell">
551
521
  <table>
552
522
  <thead>
@@ -574,7 +544,6 @@ onUnmounted(() => {
574
544
  </section>
575
545
 
576
546
  <section class="table-section monitor-section">
577
- <h2><span></span>关键指标监控</h2>
578
547
  <div class="table-shell">
579
548
  <table>
580
549
  <thead>
@@ -634,16 +603,14 @@ onUnmounted(() => {
634
603
  position: absolute;
635
604
  inset: 0;
636
605
  pointer-events: none;
637
- background:
638
- linear-gradient(90deg, transparent 0 49%, rgba(40, 152, 255, .08) 49.95% 50.05%, transparent 50.2%),
639
- linear-gradient(180deg, rgba(0, 8, 18, .1), transparent 24%, rgba(0, 6, 16, .22));
606
+ background: linear-gradient(180deg, rgba(0, 8, 18, .1), transparent 24%, rgba(0, 6, 16, .22));
640
607
  }
641
608
 
642
609
  .topbar {
643
610
  position: absolute;
644
- left: 32px;
611
+ left: 18px;
645
612
  top: 22px;
646
- width: 1608px;
613
+ width: 1636px;
647
614
  height: 42px;
648
615
  display: flex;
649
616
  align-items: center;
@@ -652,7 +619,6 @@ onUnmounted(() => {
652
619
 
653
620
  .brand,
654
621
  .toolbar,
655
- .toolbar-item,
656
622
  .export-button {
657
623
  display: flex;
658
624
  align-items: center;
@@ -685,38 +651,12 @@ onUnmounted(() => {
685
651
  text-shadow: 0 0 18px rgba(104, 194, 255, .24);
686
652
  }
687
653
 
688
- .brand p {
689
- margin-left: 4px;
690
- color: #d5e4f5;
691
- font-size: 15px;
692
- font-weight: 600;
693
- }
694
-
695
654
  .toolbar {
696
655
  gap: 32px;
697
656
  color: #e0edf9;
698
657
  font-size: 14px;
699
658
  }
700
659
 
701
- .toolbar-item {
702
- gap: 9px;
703
- white-space: nowrap;
704
- }
705
-
706
- .toolbar-item::before {
707
- content: "";
708
- width: 18px;
709
- height: 18px;
710
- display: inline-block;
711
- border: 1px solid rgba(230, 244, 255, .86);
712
- border-radius: 3px;
713
- box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .04);
714
- }
715
-
716
- .clock-icon::before {
717
- border-radius: 50%;
718
- }
719
-
720
660
  .export-button {
721
661
  height: 37px;
722
662
  gap: 9px;
@@ -762,243 +702,229 @@ onUnmounted(() => {
762
702
 
763
703
  .metric-strip {
764
704
  position: absolute;
765
- left: 32px;
766
- top: 96px;
767
- width: 1608px;
768
- height: 150px;
705
+ left: 18px;
706
+ top: 94px;
707
+ width: 1636px;
708
+ height: 154px;
769
709
  display: grid;
770
- grid-template-columns: 1fr 1fr;
771
- gap: 38px;
710
+ grid-template-columns: 805px 805px;
711
+ gap: 26px;
772
712
  }
773
713
 
774
714
  .metric-group {
775
715
  display: grid;
776
716
  grid-template-columns: repeat(2, minmax(0, 1fr));
777
- gap: 24px;
717
+ gap: 8px;
778
718
  min-width: 0;
779
719
  }
780
720
 
781
721
  .metric-card {
782
722
  position: relative;
783
723
  min-width: 0;
784
- height: 150px;
785
- padding-left: 96px;
786
- border-right: 1px solid rgba(37, 108, 180, .2);
787
- }
788
-
789
- .metric-group .metric-card:last-child {
790
- border-right: 0;
724
+ height: 154px;
725
+ overflow: hidden;
726
+ padding: 24px 24px 20px 134px;
727
+ border: 0;
728
+ border-radius: 0;
729
+ background: transparent;
730
+ box-shadow: none;
791
731
  }
792
732
 
793
733
  .metric-icon {
794
734
  position: absolute;
795
- left: 0;
796
- top: 7px;
797
- width: 68px;
798
- height: 68px;
799
- border-radius: 12px;
735
+ left: 38px;
736
+ top: 34px;
737
+ width: 54px;
738
+ height: 54px;
739
+ border-radius: 0;
800
740
  display: flex;
801
741
  align-items: center;
802
742
  justify-content: center;
803
- box-shadow: 0 18px 38px rgba(0, 62, 156, .22);
743
+ background: transparent;
744
+ box-shadow: none;
804
745
  }
805
746
 
806
747
  .metric-icon-symbol {
807
748
  position: relative;
808
749
  display: block;
809
- color: #d8ecff;
810
- font-size: 34px;
811
- line-height: 1;
812
- font-weight: 900;
813
- }
814
-
815
- .metric-card.is-blue .metric-icon {
816
- background: linear-gradient(160deg, rgba(14, 119, 248, .88), rgba(5, 48, 120, .95));
750
+ width: 52px;
751
+ height: 52px;
752
+ transform: scale(.78);
753
+ transform-origin: center;
817
754
  }
818
755
 
819
756
  .metric-card.is-blue .metric-icon-symbol::before {
820
757
  content: "";
821
- display: block;
822
- width: 35px;
758
+ position: absolute;
759
+ left: 4px;
760
+ top: 9px;
761
+ width: 37px;
823
762
  height: 26px;
824
- border-radius: 5px;
825
- background: #69b9ff;
826
- box-shadow: inset 0 -8px 0 rgba(20, 100, 216, .45);
763
+ border: 3px solid #39efcd;
764
+ border-radius: 6px;
765
+ box-shadow: none;
827
766
  }
828
767
 
829
768
  .metric-card.is-blue .metric-icon-symbol::after {
830
- content: "";
769
+ content: "¥";
831
770
  position: absolute;
832
- right: -5px;
833
- bottom: -4px;
834
- width: 20px;
835
- height: 17px;
836
- border-radius: 4px;
837
- background: #3e8bff;
838
- box-shadow: inset 0 0 0 2px rgba(160, 219, 255, .7);
839
- }
840
-
841
- .metric-card.is-green .metric-icon {
842
- background: linear-gradient(160deg, rgba(65, 206, 83, .86), rgba(15, 90, 61, .96));
771
+ right: 0;
772
+ bottom: 1px;
773
+ width: 25px;
774
+ height: 25px;
775
+ display: flex;
776
+ align-items: center;
777
+ justify-content: center;
778
+ border-radius: 50%;
779
+ color: #045e86;
780
+ background: linear-gradient(180deg, #47eff2, #26bfe3);
781
+ font-size: 15px;
782
+ line-height: 1;
783
+ font-weight: 900;
784
+ box-shadow: none;
843
785
  }
844
786
 
845
787
  .metric-card.is-green .metric-icon-symbol::before {
846
- content: "";
788
+ content: "";
789
+ position: absolute;
790
+ left: 7px;
791
+ top: 3px;
792
+ width: 33px;
793
+ height: 45px;
794
+ border-radius: 3px;
795
+ background:
796
+ linear-gradient(90deg, rgba(3, 87, 108, .52) 8px, transparent 8px) 10px 14px / 19px 3px no-repeat,
797
+ linear-gradient(90deg, rgba(3, 87, 108, .48) 8px, transparent 8px) 10px 25px / 20px 3px no-repeat,
798
+ linear-gradient(90deg, rgba(3, 87, 108, .46) 8px, transparent 8px) 10px 36px / 18px 3px no-repeat,
799
+ linear-gradient(180deg, #55ffc7, #28d8d4);
800
+ clip-path: polygon(0 0, 70% 0, 100% 28%, 100% 100%, 0 100%);
847
801
  }
848
802
 
849
- .metric-card.is-purple .metric-icon {
850
- background: linear-gradient(160deg, rgba(154, 108, 255, .88), rgba(50, 39, 127, .96));
803
+ .metric-card.is-green .metric-icon-symbol::after,
804
+ .metric-card.is-purple .metric-icon-symbol::after {
805
+ content: "¥";
806
+ position: absolute;
807
+ right: 1px;
808
+ bottom: 1px;
809
+ width: 25px;
810
+ height: 25px;
811
+ display: flex;
812
+ align-items: center;
813
+ justify-content: center;
814
+ border-radius: 50%;
815
+ color: #04608a;
816
+ background: linear-gradient(180deg, #4ff1f1, #28bfdc);
817
+ font-size: 15px;
818
+ line-height: 1;
819
+ font-weight: 900;
820
+ box-shadow: none;
851
821
  }
852
822
 
853
823
  .metric-card.is-purple .metric-icon-symbol::before {
854
- content: "";
824
+ content: "";
825
+ position: absolute;
826
+ left: 5px;
827
+ top: 6px;
828
+ width: 39px;
829
+ height: 39px;
830
+ border-radius: 50%;
831
+ background: conic-gradient(from 0deg, #35ffc1 0 25%, transparent 25% 31%, #28d5e4 31% 100%);
832
+ box-shadow: none;
855
833
  }
856
834
 
857
- .metric-card.is-bank .metric-icon {
858
- background: linear-gradient(160deg, rgba(30, 135, 255, .9), rgba(9, 48, 126, .96));
835
+ .metric-card.is-bank .metric-icon-symbol::before {
836
+ content: "";
837
+ position: absolute;
838
+ left: 7px;
839
+ top: 4px;
840
+ width: 38px;
841
+ height: 44px;
842
+ clip-path: polygon(50% 0, 92% 18%, 82% 78%, 50% 100%, 18% 78%, 8% 18%);
843
+ background: linear-gradient(180deg, #55ff91, #32dfa5);
844
+ box-shadow: none;
859
845
  }
860
846
 
861
- .metric-card.is-bank .metric-icon-symbol::before {
862
- content: "";
863
- font-size: 38px;
847
+ .metric-card.is-bank .metric-icon-symbol::after {
848
+ content: "¥";
849
+ position: absolute;
850
+ left: 17px;
851
+ top: 17px;
852
+ color: #064f70;
853
+ font-size: 24px;
854
+ line-height: 1;
855
+ font-weight: 900;
864
856
  }
865
857
 
866
858
  .metric-content {
867
- position: relative;
859
+ position: absolute;
868
860
  z-index: 2;
861
+ left: 126px;
862
+ top: 30px;
863
+ right: 23px;
864
+ display: grid;
865
+ row-gap: 13px;
869
866
  }
870
867
 
871
- .metric-content h2 {
872
- margin-top: 0;
873
- color: #eef7ff;
874
- font-size: 15px;
875
- line-height: 1.2;
876
- font-weight: 700;
877
- }
878
-
879
- .metric-value {
880
- margin-top: 8px;
881
- display: flex;
868
+ .metric-row {
869
+ margin: 0;
870
+ display: grid;
871
+ grid-template-columns: minmax(0, 1fr) auto;
882
872
  align-items: baseline;
883
- gap: 9px;
884
- }
885
-
886
- .metric-value strong {
887
- color: #f3f8ff;
888
- font-size: 30px;
873
+ column-gap: 12px;
874
+ color: #eef8ff;
875
+ font-size: 17px;
889
876
  line-height: 1;
890
877
  font-weight: 800;
891
- letter-spacing: 0;
892
- }
893
-
894
- .metric-value span {
895
- color: #f2f7ff;
896
- font-size: 15px;
897
- font-weight: 700;
898
- }
899
-
900
- .metric-sub-label {
901
- margin-top: 14px;
902
- color: #d6e4f4;
903
- font-size: 14px;
904
- line-height: 1;
905
- }
906
-
907
- .metric-sub-value {
908
- margin-top: 7px;
909
- color: #43f168;
910
- font-size: 16px;
911
- line-height: 1;
912
- font-weight: 700;
878
+ text-shadow: 0 0 11px rgba(177, 224, 255, .18);
879
+ white-space: nowrap;
913
880
  }
914
881
 
915
- .metric-extra-row {
916
- margin-top: 9px;
917
- display: grid;
918
- grid-template-columns: 1fr auto;
919
- column-gap: 12px;
920
- color: #dbe8f5;
921
- font-size: 14px;
882
+ .metric-row b {
883
+ color: #f2f8ff;
884
+ font-size: 17px;
922
885
  line-height: 1;
886
+ font-weight: 800;
887
+ letter-spacing: 0;
923
888
  }
924
889
 
925
- .metric-extra-row b {
926
- color: #eef7ff;
927
- font-weight: 500;
928
- }
929
-
930
- .metric-visual {
931
- position: absolute;
932
- right: 20px;
933
- top: 43px;
934
- width: 96px;
935
- height: 52px;
936
- opacity: .88;
937
- }
938
-
939
- .metric-visual span {
940
- position: absolute;
941
- display: block;
890
+ .metric-card.is-bank .metric-content {
891
+ top: 24px;
892
+ row-gap: 12px;
942
893
  }
943
894
 
944
- .metric-visual.is-line span {
945
- width: 2px;
946
- bottom: 0;
947
- background: linear-gradient(180deg, #148cff, transparent);
895
+ .metric-card.is-bank .metric-row {
896
+ font-size: 17px;
948
897
  }
949
898
 
950
- .metric-visual.is-line span:nth-child(1) { left: 4px; height: 18px; transform: rotate(24deg); }
951
- .metric-visual.is-line span:nth-child(2) { left: 20px; height: 34px; transform: rotate(48deg); }
952
- .metric-visual.is-line span:nth-child(3) { left: 43px; height: 50px; transform: rotate(-38deg); }
953
- .metric-visual.is-line span:nth-child(4) { left: 62px; height: 30px; transform: rotate(48deg); }
954
- .metric-visual.is-line span:nth-child(5) { left: 78px; height: 43px; transform: rotate(-28deg); }
955
- .metric-visual.is-line span:nth-child(6) { left: 92px; height: 55px; transform: rotate(33deg); }
956
-
957
- .metric-visual.is-line::after {
958
- content: "";
899
+ .metric-divider {
959
900
  position: absolute;
960
- inset: 3px 0 8px;
961
- clip-path: polygon(0 76%, 22% 45%, 48% 22%, 68% 48%, 100% 0);
962
- border-top: 2px solid #087cff;
963
- filter: drop-shadow(0 0 7px #007bff);
964
- }
965
-
966
- .metric-visual.is-bars {
967
- display: flex;
968
- align-items: flex-end;
969
- gap: 9px;
970
- justify-content: flex-end;
971
- }
972
-
973
- .metric-visual.is-bars span {
974
- position: static;
975
- width: 8px;
976
- border-radius: 6px 6px 0 0;
977
- background: linear-gradient(180deg, #2d85ff, rgba(21, 87, 184, .12));
901
+ z-index: 1;
902
+ left: 28px;
903
+ right: 28px;
904
+ top: 99px;
905
+ height: 1px;
906
+ background: linear-gradient(90deg, transparent, rgba(135, 184, 229, .25) 10%, rgba(126, 177, 224, .22) 88%, transparent);
907
+ box-shadow: 0 1px 0 rgba(5, 19, 38, .58);
978
908
  }
979
909
 
980
- .metric-visual.is-bars span:nth-child(1) { height: 17px; opacity: .38; }
981
- .metric-visual.is-bars span:nth-child(2) { height: 26px; opacity: .48; }
982
- .metric-visual.is-bars span:nth-child(3) { height: 34px; opacity: .62; }
983
- .metric-visual.is-bars span:nth-child(4) { height: 43px; opacity: .75; }
984
- .metric-visual.is-bars span:nth-child(5) { height: 49px; opacity: .86; }
985
- .metric-visual.is-bars span:nth-child(6) { height: 54px; opacity: .95; }
986
-
987
- .metric-visual.is-bank {
988
- display: none;
910
+ .metric-card.is-bank .metric-divider {
911
+ top: 97px;
989
912
  }
990
913
 
991
914
  .metric-progress {
992
915
  position: absolute;
993
- left: 0;
994
- right: 24px;
995
- bottom: 14px;
916
+ z-index: 2;
917
+ left: 28px;
918
+ right: 28px;
919
+ bottom: 22px;
996
920
  display: grid;
997
- grid-template-columns: 34px minmax(0, 1fr) 38px;
921
+ grid-template-columns: 58px minmax(0, 1fr) 42px;
998
922
  align-items: center;
999
923
  gap: 12px;
1000
- color: #e6f1ff;
1001
- font-size: 14px;
924
+ color: #f0f8ff;
925
+ font-size: 18px;
926
+ line-height: 1;
927
+ font-weight: 800;
1002
928
  }
1003
929
 
1004
930
  .progress-track {
@@ -1020,14 +946,15 @@ onUnmounted(() => {
1020
946
  .metric-progress b {
1021
947
  justify-self: end;
1022
948
  color: #f5f9ff;
1023
- font-size: 15px;
949
+ font-size: 18px;
950
+ line-height: 1;
1024
951
  }
1025
952
 
1026
953
  .cashflow-section {
1027
954
  position: absolute;
1028
- left: 33px;
955
+ left: 18px;
1029
956
  top: 279px;
1030
- width: 790px;
957
+ width: 805px;
1031
958
  height: 398px;
1032
959
  }
1033
960
 
@@ -1039,8 +966,7 @@ onUnmounted(() => {
1039
966
  }
1040
967
 
1041
968
  .section-title-row h2,
1042
- .maturity-section h2,
1043
- .table-section h2 {
969
+ .maturity-section h2 {
1044
970
  color: #eff8ff;
1045
971
  font-size: 22px;
1046
972
  line-height: 1;
@@ -1048,28 +974,6 @@ onUnmounted(() => {
1048
974
  letter-spacing: 0;
1049
975
  }
1050
976
 
1051
- .range-button {
1052
- width: 103px;
1053
- height: 35px;
1054
- display: inline-flex;
1055
- align-items: center;
1056
- justify-content: center;
1057
- gap: 13px;
1058
- border: 1px solid rgba(54, 126, 204, .25);
1059
- border-radius: 8px;
1060
- color: #f0f6ff;
1061
- background: rgba(20, 56, 99, .72);
1062
- font-size: 15px;
1063
- }
1064
-
1065
- .range-button span {
1066
- width: 8px;
1067
- height: 8px;
1068
- border-right: 1px solid #a8bed6;
1069
- border-bottom: 1px solid #a8bed6;
1070
- transform: rotate(45deg) translateY(-2px);
1071
- }
1072
-
1073
977
  .axis-unit {
1074
978
  position: absolute;
1075
979
  left: 11px;
@@ -1088,9 +992,9 @@ onUnmounted(() => {
1088
992
 
1089
993
  .gauge-section {
1090
994
  position: absolute;
1091
- left: 862px;
995
+ left: 849px;
1092
996
  top: 280px;
1093
- width: 778px;
997
+ width: 805px;
1094
998
  height: 206px;
1095
999
  display: grid;
1096
1000
  grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -1152,9 +1056,9 @@ onUnmounted(() => {
1152
1056
 
1153
1057
  .maturity-section {
1154
1058
  position: absolute;
1155
- left: 862px;
1059
+ left: 849px;
1156
1060
  top: 514px;
1157
- width: 778px;
1061
+ width: 805px;
1158
1062
  height: 184px;
1159
1063
  }
1160
1064
 
@@ -1176,50 +1080,22 @@ onUnmounted(() => {
1176
1080
  }
1177
1081
 
1178
1082
  .shibor-section {
1179
- left: 33px;
1083
+ left: 18px;
1180
1084
  top: 711px;
1181
- width: 790px;
1085
+ width: 805px;
1182
1086
  }
1183
1087
 
1184
1088
  .monitor-section {
1185
- left: 862px;
1089
+ left: 849px;
1186
1090
  top: 711px;
1187
- width: 778px;
1188
- }
1189
-
1190
- .table-section h2 {
1191
- height: 29px;
1192
- display: flex;
1193
- align-items: center;
1194
- gap: 11px;
1195
- font-size: 20px;
1196
- }
1197
-
1198
- .table-section h2 span {
1199
- width: 23px;
1200
- height: 23px;
1201
- border-radius: 5px;
1202
- background: linear-gradient(135deg, #1d81ff, #0755e8);
1203
- box-shadow: 0 0 18px rgba(0, 115, 255, .48);
1204
- }
1205
-
1206
- .monitor-section h2 span::after,
1207
- .shibor-section h2 span::after {
1208
- content: "";
1209
- display: block;
1210
- width: 12px;
1211
- height: 12px;
1212
- margin: 5px auto 0;
1213
- border: 2px solid #e9f6ff;
1214
- border-top-width: 4px;
1215
- border-radius: 2px;
1091
+ width: 805px;
1216
1092
  }
1217
1093
 
1218
1094
  .table-shell {
1219
1095
  position: absolute;
1220
1096
  left: 0;
1221
1097
  right: 0;
1222
- top: 45px;
1098
+ top: 0;
1223
1099
  bottom: 0;
1224
1100
  overflow: hidden;
1225
1101
  border-radius: 6px;