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

95 lines
4.5 KiB
TypeScript

import { BuildCallout } from '@/app/(landing)/components/features/components/build-callout/build-callout'
import { FeatureCard } from '@/app/(landing)/components/features/components/feature-card'
import { IntegrationsCallout } from '@/app/(landing)/components/features/components/integrations-callout/integrations-callout'
import { KnowledgeCallout } from '@/app/(landing)/components/features/components/knowledge-callout/knowledge-callout'
import { LogsCallout } from '@/app/(landing)/components/features/components/logs-callout'
/**
* Landing features - how Sim works, as a platform lifecycle. Four beats, in the
* order you actually use Sim: bring your tools in (Integrate), give it data to
* reason over (Context), build the agent logic (Build), then watch it run
* (Monitor). Each beat is a Cursor-style {@link FeatureCard}: one large
* outlined card holding a media stage (backdrop painting + elevated real-UI
* callout) and a copy column, with the media side alternating card to card.
*
* The section's `<h2>` is `sr-only` - each beat carries its own visible `<h3>`,
* so the section heading exists only to anchor the heading hierarchy and give AI
* crawlers an atomic summary.
*
* Inter-section spacing is owned by the `<main>` flex `gap` in `landing.tsx`;
* this section carries no vertical padding. The section itself is FULL-WIDTH so
* its bottom rule can bleed to the browser edges; the card grid inside carries
* the shared gutter (`px-20`) and the `max-w-[1460px]` cap. The last card
* squares its bottom corners (`flushBottom`) and sits exactly on the rule, so
* its outline merges into the full-bleed divider.
*
* The cards stack in a single column at every width on a 112px rhythm
* (matching Cursor's spacing between feature cards). Below `lg` each card
* internally reflows media-over-copy.
*
* Per-beat icons are still abstract placeholders (text eyebrows); distinct
* abstract glyphs land in a later pass.
*/
export function Features() {
return (
<section id='features' aria-labelledby='features-heading' className='relative w-full'>
<h2 id='features-heading' className='sr-only'>
Integrate your tools, give Sim context, build agents, and monitor every run.
</h2>
<div className='mx-auto grid w-full max-w-[1460px] grid-cols-1 gap-28 px-20 max-sm:gap-12 max-sm:px-5 max-lg:px-8'>
{/* Integrate: bring your stack in. */}
<FeatureCard
eyebrow='Integrate'
title='Connect the tools your work runs on.'
description='Plug in 1,000+ integrations like Slack, HubSpot, Salesforce, and Notion, so Sim agents act across the stack you already use.'
href='/integrations'
linkLabel='Explore integrations'
backdropSrc='/landing/feature-integrate-backdrop.jpg'
>
<IntegrationsCallout />
</FeatureCard>
{/* Context: store data semantically. */}
<FeatureCard
eyebrow='Context'
title='Give Sim data it can reason over.'
description='Sim stores your data semantically in tables, files, and knowledge bases your agents read from to ground every answer in your own data.'
backdropSrc='/landing/feature-context-backdrop.jpg'
mediaSide='right'
>
<KnowledgeCallout />
</FeatureCard>
{/* Build: wire agent logic in the visual builder. */}
<FeatureCard
eyebrow='Build'
title='Build agents that solve real problems.'
description='Wire blocks, models, and integrations into agent logic on a visual builder, from one agent to many working in parallel.'
href='/workflows'
linkLabel='Explore the workflow builder'
>
<BuildCallout />
</FeatureCard>
{/* Monitor: watch every run. */}
<FeatureCard
eyebrow='Monitor'
title='Watch every run, end to end.'
description='Trace each run block by block, with full logs and the real cost, so you always know what ran and why.'
backdropSrc='/landing/feature-monitor-backdrop.jpg'
mediaSide='right'
flushBottom
>
<LogsCallout />
</FeatureCard>
</div>
{/* Full-bleed rule the last card's squared bottom edge merges into -
spans the whole browser, past the content cap and gutter (the section
itself is full-width; only the card grid above is capped). */}
<div aria-hidden='true' className='absolute inset-x-0 bottom-0 h-px bg-[var(--border)]' />
</section>
)
}