Files
wehub-resource-sync d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

61 lines
2.7 KiB
TypeScript

import { PricingPlans } from '@/app/(landing)/pricing/components/pricing-plans'
import { PricingStructuredData } from '@/app/(landing)/pricing/components/pricing-structured-data'
/**
* sr-only product summary - an atomic citation target for AI answer engines that
* names Sim, the AI workspace, AI agents, and every plan tier.
*/
const GEO_SUMMARY =
'Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Pricing scales across four plans: Free to start, Pro for growing teams, Max for scaling businesses, and Enterprise for large organizations, each connecting 1,000+ integrations and every major LLM.'
/** Server-rendered heading slot handed to the {@link PricingPlans} client island. */
const PRICING_HEADING = (
<>
<h1
id='pricing-heading'
className='text-balance text-center text-[30px] text-[var(--text-primary)]'
>
Plans that scale with you
</h1>
<p className='sr-only'>{GEO_SUMMARY}</p>
</>
)
/**
* Public `/pricing` page - the same four plans as the in-app Upgrade page,
* rendered flat on the landing background for logged-out visitors (no workspace
* chrome: no back bar, no scroll-port panel, no surrounding container). Each plan
* is a self-contained card with the full comparison breakdown transposed into it
* - there is no separate comparison table and no show/hide toggle, so the four
* cards read as one spec sheet.
*
* Server-first by design. This component owns the page frame: the shared
* route-group layout provides the chrome (light tokens, navbar, footer); this
* page owns the `<main>` region, the `#pricing` section landmark, the shared
* landing gutter, the JSON-LD
* {@link PricingStructuredData}, and the `<h1>` + sr-only GEO summary. The lone
* `<h1>` and that summary are authored here, next to the page metadata, and
* handed into the {@link PricingPlans} island as a server-rendered `heading`
* slot - so the crawlable copy stays out of the client bundle while sitting in
* the same centered cluster as the billing toggle.
*
* The only client cost is {@link PricingPlans}, which owns the single `isAnnual`
* state shared by the toggle and every card's price. Prices, credits, features,
* and CTA labels derive from the shared upgrade plan constants, so the plans stay
* aligned with the in-app Upgrade page.
*/
export default function Pricing() {
return (
<main id='main-content'>
<PricingStructuredData />
<section
id='pricing'
aria-labelledby='pricing-heading'
className='mx-auto flex w-full max-w-[1460px] flex-col gap-7 px-20 pt-8 max-sm:px-5 max-lg:px-8'
>
<PricingPlans heading={PRICING_HEADING} />
</section>
</main>
)
}