| "use client"; |
|
|
| import { Button } from "@midday/ui/button"; |
| import { Icons } from "@midday/ui/icons"; |
| import Image from "next/image"; |
| import Link from "next/link"; |
| import { useEffect, useMemo, useState } from "react"; |
| import { highlight } from "sugar-high"; |
| import { MaterialIcon } from "./homepage/icon-mapping"; |
|
|
| type SDKTab = "typescript" | "go" | "php"; |
| type PackageManager = "npm" | "bun" | "pnpm" | "yarn"; |
|
|
| function ScrambledText() { |
| const [tick, setTick] = useState(0); |
| const chars = "ABCDEF0123456789"; |
| const cols = 8; |
| const rows = 4; |
| const charCount = cols * rows; |
|
|
| |
| const charSeeds = useMemo( |
| () => Array.from({ length: charCount }, (_, i) => (i * 17 + 23) % 1000), |
| [charCount], |
| ); |
|
|
| useEffect(() => { |
| |
| let animationFrameId: number; |
| let lastUpdate = 0; |
| const updateInterval = 200; |
|
|
| const update = (timestamp: number) => { |
| if (timestamp - lastUpdate >= updateInterval) { |
| setTick((prev) => prev + 1); |
| lastUpdate = timestamp; |
| } |
| animationFrameId = requestAnimationFrame(update); |
| }; |
|
|
| animationFrameId = requestAnimationFrame(update); |
|
|
| return () => { |
| cancelAnimationFrame(animationFrameId); |
| }; |
| }, []); |
|
|
| |
| const scrambledChars = useMemo(() => { |
| return Array.from({ length: charCount }, (_, i) => { |
| |
| const charTick = Math.floor(tick / (1 + (charSeeds[i] % 3))); |
| const charIndex = (i * 7 + charTick * 11 + charSeeds[i]) % chars.length; |
| return chars[charIndex]; |
| }); |
| }, [tick, charCount, charSeeds, chars]); |
|
|
| return ( |
| <div className="mb-8 relative"> |
| <div |
| className="grid grid-cols-8 gap-y-2 sm:gap-y-3 max-w-xs mx-auto relative" |
| style={{ columnGap: 0 }} |
| > |
| {/* Gradient fade masks */} |
| <div className="absolute inset-y-0 left-0 w-12 bg-gradient-to-r from-background to-transparent z-10 pointer-events-none" /> |
| <div className="absolute inset-y-0 right-0 w-12 bg-gradient-to-l from-background to-transparent z-10 pointer-events-none" /> |
| {scrambledChars.map((char, i) => ( |
| <span |
| key={`char-${i.toString()}`} |
| className="font-mono text-sm sm:text-base text-muted-foreground opacity-60 group-hover:opacity-80 transition-opacity duration-300 text-center" |
| > |
| {char} |
| </span> |
| ))} |
| </div> |
| </div> |
| ); |
| } |
|
|
| function CodeBlock({ code }: { code: string; language?: string }) { |
| const [copied, setCopied] = useState(false); |
|
|
| const handleCopy = async () => { |
| try { |
| await navigator.clipboard.writeText(code); |
| setCopied(true); |
| setTimeout(() => setCopied(false), 2000); |
| } catch (err) { |
| console.error("Failed to copy:", err); |
| } |
| }; |
|
|
| const codeHTML = highlight(code); |
|
|
| return ( |
| <div className="relative group"> |
| <div className="bg-[#fafafa] dark:bg-[#0c0c0c] border border-border rounded-none overflow-hidden"> |
| <pre className="overflow-x-auto p-4 text-sm font-mono"> |
| <code dangerouslySetInnerHTML={{ __html: codeHTML }} /> |
| </pre> |
| </div> |
| <button |
| type="button" |
| onClick={handleCopy} |
| className="absolute top-3 right-3 p-1.5 bg-background/80 backdrop-blur-sm border border-border text-muted-foreground hover:text-foreground hover:bg-background transition-colors opacity-0 group-hover:opacity-100 rounded-none" |
| aria-label="Copy code" |
| > |
| {copied ? ( |
| <Icons.Check size={14} className="text-foreground" /> |
| ) : ( |
| <Icons.Copy size={14} /> |
| )} |
| </button> |
| </div> |
| ); |
| } |
|
|
| function InstallTabs({ packageName }: { packageName: string }) { |
| const [activeManager, setActiveManager] = useState<PackageManager>("npm"); |
| const [copied, setCopied] = useState(false); |
|
|
| const commands: Record<PackageManager, string> = { |
| npm: `npm install ${packageName}`, |
| bun: `bun add ${packageName}`, |
| pnpm: `pnpm add ${packageName}`, |
| yarn: `yarn add ${packageName}`, |
| }; |
|
|
| const handleCopy = async () => { |
| try { |
| await navigator.clipboard.writeText(commands[activeManager]); |
| setCopied(true); |
| setTimeout(() => setCopied(false), 2000); |
| } catch (err) { |
| console.error("Failed to copy:", err); |
| } |
| }; |
|
|
| const codeHTML = highlight(commands[activeManager]); |
|
|
| return ( |
| <div className="relative group"> |
| <div className="bg-[#fafafa] dark:bg-[#0c0c0c] border border-border rounded-none overflow-hidden"> |
| <div className="flex border-b border-border"> |
| {(["npm", "bun", "pnpm", "yarn"] as PackageManager[]).map((pm) => ( |
| <button |
| key={pm} |
| type="button" |
| onClick={() => setActiveManager(pm)} |
| className={`px-4 py-2 text-xs font-sans transition-colors ${ |
| activeManager === pm |
| ? "text-foreground bg-background" |
| : "text-muted-foreground hover:text-foreground" |
| }`} |
| > |
| {pm} |
| </button> |
| ))} |
| </div> |
| <pre className="overflow-x-auto p-4 text-sm font-mono"> |
| <code dangerouslySetInnerHTML={{ __html: codeHTML }} /> |
| </pre> |
| </div> |
| <button |
| type="button" |
| onClick={handleCopy} |
| className="absolute top-3 right-3 p-1.5 bg-background/80 backdrop-blur-sm border border-border text-muted-foreground hover:text-foreground hover:bg-background transition-colors opacity-0 group-hover:opacity-100 rounded-none" |
| aria-label="Copy code" |
| > |
| {copied ? ( |
| <Icons.Check size={14} className="text-foreground" /> |
| ) : ( |
| <Icons.Copy size={14} /> |
| )} |
| </button> |
| </div> |
| ); |
| } |
|
|
| export function SDKs() { |
| const [activeTab, setActiveTab] = useState<SDKTab>("typescript"); |
|
|
| const handleLogoClick = (sdk: SDKTab) => { |
| setActiveTab(sdk); |
| const tabsSection = document.getElementById("sdk-tabs"); |
| if (tabsSection) { |
| tabsSection.scrollIntoView({ behavior: "smooth", block: "start" }); |
| } |
| }; |
|
|
| const sdkRepos: Record<SDKTab, string> = { |
| typescript: "https://github.com/midday-ai/midday-ts", |
| go: "https://github.com/midday-ai/midday-go", |
| php: "https://github.com/midday-ai/midday-php", |
| }; |
|
|
| return ( |
| <div className="min-h-screen bg-background"> |
| {/* Hero Section */} |
| <div className="bg-background relative overflow-visible lg:min-h-screen lg:overflow-hidden"> |
| {/* Grid Pattern Background - Desktop Only */} |
| <div className="hidden lg:flex absolute inset-0 items-center justify-center pointer-events-none z-0"> |
| <Image |
| src="/images/grid-light.svg" |
| alt="Grid Pattern" |
| width={1728} |
| height={1080} |
| className="w-[1728px] h-screen object-cover opacity-100 dark:opacity-[12%] dark:hidden" |
| loading="lazy" |
| /> |
| <Image |
| src="/images/grid-dark.svg" |
| alt="Grid Pattern" |
| width={1728} |
| height={1080} |
| className="w-[1728px] h-screen object-cover opacity-[12%] hidden dark:block" |
| loading="lazy" |
| /> |
| </div> |
| |
| {/* Mobile Layout */} |
| <div className="lg:hidden flex flex-col relative pt-32 pb-16 sm:pt-40 sm:pb-20 md:pt-48 overflow-hidden"> |
| {/* Grid Pattern Background - Mobile/Tablet Only (Limited Height) */} |
| <div |
| className="absolute top-0 left-0 right-0 flex items-center justify-center pointer-events-none z-0" |
| style={{ height: "600px" }} |
| > |
| <Image |
| src="/images/grid-light.svg" |
| alt="Grid Pattern" |
| width={1728} |
| height={1080} |
| className="w-full h-[600px] object-cover opacity-100 dark:opacity-[12%] dark:hidden" |
| loading="lazy" |
| /> |
| <Image |
| src="/images/grid-dark.svg" |
| alt="Grid Pattern" |
| width={1728} |
| height={1080} |
| className="w-full h-[600px] object-cover opacity-[12%] hidden dark:block" |
| loading="lazy" |
| /> |
| </div> |
| <div className="flex flex-col justify-start items-center z-20 px-4 sm:px-6"> |
| {/* SDK Logos */} |
| <div className="flex justify-center w-full relative gap-4 sm:gap-6 mb-12 sm:mb-16 md:mb-20"> |
| <button |
| type="button" |
| onClick={() => handleLogoClick("typescript")} |
| className="border border-border bg-background p-4 sm:p-6 flex items-center justify-center rounded-none cursor-pointer hover:border-foreground/20 hover:scale-[1.02] transition-all duration-200" |
| > |
| <Image |
| src="/images/typescript.png" |
| alt="TypeScript" |
| width={64} |
| height={64} |
| className="w-12 h-12 sm:w-16 sm:h-16 object-contain" |
| priority |
| /> |
| </button> |
| <button |
| type="button" |
| onClick={() => handleLogoClick("go")} |
| className="border border-border bg-background p-4 sm:p-6 flex items-center justify-center rounded-none cursor-pointer hover:border-foreground/20 hover:scale-[1.02] transition-all duration-200" |
| > |
| <Image |
| src="/images/go.png" |
| alt="Go" |
| width={64} |
| height={64} |
| className="w-12 h-12 sm:w-16 sm:h-16 object-contain" |
| priority |
| /> |
| </button> |
| <button |
| type="button" |
| onClick={() => handleLogoClick("php")} |
| className="border border-border bg-background p-4 sm:p-6 flex items-center justify-center rounded-none cursor-pointer hover:border-foreground/20 hover:scale-[1.02] transition-all duration-200" |
| > |
| <Image |
| src="/images/php.png" |
| alt="PHP" |
| width={64} |
| height={64} |
| className="w-12 h-12 sm:w-16 sm:h-16 object-contain" |
| priority |
| /> |
| </button> |
| </div> |
| |
| {/* Title and Description */} |
| <div className="space-y-4 text-center max-w-xl w-full"> |
| <h1 className="font-serif text-3xl sm:text-4xl md:text-5xl leading-tight text-foreground"> |
| Build with Midday |
| </h1> |
| <p className="text-muted-foreground text-base leading-normal font-sans text-center mx-auto"> |
| Use Midday's SDKs to integrate financial data, insights, and |
| workflows into your product with just a few lines of code. |
| </p> |
| </div> |
| |
| {/* CTA Buttons */} |
| <div className="flex flex-col sm:flex-row gap-4 sm:gap-6 w-full max-w-md mx-auto justify-center sm:justify-center mt-8"> |
| <Button |
| asChild |
| className="w-full sm:w-auto h-11 px-6 text-sm font-sans" |
| > |
| <Link href="https://app.midday.ai">Get started</Link> |
| </Button> |
| <Button |
| asChild |
| variant="outline" |
| className="w-full sm:w-auto h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <Link href="https://api.midday.ai">API documentation</Link> |
| </Button> |
| </div> |
| </div> |
| </div> |
| |
| {/* Desktop Layout */} |
| <div className="hidden lg:flex flex-col min-h-screen relative pt-40 overflow-hidden"> |
| <div className="flex-1 flex flex-col justify-center items-center z-20 px-4 pb-32"> |
| {/* SDK Logos - Centered */} |
| <div className="flex justify-center w-full relative gap-8 xl:gap-10 mb-16 xl:mb-20 2xl:mb-24"> |
| <button |
| type="button" |
| onClick={() => handleLogoClick("typescript")} |
| className="border border-border bg-background p-5 xl:p-7 2xl:p-8 flex items-center justify-center rounded-none cursor-pointer hover:border-foreground/20 hover:scale-[1.02] transition-all duration-200" |
| > |
| <Image |
| src="/images/typescript.png" |
| alt="TypeScript" |
| width={80} |
| height={80} |
| className="w-14 h-14 xl:w-24 xl:h-24 2xl:w-24 2xl:h-24 object-contain" |
| priority |
| /> |
| </button> |
| <button |
| type="button" |
| onClick={() => handleLogoClick("go")} |
| className="border border-border bg-background p-5 xl:p-7 2xl:p-8 flex items-center justify-center rounded-none cursor-pointer hover:border-foreground/20 hover:scale-[1.02] transition-all duration-200" |
| > |
| <Image |
| src="/images/go.png" |
| alt="Go" |
| width={80} |
| height={80} |
| className="w-14 h-14 xl:w-24 xl:h-24 2xl:w-24 2xl:h-24 object-contain" |
| priority |
| /> |
| </button> |
| <button |
| type="button" |
| onClick={() => handleLogoClick("php")} |
| className="border border-border bg-background p-5 xl:p-7 2xl:p-8 flex items-center justify-center rounded-none cursor-pointer hover:border-foreground/20 hover:scale-[1.02] transition-all duration-200" |
| > |
| <Image |
| src="/images/php.png" |
| alt="PHP" |
| width={80} |
| height={80} |
| className="w-14 h-14 xl:w-24 xl:h-24 2xl:w-24 2xl:h-24 object-contain" |
| priority |
| /> |
| </button> |
| </div> |
| |
| {/* Title and Description */} |
| <div className="text-center space-y-4 w-full"> |
| <h1 className="font-serif text-6xl xl:text-7xl 2xl:text-8xl leading-tight text-foreground"> |
| Build with Midday |
| </h1> |
| <p className="text-muted-foreground text-sm xl:text-base leading-normal max-w-xl mx-auto font-sans text-center"> |
| Use Midday's SDKs to integrate financial data, insights, and |
| workflows into your product with just a few lines of code. |
| </p> |
| </div> |
| |
| {/* CTA Buttons */} |
| <div className="flex gap-6 justify-center mt-8"> |
| <Button asChild className="h-11 px-6 text-sm font-sans"> |
| <Link href="https://app.midday.ai">Get started</Link> |
| </Button> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <Link href="https://api.midday.ai">API documentation</Link> |
| </Button> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| {/* SDK Tabs Section */} |
| <section id="sdk-tabs" className="bg-background py-12 sm:py-16 lg:py-20"> |
| <div className="max-w-[1400px] mx-auto"> |
| {/* Tabs */} |
| <div className="mb-12"> |
| <div className="flex flex-wrap justify-center gap-2 border-b border-border"> |
| <button |
| type="button" |
| onClick={() => setActiveTab("typescript")} |
| className={`px-4 py-2 text-sm font-sans transition-colors relative ${ |
| activeTab === "typescript" |
| ? "text-foreground" |
| : "text-muted-foreground hover:text-foreground" |
| }`} |
| > |
| TypeScript |
| {activeTab === "typescript" && ( |
| <div className="absolute bottom-0 left-0 right-0 h-[2px] bg-foreground -mb-[2px]" /> |
| )} |
| </button> |
| <button |
| type="button" |
| onClick={() => setActiveTab("go")} |
| className={`px-4 py-2 text-sm font-sans transition-colors relative ${ |
| activeTab === "go" |
| ? "text-foreground" |
| : "text-muted-foreground hover:text-foreground" |
| }`} |
| > |
| Go |
| {activeTab === "go" && ( |
| <div className="absolute bottom-0 left-0 right-0 h-[2px] bg-foreground -mb-[2px]" /> |
| )} |
| </button> |
| <button |
| type="button" |
| onClick={() => setActiveTab("php")} |
| className={`px-4 py-2 text-sm font-sans transition-colors relative ${ |
| activeTab === "php" |
| ? "text-foreground" |
| : "text-muted-foreground hover:text-foreground" |
| }`} |
| > |
| PHP |
| {activeTab === "php" && ( |
| <div className="absolute bottom-0 left-0 right-0 h-[2px] bg-foreground -mb-[2px]" /> |
| )} |
| </button> |
| </div> |
| </div> |
| |
| {/* TypeScript SDK Content */} |
| {activeTab === "typescript" && ( |
| <div className="max-w-4xl mx-auto space-y-8"> |
| <div className="text-center space-y-4"> |
| <h3 className="font-serif text-2xl sm:text-2xl text-foreground"> |
| TypeScript SDK |
| </h3> |
| <p className="font-sans text-base text-muted-foreground leading-normal max-w-2xl mx-auto"> |
| A fully typed SDK for interacting with Midday's APIs, designed |
| for modern web and backend applications. |
| </p> |
| </div> |
| |
| <div className="space-y-4"> |
| <div className="space-y-2"> |
| <p className="font-sans text-sm text-foreground"> |
| Key features: |
| </p> |
| <ul className="list-disc list-inside space-y-1 font-sans text-sm text-muted-foreground"> |
| <li>Fully typed with first-class TypeScript support</li> |
| <li>Works in Node, Bun, and modern runtimes</li> |
| <li>Simple setup and predictable responses</li> |
| </ul> |
| </div> |
| |
| <div className="space-y-4"> |
| <div> |
| <p className="font-sans text-sm text-foreground mb-2"> |
| Install: |
| </p> |
| <InstallTabs packageName="@midday-ai/sdk" /> |
| </div> |
| |
| <div> |
| <p className="font-sans text-sm text-foreground mb-2"> |
| Example: |
| </p> |
| <CodeBlock |
| code={`import { Midday } from "@midday-ai/sdk"; |
| |
| const midday = new Midday({ |
| security: { |
| oauth2: process.env["MIDDAY_OAUTH2"] ?? "", |
| }, |
| }); |
| |
| async function run() { |
| const result = await midday.oAuth.getOAuthAuthorization({ |
| responseType: "code", |
| clientId: "mid_client_abcdef123456789", |
| redirectUri: "https://myapp.com/callback", |
| scope: "transactions.read invoices.read", |
| state: "abc123xyz789_secure-random-state-value-with-sufficient-entropy", |
| codeChallenge: "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", |
| }); |
| |
| console.log(result); |
| } |
| |
| run();`} |
| language="typescript" |
| /> |
| </div> |
| </div> |
| |
| <div className="flex flex-col sm:flex-row gap-4 pt-4"> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <a href="https://github.com/midday-ai/midday-ts"> |
| View TypeScript docs |
| </a> |
| </Button> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <a href="https://github.com/midday-ai/midday-ts"> |
| See examples |
| </a> |
| </Button> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* Go SDK Content */} |
| {activeTab === "go" && ( |
| <div className="max-w-4xl mx-auto space-y-8"> |
| <div className="text-center space-y-4"> |
| <h3 className="font-serif text-2xl sm:text-2xl text-foreground"> |
| Go SDK |
| </h3> |
| <p className="font-sans text-base text-muted-foreground leading-normal max-w-2xl mx-auto"> |
| A lightweight Go SDK for building server-side applications |
| with Midday's APIs. |
| </p> |
| </div> |
| |
| <div className="space-y-4"> |
| <div> |
| <p className="font-sans text-sm text-foreground mb-2"> |
| Install: |
| </p> |
| <CodeBlock |
| code="go get github.com/midday-ai/midday-go" |
| language="bash" |
| /> |
| </div> |
| |
| <div> |
| <p className="font-sans text-sm text-foreground mb-2"> |
| Example: |
| </p> |
| <CodeBlock |
| code={`package main |
| |
| import ( |
| "context" |
| middaygo "github.com/midday-ai/midday-go" |
| "github.com/midday-ai/midday-go/models/operations" |
| "log" |
| ) |
| |
| func main() { |
| ctx := context.Background() |
| |
| s := middaygo.New( |
| middaygo.WithSecurity("MIDDAY_API_KEY"), |
| ) |
| |
| res, err := s.Transactions.List(ctx, operations.ListTransactionsRequest{ |
| PageSize: middaygo.Float64(50), |
| }) |
| if err != nil { |
| log.Fatal(err) |
| } |
| if res.Object != nil { |
| // handle response |
| } |
| }`} |
| language="go" |
| /> |
| </div> |
| |
| <div className="flex flex-col sm:flex-row gap-4 pt-4"> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <a href="https://github.com/midday-ai/midday-go"> |
| View Go docs |
| </a> |
| </Button> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <a href="https://github.com/midday-ai/midday-go"> |
| See examples |
| </a> |
| </Button> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* PHP SDK Content */} |
| {activeTab === "php" && ( |
| <div className="max-w-4xl mx-auto space-y-8"> |
| <div className="text-center space-y-4"> |
| <h3 className="font-serif text-2xl sm:text-2xl text-foreground"> |
| PHP SDK |
| </h3> |
| <p className="font-sans text-base text-muted-foreground leading-normal max-w-2xl mx-auto"> |
| A PHP SDK for integrating Midday's APIs into your PHP |
| applications. |
| </p> |
| </div> |
| |
| <div className="space-y-4"> |
| <div> |
| <p className="font-sans text-sm text-foreground mb-2"> |
| Install: |
| </p> |
| <CodeBlock |
| code="composer require midday-ai/midday-php" |
| language="bash" |
| /> |
| </div> |
| |
| <div> |
| <p className="font-sans text-sm text-foreground mb-2"> |
| Example: |
| </p> |
| <CodeBlock |
| code={`<?php |
| |
| declare(strict_types=1); |
| |
| require 'vendor/autoload.php'; |
| |
| use MiddayMidday; |
| use MiddayMiddayModelsOperations; |
| |
| $sdk = MiddayMidday::builder() |
| ->setSecurity('MIDDAY_API_KEY') |
| ->build(); |
| |
| $request = new OperationsListTransactionsRequest( |
| pageSize: 50, |
| ); |
| |
| $response = $sdk->transactions->list( |
| request: $request |
| ); |
| |
| if ($response->object !== null) { |
| // handle response |
| }`} |
| language="php" |
| /> |
| </div> |
| |
| <div className="flex flex-col sm:flex-row gap-4 pt-4"> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <a href="https://github.com/midday-ai/midday-php"> |
| View PHP docs |
| </a> |
| </Button> |
| <Button |
| asChild |
| variant="outline" |
| className="h-11 px-6 text-sm font-sans bg-background border-border hover:bg-accent" |
| > |
| <a href="https://github.com/midday-ai/midday-php"> |
| See examples |
| </a> |
| </Button> |
| </div> |
| </div> |
| </div> |
| )} |
| </div> |
| </section> |
| |
| {/* Divider */} |
| <div className="max-w-[1400px] mx-auto"> |
| <div className="h-px w-full border-t border-border" /> |
| </div> |
| |
| {/* What You Can Build Section */} |
| <section className="bg-background py-12 sm:py-16 lg:py-24"> |
| <div className="max-w-[1400px] mx-auto"> |
| <div className="text-center space-y-4 mb-12"> |
| <h2 className="font-serif text-2xl sm:text-2xl text-foreground"> |
| Build real financial workflows |
| </h2> |
| <p className="hidden sm:block font-sans text-base text-muted-foreground leading-normal max-w-2xl mx-auto"> |
| Use Midday SDKs to integrate financial data, insights, and |
| workflows into your product. |
| </p> |
| </div> |
| |
| <div className="max-w-2xl mx-auto"> |
| <div className="bg-secondary border border-border p-6 relative"> |
| <div className="space-y-6"> |
| <div className="flex items-center gap-3"> |
| <div className="w-5 h-5 bg-secondary border border-border flex items-center justify-center flex-shrink-0"> |
| <MaterialIcon |
| name="check" |
| className="text-foreground" |
| size={14} |
| /> |
| </div> |
| <span className="font-sans text-sm text-foreground"> |
| <span className="sm:hidden"> |
| Sync and analyze transactions |
| </span> |
| <span className="hidden sm:inline"> |
| Sync and analyze transactions programmatically and build |
| custom analysis tools |
| </span> |
| </span> |
| </div> |
| |
| <div className="flex items-center gap-3"> |
| <div className="w-5 h-5 bg-secondary border border-border flex items-center justify-center flex-shrink-0"> |
| <MaterialIcon |
| name="check" |
| className="text-foreground" |
| size={14} |
| /> |
| </div> |
| <span className="font-sans text-sm text-foreground"> |
| <span className="sm:hidden"> |
| Build dashboards and reports |
| </span> |
| <span className="hidden sm:inline"> |
| Build dashboards and reports tailored to your needs |
| </span> |
| </span> |
| </div> |
| |
| <div className="flex items-center gap-3"> |
| <div className="w-5 h-5 bg-secondary border border-border flex items-center justify-center flex-shrink-0"> |
| <MaterialIcon |
| name="check" |
| className="text-foreground" |
| size={14} |
| /> |
| </div> |
| <span className="font-sans text-sm text-foreground"> |
| Power internal tools with financial data and integrate into |
| existing workflows |
| </span> |
| </div> |
| |
| <div className="flex items-center gap-3"> |
| <div className="w-5 h-5 bg-secondary border border-border flex items-center justify-center flex-shrink-0"> |
| <MaterialIcon |
| name="check" |
| className="text-foreground" |
| size={14} |
| /> |
| </div> |
| <span className="font-sans text-sm text-foreground"> |
| <span className="sm:hidden"> |
| Automate accounting-ready exports |
| </span> |
| <span className="hidden sm:inline"> |
| Automate accounting-ready exports for your accounting |
| software |
| </span> |
| </span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
| |
| {/* Divider */} |
| <div className="max-w-[1400px] mx-auto"> |
| <div className="h-px w-full border-t border-border" /> |
| </div> |
| |
| {/* Security Section */} |
| <section className="bg-background py-12 sm:py-16 lg:py-20 group"> |
| <div className="max-w-[1400px] mx-auto"> |
| <div className="text-center space-y-4 max-w-2xl mx-auto"> |
| {/* Cryptographic Text */} |
| <ScrambledText /> |
| <h2 className="font-serif text-2xl sm:text-2xl text-foreground"> |
| Secure by default |
| </h2> |
| <p className="font-sans text-base text-muted-foreground leading-normal"> |
| All SDKs use secure API keys and scoped access to ensure your data |
| stays protected. |
| </p> |
| </div> |
| </div> |
| </section> |
| |
| {/* Divider */} |
| <div className="max-w-[1400px] mx-auto"> |
| <div className="h-px w-full border-t border-border" /> |
| </div> |
| |
| {/* Resources Section */} |
| <section className="bg-background py-12 sm:py-16 lg:py-20"> |
| <div className="max-w-[1400px] mx-auto"> |
| <div className="text-center space-y-8 max-w-3xl mx-auto"> |
| <h2 className="font-serif text-2xl sm:text-2xl text-foreground"> |
| Get up and running |
| </h2> |
| <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6"> |
| <Link |
| href={sdkRepos[activeTab]} |
| target="_blank" |
| rel="noopener noreferrer" |
| className="bg-secondary border border-border p-6 hover:border-foreground/20 transition-colors group flex flex-col items-center text-center" |
| > |
| <div className="mb-4 flex items-center justify-center"> |
| <MaterialIcon |
| name="timer" |
| className="text-muted-foreground group-hover:text-foreground transition-colors" |
| size={20} |
| /> |
| </div> |
| <h3 className="font-sans text-base text-foreground mb-2 group-hover:text-foreground"> |
| Quickstart |
| </h3> |
| <p className="font-sans text-sm text-muted-foreground"> |
| Get started with Midday SDKs in minutes. |
| </p> |
| </Link> |
| <Link |
| href={sdkRepos[activeTab]} |
| target="_blank" |
| rel="noopener noreferrer" |
| className="bg-secondary border border-border p-6 hover:border-foreground/20 transition-colors group flex flex-col items-center text-center" |
| > |
| <div className="mb-4 flex items-center justify-center"> |
| <MaterialIcon |
| name="description" |
| className="text-muted-foreground group-hover:text-foreground transition-colors" |
| size={20} |
| /> |
| </div> |
| <h3 className="font-sans text-base text-foreground mb-2 group-hover:text-foreground"> |
| Examples |
| </h3> |
| <p className="font-sans text-sm text-muted-foreground"> |
| See example apps and code snippets. |
| </p> |
| </Link> |
| <Link |
| href="https://api.midday.ai" |
| target="_blank" |
| rel="noopener noreferrer" |
| className="bg-secondary border border-border p-6 hover:border-foreground/20 transition-colors group flex flex-col items-center text-center" |
| > |
| <div className="mb-4 flex items-center justify-center"> |
| <MaterialIcon |
| name="link" |
| className="text-muted-foreground group-hover:text-foreground transition-colors" |
| size={20} |
| /> |
| </div> |
| <h3 className="font-sans text-base text-foreground mb-2 group-hover:text-foreground"> |
| API reference |
| </h3> |
| <p className="font-sans text-sm text-muted-foreground"> |
| Complete API documentation and endpoints. |
| </p> |
| </Link> |
| <Link |
| href="/updates" |
| className="bg-secondary border border-border p-6 hover:border-foreground/20 transition-colors group flex flex-col items-center text-center" |
| > |
| <div className="mb-4 flex items-center justify-center"> |
| <Icons.History |
| size={20} |
| className="text-muted-foreground group-hover:text-foreground transition-colors" |
| /> |
| </div> |
| <h3 className="font-sans text-base text-foreground mb-2 group-hover:text-foreground"> |
| Changelog |
| </h3> |
| <p className="font-sans text-sm text-muted-foreground"> |
| Stay updated with latest changes. |
| </p> |
| </Link> |
| </div> |
| </div> |
| </div> |
| </section> |
| </div> |
| ); |
| } |
|
|