Initial commit: BlueCap Strategies Astro site
Static Astro 5 site for BlueCap Strategies with exact live-site content parity, deployed to k3s via GitOps (ArgoCD). - Page copy in Markdown content collections (services, focus-areas, pages, insights) with a Zod SEO schema enforced at build time - Homepage + About restored to exact live copy; real live-site imagery - Build-time SEO linter (scripts/seo-lint.mjs) and Playwright e2e suite - Multi-stage Dockerfile (nginx serves dist/) and Kustomize manifests (k8s/) - Per-agent robots.txt; config-driven PostHog + Umami analytics scaffold - ADRs and engineering docs under docs/ Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
commit
cd91c4b97c
92 files changed
+10246
No files matched your search
@@ -0,0 +1,92 @@
|
||||
import { site } from "@data/site";
|
||||
import { assetUrl, canonical, siteUrl } from "./url";
|
||||
|
||||
type Crumb = { name: string; href: string };
|
||||
|
||||
export function organizationSchema() {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"@id": `${siteUrl}/#organization`,
|
||||
name: site.name,
|
||||
legalName: site.legalName,
|
||||
url: siteUrl,
|
||||
logo: assetUrl("/assets/bluecap-logo.png"),
|
||||
email: site.email,
|
||||
telephone: site.phone,
|
||||
founder: {
|
||||
"@type": "Person",
|
||||
name: site.founder,
|
||||
},
|
||||
description: site.description,
|
||||
};
|
||||
}
|
||||
|
||||
export function websiteSchema() {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"@id": `${siteUrl}/#website`,
|
||||
url: siteUrl,
|
||||
name: site.name,
|
||||
publisher: { "@id": `${siteUrl}/#organization` },
|
||||
};
|
||||
}
|
||||
|
||||
export function pageSchema({
|
||||
type = "WebPage",
|
||||
title,
|
||||
description,
|
||||
pathname,
|
||||
}: {
|
||||
type?: "WebPage" | "AboutPage" | "ContactPage";
|
||||
title: string;
|
||||
description: string;
|
||||
pathname: string;
|
||||
}) {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": type,
|
||||
"@id": `${canonical(pathname)}#webpage`,
|
||||
url: canonical(pathname),
|
||||
name: title,
|
||||
description,
|
||||
isPartOf: { "@id": `${siteUrl}/#website` },
|
||||
about: { "@id": `${siteUrl}/#organization` },
|
||||
};
|
||||
}
|
||||
|
||||
export function serviceSchema({
|
||||
title,
|
||||
description,
|
||||
pathname,
|
||||
}: {
|
||||
title: string;
|
||||
description: string;
|
||||
pathname: string;
|
||||
}) {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": `${canonical(pathname)}#service`,
|
||||
name: title,
|
||||
description,
|
||||
provider: { "@id": `${siteUrl}/#organization` },
|
||||
areaServed: "United States",
|
||||
url: canonical(pathname),
|
||||
serviceType: "Water-sector advisory services",
|
||||
};
|
||||
}
|
||||
|
||||
export function breadcrumbSchema(crumbs: Crumb[]) {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
itemListElement: crumbs.map((crumb, index) => ({
|
||||
"@type": "ListItem",
|
||||
position: index + 1,
|
||||
name: crumb.name,
|
||||
item: canonical(crumb.href),
|
||||
})),
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
const defaultSiteUrl = "https://www.bluecapstrategies.com";
|
||||
|
||||
export const siteUrl = (import.meta.env.PUBLIC_SITE_URL ?? defaultSiteUrl).replace(/\/$/, "");
|
||||
|
||||
export function canonical(pathname: string) {
|
||||
const cleanPath = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
||||
const withSlash = cleanPath.endsWith("/") ? cleanPath : `${cleanPath}/`;
|
||||
return `${siteUrl}${withSlash}`;
|
||||
}
|
||||
|
||||
export function assetUrl(path: string) {
|
||||
return `${siteUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
||||
}
|
||||
Reference in new issue
Block a user