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:
gitea_adminandClaude Opus 4.8 committed 2026-07-15 17:40:46 -04:00
commit cd91c4b97c
92 files changed
+10246

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
---
/**
* Side-by-side visitor analytics (ADR-0005): PostHog + Umami, each gated by env vars so this is a
* no-op until configured. Set the PUBLIC_* vars at build time to enable either or both.
* - PostHog: PUBLIC_POSTHOG_KEY, PUBLIC_POSTHOG_HOST (default https://us.i.posthog.com)
* - Umami: PUBLIC_UMAMI_SRC (script URL), PUBLIC_UMAMI_WEBSITE_ID
* Track the same event set in both to compare (see docs/seo-aeo-optimization.md §6b).
*/
const posthogKey = import.meta.env.PUBLIC_POSTHOG_KEY;
const posthogHost = import.meta.env.PUBLIC_POSTHOG_HOST ?? "https://us.i.posthog.com";
const umamiSrc = import.meta.env.PUBLIC_UMAMI_SRC;
const umamiWebsiteId = import.meta.env.PUBLIC_UMAMI_WEBSITE_ID;
---
{
posthogKey && (
<script is:inline define:vars={{ posthogKey, posthogHost }}>
!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
posthog.init(posthogKey, { api_host: posthogHost, person_profiles: "identified_only" });
</script>
)
}
{
umamiSrc && umamiWebsiteId && (
<script is:inline defer src={umamiSrc} data-website-id={umamiWebsiteId} />
)
}
+28
View File
@@ -0,0 +1,28 @@
---
type Item = {
title: string;
description: string;
href: string;
icon?: string;
};
type Props = {
items: Item[];
label?: string;
heading?: string;
};
const { items, label = "Related pages", heading } = Astro.props;
---
{heading && <h2 class="card-grid-heading">{heading}</h2>}
<div class="card-grid" aria-label={label}>
{items.map((item) => (
<article class="link-card">
{item.icon && <img class="card-icon" src={item.icon} alt="" aria-hidden="true" width="48" height="48" loading="lazy" />}
<h3><a href={item.href}>{item.title}</a></h3>
<p>{item.description}</p>
<a class="card-action" href={item.href}>Learn more</a>
</article>
))}
</div>
+18
View File
@@ -0,0 +1,18 @@
---
import { site } from "@data/site";
---
<section class="contact-cta" aria-labelledby="contact-cta-title">
<div>
<p class="eyebrow">Start the conversation</p>
<h2 id="contact-cta-title">Bring capital, strategy, and implementation into alignment.</h2>
<p>
BlueCap Strategies works with capital providers, project sponsors, communities, and
policymakers solving complex water-sector challenges.
</p>
</div>
<div class="cta-actions">
<a class="button" href="/contact/">Request a consultation</a>
<a class="text-link" href={site.contactEmailHref}>{site.email}</a>
</div>
</section>
+33
View File
@@ -0,0 +1,33 @@
---
import { nav, serviceNav, site } from "@data/site";
---
<footer class="site-footer">
<div class="footer-inner">
<section class="footer-brand" aria-label="BlueCap Strategies summary">
<img src="/assets/bluecap-logo.png" alt="BlueCap Strategies" width="190" height="57" />
<p>
Transforming environmental challenges into investable opportunities through strategy,
capital, and implementation support for aquatic resources.
</p>
</section>
<nav aria-label="Footer navigation">
<h2>Quick Links</h2>
{nav.map((item) => <a href={item.href}>{item.label}</a>)}
</nav>
<nav aria-label="Service navigation">
<h2>Services</h2>
{serviceNav.slice(0, 5).map((item) => <a href={item.href}>{item.label}</a>)}
<a href="/services/">All services</a>
</nav>
<section>
<h2>Contact Info</h2>
<p><strong>Phone</strong><br /><a href={`tel:${site.phone.replaceAll("-", "")}`}>{site.phone}</a></p>
<p><strong>Email</strong><br /><a href={site.contactEmailHref}>{site.email}</a></p>
<a class="footer-cta" href="/contact/">Request a consultation</a>
</section>
</div>
<div class="footer-bottom">
<p>(c) 2026 BlueCap Strategies, LLC. All rights reserved.</p>
</div>
</footer>
+32
View File
@@ -0,0 +1,32 @@
---
import { nav, serviceNav } from "@data/site";
---
<header class="site-header">
<div class="header-inner">
<a class="brand" href="/" aria-label="BlueCap Strategies home">
<img src="/assets/bluecap-logo.png" alt="BlueCap Strategies" width="220" height="66" />
</a>
<nav class="desktop-nav" aria-label="Primary navigation">
<a href="/">Home</a>
<div class="nav-menu">
<a href="/services/">Services</a>
<div class="nav-panel" aria-label="Service pages">
{serviceNav.map((item) => <a href={item.href}>{item.label}</a>)}
</div>
</div>
<a href="/focus-areas/">Focus Areas</a>
<a href="/about-us/">About Us</a>
<a href="/insights/">Insights</a>
<a class="nav-cta" href="/contact/">Contact</a>
</nav>
<details class="mobile-nav">
<summary aria-label="Open navigation">Menu</summary>
<nav aria-label="Mobile navigation">
{nav.map((item) => <a href={item.href}>{item.label}</a>)}
<hr />
{serviceNav.map((item) => <a href={item.href}>{item.label}</a>)}
</nav>
</details>
</div>
</header>
+26
View File
@@ -0,0 +1,26 @@
---
type Props = {
eyebrow?: string;
title: string;
lead?: string;
image?: string;
imageAlt?: string;
};
const {
eyebrow,
title,
lead,
image = "/assets/live-site/img_0067.jpg",
imageAlt = "Water resources and coastal landscape",
} = Astro.props;
---
<section class="page-hero">
<div class="hero-copy">
{eyebrow && <p class="eyebrow">{eyebrow}</p>}
<h1>{title}</h1>
{lead && <p>{lead}</p>}
</div>
<img src={image} alt={imageAlt} width="1280" height="854" loading="eager" />
</section>
+65
View File
@@ -0,0 +1,65 @@
import { defineCollection, z } from "astro:content";
/**
* Shared SEO/AEO frontmatter rules (ADR-0003). Encoded as Zod so violations FAIL the build:
* `astro check` / `astro build` reject any content entry that breaks these constraints.
* See docs/seo-aeo-optimization.md §1.
*/
export const seoSchema = z.object({
// Rendered as "`title` | BlueCap Strategies"; keep the base title tight so the full SERP title
// stays within ~60 chars where practical.
title: z.string().min(3).max(60),
// Serves as <meta name="description"> + OG/Twitter description; 120–158 is the safe SERP / AI
// snippet window.
description: z.string().min(120).max(158),
// Canonical is derived from the route by default; override only for cross-posted content.
canonicalUrl: z.string().url().optional(),
// Absolute path to a social share image under /assets (falls back to the layout default).
ogImage: z.string().startsWith("/assets/").optional(),
// Primary entity/topic — powers internal linking and schema keywords.
primaryTopic: z.string().optional(),
noindex: z.boolean().default(false),
});
/**
* Service + focus-area detail pages (ADR-0002). Prose lives in the Markdown body (exact live-site
* copy — see docs/live-site-content-inventory.md); structured/SEO fields live in frontmatter.
* `summary` is the exact overview paragraph reused on the /services/, /focus-areas/, and homepage
* cards; `description` is the SEO meta description.
*/
const detailSchema = seoSchema.extend({
summary: z.string().min(1),
eyebrow: z.string(),
lead: z.string().optional(),
order: z.number(),
icon: z.string().optional(),
image: z.string().optional(),
});
const insights = defineCollection({
type: "content",
schema: seoSchema.extend({
publishDate: z.date(),
modifiedDate: z.date().optional(),
tags: z.array(z.string()).default([]),
draft: z.boolean().default(false),
}),
});
const services = defineCollection({ type: "content", schema: detailSchema });
const focusAreas = defineCollection({ type: "content", schema: detailSchema });
// Standalone long-form pages (About, etc.) — prose in the Markdown body (ADR-0002), hero + SEO
// fields in frontmatter. The sticky in-page nav is derived from the body's h2 headings.
const pages = defineCollection({
type: "content",
schema: seoSchema.extend({
eyebrow: z.string().optional(),
heroTitle: z.string(),
heroLead: z.string().optional(),
heroImage: z.string().optional(),
heroImageAlt: z.string().optional(),
}),
});
export const collections = { insights, services, "focus-areas": focusAreas, pages };
@@ -0,0 +1,10 @@
---
title: "Economic Development for Island and Coastal Communities"
description: "BlueCap supports island and coastal community development through eco-tourism, resilient infrastructure, sustainable fisheries, and shoreline protection."
summary: "We are committed to supporting the sustainable development of island and coastal communities through eco-friendly tourism, resilient infrastructure, sustainable fisheries, and shoreline protection. Our holistic approach integrates environmental stewardship with economic growth, ensuring these unique communities can prosper while safeguarding their natural ecosystems for future generations."
eyebrow: "Core Focus Area"
order: 4
primaryTopic: "coastal community development"
---
We are committed to supporting the sustainable development of island and coastal communities through eco-friendly tourism, resilient infrastructure, sustainable fisheries, and shoreline protection. Our holistic approach integrates environmental stewardship with economic growth, ensuring these unique communities can prosper while safeguarding their natural ecosystems for future generations.
@@ -0,0 +1,10 @@
---
title: "Structuring Marine Conservation Finance"
description: "BlueCap designs financial mechanisms and environmental markets that channel scalable capital into effective, measurable marine conservation projects."
summary: "Our team excels in designing financial mechanisms that channel capital into marine conservation projects. We are experts at measuring impacts, evaluating funding opportunities, and creating scalable financial structures that drive effective marine conservation efforts forward. We also focus on expanding environmental markets that enable the trading of environmental assets, unlocking solutions that benefit both the environment and capital markets."
eyebrow: "Core Focus Area"
order: 2
primaryTopic: "marine conservation finance"
---
Our team excels in designing financial mechanisms that channel capital into marine conservation projects. We are experts at measuring impacts, evaluating funding opportunities, and creating scalable financial structures that drive effective marine conservation efforts forward. We also focus on expanding environmental markets that enable the trading of environmental assets, unlocking solutions that benefit both the environment and capital markets.
@@ -0,0 +1,10 @@
---
title: "Sustainable Living Resource Utilization"
description: "BlueCap guides investment into responsible aquaculture, sustainable fisheries, and IUU-fishing solutions that balance ecology with economic development."
summary: "BlueCap Strategies supports the sustainable use of living marine resources by guiding investment into responsible aquaculture, sustainable fisheries, and combating illegal, unregulated, and unreported (IUU) fishing. We also nurture and expand organizations in this sector, helping them grow while maintaining a balance between ecological preservation and economic development. Our focus ensures these vital industries can thrive sustainably."
eyebrow: "Core Focus Area"
order: 3
primaryTopic: "sustainable living resources"
---
BlueCap Strategies supports the sustainable use of living marine resources by guiding investment into responsible aquaculture, sustainable fisheries, and combating illegal, unregulated, and unreported (IUU) fishing. We also nurture and expand organizations in this sector, helping them grow while maintaining a balance between ecological preservation and economic development. Our focus ensures these vital industries can thrive sustainably.
@@ -0,0 +1,10 @@
---
title: "The Economics of PFAS Remediation"
description: "BlueCap navigates the finance of PFAS remediation, evaluating cost-effective technologies and building funding pathways for efficient, equitable cleanup."
summary: "BlueCap Strategies offers deep expertise in navigating the financial complexities of PFAS remediation. We identify cost-effective technologies and help grow emerging solutions into viable remediation options. By developing funding sources and pathways, we enable communities to address this issue efficiently and equitably, ensuring both immediate action and lasting financial sustainability."
eyebrow: "Core Focus Area"
order: 1
primaryTopic: "PFAS remediation finance"
---
BlueCap Strategies offers deep expertise in navigating the financial complexities of PFAS remediation. We identify cost-effective technologies and help grow emerging solutions into viable remediation options. By developing funding sources and pathways, we enable communities to address this issue efficiently and equitably, ensuring both immediate action and lasting financial sustainability.
+14
View File
@@ -0,0 +1,14 @@
---
title: "Example draft insight"
description: "A draft placeholder that keeps the insights collection active and demonstrates the SEO frontmatter every published BlueCap Strategies insight must supply."
publishDate: 2026-06-04
modifiedDate: 2026-06-04
tags:
- water infrastructure
primaryTopic: "insights publishing"
draft: true
---
This draft placeholder keeps the insights content collection active. Replace it with imported
Substack, Medium, article, essay, case study, market note, or announcement content when publishing
begins.
+111
View File
@@ -0,0 +1,111 @@
---
title: "About Us"
description: "BlueCap Strategies works at the intersection of finance, innovation, and stewardship, supporting the sustainable management of global water resources."
eyebrow: "About Us"
heroTitle: "Finance, innovation, and stewardship for global water resources"
heroImage: "/assets/live-site/img_0062.jpg"
heroImageAlt: "Coastal aquatic landscape representing BlueCap Strategies work"
primaryTopic: "about BlueCap Strategies"
---
At BlueCap Strategies, we stand at the intersection of finance, innovation, and environmental stewardship, uniquely positioned to address one of the most pressing challenges of our time: the sustainable management of global water resources. We believe that economic growth and environmental sustainability are not mutually exclusive but are, in fact, deeply intertwined. Our mission is to leverage the power of capital markets to create lasting solutions that preserve and restore marine and freshwater ecosystems while delivering measurable financial returns for our clients.
## Our Vision
### A World Where Water and Prosperity Flow Together
Water is the lifeblood of our economies and ecosystems. Yet, as global populations grow and climate change accelerates, our water resources face unprecedented pressures. At BlueCap Strategies, we see these challenges as opportunities for transformation. Our vision is to create a future where water resources are not only safeguarded but also serve as drivers of economic prosperity.
Our work is guided by the belief that we can build systems where thriving aquatic ecosystems and robust economies coexist. We work to ensure that investments in water not only solve immediate issues but also lay the foundation for long-term environmental and economic resilience. By aligning financial strategies with sustainability goals, we empower our clients to be both profitable and responsible stewards of the planet's most vital resource.
![Coastal shoreline where freshwater meets the sea](/assets/live-site/img1.jpg)
## Why We Exist
### The Global Water Crisis
The global water crisis is not a distant threat — it's a reality that impacts billions of people today. From water scarcity affecting entire regions to pollution threatening the health of our oceans, rivers, and lakes, the need for bold, scalable solutions has never been greater. The complexity of the water crisis, compounded by fragmented funding, technological gaps, and limited policy support, calls for a new approach. That's where BlueCap Strategies comes in.
We exist to solve these challenges by unlocking capital and building the organizations and infrastructure needed to tackle these pressing water issues. Whether it's supporting PFAS remediation, helping communities adapt to changing marine ecosystems, or creating markets for water-based environmental assets, our role is to bring innovative financial solutions to the table. We help bridge the gap between those who have the capital and those who have the knowledge and capacity to implement real-world solutions.
![Open water and marine environment](/assets/live-site/img_0055.jpg)
## What Sets Us Apart
### Blending Financial Expertise with Environmental Impact
At BlueCap Strategies, we do more than just advise — we drive real, on-the-ground change. Our ability to combine deep financial expertise with a passion for environmental impact is what sets us apart. While many consultancies offer strategic guidance, we go further, ensuring that the strategies we develop are actionable, scalable, and lead to measurable, tangible results.
### Integrated Approach: Beyond Consulting
Most firms provide either financial consulting or environmental solutions. We've chosen to integrate these two areas into one cohesive offering. Our hybrid business model allows us to function not only as advisors but also as active participants when the need arises. This means we don't just recommend solutions — we build them, sponsor them, and drive them to completion when market gaps demand it.
For instance, in PFAS remediation — one of the most pressing water contamination issues facing communities today — we don't just identify funding options. We work alongside stakeholders to structure projects that secure necessary capital, implement the most cost-effective technologies, and monitor long-term outcomes to ensure lasting impact.
In marine conservation finance, we help develop mechanisms that channel capital into marine preservation efforts, ensuring that these projects are not just financially viable but capable of driving meaningful environmental change. Whether it's through designing market-based solutions or working to unlock new funding streams, we approach every challenge with the goal of creating both economic and environmental value.
![Aquaculture and working waters](/assets/live-site/img_0054.jpg)
## Collaborative Partnerships
### The Heart of Our Approach
At BlueCap Strategies, we know that multi-stakeholder collaboration is the key to creating solutions that last. The complexities of the water sector demand partnerships across the public and private sectors, and between global institutions and local communities. We serve as the bridge that connects these diverse stakeholders, ensuring that the right expertise, resources, and capital are brought together for maximum impact.
Our work with island and coastal communities is a prime example of this collaborative approach. These communities often face unique environmental challenges, such as rising sea levels, overfishing, and limited access to clean water. By working closely with local governments, non-profits, and private investors, we can help develop sustainable tourism projects, aquaculture initiatives, and coastal resilience plans that both protect ecosystems and drive economic growth. These partnerships allow us to tailor solutions to the specific needs of each community while ensuring that the projects are financially sustainable in the long run.
![Island and coastal community waters](/assets/live-site/img_0072.jpg)
## Policy and Market Development
Another critical piece of the puzzle is our work in policy advocacy and market development. Many of the most pressing water challenges — such as pollution and resource depletion — require innovative market-based solutions and strong regulatory frameworks. We work on both fronts, advocating for policies that support sustainable water use and creating new environmental markets where water-related assets can be traded.
By helping to shape these markets and policies, we reduce the friction that often exists between capital providers and project sponsors, ensuring that investment flows smoothly and projects can be executed without unnecessary delays or obstacles. This, in turn, leads to faster, more effective solutions to environmental challenges.
![Freshwater river system](/assets/live-site/img_0053.jpg)
## Data-Driven Innovation
### Our Edge in Creating Sustainable Solutions
Innovation isn't just about new ideas — it's about ensuring that those ideas are grounded in data and designed to deliver measurable results. At BlueCap Strategies, we pride ourselves on our data-driven approach to problem-solving. From financial modeling to environmental impact assessments, we use the latest tools and technologies to ensure that our projects are both financially viable and environmentally sound.
For example, in our work with PFAS remediation, we can not only evaluate the costs and benefits of various remediation technologies but also measure the long-term effectiveness of these solutions through ongoing impact assessments. This data allows us to continuously refine our approach, ensuring that our clients get the best possible return on their investment while also achieving the greatest environmental benefit.
![Coastal waters at the shoreline](/assets/live-site/img_0058.jpg)
## Sustainability and Profitability
### A Dual Mandate
Too often, businesses and investors are asked to choose between profitability and sustainability. At BlueCap Strategies, we reject this notion. We believe that the two can — and should — go hand in hand. Our projects are designed to deliver both financial returns and measurable environmental outcomes, ensuring that our clients can succeed in both realms.
Take our work in sustainable living resource utilization, for example. In this area, we help clients invest in aquaculture and fisheries that are not only profitable but also environmentally responsible. By developing business models that prioritize sustainability from the outset, we ensure that these industries can continue to thrive without depleting the natural resources they depend on. This approach benefits not only the environment but also the communities and investors who rely on these industries for their livelihoods.
![Sustainable fisheries and living marine resources](/assets/live-site/img_0075.jpg)
## Our Core Values
### The Foundation of our Work
At the heart of everything we do are our core values: integrity, innovation, and impact. These values aren't just words — they are the guiding principles that shape our decisions and actions.
**Integrity:** We hold ourselves to the highest ethical standards in all aspects of our work. Our clients trust us to act in their best interests, and we take that responsibility seriously.
**Innovation:** We are constantly pushing the boundaries of what's possible. Whether developing new financial products or helping clients adopt cutting-edge technologies, we are committed to staying at the forefront of innovation.
**Impact:** Our success is measured by the impact we create. We are driven by the desire to make a real difference in the world, and we take pride in the tangible results we deliver for our clients and the planet.
![Marine and freshwater ecosystem](/assets/live-site/img_0070.jpg)
## Looking to the Future
### Scaling Our Impact
As we look to the future, we are excited about the growing role of capital in solving global water challenges. With climate change, urbanization, and industrialization continuing to strain water resources, the need for scalable, impactful solutions is greater than ever. At BlueCap Strategies, we are committed to leading the charge, helping to scale solutions that not only address immediate issues but also lay the groundwork for long-term resilience.
In the coming years, we aim to deepen our focus on innovative financing models that bring more capital to the water sector, expand our policy advocacy efforts to support sustainable water management, and continue building partnerships that enable communities and ecosystems to thrive.
## Join Us in Building a Sustainable Future
If you share our vision of a future where water and prosperity flow together, we invite you to partner with us. Whether you're an investor, project sponsor, or policymaker, BlueCap Strategies can help you achieve your goals while making a meaningful impact on the planet.
@@ -0,0 +1,17 @@
---
title: "Develop and Deploy Catalytic Capital"
description: "BlueCap structures and deploys catalytic capital into high-impact water, PFAS, and marine conservation projects for financial and environmental returns."
summary: "We strategically develop and deploy catalytic capital to drive investment into high-impact, sustainable, water-oriented projects. Our approach maximizes financial returns while accelerating the adoption of innovative solutions that benefit marine and freshwater ecosystems."
eyebrow: "Service"
order: 2
primaryTopic: "catalytic capital"
icon: "/assets/live-site/icons/capital.png"
---
## Driving Sustainable Investments for Maximum Impact
At the heart of our mission is the belief that capital can be a powerful force for good. Our Develop and Deploy Catalytic Capital service is designed to unlock and direct financial resources towards projects that drive meaningful change in the water sector. We work with a range of investors, including private equity firms, impact investors, and philanthropic organizations, to structure and deploy capital in a way that maximizes both financial returns and environmental impact.
This service involves a comprehensive process of identifying high-impact investment opportunities, designing financial structures that align with investor goals, and managing the deployment of capital to ensure optimal outcomes. We focus on projects that have the potential to be transformative, such as innovative PFAS remediation technologies, large-scale marine conservation initiatives, and the development of sustainable aquaculture practices. By mobilizing catalytic capital, we aim to accelerate the adoption of solutions that can have a significant positive impact on marine and freshwater ecosystems.
Our team brings a wealth of experience in financial analysis, capital structuring, and project management, allowing us to navigate the complexities of funding mechanisms and investor expectations. We work closely with clients to understand their financial objectives and risk tolerance, developing tailored investment strategies that align with their mission and values. Through this collaborative approach, we help investors not only achieve their financial goals but also contribute to the long-term sustainability of our planet's water resources.
@@ -0,0 +1,17 @@
---
title: "Impact Assessment & Reporting"
description: "BlueCap delivers rigorous, data-driven impact assessment and reporting, defining KPIs and measuring environmental, social, and economic outcomes."
summary: "We offer comprehensive impact assessment and reporting services, providing clients with transparent and data-driven insights into the effectiveness of their investments. Our evaluations help ensure accountability and demonstrate tangible progress toward environmental and financial goals."
eyebrow: "Service"
order: 7
primaryTopic: "impact assessment"
icon: "/assets/live-site/icons/impact-reporting.png"
---
## Demonstrating Value Through Comprehensive Impact Analysis
In the realm of sustainable initiatives, measuring impact is essential for understanding effectiveness and guiding future efforts. Our Impact Assessment and Reporting service provides clients with the tools and insights needed to evaluate the success of their projects and investments. We offer a rigorous, data-driven approach to impact assessment, ensuring that outcomes are accurately measured, transparently reported, and aligned with the client's objectives.
We begin by working with clients to define key performance indicators (KPIs) and metrics that reflect the project's goals, whether they involve environmental conservation, social benefits, or economic returns. Using a combination of quantitative and qualitative methods, we collect and analyze data to assess the project's impact over time. This includes monitoring environmental indicators, evaluating social and economic benefits, and identifying areas for improvement.
Our reporting process is designed to provide clear, actionable insights that can be used for internal decision-making and external communication. We produce comprehensive reports that not only present the data but also interpret the findings in the context of the client's strategic goals. By demonstrating the value and impact of their initiatives, our clients can build trust with stakeholders, attract further investment, and drive continuous improvement in their sustainability efforts.
@@ -0,0 +1,17 @@
---
title: "Market Intelligence & Opportunity Analysis"
description: "Market intelligence and opportunity analysis for investors and sponsors navigating regulatory change and emerging opportunities in the water sector."
summary: "We provide in-depth market intelligence to identify emerging trends and untapped opportunities in the water sector. Our analyses enable clients to make informed decisions, positioning them at the forefront of sustainable innovation and investment."
eyebrow: "Service"
order: 1
primaryTopic: "market intelligence"
icon: "/assets/live-site/icons/market-research.png"
---
## Navigating the Blue Economy with Expert Insights
In the rapidly evolving water sector, staying ahead of market trends is crucial for strategic decision-making. Our Market Intelligence and Opportunity Analysis service provides clients with a comprehensive understanding of the landscape, encompassing regulatory changes, technological advancements, and emerging investment opportunities. We leverage a combination of data analytics, industry research, and expert insights to deliver actionable intelligence. This service is designed to empower clients to make informed choices that align with their strategic objectives, whether they are looking to invest, develop new technologies, or enter new markets.
Our approach involves a deep dive into market trends, including the analysis of current and future demands, competitive landscapes, and the economic and regulatory factors influencing the sector. We also assess the potential risks and rewards associated with different market segments, helping clients identify where their investments can have the greatest impact. By combining qualitative and quantitative data, we provide a nuanced view of the market that goes beyond surface-level analysis.
Additionally, we offer opportunity mapping to pinpoint specific areas where clients can leverage their strengths and resources. This includes identifying emerging trends such as PFAS remediation technologies, marine conservation finance mechanisms, and sustainable business models that have the potential to transform the market. With our insights, clients can confidently navigate the complexities of the Blue Economy and position themselves as leaders in sustainable innovation.
@@ -0,0 +1,17 @@
---
title: "Policy Advocacy & Development"
description: "BlueCap shapes and advocates for policy that supports sustainable management of marine and freshwater resources, guiding regulation and market development."
summary: "We advocate for, and contribute to, the development of policies that promote sustainable practices in the marine and freshwater sectors. Our expertise helps guide regulatory frameworks that support innovation, conservation, and responsible resource management."
eyebrow: "Service"
order: 8
primaryTopic: "policy advocacy"
icon: "/assets/live-site/icons/policy-advocacy.png"
---
## Shaping the Future of Sustainable Water Management
Effective policy is a cornerstone of sustainable water management, providing the framework for innovation, conservation, and responsible resource use. Our Policy Advocacy and Development service is dedicated to influencing and shaping policies that support the sustainable management of marine and freshwater resources. We work with clients to navigate the policy landscape, advocate for change, and contribute to the development of regulations that promote sustainable practices.
Our team has extensive experience in policy analysis, development, and advocacy, allowing us to engage with policymakers at all levels. We begin by analyzing existing policies and identifying gaps or areas for improvement that can support the client's objectives. We then work with stakeholders to develop policy recommendations, build coalitions, and advocate for their adoption.
We also assist clients in understanding and complying with regulatory requirements, ensuring that their projects and investments are aligned with current and emerging policies. By staying at the forefront of policy developments, we help clients navigate the complexities of the regulatory environment and capitalize on opportunities to drive systemic change. Through our advocacy efforts, we aim to create a policy framework that fosters innovation, supports sustainable development, and ensures the long-term health of our planet's water resources.
@@ -0,0 +1,17 @@
---
title: "Project Management & Implementation"
description: "BlueCap manages and implements water-sector projects from planning to completion, delivering on time, on budget, and aligned with sustainability goals."
summary: "From concept to completion, we manage and implement projects to ensure they meet strategic objectives and deliver measurable impact. Our comprehensive approach ensures seamless execution, aligning with timelines, budgets, and sustainability goals."
eyebrow: "Service"
order: 6
primaryTopic: "project management"
icon: "/assets/live-site/icons/project-management.png"
---
## Turning Vision into Reality with Expert Execution
The success of any project lies in its execution. Our Project Management and Implementation service is designed to ensure that initiatives are carried out efficiently, effectively, and in alignment with strategic objectives. We bring a hands-on approach to project management, overseeing every aspect of the process from planning to completion, and ensuring that projects are delivered on time, within scope, and on budget.
We start by developing a comprehensive project plan that outlines the goals, timelines, resources, and milestones. Our team applies best practices in project management, including risk assessment, quality control, and stakeholder communication, to keep projects on track and address any challenges that arise. We also provide on-the-ground support to manage the logistics and coordination of project activities, ensuring smooth implementation and successful outcomes.
Our expertise covers a wide range of projects, including PFAS remediation, marine conservation efforts, and the development of sustainable aquaculture systems. We understand the complexities involved in these initiatives, from regulatory compliance to technical requirements, and we have the experience and skills needed to navigate these challenges. By managing projects with precision and care, we help clients turn their vision into reality, achieving impactful results that make a difference.
@@ -0,0 +1,17 @@
---
title: "Stakeholder Engagement & Partnership Development"
description: "BlueCap builds and manages multi-stakeholder partnerships across governments, NGOs, and communities to make complex water projects successful and scalable."
summary: "We facilitate stakeholder engagement and forge collaborative partnerships to enhance project success and scalability. By aligning diverse interests and resources, we help create a unified approach to solving complex environmental challenges."
eyebrow: "Service"
order: 3
primaryTopic: "stakeholder engagement"
icon: "/assets/live-site/icons/stakeholder.png"
---
## Cultivating Collaboration for Sustainable Solutions
Effective stakeholder engagement and partnership development are essential for driving meaningful change in the water sector. Our service is dedicated to building and nurturing strategic alliances between diverse stakeholders, including governments, NGOs, corporations, and local communities. By fostering collaboration and aligning interests, we create the conditions for successful, scalable projects that address complex environmental challenges.
We begin by identifying key stakeholders and understanding their roles, interests, and potential contributions to the project. This involves mapping out the ecosystem of partners and assessing how each can support the initiative's objectives. We then facilitate dialogue and engagement, creating platforms for stakeholders to collaborate, share knowledge, and co-create solutions. Our team excels in managing multi-stakeholder initiatives, ensuring that all voices are heard and that partnerships are built on trust and mutual benefit.
Our approach is grounded in the belief that sustainable solutions require collective action. We work to create partnerships that are not only effective in the short term but also have the potential to drive long-lasting impact. By bringing together the right mix of expertise, resources, and influence, we help clients overcome barriers to implementation and achieve their sustainability goals. Whether it's developing a marine conservation finance mechanism, implementing a PFAS remediation project, or launching a new environmental market, our stakeholder engagement and partnership development services are designed to ensure success through collaboration.
@@ -0,0 +1,17 @@
---
title: "Sustainable Business Model Innovation"
description: "BlueCap helps clients design sustainable business models that integrate environmental responsibility with profitability across marine and freshwater markets."
summary: "We help clients develop sustainable business models that integrate environmental responsibility with profitability. By innovating new approaches to value creation, we ensure that our clients can thrive while making a positive impact on marine and freshwater resources."
eyebrow: "Service"
order: 5
primaryTopic: "business model innovation"
icon: "/assets/live-site/icons/business-model.png"
---
## Redefining Profitability with Sustainability
Achieving sustainability in the water sector requires not only technological innovation but also innovative business models. Our Sustainable Business Model Innovation service helps clients develop strategies that integrate environmental responsibility with financial success. We work with businesses to rethink how they create, deliver, and capture value in a way that is both profitable and sustainable.
Our approach involves a deep dive into the client's existing business model, identifying areas where sustainability can be integrated to enhance value creation. This includes exploring new revenue streams, cost efficiencies, and market opportunities that arise from adopting sustainable practices. We also help clients navigate the complexities of implementing these changes, from securing stakeholder buy-in to aligning operations with sustainability goals.
We focus on creating models that are adaptable and resilient, capable of thriving in an ever-changing market landscape. This includes considering factors such as regulatory changes, consumer preferences, and technological advancements. By developing innovative business models that prioritize sustainability, we enable our clients to lead the way in the Blue Economy, setting a standard for how businesses can succeed while making a positive impact on the planet.
@@ -0,0 +1,17 @@
---
title: "Sustainable Technology Incubation"
description: "BlueCap identifies, nurtures, and scales sustainable water technologies with technical support, business development, and capital for market readiness."
summary: "Our technology incubation services focus on fostering sustainable innovations that address critical challenges in the water sector. We support the development and scaling of cutting-edge technologies, accelerating their path to market readiness and impact."
eyebrow: "Service"
order: 4
primaryTopic: "technology incubation"
icon: "/assets/live-site/icons/green-technology.png"
---
## Accelerating Innovation for a Sustainable Future
Innovation is key to addressing the pressing challenges facing our marine and freshwater ecosystems. Our Sustainable Technology Incubation service is dedicated to identifying, nurturing, and scaling groundbreaking technologies that have the potential to revolutionize the water sector. We provide a comprehensive incubation process that includes technical support, business development, and access to capital, helping startups and innovators bring their ideas to market.
Our incubation process begins with a thorough assessment of the technology's potential impact, scalability, and market fit. We work with entrepreneurs and researchers to refine their concepts, develop prototypes, and test their solutions in real-world environments. Our team offers guidance on everything from technical development to regulatory compliance, ensuring that the technologies we incubate are not only innovative but also viable and ready for adoption.
In addition to technical support, we provide business development services to help innovators build sustainable business models. This includes market analysis, go-to-market strategy development, and financial planning. We also connect startups with our network of investors, partners, and industry experts, providing the resources and mentorship needed to accelerate growth. By fostering innovation through this holistic approach, we aim to bring forth solutions that can drive significant improvements in water quality, conservation, and resource management.
+41
View File
@@ -0,0 +1,41 @@
export const site = {
name: "BlueCap Strategies",
legalName: "BlueCap Strategies, LLC",
description:
"BlueCap Strategies helps investors, project sponsors, communities, and policymakers mobilize capital for aquatic resource restoration, preservation, and responsible use.",
url: "https://www.bluecapstrategies.com",
phone: "804-332-6618",
email: "info@bluecapstrategies.com",
contactEmailHref: "mailto:info@bluecapstrategies.com",
founder: "Brad Rodgers",
addressNote: "Serving water-sector clients across marine and freshwater markets.",
};
export const discoveryNotes = [
"The WordPress contact page contained placeholder contact fields (123-456-8912 and info@gmail.com), while the homepage and footer used 804-332-6618 and info@bluecapstrategies.com.",
"The rebuild uses the homepage/footer contact details as the credible public values.",
"The WordPress sitemap included a placeholder /focus-areas/ page but did not expose individual focus-area pages. This rebuild keeps /focus-areas/ and adds crawlable detail pages for each homepage focus-area summary.",
"The old homepage included placeholder social/follow copy. That filler was removed instead of being reproduced.",
];
export const nav = [
{ label: "Home", href: "/" },
{ label: "Services", href: "/services/" },
{ label: "Focus Areas", href: "/focus-areas/" },
{ label: "About Us", href: "/about-us/" },
{ label: "Insights", href: "/insights/" },
{ label: "Contact", href: "/contact/" },
];
// Services dropdown for the header/footer nav. Kept static (independent of the content collection)
// so nav components stay synchronous; order/titles mirror src/content/services/*.md.
export const serviceNav = [
{ label: "Market Intelligence & Opportunity Analysis", href: "/market-intelligence-opportunity-analysis/" },
{ label: "Develop and Deploy Catalytic Capital", href: "/develop-and-deploy-catalytic-capital/" },
{ label: "Stakeholder Engagement & Partnership Development", href: "/stakeholder-engagement-partnership-development/" },
{ label: "Sustainable Technology Incubation", href: "/sustainable-technology-incubation/" },
{ label: "Sustainable Business Model Innovation", href: "/sustainable-business-model-innovation/" },
{ label: "Project Management & Implementation", href: "/project-management-implementation/" },
{ label: "Impact Assessment & Reporting", href: "/impact-assessment-reporting/" },
{ label: "Policy Advocacy & Development", href: "/policy-advocacy-development/" },
];
+10
View File
@@ -0,0 +1,10 @@
/// <reference types="astro/client" />
interface ImportMetaEnv {
readonly PUBLIC_SITE_URL?: string;
readonly PUBLIC_CONTACT_FORM_ENDPOINT?: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
+62
View File
@@ -0,0 +1,62 @@
---
import Header from "@components/Header.astro";
import Footer from "@components/Footer.astro";
import Analytics from "@components/Analytics.astro";
import { site } from "@data/site";
import { assetUrl, canonical } from "@utils/url";
import { organizationSchema, websiteSchema } from "@utils/schema";
import "../styles/global.css";
type Props = {
title: string;
description: string;
pathname: string;
image?: string;
jsonLd?: unknown[];
};
const {
title,
description,
pathname,
image = "/assets/live-site/img_0067.jpg",
jsonLd = [],
} = Astro.props;
const pageTitle = title === site.name ? title : `${title} | ${site.name}`;
const canonicalUrl = canonical(pathname);
const imageUrl = assetUrl(image);
const schemas = [organizationSchema(), websiteSchema(), ...jsonLd];
---
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{pageTitle}</title>
<meta name="description" content={description} />
<link rel="canonical" href={canonicalUrl} />
<link rel="icon" href="/assets/bluecap-logo.png" />
<link rel="alternate" type="application/rss+xml" title="BlueCap Strategies Insights" href="/rss.xml" />
<meta property="og:type" content="website" />
<meta property="og:title" content={pageTitle} />
<meta property="og:description" content={description} />
<meta property="og:url" content={canonicalUrl} />
<meta property="og:image" content={imageUrl} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={pageTitle} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={imageUrl} />
{schemas.map((schema) => <script is:inline type="application/ld+json" set:html={JSON.stringify(schema)} />)}
<Analytics />
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<Header />
<main id="main">
<slot />
</main>
<Footer />
</body>
</html>
+22
View File
@@ -0,0 +1,22 @@
---
import BaseLayout from "@layouts/BaseLayout.astro";
const description = "The requested BlueCap Strategies page could not be found.";
---
<BaseLayout title="Page Not Found" description={description} pathname="/404/">
<section class="insights-shell">
<article class="note-card">
<p class="eyebrow">404</p>
<h1>Page not found</h1>
<p>
The page may have moved during the rebuild. Use the navigation to find services, focus
areas, or contact BlueCap Strategies directly.
</p>
<div class="hero-actions">
<a class="button" href="/">Home</a>
<a class="text-link" href="/services/">Services</a>
</div>
</article>
</section>
</BaseLayout>
+61
View File
@@ -0,0 +1,61 @@
---
import { getCollection } from "astro:content";
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import ContactCta from "@components/ContactCta.astro";
import { breadcrumbSchema, pageSchema, serviceSchema } from "@utils/schema";
export async function getStaticPaths() {
const services = await getCollection("services");
const focusAreas = await getCollection("focus-areas");
return [
...services.map((entry) => ({
params: { slug: entry.slug },
props: { entry, kind: "Service", parentTitle: "Services", parentHref: "/services/" },
})),
...focusAreas.map((entry) => ({
params: { slug: entry.slug },
props: { entry, kind: "Core Focus Area", parentTitle: "Focus Areas", parentHref: "/focus-areas/" },
})),
];
}
const { entry, kind, parentTitle, parentHref } = Astro.props;
const { title, description, image } = entry.data;
const pathname = `/${entry.slug}/`;
const isService = kind === "Service";
const { Content } = await entry.render();
const jsonLd = [
pageSchema({ title, description, pathname }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: parentTitle, href: parentHref },
{ name: title, href: pathname },
]),
...(isService ? [serviceSchema({ title, description, pathname })] : []),
];
---
<BaseLayout title={title} description={description} pathname={pathname} jsonLd={jsonLd}>
<PageHero eyebrow={kind} title={title} image={image ?? "/assets/live-site/img_0070.jpg"} />
<section class="section">
<div class="detail-layout">
<div class="article-body">
<p><a class="text-link" href={parentHref}>&larr; {parentTitle} overview</a></p>
<Content />
</div>
<aside class="sidebar" aria-label={`${title} — related`}>
<div class="note-card">
<h2>Related</h2>
<a class="text-link" href={parentHref}>{parentTitle} overview</a>
</div>
<div class="note-card">
<h2>Start a conversation</h2>
<a class="text-link" href="/contact/">Request a consultation</a>
</div>
</aside>
</div>
</section>
<ContactCta />
</BaseLayout>
+54
View File
@@ -0,0 +1,54 @@
---
import { getEntry } from "astro:content";
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import ContactCta from "@components/ContactCta.astro";
import { breadcrumbSchema, pageSchema } from "@utils/schema";
const about = await getEntry("pages", "about");
if (!about) throw new Error("Missing content entry: pages/about");
const { title, description, eyebrow, heroTitle, heroLead, heroImage, heroImageAlt } = about.data;
const { Content, headings } = await about.render();
const sectionNav = headings.filter((h) => h.depth === 2);
const pathname = "/about-us/";
---
<BaseLayout
title={title}
description={description}
pathname={pathname}
image={heroImage}
jsonLd={[
pageSchema({ type: "AboutPage", title, description, pathname }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: "About Us", href: pathname },
]),
]}
>
<PageHero
eyebrow={eyebrow}
title={heroTitle}
lead={heroLead}
image={heroImage ?? "/assets/live-site/img_0062.jpg"}
imageAlt={heroImageAlt}
/>
<section class="section">
<div class="detail-layout">
<div class="article-body">
<Content />
</div>
<aside class="sidebar" aria-label="On this page">
<nav class="note-card anchor-nav" aria-label="Section navigation">
<h2>On this page</h2>
<ul>
{sectionNav.map((h) => (
<li><a href={`#${h.slug}`}>{h.text}</a></li>
))}
</ul>
</nav>
</aside>
</div>
</section>
<ContactCta />
</BaseLayout>
+93
View File
@@ -0,0 +1,93 @@
---
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import { site } from "@data/site";
import { breadcrumbSchema, pageSchema } from "@utils/schema";
const description =
"Contact BlueCap Strategies to discuss capital formation, project strategy, partnerships, implementation, or water-sector advisory needs.";
const endpoint = import.meta.env.PUBLIC_CONTACT_FORM_ENDPOINT ?? "";
---
<BaseLayout
title="Contact"
description={description}
pathname="/contact/"
jsonLd={[
pageSchema({ type: "ContactPage", title: "Contact", description, pathname: "/contact/" }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: "Contact", href: "/contact/" },
]),
]}
>
<PageHero
eyebrow="Contact"
title="Get in touch with BlueCap Strategies"
lead="Share the opportunity, project, or water-sector challenge you are working on. BlueCap will respond through the most appropriate contact path."
image="/assets/live-site/img_0058.jpg"
imageAlt="Coastal water and marine resource landscape"
/>
<section class="section contact-layout">
<aside class="contact-panel">
<h2>Contact Info</h2>
<p><strong>Phone</strong><br /><a href={`tel:${site.phone.replaceAll("-", "")}`}>{site.phone}</a></p>
<p><strong>Email</strong><br /><a href={site.contactEmailHref}>{site.email}</a></p>
<p class="form-note">
Discovery note: the current WordPress contact page includes placeholder phone and email
values. This rebuild uses the verified homepage/footer contact details.
</p>
</aside>
<div class="form-panel">
<h2>Request a consultation</h2>
<p class="form-note">
The form is static-first and posts to the configured endpoint when
<code>PUBLIC_CONTACT_FORM_ENDPOINT</code> is set. Without an endpoint, it opens an email
draft after validating required fields.
</p>
<form class="contact-form" method="post" action={endpoint || "/thank-you/"} data-contact-form data-endpoint={endpoint}>
<input type="hidden" name="subject" value="BlueCap Strategies website inquiry" />
<div class="field-grid">
<label>
Name *
<input name="name" autocomplete="name" required minlength="2" />
</label>
<label>
Organization
<input name="organization" autocomplete="organization" />
</label>
</div>
<div class="field-grid">
<label>
Email *
<input name="email" type="email" autocomplete="email" required />
</label>
<label>
Phone
<input name="phone" type="tel" autocomplete="tel" />
</label>
</div>
<label>
Message *
<textarea name="message" required minlength="20"></textarea>
</label>
<button class="button" type="submit">Submit</button>
</form>
</div>
</section>
<script>
const form = document.querySelector("[data-contact-form]");
form?.addEventListener("submit", (event) => {
const endpoint = form.getAttribute("data-endpoint");
if (endpoint) return;
event.preventDefault();
if (!(form instanceof HTMLFormElement) || !form.reportValidity()) return;
const data = new FormData(form);
const subject = encodeURIComponent("BlueCap Strategies website inquiry");
const body = encodeURIComponent(
`Name: ${data.get("name")}\nOrganization: ${data.get("organization") ?? ""}\nEmail: ${data.get("email")}\nPhone: ${data.get("phone") ?? ""}\n\n${data.get("message")}`,
);
window.location.href = `mailto:${"info@bluecapstrategies.com"}?subject=${subject}&body=${body}`;
});
</script>
</BaseLayout>
+47
View File
@@ -0,0 +1,47 @@
---
import { getCollection } from "astro:content";
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import CardGrid from "@components/CardGrid.astro";
import ContactCta from "@components/ContactCta.astro";
import { breadcrumbSchema, pageSchema } from "@utils/schema";
const focusAreas = (await getCollection("focus-areas")).sort((a, b) => a.data.order - b.data.order);
const description =
"BlueCap Strategies focuses on PFAS remediation economics, marine conservation finance, sustainable living resource utilization, and island and coastal community development.";
---
<BaseLayout
title="Focus Areas"
description={description}
pathname="/focus-areas/"
image="/assets/live-site/img_0070.jpg"
jsonLd={[
pageSchema({ title: "Focus Areas", description, pathname: "/focus-areas/" }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: "Focus Areas", href: "/focus-areas/" },
]),
]}
>
<PageHero
eyebrow="Core Focus Areas"
title="Focused expertise for high-stakes aquatic resource challenges"
lead="BlueCap concentrates on areas where finance, policy, innovation, and implementation can unlock measurable progress for aquatic ecosystems and coastal economies."
image="/assets/live-site/img_0070.jpg"
imageAlt="Coastal water resource landscape"
/>
<section class="section">
<CardGrid
heading="Our core focus areas"
items={focusAreas.map((area) => ({
title: area.data.title,
description: area.data.summary,
href: `/${area.slug}/`,
}))}
label="Focus area pages"
/>
</section>
<ContactCta />
</BaseLayout>
+182
View File
@@ -0,0 +1,182 @@
---
import { getCollection } from "astro:content";
import BaseLayout from "@layouts/BaseLayout.astro";
import CardGrid from "@components/CardGrid.astro";
import ContactCta from "@components/ContactCta.astro";
import { pageSchema } from "@utils/schema";
const services = (await getCollection("services")).sort((a, b) => a.data.order - b.data.order);
const focusAreas = (await getCollection("focus-areas")).sort((a, b) => a.data.order - b.data.order);
const description =
"BlueCap Strategies leverages capital, strategy, and data-driven insight to restore, preserve, and responsibly use aquatic resources.";
---
<BaseLayout
title="BlueCap Strategies"
description={description}
pathname="/"
image="/assets/live-site/img_0067.jpg"
jsonLd={[pageSchema({ title: "BlueCap Strategies", description, pathname: "/" })]}
>
<section class="home-hero">
<div class="hero-copy">
<p class="eyebrow">Water-sector strategy and capital formation</p>
<h1>Leveraging capital to drive the restoration, preservation and responsible use of aquatic resources</h1>
<p>
At BlueCap Strategies, we combine financial expertise, innovative strategies, and
data-driven insights to accelerate the restoration and responsible use of aquatic
resources. We empower our clients and partners to shape a sustainable future where
ecosystems and economies thrive together.
</p>
<div class="hero-actions">
<a class="button" href="/contact/">Request a Consultation</a>
<a class="text-link" href="/services/">Explore services</a>
</div>
</div>
<div class="hero-media">
<img
src="/assets/live-site/img_0067.jpg"
alt="Blue water and coastal landscape representing aquatic resource strategy"
width="1280"
height="854"
/>
</div>
</section>
<section class="section alt" aria-labelledby="how-work">
<div class="section-inner">
<div class="section-header">
<p class="eyebrow">How We Work</p>
<h2 id="how-work">Unlocking Capital and Innovation to Solve Global Water Challenges</h2>
<p>
At BlueCap Strategies, we create the conditions for water-related capital and project
demand to intersect seamlessly. Our approach ensures that sustainable water solutions are
capital-ready, capable of delivering measurable impact, and tailored to benefit both
ecosystems and economies.
</p>
</div>
<div class="three-grid">
<article class="work-card">
<h3>Increasing the Supply of Capital</h3>
<p>
We're dedicated to expanding the pool of capital available for water-related projects.
Our team works diligently to educate potential investors on the importance and potential
returns of water-focused initiatives. Through rigorous evaluation and due diligence, we
identify and present high-quality investment and funding opportunities in areas such as
water treatment, conservation, and emerging marine technologies. Our goal is to create a
robust pipeline of well-structured, impactful projects that attract diverse sources of
capital across the spectrum, from traditional investors to impact-focused funds, as well
as grant-making organizations.
</p>
</article>
<article class="work-card">
<h3>Bridging Supply and Demand</h3>
<p>
Our unique value lies in facilitating effective, seamless relationships between capital
providers and project sponsors. Through policy advocacy, market development, stakeholder
engagement and impact assessment, we ensure that both sides of the transaction understand
and meet each other's expectations. We reduce friction, ensuring capital flows
strategically to deliver the greatest environmental and economic impact.
</p>
</article>
<article class="work-card">
<h3>Cultivating Capital-Ready Initiatives</h3>
<p>
BlueCap Strategies is committed to boosting the demand for water-related capital by
preparing projects for investment. We collaborate closely with project sponsors,
providing expertise to transform promising ideas into capital-ready ventures. We help
them structure projects in ways that appeal to investors, focusing on scalability,
sustainability, and measurable impact. By streamlining project design, financial
modeling, and risk management, we ensure that these sponsors can effectively attract the
capital they need to succeed.
</p>
<p>
Our primary goal is to equip project sponsors with the tools and expertise to attract
capital. However, when existing solutions cannot meet the urgency or scale of certain
challenges, we adapt from advisors to active participants. In these situations, BlueCap
Strategies is ready to step in directly as a project sponsor. We take the lead in
assembling teams, sourcing capital, and overseeing implementation to ensure critical
needs are addressed. Whether building partnerships, sourcing capital, or overseeing
execution, we bring the necessary expertise to drive innovation and catalyze change in
underserved areas.
</p>
</article>
</div>
</div>
</section>
<section class="section" aria-labelledby="about-home">
<div class="media-band">
<img src="/assets/live-site/img_0053.jpg" alt="Aquatic ecosystem and coastal water" width="1024" height="679" />
<div class="section-header">
<p class="eyebrow">About Us</p>
<h2 id="about-home">Innovating towards a sustainable future</h2>
<p>
At BlueCap Strategies, we transform environmental challenges into profitable, investable
opportunities. By driving catalytic capital into sustainable projects, we not only ensure
thriving aquatic ecosystems but also deliver substantial financial returns. Led by industry
pioneer Brad Rodgers, our team brings a unique blend of financial acumen, capital
structuring expertise, policy innovation, and strategic partnerships. We collaborate
closely with clients to develop tailored solutions, and when existing options fall short,
we innovate and implement impactful strategies ourselves. Our flexible, hybrid approach
allows us to adapt and solve the most complex challenges with both insight and decisive
action.
</p>
<a class="text-link" href="/about-us/">Learn More</a>
</div>
</div>
<div class="stats-grid" aria-label="BlueCap Strategies experience metrics">
<div class="stat"><strong>27 Years</strong><span>of senior-level experience working with institutional capital providers</span></div>
<div class="stat"><strong>$10+ billion</strong><span>of capital deployed across real-asset, infrastructure and environmental sectors.</span></div>
<div class="stat"><strong>$3.5+ billion</strong><span>of public-private partnerships structured in key ESG and environmental infrastructure sectors.</span></div>
<div class="stat"><strong>275+ Projects and Initiatives</strong><span>advised on across real-asset, environmental, and water resource sectors.</span></div>
</div>
</section>
<section class="section alt" aria-labelledby="services-home">
<div class="section-inner">
<div class="section-header">
<p class="eyebrow">Our Services</p>
<h2 id="services-home">Strategy, capital, partnerships, and implementation</h2>
<p>
BlueCap supports clients across the full lifecycle of water-sector opportunities, from
market intelligence and capital strategy through project delivery and reporting.
</p>
</div>
<CardGrid
items={services.map((service) => ({
title: service.data.title,
description: service.data.summary,
href: `/${service.slug}/`,
icon: service.data.icon,
}))}
label="BlueCap services"
/>
</div>
</section>
<section class="section" aria-labelledby="focus-home">
<div class="section-header">
<p class="eyebrow">Our Core Focus Areas</p>
<h2 id="focus-home">Where strategy, capital, and innovation shape the future of water resources</h2>
<p>
At BlueCap Strategies, we tackle pressing water challenges by combining innovation, capital
mobilization, and data-driven insights. From securing grant funding to guiding investments,
we help clients unlock sustainable opportunities in marine and freshwater sectors, bridging
the gap between capital providers and project sponsors to drive impactful solutions.
</p>
</div>
<div class="focus-grid">
{focusAreas.map((area) => (
<article class="focus-card">
<h3><a href={`/${area.slug}/`}>{area.data.title}</a></h3>
<p>{area.data.summary}</p>
<a class="text-link" href={`/${area.slug}/`}>Learn more</a>
</article>
))}
</div>
</section>
<ContactCta />
</BaseLayout>
+61
View File
@@ -0,0 +1,61 @@
---
import { getCollection } from "astro:content";
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import ContactCta from "@components/ContactCta.astro";
import { breadcrumbSchema, pageSchema } from "@utils/schema";
export async function getStaticPaths() {
const posts = await getCollection("insights");
return posts.map((post) => ({
params: { slug: post.slug },
props: { post },
}));
}
const { post } = Astro.props;
const { Content } = await post.render();
const pathname = `/insights/${post.slug}/`;
const jsonLd = [
pageSchema({ title: post.data.title, description: post.data.description, pathname }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: "Insights", href: "/insights/" },
{ name: post.data.title, href: pathname },
]),
];
---
<BaseLayout title={post.data.title} description={post.data.description} pathname={pathname} jsonLd={jsonLd}>
<PageHero
eyebrow="Insight"
title={post.data.title}
lead={post.data.description}
image="/assets/live-site/img_0067.jpg"
/>
<article class="detail-layout">
<div class="article-body">
<Content />
</div>
<aside class="sidebar" aria-label="Insight details">
<div class="note-card">
<h2>Published</h2>
<p>{post.data.publishDate.toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}</p>
</div>
{post.data.tags && post.data.tags.length > 0 && (
<div class="note-card">
<h2>Tags</h2>
<ul class="outcome-grid">
{post.data.tags.map((tag) => <li>{tag}</li>)}
</ul>
</div>
)}
<div class="note-card">
<h2>Related</h2>
<a class="text-link" href="/insights/">Insights overview</a>
</div>
</aside>
</article>
<ContactCta />
</BaseLayout>
+47
View File
@@ -0,0 +1,47 @@
---
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import ContactCta from "@components/ContactCta.astro";
import { breadcrumbSchema, pageSchema } from "@utils/schema";
const description =
"A prepared future publishing section for BlueCap Strategies articles, essays, case studies, market notes, and announcements.";
---
<BaseLayout
title="Insights"
description={description}
pathname="/insights/"
jsonLd={[
pageSchema({ title: "Insights", description, pathname: "/insights/" }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: "Insights", href: "/insights/" },
]),
]}
>
<PageHero
eyebrow="Insights"
title="Future publishing home for BlueCap Strategies"
lead="This section is prepared for articles, essays, case studies, market notes, and announcements when BlueCap migrates thought leadership from Substack, Medium, or other channels onto its own domain."
image="/assets/live-site/img_0067.jpg"
/>
<section class="insights-shell">
<article class="note-card">
<h2>Publishing path</h2>
<p>
Future posts can be added as Markdown or MDX in <code>src/content/insights</code> with
typed frontmatter for title, description, publish date, modified date, tags, and optional
canonical URL.
</p>
</article>
<article class="note-card">
<h2>RSS support</h2>
<p>
RSS is available at <a href="/rss.xml">/rss.xml</a>. The feed is ready for future article
imports even though no public posts are published yet.
</p>
</article>
</section>
<ContactCta />
</BaseLayout>
+22
View File
@@ -0,0 +1,22 @@
import rss from "@astrojs/rss";
import { getCollection } from "astro:content";
import type { APIContext } from "astro";
import { site } from "@data/site";
export async function GET(context: APIContext) {
const posts = await getCollection("insights", ({ data }) => !data.draft);
return rss({
title: `${site.name} Insights`,
description:
"Articles, market notes, case studies, and announcements from BlueCap Strategies.",
site: context.site ?? "https://www.bluecapstrategies.com",
items: posts.map((post) => ({
title: post.data.title,
description: post.data.description,
pubDate: post.data.publishDate,
link: `/insights/${post.slug}/`,
categories: post.data.tags,
})),
});
}
+47
View File
@@ -0,0 +1,47 @@
---
import { getCollection } from "astro:content";
import BaseLayout from "@layouts/BaseLayout.astro";
import PageHero from "@components/PageHero.astro";
import CardGrid from "@components/CardGrid.astro";
import ContactCta from "@components/ContactCta.astro";
import { breadcrumbSchema, pageSchema } from "@utils/schema";
const services = (await getCollection("services")).sort((a, b) => a.data.order - b.data.order);
const description =
"BlueCap Strategies provides market intelligence, catalytic capital, partnership development, technology incubation, implementation, impact reporting, and policy advisory services.";
---
<BaseLayout
title="Services"
description={description}
pathname="/services/"
jsonLd={[
pageSchema({ title: "Services", description, pathname: "/services/" }),
breadcrumbSchema([
{ name: "Home", href: "/" },
{ name: "Services", href: "/services/" },
]),
]}
>
<PageHero
eyebrow="Services"
title="Advisory services for capital-ready water-sector initiatives"
lead="BlueCap Strategies helps clients identify opportunities, structure capital, build partnerships, implement projects, measure outcomes, and shape supportive policy."
image="/assets/live-site/img_0075.jpg"
imageAlt="Marine and freshwater resources viewed from above"
/>
<section class="section">
<CardGrid
heading="Our services"
items={services.map((service) => ({
title: service.data.title,
description: service.data.summary,
href: `/${service.slug}/`,
icon: service.data.icon,
}))}
label="Service pages"
/>
</section>
<ContactCta />
</BaseLayout>
+25
View File
@@ -0,0 +1,25 @@
---
import BaseLayout from "@layouts/BaseLayout.astro";
import { pageSchema } from "@utils/schema";
const description = "Thank you for contacting BlueCap Strategies.";
---
<BaseLayout
title="Thank You"
description={description}
pathname="/thank-you/"
jsonLd={[pageSchema({ title: "Thank You", description, pathname: "/thank-you/" })]}
>
<section class="insights-shell">
<article class="note-card">
<p class="eyebrow">Contact received</p>
<h1>Thank you</h1>
<p>
Your message has been submitted. BlueCap Strategies will review the inquiry and respond
through the appropriate contact path.
</p>
<a class="button" href="/">Return home</a>
</article>
</section>
</BaseLayout>
+718
View File
@@ -0,0 +1,718 @@
:root {
--navy: #123047;
--blue: #1e6d91;
--cyan: #3ca2bd;
--green: #4f7f65;
--ink: #18242d;
--muted: #5d6b75;
--line: #d9e2e7;
--wash: #f3f7f8;
--paper: #ffffff;
--accent: #c47f43;
--shadow: 0 18px 45px rgba(18, 48, 71, 0.12);
font-family:
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
* {
box-sizing: border-box;
}
html {
color: var(--ink);
background: var(--paper);
scroll-behavior: smooth;
}
body {
margin: 0;
font-size: 17px;
line-height: 1.65;
}
img {
display: block;
max-width: 100%;
height: auto;
}
a {
color: var(--blue);
}
a:hover {
color: var(--navy);
}
h1,
h2,
h3 {
margin: 0;
color: var(--navy);
line-height: 1.15;
letter-spacing: 0;
}
h1 {
max-width: 16ch;
font-size: 3.35rem;
}
h2 {
font-size: 2rem;
}
h3 {
font-size: 1.2rem;
}
p {
margin: 0;
}
.skip-link {
position: absolute;
left: 1rem;
top: 1rem;
z-index: 10;
transform: translateY(-150%);
background: var(--navy);
color: #fff;
padding: 0.7rem 1rem;
}
.skip-link:focus {
transform: translateY(0);
}
.site-header {
position: sticky;
top: 0;
z-index: 5;
background: rgba(255, 255, 255, 0.96);
border-bottom: 1px solid var(--line);
backdrop-filter: blur(12px);
}
.header-inner,
.footer-inner,
.section,
.page-hero,
.home-hero,
.contact-cta,
.detail-layout,
.insights-shell {
width: min(1180px, calc(100% - 40px));
margin-inline: auto;
}
.header-inner {
min-height: 82px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 2rem;
}
.brand img {
width: 190px;
}
.desktop-nav {
display: flex;
align-items: center;
gap: 1.3rem;
font-size: 0.95rem;
font-weight: 700;
}
.desktop-nav a,
.mobile-nav a {
color: var(--ink);
text-decoration: none;
}
.nav-cta,
.button,
.footer-cta {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 44px;
border-radius: 6px;
padding: 0.68rem 1rem;
background: var(--navy);
color: #fff !important;
text-decoration: none;
font-weight: 800;
}
.nav-menu {
position: relative;
padding-block: 1.2rem;
}
.nav-panel {
position: absolute;
right: -1rem;
top: 100%;
width: 340px;
display: none;
grid-template-columns: 1fr;
gap: 0.15rem;
padding: 0.7rem;
background: #fff;
border: 1px solid var(--line);
border-radius: 8px;
box-shadow: var(--shadow);
}
.nav-panel a {
padding: 0.5rem 0.65rem;
border-radius: 6px;
}
.nav-panel a:hover {
background: var(--wash);
}
.nav-menu:hover .nav-panel,
.nav-menu:focus-within .nav-panel {
display: grid;
}
.mobile-nav {
display: none;
}
.mobile-nav summary {
min-height: 44px;
padding: 0.5rem 0.8rem;
border: 1px solid var(--line);
border-radius: 6px;
font-weight: 800;
cursor: pointer;
}
.mobile-nav nav {
position: absolute;
left: 20px;
right: 20px;
top: 76px;
display: grid;
gap: 0.2rem;
padding: 1rem;
background: #fff;
border: 1px solid var(--line);
border-radius: 8px;
box-shadow: var(--shadow);
}
.mobile-nav a {
padding: 0.55rem;
border-radius: 6px;
}
.mobile-nav a:hover {
background: var(--wash);
}
.home-hero {
display: grid;
grid-template-columns: minmax(0, 1.08fr) minmax(320px, 0.92fr);
gap: 3rem;
align-items: center;
padding: 3.25rem 0 3rem;
}
.home-hero .hero-media {
position: relative;
}
.home-hero img,
.page-hero img {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
border-radius: 8px;
box-shadow: var(--shadow);
}
.hero-copy {
display: grid;
gap: 1.2rem;
}
.hero-copy p:not(.eyebrow) {
max-width: 68ch;
color: var(--muted);
font-size: 1.15rem;
}
.eyebrow {
color: var(--green);
font-size: 0.82rem;
font-weight: 900;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.hero-actions,
.cta-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 1rem;
}
.text-link {
font-weight: 800;
color: var(--blue);
text-decoration-thickness: 2px;
text-underline-offset: 4px;
}
.section {
padding: 4.5rem 0;
}
.section.alt {
width: 100%;
max-width: none;
background: var(--wash);
}
.section.alt > .section-inner {
width: min(1180px, calc(100% - 40px));
margin-inline: auto;
}
.section-header {
max-width: 760px;
display: grid;
gap: 0.7rem;
margin-bottom: 2rem;
}
.section-header p {
color: var(--muted);
}
.card-grid-heading {
margin-bottom: 1.5rem;
}
.card-icon {
width: 48px;
height: 48px;
object-fit: contain;
margin-bottom: 0.75rem;
}
.anchor-nav ul {
list-style: none;
margin: 0.75rem 0 0;
padding: 0;
display: grid;
gap: 0.5rem;
}
.anchor-nav a {
color: var(--muted);
text-decoration: none;
font-size: 0.95rem;
}
.anchor-nav a:hover {
color: var(--ink);
}
.three-grid,
.stats-grid,
.card-grid,
.focus-grid,
.outcome-grid {
display: grid;
gap: 1rem;
}
.three-grid {
grid-template-columns: repeat(3, 1fr);
}
.stats-grid {
grid-template-columns: repeat(4, 1fr);
}
.stat,
.link-card,
.focus-card,
.work-card,
.note-card {
background: #fff;
border: 1px solid var(--line);
border-radius: 8px;
padding: 1.25rem;
}
.work-card {
display: grid;
gap: 0.7rem;
}
.stat strong {
display: block;
color: var(--accent);
font-size: 1.8rem;
line-height: 1.1;
}
.card-grid,
.focus-grid {
grid-template-columns: repeat(2, 1fr);
}
.link-card,
.focus-card {
display: grid;
gap: 0.8rem;
}
.link-card h3 a,
.focus-card h3 a {
color: var(--navy);
text-decoration: none;
}
.link-card .card-action {
color: var(--blue);
font-weight: 800;
text-decoration-thickness: 2px;
text-underline-offset: 4px;
}
.media-band {
display: grid;
grid-template-columns: 0.9fr 1.1fr;
gap: 2rem;
align-items: center;
}
.media-band img {
border-radius: 8px;
box-shadow: var(--shadow);
}
.article-body img {
width: 100%;
height: auto;
border-radius: 8px;
box-shadow: var(--shadow);
margin: 0.5rem 0 1.5rem;
}
.page-hero {
display: grid;
grid-template-columns: 1.05fr 0.95fr;
gap: 3rem;
align-items: center;
padding: 3.5rem 0;
}
.detail-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 320px;
gap: 3rem;
padding: 0 0 4.5rem;
}
.article-body {
display: grid;
gap: 2rem;
}
.article-body section {
display: grid;
gap: 0.75rem;
}
.article-body p,
.article-body li {
color: var(--muted);
}
.sidebar {
align-self: start;
position: sticky;
top: 104px;
display: grid;
gap: 1rem;
}
.outcome-grid {
list-style: none;
padding: 0;
margin: 0;
}
.outcome-grid li {
padding: 0.75rem 0 0.75rem 1rem;
border-left: 3px solid var(--cyan);
background: var(--wash);
}
.contact-cta {
display: grid;
grid-template-columns: 1fr auto;
gap: 2rem;
align-items: center;
margin-block: 2rem 4.5rem;
padding: 2rem;
background: var(--navy);
color: #fff;
border-radius: 8px;
}
.contact-cta h2,
.contact-cta .eyebrow {
color: #fff;
}
.contact-cta p {
max-width: 720px;
color: rgba(255, 255, 255, 0.82);
}
.contact-cta .button {
background: #fff;
color: var(--navy) !important;
}
.contact-cta .text-link {
color: #fff;
}
.contact-layout {
display: grid;
grid-template-columns: 0.8fr 1.2fr;
gap: 2rem;
align-items: start;
}
.contact-panel,
.form-panel {
border: 1px solid var(--line);
border-radius: 8px;
padding: 1.5rem;
background: #fff;
}
.contact-panel {
display: grid;
gap: 1rem;
}
.contact-form {
display: grid;
gap: 1rem;
}
.field-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
label {
display: grid;
gap: 0.35rem;
color: var(--navy);
font-weight: 800;
}
input,
textarea {
width: 100%;
min-height: 46px;
border: 1px solid var(--line);
border-radius: 6px;
padding: 0.7rem 0.8rem;
font: inherit;
color: var(--ink);
background: #fff;
}
textarea {
min-height: 160px;
resize: vertical;
}
input:focus,
textarea:focus {
outline: 3px solid rgba(60, 162, 189, 0.25);
border-color: var(--cyan);
}
.form-note {
color: var(--muted);
font-size: 0.95rem;
}
.site-footer {
background: #10293d;
color: rgba(255, 255, 255, 0.78);
}
.footer-inner {
display: grid;
grid-template-columns: 1.25fr 0.7fr 1fr 0.85fr;
gap: 2rem;
padding: 3rem 0;
}
.footer-inner h2 {
margin-bottom: 0.7rem;
color: #fff;
font-size: 1rem;
}
.footer-inner a {
display: block;
margin: 0.35rem 0;
color: rgba(255, 255, 255, 0.9);
text-decoration: none;
}
.footer-brand {
display: grid;
gap: 1rem;
}
.footer-brand img {
width: 175px;
background: #fff;
border-radius: 6px;
padding: 0.4rem;
}
.footer-cta {
width: fit-content;
margin-top: 1rem !important;
background: var(--cyan);
}
.footer-bottom {
border-top: 1px solid rgba(255, 255, 255, 0.14);
padding: 1rem 20px;
text-align: center;
font-size: 0.92rem;
}
.insights-shell {
padding: 4rem 0;
display: grid;
gap: 2rem;
}
@media (max-width: 960px) {
h1 {
max-width: 16ch;
font-size: 3rem;
}
.desktop-nav {
display: none;
}
.mobile-nav {
display: block;
}
.home-hero,
.page-hero,
.media-band,
.detail-layout,
.contact-layout,
.contact-cta {
grid-template-columns: 1fr;
}
.contact-cta .cta-actions {
justify-self: start;
}
.three-grid,
.stats-grid,
.footer-inner {
grid-template-columns: repeat(2, 1fr);
}
.sidebar {
position: static;
}
}
@media (max-width: 640px) {
body {
font-size: 16px;
}
h1 {
max-width: none;
font-size: 2rem;
}
h2 {
font-size: 1.65rem;
}
.header-inner,
.footer-inner,
.section,
.page-hero,
.home-hero,
.contact-cta,
.detail-layout,
.insights-shell {
width: min(100% - 28px, 1180px);
}
.home-hero,
.page-hero {
padding: 1.8rem 0;
gap: 1.6rem;
}
.hero-copy {
gap: 0.9rem;
}
.hero-copy p:not(.eyebrow) {
font-size: 1.05rem;
}
.section {
padding: 3rem 0;
}
.section.alt > .section-inner {
width: min(100% - 28px, 1180px);
}
.three-grid,
.stats-grid,
.card-grid,
.focus-grid,
.field-grid,
.footer-inner {
grid-template-columns: 1fr;
}
.brand img {
width: 160px;
}
.contact-cta {
padding: 1.25rem;
}
}
+92
View File
@@ -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),
})),
};
}
+13
View File
@@ -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}`}`;
}