Update content page background
This commit is contained in:
+14
-1
@@ -201,6 +201,16 @@ export default async function BlogPostPage({ params }) {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Get article-specific background color from frontmatter
|
||||||
|
const getBackgroundColor = (post) => {
|
||||||
|
if (post.frontmatter?.background?.color) {
|
||||||
|
return post.frontmatter.background.color;
|
||||||
|
}
|
||||||
|
return "#1F2937"; // Default fallback (dark gray)
|
||||||
|
};
|
||||||
|
|
||||||
|
const backgroundColor = getBackgroundColor(post);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* Structured Data */}
|
{/* Structured Data */}
|
||||||
@@ -217,7 +227,10 @@ export default async function BlogPostPage({ params }) {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div className="min-h-screen bg-[#F4F3F1] relative overflow-hidden">
|
<div
|
||||||
|
className="min-h-screen relative overflow-hidden"
|
||||||
|
style={{ backgroundColor }}
|
||||||
|
>
|
||||||
{/* Content Banner */}
|
{/* Content Banner */}
|
||||||
<ContentBanner post={post} />
|
<ContentBanner post={post} />
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,24 @@ import { getAssetPath } from "../../lib/assetUtils";
|
|||||||
import ContentContainer from "./ContentContainer";
|
import ContentContainer from "./ContentContainer";
|
||||||
|
|
||||||
export default function ContentBanner({ post }) {
|
export default function ContentBanner({ post }) {
|
||||||
|
// Get article-specific background image
|
||||||
|
const getBackgroundImage = (post) => {
|
||||||
|
if (post.frontmatter?.thumbnail?.horizontal) {
|
||||||
|
return `/content/blog/${post.frontmatter.thumbnail.horizontal}`;
|
||||||
|
}
|
||||||
|
// Fallback to default image
|
||||||
|
return getAssetPath("assets/Content_Banner.svg");
|
||||||
|
};
|
||||||
|
|
||||||
|
const backgroundImage = getBackgroundImage(post);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="pt-[var(--measures-spacing-016)] md:pt-[var(--measures-spacing-008)] lg:pt-[50px] xl:pt-[112px] h-[275px] sm:h-[326px] md:h-[224px] lg:h-[358.4px] xl:h-[504px] relative w-full sm:overflow-hidden">
|
<div className="pt-[var(--measures-spacing-016)] md:pt-[var(--measures-spacing-008)] lg:pt-[50px] xl:pt-[112px] h-[275px] sm:h-[326px] md:h-[224px] lg:h-[358.4px] xl:h-[504px] relative w-full sm:overflow-hidden">
|
||||||
{/* Background SVG - Default to sm breakpoint */}
|
{/* Background SVG - Default to sm breakpoint */}
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 w-full h-full bg-cover bg-no-repeat aspect-[320/225.5]"
|
className="absolute inset-0 w-full h-full bg-cover bg-no-repeat aspect-[320/225.5]"
|
||||||
style={{
|
style={{
|
||||||
backgroundImage: `url(${getAssetPath("assets/Content_Banner.svg")})`,
|
backgroundImage: `url(${backgroundImage})`,
|
||||||
backgroundPosition: "center bottom",
|
backgroundPosition: "center bottom",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@@ -19,9 +30,7 @@ export default function ContentBanner({ post }) {
|
|||||||
<div
|
<div
|
||||||
className="absolute inset-0 w-full h-full bg-cover bg-no-repeat aspect-[640/224] md:block hidden"
|
className="absolute inset-0 w-full h-full bg-cover bg-no-repeat aspect-[640/224] md:block hidden"
|
||||||
style={{
|
style={{
|
||||||
backgroundImage: `url(${getAssetPath(
|
backgroundImage: `url(${backgroundImage})`,
|
||||||
"assets/Content_Banner_2.svg",
|
|
||||||
)})`,
|
|
||||||
backgroundPosition: "center bottom",
|
backgroundPosition: "center bottom",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -72,14 +72,14 @@ const ContentThumbnailTemplate = ({
|
|||||||
href={`/blog/${post.slug}`}
|
href={`/blog/${post.slug}`}
|
||||||
className={`block transition-transform duration-200 hover:scale-[1.02] ${className}`}
|
className={`block transition-transform duration-200 hover:scale-[1.02] ${className}`}
|
||||||
>
|
>
|
||||||
<div className="relative min-w-[320px] h-[225.5px] overflow-hidden pt-[13.75px] pr-[76px] pb-[73.75px] pl-[14px]">
|
<div className="relative min-w-[320px] max-w-[800px] h-[225.5px] overflow-hidden pt-[13.75px] pr-[76px] pb-[73.75px] pl-[14px]">
|
||||||
{/* Background SVG - sized to fit the 320x225.5 container exactly */}
|
{/* Background SVG - sized to fit the 320x225.5 container exactly */}
|
||||||
<div className="absolute inset-0 z-0">
|
<div className="absolute inset-0 z-0">
|
||||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||||
<img
|
<img
|
||||||
src={backgroundImage}
|
src={backgroundImage}
|
||||||
alt={`Background for ${post.frontmatter.title}`}
|
alt={`Background for ${post.frontmatter.title}`}
|
||||||
className="w-full h-[225.5px] object-cover object-bottom"
|
className="w-full h-[225.5px] object-cover"
|
||||||
/>
|
/>
|
||||||
{/* Gradient overlay */}
|
{/* Gradient overlay */}
|
||||||
<div className="absolute inset-0 bg-gradient-to-r from-transparent via-transparent to-black/70 z-10" />
|
<div className="absolute inset-0 bg-gradient-to-r from-transparent via-transparent to-black/70 z-10" />
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ related:
|
|||||||
thumbnail:
|
thumbnail:
|
||||||
vertical: "building-community-trust-vertical.svg"
|
vertical: "building-community-trust-vertical.svg"
|
||||||
horizontal: "building-community-trust-horizontal.svg"
|
horizontal: "building-community-trust-horizontal.svg"
|
||||||
|
background:
|
||||||
|
color: "#EDCC8F"
|
||||||
---
|
---
|
||||||
|
|
||||||
Trust is the foundation of any successful community organization. Without it, even the best structures and processes will struggle to function effectively. Building and maintaining trust requires intentional effort, clear communication, and consistent follow-through on commitments.
|
Trust is the foundation of any successful community organization. Without it, even the best structures and processes will struggle to function effectively. Building and maintaining trust requires intentional effort, clear communication, and consistent follow-through on commitments.
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ related: ["resolving-active-conflicts", "making-decisions-without-hierarchy"]
|
|||||||
thumbnail:
|
thumbnail:
|
||||||
vertical: "operational-security-mutual-aid-vertical.svg"
|
vertical: "operational-security-mutual-aid-vertical.svg"
|
||||||
horizontal: "operational-security-mutual-aid-horizontal.svg"
|
horizontal: "operational-security-mutual-aid-horizontal.svg"
|
||||||
|
background:
|
||||||
|
color: "#F4F3F1"
|
||||||
---
|
---
|
||||||
|
|
||||||
Mutual aid organizations face unique security challenges. Unlike traditional nonprofits, they often operate in politically sensitive environments and may be targets of surveillance, infiltration, or repression. This guide provides practical strategies for protecting your organization and its members.
|
Mutual aid organizations face unique security challenges. Unlike traditional nonprofits, they often operate in politically sensitive environments and may be targets of surveillance, infiltration, or repression. This guide provides practical strategies for protecting your organization and its members.
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ related:
|
|||||||
thumbnail:
|
thumbnail:
|
||||||
vertical: "resolving-active-conflicts-vertical.svg"
|
vertical: "resolving-active-conflicts-vertical.svg"
|
||||||
horizontal: "resolving-active-conflicts-horizontal.svg"
|
horizontal: "resolving-active-conflicts-horizontal.svg"
|
||||||
|
background:
|
||||||
|
color: "#E2EFFF"
|
||||||
---
|
---
|
||||||
|
|
||||||
Many groups strive to work without bosses, managers, or traditional leadership structures. But when no one's in charge, how do decisions get made? Non-hierarchical groups often rely on collective processes that prioritize trust, transparency, and shared responsibility. These approaches can take more time upfront, but they help build stronger, more equitable communities in the long run.
|
Many groups strive to work without bosses, managers, or traditional leadership structures. But when no one's in charge, how do decisions get made? Non-hierarchical groups often rely on collective processes that prioritize trust, transparency, and shared responsibility. These approaches can take more time upfront, but they help build stronger, more equitable communities in the long run.
|
||||||
|
|||||||
+16
-2
@@ -54,6 +54,17 @@ export const BLOG_POST_SCHEMA = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
background: {
|
||||||
|
type: "object",
|
||||||
|
required: false,
|
||||||
|
default: null,
|
||||||
|
properties: {
|
||||||
|
color: {
|
||||||
|
type: "string",
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -149,8 +160,11 @@ export function sanitizeBlogPost(frontmatter) {
|
|||||||
|
|
||||||
for (const [field, config] of Object.entries(BLOG_POST_SCHEMA)) {
|
for (const [field, config] of Object.entries(BLOG_POST_SCHEMA)) {
|
||||||
if (frontmatter[field] !== undefined) {
|
if (frontmatter[field] !== undefined) {
|
||||||
// Special handling for thumbnail object
|
// Special handling for thumbnail and background objects
|
||||||
if (field === "thumbnail" && typeof frontmatter[field] === "object") {
|
if (
|
||||||
|
(field === "thumbnail" || field === "background") &&
|
||||||
|
typeof frontmatter[field] === "object"
|
||||||
|
) {
|
||||||
sanitized[field] = frontmatter[field];
|
sanitized[field] = frontmatter[field];
|
||||||
} else {
|
} else {
|
||||||
sanitized[field] = frontmatter[field];
|
sanitized[field] = frontmatter[field];
|
||||||
|
|||||||
Reference in New Issue
Block a user