Skip to content

Commit 83917a0

Browse files
committed
Add sponsors/supporters band, /sponsors page, and tighten news spacing
Introduce a place for sponsor/supporter logos so OpenPrinting can credit the organizations that now fund the project, with a per-sponsor membership level (e.g. "Platinum Member") and individually adjustable logo size. - data/sponsors.ts: sponsor model (name, logo, url, level, width); seeded with Sovereign Tech Agency as a Platinum Member. - components/sponsors-strip.tsx: a slim, mobile-responsive "Supported by" band for the homepage. The whole area links to /sponsors. Logos are dark monochrome lockups, auto-inverted in dark mode. On phones the label, logo, tier chip and CTA stack and center, and the logo is capped to the viewport width to avoid overflow; from sm up it is a single horizontal row. - app/page.tsx: render the band between the hero and the news section. - app/sponsors + contents/pages/sponsors.md: new page describing current sponsors, how to become a sponsor, and donations (links to /donations and /contact); includes SEO metadata. Added to sitemap and footer. - components/news-section.tsx: reduce the section's top padding and heading margin so the three latest posts move up into the first viewport now that the sponsor band occupies a little vertical space. - public/sponsors/sovereign-tech-agency.png: sponsor logo asset.
1 parent 1d8c807 commit 83917a0

9 files changed

Lines changed: 152 additions & 2 deletions

File tree

app/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import HeroSection from "@/components/hero-section"
2+
import SponsorsStrip from "@/components/sponsors-strip"
23
import InfoSection from "@/components/info-section"
34
import ProjectsSection from "@/components/projects-section"
45
import NewsSection from "@/components/news-section"
@@ -9,6 +10,7 @@ export default function Home() {
910
return (
1011
<main className="min-h-screen bg-background text-foreground">
1112
<HeroSection />
13+
<SponsorsStrip />
1214
<NewsSection posts={latestPosts} />
1315
<InfoSection />
1416
<ProjectsSection />

app/sitemap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const STATIC_ROUTES = [
3636
"/foomatic/",
3737
"/contact/",
3838
"/donations/",
39+
"/sponsors/",
3940
"/contribute/",
4041
"/contribute-website/",
4142
"/codeofconduct/",

app/sponsors/page.tsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import fs from "fs/promises"
2+
import path from "path"
3+
import matter from "gray-matter"
4+
import type { Metadata } from "next"
5+
import { MarkdownRenderer } from "@/components/markdown-renderer"
6+
import { PageHero } from "@/components/page-hero"
7+
import { getSiteUrl } from "@/lib/site"
8+
9+
const FILE_PATH = path.join(process.cwd(), "contents", "pages", "sponsors.md")
10+
11+
export const metadata: Metadata = {
12+
title: "Sponsors & Supporters | OpenPrinting",
13+
description:
14+
"The organizations and supporters who sponsor OpenPrinting, and how to become a sponsor or make a donation.",
15+
alternates: { canonical: getSiteUrl("/sponsors/") },
16+
openGraph: {
17+
title: "Sponsors & Supporters | OpenPrinting",
18+
description:
19+
"The organizations and supporters who sponsor OpenPrinting, and how to become a sponsor or make a donation.",
20+
url: getSiteUrl("/sponsors/"),
21+
type: "website",
22+
},
23+
}
24+
25+
export default async function SponsorsPage() {
26+
const raw = await fs.readFile(FILE_PATH, "utf8")
27+
const { data } = matter(raw)
28+
29+
const title = typeof data.title === "string" ? data.title : "Sponsors & Supporters"
30+
31+
return (
32+
<>
33+
<PageHero title={title} />
34+
35+
<main className="min-h-screen bg-background text-foreground pt-24 pb-16">
36+
<div className="max-w-4xl mx-auto px-4">
37+
<MarkdownRenderer content={raw} showMeta={false} noCard={true} />
38+
</div>
39+
</main>
40+
</>
41+
)
42+
}

components/news-section.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ export default function NewsSection({ posts }: { posts: NewsCardPost[] }) {
1010
const isInView = useInView(ref, { once: true, amount: 0.2 })
1111

1212
return (
13-
<section ref={ref} className="relative py-24 bg-background" id="news">
13+
<section ref={ref} className="relative pt-10 pb-24 bg-background" id="news">
1414
<div className="hero-glow-blue opacity-30" />
1515
<div className="max-w-6xl mx-auto px-6 relative z-10">
1616
<motion.div
1717
initial={{ opacity: 0, y: 20 }}
1818
animate={isInView ? { opacity: 1, y: 0 } : { opacity: 0, y: 20 }}
1919
transition={{ duration: 0.6 }}
20-
className="mb-16"
20+
className="mb-8"
2121
>
2222
<p className="text-sm font-medium text-blue-400 mb-3 tracking-wide uppercase">What&apos;s New</p>
2323
<h2 className="text-3xl md:text-4xl font-bold text-foreground tracking-tight">

components/sponsors-strip.tsx

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import Image from "next/image"
2+
import Link from "next/link"
3+
import { ArrowRight } from "lucide-react"
4+
5+
import sponsors from "@/data/sponsors"
6+
import { getAssetPath } from "@/lib/utils"
7+
8+
const LOGO_ASPECT = 5754 / 548
9+
10+
export default function SponsorsStrip() {
11+
if (sponsors.length === 0) return null
12+
13+
return (
14+
<section aria-label="Sponsors and supporters" className="border-y border-border bg-muted/30">
15+
<div className="mx-auto max-w-6xl px-4 py-5 sm:px-6 sm:py-6">
16+
<Link
17+
href="/sponsors"
18+
className="group flex flex-col items-center gap-4 text-center sm:flex-row sm:justify-between sm:text-left"
19+
aria-label="Learn more about OpenPrinting sponsors and donations"
20+
>
21+
<div className="flex flex-col items-center gap-3 sm:flex-row sm:gap-8">
22+
<span className="text-[11px] font-semibold uppercase tracking-[0.18em] text-muted-foreground sm:text-xs">
23+
Supported by
24+
</span>
25+
26+
<ul className="flex flex-wrap items-center justify-center gap-x-6 gap-y-3">
27+
{sponsors.map((sponsor) => {
28+
const width = sponsor.width ?? 180
29+
const height = Math.round(width / LOGO_ASPECT)
30+
return (
31+
<li
32+
key={sponsor.name}
33+
className="flex flex-col items-center gap-2 sm:flex-row sm:gap-3"
34+
>
35+
<Image
36+
src={getAssetPath(sponsor.logo)}
37+
alt={sponsor.name}
38+
width={width}
39+
height={height}
40+
className="h-auto object-contain opacity-90 transition-opacity group-hover:opacity-100 dark:brightness-0 dark:invert"
41+
style={{ width, maxWidth: "72vw" }}
42+
/>
43+
{sponsor.level && (
44+
<span className="rounded-full border border-border bg-background px-2.5 py-1 text-[11px] font-medium text-muted-foreground">
45+
{sponsor.level}
46+
</span>
47+
)}
48+
</li>
49+
)
50+
})}
51+
</ul>
52+
</div>
53+
54+
<span className="inline-flex shrink-0 items-center gap-1 text-sm font-medium text-primary">
55+
Sponsors &amp; donations
56+
<ArrowRight className="h-4 w-4 transition-transform group-hover:translate-x-0.5" />
57+
</span>
58+
</Link>
59+
</div>
60+
</section>
61+
)
62+
}

config/site.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export const siteConfig: SiteConfig = {
142142
{ name: "Google Summer of Code", href: "/gsoc" },
143143
{ name: "Google Season of Docs", href: "/gsod" },
144144
{ name: "Contribute", href: "/contribute" },
145+
{ name: "Sponsors", href: "/sponsors" },
145146
],
146147
},
147148
{

contents/pages/sponsors.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
title: "Sponsors & Supporters"
3+
permalink: /sponsors/
4+
author_profile: false
5+
---
6+
7+
OpenPrinting keeps printing working across Linux, ChromeOS, and other operating systems — from CUPS and the new Printer Applications to the printer/driver database. Historically this work was largely carried by maintainers funded through their employers. Today it is increasingly made possible by organizations that sponsor and support the project directly.
8+
9+
## Current Sponsors
10+
11+
### Sovereign Tech Agency — Platinum Member
12+
13+
The [Sovereign Tech Agency](https://www.sovereign.tech/) invests in the open-source infrastructure the world depends on. Its support helps fund ongoing OpenPrinting development and maintenance.
14+
15+
## Become a Sponsor
16+
17+
If your organization would like to sponsor OpenPrinting — for example to fund development, maintenance, infrastructure, or events — we would love to hear from you. Sponsorship can be recognized with a logo and a membership level (such as "Platinum Member") on this site.
18+
19+
Please reach out to [Till Kamppeter](mailto:till.kamppeter@gmail.com) to discuss sponsorship.
20+
21+
## Donations
22+
23+
There are many other ways to support OpenPrinting, including donating test hardware, sponsoring events, and monetary contributions. See the [Donations](/donations) page for the full list, or contact us via the [Contact Us](/contact) page.

data/sponsors.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export interface Sponsor {
2+
name: string;
3+
logo: string;
4+
url?: string;
5+
level?: string;
6+
width?: number;
7+
}
8+
9+
const sponsors: Sponsor[] = [
10+
{
11+
name: "Sovereign Tech Agency",
12+
logo: "/sponsors/sovereign-tech-agency.png",
13+
url: "https://www.sovereign.tech/",
14+
level: "Platinum Member",
15+
width: 210,
16+
},
17+
];
18+
19+
export default sponsors;
82.3 KB
Loading

0 commit comments

Comments
 (0)