17
17
<div v-else class =" image-placeholder" >
18
18
<Icon :name =" item.icon" size =" 3em" color =" var(--vp-c-brand)" />
19
19
</div >
20
- <div v-if =" item.priceLabel" class =" price-corner-tag" >
20
+ <div v-if =" item.priceLabel" class =" price-corner-tag" :class = " { 'paid': item.priceLabel === '付费' } " >
21
21
<span class =" price-corner-text" >{{ item.priceLabel }}</span >
22
22
</div >
23
- </div >
24
- <div class =" card-content" >
25
- <div class =" card-header" >
23
+ <div class =" image-footer" >
26
24
<div class =" item-developer-info" >
27
25
<img
28
26
:src =" getGithubAvatarUrl(item.githubUser)"
36
34
<a
37
35
v-if =" item.link"
38
36
:href =" item.link"
39
- class =" github-link no-external-icon"
37
+ class =" no-external-icon"
40
38
target =" _blank"
41
39
rel =" noopener noreferrer"
42
40
aria-label =" GitHub仓库"
46
44
</a >
47
45
<span v-else class =" built-in-label-inline" >内置</span >
48
46
</div >
47
+ </div >
48
+ <div class =" card-content" >
49
49
<h3 class =" card-title" >{{ item.title }}</h3 >
50
50
<p class =" card-description" >{{ item.description }}</p >
51
51
<div class =" card-tags" >
@@ -135,6 +135,7 @@ const handleCardClick = (item: PluginItem) => {
135
135
overflow : hidden ;
136
136
transition : all 0.3s cubic-bezier (0.25 , 0.8 , 0.25 , 1 );
137
137
height : 100% ;
138
+ max-height : 360px ;
138
139
border : 1px solid var (--vp-c-divider );
139
140
}
140
141
@@ -150,7 +151,7 @@ const handleCardClick = (item: PluginItem) => {
150
151
151
152
.card-image {
152
153
width : 100% ;
153
- height : 160 px ;
154
+ height : 180 px ;
154
155
overflow : hidden ;
155
156
background : var (--vp-c-bg-soft );
156
157
position : relative ;
@@ -182,18 +183,17 @@ const handleCardClick = (item: PluginItem) => {
182
183
background : var (--vp-c-bg-soft );
183
184
}
184
185
185
- .card-content {
186
- padding : 1rem ;
187
- flex-grow : 1 ;
188
- display : flex ;
189
- flex-direction : column ;
190
- }
191
-
192
- .card-header {
186
+ .image-footer {
187
+ position : absolute ;
188
+ bottom : 0 ;
189
+ left : 0 ;
190
+ right : 0 ;
193
191
display : flex ;
194
192
justify-content : space-between ;
195
193
align-items : center ;
196
- margin-bottom : 0.8rem ; /* Space below the header */
194
+ padding : 0.5rem ;
195
+ background : rgba (0 , 0 , 0 , 0.1 );
196
+ color : #fff ;
197
197
}
198
198
199
199
.item-developer-info {
@@ -221,51 +221,43 @@ const handleCardClick = (item: PluginItem) => {
221
221
white-space : nowrap ;
222
222
}
223
223
224
- .github-link {
225
- color : var (--vp-c-text-2 );
226
- transition : color 0.2s ease ;
227
- pointer-events : auto ; /* Allow clicks on the icon */
228
- flex-shrink : 0 ;
229
- display : inline-flex ;
230
- align-items : center ;
231
- margin-left : 0.5rem ; /* Space between developer info and icon */
232
- }
233
-
234
- .github-link :hover {
235
- color : var (--vp-c-brand );
236
- }
237
-
238
224
.no-external-icon ::after {
239
225
content : none !important ;
240
226
}
241
227
242
228
.built-in-label-inline {
243
229
font-size : 0.75rem ;
244
- color : var (--vp-c-text-2 );
230
+ color : var (--vp-c-text-3 );
245
231
padding : 0.1rem 0.4rem ;
246
232
border-radius : 4px ;
247
- border : 1px solid var (--vp-c-divider );
248
- background-color : var ( --vp-c-bg-soft );
233
+ border : 1px solid var (--vp-c-border );
234
+ background : rgba ( 255 , 255 , 255 , 0.1 );
249
235
flex-shrink : 0 ;
250
- margin-left : 0.5rem ; /* Space between developer info and label */
236
+ margin-left : 0.5rem ;
251
237
white-space : nowrap ;
252
238
font-weight : 500 ;
253
239
}
254
240
241
+ .card-content {
242
+ padding : 0.75rem ;
243
+ flex-grow : 1 ;
244
+ display : flex ;
245
+ flex-direction : column ;
246
+ }
255
247
256
248
.card-title {
257
- font-size : 1 rem ;
249
+ font-size : 0.95 rem ;
258
250
font-weight : 600 ;
259
251
color : var (--vp-c-text-1 );
260
- margin : 0 0 0.4 rem 0 ;
252
+ margin : 0 0 0.5 rem 0 ;
261
253
line-height : 1.4 ;
262
254
}
263
255
264
256
.card-description {
265
257
color : var (--vp-c-text-2 );
266
- font-size : 0.85 rem ;
258
+ font-size : 0.8 rem ;
267
259
line-height : 1.5 ;
268
- margin : 0 0 0.8 rem 0 ;
260
+ margin : 0 0 0.75 rem 0 ;
269
261
flex-grow : 1 ;
270
262
}
271
263
@@ -274,7 +266,7 @@ const handleCardClick = (item: PluginItem) => {
274
266
flex-wrap : wrap ;
275
267
align-items : center ;
276
268
gap : 0.4rem ;
277
- margin-top : auto ;
269
+ margin-bottom : 0.5 rem ;
278
270
}
279
271
280
272
.badge {
@@ -283,21 +275,52 @@ const handleCardClick = (item: PluginItem) => {
283
275
justify-content : center ;
284
276
padding : 0.1rem 0.5rem ;
285
277
border-radius : 4px ;
286
- font-size : 0.75 rem ;
278
+ font-size : 0.7 rem ;
287
279
line-height : 1 ;
288
280
font-weight : 500 ;
289
281
white-space : nowrap ;
290
282
border : 1px solid transparent ;
291
283
}
292
284
285
+ .price-corner-tag {
286
+ position : absolute ;
287
+ top : 0 ;
288
+ right : 0 ;
289
+ background : #17bf63 ;
290
+ color : #fff ;
291
+ padding : 0.3rem 0.6rem ;
292
+ font-size : 0.75rem ;
293
+ font-weight : 500 ;
294
+ line-height : 1 ;
295
+ border-bottom-left-radius : 4px ;
296
+ transform : translate (1px , -1px );
297
+ z-index : 1 ;
298
+ }
299
+
300
+ .price-corner-tag {
301
+ background : #17bf63 ;
302
+ }
303
+
304
+ .price-corner-tag.paid {
305
+ background : #ff5733 ;
306
+ }
307
+
308
+ .price-corner-text {
309
+ text-transform : uppercase ;
310
+ }
311
+
293
312
@media (min-width : 768px ) {
294
313
.plugin-card-container {
295
314
grid-template-columns : repeat (2 , 1fr );
296
315
gap : 1.2rem ;
297
316
}
298
317
299
318
.card-image {
300
- height : 160px ;
319
+ height : 200px ;
320
+ }
321
+
322
+ .card-content {
323
+ padding : 0.75rem ;
301
324
}
302
325
}
303
326
@@ -308,7 +331,11 @@ const handleCardClick = (item: PluginItem) => {
308
331
}
309
332
310
333
.card-image {
311
- height : 180px ;
334
+ height : 220px ;
335
+ }
336
+
337
+ .card-content {
338
+ padding : 0.75rem ;
312
339
}
313
340
}
314
- </style >
341
+ </style >
0 commit comments