@abi-software/map-side-bar 1.3.23 → 1.3.24-isan-0

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.
@@ -1,365 +1,365 @@
1
- <template>
2
- <div class="context-card-container" ref="container">
3
- <div v-show="showContextCard">
4
- <div v-show="showDetails" class="hide" @click="showDetails = !showDetails">Hide information<i class="el-icon-arrow-up"></i></div>
5
- <div v-show="!showDetails" class="hide" @click="showDetails = !showDetails">Show information<i class="el-icon-arrow-down"></i></div>
6
- <el-card v-if="showDetails && Object.keys(contextData).length !== 0" v-loading="loading" class="context-card" >
7
- <div class="card-left">
8
- <img :src="entry.banner" class="context-image">
9
- </div>
10
- <div class="card-right scrollbar">
11
- <div class="title">{{contextData.heading}}</div>
12
- <div v-html="contextData.description"/>
13
- <br/>
14
-
15
- <!-- Show sampeles and views seperately if they do not match -->
16
- <template v-if="!samplesUnderViews">
17
- <div v-if="contextData.views && contextData.views.length > 0" class="subtitle">Scaffold Views</div>
18
- <template v-for="(view, i) in contextData.views">
19
- <div v-bind:key="i+'_1'" @click="openViewFile(view)" class="context-card-view">
20
- <img class="view-image" :src="getFileFromPath(view.thumbnail)">
21
- <div class="view-description">{{view.description}}</div>
22
- </div>
23
- <div v-bind:key="i" class="padding"/>
24
- </template>
25
- <div style="margin-bottom: 16px;"/>
26
- <div v-if="contextData.samples && contextData.samples.length > 0" class="subtitle">Samples on Scaffold</div>
27
- <template v-for="(sample, i) in contextData.samples">
28
- <span v-bind:key="i+'_3'" class="context-card-item cursor-pointer" @click="toggleSampleDetails(i)">
29
- <div v-bind:key="i+'_6'" style="display: flex">
30
- <div v-if="sample.color" class="color-box" :style="'background-color:'+ sample.color"></div>
31
- <img class="key-image" v-else-if="sample.thumbnail" :src="getFileFromPath(sample.thumbnail)">
32
- {{sample.heading}}
33
- <i class="el-icon-warning-outline info"></i>
34
- </div>
35
- </span>
36
- <div v-bind:key="i+'_4'" v-if="sampleDetails[i]" v-html="sample.description"/>
37
- <a v-bind:key="i+'_5'" v-if="sampleDetails[i] && sample.path" :href="generateFileLink(sample)" target="_blank">View Source</a>
38
- <div v-bind:key="i+'_2'" class="padding"/>
39
- </template>
40
- </template>
41
-
42
- <!-- Show samples under views if the ids match -->
43
- <template v-else>
44
- <div v-if="contextData.views && contextData.views.length > 0" class="subtitle">Scaffold Views</div>
45
- <template v-for="(view, i) in contextData.views">
46
- <span :key="i+'_1'" @click="viewClicked(view, i)" class="context-card-view">
47
- <img class="view-image" :src="getFileFromPath(view.thumbnail)"/>
48
- <div class="view-description">{{view.description}}<i class="el-icon-warning-outline info"></i> </div>
49
- </span>
50
- <div v-if="sampleDetails[i]" v-html="samplesMatching(view.id).description" :key="i+'_2'"/>
51
- <a v-bind:key="i+'_5'" v-if="sampleDetails[i] && samplesMatching(view.id).path" :href="generateFileLink(samplesMatching(view.id))" target="_blank">View Source</a>
52
- <div :key="i" class="padding"/>
53
-
54
- <!-- Extra padding if sample details is open -->
55
- <div :key="i+'_6'" v-if="sampleDetails[i]" class="padding"/>
56
- </template>
57
- </template>
58
- </div>
59
- </el-card>
60
- </div>
61
- </div>
62
- </template>
63
-
64
-
65
- <script>
66
- /* eslint-disable no-alert, no-console */
67
- import Vue from "vue";
68
- import { Link, Icon, Card, Button, Select, Input } from "element-ui";
69
- import lang from "element-ui/lib/locale/lang/en";
70
- import locale from "element-ui/lib/locale";
71
- import EventBus from "./EventBus"
72
- import hardcoded_info from './hardcoded-context-info'
73
-
74
- locale.use(lang);
75
- Vue.use(Link);
76
- Vue.use(Icon);
77
- Vue.use(Card);
78
- Vue.use(Button);
79
- Vue.use(Select);
80
- Vue.use(Input);
81
-
82
- const addFilesToPathIfMissing = function(path){
83
- if (!path.includes('files')){
84
- return 'files/' + path
85
- } else {
86
- return path
87
- }
88
- }
89
-
90
- const convertBackslashToForwardSlash = function(path){
91
- path = path.replaceAll('\\','/')
92
- path = path.replaceAll('\\\\', '/')
93
- return path
94
- }
95
-
96
- // const switchPathToDirectory = function(path){
97
- // let newPath = path.split('/')
98
- // newPath.pop()
99
- // return newPath.join('/')
100
- // }
101
-
102
-
103
- export default {
104
- name: "contextCard",
105
- props: {
106
- /**
107
- * Object containing information for
108
- * the required viewing.
109
- */
110
- entry: Object,
111
- envVars: Object,
112
- },
113
- data: function () {
114
- return {
115
- contextData: {},
116
- showDetails: true,
117
- showContextCard: true,
118
- sampleDetails: {},
119
- loading: false
120
- };
121
- },
122
- watch: {
123
- 'entry.contextCardUrl': {
124
- handler(val){
125
- if (val) {
126
- // used for hardcoding data
127
- if (val === true){
128
- this.contextData = hardcoded_info[this.entry.discoverId]
129
- } else {
130
- this.getContextFile(val)
131
- this.showContextCard = true
132
- }
133
- } else {
134
- this.showContextCard = false
135
- }
136
- },
137
- immediate: true
138
- }
139
- },
140
- computed: {
141
- samplesUnderViews: function(){
142
- if (this.contextData){
143
- if (this.contextData.samplesUnderViews){
144
- return true
145
- } else {
146
- let viewId = this.contextData.views.map(v=>v.id)
147
- let samplesView = this.contextData.samples.map(s=>s.view)
148
-
149
- // get matching values
150
- let matching = viewId.filter(v=>samplesView.includes(v))
151
-
152
- // check all arrays have the same length (which means all values are in all three)
153
- if ( viewId.length === matching.length && matching.length === samplesView.length){
154
- return true
155
- }
156
- return false
157
- }
158
- }
159
- else return false
160
- },
161
- },
162
- methods: {
163
- samplesMatching: function(viewId){
164
- if (this.contextData && this.contextData.samples){
165
- return this.contextData.samples.filter(s=>s.view == viewId)[0]
166
- }
167
- else return []
168
- },
169
- viewClicked: function(view, i){
170
- this.openViewFile(view)
171
- this.toggleSampleDetails(i)
172
- },
173
- getContextFile: function (contextFileUrl) {
174
- this.loading = true
175
- fetch(contextFileUrl)
176
- .then((response) =>{
177
- if (!response.ok){
178
- throw Error(response.statusText)
179
- } else {
180
- return response.json()
181
- }
182
- })
183
- .then((data) => {
184
- this.contextData = data
185
- this.loading = false
186
- this.addDiscoverIdsToContextData()
187
- })
188
- .catch((err) => {
189
- //set defaults if we hit an error
190
- console.error('caught error!', err)
191
- this.thumbnail = require('@/../assets/missing-image.svg')
192
- this.discoverId = undefined
193
- this.loading = false
194
- });
195
- },
196
- removeDoubleFilesPath: function(path){
197
- if (path.includes('files/')){
198
- return path.replace('files/', '')
199
- } else if (path.includes('files\\')) {
200
- return path.replace('files\\', '')
201
- } else {
202
- return path
203
- }
204
- },
205
- toggleSampleDetails: function(i){
206
- if (this.sampleDetails[i] === undefined){
207
- Vue.set(this.sampleDetails, i, true)
208
- } else {
209
- Vue.set(this.sampleDetails, i, !this.sampleDetails[i])
210
- }
211
- },
212
- getFileFromPath: function(path){
213
- // for hardcoded data
214
- if(this.entry.contextCardUrl === true){
215
- return path
216
- }
217
- path = this.removeDoubleFilesPath(path)
218
- return `${this.envVars.API_LOCATION}s3-resource/${this.entry.discoverId}/${this.entry.version}/files/${path}`
219
- },
220
- // This is used later when generateing links to the resource on sparc.science (see generateFileLink)
221
- addDiscoverIdsToContextData(){
222
- this.contextData.samples.forEach((sample, i)=>{
223
- if (sample && sample.doi && sample.doi !== ""){
224
- fetch(`${this.envVars.PENNSIEVE_API_LOCATION}/discover/datasets/doi/${this.splitDoiFromUrl(sample.doi)}`)
225
- .then((response) => response.json())
226
- .then((data) => {
227
- this.contextData.samples[i].discoverId = data.id
228
- this.contextData.samples[i].version = data.version
229
- })
230
- } else {
231
- this.contextData.samples[i].discoverId = this.entry.discoverId
232
- this.contextData.samples[i].version = this.entry.version
233
- }
234
- })
235
- },
236
- processPathForUrl(path){
237
- path = convertBackslashToForwardSlash(path)
238
- path = addFilesToPathIfMissing(path)
239
- return encodeURI(path)
240
- },
241
- splitDoiFromUrl(url){
242
- return url.split('https://doi.org/').pop()
243
- },
244
- generateFileLink(sample){
245
- return `${this.envVars.ROOT_URL}/file/${sample.discoverId}/${sample.version}?path=${this.processPathForUrl(sample.path)}`
246
-
247
- },
248
- openViewFile: function(view){
249
- // note that we assume that the view file is in the same directory as the scaffold (viewUrls take relative paths)
250
- this.entry.viewUrl = `${this.envVars.API_LOCATION}s3-resource/${this.entry.discoverId}/${this.entry.version}/${view.path}`
251
- this.entry.type = 'Scaffold View'
252
- EventBus.$emit("PopoverActionClick", this.entry)
253
- }
254
- }
255
- };
256
- </script>
257
-
258
- <!-- Add "scoped" attribute to limit CSS to this component only -->
259
- <style scoped>
260
-
261
- .hide{
262
- color: #e4e7ed;
263
- cursor: pointer;
264
- }
265
-
266
- .context-card{
267
- background-color: white;
268
- max-height: 10 50px;
269
- padding: 8px;
270
- font-size: 14px;
271
- margin-bottom: 18px;
272
- position: relative;
273
- border: solid 1px #e4e7ed;
274
- display: flex;
275
- width: 500px;
276
- max-height: 258px;
277
- }
278
-
279
- .context-card-view{
280
- cursor: pointer;
281
- padding-bottom: 8px;
282
- display: flex;
283
- }
284
-
285
- .view-image {
286
- width: 34px;
287
- height: 34px;
288
- flex: 1;
289
- margin-right: 4px;
290
- }
291
-
292
- .view-descriptions {
293
- flex: 8;
294
- }
295
-
296
- .context-card >>> .el-card__body {
297
- padding: 0px;
298
- display: flex;
299
- width: 516px;
300
- }
301
-
302
- .context-image{
303
- width: 250px;
304
- height: auto;
305
- }
306
-
307
- .color-box {
308
- width: 16px;
309
- height: 16px;
310
- border: solid 1px #8300bf;
311
- border-radius: 2px;
312
- margin-right: 8px;
313
- }
314
-
315
- .card-left{
316
- flex: 1
317
- }
318
-
319
- .card-right {
320
- flex: 1.3;
321
- padding-left: 6px;
322
- overflow-y: scroll;
323
- scrollbar-width: thin;
324
- }
325
-
326
- .cursor-pointer {
327
- cursor: pointer;
328
- }
329
-
330
- .info{
331
- transform: rotate(180deg);
332
- color: #8300bf;
333
- margin-left: 8px;
334
- }
335
-
336
- .padding {
337
- padding-bottom: 8px;
338
- }
339
-
340
- .title{
341
- font-weight: bold;
342
- }
343
-
344
- .subtitle{
345
- font-weight: bold;
346
- }
347
-
348
- .scrollbar::-webkit-scrollbar-track {
349
- border-radius: 10px;
350
- background-color: #f5f5f5;
351
- }
352
-
353
- .scrollbar::-webkit-scrollbar {
354
- width: 12px;
355
- right: -12px;
356
- background-color: #f5f5f5;
357
- }
358
-
359
- .scrollbar::-webkit-scrollbar-thumb {
360
- border-radius: 4px;
361
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.06);
362
- background-color: #979797;
363
- }
364
-
365
- </style>
1
+ <template>
2
+ <div class="context-card-container" ref="container">
3
+ <div v-show="showContextCard">
4
+ <div v-show="showDetails" class="hide" @click="showDetails = !showDetails">Hide information<i class="el-icon-arrow-up"></i></div>
5
+ <div v-show="!showDetails" class="hide" @click="showDetails = !showDetails">Show information<i class="el-icon-arrow-down"></i></div>
6
+ <el-card v-if="showDetails && Object.keys(contextData).length !== 0" v-loading="loading" class="context-card" >
7
+ <div class="card-left">
8
+ <img :src="entry.banner" class="context-image">
9
+ </div>
10
+ <div class="card-right scrollbar">
11
+ <div class="title">{{contextData.heading}}</div>
12
+ <div v-html="contextData.description"/>
13
+ <br/>
14
+
15
+ <!-- Show sampeles and views seperately if they do not match -->
16
+ <template v-if="!samplesUnderViews">
17
+ <div v-if="contextData.views && contextData.views.length > 0" class="subtitle">Scaffold Views</div>
18
+ <template v-for="(view, i) in contextData.views">
19
+ <div v-bind:key="i+'_1'" @click="openViewFile(view)" class="context-card-view">
20
+ <img class="view-image" :src="getFileFromPath(view.thumbnail)">
21
+ <div class="view-description">{{view.description}}</div>
22
+ </div>
23
+ <div v-bind:key="i" class="padding"/>
24
+ </template>
25
+ <div style="margin-bottom: 16px;"/>
26
+ <div v-if="contextData.samples && contextData.samples.length > 0" class="subtitle">Samples on Scaffold</div>
27
+ <template v-for="(sample, i) in contextData.samples">
28
+ <span v-bind:key="i+'_3'" class="context-card-item cursor-pointer" @click="toggleSampleDetails(i)">
29
+ <div v-bind:key="i+'_6'" style="display: flex">
30
+ <div v-if="sample.color" class="color-box" :style="'background-color:'+ sample.color"></div>
31
+ <img class="key-image" v-else-if="sample.thumbnail" :src="getFileFromPath(sample.thumbnail)">
32
+ {{sample.heading}}
33
+ <i class="el-icon-warning-outline info"></i>
34
+ </div>
35
+ </span>
36
+ <div v-bind:key="i+'_4'" v-if="sampleDetails[i]" v-html="sample.description"/>
37
+ <a v-bind:key="i+'_5'" v-if="sampleDetails[i] && sample.path" :href="generateFileLink(sample)" target="_blank">View Source</a>
38
+ <div v-bind:key="i+'_2'" class="padding"/>
39
+ </template>
40
+ </template>
41
+
42
+ <!-- Show samples under views if the ids match -->
43
+ <template v-else>
44
+ <div v-if="contextData.views && contextData.views.length > 0" class="subtitle">Scaffold Views</div>
45
+ <template v-for="(view, i) in contextData.views">
46
+ <span :key="i+'_1'" @click="viewClicked(view, i)" class="context-card-view">
47
+ <img class="view-image" :src="getFileFromPath(view.thumbnail)"/>
48
+ <div class="view-description">{{view.description}}<i class="el-icon-warning-outline info"></i> </div>
49
+ </span>
50
+ <div v-if="sampleDetails[i]" v-html="samplesMatching(view.id).description" :key="i+'_2'"/>
51
+ <a v-bind:key="i+'_5'" v-if="sampleDetails[i] && samplesMatching(view.id).path" :href="generateFileLink(samplesMatching(view.id))" target="_blank">View Source</a>
52
+ <div :key="i" class="padding"/>
53
+
54
+ <!-- Extra padding if sample details is open -->
55
+ <div :key="i+'_6'" v-if="sampleDetails[i]" class="padding"/>
56
+ </template>
57
+ </template>
58
+ </div>
59
+ </el-card>
60
+ </div>
61
+ </div>
62
+ </template>
63
+
64
+
65
+ <script>
66
+ /* eslint-disable no-alert, no-console */
67
+ import Vue from "vue";
68
+ import { Link, Icon, Card, Button, Select, Input } from "element-ui";
69
+ import lang from "element-ui/lib/locale/lang/en";
70
+ import locale from "element-ui/lib/locale";
71
+ import EventBus from "./EventBus"
72
+ import hardcoded_info from './hardcoded-context-info'
73
+
74
+ locale.use(lang);
75
+ Vue.use(Link);
76
+ Vue.use(Icon);
77
+ Vue.use(Card);
78
+ Vue.use(Button);
79
+ Vue.use(Select);
80
+ Vue.use(Input);
81
+
82
+ const addFilesToPathIfMissing = function(path){
83
+ if (!path.includes('files')){
84
+ return 'files/' + path
85
+ } else {
86
+ return path
87
+ }
88
+ }
89
+
90
+ const convertBackslashToForwardSlash = function(path){
91
+ path = path.replaceAll('\\','/')
92
+ path = path.replaceAll('\\\\', '/')
93
+ return path
94
+ }
95
+
96
+ // const switchPathToDirectory = function(path){
97
+ // let newPath = path.split('/')
98
+ // newPath.pop()
99
+ // return newPath.join('/')
100
+ // }
101
+
102
+
103
+ export default {
104
+ name: "contextCard",
105
+ props: {
106
+ /**
107
+ * Object containing information for
108
+ * the required viewing.
109
+ */
110
+ entry: Object,
111
+ envVars: Object,
112
+ },
113
+ data: function () {
114
+ return {
115
+ contextData: {},
116
+ showDetails: true,
117
+ showContextCard: true,
118
+ sampleDetails: {},
119
+ loading: false
120
+ };
121
+ },
122
+ watch: {
123
+ 'entry.contextCardUrl': {
124
+ handler(val){
125
+ if (val) {
126
+ // used for hardcoding data
127
+ if (val === true){
128
+ this.contextData = hardcoded_info[this.entry.discoverId]
129
+ } else {
130
+ this.getContextFile(val)
131
+ this.showContextCard = true
132
+ }
133
+ } else {
134
+ this.showContextCard = false
135
+ }
136
+ },
137
+ immediate: true
138
+ }
139
+ },
140
+ computed: {
141
+ samplesUnderViews: function(){
142
+ if (this.contextData){
143
+ if (this.contextData.samplesUnderViews){
144
+ return true
145
+ } else {
146
+ let viewId = this.contextData.views.map(v=>v.id)
147
+ let samplesView = this.contextData.samples.map(s=>s.view)
148
+
149
+ // get matching values
150
+ let matching = viewId.filter(v=>samplesView.includes(v))
151
+
152
+ // check all arrays have the same length (which means all values are in all three)
153
+ if ( viewId.length === matching.length && matching.length === samplesView.length){
154
+ return true
155
+ }
156
+ return false
157
+ }
158
+ }
159
+ else return false
160
+ },
161
+ },
162
+ methods: {
163
+ samplesMatching: function(viewId){
164
+ if (this.contextData && this.contextData.samples){
165
+ return this.contextData.samples.filter(s=>s.view == viewId)[0]
166
+ }
167
+ else return []
168
+ },
169
+ viewClicked: function(view, i){
170
+ this.openViewFile(view)
171
+ this.toggleSampleDetails(i)
172
+ },
173
+ getContextFile: function (contextFileUrl) {
174
+ this.loading = true
175
+ fetch(contextFileUrl)
176
+ .then((response) =>{
177
+ if (!response.ok){
178
+ throw Error(response.statusText)
179
+ } else {
180
+ return response.json()
181
+ }
182
+ })
183
+ .then((data) => {
184
+ this.contextData = data
185
+ this.loading = false
186
+ this.addDiscoverIdsToContextData()
187
+ })
188
+ .catch((err) => {
189
+ //set defaults if we hit an error
190
+ console.error('caught error!', err)
191
+ this.thumbnail = require('@/../assets/missing-image.svg')
192
+ this.discoverId = undefined
193
+ this.loading = false
194
+ });
195
+ },
196
+ removeDoubleFilesPath: function(path){
197
+ if (path.includes('files/')){
198
+ return path.replace('files/', '')
199
+ } else if (path.includes('files\\')) {
200
+ return path.replace('files\\', '')
201
+ } else {
202
+ return path
203
+ }
204
+ },
205
+ toggleSampleDetails: function(i){
206
+ if (this.sampleDetails[i] === undefined){
207
+ Vue.set(this.sampleDetails, i, true)
208
+ } else {
209
+ Vue.set(this.sampleDetails, i, !this.sampleDetails[i])
210
+ }
211
+ },
212
+ getFileFromPath: function(path){
213
+ // for hardcoded data
214
+ if(this.entry.contextCardUrl === true){
215
+ return path
216
+ }
217
+ path = this.removeDoubleFilesPath(path)
218
+ return `${this.envVars.API_LOCATION}s3-resource/${this.entry.discoverId}/${this.entry.version}/files/${path}`
219
+ },
220
+ // This is used later when generateing links to the resource on sparc.science (see generateFileLink)
221
+ addDiscoverIdsToContextData(){
222
+ this.contextData.samples.forEach((sample, i)=>{
223
+ if (sample && sample.doi && sample.doi !== ""){
224
+ fetch(`${this.envVars.PENNSIEVE_API_LOCATION}/discover/datasets/doi/${this.splitDoiFromUrl(sample.doi)}`)
225
+ .then((response) => response.json())
226
+ .then((data) => {
227
+ this.contextData.samples[i].discoverId = data.id
228
+ this.contextData.samples[i].version = data.version
229
+ })
230
+ } else {
231
+ this.contextData.samples[i].discoverId = this.entry.discoverId
232
+ this.contextData.samples[i].version = this.entry.version
233
+ }
234
+ })
235
+ },
236
+ processPathForUrl(path){
237
+ path = convertBackslashToForwardSlash(path)
238
+ path = addFilesToPathIfMissing(path)
239
+ return encodeURI(path)
240
+ },
241
+ splitDoiFromUrl(url){
242
+ return url.split('https://doi.org/').pop()
243
+ },
244
+ generateFileLink(sample){
245
+ return `${this.envVars.ROOT_URL}/file/${sample.discoverId}/${sample.version}?path=${this.processPathForUrl(sample.path)}`
246
+
247
+ },
248
+ openViewFile: function(view){
249
+ // note that we assume that the view file is in the same directory as the scaffold (viewUrls take relative paths)
250
+ this.entry.viewUrl = `${this.envVars.API_LOCATION}s3-resource/${this.entry.discoverId}/${this.entry.version}/${view.path}`
251
+ this.entry.type = 'Scaffold View'
252
+ EventBus.$emit("PopoverActionClick", this.entry)
253
+ }
254
+ }
255
+ };
256
+ </script>
257
+
258
+ <!-- Add "scoped" attribute to limit CSS to this component only -->
259
+ <style scoped>
260
+
261
+ .hide{
262
+ color: #e4e7ed;
263
+ cursor: pointer;
264
+ }
265
+
266
+ .context-card{
267
+ background-color: white;
268
+ max-height: 10 50px;
269
+ padding: 8px;
270
+ font-size: 14px;
271
+ margin-bottom: 18px;
272
+ position: relative;
273
+ border: solid 1px #e4e7ed;
274
+ display: flex;
275
+ width: 500px;
276
+ max-height: 258px;
277
+ }
278
+
279
+ .context-card-view{
280
+ cursor: pointer;
281
+ padding-bottom: 8px;
282
+ display: flex;
283
+ }
284
+
285
+ .view-image {
286
+ width: 34px;
287
+ height: 34px;
288
+ flex: 1;
289
+ margin-right: 4px;
290
+ }
291
+
292
+ .view-descriptions {
293
+ flex: 8;
294
+ }
295
+
296
+ .context-card >>> .el-card__body {
297
+ padding: 0px;
298
+ display: flex;
299
+ width: 516px;
300
+ }
301
+
302
+ .context-image{
303
+ width: 250px;
304
+ height: auto;
305
+ }
306
+
307
+ .color-box {
308
+ width: 16px;
309
+ height: 16px;
310
+ border: solid 1px #8300bf;
311
+ border-radius: 2px;
312
+ margin-right: 8px;
313
+ }
314
+
315
+ .card-left{
316
+ flex: 1
317
+ }
318
+
319
+ .card-right {
320
+ flex: 1.3;
321
+ padding-left: 6px;
322
+ overflow-y: scroll;
323
+ scrollbar-width: thin;
324
+ }
325
+
326
+ .cursor-pointer {
327
+ cursor: pointer;
328
+ }
329
+
330
+ .info{
331
+ transform: rotate(180deg);
332
+ color: #8300bf;
333
+ margin-left: 8px;
334
+ }
335
+
336
+ .padding {
337
+ padding-bottom: 8px;
338
+ }
339
+
340
+ .title{
341
+ font-weight: bold;
342
+ }
343
+
344
+ .subtitle{
345
+ font-weight: bold;
346
+ }
347
+
348
+ .scrollbar::-webkit-scrollbar-track {
349
+ border-radius: 10px;
350
+ background-color: #f5f5f5;
351
+ }
352
+
353
+ .scrollbar::-webkit-scrollbar {
354
+ width: 12px;
355
+ right: -12px;
356
+ background-color: #f5f5f5;
357
+ }
358
+
359
+ .scrollbar::-webkit-scrollbar-thumb {
360
+ border-radius: 4px;
361
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.06);
362
+ background-color: #979797;
363
+ }
364
+
365
+ </style>