import { createElement, useMemo } from 'react'
import { useLocation } from 'react-router-dom'
import PrefetchLink from '@/components/PrefetchLink'
import { localiseUIChildren } from '@/components/LocalisedText'
import { cn } from '@/lib/utils'
import type { MDXComponents } from 'mdx/types'
import type { ComponentProps, HTMLAttributes } from 'react'
const MDXLink = (
{ href, children, ...props }: ComponentProps<'a'>,
) => {
const location = useLocation ()
const url = useMemo (() => {
try
{
const base = new URL (location.pathname + location.search, window.location.origin)
return href ? new URL (href, base) : null
}
catch
{
return null
}
}, [href, location.pathname, location.search])
const internal = url != null
&& url.origin === window.location.origin
&& (url.protocol === 'http:' || url.protocol === 'https:')
const anchor = href?.startsWith ('#')
|| (url?.pathname === location.pathname
&& url.search === location.search && Boolean (url.hash))
const external = url != null && !(internal)
&& (url.protocol === 'http:' || url.protocol === 'https:')
if (internal && !(anchor) && props.download == null)
{
return (
{children}
)
}
return (
{children}
)
}
export const useMDXComponents = (): MDXComponents => ({ a: MDXLink })
const ainuElement = (element: string) => {
const AinuElement = ({ children, className, ...props }: HTMLAttributes) =>
createElement (element,
{ ...props, lang: 'ain-Kana', className: cn ('ainu-ui-text', className) },
localiseUIChildren (children, 'ain-Kana'))
return AinuElement
}
// Opt in only for authored Ainu UI documents, never user-supplied Markdown.
export const ainuMDXComponents: MDXComponents = {
p: ainuElement ('p'),
h1: ainuElement ('h1'),
h2: ainuElement ('h2'),
h3: ainuElement ('h3'),
h4: ainuElement ('h4'),
h5: ainuElement ('h5'),
h6: ainuElement ('h6'),
li: ainuElement ('li'),
dt: ainuElement ('dt'),
dd: ainuElement ('dd'),
th: ainuElement ('th'),
td: ainuElement ('td') }