Skip to content

Commit f3257eb

Browse files
committed
fix(docs): refine navigation and compact sample controls
1 parent 0679f72 commit f3257eb

13 files changed

Lines changed: 113 additions & 50 deletions

‎apps/docs/components/docs/navigation-drawer.tsx‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import type { ReactNode } from 'react'
44
import { useRef, useState } from 'react'
55
import * as Dialog from '@radix-ui/react-dialog'
66
import { X } from '@sim/emcn/icons'
7+
import { cn } from '@/components/docs/classnames'
78
import { SidebarNavigation } from '@/components/docs/navigation'
89
import { useDocsNavigation } from '@/components/docs/navigation-context'
10+
import { docsScrollAreaClass } from '@/components/docs/primitives'
911
import { DocsSearchTrigger } from '@/components/docs/search'
1012
import { ThemeSwitch } from '@/components/docs/theme'
1113

@@ -50,7 +52,10 @@ export function DocsNavigationDrawer({ children }: DocsNavigationDrawerProps) {
5052
onScroll={(event) => {
5153
position.current = { navigation, top: event.currentTarget.scrollTop }
5254
}}
53-
className='mt-5 min-h-0 flex-1 overflow-y-auto overscroll-contain pb-6'
55+
className={cn(
56+
docsScrollAreaClass,
57+
'mt-5 min-h-0 flex-1 overflow-y-auto overscroll-contain pb-6'
58+
)}
5459
>
5560
<SidebarNavigation
5661
nodes={navigation}

‎apps/docs/components/docs/navigation.tsx‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface NavigationItemProps extends Omit<SidebarNavigationProps, 'nodes'> {
1717
}
1818

1919
const rowClass =
20-
'group flex min-h-[30px] w-full items-center gap-1.5 rounded-lg px-2 py-[5px] text-docs-nav text-[var(--docs-text)] transition-colors focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] focus-visible:outline-offset-2'
20+
'group flex min-h-[30px] w-full items-center gap-1.5 rounded-lg px-2 py-[5px] text-docs-nav text-[var(--docs-text)] transition-colors focus-visible:outline-2 focus-visible:outline-[var(--docs-muted)] focus-visible:-outline-offset-2'
2121

2222
function containsPath(node: NavNode, pathname: string): boolean {
2323
return (
@@ -68,8 +68,7 @@ function NavigationItem({ node, pathname, onNavigate }: NavigationItemProps) {
6868
<div
6969
className={cn(
7070
'group/branch flex min-h-[30px] items-center rounded-lg transition-colors hover:bg-[var(--docs-hover)] active:bg-[var(--docs-pressed)]',
71-
isCurrent &&
72-
'bg-[var(--docs-selected)] shadow-[var(--docs-current-edge)] hover:bg-[var(--docs-selected-hover)]'
71+
isCurrent && 'bg-[var(--docs-selected)] hover:bg-[var(--docs-selected-hover)]'
7372
)}
7473
>
7574
<Link
@@ -90,7 +89,7 @@ function NavigationItem({ node, pathname, onNavigate }: NavigationItemProps) {
9089
aria-label={`${expanded ? 'Collapse' : 'Expand'} ${node.title}`}
9190
aria-expanded={expanded}
9291
onClick={toggle}
93-
className='mr-0.5 flex size-7 shrink-0 items-center justify-center rounded-md opacity-0 focus-visible:opacity-100 focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] group-focus-within/branch:opacity-100 group-hover/branch:opacity-100 [@media(hover:none)]:opacity-100'
92+
className='focus-visible:-outline-offset-2 mr-0.5 flex size-7 shrink-0 items-center justify-center rounded-md opacity-0 focus-visible:opacity-100 focus-visible:outline-2 focus-visible:outline-[var(--docs-muted)] group-focus-within/branch:opacity-100 group-hover/branch:opacity-100 [@media(hover:none)]:opacity-100'
9493
>
9594
<ChevronDown
9695
className={cn('size-4 transition-transform', !expanded && '-rotate-90')}

‎apps/docs/components/docs/page-frame.tsx‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { ReactNode } from 'react'
44
import * as Dialog from '@radix-ui/react-dialog'
55
import { Menu } from '@sim/emcn/icons'
66
import { cn } from '@/components/docs/classnames'
7+
import { docsScrollAreaClass } from '@/components/docs/primitives'
78
import { DocsSearchTrigger } from '@/components/docs/search'
89
import { TableOfContents } from '@/components/docs/table-of-contents'
910
import type { DocsHeading } from '@/lib/content/types'
@@ -43,7 +44,12 @@ export function DocsPageFrame({ children, headings, api = false }: DocsPageFrame
4344
{children}
4445
</div>
4546
{!api && (
46-
<aside className='sticky top-24 hidden max-h-[calc(100dvh-120px)] overflow-y-auto pb-5 xl:block'>
47+
<aside
48+
className={cn(
49+
docsScrollAreaClass,
50+
'sticky top-24 hidden max-h-[calc(100dvh-120px)] overflow-y-auto pb-5 xl:block'
51+
)}
52+
>
4753
<TableOfContents headings={headings} active={activeHeading} />
4854
</aside>
4955
)}

‎apps/docs/components/docs/primitives.tsx‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ export const docsMenuClass =
1010
export const docsDialogClass =
1111
'docs-portal rounded-2xl border border-[var(--docs-border)] bg-[var(--docs-overlay)] text-[var(--docs-text)] shadow-[var(--docs-dialog-shadow)] backdrop-blur-[var(--docs-chrome-blur)]'
1212

13+
export const docsScrollAreaClass =
14+
'[scrollbar-width:thin] [scrollbar-color:var(--docs-muted)_transparent] [&::-webkit-scrollbar]:size-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-[var(--docs-muted)] [&::-webkit-scrollbar-track]:bg-transparent'
15+
1316
export const docsInlineLinkClass =
14-
'rounded-sm text-[var(--docs-prose-link)] underline decoration-current underline-offset-4 focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] focus-visible:outline-offset-2 dark:underline-offset-[3px]'
17+
'rounded-sm font-semibold text-[var(--docs-link)] focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] focus-visible:outline-offset-2'
1518

1619
export const docsMenuItemClass =
1720
'flex min-h-[30px] cursor-pointer items-center gap-2 rounded-md px-2 outline-none data-[highlighted]:bg-[var(--docs-hover)] data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 dark:data-[disabled]:text-[var(--docs-disabled)] dark:data-[disabled]:opacity-100'

‎apps/docs/components/docs/sample-panels.tsx‎

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,32 @@ export function SamplePanels({
4747
items.map((item) => [item.value, item.groupValue ?? item.value])
4848
)}
4949
aria-label={label}
50-
className={cn('my-0 overflow-hidden rounded-lg bg-[var(--docs-surface)]', className)}
50+
className={cn(
51+
'@container/sample my-0 overflow-hidden rounded-lg bg-[var(--docs-surface)]',
52+
className
53+
)}
5154
>
5255
<div className='flex min-h-11 items-center gap-2 px-3'>
5356
<span id={selectorId} className='shrink-0 font-medium text-docs-control'>
5457
{label}
5558
</span>
5659
{presentation === 'tabs' ? (
57-
<TabsList aria-label={`${label} language`}>
58-
{items.map((item) => (
59-
<TabsTrigger key={item.value} value={item.value}>
60-
{item.label}
61-
</TabsTrigger>
62-
))}
63-
</TabsList>
60+
<>
61+
<div className='@[480px]/sample:block hidden min-w-0'>
62+
<TabsList aria-label={`${label} language`}>
63+
{items.map((item) => (
64+
<TabsTrigger key={item.value} value={item.value}>
65+
{item.label}
66+
</TabsTrigger>
67+
))}
68+
</TabsList>
69+
</div>
70+
<TabsSelect
71+
label={`${label} language`}
72+
items={items}
73+
className='@[480px]/sample:hidden'
74+
/>
75+
</>
6476
) : (
6577
<TabsSelect label={`${label} example`} items={items} />
6678
)}

‎apps/docs/components/docs/search.tsx‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { ArrowRight, Search, X } from '@sim/emcn/icons'
1515
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
1616
import { useRouter } from 'next/navigation'
1717
import { cn } from '@/components/docs/classnames'
18-
import { docsDialogClass } from '@/components/docs/primitives'
18+
import { docsDialogClass, docsScrollAreaClass } from '@/components/docs/primitives'
1919
import type { NavNode } from '@/lib/content/types'
2020
import { DOCS_SECTIONS } from '@/lib/navigation'
2121
import { useDocsSearch } from '@/hooks/queries/search'
@@ -215,7 +215,12 @@ function SearchContents({ close, navigation, sectionLabel }: SearchContentsProps
215215
<X className='size-4' aria-hidden />
216216
</Dialog.Close>
217217
</div>
218-
<div className='h-80 min-h-0 overflow-y-auto overscroll-contain p-2 sm:h-96'>
218+
<div
219+
className={cn(
220+
docsScrollAreaClass,
221+
'h-80 min-h-0 overflow-y-auto overscroll-contain p-2 sm:h-96'
222+
)}
223+
>
219224
{!hasQuery && (
220225
<p className='px-3 py-2 text-[var(--docs-muted)] text-docs-caption'>
221226
Quick links · {sectionLabel}

‎apps/docs/components/docs/shell.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { cn } from '@/components/docs/classnames'
77
import { SidebarNavigation } from '@/components/docs/navigation'
88
import { DocsNavigationContext } from '@/components/docs/navigation-context'
99
import { DocsNavigationDrawer } from '@/components/docs/navigation-drawer'
10+
import { docsScrollAreaClass } from '@/components/docs/primitives'
1011
import { DocsSearchProvider, DocsSearchTrigger } from '@/components/docs/search'
1112
import { ThemeSwitch } from '@/components/docs/theme'
1213
import { SimWordmark } from '@/components/ui/sim-logo'
@@ -95,7 +96,10 @@ export function DocsShell({ children, navigationBySection }: DocsShellProps) {
9596
<div className='mx-auto grid w-full max-w-[1280px] flex-1 grid-cols-[minmax(0,1fr)] items-start gap-x-12 pb-16 lg:grid-cols-[216px_minmax(0,1fr)] lg:px-4 lg:pt-10'>
9697
<aside
9798
key={section}
98-
className='sticky top-24 hidden max-h-[calc(100dvh-120px)] min-w-0 space-y-5 overflow-y-auto overscroll-contain pb-5 lg:block'
99+
className={cn(
100+
docsScrollAreaClass,
101+
'sticky top-24 hidden max-h-[calc(100dvh-120px)] min-w-0 space-y-5 overflow-y-auto overscroll-contain pb-5 lg:block'
102+
)}
99103
>
100104
<DocsSearchTrigger />
101105
<SidebarNavigation nodes={navigation} pathname={pathname} />

‎apps/docs/components/docs/table-of-contents.tsx‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { ChevronDown } from '@sim/emcn/icons'
44
import { cn } from '@/components/docs/classnames'
5-
import { docsMenuClass } from '@/components/docs/primitives'
5+
import { docsMenuClass, docsScrollAreaClass } from '@/components/docs/primitives'
66
import type { DocsHeading } from '@/lib/content/types'
77

88
interface TableOfContentsProps {
@@ -29,7 +29,7 @@ export function TableOfContents({ headings, active, compact = false }: TableOfCo
2929
'dark:-mx-2 block rounded-md pointer-coarse:py-3 text-docs-control leading-5 transition-colors focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] focus-visible:outline-offset-2 dark:px-2 dark:hover:bg-[var(--docs-hover)]',
3030
depth > 2 && 'pl-3 dark:pl-5',
3131
active === id
32-
? 'text-[var(--docs-toc-current)] dark:underline dark:underline-offset-[3px]'
32+
? 'font-medium text-[var(--docs-toc-current)]'
3333
: 'text-[var(--docs-muted)] hover:text-[var(--docs-heading)] dark:hover:text-[var(--docs-muted)]'
3434
)}
3535
>
@@ -49,6 +49,7 @@ export function TableOfContents({ headings, active, compact = false }: TableOfCo
4949
aria-label='On this page'
5050
className={cn(
5151
docsMenuClass,
52+
docsScrollAreaClass,
5253
'absolute top-full right-0 z-40 max-h-[60dvh] w-[min(320px,calc(100vw-40px))] overflow-y-auto overscroll-contain p-4'
5354
)}
5455
>

‎apps/docs/components/docs/tokens.css‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,8 @@
4545
--docs-hover: rgb(10 10 10 / 6%);
4646
--docs-selected: rgb(0 0 0 / 8%);
4747
--docs-selected-hover: var(--docs-selected);
48-
--docs-current-edge: none;
4948
--docs-pressed: rgb(0 0 0 / 12%);
5049
--docs-link: #0066cc;
51-
--docs-prose-link: var(--docs-link);
5250
--docs-toc-current: var(--docs-link);
5351
--docs-glass: rgb(255 255 255 / 80%);
5452
--docs-overlay: rgb(255 255 255 / 88%);
@@ -134,10 +132,8 @@
134132
--docs-hover: #2b2b2b;
135133
--docs-selected: #333;
136134
--docs-selected-hover: var(--docs-pressed);
137-
--docs-current-edge: inset 2px 0 0 var(--docs-boundary);
138135
--docs-pressed: #3a3a3a;
139136
--docs-link: #8abeff;
140-
--docs-prose-link: var(--docs-heading);
141137
--docs-toc-current: var(--docs-muted);
142138
--docs-glass: rgb(20 20 20 / 92%);
143139
--docs-overlay: rgb(36 36 36 / 92%);

‎apps/docs/components/ui/scroll-region.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { type HTMLAttributes, useEffect, useRef } from 'react'
44
import { cn } from '@/components/docs/classnames'
5+
import { docsScrollAreaClass } from '@/components/docs/primitives'
56

67
interface ScrollRegionProps extends HTMLAttributes<HTMLDivElement> {
78
label: string
@@ -28,7 +29,8 @@ export function ScrollRegion({ label, className, children, ...props }: ScrollReg
2829
role='region'
2930
aria-label={label}
3031
className={cn(
31-
'min-w-0 overflow-x-auto [scrollbar-width:thin] focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] focus-visible:outline-offset-2',
32+
docsScrollAreaClass,
33+
'min-w-0 overflow-x-auto focus-visible:outline-2 focus-visible:outline-[var(--docs-link)] focus-visible:outline-offset-2',
3234
className
3335
)}
3436
>

0 commit comments

Comments
 (0)