Files
supabase/apps/docs/features/ui/Tabs.tsx
T
Francesco Sansalvadore d24df14aab Feat/toc component (#33964)
* test fuma toc

* make toc work

* ok toc

* ui-patterns toc

* fix types

* cleanup

* fix overflow issues

* cleanup

* fix loading w

* Update apps/docs/components/GuidesTableOfContents.tsx

* fix prettier

* format

* install deps

* target ES2018

* tweak regex

* update docs test snapshots

* fix useSubscribeTocRerender
2025-03-05 23:10:02 +01:00

44 lines
1.2 KiB
TypeScript

'use client'
import { useCallback, type ComponentPropsWithoutRef, type PropsWithChildren } from 'react'
import { Tabs as TabsPrimitive, type TabsProps } from 'ui'
import { withQueryParams, withSticky, type QueryParamsProps } from 'ui-patterns/ComplexTabs'
import { useTocRerenderTrigger } from '~/features/docs/GuidesMdx.client'
const TabsWithStickyAndQueryParams = withSticky<PropsWithChildren<TabsProps & QueryParamsProps>>(
withQueryParams(TabsPrimitive)
)
const TabPanel = TabsPrimitive.Panel
const Tabs = ({
onChange,
stickyTabList,
...props
}: ComponentPropsWithoutRef<typeof TabsWithStickyAndQueryParams>) => {
const rerenderToc = useTocRerenderTrigger()
const onChangeInternal = useCallback(
(...args: Parameters<typeof onChange>) => {
rerenderToc()
onChange?.(...args)
},
[rerenderToc, onChange]
)
if (stickyTabList && !stickyTabList.scrollMarginTop) {
// Magic number is the height of tab list + paragraph margin, worth getting
// rid of this?
stickyTabList.scrollMarginTop = 'calc(var(--header-height) + 43px + 20px)'
}
return (
<TabsWithStickyAndQueryParams
wrappable
onChange={onChangeInternal}
stickyTabList={stickyTabList}
{...props}
/>
)
}
export { Tabs, TabPanel }