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
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,125 @@
justify-self: start;
}

.hayate-partners {
background: #dff6ef;
color: var(--hayate-ink);
margin: 0 calc(50% - 50vw);
width: 100vw;
}

.hayate-partners__inner {
display: grid;
gap: 2.5rem 5rem;
grid-template-columns: minmax(0, 1.2fr) minmax(17rem, 0.8fr);
margin: 0 auto;
max-width: none;
padding: 5.5rem max(2.4rem, calc((100vw - 68rem) / 2));
}

.hayate-partners h2 {
color: var(--hayate-ink);
font-size: clamp(2.2rem, 5vw, 4.4rem);
line-height: 0.98;
margin-bottom: 1.5rem;
max-width: 10ch;
}

.hayate-partners__copy > p:last-child {
color: #29443d;
font-size: 1.02rem;
line-height: 1.7;
max-width: 36rem;
}

.hayate-partners__tracks {
grid-column: 2;
grid-row: 1 / span 2;
list-style: none;
margin: 0;
padding: 0;
}

.hayate-partners__tracks li {
align-items: baseline;
border-bottom: 1px solid rgb(7 19 31 / 18%);
display: grid;
gap: 1rem;
grid-template-columns: 2.5rem 1fr;
padding: 1.2rem 0;
}

.hayate-partners__tracks li:first-child {
border-top: 1px solid rgb(7 19 31 / 18%);
}

.hayate-partners__tracks span {
color: var(--hayate-mint-dark);
font-family: var(--md-code-font);
font-size: 0.68rem;
}

.hayate-partners__tracks strong {
font-size: 1rem;
}

.hayate-partners__actions {
align-items: baseline;
display: flex;
flex-wrap: wrap;
gap: 1rem 1.6rem;
}

.hayate-partners__actions a {
color: var(--hayate-ink);
font-weight: 650;
}

.hayate-partners__apply {
align-items: center;
background: var(--hayate-ink);
border: 1px solid var(--hayate-ink);
color: var(--hayate-paper) !important;
display: inline-flex;
gap: 0.8rem;
min-height: 2.7rem;
padding: 0.55rem 0.9rem;
text-decoration: none;
}

.hayate-partners__apply span {
transition: transform 180ms ease;
}

.hayate-partners__apply:hover span,
.hayate-partners__apply:focus-visible span {
transform: translateX(0.2rem);
}

[data-md-color-scheme="slate"] .hayate-partners {
background: #0e2a27;
color: var(--hayate-paper);
}

[data-md-color-scheme="slate"] .hayate-partners h2,
[data-md-color-scheme="slate"] .hayate-partners__actions a {
color: var(--hayate-paper);
}

[data-md-color-scheme="slate"] .hayate-partners__copy > p:last-child {
color: #cbd9d6;
}

[data-md-color-scheme="slate"] .hayate-partners__tracks li {
border-color: rgb(244 247 245 / 18%);
}

[data-md-color-scheme="slate"] .hayate-partners__apply {
background: var(--hayate-mint);
border-color: var(--hayate-mint);
color: var(--hayate-ink) !important;
}

.hayate-final {
text-align: center;
}
Expand Down Expand Up @@ -392,7 +511,8 @@
}

.hayate-section--intro,
.hayate-proof {
.hayate-proof,
.hayate-partners__inner {
display: block;
}

Expand All @@ -415,6 +535,18 @@
margin-top: 1.5rem;
}

.hayate-partners__inner {
padding: 4rem 1.25rem;
}

.hayate-partners__tracks {
margin-top: 2.5rem;
}

.hayate-partners__actions {
margin-top: 2rem;
}

.hayate-family-links a {
gap: 0.4rem;
grid-template-columns: 1fr;
Expand All @@ -433,7 +565,8 @@
}

.hayate-family-links a::before,
.hayate-hero__mark {
.hayate-hero__mark,
.hayate-partners__apply span {
transition: none;
}
}
26 changes: 26 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,32 @@ description: One Fetch-style Python application across ASGI, Cloudflare Workers,
<a class="md-button" href="evidence/">Read the evidence</a>
</section>

<section class="hayate-partners" aria-labelledby="partners-heading">
<div class="hayate-partners__inner">
<div class="hayate-partners__copy">
<p class="hayate-kicker">SHAPE THE V1 CONTRACT</p>
<h2 id="partners-heading">Bring a real workload.</h2>
<p>
Owner-external teams receive bounded onboarding help while Hayate
records the friction, fixes reproducible blockers, and bases v1
decisions on measured use.
</p>
</div>
<ol class="hayate-partners__tracks" aria-label="Design-partner tracks">
<li><span>01</span><strong>CPython / ASGI API</strong></li>
<li><span>02</span><strong>MCP or agent backend</strong></li>
<li><span>03</span><strong>Cloudflare Workers</strong></li>
</ol>
<div class="hayate-partners__actions">
<a
class="hayate-partners__apply"
href="https://github.com/hayatepy/.github/issues/new?template=design_partner.yml"
>Apply as a design partner <span aria-hidden="true">→</span></a>
<a href="contribute/#design-partners">Read the program details</a>
</div>
</div>
</section>

<section class="hayate-final">
<p class="hayate-kicker">START FROM A TESTED COMPOSITION</p>
<h2>From empty directory to passing production checks.</h2>
Expand Down
5 changes: 5 additions & 0 deletions scripts/check_site.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
from urllib.parse import unquote, urljoin, urlparse

SITE_ORIGIN = "https://hayatepy.dev"
DESIGN_PARTNER_APPLICATION = (
"https://github.com/hayatepy/.github/issues/new?template=design_partner.yml"
)


class PageParser(HTMLParser):
Expand Down Expand Up @@ -96,6 +99,8 @@ def validate(root: Path) -> list[str]:
failures.append(
f"{relative}: images missing alt: {', '.join(parser.images_without_alt)}"
)
if relative == Path("index.html") and DESIGN_PARTNER_APPLICATION not in parser.hrefs:
failures.append("index.html: missing direct design-partner application link")

base = SITE_ORIGIN + page_url(path, root)
for href in parser.hrefs:
Expand Down
19 changes: 16 additions & 3 deletions tests/test_check_site.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@

from pathlib import Path

from scripts.check_site import validate
from scripts.check_site import DESIGN_PARTNER_APPLICATION, validate


def write_page(root: Path, relative: str, *, href: str = "/target/") -> None:
def write_page(
root: Path,
relative: str,
*,
href: str = "/target/",
include_application: bool = True,
) -> None:
path = root / relative
path.parent.mkdir(parents=True, exist_ok=True)
application = f'<a href="{DESIGN_PARTNER_APPLICATION}">Apply</a>' if include_application else ""
path.write_text(
f"""<!doctype html>
<html lang="en">
Expand All @@ -16,7 +23,7 @@ def write_page(root: Path, relative: str, *, href: str = "/target/") -> None:
<meta name="description" content="Useful page">
<link rel="canonical" href="https://hayatepy.dev/">
</head>
<body><main><h1>Page</h1><a href="{href}">Target</a></main></body>
<body><main><h1>Page</h1><a href="{href}">Target</a>{application}</main></body>
</html>
""",
encoding="utf-8",
Expand All @@ -32,3 +39,9 @@ def test_validates_nested_directory_links(tmp_path: Path) -> None:
def test_reports_broken_internal_link(tmp_path: Path) -> None:
write_page(tmp_path, "index.html", href="/missing/")
assert validate(tmp_path) == ["index.html: broken internal link '/missing/'"]


def test_reports_missing_design_partner_application_link(tmp_path: Path) -> None:
write_page(tmp_path, "index.html", href="/", include_application=False)

assert validate(tmp_path) == ["index.html: missing direct design-partner application link"]
2 changes: 1 addition & 1 deletion zensical.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ repo_url = "https://github.com/hayatepy/docs"
repo_name = "hayatepy/docs"
edit_uri = "edit/main/docs/"
copyright = "Copyright &copy; 2026 Yusuke Hayashi and the Hayate contributors"
extra_css = ["assets/stylesheets/hayate.20260728.3.css"]
extra_css = ["assets/stylesheets/hayate.20260730.1.css"]
nav = [
{ "Home" = "index.md" },
{ "Get started" = [
Expand Down
Loading