From 9752a97a3b9868533b0ce28e0c1798506ed4897c Mon Sep 17 00:00:00 2001 From: Daniel Boros Date: Sat, 4 Jan 2025 20:04:41 +0100 Subject: [PATCH] feat: new blog ui --- bun.lockb | Bin 42750 -> 0 bytes src/app.rs | 6 +- src/components/header.rs | 24 ++++--- src/pages/home.rs | 137 ++------------------------------------- src/ssr/api.rs | 6 +- 5 files changed, 24 insertions(+), 149 deletions(-) delete mode 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index b3d0ef4df4fab3ae2bb4ca5e93249487a5dc413d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42750 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

&?Xa2yMF2$P^(LSYGq+ApJtpUJuJ*?Mp}i{N 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 L impl IntoView { - + @@ -87,9 +87,9 @@ pub fn App() -> impl IntoView { view! { -

+
-
+
impl IntoView { view! { -
-
-
-
+
+
+
+ + diff --git a/src/pages/home.rs b/src/pages/home.rs index 76328c4..98ed7d2 100644 --- a/src/pages/home.rs +++ b/src/pages/home.rs @@ -20,7 +20,7 @@ pub fn Component() -> impl IntoView { view! { <Suspense fallback=|| ()> - <div class="gap-4 columns-1 sm:columns-2"> + <div class="gap-4 mb-20"> <For each=move || posts.get().and_then(Result::ok).unwrap_or_default() key=|post| post.id.id.to_string() @@ -28,143 +28,14 @@ pub fn Component() -> impl IntoView { > <div class="flex flex-col p-3 text-left text-white rounded-lg transition-all duration-500 cursor-pointer break-inside-avoid bg-card hover:text-[#ffef5c]"> <A href=format!("/post/{}", post.slug.as_ref().map_or("", |v| v))> - <div class="flex flex-col gap-1 mb-4 font-medium"> - <p class="text-base line-clamp-2">{post.title}</p> - <p class="italic text-xxs">{post.summary}</p> - </div> - <div class="flex flex-row gap-3 justify-start items-center text-xxs"> - <div class="flex flex-row gap-3"> - <div class="flex flex-row gap-1 items-center"> - <svg - class="size-4" - width="1em" - height="1em" - viewBox="0 0 512 512" - fill="currentColor" - role="graphics-symbol" - data-hk="0-1-0-15" - > - <circle cx="256" cy="272" r="16"></circle> - <path d="M280,81.5V72a24,24,0,0,0-48,0v9.5a191,191,0,0,0-84.43,32.13L137,103A24,24,0,0,0,103,137l8.6,8.6A191.17,191.17,0,0,0,64,272c0,105.87,86.13,192,192,192s192-86.13,192-192C448,174.26,374.58,93.34,280,81.5ZM256,320a48,48,0,0,1-16-93.25V152a16,16,0,0,1,32,0v74.75A48,48,0,0,1,256,320Z"></path> - </svg> - <p>{format!("{} min read", post.read_time)}</p> - </div> - <div class="flex flex-row gap-1 items-center"> - <svg - class="size-4" - width="1em" - height="1em" - viewBox="0 0 512 512" - fill="currentColor" - role="graphics-symbol" - data-hk="0-1-0-20" - > - <circle cx="256" cy="256" r="64"></circle> - <path d="M490.84,238.6c-26.46-40.92-60.79-75.68-99.27-100.53C349,110.55,302,96,255.66,96c-42.52,0-84.33,12.15-124.27,36.11C90.66,156.54,53.76,192.23,21.71,238.18a31.92,31.92,0,0,0-.64,35.54c26.41,41.33,60.4,76.14,98.28,100.65C162,402,207.9,416,255.66,416c46.71,0,93.81-14.43,136.2-41.72,38.46-24.77,72.72-59.66,99.08-100.92A32.2,32.2,0,0,0,490.84,238.6ZM256,352a96,96,0,1,1,96-96A96.11,96.11,0,0,1,256,352Z"></path> - </svg> - <p>{format!("{} views", post.total_views)}</p> - </div> - <div class="flex flex-row gap-1 items-center"> - <svg - class="size-4" - width="1em" - height="1em" - viewBox="0 0 512 512" - fill="currentColor" - role="graphics-symbol" - data-hk="0-1-0-25" - > - <path d="M480,128a64,64,0,0,0-64-64H400V48.45c0-8.61-6.62-16-15.23-16.43A16,16,0,0,0,368,48V64H144V48.45c0-8.61-6.62-16-15.23-16.43A16,16,0,0,0,112,48V64H96a64,64,0,0,0-64,64v12a4,4,0,0,0,4,4H476a4,4,0,0,0,4-4Z"></path> - <path d="M32,416a64,64,0,0,0,64,64H416a64,64,0,0,0,64-64V179a3,3,0,0,0-3-3H35a3,3,0,0,0-3,3ZM376,208a24,24,0,1,1-24,24A24,24,0,0,1,376,208Zm0,80a24,24,0,1,1-24,24A24,24,0,0,1,376,288Zm-80-80a24,24,0,1,1-24,24A24,24,0,0,1,296,208Zm0,80a24,24,0,1,1-24,24A24,24,0,0,1,296,288Zm0,80a24,24,0,1,1-24,24A24,24,0,0,1,296,368Zm-80-80a24,24,0,1,1-24,24A24,24,0,0,1,216,288Zm0,80a24,24,0,1,1-24,24A24,24,0,0,1,216,368Zm-80-80a24,24,0,1,1-24,24A24,24,0,0,1,136,288Zm0,80a24,24,0,1,1-24,24A24,24,0,0,1,136,368Z"></path> - </svg> - <p>{post.created_at}</p> - </div> - </div> - <div class="flex flex-row gap-1 items-center"> - <svg - class="size-4" - width="1em" - height="1em" - viewBox="0 0 512 512" - fill="currentColor" - role="graphics-symbol" - data-hk="0-1-0-30" - > - <path d="M332.64,64.58C313.18,43.57,286,32,256,32c-30.16,0-57.43,11.5-76.8,32.38-19.58,21.11-29.12,49.8-26.88,80.78C156.76,206.28,203.27,256,256,256s99.16-49.71,103.67-110.82C361.94,114.48,352.34,85.85,332.64,64.58Z"></path> - <path d="M432,480H80A31,31,0,0,1,55.8,468.87c-6.5-7.77-9.12-18.38-7.18-29.11C57.06,392.94,83.4,353.61,124.8,326c36.78-24.51,83.37-38,131.2-38s94.42,13.5,131.2,38c41.4,27.6,67.74,66.93,76.18,113.75,1.94,10.73-.68,21.34-7.18,29.11A31,31,0,0,1,432,480Z"></path> - </svg> - <button on:click=move |e| { - e.prevent_default(); - e.stop_propagation(); - let _ = window() - .open_with_url_and_target( - post.author.github.as_ref().unwrap_or(&"".to_string()), - "_blank", - ); - }> - <span class="text-xs font-semibold cursor-pointer hover:underline"> - {post.author.name} - </span> - </button> - </div> + <div class="flex flex-col gap-1 w-full font-thin"> + <p class="text-xs text-[#969696]">{post.created_at}</p> + <p class="text-xs underline line-clamp-2">{post.title}</p> </div> </A> </div> </For> </div> </Suspense> - <Suspense fallback=|| view! { <loader::Component /> }> - <div class="flex flex-row flex-wrap gap-1 px-4 text-xs"> - <button - on:click=move |_| selected_tags.update(|prev| prev.clear()) - class="py-1 px-2 text-white rounded-lg transition-all duration-500 cursor-pointer bg-primary" - class=("underline", move || selected_tags.get().is_empty()) - > - {"All"} - </button> - <For each=move || tags.get().unwrap_or_default() key=|tag| tag.clone() let:data> - <button - on:click={ - let tag = data.0.clone(); - move |_| { - selected_tags - .update(|prev| { - if prev.contains(&tag) { - *prev = prev - .clone() - .into_iter() - .filter(|v| v != &tag) - .collect::<Vec<_>>(); - } else { - *prev = prev - .clone() - .into_iter() - .chain(std::iter::once(tag.clone())) - .collect(); - } - }); - } - } - class="py-1 px-2 rounded-lg transition-all duration-500 cursor-pointer hover:text-black hover:bg-white" - class=( - "bg-white", - { - let tag = data.0.clone(); - move || selected_tags.get().contains(&tag) - }, - ) - class=( - "text-black", - { - let tag = data.0.clone(); - move || selected_tags.get().contains(&tag) - }, - ) - > - {data.0.clone() + " (" + &data.1.to_string() + ")"} - </button> - </For> - </div> - </Suspense> } } diff --git a/src/ssr/api.rs b/src/ssr/api.rs index df2f47b..2be374a 100644 --- a/src/ssr/api.rs +++ b/src/ssr/api.rs @@ -1,5 +1,5 @@ use std::collections::BTreeMap; - +use chrono::Datelike; use leptos::prelude::{server, ServerFnError}; use serde::{Deserialize, Serialize}; @@ -40,8 +40,8 @@ pub async fn select_posts( .unwrap() .with_timezone(&Utc); let naive_date = date_time.date_naive(); - let formatted_date = naive_date.format("%b %-d, %Y").to_string(); - post.created_at = formatted_date.into(); + let formatted_date = format!("{} • {:02}", naive_date.year(), naive_date.month()); + post.created_at = formatted_date; }); Ok(posts)