|
'use client' |
|
import classNames from '@/utils/classnames' |
|
|
|
type IChildrenProps = { |
|
children: React.ReactNode |
|
id?: string |
|
tag?: any |
|
label?: any |
|
anchor: boolean |
|
} |
|
|
|
type IHeaderingProps = { |
|
url: string |
|
method: 'PUT' | 'DELETE' | 'GET' | 'POST' |
|
title: string |
|
name: string |
|
} |
|
|
|
export const Heading = function H2({ |
|
url, |
|
method, |
|
title, |
|
name, |
|
}: IHeaderingProps) { |
|
let style = '' |
|
switch (method) { |
|
case 'PUT': |
|
style = 'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400' |
|
break |
|
case 'DELETE': |
|
style = 'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400' |
|
break |
|
case 'POST': |
|
style = 'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400' |
|
break |
|
default: |
|
style = 'ring-emerald-300 dark:ring-emerald-400/30 bg-emerald-400/10 text-emerald-500 dark:text-emerald-400' |
|
break |
|
} |
|
return ( |
|
<> |
|
<span id={name?.replace(/^#/, '')} className='relative -top-28' /> |
|
<div className="flex items-center gap-x-3" > |
|
<span className={`font-mono text-[0.625rem] font-semibold leading-6 rounded-lg px-1.5 ring-1 ring-inset ${style}`}>{method}</span> |
|
{/* <span className="h-0.5 w-0.5 rounded-full bg-zinc-300 dark:bg-zinc-600"></span> */} |
|
<span className="font-mono text-xs text-zinc-400">{url}</span> |
|
</div> |
|
<h2 className='mt-2 scroll-mt-32'> |
|
<a href={name} className='no-underline group text-inherit hover:text-inherit'>{title}</a> |
|
</h2> |
|
</> |
|
|
|
) |
|
} |
|
|
|
export function Row({ children }: IChildrenProps) { |
|
return ( |
|
<div className="grid items-start grid-cols-1 gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2"> |
|
{children} |
|
</div> |
|
) |
|
} |
|
|
|
type IColProps = IChildrenProps & { |
|
sticky: boolean |
|
} |
|
export function Col({ children, sticky = false }: IColProps) { |
|
return ( |
|
<div |
|
className={classNames( |
|
'[&>:first-child]:mt-0 [&>:last-child]:mb-0', |
|
sticky && 'xl:sticky xl:top-24', |
|
)} |
|
> |
|
{children} |
|
</div> |
|
) |
|
} |
|
|
|
export function Properties({ children }: IChildrenProps) { |
|
return ( |
|
<div className="my-6"> |
|
<ul |
|
role="list" |
|
className="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 dark:divide-white/5" |
|
> |
|
{children} |
|
</ul> |
|
</div> |
|
) |
|
} |
|
|
|
type IProperty = IChildrenProps & { |
|
name: string |
|
type: string |
|
} |
|
export function Property({ name, type, children }: IProperty) { |
|
return ( |
|
<li className="px-0 py-4 m-0 first:pt-0 last:pb-0"> |
|
<dl className="flex flex-wrap items-center m-0 gap-x-3 gap-y-2"> |
|
<dt className="sr-only">Name</dt> |
|
<dd> |
|
<code>{name}</code> |
|
</dd> |
|
<dt className="sr-only">Type</dt> |
|
<dd className="font-mono text-xs text-zinc-400 dark:text-zinc-500"> |
|
{type} |
|
</dd> |
|
<dt className="sr-only">Description</dt> |
|
<dd className="w-full flex-none [&>:first-child]:mt-0 [&>:last-child]:mb-0"> |
|
{children} |
|
</dd> |
|
</dl> |
|
</li> |
|
) |
|
} |
|
|
|
type ISubProperty = IChildrenProps & { |
|
name: string |
|
type: string |
|
} |
|
export function SubProperty({ name, type, children }: ISubProperty) { |
|
return ( |
|
<li className="px-0 py-1 m-0 last:pb-0"> |
|
<dl className="flex flex-wrap items-center m-0 gap-x-3"> |
|
<dt className="sr-only">Name</dt> |
|
<dd> |
|
<code>{name}</code> |
|
</dd> |
|
<dt className="sr-only">Type</dt> |
|
<dd className="font-mono text-xs text-zinc-400 dark:text-zinc-500"> |
|
{type} |
|
</dd> |
|
<dt className="sr-only">Description</dt> |
|
<dd className="w-full flex-none [&>:first-child]:mt-0 [&>:last-child]:mb-0"> |
|
{children} |
|
</dd> |
|
</dl> |
|
</li> |
|
) |
|
} |
|
|