Skip to content

Commit c69351b

Browse files
committed
Merge latest staging into fix/invite-bug
Resolve mothership executor, upload-test mocks, and regenerate tool schemas from the copilot staging catalog.
2 parents fb7c758 + d165712 commit c69351b

92 files changed

Lines changed: 3232 additions & 769 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/docs/app/[lang]/[[...slug]]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ export async function generateMetadata(props: {
323323
{
324324
url: ogImageUrl,
325325
width: 1200,
326-
height: 630,
326+
height: 675,
327327
alt: data.title,
328328
},
329329
],

apps/docs/app/[lang]/layout.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import {
99
SidebarItem,
1010
SidebarSeparator,
1111
} from '@/components/docs-layout/sidebar-components'
12+
import { Footer } from '@/components/footer/footer'
1213
import { Navbar } from '@/components/navbar/navbar'
13-
import { SimLogoFull } from '@/components/ui/sim-logo'
14+
import { SimWordmark } from '@/components/ui/sim-logo'
1415
import { i18n } from '@/lib/i18n'
1516
import { serializeJsonLd } from '@/lib/json-ld'
1617
import { source } from '@/lib/source'
@@ -101,7 +102,7 @@ export default async function Layout({ children, params }: LayoutProps) {
101102
<DocsLayout
102103
tree={source.pageTree[lang]}
103104
nav={{
104-
title: <SimLogoFull className='h-[22px] w-auto' />,
105+
title: <SimWordmark className='h-[18px]' />,
105106
}}
106107
sidebar={{
107108
tabs: false,
@@ -121,6 +122,7 @@ export default async function Layout({ children, params }: LayoutProps) {
121122
>
122123
{children}
123124
</DocsLayout>
125+
<Footer />
124126
<AskAI locale={lang} />
125127
</RootProvider>
126128
</body>

apps/docs/app/api/og/route.tsx

Lines changed: 150 additions & 61 deletions
Large diffs are not rendered by default.

apps/docs/app/global.css

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,12 +296,20 @@ aside#nd-sidebar [data-radix-scroll-area-viewport] {
296296
min-height: var(--fd-docs-height) !important;
297297
}
298298

299-
/* Sidebar divider line — fixed to viewport, full height from navbar to bottom */
299+
/* Sidebar divider line — sticky within the docs layout box, so it ends where
300+
the layout does instead of bleeding into (or past) the footer below it.
301+
#nd-docs-layout is a CSS grid (see fumadocs' Container slot); a sticky
302+
pseudo-element stays in normal flow, so without an explicit grid-area it
303+
gets auto-placed into a real content cell and skews that cell's sizing.
304+
Spanning the full grid keeps it purely decorative/overlaid instead. */
300305
#nd-docs-layout::before {
301306
content: "";
302-
position: fixed;
307+
display: block;
308+
position: sticky;
309+
grid-row: 1 / -1;
310+
grid-column: 1 / -1;
303311
top: 92px; /* below navbar */
304-
bottom: 0;
312+
height: calc(100dvh - 92px);
305313
left: calc(var(--sidebar-offset) + var(--fd-sidebar-width));
306314
width: 1px;
307315
background-color: var(--surface-active);

apps/docs/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export const metadata = {
7272
{
7373
url: `${DOCS_BASE_URL}/api/og?title=Sim%20Documentation`,
7474
width: 1200,
75-
height: 630,
75+
height: 675,
7676
alt: 'Sim Documentation',
7777
},
7878
],
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import Link from 'next/link'
2+
import { SimWordmark } from '@/components/ui/sim-logo'
3+
import { SIM_SITE_URL } from '@/lib/urls'
4+
5+
/**
6+
* Docs footer - the same site link directory as the main app's landing
7+
* footer (`apps/sim/app/(landing)/components/footer`), ported here so both
8+
* apps share one consistent footer. Links that live on sim.ai are absolute
9+
* (docs.sim.ai is a different origin); links that live on docs.sim.ai itself
10+
* (Academy, API Reference, blocks, integrations guides, …) stay relative.
11+
*/
12+
13+
const LINK_CLASS =
14+
'text-sm text-[var(--text-muted)] transition-colors hover:text-[var(--text-primary)]'
15+
16+
interface FooterItem {
17+
label: string
18+
href: string
19+
external?: boolean
20+
}
21+
22+
const PRODUCT_LINKS: FooterItem[] = [
23+
{ label: 'Enterprise', href: `${SIM_SITE_URL}/enterprise`, external: true },
24+
{ label: 'Mothership', href: '/mothership' },
25+
{ label: 'Workflows', href: '/introduction' },
26+
{ label: 'Knowledge Base', href: '/knowledgebase' },
27+
{ label: 'Tables', href: '/tables' },
28+
{ label: 'MCP', href: '/agents/mcp' },
29+
{ label: 'API', href: '/api-reference/getting-started' },
30+
{ label: 'Self Hosting', href: '/platform/self-hosting' },
31+
{ label: 'Status', href: 'https://status.sim.ai', external: true },
32+
]
33+
34+
const RESOURCES_LINKS: FooterItem[] = [
35+
{ label: 'Blog', href: `${SIM_SITE_URL}/blog`, external: true },
36+
{ label: 'Academy', href: '/academy' },
37+
{ label: 'Compare', href: `${SIM_SITE_URL}/comparison`, external: true },
38+
{ label: 'Careers', href: `${SIM_SITE_URL}/careers`, external: true },
39+
{ label: 'Changelog', href: `${SIM_SITE_URL}/changelog`, external: true },
40+
{ label: 'Contact', href: `${SIM_SITE_URL}/contact`, external: true },
41+
]
42+
43+
/** Top model providers — mirrors the landing footer's top 8 catalog providers. */
44+
const MODEL_LINKS: FooterItem[] = [
45+
{ label: 'All Models', href: `${SIM_SITE_URL}/models`, external: true },
46+
{ label: 'OpenAI', href: `${SIM_SITE_URL}/models/openai`, external: true },
47+
{ label: 'Anthropic', href: `${SIM_SITE_URL}/models/anthropic`, external: true },
48+
{ label: 'Google', href: `${SIM_SITE_URL}/models/google`, external: true },
49+
{ label: 'DeepSeek', href: `${SIM_SITE_URL}/models/deepseek`, external: true },
50+
{ label: 'xAI', href: `${SIM_SITE_URL}/models/xai`, external: true },
51+
{ label: 'Cerebras', href: `${SIM_SITE_URL}/models/cerebras`, external: true },
52+
{ label: 'Groq', href: `${SIM_SITE_URL}/models/groq`, external: true },
53+
{ label: 'Sakana AI', href: `${SIM_SITE_URL}/models/sakana`, external: true },
54+
]
55+
56+
const BLOCK_LINKS: FooterItem[] = [
57+
{ label: 'Agent', href: '/workflows/blocks/agent' },
58+
{ label: 'Router', href: '/workflows/blocks/router' },
59+
{ label: 'Function', href: '/workflows/blocks/function' },
60+
{ label: 'Condition', href: '/workflows/blocks/condition' },
61+
{ label: 'API Block', href: '/workflows/blocks/api' },
62+
{ label: 'Workflow', href: '/workflows/blocks/workflow' },
63+
{ label: 'Parallel', href: '/workflows/blocks/parallel' },
64+
{ label: 'Guardrails', href: '/workflows/blocks/guardrails' },
65+
{ label: 'Evaluator', href: '/workflows/blocks/evaluator' },
66+
{ label: 'Loop', href: '/workflows/blocks/loop' },
67+
]
68+
69+
const INTEGRATION_LINKS: FooterItem[] = [
70+
{ label: 'All Integrations', href: `${SIM_SITE_URL}/integrations`, external: true },
71+
{ label: 'Slack', href: '/integrations/slack' },
72+
{ label: 'GitHub', href: '/integrations/github' },
73+
{ label: 'Gmail', href: '/integrations/gmail' },
74+
{ label: 'Notion', href: '/integrations/notion' },
75+
{ label: 'Salesforce', href: '/integrations/salesforce' },
76+
{ label: 'Jira', href: '/integrations/jira' },
77+
{ label: 'Linear', href: '/integrations/linear' },
78+
{ label: 'Supabase', href: '/integrations/supabase' },
79+
{ label: 'Stripe', href: '/integrations/stripe' },
80+
]
81+
82+
const SOCIAL_LINKS: FooterItem[] = [
83+
{ label: 'X (Twitter)', href: 'https://x.com/simdotai', external: true },
84+
{
85+
label: 'LinkedIn',
86+
href: 'https://www.linkedin.com/company/simstudioai/',
87+
external: true,
88+
},
89+
{ label: 'Discord', href: 'https://discord.gg/Hr4UWYEcTT', external: true },
90+
{
91+
label: 'GitHub',
92+
href: 'https://github.com/simstudioai/sim',
93+
external: true,
94+
},
95+
]
96+
97+
const LEGAL_LINKS: FooterItem[] = [
98+
{ label: 'Terms of Service', href: `${SIM_SITE_URL}/terms`, external: true },
99+
{ label: 'Privacy Policy', href: `${SIM_SITE_URL}/privacy`, external: true },
100+
]
101+
102+
function FooterColumn({ title, items }: { title: string; items: FooterItem[] }) {
103+
return (
104+
<div>
105+
<h3 className='mb-4 text-[var(--text-primary)] text-sm'>{title}</h3>
106+
<div className='flex flex-col gap-2.5'>
107+
{items.map(({ label, href, external }) =>
108+
external ? (
109+
<a
110+
key={label}
111+
href={href}
112+
target='_blank'
113+
rel='noopener noreferrer'
114+
className={LINK_CLASS}
115+
>
116+
{label}
117+
</a>
118+
) : (
119+
<Link key={label} href={href} className={LINK_CLASS}>
120+
{label}
121+
</Link>
122+
)
123+
)}
124+
</div>
125+
</div>
126+
)
127+
}
128+
129+
export function Footer() {
130+
return (
131+
<footer className='mt-[120px] w-full border-[var(--border)] border-t bg-[var(--bg)] max-sm:mt-16 max-lg:mt-[88px]'>
132+
<div className='mx-auto w-full max-w-[1460px] px-20 pt-16 pb-16 max-sm:px-5 max-lg:px-8 max-lg:pt-12 max-lg:pb-12'>
133+
<nav
134+
aria-label='Footer navigation'
135+
itemScope
136+
itemType='https://schema.org/SiteNavigationElement'
137+
className='grid grid-cols-8 gap-x-8 gap-y-10 max-sm:grid-cols-2 max-sm:gap-y-8 max-lg:grid-cols-3'
138+
>
139+
<a
140+
href={SIM_SITE_URL}
141+
aria-label='Sim home'
142+
className='flex h-[18px] items-center max-lg:col-span-full max-lg:mb-2'
143+
>
144+
<SimWordmark />
145+
</a>
146+
147+
<FooterColumn title='Product' items={PRODUCT_LINKS} />
148+
<FooterColumn title='Resources' items={RESOURCES_LINKS} />
149+
<FooterColumn title='Blocks' items={BLOCK_LINKS} />
150+
<FooterColumn title='Integrations' items={INTEGRATION_LINKS} />
151+
<FooterColumn title='Models' items={MODEL_LINKS} />
152+
<FooterColumn title='Socials' items={SOCIAL_LINKS} />
153+
<FooterColumn title='Legal' items={LEGAL_LINKS} />
154+
</nav>
155+
156+
<p className='mt-16 text-[var(--text-muted)] text-sm'>© 2026 Sim. All rights reserved.</p>
157+
</div>
158+
</footer>
159+
)
160+
}

apps/docs/components/navbar/navbar.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Link from 'next/link'
55
import { usePathname } from 'next/navigation'
66
import { LanguageDropdown } from '@/components/ui/language-dropdown'
77
import { SearchTrigger } from '@/components/ui/search-trigger'
8-
import { SimLogoFull } from '@/components/ui/sim-logo'
8+
import { SimWordmark } from '@/components/ui/sim-logo'
99
import { ThemeToggle } from '@/components/ui/theme-toggle'
1010
import { cn } from '@/lib/utils'
1111

@@ -44,8 +44,8 @@ export function Navbar() {
4444
paddingRight: 'calc(var(--toc-offset) + var(--nav-inset))',
4545
}}
4646
>
47-
<Link href='/' className='flex min-w-[100px] items-center'>
48-
<SimLogoFull className='h-[20px] w-auto' />
47+
<Link href='/' className='flex items-center'>
48+
<SimWordmark className='h-[18px]' />
4949
</Link>
5050

5151
<div className='-translate-x-1/2 absolute left-1/2 flex items-center justify-center'>

apps/docs/components/ui/sim-logo.tsx

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,93 @@
11
'use client'
22

3+
import { useId } from 'react'
34
import { cn } from '@/lib/utils'
45

56
interface SimLogoProps {
67
className?: string
78
}
89

10+
/**
11+
* Inline "sim" wordmark, no separate icon mark — same paths as the landing
12+
* footer's `SimWordmark` (`apps/sim/app/(landing)/components/navbar/components/sim-wordmark`),
13+
* ported here so the docs footer can match it exactly. Filled with
14+
* `var(--text-body)` so it reads as one solid ink matching surrounding text.
15+
*/
16+
export function SimWordmark({ className }: SimLogoProps) {
17+
return (
18+
<svg
19+
viewBox='0 0 441 212'
20+
width={37}
21+
height={18}
22+
fill='none'
23+
aria-hidden='true'
24+
className={cn('-translate-y-[1.5px] h-[18px] w-auto', className)}
25+
>
26+
<g fill='var(--text-body)'>
27+
<path d='M0 160.9H29.51C29.51 169.08 32.46 175.61 38.37 180.48C44.27 185.12 52.25 187.44 62.31 187.44C73.24 187.44 81.65 185.34 87.56 181.14C93.46 176.71 96.41 170.85 96.41 163.55C96.41 158.24 94.77 153.82 91.49 150.28C88.43 146.74 82.75 143.86 74.44 141.65L46.24 135.01C32.03 131.47 21.42 126.05 14.43 118.75C7.65 111.45 4.26 101.83 4.26 89.88C4.26 79.93 6.78 71.3 11.81 64C17.05 56.7 24.16 51.06 33.12 47.08C42.3 43.09 52.8 41.1 64.6 41.1C76.41 41.1 86.57 43.2 95.1 47.41C103.84 51.61 110.62 57.47 115.43 64.99C120.46 72.52 123.08 81.48 123.3 91.87H93.79C93.57 83.47 90.84 76.94 85.59 72.3C80.34 67.65 73.02 65.33 63.62 65.33C54 65.33 46.57 67.43 41.32 71.63C36.07 75.83 33.45 81.59 33.45 88.89C33.45 99.73 41.32 107.14 57.06 111.12L85.26 118.09C98.81 121.19 108.98 126.28 115.76 133.35C122.53 140.21 125.92 149.61 125.92 161.56C125.92 171.74 123.19 180.7 117.73 188.44C112.26 195.96 104.72 201.82 95.1 206.03C85.7 210.01 74.55 212 61.65 212C42.85 212 27.87 207.35 16.72 198.06C5.57 188.77 0 176.38 0 160.9Z' />
28+
<path d='M232.8 212H202.13L202.13 49.76H229.54V77.39C232.8 68.34 239.11 60.66 247.81 54.7C256.73 48.52 267.5 45.43 280.12 45.43C294.26 45.43 306.01 49.29 315.36 57.02C324.72 64.75 330.81 75.01 333.64 87.82H328.09C330.27 75.01 336.25 64.75 346.04 57.02C355.83 49.29 367.9 45.43 382.26 45.43C400.54 45.43 414.89 50.84 425.34 61.66C435.78 72.47 441 87.26 441 106.03V212H410.98V113.65C410.98 100.84 407.71 91.02 401.19 84.17C394.88 77.11 386.29 73.58 375.41 73.58C367.79 73.58 361.05 75.34 355.17 78.88C349.52 82.19 345.06 87.04 341.8 93.45C338.53 99.85 336.9 107.36 336.9 115.97V212H306.55V113.32C306.55 100.51 303.4 90.8 297.09 84.17C290.78 77.33 282.19 73.91 271.31 73.91C263.69 73.91 256.95 75.67 251.08 79.21C245.42 82.52 240.96 87.38 237.7 93.78C234.43 99.96 232.8 107.36 232.8 115.97V212Z' />
29+
<path d='M184.83 20.55C184.83 31.9 175.64 41.1 164.29 41.1C152.95 41.1 143.76 31.9 143.76 20.55C143.76 9.2 152.95 0 164.29 0C175.64 0 184.83 9.2 184.83 20.55Z' />
30+
<path d='M179.43 212H149.16V49.76C153.76 51.91 158.88 53.12 164.29 53.12C169.7 53.12 174.83 51.91 179.43 49.76V212Z' />
31+
</g>
32+
</svg>
33+
)
34+
}
35+
36+
/**
37+
* Icon-only Sim mark, no wordmark text. Same brandbook icon geometry as
38+
* {@link SimLogoFull}'s icon, at its native square viewBox.
39+
*/
40+
export function SimLogoIcon({ className }: SimLogoProps) {
41+
const gradientId = `sim-logo-icon-gradient-${useId()}`
42+
43+
return (
44+
<svg
45+
viewBox='0 0 222 222'
46+
fill='none'
47+
xmlns='http://www.w3.org/2000/svg'
48+
className={cn('size-7', className)}
49+
aria-label='Sim'
50+
>
51+
<defs>
52+
<linearGradient
53+
id={gradientId}
54+
gradientUnits='userSpaceOnUse'
55+
x1='129.434'
56+
y1='129.266'
57+
x2='185.629'
58+
y2='185.33'
59+
>
60+
<stop offset='0' />
61+
<stop offset='1' stopOpacity='0' />
62+
</linearGradient>
63+
</defs>
64+
<path
65+
clipRule='evenodd'
66+
d='m107.822 93.7612c0 3.5869-1.419 7.0308-3.938 9.5668l-.361.364c-2.517 2.544-5.9375 3.966-9.4994 3.966h-80.5781c-7.42094 0-13.4455 6.06-13.4455 13.533v87.141c0 7.474 6.02456 13.534 13.4455 13.534h86.5167c7.4208 0 13.4378-6.06 13.4378-13.534v-81.587c0-3.326 1.31-6.517 3.647-8.871 2.33-2.347 5.499-3.667 8.802-3.667h81.928c7.421 0 13.437-6.059 13.437-13.533v-87.1407c0-7.47374-6.016-13.5333-13.437-13.5333h-86.517c-7.421 0-13.438 6.05956-13.438 13.5333zm26.256-75.2112h60.874c4.337 0 7.844 3.5393 7.844 7.9003v61.3071c0 4.3604-3.507 7.9003-7.844 7.9003h-60.874c-4.33 0-7.845-3.5399-7.845-7.9003v-61.3071c0-4.361 3.515-7.9003 7.845-7.9003z'
67+
fill='#33C482'
68+
fillRule='evenodd'
69+
/>
70+
<path
71+
d='m207.878 129.57h-64.324c-7.798 0-14.12 6.367-14.12 14.221v63.993c0 7.854 6.322 14.221 14.12 14.221h64.324c7.799 0 14.121-6.367 14.121-14.221v-63.993c0-7.854-6.322-14.221-14.121-14.221z'
72+
fill='#33C482'
73+
/>
74+
<path
75+
d='m207.878 129.266h-64.324c-7.798 0-14.12 6.366-14.12 14.221v63.992c0 7.854 6.322 14.22 14.12 14.22h64.324c7.799 0 14.121-6.366 14.121-14.22v-63.992c0-7.855-6.322-14.221-14.121-14.221z'
76+
fill={`url(#${gradientId})`}
77+
fillOpacity='0.2'
78+
/>
79+
</svg>
80+
)
81+
}
82+
983
/**
1084
* Full Sim logo with icon and "Sim" text.
1185
* Uses the same SVG source as the landing page navbar for exact visual alignment.
1286
* The icon stays green (#33C482), text adapts to light/dark mode.
1387
*/
1488
export function SimLogoFull({ className }: SimLogoProps) {
89+
const gradientId = `sim-logo-full-gradient-${useId()}`
90+
1591
return (
1692
<svg
1793
viewBox='0 0 71 22'
@@ -22,7 +98,7 @@ export function SimLogoFull({ className }: SimLogoProps) {
2298
>
2399
<defs>
24100
<linearGradient
25-
id='sim-logo-full-gradient'
101+
id={gradientId}
26102
gradientUnits='userSpaceOnUse'
27103
x1='171.406'
28104
y1='171.18'
@@ -47,7 +123,7 @@ export function SimLogoFull({ className }: SimLogoProps) {
47123
/>
48124
<path
49125
d='m275.293 171.18h-85.187c-10.327 0-18.7 8.432-18.7 18.834v84.749c0 10.402 8.373 18.833 18.7 18.833h85.187c10.328 0 18.701-8.431 18.701-18.833v-84.749c0-10.402-8.373-18.834-18.701-18.834z'
50-
fill='url(#sim-logo-full-gradient)'
126+
fill={`url(#${gradientId})`}
51127
fillOpacity='0.2'
52128
/>
53129
</g>

apps/docs/lib/urls.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
11
export const DOCS_BASE_URL = process.env.NEXT_PUBLIC_DOCS_URL ?? 'https://docs.sim.ai'
2+
/**
3+
* The public marketing site's fixed canonical origin — not `NEXT_PUBLIC_APP_URL`.
4+
* That env var reflects wherever *this* deployment (self-hosted or otherwise)
5+
* happens to run, but the footer's marketing links (`/blog`, `/enterprise`,
6+
* `/models`, `/terms`, `/privacy`, …) only ever exist on sim.ai itself, so
7+
* they must stay hardcoded to it regardless of where docs is hosted.
8+
*/
9+
export const SIM_SITE_URL = 'https://sim.ai'
94.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)