lfqian commited on
Commit
1d1ea93
·
1 Parent(s): e2492fa

Update Leaderboard page: Apply LiveView tab style and improve Filter Matrix card design

Browse files
src/components/AssetsFilter.vue CHANGED
@@ -1,40 +1,22 @@
1
  <template>
2
- <Tabs :value="selectedAsset" @update:value="onTabChange" class="assets-filter-container">
3
- <TabList>
4
- <Tab
5
- v-for="asset in availableAssets"
6
- :key="asset.value"
7
- :value="asset.value"
8
- >
9
- <div class="flex align-items-center gap-2">
10
- <img
11
- :src="getAssetImage(asset.value)"
12
- :alt="asset.label"
13
- class="asset-image-small"
14
- />
15
- <span class="font-bold">{{ asset.label }}</span>
16
- </div>
17
- </Tab>
18
- </TabList>
19
- </Tabs>
20
  </template>
21
 
22
  <script>
23
- import Tabs from 'primevue/tabs'
24
- import TabList from 'primevue/tablist'
25
- import Tab from 'primevue/tab'
26
- import TabPanels from 'primevue/tabpanels'
27
- import TabPanel from 'primevue/tabpanel'
28
-
29
  export default {
30
  name: 'AssetsFilter',
31
- components: {
32
- Tabs,
33
- TabList,
34
- Tab,
35
- TabPanels,
36
- TabPanel
37
- },
38
  props: {
39
  modelValue: { type: Array, default: () => [] },
40
  assetOptions: { type: Array, default: () => [] }
@@ -77,15 +59,54 @@ export default {
77
  </script>
78
 
79
  <style scoped>
80
- .assets-filter-container {
81
- width: 100%;
82
- overflow-x: auto;
83
- overflow-y: hidden;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
85
- .asset-image-small {
86
- width: 20px;
87
- height: 20px;
88
- object-fit: contain;
89
- flex-shrink: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  }
91
  </style>
 
1
  <template>
2
+ <div class="assets-filter-toolbar">
3
+ <div class="asset-tabs">
4
+ <button
5
+ v-for="asset in availableAssets"
6
+ :key="asset.value"
7
+ class="asset-tab"
8
+ :class="{ 'is-active': asset.value === selectedAsset }"
9
+ @click="onTabChange(asset.value)"
10
+ >
11
+ {{ asset.label }}
12
+ </button>
13
+ </div>
14
+ </div>
 
 
 
 
 
15
  </template>
16
 
17
  <script>
 
 
 
 
 
 
18
  export default {
19
  name: 'AssetsFilter',
 
 
 
 
 
 
 
20
  props: {
21
  modelValue: { type: Array, default: () => [] },
22
  assetOptions: { type: Array, default: () => [] }
 
59
  </script>
60
 
61
  <style scoped>
62
+ :root {
63
+ --ama-start: 239, 68, 68;
64
+ --ama-end: 249, 115, 22;
65
+ --ink-900: #111827;
66
+ --surface-0: #ffffff;
67
+ --bd-subtle: #e5e7eb;
68
+ }
69
+
70
+ .assets-filter-toolbar {
71
+ padding: 1rem;
72
+ display: flex;
73
+ justify-content: center;
74
+ align-items: center;
75
+ }
76
+
77
+ .asset-tabs {
78
+ display: inline-flex;
79
+ gap: 6px;
80
+ padding: 4px;
81
+ border-radius: 12px;
82
+ background: var(--surface-0);
83
+ border: 1px solid var(--bd-subtle);
84
+ box-shadow: 0 2px 8px rgba(0, 0, 0, .04);
85
  }
86
+
87
+ .asset-tab {
88
+ min-width: 54px;
89
+ height: 32px;
90
+ padding: 0 10px;
91
+ border-radius: 8px;
92
+ border: 1px solid transparent;
93
+ background: transparent;
94
+ color: var(--ink-900);
95
+ font-weight: 800;
96
+ letter-spacing: .02em;
97
+ cursor: pointer;
98
+ transition: all .2s ease;
99
+ }
100
+
101
+ .asset-tab:hover {
102
+ color: rgb(var(--ama-end));
103
+ border-color: rgba(var(--ama-end), .28);
104
+ }
105
+
106
+ .asset-tab.is-active {
107
+ color: #fff;
108
+ border: none;
109
+ background: linear-gradient(90deg, rgb(var(--ama-start)), rgb(var(--ama-end)));
110
+ box-shadow: 0 0 0 1px rgba(var(--ama-end), .22), 0 8px 18px rgba(var(--ama-end), .22);
111
  }
112
  </style>
src/views/LeaderboardView.vue CHANGED
@@ -22,13 +22,12 @@
22
  <div class="flex gap-2 align-items-stretch">
23
  <!-- Desktop filter panel -->
24
  <div class="col-panel desktop-filter-panel" style="flex: 1; min-width: 280px;">
25
- <Card class="mb-2 card-full compact-card content-card">
26
  <template #title>
27
- <div class="mb-4 ama-gradient" style="font-size: 20px; font-weight: 800">Filter Matrix</div>
28
- <Divider />
29
  </template>
30
  <template #content>
31
- <div>
32
  <AgentFilters v-model="filters" :nameOptions="nameOptions" :assetOptions="assetOptions" :modelOptions="modelOptions" :strategyOptions="strategyOptions" :dateBounds="dateBounds" />
33
  </div>
34
  </template>
@@ -402,17 +401,45 @@ export default {
402
  display: flex;
403
  flex-direction: column;
404
  background: #ffffff;
405
- border: 1px solid var(--bd-soft);
406
  border-radius: 16px;
407
- box-shadow: 0 1px 3px rgba(0,0,0,0.04), 0 4px 12px rgba(0,0,0,0.06);
408
  transition: all 0.2s ease;
409
  }
410
 
411
  .card-full:hover {
412
- box-shadow: 0 4px 16px rgba(0,0,0,0.08), 0 8px 32px rgba(0,0,0,0.1);
413
  transform: translateY(-1px);
414
  }
415
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
416
  .card-full :deep(.p-card-body) {
417
  display: flex;
418
  flex-direction: column;
 
22
  <div class="flex gap-2 align-items-stretch">
23
  <!-- Desktop filter panel -->
24
  <div class="col-panel desktop-filter-panel" style="flex: 1; min-width: 280px;">
25
+ <Card class="mb-2 card-full compact-card content-card filter-matrix-card">
26
  <template #title>
27
+ <div class="filter-matrix-title">Filter Matrix</div>
 
28
  </template>
29
  <template #content>
30
+ <div class="filter-matrix-content">
31
  <AgentFilters v-model="filters" :nameOptions="nameOptions" :assetOptions="assetOptions" :modelOptions="modelOptions" :strategyOptions="strategyOptions" :dateBounds="dateBounds" />
32
  </div>
33
  </template>
 
401
  display: flex;
402
  flex-direction: column;
403
  background: #ffffff;
404
+ border: 1px solid #e5e7eb;
405
  border-radius: 16px;
406
+ box-shadow: 0 1px 2px rgba(0,0,0,0.02), 0 2px 6px rgba(0,0,0,0.04);
407
  transition: all 0.2s ease;
408
  }
409
 
410
  .card-full:hover {
411
+ box-shadow: 0 2px 8px rgba(0,0,0,0.04), 0 4px 16px rgba(0,0,0,0.06);
412
  transform: translateY(-1px);
413
  }
414
 
415
+ /* Filter Matrix Card Special Styling */
416
+ .filter-matrix-card {
417
+ background: linear-gradient(135deg, #fefefe 0%, #fafbfc 100%);
418
+ border: 1px solid #e5e7eb;
419
+ box-shadow: 0 2px 8px rgba(0,0,0,0.03), 0 4px 16px rgba(0,0,0,0.04);
420
+ }
421
+
422
+ .filter-matrix-card:hover {
423
+ transform: none;
424
+ }
425
+
426
+ .filter-matrix-title {
427
+ font-size: 22px;
428
+ font-weight: 800;
429
+ letter-spacing: -0.02em;
430
+ background: linear-gradient(90deg, rgb(239, 68, 68), rgb(249, 115, 22));
431
+ -webkit-background-clip: text;
432
+ -webkit-text-fill-color: transparent;
433
+ background-clip: text;
434
+ margin-bottom: 8px;
435
+ padding-bottom: 12px;
436
+ border-bottom: 2px solid #f3f4f6;
437
+ }
438
+
439
+ .filter-matrix-content {
440
+ padding-top: 8px;
441
+ }
442
+
443
  .card-full :deep(.p-card-body) {
444
  display: flex;
445
  flex-direction: column;