1
1
<script lang =" ts" >
2
- import { PodcastFeed } from " src/types/PodcastFeed" ;
3
- import { createEventDispatcher } from " svelte" ;
4
- import Button from " ../obsidian/Button.svelte" ;
5
- import { fade , fly } from ' svelte/transition' ;
2
+ import type { PodcastFeed } from " src/types/PodcastFeed" ;
3
+ import { createEventDispatcher } from " svelte" ;
4
+ import Button from " ../obsidian/Button.svelte" ;
5
+ import { fade } from " svelte/transition" ;
6
6
7
- export let podcast: PodcastFeed ;
8
- export let isSaved: boolean = false ;
7
+ export let podcast: PodcastFeed ;
8
+ export let isSaved = false ;
9
9
10
- const dispatch = createEventDispatcher ();
11
-
12
- function onAddPodcast() {
13
- dispatch (" addPodcast" , { podcast });
14
- }
15
-
16
- function onRemovePodcast() {
17
- dispatch (" removePodcast" , { podcast });
18
- }
10
+ const dispatch = createEventDispatcher ();
19
11
</script >
20
12
21
13
<div class ="podcast-result-card" transition:fade ={{ duration : 300 }}>
22
- <img
23
- src ={podcast .artworkUrl }
24
- alt ={` Artwork for ${podcast .title } ` }
25
- class =" podcast-artwork"
26
- />
27
- <div class =" podcast-info" >
28
- <h3 class ="podcast-title" >{podcast .title }</h3 >
29
- </div >
30
- <div class =" podcast-actions" >
31
- {#if isSaved }
32
- <Button
33
- icon =" trash"
34
- ariaLabel ={` Remove ${podcast .title } podcast ` }
35
- on:click ={onRemovePodcast }
36
- />
37
- {:else }
38
- <Button
39
- icon =" plus"
40
- ariaLabel ={` Add ${podcast .title } podcast ` }
41
- on:click ={onAddPodcast }
42
- />
43
- {/if }
44
- </div >
14
+ <div class =" podcast-artwork-container" >
15
+ <img
16
+ src ={podcast .artworkUrl }
17
+ alt ={` Artwork for ${podcast .title } ` }
18
+ class =" podcast-artwork"
19
+ />
20
+ </div >
21
+ <div class =" podcast-info" >
22
+ <h3 class ="podcast-title" >{podcast .title }</h3 >
23
+ </div >
24
+ <div class =" podcast-actions" >
25
+ {#if isSaved }
26
+ <Button
27
+ icon =" trash"
28
+ aria-label ={` Remove ${podcast .title } podcast ` }
29
+ on:click ={() => dispatch (" removePodcast" , { podcast })}
30
+ />
31
+ {:else }
32
+ <Button
33
+ icon =" plus"
34
+ aria-label ={` Add ${podcast .title } podcast ` }
35
+ on:click ={() => dispatch (" addPodcast" , { podcast })}
36
+ />
37
+ {/if }
38
+ </div >
45
39
</div >
46
40
47
41
<style >
48
- .podcast-result-card {
49
- display : flex ;
50
- align-items : center ;
51
- padding : 16px ;
52
- border : 1px solid var (--background-modifier-border );
53
- border-radius : 8px ;
54
- background-color : var (--background-secondary );
55
- max-width : 100% ;
56
- transition : all 0.3s ease ;
57
- }
42
+ .podcast-result-card {
43
+ display : flex ;
44
+ align-items : center ;
45
+ padding : 16px ;
46
+ border : 1px solid var (--background-modifier-border );
47
+ border-radius : 8px ;
48
+ background-color : var (--background-secondary );
49
+ max-width : 100% ;
50
+ transition : all 0.3s ease ;
51
+ position : relative ;
52
+ }
53
+
54
+ .podcast-artwork-container {
55
+ width : 70px ;
56
+ height : 70px ;
57
+ flex-shrink : 0 ;
58
+ margin-right : 20px ;
59
+ overflow : hidden ;
60
+ border-radius : 4px ;
61
+ position : relative ;
62
+ }
63
+
64
+ .podcast-artwork {
65
+ width : 100% ;
66
+ height : 100% ;
67
+ object-fit : cover ;
68
+ position : absolute ;
69
+ top : 0 ;
70
+ left : 0 ;
71
+ }
72
+
73
+ .podcast-result-card :hover {
74
+ box-shadow : 0 2px 8px rgba (0 , 0 , 0 , 0.1 );
75
+ transform : translateY (-2px );
76
+ }
58
77
59
- .podcast-result-card :hover {
60
- box-shadow : 0 2px 8px rgba (0 , 0 , 0 , 0.1 );
61
- transform : translateY (-2px );
62
- }
78
+ .podcast-info {
79
+ flex-grow : 1 ;
80
+ min-width : 0 ;
81
+ padding-right : 12px ;
82
+ }
63
83
64
- .podcast-artwork {
65
- width : 70px ;
66
- height : 70px ;
67
- object-fit : cover ;
68
- border-radius : 4px ;
69
- margin-right : 20px ;
70
- flex-shrink : 0 ;
71
- }
84
+ .podcast-title {
85
+ margin : 0 0 6px 0 ;
86
+ font-size : 16px ;
87
+ font-weight : bold ;
88
+ line-height : 1.3 ;
89
+ word-break : break-word ;
90
+ }
72
91
73
- .podcast-info {
74
- flex-grow : 1 ;
75
- min-width : 0 ;
76
- padding-right : 12 px ;
77
- }
92
+ .podcast-actions {
93
+ display : flex ;
94
+ align-items : center ;
95
+ flex-shrink : 0 ;
96
+ }
78
97
79
- .podcast-title {
80
- margin : 0 0 6px 12px ;
81
- font-size : 16px ;
82
- font-weight : bold ;
83
- line-height : 1.3 ;
84
- word-break : break-word ;
85
- }
98
+ :global(.podcast-actions button ) {
99
+ padding : 4px ;
100
+ width : 24px ;
101
+ height : 24px ;
102
+ }
86
103
87
- .podcast-actions {
88
- display : flex ;
89
- align-items : center ;
90
- flex-shrink : 0 ;
91
- }
92
- </style >
104
+ :global(.podcast-actions button svg ) {
105
+ width : 16px ;
106
+ height : 16px ;
107
+ }
108
+ </style >
0 commit comments