Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions _layouts/_includes/pycon_banner.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<section class="pycon-banner" aria-label="PyCon US announcement">
<a href="/pycon.html">
<span class="pycon-banner-text">Black Python Devs is at PyCon US! Learn More about What's in Store!</span>
<i class="iconoir-arrow-right pycon-banner-icon" aria-hidden="true"></i>
</a>
</section>
2 changes: 2 additions & 0 deletions _layouts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
{% endif %}
</div>

{% include "_includes/pycon_banner.html" %}

<article class="grid hero">
<div style="display:flex;align-items:center;justify-content:center">
<img style="max-width: 14rem; max-height:18rem; filter: drop-shadow(0 4px 40px var(--bpd-gold-wash));" src="/assets/images/bpd_stacked.png" alt="Black Python Devs logo" />
Expand Down
5 changes: 5 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ class Leadership(Page):
content_path = "leadership.html"


@app.page
class Pycon(Page):
content_path = "pycon.html"


@app.page
class About(Page):
template = "about.html"
Expand Down
80 changes: 80 additions & 0 deletions assets/css/bpd.css
Original file line number Diff line number Diff line change
Expand Up @@ -1004,6 +1004,86 @@ a.logo-text:hover img {
color: var(--bpd-cyan);
}

/* ── 12b. PyCon Banner ───────────────────────────────────── */

/* PyCon US 2026 brand purple β€” lightened in dark mode for contrast */
.pycon-banner {
--pycon-purple: #d28de8;
}
@media (prefers-color-scheme: light) {
.pycon-banner {
--pycon-purple: #680579;
}
}
[data-theme="light"] .pycon-banner {
--pycon-purple: #680579;
}
[data-theme="dark"] .pycon-banner {
--pycon-purple: #d28de8;
}

.pycon-banner {
position: relative;
background: var(--bpd-raised);
border: 1px solid var(--bpd-border);
border-radius: 12px;
margin-bottom: 2rem;
overflow: hidden;
transition:
border-color 0.5s ease,
box-shadow 0.5s ease,
transform 0.5s ease;
}

/* luminous gold seam β€” echoes site header + newsletter card */
.pycon-banner::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, transparent, var(--bpd-gold-wash) 25%, var(--bpd-gold) 50%, var(--bpd-gold-wash) 75%, transparent);
border-radius: 12px 12px 0 0;
}

.pycon-banner:hover {
border-color: var(--bpd-border-hi);
box-shadow: 0 0 28px var(--bpd-cyan-glow);
transform: translateY(-2px);
}

.pycon-banner a {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 0.5rem 0.85rem;
padding: 1.1rem 1.5rem;
color: var(--pycon-purple);
text-decoration: none;
font-weight: 600;
text-align: center;
}

.pycon-banner-icon {
color: var(--pycon-purple);
font-size: 1.15rem;
flex-shrink: 0;
transition: transform 0.3s ease;
}

.pycon-banner:hover .pycon-banner-icon {
transform: translateX(4px);
}

@media (max-width: 600px) {
.pycon-banner a {
padding: 0.95rem 1.1rem;
font-size: 0.92rem;
}
}

/* ── 13. Hero ─────────────────────────────────────────────── */

.hero {
Expand Down
11 changes: 11 additions & 0 deletions pycon.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=https://blackpythondevs.com/blog/black-python-devs-at-pycon-us-2026.html" />
<title>Redirecting to PyCon US 2026</title>
</head>
<body>
<p>Redirecting to <a href="https://blackpythondevs.com/blog/black-python-devs-at-pycon-us-2026.html">PyCon US 2026</a>...</p>
</body>
</html>
11 changes: 11 additions & 0 deletions tests/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,17 @@ def test_partnerships_redirects_to_support(built_site: pathlib.Path) -> None:
), "partnerships.html should redirect to /support.html#partnerships"


def test_pycon_redirects_to_blog_post(built_site: pathlib.Path) -> None:
"""Check that pycon.html contains a redirect to the PyCon US blog post."""
pycon = built_site / "pycon.html"
assert pycon.exists(), "pycon.html should exist in build output"
content = pycon.read_text()
assert (
"https://blackpythondevs.com/blog/black-python-devs-at-pycon-us-2026.html"
in content
), "pycon.html should redirect to the PyCon US 2026 blog post"


def _blog_post_files() -> list[pathlib.Path]:
"""Get all blog post HTML files (excluding index and pagination pages)."""
blog_dir = OUTPUT_DIR / "blog"
Expand Down
Loading
Loading