diff --git a/app/assets/main.css b/app/assets/main.css index dbf096b22..c1c723c50 100644 --- a/app/assets/main.css +++ b/app/assets/main.css @@ -12,6 +12,7 @@ --bg-subtle: var(--bg-subtle-color, oklch(0.198 0 0)); --bg-muted: var(--bg-muted-color, oklch(0.236 0 0)); --bg-elevated: var(--bg-elevated-color, oklch(0.266 0 0)); + --bg-blog: oklch(0.195 0 0); /* text colors */ --fg: oklch(0.982 0 0); @@ -338,3 +339,11 @@ html:has(dialog:modal) { overflow: hidden; scrollbar-gutter: stable; } + +/* Blog post Markdown wrapper styles */ +.blog-post img { + display: block; + max-width: 100%; + height: auto; + border-radius: 0.5rem; /* matches rounded-lg */ +} diff --git a/app/components/AppFooter.vue b/app/components/AppFooter.vue index b7e745377..b8deb6448 100644 --- a/app/components/AppFooter.vue +++ b/app/components/AppFooter.vue @@ -20,6 +20,9 @@ const showModal = () => modalRef.value?.showModal?.() {{ $t('footer.about') }} + + {{ $t('footer.blog') }} + {{ $t('privacy_policy.title') }} diff --git a/app/components/AppHeader.vue b/app/components/AppHeader.vue index 5dd3af74b..adadfbcd8 100644 --- a/app/components/AppHeader.vue +++ b/app/components/AppHeader.vue @@ -56,6 +56,14 @@ const mobileLinks = computed(() => [ external: false, iconClass: 'i-carbon:information', }, + { + name: 'Blog', + label: $t('footer.blog'), + to: { name: 'blog' }, + type: 'link', + external: false, + iconClass: 'i-carbon:blog', + }, { name: 'Privacy Policy', label: $t('privacy_policy.title'), diff --git a/app/components/AuthorAvatar.vue b/app/components/AuthorAvatar.vue new file mode 100644 index 000000000..6d87901d9 --- /dev/null +++ b/app/components/AuthorAvatar.vue @@ -0,0 +1,45 @@ + + + diff --git a/app/components/AuthorList.vue b/app/components/AuthorList.vue new file mode 100644 index 000000000..ee5de3464 --- /dev/null +++ b/app/components/AuthorList.vue @@ -0,0 +1,49 @@ + + + diff --git a/app/components/BlogPostListCard.vue b/app/components/BlogPostListCard.vue new file mode 100644 index 000000000..32f9d8c22 --- /dev/null +++ b/app/components/BlogPostListCard.vue @@ -0,0 +1,53 @@ + + + diff --git a/app/components/BlogPostWrapper.vue b/app/components/BlogPostWrapper.vue new file mode 100644 index 000000000..370f51eb4 --- /dev/null +++ b/app/components/BlogPostWrapper.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/app/components/BlueskyComment.vue b/app/components/BlueskyComment.vue new file mode 100644 index 000000000..d1e154e54 --- /dev/null +++ b/app/components/BlueskyComment.vue @@ -0,0 +1,196 @@ + + + diff --git a/app/components/BlueskyComments.vue b/app/components/BlueskyComments.vue new file mode 100644 index 000000000..8b2dd4090 --- /dev/null +++ b/app/components/BlueskyComments.vue @@ -0,0 +1,125 @@ + + + diff --git a/app/components/EmbeddableBlueskyPost.vue b/app/components/EmbeddableBlueskyPost.vue new file mode 100644 index 000000000..2cd6b65ec --- /dev/null +++ b/app/components/EmbeddableBlueskyPost.vue @@ -0,0 +1,97 @@ + + +