diff --git a/public/images/illustrations/privacy-enhancing-tech.png b/public/images/illustrations/privacy-enhancing-tech.png new file mode 100644 index 0000000..34384b0 Binary files /dev/null and b/public/images/illustrations/privacy-enhancing-tech.png differ diff --git a/public/images/illustrations/secure.png b/public/images/illustrations/secure.png new file mode 100644 index 0000000..6926cbb Binary files /dev/null and b/public/images/illustrations/secure.png differ diff --git a/src/app/research/page.tsx b/src/app/research/page.tsx index b493bfc..d03b101 100644 --- a/src/app/research/page.tsx +++ b/src/app/research/page.tsx @@ -3,6 +3,34 @@ import Link from 'next/link'; import Image from 'next/image'; import type { ResearchPageContent } from '@/types/blocks'; +const CONTAINER = 'max-w-[1200px] mx-auto px-6 min-[860px]:px-10'; + +const EYEBROW = + 'inline-block font-accent font-semibold text-[13px] uppercase tracking-[0.14em] text-[#38B1DF]'; + +const MOTION = 'transition-all duration-[220ms] ease-[cubic-bezier(0.4,0,0.2,1)]'; + +const BTN_PRIMARY = + `inline-flex items-center justify-center gap-2 rounded-full border-2 px-[38px] py-[15px] text-[17px] font-bold leading-none active:scale-[0.97] bg-[#38B1DF] border-[#38B1DF] text-white hover:bg-[#1E97C8] hover:border-[#1E97C8] hover:shadow-[0_8px_24px_rgba(56,177,223,0.28)] ${MOTION}`; + +const H2 = + 'font-display font-bold text-[32px] min-[860px]:text-[44px] leading-[1.15] tracking-[-0.02em]'; + +const FOCUS_META: Record = { + 'Privacy-preserving technologies': { + illustration: '/images/illustrations/privacy-enhancing-tech.png', + eyebrow: 'Privacy', + }, + 'Safe, efficient cryptography in Rust': { + illustration: '/images/illustrations/secure.png', + eyebrow: 'Engineering', + }, + 'From paper to production': { + illustration: '/images/illustrations/standard-crypto.png', + eyebrow: 'Delivery', + }, +}; + export default function Research() { const { data } = getMarkdownData('pages', 'research.md'); const { hero, expertise, zkproof, ecosystems, darpa, closing } = data; @@ -10,71 +38,114 @@ export default function Research() { return ( <> {/* Hero */} -
-
-

- {hero.eyebrow} -

-

- {hero.title} -

-

- {hero.intro} -

+
+
- {/* Expertise */} + {/* Focus areas */}
-
-

- {expertise.title} -

-
- {expertise.items.map((item) => ( -
-

- {item.title} -

-

{item.description}

-
- ))} +
+
+ Focus areas +

{expertise.title}

+
+
+ {expertise.items.map((item) => { + const meta = FOCUS_META[item.title]; + return ( +
+ {meta && ( + + )} + {meta && {meta.eyebrow}} +

+ {item.title} +

+

+ {item.description} +

+
+ ); + })}
- {/* ZKProof */} -
-
-
-
-

+ {/* ZKProof spotlight */} +

+
{/* Ecosystems */} -
-
-

- {ecosystems.title} -

- {ecosystems.subtitle && ( -

- {ecosystems.subtitle} -

- )} -
+
+
+
+ Ecosystems +

{ecosystems.title}

+ {ecosystems.subtitle && ( +

+ {ecosystems.subtitle} +

+ )} +
+
{ecosystems.items.map((item) => (
-

+

{item.name}

-

{item.description}

+

+ {item.description} +

))}
@@ -113,36 +187,45 @@ export default function Research() { {/* DARPA */}
-
-
-

- {darpa.eyebrow} -

-

- {darpa.title} -

-

{darpa.description}

+
+
+
+ {darpa.eyebrow} +

{darpa.title}

+

+ {darpa.description} +

+
+
+ +
{/* Closing CTA */} -
-
-

- {closing.title} -

- {closing.subtitle && ( -

- {closing.subtitle} -

- )} - - {closing.ctaText} - +
+
+
+ Work with us +

+ {closing.title} +

+ {closing.subtitle && ( +

+ {closing.subtitle} +

+ )} + + {closing.ctaText} + +
@@ -168,4 +251,4 @@ export const metadata = { twitter: { card: 'summary_large_image', }, -}; \ No newline at end of file +}; diff --git a/src/app/services/[service]/page.tsx b/src/app/services/[service]/page.tsx index 2ea0358..1d2cbba 100644 --- a/src/app/services/[service]/page.tsx +++ b/src/app/services/[service]/page.tsx @@ -1,15 +1,55 @@ import Link from 'next/link'; +import Image from 'next/image'; import { notFound } from 'next/navigation'; import { getServiceSlugs, getServiceMeta, getServiceWorks, + getAllServices, } from '@/lib/services'; +import type { WorkType } from '@/types/blocks'; // Next 15 passes params as a Promise. On Next 14, change the type to // `{ service: string }` and drop the `await`. type Params = Promise<{ service: string }>; +const CONTAINER = 'max-w-[1200px] mx-auto px-6 min-[860px]:px-10'; + +const EYEBROW = + 'inline-block font-accent font-semibold text-[13px] uppercase tracking-[0.14em] text-[#38B1DF]'; + +const MOTION = 'transition-all duration-[220ms] ease-[cubic-bezier(0.4,0,0.2,1)]'; + +const BTN_PRIMARY = + `inline-flex items-center justify-center gap-2 rounded-full border-2 px-[38px] py-[15px] text-[17px] font-bold leading-none active:scale-[0.97] bg-[#38B1DF] border-[#38B1DF] text-white hover:bg-[#1E97C8] hover:border-[#1E97C8] hover:shadow-[0_8px_24px_rgba(56,177,223,0.28)] ${MOTION}`; + +const CARD = + `bg-white border border-[#DCE3E7] rounded-2xl hover:border-[#38B1DF] hover:-translate-y-[3px] hover:shadow-[0_4px_12px_rgba(9,5,58,0.08),0_2px_4px_rgba(9,5,58,0.05)] ${MOTION}`; + +const BADGE = + 'inline-flex items-center rounded-full px-[14px] py-[6px] text-[13px] font-semibold'; + +const BADGE_TONES: Partial> = { + Audit: 'bg-[#EAF9FF] text-[#1E97C8]', + Design: 'bg-[rgba(9,5,58,0.08)] text-[#09053A]', + Protocol: 'bg-[rgba(9,5,58,0.08)] text-[#09053A]', + Research: 'bg-[rgba(255,192,46,0.25)] text-[#1E252B]', +}; + +const BADGE_TONE_NEUTRAL = 'bg-[#EEF1F3] text-[#39434A]'; + +const SERVICE_EYEBROWS: Record = { + audits: 'Audits', + 'protocol-design': 'Engineering', + 'formal-verification': 'Assurance', +}; + +const SERVICE_ILLUSTRATIONS: Record = { + audits: '/images/illustrations/certified-secure.png', + 'protocol-design': '/images/illustrations/standard-crypto.png', + 'formal-verification': '/images/illustrations/secure.png', +}; + export const dynamicParams = false; export function generateStaticParams() { @@ -32,59 +72,129 @@ export default async function ServicePage({ params }: { params: Params }) { if (!meta) notFound(); const works = getServiceWorks(service); + const siblings = getAllServices(); + const illustration = + meta.illustration ?? SERVICE_ILLUSTRATIONS[service]; return ( <> - {/* Intro */} -
-
-

- Services -

-

- {meta.title} -

- {meta.tagline && ( -

- {meta.tagline} -

- )} - {meta.intro && ( -

{meta.intro}

- )} + {/* Hero */} +
+
- {/* Work list */} -
-
-

- Our work -

+ {/* Service sub-nav */} + + +
+
+ {/* Intro */} +
+
+ {SERVICE_EYEBROWS[service] && ( + + {SERVICE_EYEBROWS[service]} + + )} + {meta.intro && ( +

+ {meta.intro} +

+ )} + + Discuss an engagement + +
+ {illustration && ( +
+ +
+ )} +
+ + {/* Work grid */} +
+ Our work +
{works.length === 0 ? ( -

More information about our work in this area coming soon.

+
+ Our first formal-verification engagements are underway — write-ups + coming soon. +
) : ( -
+
{works.map((w) => ( {w.context && ( - + {w.context} )} -

+

{w.title}

{w.types && w.types.length > 0 && ( -
+
{w.types.map((t) => ( {t} @@ -92,8 +202,13 @@ export default async function ServicePage({ params }: { params: Params }) {
)} {w.summary && ( -

{w.summary}

+

+ {w.summary} +

)} + + Read more → + ))}
@@ -101,20 +216,24 @@ export default async function ServicePage({ params }: { params: Params }) {
- {/* CTA */} -
-
-

- Have a {meta.title.toLowerCase()} engagement in mind? -

- - Work with us - + {/* Closing CTA */} +
+
+
+ Work with us +

+ Have an engagement in mind? +

+

+ Talk to the team about a security audit, a protocol design, or a + formal-verification engagement. +

+ + Get in touch + +
); -} \ No newline at end of file +} diff --git a/src/content/services/audits/index.md b/src/content/services/audits/index.md index c4438d0..759be26 100644 --- a/src/content/services/audits/index.md +++ b/src/content/services/audits/index.md @@ -2,6 +2,7 @@ title: "Security Audits" tagline: "We find the bugs that matter in ZK circuits, proof systems, and cryptographic protocols, before they reach production." intro: "Our audits go deep into the cryptography itself, not just the surrounding code. We review circuit constraints, soundness and zero-knowledge properties, protocol design, and implementation, and we report findings teams can act on." +illustration: "/images/illustrations/certified-secure.png" order: 1 --- diff --git a/src/content/services/formal-verification/index.md b/src/content/services/formal-verification/index.md index 770d4af..1a8afba 100644 --- a/src/content/services/formal-verification/index.md +++ b/src/content/services/formal-verification/index.md @@ -2,5 +2,6 @@ title: "Formal Verification" tagline: "We prove cryptographic systems correct with machine-checked proofs in Lean. No critical edge case left to chance." intro: "Formal verification replaces 'we tested it' with 'we proved it.' We model protocols and circuits and produce machine-checked proofs of their core security properties." +illustration: "/images/illustrations/secure.png" order: 2 --- \ No newline at end of file diff --git a/src/content/services/protocol-design/index.md b/src/content/services/protocol-design/index.md index 1faf837..3ce5f95 100644 --- a/src/content/services/protocol-design/index.md +++ b/src/content/services/protocol-design/index.md @@ -2,5 +2,6 @@ title: "Protocol Design" tagline: "We design cryptographic protocols from specification to implementation." intro: "We created Zcash Shielded Assets and the ZSA swap protocol. We take protocols from first principles through specification, security analysis, and working implementation." +illustration: "/images/illustrations/standard-crypto.png" order: 3 --- \ No newline at end of file diff --git a/src/lib/services.ts b/src/lib/services.ts index 87153c6..b63f0b6 100644 --- a/src/lib/services.ts +++ b/src/lib/services.ts @@ -12,6 +12,7 @@ export interface ServiceMeta { title: string; tagline?: string; intro?: string; + illustration?: string; // path under /public, e.g. /images/illustrations/… order?: number; content: string; // markdown body (optional richer intro) } @@ -52,6 +53,7 @@ export function getServiceMeta(slug: string): ServiceMeta | null { title: data.title ?? slug, tagline: data.tagline, intro: data.intro, + illustration: data.illustration, order: data.order, content, }; diff --git a/src/types/blocks.ts b/src/types/blocks.ts index ad1f5e0..4970950 100644 --- a/src/types/blocks.ts +++ b/src/types/blocks.ts @@ -97,6 +97,7 @@ export interface CapabilitiesContent { export type WorkType = | 'Audit' | 'Design' + | 'Protocol' | 'Implementation' | 'Formal Verification' | 'Research';