feat: website improvements

pull/715/head
Travis Fischer 2025-06-18 18:21:45 +08:00
rodzic 2d51267943
commit 8f752139b4
8 zmienionych plików z 91 dodań i 52 usunięć

Wyświetl plik

@ -1,19 +1,20 @@
import { HeroButton } from '@/components/hero-button'
import { SupplySideCTA } from '@/components/supply-side-cta'
export default function IndexPage() {
return (
<>
<section>
<section className='gap-8'>
<h1 className='my-0! text-center text-balance leading-snug md:leading-none text-4xl font-extrabold'>
MCP tools that actually work
Your API Paid MCP, Instantly
</h1>
<h5 className='my-8! text-center text-balance text-lg'>
Deploy any MCP server or OpenAPI service to Agentic's MCP gateway, and
in minutes have a production-ready, monetizable MCP product.
<h5 className='text-center text-lg max-w-2xl'>
Run one command to turn any MCP server or OpenAPI service into a paid
MCP product,{' '}
<em>with built-in distribution to over 20k AI engineers</em>.
</h5>
<HeroButton>Get Started</HeroButton>
<SupplySideCTA />
</section>
<section className='flex-1'>

Wyświetl plik

@ -37,9 +37,14 @@ export const ActiveLink = React.forwardRef(function ActiveLink(
const [disabled, setDisabled] = React.useState(false)
React.useEffect(() => {
const linkPathname = new URL(href as string, location.href).pathname
const currentUrl = new URL(location.href)
const url = new URL(href as string, currentUrl)
const linkPathname = url.pathname
const linkOrigin = url.origin
setDisabled(compare(linkPathname, pathname))
setDisabled(
compare(linkPathname, pathname) && compare(linkOrigin, currentUrl.origin)
)
}, [pathname, href, compare])
const styleOverride = React.useMemo<React.CSSProperties>(

Wyświetl plik

@ -0,0 +1,19 @@
import Link from 'next/link'
import { HeroButton } from '@/components/hero-button'
import { Button } from '@/components/ui/button'
import { docsMarketplaceUrl } from '@/lib/config'
export function DemandSideCTA() {
return (
<div className='flex justify-center items-center gap-8'>
<HeroButton asChild className='h-full'>
<Link href='/marketplace'>MCP Marketplace</Link>
</HeroButton>
<Button variant='outline' asChild className='h-full'>
<Link href={docsMarketplaceUrl}>Check out the marketplace docs</Link>
</Button>
</div>
)
}

Wyświetl plik

@ -3,6 +3,7 @@
import { ActiveLink } from '@/components/active-link'
import { useAgentic } from '@/components/agentic-provider'
import { DarkModeToggle } from '@/components/dark-mode-toggle'
import { docsUrl } from '@/lib/config'
import styles from './styles.module.css'
@ -21,6 +22,10 @@ export function Header() {
Marketplace
</ActiveLink>
<ActiveLink href={docsUrl} className='link'>
Docs
</ActiveLink>
<ActiveLink href='/about' className='link'>
About
</ActiveLink>

Wyświetl plik

@ -1,56 +1,46 @@
import type * as React from 'react'
import type { Simplify } from 'type-fest'
import cs from 'clsx'
import Link from 'next/link'
import { Button } from '@/components/ui/button'
import { Button, type ButtonProps } from '@/components/ui/button'
import styles from './styles.module.css'
export type HeroButtonVariant = 'orange' | 'blue' | 'purple'
export type HeroButtonProps = Simplify<
{
heroVariant?: HeroButtonVariant
className?: string
buttonClassName?: string
} & ButtonProps
>
export function HeroButton({
variant = 'purple',
heroVariant = 'purple',
className,
buttonClassName,
children,
...buttonProps
}: {
variant?: HeroButtonVariant
className?: string
buttonClassName?: string
children: React.ReactNode
} & React.AnchorHTMLAttributes<HTMLAnchorElement>) {
}: HeroButtonProps) {
return (
<div className={cs(styles.heroButtonWrapper, className)}>
{variant === 'blue' && (
{heroVariant === 'blue' && (
<span className={cs(styles.heroButtonBg, styles.heroButtonBg1)} />
)}
{variant === 'purple' && (
{heroVariant === 'purple' && (
<span className={cs(styles.heroButtonBg, styles.heroButtonBg2)} />
)}
{variant === 'orange' && (
{heroVariant === 'orange' && (
<span className={cs(styles.heroButtonBg, styles.heroButtonBg3)} />
)}
{buttonProps.href ? (
<Link
className={cs(styles.heroButton, buttonClassName)}
href={buttonProps.href}
{...buttonProps}
>
<div className={styles.heroButtonContent}>{children}</div>
</Link>
) : (
<Button
className={cs(styles.heroButton, buttonClassName)}
{...(buttonProps as any)}
type='button'
>
<div className={styles.heroButtonContent}>{children}</div>
</Button>
)}
<Button
className={cs(styles.heroButton, buttonClassName)}
type='button'
{...(buttonProps as any)}
/>
</div>
)
}

Wyświetl plik

@ -1,6 +1,7 @@
.heroButtonWrapper {
position: relative;
z-index: 100;
max-width: 100%;
z-index: 99;
}
.heroButtonBg1 {
@ -53,7 +54,6 @@
}
.heroButton {
position: relative;
cursor: pointer;
background-color: var(--background);
@ -64,17 +64,15 @@
transition-property: color, background-color, box-shadow;
transition-duration: 0.15s;
transition-timing-function: ease;
padding: 12px 24px;
line-height: 1.5em;
padding: 20px 24px;
border-radius: 5px;
max-width: 100%;
font-weight: 400;
font-size: 1rem;
display: flex;
justify-content: center;
align-items: center;
user-select: none;
outline: none;
white-space: nowrap;
--lighten-color: hsla(0, 0%, 100%, 0.8);
background-image: linear-gradient(
@ -88,13 +86,6 @@
--lighten-color: rgba(0, 0, 0, 0.75);
}
.heroButtonContent {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
display: inline-block;
}
.heroButton:hover {
--lighten-color: transparent;
background-color: transparent;

Wyświetl plik

@ -0,0 +1,21 @@
import Link from 'next/link'
import { HeroButton } from '@/components/hero-button'
import { Button } from '@/components/ui/button'
import { calendarBookingUrl, docsQuickStartUrl } from '@/lib/config'
export function SupplySideCTA() {
return (
<div className='flex justify-center items-center gap-8'>
<HeroButton asChild className='h-full'>
<Link href={docsQuickStartUrl}>Get Started</Link>
</HeroButton>
<Button variant='outline' asChild className='h-full'>
<Link href={calendarBookingUrl} target='_blank' rel='noopener'>
Book a call with me 👋
</Link>
</Button>
</div>
)
}

Wyświetl plik

@ -15,6 +15,13 @@ export const twitterUrl = `https://x.com/${authorTwitterUsername}`
export const copyright = `© ${new Date().getFullYear()} Agentic. All rights reserved.`
export const githubUrl = 'https://github.com/transitive-bullshit/agentic'
// TODO: make an agentic-specific calendar for this
export const calendarBookingUrl =
'https://cal.com/travis-fischer/15min?overlayCalendar=true'
export const docsUrl = 'https://docs.agentic.so'
export const docsQuickStartUrl = `${docsUrl}/quick-start`
export const docsMarketplaceUrl = `${docsUrl}/marketplace`
export const keywords = [
'agentic',
'MCP',