Skip to content

Commit dcaa118

Browse files
authored
improvement(docs): restructure sidebar, align chrome, rename Mothership to Chat (#6296)
Sidebar: 11 separator groups become 5, with each module a collapsible folder that auto-opens on the active page. 61 always-visible rows drop to 16. Groups mirror the app's own nav (Chats/Workspace/Workflows) rather than inventing a taxonomy; Enterprise and Self-Hosting are hoisted out of Platform. Chrome: register the `hover-hover` variant, without which every @sim/emcn hover state silently compiled to nothing; restore the sidebar's Geist font stack; add 11 emcn tokens that were falling back to currentColor; adopt the named type scale; align row geometry, hover tokens and group labels with the app. Rename: mothership/ -> chat/ with redirects for the old URLs. Asset paths, the @mothership.sim.ai domain and the `mothership` log-trigger enum value are deliberately left alone -- they are CDN objects, a real domain, and a live product value. Also removes the page-type badge, drops the "Next" heading from the ToC, and lets FAQ rows open independently so expanding one no longer shifts the page.
1 parent 41572a0 commit dcaa118

93 files changed

Lines changed: 436 additions & 659 deletions

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: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { notFound } from 'next/navigation'
1010
import { PageFooter } from '@/components/docs-layout/page-footer'
1111
import { PageNavigationArrows } from '@/components/docs-layout/page-navigation-arrows'
1212
import { LLMCopyButton } from '@/components/page-actions'
13-
import { PageTypeBadge } from '@/components/page-type-badge'
1413
import { StructuredData } from '@/components/structured-data'
1514
import { CodeBlock } from '@/components/ui/code-block'
1615
import { Heading } from '@/components/ui/heading'
@@ -23,6 +22,21 @@ import { DOCS_BASE_URL } from '@/lib/urls'
2322
const SUPPORTED_LANGUAGES: Set<string> = new Set(i18n.languages)
2423
const BASE_URL = DOCS_BASE_URL
2524

25+
/**
26+
* Most pages close with a `## Next` / `## Next steps` grid of onward links.
27+
* That heading is navigation, not content, so it is kept out of the table of
28+
* contents — the ToC should say what the page covers, not where to go after it.
29+
* The heading itself still renders above the cards.
30+
*
31+
* Matched on the slug rather than the rendered title because a ToC title is a
32+
* `ReactNode`; the trailing group tolerates the slugger's dedupe suffix.
33+
*/
34+
const ONWARD_NAV_SLUG = /^#next(-steps)?(-\d+)?$/i
35+
36+
function isContentHeading(item: { url: string }): boolean {
37+
return !ONWARD_NAV_SLUG.test(item.url)
38+
}
39+
2640
const OG_LOCALE_MAP: Record<string, string> = {
2741
en: 'en_US',
2842
es: 'es_ES',
@@ -171,7 +185,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
171185
breadcrumb={breadcrumbs}
172186
/>
173187
<DocsPage
174-
toc={data.toc}
188+
toc={data.toc.filter(isContentHeading)}
175189
breadcrumb={{
176190
enabled: false,
177191
}}
@@ -218,7 +232,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
218232
breadcrumb={breadcrumbs}
219233
/>
220234
<DocsPage
221-
toc={data.toc}
235+
toc={data.toc.filter(isContentHeading)}
222236
full={data.full || isAcademy}
223237
breadcrumb={{
224238
enabled: false,
@@ -244,7 +258,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
244258
</div>
245259
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
246260
</div>
247-
{data.pageType && <PageTypeBadge type={data.pageType} className='mb-3' />}
248261
<DocsTitle className='mb-2'>{data.title}</DocsTitle>
249262
</div>
250263
<DocsBody>

apps/docs/app/global.css

Lines changed: 73 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@
55
@source "../../../packages/emcn/src";
66
@source "../../../packages/workflow-renderer/src";
77

8+
/* Every @sim/emcn component expresses hover through `hover-hover:` so touch
9+
devices never latch a sticky hover state. The app registers it as a plugin
10+
variant in apps/sim/tailwind.config.ts; docs is CSS-first Tailwind v4 with no
11+
config, so without this declaration the variant compiles to nothing and every
12+
emcn hover state silently no-ops here. */
13+
@custom-variant hover-hover {
14+
@media (hover: hover) and (pointer: fine) {
15+
&:hover {
16+
@slot;
17+
}
18+
}
19+
}
20+
821
/* Prevent overscroll bounce effect on the page */
922
html,
1023
body {
@@ -114,11 +127,24 @@ body {
114127
--badge-error-text: #dc2626;
115128
--badge-gray-bg: #e7e5e4;
116129
--badge-gray-text: #57534e;
130+
--code-bg: #f5f5f5;
131+
--code-foreground: #1a1a1a;
132+
--code-line-number: #737373;
133+
--selection-bg: #add6ff;
134+
--selection-dark: #264f78;
135+
--highlight-search-active: #f6ad55;
117136
--scrollbar-thumb-color: #c0c0c0;
118137
--scrollbar-thumb-hover-color: #a8a8a8;
119138
--shadow-subtle: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
120139
--shadow-medium: 0 4px 12px rgba(0, 0, 0, 0.1);
140+
--shadow-overlay: 0 10px 30px rgba(0, 0, 0, 0.11);
121141
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.04);
142+
/* z-index scale — poppers sit above the modal so menus stay clickable over
143+
the modal overlay. Mirrors apps/sim/app/_styles/globals.css. */
144+
--z-toast: 150;
145+
--z-modal: 200;
146+
--z-popover: 300;
147+
--z-tooltip: 400;
122148
}
123149

124150
.dark {
@@ -185,8 +211,13 @@ body {
185211
--badge-error-text: #fca5a5;
186212
--badge-gray-bg: #3a3a3a;
187213
--badge-gray-text: #a8a8a8;
214+
--code-bg: #1f1f1f;
215+
--code-foreground: #eeeeee;
216+
--code-line-number: #a8a8a8;
217+
--selection-bg: #264f78;
188218
--scrollbar-thumb-color: #5a5a5a;
189219
--scrollbar-thumb-hover-color: #6a6a6a;
220+
--shadow-overlay: 0 10px 30px rgba(0, 0, 0, 0.3);
190221
}
191222

192223
/* Scrollbars — platform thumb tokens, transparent track */
@@ -358,10 +389,10 @@ aside#nd-sidebar [data-radix-scroll-area-viewport] {
358389
}
359390
}
360391

361-
/* Sidebar spacing — left padding aligns item text with navbar content (item has 14px internal padding) */
392+
/* Sidebar spacing — left padding aligns item text with navbar content (item has 8px internal padding) */
362393
[data-sidebar-viewport],
363394
#nd-sidebar > div {
364-
padding: 0 14px 0 calc(var(--nav-inset) - 14px) !important;
395+
padding: 0 14px 0 calc(var(--nav-inset) - 8px) !important;
365396
background: transparent !important;
366397
}
367398

@@ -386,15 +417,20 @@ html #nd-sidebar [data-radix-scroll-area-viewport] > div {
386417
/* Target Link and button elements in sidebar - override Fumadocs itemVariants */
387418
/* Exclude the small chevron-only toggle buttons */
388419
/* Using html prefix for higher specificity over Tailwind v4 utilities */
420+
/* NEVER set `display` here. This selector scores (1,2,2) and carries
421+
`!important`, so it out-specifies every rule below that hides the language
422+
selector, theme toggle, and search button — a `display` declaration here
423+
forces all of them back into the sidebar. The 30px chip height therefore
424+
comes from line-height + padding (20 + 5 + 5), not from flex centering. */
389425
html #nd-sidebar a:not(:has(span.font-mono)),
390426
html #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"]) {
391427
font-size: 0.875rem !important; /* 14px to match navbar items */
392-
line-height: 1.4 !important;
393-
padding: 0.375rem 0.875rem !important;
394-
font-weight: 450 !important;
428+
line-height: 20px !important;
429+
padding: 5px 0.5rem !important; /* 30px tall overall — the app's chip pill, at its px-2 */
430+
font-weight: 400 !important;
395431
border-radius: 0.5rem !important; /* platform rounded-lg */
396-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
397-
sans-serif !important;
432+
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
433+
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important;
398434
}
399435

400436
/* Sidebar text — platform --text-body */
@@ -428,28 +464,24 @@ html #nd-sidebar button:not([aria-label*="ollapse"]):not([aria-label*="xpand"])
428464
margin-bottom: 0 !important;
429465
}
430466

431-
/* Section separator headers — styling handled by component, override fumadocs defaults */
467+
/* Section separator headers — match the app sidebar's group label: 12px,
468+
sentence case, normal weight. Only the fumadocs defaults are overridden here;
469+
size and color stay on the component. */
432470
[data-sidebar-viewport] [data-separator] p,
433471
#nd-sidebar [data-separator] p {
434-
font-size: 0.625rem !important; /* 10px */
435-
font-weight: 600 !important;
436-
text-transform: uppercase !important;
437-
letter-spacing: 0.06em !important;
472+
font-weight: 400 !important;
473+
text-transform: none !important;
474+
letter-spacing: normal !important;
438475
margin: 0 !important;
439476
padding: 0 !important;
440477
}
441478

442-
/* First separator has no top margin or divider; subsequent ones show the divider on desktop */
479+
/* The first group sits flush against the top padding — it has nothing to be
480+
separated from. */
443481
[data-separator]:not([data-separator] ~ [data-separator]) {
444482
margin-top: 0;
445483
}
446484

447-
@media (min-width: 1024px) {
448-
[data-separator] ~ [data-separator] > .separator-divider {
449-
display: block;
450-
}
451-
}
452-
453485
/* Active state — aligned with platform --surface-active */
454486
#nd-sidebar a[data-active="true"]:not(:has(span.font-mono)),
455487
#nd-sidebar button[data-active="true"] {
@@ -709,7 +741,7 @@ main article h4,
709741
[data-content] h4,
710742
#nd-page h3,
711743
#nd-page h4 {
712-
font-size: 1rem !important;
744+
font-size: var(--text-md) !important;
713745
font-weight: 470 !important;
714746
letter-spacing: -0.01em;
715747
color: var(--text-body);
@@ -751,18 +783,26 @@ main article li,
751783
border-left: none !important;
752784
}
753785

786+
/* The clerk TOC draws its active range twice: a track segment, plus a dot that
787+
animates along the track to the current heading. The dot is redundant with the
788+
segment and reads as a stray artifact, so hide it and keep the segment. It is
789+
the only node fumadocs gives an inline offset-path, which is what anchors it. */
790+
#nd-toc [style*="offset-path"] {
791+
display: none !important;
792+
}
793+
754794
/* TOC heading — align weight with landing */
755795
#nd-toc h3,
756796
#nd-toc [class*="title"] {
757797
font-weight: 480 !important;
758-
font-size: 0.8125rem !important;
798+
font-size: var(--text-small) !important;
759799
color: var(--text-muted);
760800
}
761801

762802
/* TOC links — softer colors aligned with landing muted text */
763803
#nd-toc a {
764804
font-weight: 430 !important;
765-
font-size: 0.8125rem !important;
805+
font-size: var(--text-small) !important;
766806
color: var(--text-muted);
767807
transition: color 0.2s;
768808
}
@@ -905,7 +945,7 @@ html #nd-sidebar a:has(span.font-mono.font-medium) {
905945
align-items: center;
906946
justify-content: center;
907947
width: 2.625rem;
908-
font-size: 0.625rem !important;
948+
font-size: var(--text-micro) !important;
909949
line-height: 1 !important;
910950
padding: 0.15625rem 0.25rem;
911951
border-radius: 0.375rem;
@@ -917,7 +957,7 @@ html #nd-sidebar a:has(span.font-mono.font-medium) {
917957
display: inline-flex;
918958
align-items: center;
919959
justify-content: center;
920-
font-size: 0.625rem !important;
960+
font-size: var(--text-micro) !important;
921961
line-height: 1 !important;
922962
padding: 0.15625rem 0.375rem;
923963
border-radius: 0.375rem;
@@ -984,7 +1024,7 @@ div.flex.flex-row.items-start.bg-fd-secondary.border.rounded-lg.text-xs {
9841024
span.font-mono.font-medium {
9851025
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif !important;
9861026
font-weight: 600 !important;
987-
font-size: 0.6875rem !important;
1027+
font-size: var(--text-xs) !important;
9881028
letter-spacing: 0.025em;
9891029
text-transform: uppercase;
9901030
padding: 0.125rem 0.5rem !important;
@@ -1033,7 +1073,7 @@ div.flex.flex-row.items-start.bg-fd-secondary.border.rounded-lg.text-xs {
10331073
background: none !important;
10341074
border: none !important;
10351075
padding: 0 !important;
1036-
font-size: 0.8125rem !important;
1076+
font-size: var(--text-small) !important;
10371077
}
10381078
/* Inline code in API pages — neutral color aligned with sim design.
10391079
Exclude code inside the method+path bar (handled above). */
@@ -1213,7 +1253,7 @@ div.flex.flex-row.items-start.bg-fd-secondary.border.rounded-lg.text-xs {
12131253
color: var(--text-secondary);
12141254
padding: 0.1875rem 0.5rem;
12151255
border-radius: 0.375rem;
1216-
font-size: 0.6875rem;
1256+
font-size: var(--text-xs);
12171257
line-height: 1.125rem;
12181258
font-weight: 500;
12191259
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
@@ -1223,7 +1263,6 @@ html.dark
12231263
.flex.flex-wrap.items-center.gap-3.not-prose
12241264
> span.text-sm.font-mono.text-fd-muted-foreground {
12251265
background-color: var(--surface-4);
1226-
color: var(--text-secondary);
12271266
}
12281267

12291268
/* Hide the "*" inside the name span — we'll add "required" as a ::after on the flex row */
@@ -1242,7 +1281,7 @@ html.dark
12421281
color: var(--badge-error-text);
12431282
padding: 0.1875rem 0.5rem;
12441283
border-radius: 0.375rem;
1245-
font-size: 0.6875rem;
1284+
font-size: var(--text-xs);
12461285
line-height: 1.125rem;
12471286
font-weight: 500;
12481287
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
@@ -1284,7 +1323,7 @@ html.dark
12841323
> .flex.flex-wrap.items-center.gap-3.not-prose
12851324
> span.text-sm.font-mono.text-fd-muted-foreground::after {
12861325
content: "string";
1287-
font-size: 0.6875rem;
1326+
font-size: var(--text-xs);
12881327
line-height: 1.125rem;
12891328
font-weight: 500;
12901329
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
@@ -1301,7 +1340,6 @@ html.dark
13011340
> .flex.flex-wrap.items-center.gap-3.not-prose
13021341
> span.text-sm.font-mono.text-fd-muted-foreground::after {
13031342
background-color: var(--surface-4);
1304-
color: var(--text-secondary);
13051343
}
13061344

13071345
/* "header" badge via ::before on the auth flex row */
@@ -1314,7 +1352,7 @@ html.dark
13141352
color: var(--text-secondary);
13151353
padding: 0.1875rem 0.5rem;
13161354
border-radius: 0.375rem;
1317-
font-size: 0.6875rem;
1355+
font-size: var(--text-xs);
13181356
line-height: 1.125rem;
13191357
font-weight: 500;
13201358
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
@@ -1324,7 +1362,6 @@ html.dark
13241362
div.my-4
13251363
> .flex.flex-wrap.items-center.gap-3.not-prose::before {
13261364
background-color: var(--surface-4);
1327-
color: var(--text-secondary);
13281365
}
13291366

13301367
/* "required" badge via ::after on the auth flex row — red pill */
@@ -1337,7 +1374,7 @@ html.dark
13371374
color: var(--badge-error-text);
13381375
padding: 0.1875rem 0.5rem;
13391376
border-radius: 0.375rem;
1340-
font-size: 0.6875rem;
1377+
font-size: var(--text-xs);
13411378
line-height: 1.125rem;
13421379
font-weight: 500;
13431380
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
@@ -1389,7 +1426,7 @@ html.dark
13891426
color: var(--text-secondary);
13901427
padding: 0.1875rem 0.5rem;
13911428
border-radius: 0.375rem;
1392-
font-size: 0.6875rem;
1429+
font-size: var(--text-xs);
13931430
line-height: 1.125rem;
13941431
font-weight: 500;
13951432
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
@@ -1400,7 +1437,6 @@ html.dark
14001437
.flex.flex-wrap.items-center.gap-3.not-prose
14011438
> span:has(> button) {
14021439
background-color: var(--surface-4);
1403-
color: var(--text-secondary);
14041440
}
14051441

14061442
/* Section headings (Authorization, Path Parameters, etc.) — consistent top spacing */
@@ -1562,10 +1598,6 @@ div > figure.shiki {
15621598
box-shadow: none !important;
15631599
}
15641600

1565-
html.dark div > figure.shiki {
1566-
background-color: transparent !important;
1567-
}
1568-
15691601
/* Tabbed code block container (cURL/JS/Go tabs) */
15701602
div:has(> [role="tablist"]):has(> div > figure.shiki) {
15711603
border-radius: 0.5rem !important;
@@ -1610,19 +1642,11 @@ figure.shiki pre {
16101642
background-color: transparent !important;
16111643
}
16121644

1613-
html.dark figure.shiki pre {
1614-
background-color: transparent !important;
1615-
}
1616-
16171645
/* Code viewport scroll area — transparent bg */
16181646
figure.shiki > div[role="region"] {
16191647
background-color: transparent !important;
16201648
}
16211649

1622-
html.dark figure.shiki > div[role="region"] {
1623-
background-color: transparent !important;
1624-
}
1625-
16261650
/* Copy button — minimal ghost style */
16271651
figure.shiki button[aria-label="Copy Text"],
16281652
figure.shiki button[aria-label="Copied Text"] {
@@ -1690,7 +1714,7 @@ figure.shiki > div:has(> button[aria-label]) {
16901714
.grid > a[data-card] p,
16911715
.grid > a[data-card] div {
16921716
color: var(--text-muted) !important;
1693-
font-size: 0.8125rem !important;
1717+
font-size: var(--text-small) !important;
16941718
}
16951719

16961720
/* Steps — lighter styling aligned with platform */

0 commit comments

Comments
 (0)