From 207882102ef0b29f11b35f397088967952b49d1d Mon Sep 17 00:00:00 2001 From: andresdjasso Date: Thu, 10 Sep 2026 15:01:32 -0700 Subject: [PATCH 1/2] feat(landing): add interactive Sim stack and refine public pages --- apps/docs/components/icons.tsx | 34 +- apps/sim/app/(landing)/careers/careers.tsx | 8 +- .../components/job-board/job-groups.tsx | 6 +- .../(landing)/comparisons/[provider]/page.tsx | 16 +- apps/sim/app/(landing)/comparisons/page.tsx | 16 +- .../content-author-loading.tsx | 2 +- .../content-author-page.tsx | 6 +- .../content-index-loading.tsx | 2 +- .../content-index-page/content-index-page.tsx | 7 +- .../content-post-loading.tsx | 8 +- .../content-post-page/content-post-page.tsx | 14 +- .../content-tags-page/content-tags-page.tsx | 19 +- .../(landing)/components/landing-layout.ts | 6 + .../navbar-auth-pill/navbar-auth-pill.tsx | 7 +- .../navbar-shell/navbar-shell.test.tsx | 44 +- .../components/navbar-shell/navbar-shell.tsx | 38 +- .../(landing)/components/navbar/navbar.tsx | 3 +- .../iso-marks/iso-integrate-illustration.tsx | 31 +- .../components/iso-marks/iso-mark-paths.ts | 21 + .../iso-marks/iso-monitor-illustration.tsx | 46 +- .../platform-suite/platform-suite.tsx | 1 + .../components/prose-page/constants.ts | 16 +- .../workspace-controls/workspace-controls.tsx | 38 +- .../components/shared/edge-fade/edge-fade.tsx | 2 + .../components/sim-stack/sim-stack.tsx | 66 +++ .../components/sim-stack/stack-artwork.tsx | 93 ++++ .../components/sim-stack/stack-content.ts | 51 +++ .../sim-stack/stack-description.tsx | 103 +++++ .../components/sim-stack/stack-engraving.ts | 178 ++++++++ .../components/sim-stack/stack-fallback.tsx | 254 +++++++++++ .../sim-stack/stack-hit-testing.test.ts | 59 +++ .../components/sim-stack/stack-hit-testing.ts | 47 ++ .../components/sim-stack/stack-intro.tsx | 91 ++++ .../components/sim-stack/stack-layout.ts | 23 + .../components/sim-stack/stack-motifs.ts | 102 +++++ .../components/sim-stack/stack-player.tsx | 74 +++ .../components/sim-stack/stack-scene.ts | 429 ++++++++++++++++++ .../components/sim-stack/stack-slab.ts | 199 ++++++++ .../sim-stack/stack-timeline.test.ts | 92 ++++ .../components/sim-stack/stack-timeline.ts | 51 +++ .../sim-stack/use-stack-scroll.test.tsx | 238 ++++++++++ .../components/sim-stack/use-stack-scroll.ts | 202 +++++++++ apps/sim/app/(landing)/contact/contact.tsx | 11 +- apps/sim/app/(landing)/demo/demo.tsx | 15 +- .../integrations/(shell)/[slug]/page.tsx | 7 +- .../(landing)/integrations/(shell)/page.tsx | 16 +- apps/sim/app/(landing)/landing.test.tsx | 8 +- apps/sim/app/(landing)/landing.tsx | 15 +- .../(shell)/[provider]/[model]/page.tsx | 16 +- .../models/(shell)/[provider]/page.tsx | 16 +- .../sim/app/(landing)/models/(shell)/page.tsx | 6 +- apps/sim/app/(landing)/pricing/pricing.tsx | 6 +- apps/sim/components/icons.tsx | 34 +- apps/sim/package.json | 8 +- bun.lock | 22 +- packages/emcn/src/icons/index.ts | 6 + packages/emcn/src/icons/model-marks.ts | 16 + 57 files changed, 2726 insertions(+), 219 deletions(-) create mode 100644 apps/sim/app/(landing)/components/platform-suite/components/iso-marks/iso-mark-paths.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/sim-stack.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-artwork.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-content.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-description.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-engraving.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-fallback.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-hit-testing.test.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-hit-testing.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-intro.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-layout.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-motifs.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-player.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-scene.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-slab.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-timeline.test.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/stack-timeline.ts create mode 100644 apps/sim/app/(landing)/components/sim-stack/use-stack-scroll.test.tsx create mode 100644 apps/sim/app/(landing)/components/sim-stack/use-stack-scroll.ts create mode 100644 packages/emcn/src/icons/model-marks.ts diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index 867a81af5c2..4811f88bd95 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -1,5 +1,6 @@ import type { SVGProps } from 'react' import { useId } from 'react' +import { CLAUDE_MARK_PATH, GEMINI_MARK_PATH, OPENAI_MARK_PATH, XAI_MARK_POLYGONS } from '@sim/emcn' export function EnrichmentIcon(props: SVGProps) { return ( @@ -1307,22 +1308,10 @@ export function xAIIcon(props: SVGProps) { {...props} > - - - - + + + + ) @@ -1772,10 +1761,7 @@ export function OpenAIIcon(props: SVGProps) { role='img' xmlns='http://www.w3.org/2000/svg' > - + ) } @@ -4032,7 +4018,7 @@ export const ClaudeIcon = (props: SVGProps) => ( xmlns='http://www.w3.org/2000/svg' > Claude - + ) @@ -4392,11 +4378,7 @@ export function GeminiIcon(props: SVGProps) { - + ) } diff --git a/apps/sim/app/(landing)/careers/careers.tsx b/apps/sim/app/(landing)/careers/careers.tsx index a9023f10f97..0d69f2b84f8 100644 --- a/apps/sim/app/(landing)/careers/careers.tsx +++ b/apps/sim/app/(landing)/careers/careers.tsx @@ -1,4 +1,5 @@ import { Suspense } from 'react' +import { cn } from '@sim/emcn' import type { SearchParams } from 'nuqs/server' import { getAshbyJobs } from '@/lib/ashby/jobs' import { @@ -9,6 +10,7 @@ import { JobGroups, } from '@/app/(landing)/careers/components/job-board' import { careersSearchParamsCache } from '@/app/(landing)/careers/search-params' +import { LANDING_TYPE } from '@/app/(landing)/components/landing-layout' interface CareersProps { searchParams: Promise @@ -45,7 +47,7 @@ export default async function Careers({ searchParams }: CareersProps) {

Careers at Sim, the open-source AI workspace where teams build, deploy, and manage AI @@ -56,11 +58,11 @@ export default async function Careers({ searchParams }: CareersProps) {

Help build Sim, the AI workspace for teams.

-

+

Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. We're a small, high-agency team shipping fast to thousands of builders. If you want to own real work and shape the workspace teams live in, we'd love to meet you. diff --git a/apps/sim/app/(landing)/careers/components/job-board/job-groups.tsx b/apps/sim/app/(landing)/careers/components/job-board/job-groups.tsx index dbce8d1b8c9..6cbf6a63a4b 100644 --- a/apps/sim/app/(landing)/careers/components/job-board/job-groups.tsx +++ b/apps/sim/app/(landing)/careers/components/job-board/job-groups.tsx @@ -84,11 +84,11 @@ function JobRow({ posting }: JobRowProps) { rel='noopener noreferrer' className={cn( '-mx-3 group flex items-center justify-between gap-6 rounded-lg border-[var(--border)]', - 'border-t px-3 py-5 transition-colors hover:bg-[var(--surface-hover)]' + 'border-t px-3 py-6 transition-colors hover:bg-[var(--surface-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--text-primary)] focus-visible:outline-offset-2 motion-reduce:transition-none' )} >

-

+

{posting.title}

@@ -107,7 +107,7 @@ function JobRow({ posting }: JobRowProps) { Apply - + ) diff --git a/apps/sim/app/(landing)/comparisons/[provider]/page.tsx b/apps/sim/app/(landing)/comparisons/[provider]/page.tsx index 9319e083533..7e3862fa010 100644 --- a/apps/sim/app/(landing)/comparisons/[provider]/page.tsx +++ b/apps/sim/app/(landing)/comparisons/[provider]/page.tsx @@ -21,7 +21,11 @@ import { import { BackLink } from '@/app/(landing)/components' import { JsonLd } from '@/app/(landing)/components/json-ld' import { LandingFAQ } from '@/app/(landing)/components/landing-faq' -import { LANDING_CONTENT_WIDTH, LANDING_GUTTER } from '@/app/(landing)/components/landing-layout' +import { + LANDING_CONTENT_WIDTH, + LANDING_GUTTER, + PUBLIC_PAGE_TYPE, +} from '@/app/(landing)/components/landing-layout' const baseUrl = SITE_URL @@ -164,7 +168,13 @@ export default async function ComparisonProviderPage({
-
+
@@ -172,7 +182,7 @@ export default async function ComparisonProviderPage({

Sim vs {competitor.name}

diff --git a/apps/sim/app/(landing)/comparisons/page.tsx b/apps/sim/app/(landing)/comparisons/page.tsx index b7b789a05b7..3ca92c0e65b 100644 --- a/apps/sim/app/(landing)/comparisons/page.tsx +++ b/apps/sim/app/(landing)/comparisons/page.tsx @@ -9,7 +9,11 @@ import { ALL_COMPETITORS, ensurePeriod, lowercaseFirst } from '@/app/(landing)/c import { ChevronArrow } from '@/app/(landing)/components/chevron-arrow' import { JsonLd } from '@/app/(landing)/components/json-ld' import { LandingFAQ } from '@/app/(landing)/components/landing-faq' -import { LANDING_CONTENT_WIDTH, LANDING_GUTTER } from '@/app/(landing)/components/landing-layout' +import { + LANDING_CONTENT_WIDTH, + LANDING_GUTTER, + PUBLIC_PAGE_TYPE, +} from '@/app/(landing)/components/landing-layout' const baseUrl = SITE_URL @@ -103,14 +107,20 @@ export default function ComparisonHubPage() {
-
+
{/* Invisible spacer matching the detail page's BackLink block height/margin, so the divider below lands at the same Y on both pages. */}