Skip to content

Commit 0207d61

Browse files
committed
cleanup
1 parent ee0745d commit 0207d61

File tree

7 files changed

+43
-107
lines changed

7 files changed

+43
-107
lines changed

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

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type React from 'react'
2+
import type { Root } from 'fumadocs-core/page-tree'
23
import { findNeighbour } from 'fumadocs-core/page-tree'
4+
import type { ApiPageProps } from 'fumadocs-openapi/ui'
35
import { createAPIPage } from 'fumadocs-openapi/ui'
46
import { Pre } from 'fumadocs-ui/components/codeblock'
57
import defaultMdxComponents from 'fumadocs-ui/mdx'
@@ -18,7 +20,15 @@ import { i18n } from '@/lib/i18n'
1820
import { getApiSpecContent, openapi } from '@/lib/openapi'
1921
import { type PageData, source } from '@/lib/source'
2022

21-
const SUPPORTED_LANGUAGES = new Set(i18n.languages)
23+
const SUPPORTED_LANGUAGES: Set<string> = new Set(i18n.languages)
24+
const BASE_URL = 'https://docs.sim.ai'
25+
26+
function resolveLangAndSlug(params: { slug?: string[]; lang: string }) {
27+
const isValidLang = SUPPORTED_LANGUAGES.has(params.lang)
28+
const lang = isValidLang ? params.lang : 'en'
29+
const slug = isValidLang ? params.slug : [params.lang, ...(params.slug ?? [])]
30+
return { lang, slug }
31+
}
2232

2333
const APIPage = createAPIPage(openapi, {
2434
playground: { enabled: false },
@@ -46,21 +56,18 @@ const APIPage = createAPIPage(openapi, {
4656

4757
export default async function Page(props: { params: Promise<{ slug?: string[]; lang: string }> }) {
4858
const params = await props.params
49-
const isValidLang = SUPPORTED_LANGUAGES.has(params.lang)
50-
const lang = isValidLang ? params.lang : 'en'
51-
const slug = isValidLang ? params.slug : [params.lang, ...(params.slug ?? [])]
59+
const { lang, slug } = resolveLangAndSlug(params)
5260
const page = source.getPage(slug, lang)
5361
if (!page) notFound()
5462

5563
const data = page.data as PageData & {
5664
_openapi?: { method?: string }
57-
getAPIPageProps?: () => unknown
65+
getAPIPageProps?: () => ApiPageProps
5866
}
5967
const isOpenAPI = '_openapi' in data && data._openapi != null
6068
const isApiReference = slug?.some((s) => s === 'api-reference') ?? false
61-
const baseUrl = 'https://docs.sim.ai'
6269

63-
const pageTreeRecord = source.pageTree as Record<string, unknown>
70+
const pageTreeRecord = source.pageTree as Record<string, Root>
6471
const pageTree = pageTreeRecord[lang] ?? pageTreeRecord.en ?? Object.values(pageTreeRecord)[0]
6572
const rawNeighbours = pageTree ? findNeighbour(pageTree, page.url) : null
6673
const neighbours = isApiReference
@@ -76,7 +83,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
7683
const breadcrumbs: Array<{ name: string; url: string }> = [
7784
{
7885
name: 'Home',
79-
url: baseUrl,
86+
url: BASE_URL,
8087
},
8188
]
8289

@@ -99,12 +106,12 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
99106
if (index === urlParts.length - 1) {
100107
breadcrumbs.push({
101108
name: data.title,
102-
url: `${baseUrl}${page.url}`,
109+
url: `${BASE_URL}${page.url}`,
103110
})
104111
} else {
105112
breadcrumbs.push({
106113
name: name,
107-
url: `${baseUrl}${currentPath}`,
114+
url: `${BASE_URL}${currentPath}`,
108115
})
109116
}
110117
})
@@ -116,7 +123,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
116123

117124
const CustomFooter = () => (
118125
<div className='mt-12'>
119-
{/* Navigation links */}
120126
<div className='flex items-center justify-between py-8'>
121127
{neighbours?.previous ? (
122128
<Link
@@ -143,10 +149,8 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
143149
)}
144150
</div>
145151

146-
{/* Divider line */}
147152
<div className='border-border border-t' />
148153

149-
{/* Social icons */}
150154
<div className='flex items-center gap-4 py-6'>
151155
<Link
152156
href='https://x.com/simdotai'
@@ -225,7 +229,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
225229
<StructuredData
226230
title={data.title}
227231
description={data.description || ''}
228-
url={`${baseUrl}${page.url}`}
232+
url={`${BASE_URL}${page.url}`}
229233
lang={lang}
230234
breadcrumb={breadcrumbs}
231235
/>
@@ -273,7 +277,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
273277
<StructuredData
274278
title={data.title}
275279
description={data.description || ''}
276-
url={`${baseUrl}${page.url}`}
280+
url={`${BASE_URL}${page.url}`}
277281
lang={lang}
278282
breadcrumb={breadcrumbs}
279283
/>
@@ -351,17 +355,14 @@ export async function generateMetadata(props: {
351355
params: Promise<{ slug?: string[]; lang: string }>
352356
}) {
353357
const params = await props.params
354-
const isValidLang = SUPPORTED_LANGUAGES.has(params.lang)
355-
const lang = isValidLang ? params.lang : 'en'
356-
const slug = isValidLang ? params.slug : [params.lang, ...(params.slug ?? [])]
358+
const { lang, slug } = resolveLangAndSlug(params)
357359
const page = source.getPage(slug, lang)
358360
if (!page) notFound()
359361

360362
const data = page.data as PageData
361-
const baseUrl = 'https://docs.sim.ai'
362-
const fullUrl = `${baseUrl}${page.url}`
363+
const fullUrl = `${BASE_URL}${page.url}`
363364

364-
const ogImageUrl = `${baseUrl}/api/og?title=${encodeURIComponent(data.title)}`
365+
const ogImageUrl = `${BASE_URL}/api/og?title=${encodeURIComponent(data.title)}`
365366

366367
return {
367368
title: data.title,
@@ -425,13 +426,13 @@ export async function generateMetadata(props: {
425426
alternates: {
426427
canonical: fullUrl,
427428
languages: {
428-
'x-default': `${baseUrl}${page.url.replace(`/${lang}`, '')}`,
429-
en: `${baseUrl}${page.url.replace(`/${lang}`, '')}`,
430-
es: `${baseUrl}/es${page.url.replace(`/${lang}`, '')}`,
431-
fr: `${baseUrl}/fr${page.url.replace(`/${lang}`, '')}`,
432-
de: `${baseUrl}/de${page.url.replace(`/${lang}`, '')}`,
433-
ja: `${baseUrl}/ja${page.url.replace(`/${lang}`, '')}`,
434-
zh: `${baseUrl}/zh${page.url.replace(`/${lang}`, '')}`,
429+
'x-default': `${BASE_URL}${page.url.replace(`/${lang}`, '')}`,
430+
en: `${BASE_URL}${page.url.replace(`/${lang}`, '')}`,
431+
es: `${BASE_URL}/es${page.url.replace(`/${lang}`, '')}`,
432+
fr: `${BASE_URL}/fr${page.url.replace(`/${lang}`, '')}`,
433+
de: `${BASE_URL}/de${page.url.replace(`/${lang}`, '')}`,
434+
ja: `${BASE_URL}/ja${page.url.replace(`/${lang}`, '')}`,
435+
zh: `${BASE_URL}/zh${page.url.replace(`/${lang}`, '')}`,
435436
},
436437
},
437438
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ type LayoutProps = {
5555
params: Promise<{ lang: string }>
5656
}
5757

58-
const SUPPORTED_LANGUAGES = new Set(i18n.languages)
58+
const SUPPORTED_LANGUAGES: Set<string> = new Set(i18n.languages)
5959

6060
export default async function Layout({ children, params }: LayoutProps) {
6161
const { lang: rawLang } = await params

apps/docs/app/global.css

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,6 @@ html {
1515
}
1616

1717
@theme {
18-
--color-fd-primary: #33c482; /* Green from Sim logo */
19-
--font-geist-sans: var(--font-geist-sans);
20-
--font-geist-mono: var(--font-geist-mono);
21-
}
22-
23-
/* Ensure primary color is set in both light and dark modes */
24-
:root {
25-
--color-fd-primary: #33c482;
26-
}
27-
28-
.dark {
2918
--color-fd-primary: #33c482;
3019
}
3120

@@ -40,12 +29,6 @@ html {
4029
"Liberation Mono", "Courier New", monospace;
4130
}
4231

43-
/* Target any potential border classes */
44-
* {
45-
--fd-border-sidebar: transparent !important;
46-
}
47-
48-
/* Override any CSS custom properties for borders */
4932
:root {
5033
--fd-border: transparent !important;
5134
--fd-border-sidebar: transparent !important;
@@ -561,16 +544,9 @@ main[data-main] {
561544
padding-top: 1.5rem !important;
562545
}
563546

564-
/* Override Fumadocs default content padding */
565-
article[data-content],
566-
div[data-content] {
567-
padding-top: 1.5rem !important;
568-
}
569-
570-
/* Remove any unwanted borders/outlines from video elements */
547+
/* Remove any unwanted outlines from video elements */
571548
video {
572549
outline: none !important;
573-
border-style: solid !important;
574550
}
575551

576552
/* API Reference Pages — Mintlify-style overrides */

apps/docs/app/layout.config.tsx

Lines changed: 0 additions & 21 deletions
This file was deleted.

apps/docs/components/docs-layout/toc-footer.tsx

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
'use client'
22

3-
import { useState } from 'react'
43
import { ArrowRight, ChevronRight } from 'lucide-react'
54
import Link from 'next/link'
65

76
export function TOCFooter() {
8-
const [isHovered, setIsHovered] = useState(false)
9-
107
return (
118
<div className='sticky bottom-0 mt-6'>
129
<div className='flex flex-col gap-2 rounded-lg border border-border bg-secondary p-6 text-sm'>
@@ -21,18 +18,19 @@ export function TOCFooter() {
2118
href='https://sim.ai/signup'
2219
target='_blank'
2320
rel='noopener noreferrer'
24-
onMouseEnter={() => setIsHovered(true)}
25-
onMouseLeave={() => setIsHovered(false)}
2621
className='group mt-2 inline-flex h-8 w-fit items-center justify-center gap-1 whitespace-nowrap rounded-[10px] border border-[#2AAD6C] bg-gradient-to-b from-[#3ED990] to-[#2AAD6C] px-3 pr-[10px] pl-[12px] font-medium text-sm text-white shadow-[inset_0_2px_4px_0_#5EE8A8] outline-none transition-all hover:shadow-lg focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50'
2722
aria-label='Get started with Sim - Sign up for free'
2823
>
2924
<span>Get started</span>
30-
<span className='inline-flex transition-transform duration-200 group-hover:translate-x-0.5'>
31-
{isHovered ? (
32-
<ArrowRight className='h-4 w-4' aria-hidden='true' />
33-
) : (
34-
<ChevronRight className='h-4 w-4' aria-hidden='true' />
35-
)}
25+
<span className='relative inline-flex h-4 w-4 transition-transform duration-200 group-hover:translate-x-0.5'>
26+
<ChevronRight
27+
className='absolute inset-0 h-4 w-4 transition-opacity duration-200 group-hover:opacity-0'
28+
aria-hidden='true'
29+
/>
30+
<ArrowRight
31+
className='absolute inset-0 h-4 w-4 opacity-0 transition-opacity duration-200 group-hover:opacity-100'
32+
aria-hidden='true'
33+
/>
3634
</span>
3735
</Link>
3836
</div>

apps/docs/components/structured-data.tsx

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ export function StructuredData({
2525
headline: title,
2626
description: description,
2727
url: url,
28-
datePublished: dateModified || new Date().toISOString(),
29-
dateModified: dateModified || new Date().toISOString(),
28+
...(dateModified && { datePublished: dateModified }),
29+
...(dateModified && { dateModified }),
3030
author: {
3131
'@type': 'Organization',
3232
name: 'Sim Team',
@@ -91,12 +91,6 @@ export function StructuredData({
9191
inLanguage: ['en', 'es', 'fr', 'de', 'ja', 'zh'],
9292
}
9393

94-
const faqStructuredData = title.toLowerCase().includes('faq') && {
95-
'@context': 'https://schema.org',
96-
'@type': 'FAQPage',
97-
mainEntity: [],
98-
}
99-
10094
const softwareStructuredData = {
10195
'@context': 'https://schema.org',
10296
'@type': 'SoftwareApplication',
@@ -151,15 +145,6 @@ export function StructuredData({
151145
}}
152146
/>
153147
)}
154-
{faqStructuredData && (
155-
<Script
156-
id='faq-structured-data'
157-
type='application/ld+json'
158-
dangerouslySetInnerHTML={{
159-
__html: JSON.stringify(faqStructuredData),
160-
}}
161-
/>
162-
)}
163148
{url === baseUrl && (
164149
<Script
165150
id='software-structured-data'

apps/docs/lib/openapi.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,8 @@ function resolveRefs(obj: unknown, spec: Record<string, unknown>, depth = 0): un
4444
return obj
4545
}
4646

47-
function formatSchema(schema: unknown, indent = 0): string {
47+
function formatSchema(schema: unknown): string {
4848
return JSON.stringify(schema, null, 2)
49-
.split('\n')
50-
.map((line) => ' '.repeat(indent) + line)
51-
.join('\n')
5249
}
5350

5451
let cachedSpec: Record<string, unknown> | null = null

0 commit comments

Comments
 (0)