yggdrasil/components/post/
post_cover.rs1use leptos::prelude::*;
7
8#[component]
18pub fn PostCover(
19 #[prop(into)] src: String,
20 #[prop(optional, into)] post_id: MaybeProp<i32>,
21) -> impl IntoView {
22 let ar_style = {
24 #[cfg_attr(not(feature = "server"), allow(unused_mut))]
25 let mut s = String::new();
26 #[cfg(feature = "server")]
27 {
28 if let Some(rel) = src
29 .strip_prefix("/uploads/")
30 .map(|p| p.split('?').next().unwrap_or(p))
31 {
32 if let Some((w, h)) = crate::api::image::get_image_dimensions(rel) {
33 s = format!("--ar:{} / {};", w, h);
35 }
36 }
37 }
38 s
39 };
40
41 let placeholder_src = if src.contains('?') {
43 format!("{}&w=20", src.split('?').next().unwrap_or(&src))
44 } else {
45 format!("{}?w=20", src)
46 };
47 let full_src = if src.contains('?') {
48 format!("{}&w=1200", src.split('?').next().unwrap_or(&src))
49 } else {
50 format!("{}?w=1200", src)
51 };
52 let post_id = post_id.get_untracked();
53
54 view! {
55 <figure
56 class="entry-cover"
57 data-vt-post-id=post_id.map(|id| id.to_string())
58 data-vt-role=post_id.map(|_| "cover")
59 >
60 <span class="blur-img entry-cover-blur lightbox-single" style=ar_style>
61 <img class="blur-img-placeholder" src=placeholder_src alt="封面图片"/>
62 <img class="blur-img-full" data-src=full_src alt="封面图片"/>
63 </span>
64 </figure>
65 }
66}