Skip to content

Commit c68b985

Browse files
vintaclaude
andcommitted
feat(website): add /sponsorship/ landing page
Adds a dedicated sponsorship page at /sponsorship/ built from the Jinja2 template, with hero stats, tier cards, and CSS. Updates the index.html sponsor sidebar link to point to /sponsorship/ instead of the GitHub SPONSORSHIP.md. Adds the URL to the sitemap and test fixtures. Also renames .impeccable.md to DESIGN.md. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 6478111 commit c68b985

7 files changed

Lines changed: 590 additions & 10 deletions

File tree

File renamed without changes.

SPONSORSHIP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Your sponsorship puts your product in front of developers at the exact moment th
3737

3838
## Get Started
3939

40-
Email [vinta.chen@gmail.com](mailto:vinta.chen@gmail.com?subject=awesome-python%20Sponsorship) with:
40+
Email [vinta.chen@gmail.com](mailto:vinta.chen@gmail.com?subject=Awesome%20Python%20Sponsorship) with:
4141

4242
- **Tier:** Headline Sponsor ($500/mo) or Featured Sponsor ($150/mo)
4343
- **Content:** Product name, URL, logo, and description (Headline tier) or `[Name](URL) - Description.` entry (Featured tier)

website/build.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
BUILTIN_PATH = f"/categories/{BUILTIN_SLUG}/"
2626
BUILTIN_PUBLIC_URL = f"{SITE_URL}categories/{BUILTIN_SLUG}/"
2727

28+
SPONSORSHIP_PATH = "/sponsorship/"
29+
SPONSORSHIP_PUBLIC_URL = f"{SITE_URL}sponsorship/"
30+
2831
SOURCE_TYPE_DOMAINS = {
2932
"docs.python.org": "Built-in",
3033
"gitlab.com": "GitLab",
@@ -434,6 +437,23 @@ def build(repo_root: Path) -> None:
434437
encoding="utf-8",
435438
)
436439

440+
sponsorship_dir = site_dir / "sponsorship"
441+
sponsorship_dir.mkdir(parents=True, exist_ok=True)
442+
tpl_sponsorship = env.get_template("sponsorship.html")
443+
hero_stats: list[str] = []
444+
if repo_stars:
445+
hero_stats.append(f"{repo_stars}+ stars on GitHub")
446+
hero_stats.append(f"{total_entries}+ curated projects")
447+
hero_stats.append(f"Updated {build_date.strftime('%B %d, %Y')}")
448+
(sponsorship_dir / "index.html").write_text(
449+
tpl_sponsorship.render(
450+
total_entries=total_entries,
451+
total_categories=len(categories),
452+
hero_stats=hero_stats,
453+
),
454+
encoding="utf-8",
455+
)
456+
437457
seen_subcats: set[tuple[str, str]] = set()
438458
for category in categories:
439459
cat_url_prefix = f"/categories/{category['slug']}/"
@@ -491,6 +511,7 @@ def build(repo_root: Path) -> None:
491511
sitemap_urls.append((BUILTIN_PUBLIC_URL, sitemap_date))
492512
for cat_slug, sub_slug in sorted(seen_subcats):
493513
sitemap_urls.append((subcategory_public_url(cat_slug, sub_slug), sitemap_date))
514+
sitemap_urls.append((SPONSORSHIP_PUBLIC_URL, sitemap_date))
494515
write_sitemap_xml(site_dir / "sitemap.xml", sitemap_urls)
495516
(site_dir / "index.md").write_text(markdown_index, encoding="utf-8")
496517
(site_dir / "llms.txt").write_text(llms_txt, encoding="utf-8")

website/static/style.css

Lines changed: 308 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,298 @@ th[data-sort].sort-asc::after {
10821082
color: var(--accent);
10831083
}
10841084

1085+
.sponsorship-hero .category-hero-shell {
1086+
padding-bottom: clamp(3.25rem, 6vw, 5rem);
1087+
gap: clamp(2rem, 5vw, 3.5rem);
1088+
}
1089+
1090+
.sponsorship-hero-copy h1 {
1091+
font-size: clamp(3.4rem, 8.5vw, 6.5rem);
1092+
}
1093+
1094+
.sponsorship-proof {
1095+
margin-top: 1.6rem;
1096+
}
1097+
1098+
.sponsorship-proof .proof-sep {
1099+
color: oklch(100% 0 0 / 0.32);
1100+
margin-inline: 0.15rem;
1101+
}
1102+
1103+
.sponsorship-hero .hero-actions {
1104+
margin-top: 1.9rem;
1105+
}
1106+
1107+
.sponsorship-section {
1108+
padding-block: clamp(2.75rem, 5.5vw, 4.25rem);
1109+
border-bottom: 1px solid var(--line);
1110+
}
1111+
1112+
.sponsorship-section:first-of-type {
1113+
padding-top: clamp(3.25rem, 6vw, 4.75rem);
1114+
}
1115+
1116+
.sponsorship-section:last-of-type {
1117+
border-bottom: 0;
1118+
padding-bottom: clamp(3.5rem, 7vw, 5.5rem);
1119+
}
1120+
1121+
.sponsorship-getstarted {
1122+
background: var(--cta-bg);
1123+
border-top: 1px solid var(--line);
1124+
}
1125+
1126+
.sponsorship-shell {
1127+
display: grid;
1128+
grid-template-columns: minmax(0, 16rem) minmax(0, 1fr);
1129+
gap: clamp(1.75rem, 5vw, 4rem);
1130+
align-items: start;
1131+
}
1132+
1133+
.sponsorship-meta {
1134+
display: flex;
1135+
flex-direction: column;
1136+
gap: 0.85rem;
1137+
position: sticky;
1138+
top: 1.5rem;
1139+
}
1140+
1141+
.sponsorship-meta .section-label {
1142+
margin-bottom: 0;
1143+
font-size: var(--text-lg);
1144+
}
1145+
1146+
.sponsorship-meta-note {
1147+
color: var(--ink-muted);
1148+
font-size: var(--text-sm);
1149+
line-height: 1.55;
1150+
}
1151+
1152+
.sponsorship-body {
1153+
display: flex;
1154+
flex-direction: column;
1155+
gap: 1.6rem;
1156+
font-size: var(--text-lg);
1157+
color: var(--ink-soft);
1158+
line-height: 1.7;
1159+
}
1160+
1161+
.sponsorship-body p {
1162+
text-wrap: pretty;
1163+
}
1164+
1165+
.sponsorship-body code {
1166+
font-family: ui-monospace, "SFMono-Regular", "Menlo", monospace;
1167+
font-size: 0.92em;
1168+
padding: 0.08rem 0.4rem;
1169+
border-radius: 0.4rem;
1170+
background: var(--bg-paper-strong);
1171+
color: var(--ink);
1172+
}
1173+
1174+
.sponsorship-body a:not(.hero-action):not(.tier-cta) {
1175+
color: var(--accent-deep);
1176+
text-decoration: underline;
1177+
text-decoration-color: var(--accent-underline);
1178+
text-underline-offset: 0.2em;
1179+
transition: color 180ms ease;
1180+
}
1181+
1182+
.sponsorship-body a:not(.hero-action):not(.tier-cta):hover {
1183+
color: var(--accent);
1184+
}
1185+
1186+
.sponsorship-lede {
1187+
font-family: var(--font-display);
1188+
font-size: clamp(1.55rem, 2.6vw, 2rem);
1189+
line-height: 1.25;
1190+
color: var(--ink);
1191+
letter-spacing: -0.01em;
1192+
text-wrap: pretty;
1193+
}
1194+
1195+
.sponsorship-facts {
1196+
display: grid;
1197+
grid-template-columns: minmax(0, 1fr);
1198+
gap: 1.4rem;
1199+
border-top: 1px solid var(--line);
1200+
padding-top: 1.6rem;
1201+
}
1202+
1203+
.sponsorship-facts > div {
1204+
display: grid;
1205+
grid-template-columns: minmax(0, 12rem) minmax(0, 1fr);
1206+
gap: clamp(1rem, 3vw, 2rem);
1207+
align-items: baseline;
1208+
}
1209+
1210+
.sponsorship-facts dt {
1211+
font-size: var(--text-xs);
1212+
font-weight: 800;
1213+
letter-spacing: 0.05em;
1214+
color: var(--ink);
1215+
}
1216+
1217+
.sponsorship-facts dd {
1218+
color: var(--ink-soft);
1219+
font-size: var(--text-base);
1220+
line-height: 1.65;
1221+
}
1222+
1223+
.tier-list {
1224+
list-style: none;
1225+
padding: 0;
1226+
margin: 0;
1227+
display: grid;
1228+
grid-template-columns: repeat(2, minmax(0, 1fr));
1229+
gap: clamp(1.5rem, 3vw, 2.75rem);
1230+
}
1231+
1232+
.tier {
1233+
display: flex;
1234+
flex-direction: column;
1235+
gap: 1rem;
1236+
padding-block: 1.65rem;
1237+
border-top: 1px solid var(--line-strong);
1238+
}
1239+
1240+
.tier-eyebrow {
1241+
font-size: var(--text-xs);
1242+
font-weight: 800;
1243+
letter-spacing: 0.05em;
1244+
color: var(--ink);
1245+
}
1246+
1247+
.tier-price {
1248+
display: flex;
1249+
align-items: baseline;
1250+
gap: 0.55rem;
1251+
margin-bottom: 0.25rem;
1252+
}
1253+
1254+
.tier-amount {
1255+
font-family: var(--font-display);
1256+
font-size: clamp(3rem, 5.5vw, 4.5rem);
1257+
font-weight: 600;
1258+
line-height: 0.9;
1259+
letter-spacing: -0.025em;
1260+
color: var(--ink);
1261+
}
1262+
1263+
.tier-cadence {
1264+
color: var(--ink-muted);
1265+
font-size: var(--text-base);
1266+
font-weight: 600;
1267+
letter-spacing: 0.01em;
1268+
}
1269+
1270+
.tier-summary {
1271+
font-size: var(--text-lg);
1272+
color: var(--ink);
1273+
line-height: 1.5;
1274+
text-wrap: pretty;
1275+
}
1276+
1277+
.tier-includes {
1278+
list-style: none;
1279+
padding: 0;
1280+
margin: 0;
1281+
display: flex;
1282+
flex-direction: column;
1283+
gap: 0.6rem;
1284+
border-top: 1px solid var(--line);
1285+
padding-top: 1.1rem;
1286+
}
1287+
1288+
.tier-includes li {
1289+
position: relative;
1290+
padding-left: 1.4rem;
1291+
color: var(--ink-soft);
1292+
font-size: var(--text-base);
1293+
line-height: 1.6;
1294+
}
1295+
1296+
.tier-includes li::before {
1297+
content: "";
1298+
position: absolute;
1299+
left: 0;
1300+
top: 0.65rem;
1301+
width: 0.55rem;
1302+
height: 1px;
1303+
background: var(--line-strong);
1304+
}
1305+
1306+
.tier-cta {
1307+
align-self: start;
1308+
margin-top: 0.75rem;
1309+
color: var(--accent-deep);
1310+
font-size: var(--text-sm);
1311+
font-weight: 700;
1312+
letter-spacing: 0.01em;
1313+
text-decoration: underline;
1314+
text-decoration-color: var(--accent-underline);
1315+
text-underline-offset: 0.22em;
1316+
transition: color 180ms ease, text-decoration-color 180ms ease;
1317+
}
1318+
1319+
.tier-cta:hover {
1320+
color: var(--accent);
1321+
text-decoration-color: var(--accent);
1322+
}
1323+
1324+
.past-sponsors {
1325+
list-style: none;
1326+
padding: 0;
1327+
margin: 0;
1328+
display: flex;
1329+
flex-direction: column;
1330+
gap: 0.85rem;
1331+
}
1332+
1333+
.past-sponsors li {
1334+
display: flex;
1335+
flex-wrap: wrap;
1336+
align-items: baseline;
1337+
gap: 0.65rem;
1338+
padding-block: 0.4rem;
1339+
}
1340+
1341+
.past-sponsors a {
1342+
font-family: var(--font-display);
1343+
font-size: clamp(1.6rem, 2.8vw, 2.1rem);
1344+
font-weight: 600;
1345+
line-height: 1;
1346+
letter-spacing: -0.02em;
1347+
color: var(--ink);
1348+
transition: color 180ms ease;
1349+
}
1350+
1351+
.past-sponsors a:hover {
1352+
color: var(--accent-deep);
1353+
}
1354+
1355+
.past-sponsor-desc {
1356+
color: var(--ink-muted);
1357+
font-size: var(--text-base);
1358+
}
1359+
1360+
.sponsorship-cta-row {
1361+
display: flex;
1362+
flex-wrap: wrap;
1363+
gap: 0.85rem;
1364+
margin-top: 0.5rem;
1365+
}
1366+
1367+
.sponsorship-cta-row .hero-action-primary {
1368+
color: var(--hero-text);
1369+
background: linear-gradient(135deg, var(--accent), var(--accent-deep));
1370+
}
1371+
1372+
.sponsorship-fineprint {
1373+
font-size: var(--text-base);
1374+
color: var(--ink-muted);
1375+
}
1376+
10851377
.final-cta {
10861378
padding-block: clamp(3rem, 7vw, 5.5rem);
10871379
background: var(--cta-bg);
@@ -1227,8 +1519,23 @@ th[data-sort].sort-asc::after {
12271519

12281520
.hero-grid,
12291521
.results-intro,
1230-
.sponsor-shell {
1522+
.sponsor-shell,
1523+
.sponsorship-shell {
1524+
grid-template-columns: 1fr;
1525+
}
1526+
1527+
.sponsorship-meta {
1528+
position: static;
1529+
}
1530+
1531+
.tier-list {
1532+
grid-template-columns: 1fr;
1533+
gap: 0;
1534+
}
1535+
1536+
.sponsorship-facts > div {
12311537
grid-template-columns: 1fr;
1538+
gap: 0.35rem;
12321539
}
12331540

12341541
.hero-category-nav {

website/templates/index.html

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,7 @@ <h2 id="hero-category-heading">Browse by category</h2>
8585
<div class="section-shell sponsor-shell">
8686
<header class="sponsor-meta">
8787
<p class="section-label" id="sponsor-heading">Sponsors</p>
88-
<a
89-
class="sponsor-become"
90-
href="https://github.com/vinta/awesome-python/blob/master/SPONSORSHIP.md"
91-
target="_blank"
92-
rel="noopener"
93-
>
94-
Become a sponsor
95-
</a>
88+
<a class="sponsor-become" href="/sponsorship/"> Become a sponsor </a>
9689
</header>
9790
<ul class="sponsor-list">
9891
{% for sponsor in sponsors %}

0 commit comments

Comments
 (0)