* update deps + image codemod (studio) * update next links (studio) * update deps * update links (ui) * remove next-transpile-modules * move next-themes dependency * chore: update ConfirmDialog * chore: remove old ConfirmModal js file. migrated to TS * dependency wrangling * remove empty page * update next links (www) * First run bump react-data-grid-v7 beta 4 * fix package-lock.json * more deps wrangling * update recharts * update sentry options * fix some broken things in www * studio fixes * fix graphiql * fix studio build * fix menu hydration * small build error * update turbo * fix www typescript errors * docs image codemod * links codemod docs * fix docs typescript errors * move useConsent to ui to prevent circular deps * Fix links * Fix homepage * Fix links * move studio/ to apps/ * Revert "move studio/ to apps/" This reverts commit 1b0a985fcb7569f29c8a6dd05b9c3063152547b9. * disable outputFileTracingRoot * remove outputFileTracingRoot * fix homepage product cards * fix PrivacySettings links * Fix links * Fix the build for www. * Minor fixes for JWTGenerator. * Fix the docs and ui tests. * Revert codehike back to 0.8.3 * remove ConfirmAlert() * reenable babel because mobx hates me * fix blog image and comparison page avatar * Fix svg errors * update image synthax * Fix code hike * Move the button in a div so that it doesn't inherit its parent height and make the button look weird. * When components are defined in a component, they get recreated on each render. This makes them unstable in certain cases and causes infinite rerenders. * Replace the next/head usage with next/script. * Chore/upgrade next 13 fix table editor (#18431) * fix table editor styling and fix row deletion logic * Fix deleting selected rows from header, and fix checkboxes not clearing up * Fix deleting all rows when filter applied, and fix deleting all rows * Fix grid size styling issue * Fix TS error * Hydration errors * studio org pages fixes * fix more studio links * audit logs fixes * dropdown icon styling fixes * fix some images in www * upgrade to next 14 * try new sentry wrapper for api * see if this is even invoked * Revert "see if this is even invoked" This reverts commit 86c3973ffa7f8ef5e1eb6d95a5809156cebf217b. * Revert "try new sentry wrapper for api" This reverts commit f67623ebad0f241d7e9fe275d50f7707bf64c474. * Revert "upgrade to next 14" This reverts commit a24dd6131eaff475a90ef991c2f832a64e4aaa2b. * chore: allow node version 19/20 * Try to fix the LogTable so that it renders with the newer "react-data-grid" version. * Fix type errors in the log renderer code. * Fix the replication screen. * Add the CSS for the GraphiQL. * Fix SQL editor results rendering * Lint * Fix SQL editor results height issue * Fix auth RLS not invalidating RQ when toggling RLS * Fix database tables new/edit column regressed * Fix migrations page empty state if migrations schema not yet created * Fix API side panel docs temp remove postgrest text for column description PK and FK * Fix + improve timeout handling in SQL editor --------- Co-authored-by: Jonathan Summers-Muir <MildTomato@users.noreply.github.com> Co-authored-by: Joshen Lim <joshenlimek@gmail.com> Co-authored-by: Francesco Sansalvadore <f.sansalvadore@gmail.com> Co-authored-by: Terry Sutton <saltcod@gmail.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com> Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>
181 lines
5.0 KiB
TypeScript
181 lines
5.0 KiB
TypeScript
import { useInView } from 'react-intersection-observer'
|
|
import { FC, PropsWithChildren } from 'react'
|
|
import { highlightSelectedNavItem } from '~/components/CustomHTMLElements/CustomHTMLElements.utils'
|
|
import { useRouter } from 'next/router'
|
|
import { useNavigationMenuContext } from '~/components/Navigation/NavigationMenu/NavigationMenu.Context'
|
|
import { menuState } from '~/hooks/useMenuState'
|
|
import Image from 'next/legacy/image'
|
|
|
|
interface ISectionContainer {
|
|
id: string
|
|
title?: string
|
|
monoFont?: boolean
|
|
slug: string
|
|
scrollSpyHeader?: boolean
|
|
singleColumn?: boolean
|
|
icon?: string
|
|
}
|
|
|
|
type RefSubLayoutSubComponents = {
|
|
Section: FC<PropsWithChildren<ISectionContainer>>
|
|
EducationSection: FC<PropsWithChildren<IEducationSection>>
|
|
EducationRow: FC<PropsWithChildren<IEducationRow>>
|
|
Details: FC<ISectionDetails>
|
|
Examples: FC<ISectionExamples>
|
|
}
|
|
|
|
type StickyHeader = {
|
|
id: string
|
|
slug?: string
|
|
title?: string
|
|
monoFont?: boolean
|
|
scrollSpyHeader?: boolean // whether or not the header updates the url on scroll
|
|
icon?: string
|
|
}
|
|
|
|
type RefSubLayoutType = {}
|
|
|
|
interface IEducationRow {
|
|
className?: string
|
|
}
|
|
interface IEducationSection {
|
|
id: string
|
|
title?: string
|
|
monoFont?: boolean
|
|
slug: string
|
|
scrollSpyHeader?: boolean
|
|
hideTitle?: boolean
|
|
icon?: string
|
|
}
|
|
interface ISectionDetails {}
|
|
interface ISectionExamples {}
|
|
|
|
const RefSubLayout: FC<PropsWithChildren<RefSubLayoutType>> & RefSubLayoutSubComponents = (
|
|
props
|
|
) => {
|
|
return (
|
|
<div className="flex flex-col w-full divide-y px-5 max-w-7xl mx-auto py-16">
|
|
{props.children}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const Section: FC<PropsWithChildren<ISectionContainer>> = (props) => {
|
|
return (
|
|
<article
|
|
key={props.id + 'section'}
|
|
className={[
|
|
props.singleColumn ? 'prose dark:prose-dark w-full' : 'w-full',
|
|
'py-16 lg:py-32 first:pt-8 last:pb-8',
|
|
].join(' ')}
|
|
>
|
|
<StickyHeader {...props} />
|
|
<div
|
|
className={`ref-container w-full gap-16 ${
|
|
!props.singleColumn ? 'grid lg:grid-cols-2' : 'ref-container--full-width lg:max-w-3xl'
|
|
}`}
|
|
>
|
|
{props.children}
|
|
</div>
|
|
</article>
|
|
)
|
|
}
|
|
|
|
const StickyHeader: FC<StickyHeader> = ({ icon, ...props }) => {
|
|
const router = useRouter()
|
|
|
|
const { setActiveRefItem } = useNavigationMenuContext()
|
|
|
|
// we're serving search bots a different file (/crawlers/[...slug])
|
|
// and need to modify content to suit that
|
|
const isCrawlerPage = router.route.includes('/crawlers/[...slug]')
|
|
|
|
const { ref } = useInView({
|
|
threshold: 1,
|
|
rootMargin: '30% 0% -35% 0px',
|
|
onChange: (inView, entry) => {
|
|
if (inView && window) highlightSelectedNavItem(entry.target.attributes['data-ref-id'].value)
|
|
if (inView && props.scrollSpyHeader) {
|
|
window.history.replaceState(null, '', entry.target.id)
|
|
// if (setActiveRefItem) setActiveRefItem(entry.target.attributes['data-ref-id'].value)
|
|
menuState.setMenuActiveRefId(entry.target.attributes['data-ref-id'].value)
|
|
// router.push(`/reference/javascript/${entry.target.attributes['data-ref-id'].value}`, null, {
|
|
// shallow: true,
|
|
// })
|
|
}
|
|
},
|
|
})
|
|
|
|
return (
|
|
<div className={['flex items-center gap-3 not-prose', icon && 'mb-8'].join(' ')}>
|
|
{icon && (
|
|
<div className="w-8 h-8 bg-brand-300 rounded flex items-center justify-center">
|
|
<Image width={16} height={16} alt={icon} src={`${icon}.svg`} />
|
|
</div>
|
|
)}
|
|
{isCrawlerPage ? (
|
|
<h1>{props.title}</h1>
|
|
) : (
|
|
<h2
|
|
ref={ref}
|
|
id={props.slug}
|
|
data-ref-id={props.id}
|
|
className={[
|
|
'text-2xl font-medium text-scale-1200 scroll-mt-24',
|
|
!icon && 'mb-8',
|
|
props.monoFont && 'font-mono',
|
|
].join(' ')}
|
|
>
|
|
{props.title && <span className="max-w-xl">{props.title}</span>}
|
|
</h2>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const Details: FC<PropsWithChildren<ISectionDetails>> = (props) => {
|
|
return <div className="relative w-full">{props.children}</div>
|
|
}
|
|
|
|
const Examples: FC<PropsWithChildren<ISectionExamples>> = (props) => {
|
|
return (
|
|
<div className="w-full">
|
|
<div className="sticky top-24">{props.children}</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const EducationRow: FC<PropsWithChildren<IEducationRow>> = (props) => {
|
|
return (
|
|
<div className={['grid lg:grid-cols-2 gap-8 lg:gap-16', props.className].join(' ')}>
|
|
{props.children}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const EducationSection: FC<PropsWithChildren<IEducationSection>> = ({
|
|
icon,
|
|
hideTitle = false,
|
|
...props
|
|
}) => {
|
|
return (
|
|
<article
|
|
key={props.id + 'education'}
|
|
className={'prose dark:prose-dark max-w-none py-16 lg:py-32 first:pt-8 last:pb-8'}
|
|
>
|
|
{!hideTitle && <StickyHeader {...props} icon={icon} />}
|
|
{props.children}
|
|
</article>
|
|
)
|
|
}
|
|
|
|
// function based layout
|
|
RefSubLayout.Section = Section
|
|
// education based layout
|
|
RefSubLayout.EducationSection = EducationSection
|
|
RefSubLayout.EducationRow = EducationRow
|
|
// common columns
|
|
RefSubLayout.Details = Details
|
|
RefSubLayout.Examples = Examples
|
|
export default RefSubLayout
|