Compare commits

..

17 Commits

Author SHA1 Message Date
53e62fcb68 I just bumped the version so I could test.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 3m22s
I needed a fast test to make sure the Gitea server repository was
working.
2025-10-21 12:17:38 -04:00
04c2182705 The logos for the project.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 2m41s
2025-10-17 10:29:41 -04:00
f023f36558 Adjusted the responsive layout targets.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 3m11s
2025-10-16 18:47:20 -04:00
62a2c4f5bc Fixed a spelling mistake in the blog css.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 3m11s
2025-10-16 18:32:01 -04:00
87bb1459b8 Bumped the bard version for publishing.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 3m49s
2025-10-16 13:58:36 -04:00
8dd20cb0cb Fixed responsiveness of the blog.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 2m44s
Also added the publish date to a post.
2025-10-16 13:56:58 -04:00
55f1ac22b0 Changed the target dir tot he home directory bin.
All checks were successful
Build Tavernworks / Explore-Gitea-Actions (push) Successful in 2m37s
2025-10-11 20:43:47 -04:00
c3ae332b0b Changed the target directory to place executables.
Some checks failed
Build Tavernworks / Explore-Gitea-Actions (push) Failing after 2m38s
2025-10-11 20:34:23 -04:00
dede2e9072 Fixed the build script to use this repository.
Some checks failed
Build Tavernworks / Explore-Gitea-Actions (push) Failing after 2m42s
2025-10-11 20:27:26 -04:00
4c03aea947 Fixing the build script for gitea.
Some checks failed
Build Tavernworks / Explore-Gitea-Actions (push) Failing after 1m49s
2025-10-11 20:19:40 -04:00
ee82498161 Adding the build testing script.
Some checks failed
Build Tavernworks / Explore-Gitea-Actions (push) Failing after 7s
This will also install loreweaver for use by the blog.
2025-10-11 18:43:17 -04:00
d822ecdf84 Fixed up the OpenGraph meta. 2025-10-11 18:38:46 -04:00
e8a4c19fdb Post page now is completely done in SSR.
This was done to make loading time faster as it's all static information
and to make it so blog posts can be linked to and get OpenGraph data.
2025-10-10 11:19:14 -04:00
1a57f3d143 openGraph image now set properly to default image. 2025-10-10 01:24:41 -04:00
1a82e856d9 use_resource is the correct thing to use.
The top components can use_resource and be properly setup during
hydration. The sub components need to use_server_resource so that they
can be hydrated later.
2025-10-10 00:26:17 -04:00
e49ecbac4d The TagSelector needed to stay a use_resource. 2025-10-10 00:01:31 -04:00
bca3e9f939 Switching all server function calls.
Now server function calls use, use_server_future. It seems to be working
now, unlike in 0.6.3
2025-10-09 23:49:35 -04:00
12 changed files with 135 additions and 40 deletions

View File

@ -0,0 +1,41 @@
name: Build Tavernworks
run-name: Building on Silverymoon by ${{ gitea.actor }}.
on:
push:
branches:
- main
jobs:
Explore-Gitea-Actions:
runs-on: FreeBSD-14.1
env:
SOURCE_DIR: tavernworks
TARGET_DIR: /home/gitea/bin
steps:
- name: Setup Workspace
run: |
rm -rf ${{ github.workspace }}/*
echo "Source Dir: $SOURCE_DIR"
- name: Clone Repo
uses: https://gitea.com/actions/checkout@v4
with:
repository: CyberMages/tavernworks
token: ${{ secrets.CM_GIT_TOKEN }}
path: ${{ env.SOURCE_DIR }}
- name: Build Repo
run: |
pwd
ls -la
cd "$SOURCE_DIR"
echo "Current Shell: $SHELL"
echo "PATH=$PATH"
. ~/.profile
echo "PATH=$PATH"
echo "Building release."
cargo build --release
echo "Installing loreweaver."
cp ./target/release/loreweaver "$TARGET_DIR"
- name: Clean Workspace
run: |
rm -rf ${{ github.workspace }}/*
ls -la

2
Cargo.lock generated
View File

@ -297,7 +297,7 @@ dependencies = [
[[package]] [[package]]
name = "bard" name = "bard"
version = "0.3.7" version = "0.3.17"
dependencies = [ dependencies = [
"dioxus", "dioxus",
"tavern", "tavern",

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

View File

@ -1,6 +1,6 @@
[package] [package]
name = "bard" name = "bard"
version = "0.3.8" version = "0.3.17"
edition = "2024" edition = "2024"
description = "Dioxus components that will display a Tavern blogging system Blog." description = "Dioxus components that will display a Tavern blogging system Blog."
repository = "/CyberMages/tavern" repository = "/CyberMages/tavern"

View File

@ -117,7 +117,7 @@
padding-left: 20px; padding-left: 20px;
} }
.embeded_video .embedded_video
{ {
margin-top: 50px; margin-top: 50px;
display: flex; display: flex;
@ -259,3 +259,28 @@
} }
} }
} }
.video_link
{
display: none;
width: 100%;
justify-content: center;
}
@media screen and (max-width: 1000px)
{
.blog_post .blog_post_tale
{
.video_link
{
display: flex;
}
.embedded_video
{
display: none;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

View File

@ -15,12 +15,12 @@ pub fn BlogItem(title: String, slug: String, author: String, summary: String,
tags: Vec<String>) tags: Vec<String>)
-> Element -> Element
{ {
let author_future = use_resource(move || let author_future = use_server_future(move ||
{ {
let handle: String = author.clone(); let handle: String = author.clone();
async move { get_author(handle).await } async move { get_author(handle).await }
}); })?;
rsx! rsx!
{ {

View File

@ -23,8 +23,12 @@ pub fn BlogAuthor() -> Element
#[component] #[component]
pub fn PostHeaderAuthor(adventurer: Adventurer) -> Element pub fn PostHeaderAuthor(author: Option<Adventurer>, publish_date: String) -> Element
{ {
match author
{
Some(adventurer) =>
{
rsx! rsx!
{ {
document::Meta document::Meta
@ -33,6 +37,11 @@ pub fn PostHeaderAuthor(adventurer: Adventurer) -> Element
content: "{adventurer.name}" content: "{adventurer.name}"
} }
i
{
"Published: {publish_date}"
}
p p
{ {
b b
@ -42,10 +51,37 @@ pub fn PostHeaderAuthor(adventurer: Adventurer) -> Element
} }
} }
} }
}
None=>
{
rsx!
{
document::Meta
{
name: "author",
content: "Unknown"
}
i
{
"Published: {publish_date}"
}
p
{
b
{
"Author: Unknown"
}
}
}
}
}
} }
#[component] #[component]
pub fn PostHeader(tale: Tale) -> Element pub fn PostHeader(tale: Tale, adventurer: Option<Adventurer>) -> Element
{ {
// Get the pages URL. // Get the pages URL.
let url: Page = use_route(); let url: Page = use_route();
@ -55,27 +91,17 @@ pub fn PostHeader(tale: Tale) -> Element
// Retrieve the provided settings from context. // Retrieve the provided settings from context.
let settings = use_context::<BardSettings>(); let settings = use_context::<BardSettings>();
let author_future = use_server_future(move ||
{
let handle: String = tale.lore.author.clone();
async move { get_author(handle).await }
})?;
rsx! rsx!
{ {
// Adding for SEO and OpenGraph post sharing.
document::Meta { name: "title", content: "{tale.lore.title}" }
document::Meta { name: "description", content: "{tale.lore.summary}" }
// Open Graph (used by LinkedIn, Bluesky, Discord, etc.) // Open Graph (used by LinkedIn, Bluesky, Discord, etc.)
document::Meta { property: "og:locale", content: "en_US" }
document::Meta { name: "title", property: "og:title", content: "{tale.lore.title}" }
document::Meta { name: "description", property: "og:description", content: "{tale.lore.summary}" }
document::Meta { property: "og:type", content: "article" } document::Meta { property: "og:type", content: "article" }
document::Meta { property: "og:title", content: "{tale.lore.title}" }
document::Meta { property: "og:description", content: "{tale.lore.summary}" }
document::Meta { property: "og:url", content: "{url}" } document::Meta { property: "og:url", content: "{url}" }
if let Some(image) = settings.default_post_image if let Some(image) = settings.default_post_image
{ {
document::Meta { property: "og:image", content: image } document::Meta { name: "image", property: "og:image", content: "{image}" }
} }
h1 { {tale.lore.title} } h1 { {tale.lore.title} }
@ -91,13 +117,10 @@ pub fn PostHeader(tale: Tale) -> Element
} }
} }
if let Some(Ok(Some(adventurer))) = (author_future.value())() PostHeaderAuthor
{ {
PostHeaderAuthor { adventurer: adventurer } author: adventurer,
} publish_date: tale.lore.publish_date.format("%m/%d/%Y").to_string()
else
{
p { "Loading author..." }
} }
} }
} }
@ -125,7 +148,12 @@ pub fn BlogPost(slug: Signal<String>, children: Element) -> Element
// Make this reactive so that as the page changes it should rerun this. // Make this reactive so that as the page changes it should rerun this.
let url_slug = slug(); let url_slug = slug();
async move { get_blog_post(url_slug).await } async move
{
let post = get_blog_post(url_slug).await?;
let author = get_author(post.lore.author.clone()).await?;
Ok::<_, ServerFnError>((post, author))
}
})?; })?;
rsx! rsx!
@ -134,11 +162,12 @@ pub fn BlogPost(slug: Signal<String>, children: Element) -> Element
{ {
class: "blog_post", class: "blog_post",
if let Some(Ok(tale)) = (post_future.value())() if let Some(Ok((tale, adventurer))) = (post_future.value())()
{ {
PostHeader PostHeader
{ {
tale: tale.clone() tale: tale.clone(),
adventurer: adventurer.clone()
} }
Story { text: tale.story } Story { text: tale.story }

View File

@ -1,6 +1,6 @@
[package] [package]
name = "loreweaver" name = "loreweaver"
version = "0.3.1" version = "0.3.2"
edition = "2024" edition = "2024"
description = "Converts a blog repository into an SQLite database using the Tavern blog system." description = "Converts a blog repository into an SQLite database using the Tavern blog system."
repository = "/CyberMages/tavern" repository = "/CyberMages/tavern"

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB