@clarify-labs/renderer 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# @clarify-labs/renderer
|
|
2
|
+
|
|
3
|
+
Clarify renderer package.
|
|
4
|
+
|
|
5
|
+
This package contains the shared rendering logic used by Clarify documentation sites, including MDX rendering, UI components, and API reference layouts.
|
|
6
|
+
|
|
7
|
+
For official documentation and integration guidance, visit:
|
|
8
|
+
|
|
9
|
+
https://clarify.pub
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppShell-D3FsVHQK.js","names":[],"sources":["../source/app/BuiltWithClarify.tsx","../source/app/PageFooter.tsx","../source/app/PageNavigation.tsx","../source/app/PageSkeleton.tsx","../source/app/AppShell.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react'\n\nimport { useBuiltInText } from '../core/i18n'\n\nfunction ClarifyMark(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 279 200\" aria-hidden=\"true\" {...props}>\n <path d=\"M44.867217 0.00543761C130.715579 1.00591567 200 70.9091172 200 156.994562L199.986321 155.127494C199.384888 180.009127 179.026368 199.994562 154 199.994562H46C20.5949015 199.994562 0 179.399661 0 153.994562V45.9945624C0 21.0975659 19.7793434 0.820282524 44.4815926 0.0191499894Z\" fill=\"#00D492\" />\n <path d=\"M123.867217 0.00543761C209.715579 1.00591567 279 70.9091172 279 156.994562L278.986321 155.127494C278.384888 180.009127 258.026368 199.994562 233 199.994562H125C99.5949015 199.994562 79 179.399661 79 153.994562V45.9945624C79 21.0975659 98.7793434 0.820282524 123.481593 0.0191499894Z\" fill=\"#00F6C9\" fillOpacity=\"0.6\" transform=\"rotate(-90 179 100)\" />\n <path d=\"M199.979267 154.416906L199.984438 155.157125L199.962366 155.872459C198.977251 180.406837 178.776104 199.994562 154 199.994562L124.372438 199.994125L124.249053 199.994081C99.6939678 199.603921 79.8122712 179.973634 79.01915 155.518407L79.0054376 155.132783C79.5830823 105.566626 103.129768 61.5221348 139.498462 33.1463428C175.69419 61.3871018 199.186123 105.143863 199.979267 154.416906Z\" fill=\"#00F692\" />\n </svg>\n )\n}\n\nexport function BuiltWithClarify() {\n const t = useBuiltInText()\n\n return (\n <a\n href=\"https://clarify.pub\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={t('builtWith.label')}\n className=\"clarify-built-with inline-flex items-center gap-1.5 rounded-full px-2 py-1 font-medium no-underline transition\"\n >\n <span>{t('builtWith.prefix')}</span>\n <ClarifyMark className=\"clarify-built-with-logo h-3.5 w-5 flex-none\" />\n <span className=\"clarify-built-with-brand font-semibold\">Clarify</span>\n </a>\n )\n}\n","import clsx from 'clsx'\nimport { Link, useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig } from '../core/context'\nimport type { ClarifyConfig, ClarifyLocalizedText, ClarifyNavbarLink } from '../core/types'\nimport { isExternalHref, localizeHref } from '../utils/href'\n\nimport { BuiltWithClarify } from './BuiltWithClarify'\n\nfunction resolveLocalizedText(text: ClarifyLocalizedText, locale?: string, fallbackLocale?: string): string {\n if (typeof text === 'string') return text\n return (locale ? text[locale] : undefined) ?? (fallbackLocale ? text[fallbackLocale] : undefined) ?? Object.values(text)[0] ?? ''\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string): string | undefined {\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\ntype FooterLinkProps = { link: ClarifyNavbarLink; locale?: string; config: ClarifyConfig }\n\nfunction FooterLink(arg0: FooterLinkProps) {\n const { link, locale, config } = arg0\n const external = link.external ?? isExternalHref(link.href)\n const href = external ? link.href : localizeHref(link.href, config, locale)\n const className = \"clarify-footer-link no-underline transition\"\n const label = resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)\n\n if (external) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={className}>\n {label}\n </a>\n )\n }\n\n return (\n <Link to={href} className={className}>\n {label}\n </Link>\n )\n}\n\ntype SocialLinkProps = { name: string; href: string }\n\nfunction SocialLink(arg0: SocialLinkProps) {\n const { name, href } = arg0\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-footer-social capitalize no-underline transition\"\n >\n {name}\n </a>\n )\n}\n\nexport function PageFooter() {\n const config = useClarifyConfig()\n const location = useLocation()\n const locale = localeForPath(config, location.pathname)\n const footer = config.footer\n const links = footer?.links ?? []\n const socials = Object.entries(footer?.socials ?? {})\n const copyright = footer?.copyright\n ? resolveLocalizedText(footer.copyright, locale, config.i18n?.defaultLocale)\n : undefined\n const hasCustomFooter = Boolean(copyright || links.length > 0 || socials.length > 0)\n\n return (\n <footer\n className={clsx(\n 'clarify-page-footer mx-auto mt-16 flex w-full max-w-(--clarify-theme-layout-max-width) flex-col items-end gap-4 border-t border-(--clarify-theme-tokens-colors-border) px-4 py-8 sm:px-6 lg:mt-24 lg:px-5 dark:border-white/10',\n hasCustomFooter && 'sm:flex-row sm:items-center sm:justify-between',\n )}\n >\n {hasCustomFooter ? (\n <div className=\"clarify-footer-content flex flex-col gap-3 text-right sm:text-left\">\n {copyright ? (\n <p className=\"clarify-footer-copyright m-0\">{copyright}</p>\n ) : null}\n {links.length > 0 || socials.length > 0 ? (\n <div className=\"clarify-footer-links flex flex-wrap justify-end gap-x-4 gap-y-2 sm:justify-start\">\n {links.map((link) => (\n <FooterLink key={`${link.href}-${resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)}`} link={link} locale={locale} config={config} />\n ))}\n {socials.map(([name, href]) => (\n <SocialLink key={name} name={name} href={href} />\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"clarify-footer-brand flex justify-end\">\n <BuiltWithClarify />\n </div>\n </footer>\n )\n}\n","import clsx from 'clsx'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from 'react-router-dom'\n\nimport { useBuiltInText } from '../core/i18n'\nimport type { NavigationNode, RouteItem } from '../core/types'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nfunction flattenNavigation(nodes: NavigationNode[]): NavigationNode[] {\n return nodes.flatMap((node) => node.children?.length ? flattenNavigation(node.children) : [node])\n}\n\ntype PageNavigationProps = { navigation: NavigationNode[]; currentRoute?: RouteItem }\n\nexport function PageNavigation(arg0: PageNavigationProps) {\n const { navigation, currentRoute } = arg0\n const t = useBuiltInText()\n if (!currentRoute) return null\n\n const pageRoutes = flattenNavigation(navigation)\n const currentIndex = pageRoutes.findIndex((route) => isSameRoutePath(route.path, currentRoute.path))\n if (currentIndex === -1) return null\n\n const previous = pageRoutes[currentIndex - 1]\n const next = pageRoutes[currentIndex + 1]\n if (!previous && !next) return null\n\n return (\n <nav className=\"clarify-page-navigation mt-6 grid gap-3 @3xl:grid-cols-2\" aria-label={t('navigation.previousNext')}>\n <PageNavigationLink direction=\"previous\" route={previous} />\n <PageNavigationLink direction=\"next\" route={next} />\n </nav>\n )\n}\n\ntype PageNavigationLinkProps = { direction: 'previous' | 'next'; route?: NavigationNode }\n\nfunction PageNavigationLink(arg0: PageNavigationLinkProps) {\n const { direction, route } = arg0\n const t = useBuiltInText()\n if (!route) return <div className=\"hidden @3xl:block\" />\n\n const isNext = direction === 'next'\n\n return (\n <Link\n to={normalizeRoutePath(route.path)}\n className={clsx(\n 'group flex min-w-0 items-center gap-3 rounded-lg border border-(--clarify-theme-tokens-colors-border) px-4 py-3 no-underline transition hover:border-(--clarify-theme-tokens-colors-primary) hover:bg-(--clarify-theme-tokens-colors-surface) dark:border-white/10 dark:hover:border-(--clarify-theme-tokens-colors-primary) dark:hover:bg-white/2.5',\n isNext && '@3xl:justify-end @3xl:text-right',\n )}\n >\n {!isNext ? <ChevronLeft className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n <span className=\"min-w-0 flex-1\">\n <span className=\"clarify-page-navigation-label block font-medium uppercase tracking-wide text-(--clarify-theme-tokens-colors-muted)\">{isNext ? t('navigation.next') : t('navigation.previous')}</span>\n <span className=\"clarify-page-navigation-title mt-0.5 block truncate font-semibold text-(--clarify-theme-tokens-colors-foreground) dark:text-white\">{route.title}</span>\n </span>\n {isNext ? <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n </Link>\n )\n}\n","import { Fragment } from 'react'\n\nexport function PageSkeleton() {\n return (\n <div className=\"clarify-page-skeleton animate-pulse space-y-8 py-8\">\n <div className=\"h-11 w-full max-w-[24rem] rounded-3xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"space-y-6\">\n <div className=\"h-7 w-full max-w-[28rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-7 w-full max-w-[22rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"space-y-5\">\n {Array.from({ length: 3 }).map((_, index) => (\n <Fragment key={index}>\n <div className=\"h-5 w-full max-w-[18rem] rounded-full bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-32 rounded-[1.5rem] bg-zinc-200 dark:bg-zinc-800\" />\n </Fragment>\n ))}\n </div>\n </div>\n )\n}\n","import clsx from 'clsx'\nimport { motion } from 'framer-motion'\nimport { Suspense, lazy, useEffect, useMemo } from 'react'\nimport type { CSSProperties, ComponentType } from 'react'\nimport { Routes, Route, useLocation } from 'react-router-dom'\n\nimport { ClarifyLocaleContext } from '../context'\nimport { ContentActions, Header, Navigation } from '../shell'\nimport type { RouteItem, ClarifyConfig, NavigationNode, NavigationTab, NavigationTree, TabbedNavigation } from '../types'\nimport { safeDecodeURIComponent } from '../utils/hash'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nimport { PageFooter } from './PageFooter'\nimport { PageNavigation } from './PageNavigation'\nimport { PageSkeleton } from './PageSkeleton'\nimport { SectionProvider, type Section } from './SectionProvider'\n\nexport type AppShellProps = {\n config: ClarifyConfig\n routes: RouteItem[]\n navigation: NavigationTree\n}\n\ntype ThemeCssVariables = CSSProperties & Record<`--clarify-theme-${string}`, string>\n\nfunction routeForPath(routes: RouteItem[], pathname: string): RouteItem | undefined {\n return routes.find((route) => isSameRoutePath(route.path, pathname))\n}\n\nfunction sectionsForRoute(route?: RouteItem): Section[] {\n return (\n route?.sections?.map((section) => ({\n id: section.id,\n title: section.title,\n badge: section.badge,\n tags: section.tags,\n })) ?? []\n )\n}\n\nfunction resolveRouteComponent(route: RouteItem): ComponentType {\n if (route.lazy) return lazy(route.component as () => Promise<{ default: ComponentType }>)\n return route.component as ComponentType\n}\n\nfunction scrollToHash(hash: string) {\n if (!hash) return\n\n const targetId = safeDecodeURIComponent(hash.slice(1))\n window.requestAnimationFrame(() => {\n document.getElementById(targetId)?.scrollIntoView()\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n })\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string, route?: RouteItem): string | undefined {\n if (route?.locale) return route.locale\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\nfunction isTabbedNavigation(navigation: NavigationTree): navigation is TabbedNavigation {\n return !Array.isArray(navigation) && 'tabs' in navigation\n}\n\nfunction hasPath(nodes: NavigationNode[], pathname: string): boolean {\n return nodes.some((node) => isSameRoutePath(node.path, pathname) || hasPath(node.children ?? [], pathname))\n}\n\ntype NavigationState = {\n items: NavigationNode[]\n tabs?: NavigationTab[]\n}\n\nfunction navigationFromTabs(navigation: TabbedNavigation, pathname: string): NavigationState {\n const currentTab = navigation.tabs.find((tab) => isSameRoutePath(tab.path, pathname) || hasPath(tab.children, pathname))\n return {\n items: currentTab?.children ?? navigation.tabs[0]?.children ?? [],\n tabs: navigation.tabs,\n }\n}\n\nfunction navigationForLocale(navigation: NavigationTree, locale: string | undefined, pathname: string): NavigationState {\n if (Array.isArray(navigation)) return { items: navigation }\n if (isTabbedNavigation(navigation)) return navigationFromTabs(navigation, pathname)\n if (!locale) return { items: [] }\n\n const localizedNavigation = navigation[locale]\n if (!localizedNavigation) return { items: [] }\n return Array.isArray(localizedNavigation) ? { items: localizedNavigation } : navigationFromTabs(localizedNavigation, pathname)\n}\n\nfunction themeStyle(config: ClarifyConfig): ThemeCssVariables {\n const { colors, radius } = config.theme.tokens\n const { layout } = config.theme\n\n return {\n '--clarify-theme-tokens-colors-primary': colors.primary,\n '--clarify-theme-tokens-colors-accent': colors.accent,\n '--clarify-theme-tokens-colors-background': colors.background,\n '--clarify-theme-tokens-colors-foreground': colors.foreground,\n '--clarify-theme-tokens-colors-surface': colors.surface,\n '--clarify-theme-tokens-colors-muted': colors.muted,\n '--clarify-theme-tokens-colors-border': colors.border,\n '--clarify-theme-tokens-colors-code-background': colors.codeBackground,\n '--clarify-theme-tokens-radius-sm': radius.sm,\n '--clarify-theme-tokens-radius-md': radius.md,\n '--clarify-theme-tokens-radius-lg': radius.lg,\n '--clarify-theme-tokens-radius-xl': radius.xl,\n '--clarify-theme-layout-max-width': layout.maxWidth,\n }\n}\n\nfunction pageTitle(config: ClarifyConfig, route?: RouteItem): string {\n const routeTitle = route?.title?.trim()\n if (!routeTitle || routeTitle === config.title) return config.title\n return `${routeTitle} - ${config.title}`\n}\n\nfunction setNamedMeta(name: string, content: string | undefined) {\n const existing = document.head.querySelector<HTMLMetaElement>(`meta[name=\"${name}\"]`)\n if (!content) {\n existing?.remove()\n return\n }\n\n const meta = existing ?? document.createElement('meta')\n meta.name = name\n meta.content = content\n if (!existing) document.head.appendChild(meta)\n}\n\nfunction applyDocumentMetadata(config: ClarifyConfig, route?: RouteItem) {\n document.title = pageTitle(config, route)\n setNamedMeta('description', route?.description ?? config.description)\n setNamedMeta('keywords', route?.keywords?.join(', '))\n}\n\nfunction applyRootThemeVariables(themeVariables: ThemeCssVariables): () => void {\n const rootStyle = document.documentElement.style\n\n for (const [property, value] of Object.entries(themeVariables)) {\n rootStyle.setProperty(property, value)\n }\n\n return () => {\n for (const property of Object.keys(themeVariables)) {\n rootStyle.removeProperty(property)\n }\n }\n}\n\nexport function AppShell(arg0: AppShellProps) {\n const { config, routes, navigation } = arg0\n const location = useLocation()\n const pathname = normalizeRoutePath(location.pathname)\n const currentRoute = routeForPath(routes, pathname)\n const currentLocale = localeForPath(config, pathname, currentRoute)\n const currentLocaleConfig = config.i18n?.locales.find((locale) => locale.code === currentLocale)\n const currentNavigation = navigationForLocale(navigation, currentLocale, pathname)\n const sections = useMemo(() => sectionsForRoute(currentRoute), [currentRoute])\n const hasTabs = Boolean(currentNavigation.tabs?.length)\n const themeVariables = useMemo(() => themeStyle(config), [config])\n const renderRoutes = useMemo(\n () => routes.map(route => ({ ...route, component: resolveRouteComponent(route) })),\n [routes],\n )\n\n useEffect(() => applyRootThemeVariables(themeVariables), [themeVariables])\n\n useEffect(() => {\n if (location.hash) {\n scrollToHash(location.hash)\n return\n }\n\n window.scrollTo({ top: 0, left: 0 })\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n }, [location.hash, location.pathname])\n\n useEffect(() => {\n if (!currentLocale) return\n document.documentElement.lang = currentLocale\n if (currentLocaleConfig?.dir) {\n document.documentElement.dir = currentLocaleConfig.dir\n } else {\n document.documentElement.removeAttribute('dir')\n }\n }, [currentLocale, currentLocaleConfig?.dir])\n\n useEffect(() => {\n applyDocumentMetadata(config, currentRoute)\n }, [config, currentRoute])\n\n return (\n <ClarifyLocaleContext.Provider value={currentLocale}>\n <SectionProvider sections={sections}>\n <div\n className=\"clarify-app h-full min-h-screen bg-(--clarify-theme-tokens-colors-background) text-(--clarify-theme-tokens-colors-foreground) dark:bg-zinc-950 dark:text-white\"\n data-theme-preset={config.theme.preset}\n style={themeVariables}\n >\n <Header\n config={config}\n navigation={currentNavigation.items}\n tabs={currentNavigation.tabs}\n routes={routes}\n currentLocale={currentLocale}\n currentRoute={currentRoute}\n />\n <div className=\"clarify-layout mx-auto grid w-full max-w-(--clarify-theme-layout-max-width) grid-cols-1 lg:grid-cols-[18rem_minmax(0,1fr)] xl:grid-cols-[20rem_minmax(0,1fr)]\">\n <aside\n className={clsx(\n 'clarify-sidebar hidden lg:sticky lg:z-30 lg:block lg:h-[calc(100vh-3.5rem)] lg:self-start lg:overflow-y-auto lg:bg-(--clarify-theme-tokens-colors-background) lg:px-5 lg:pb-8 xl:px-6 lg:dark:bg-zinc-950',\n hasTabs ? 'lg:top-28 lg:h-[calc(100vh-7rem)] lg:pt-6' : 'lg:top-14 lg:pt-6',\n )}\n >\n <Navigation navigation={currentNavigation.items} />\n </aside>\n <div className={clsx('clarify-content @container relative flex min-h-screen min-w-0 flex-col px-4 sm:px-6 lg:px-8 xl:px-10', hasTabs ? 'pt-14 lg:pt-28' : 'pt-14')}>\n <ContentActions hasTabs={hasTabs} route={currentRoute} routePrefix={config.routePrefix} />\n <main className=\"clarify-main min-w-0 flex-auto\">\n <Suspense fallback={<PageSkeleton />}>\n <Routes>\n {renderRoutes.map((route) => (\n <Route key={route.path} path={route.path} element={<route.component />} />\n ))}\n </Routes>\n </Suspense>\n </main>\n <PageNavigation navigation={currentNavigation.items} currentRoute={currentRoute} />\n </div>\n </div>\n <PageFooter />\n </div>\n </SectionProvider>\n </ClarifyLocaleContext.Provider>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppShell-D3FsVHQK.js","names":[],"sources":["../source/app/BuiltWithClarify.tsx","../source/app/PageFooter.tsx","../source/app/PageNavigation.tsx","../source/app/PageSkeleton.tsx","../source/app/AppShell.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react'\n\nimport { useBuiltInText } from '../core/i18n'\n\nfunction ClarifyMark(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 279 200\" aria-hidden=\"true\" {...props}>\n <path d=\"M44.867217 0.00543761C130.715579 1.00591567 200 70.9091172 200 156.994562L199.986321 155.127494C199.384888 180.009127 179.026368 199.994562 154 199.994562H46C20.5949015 199.994562 0 179.399661 0 153.994562V45.9945624C0 21.0975659 19.7793434 0.820282524 44.4815926 0.0191499894Z\" fill=\"#00D492\" />\n <path d=\"M123.867217 0.00543761C209.715579 1.00591567 279 70.9091172 279 156.994562L278.986321 155.127494C278.384888 180.009127 258.026368 199.994562 233 199.994562H125C99.5949015 199.994562 79 179.399661 79 153.994562V45.9945624C79 21.0975659 98.7793434 0.820282524 123.481593 0.0191499894Z\" fill=\"#00F6C9\" fillOpacity=\"0.6\" transform=\"rotate(-90 179 100)\" />\n <path d=\"M199.979267 154.416906L199.984438 155.157125L199.962366 155.872459C198.977251 180.406837 178.776104 199.994562 154 199.994562L124.372438 199.994125L124.249053 199.994081C99.6939678 199.603921 79.8122712 179.973634 79.01915 155.518407L79.0054376 155.132783C79.5830823 105.566626 103.129768 61.5221348 139.498462 33.1463428C175.69419 61.3871018 199.186123 105.143863 199.979267 154.416906Z\" fill=\"#00F692\" />\n </svg>\n )\n}\n\nexport function BuiltWithClarify() {\n const t = useBuiltInText()\n\n return (\n <a\n href=\"https://clarify.pub\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={t('builtWith.label')}\n className=\"clarify-built-with inline-flex items-center gap-1.5 rounded-full px-2 py-1 font-medium no-underline transition\"\n >\n <span>{t('builtWith.prefix')}</span>\n <ClarifyMark className=\"clarify-built-with-logo h-3.5 w-5 flex-none\" />\n <span className=\"clarify-built-with-brand font-semibold\">Clarify</span>\n </a>\n )\n}\n","import clsx from 'clsx'\nimport { Link, useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig } from '../core/context'\nimport type { ClarifyConfig, ClarifyLocalizedText, ClarifyNavbarLink } from '../core/types'\nimport { isExternalHref, localizeHref } from '../utils/href'\n\nimport { BuiltWithClarify } from './BuiltWithClarify'\n\nfunction resolveLocalizedText(text: ClarifyLocalizedText, locale?: string, fallbackLocale?: string): string {\n if (typeof text === 'string') return text\n return (locale ? text[locale] : undefined) ?? (fallbackLocale ? text[fallbackLocale] : undefined) ?? Object.values(text)[0] ?? ''\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string): string | undefined {\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\ntype FooterLinkProps = { link: ClarifyNavbarLink; locale?: string; config: ClarifyConfig }\n\nfunction FooterLink(arg0: FooterLinkProps) {\n const { link, locale, config } = arg0\n const external = link.external ?? isExternalHref(link.href)\n const href = external ? link.href : localizeHref(link.href, config, locale)\n const className = \"clarify-footer-link no-underline transition\"\n const label = resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)\n\n if (external) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={className}>\n {label}\n </a>\n )\n }\n\n return (\n <Link to={href} className={className}>\n {label}\n </Link>\n )\n}\n\ntype SocialLinkProps = { name: string; href: string }\n\nfunction SocialLink(arg0: SocialLinkProps) {\n const { name, href } = arg0\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-footer-social capitalize no-underline transition\"\n >\n {name}\n </a>\n )\n}\n\nexport function PageFooter() {\n const config = useClarifyConfig()\n const location = useLocation()\n const locale = localeForPath(config, location.pathname)\n const footer = config.footer\n const links = footer?.links ?? []\n const socials = Object.entries(footer?.socials ?? {})\n const copyright = footer?.copyright\n ? resolveLocalizedText(footer.copyright, locale, config.i18n?.defaultLocale)\n : undefined\n const hasCustomFooter = Boolean(copyright || links.length > 0 || socials.length > 0)\n\n return (\n <footer\n className={clsx(\n 'clarify-page-footer mx-auto mt-16 flex w-full max-w-(--clarify-theme-layout-max-width) flex-col items-end gap-4 border-t border-(--clarify-theme-tokens-colors-border) px-4 py-8 sm:px-6 lg:mt-24 lg:px-5 dark:border-white/10',\n hasCustomFooter && 'sm:flex-row sm:items-center sm:justify-between',\n )}\n >\n {hasCustomFooter ? (\n <div className=\"clarify-footer-content flex flex-col gap-3 text-right sm:text-left\">\n {copyright ? (\n <p className=\"clarify-footer-copyright m-0\">{copyright}</p>\n ) : null}\n {links.length > 0 || socials.length > 0 ? (\n <div className=\"clarify-footer-links flex flex-wrap justify-end gap-x-4 gap-y-2 sm:justify-start\">\n {links.map((link) => (\n <FooterLink key={`${link.href}-${resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)}`} link={link} locale={locale} config={config} />\n ))}\n {socials.map(([name, href]) => (\n <SocialLink key={name} name={name} href={href} />\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"clarify-footer-brand flex justify-end\">\n <BuiltWithClarify />\n </div>\n </footer>\n )\n}\n","import clsx from 'clsx'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from 'react-router-dom'\n\nimport { useBuiltInText } from '../core/i18n'\nimport type { NavigationNode, RouteItem } from '../core/types'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nfunction flattenNavigation(nodes: NavigationNode[]): NavigationNode[] {\n return nodes.flatMap((node) => node.children?.length ? flattenNavigation(node.children) : [node])\n}\n\ntype PageNavigationProps = { navigation: NavigationNode[]; currentRoute?: RouteItem }\n\nexport function PageNavigation(arg0: PageNavigationProps) {\n const { navigation, currentRoute } = arg0\n const t = useBuiltInText()\n if (!currentRoute) return null\n\n const pageRoutes = flattenNavigation(navigation)\n const currentIndex = pageRoutes.findIndex((route) => isSameRoutePath(route.path, currentRoute.path))\n if (currentIndex === -1) return null\n\n const previous = pageRoutes[currentIndex - 1]\n const next = pageRoutes[currentIndex + 1]\n if (!previous && !next) return null\n\n return (\n <nav className=\"clarify-page-navigation mt-6 grid gap-3 @3xl:grid-cols-2\" aria-label={t('navigation.previousNext')}>\n <PageNavigationLink direction=\"previous\" route={previous} />\n <PageNavigationLink direction=\"next\" route={next} />\n </nav>\n )\n}\n\ntype PageNavigationLinkProps = { direction: 'previous' | 'next'; route?: NavigationNode }\n\nfunction PageNavigationLink(arg0: PageNavigationLinkProps) {\n const { direction, route } = arg0\n const t = useBuiltInText()\n if (!route) return <div className=\"hidden @3xl:block\" />\n\n const isNext = direction === 'next'\n\n return (\n <Link\n to={normalizeRoutePath(route.path)}\n className={clsx(\n 'group flex min-w-0 items-center gap-3 rounded-lg border border-(--clarify-theme-tokens-colors-border) px-4 py-3 no-underline transition hover:border-(--clarify-theme-tokens-colors-primary) hover:bg-(--clarify-theme-tokens-colors-surface) dark:border-white/10 dark:hover:border-(--clarify-theme-tokens-colors-primary) dark:hover:bg-white/2.5',\n isNext && '@3xl:justify-end @3xl:text-right',\n )}\n >\n {!isNext ? <ChevronLeft className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n <span className=\"min-w-0 flex-1\">\n <span className=\"clarify-page-navigation-label block font-medium uppercase tracking-wide text-(--clarify-theme-tokens-colors-muted)\">{isNext ? t('navigation.next') : t('navigation.previous')}</span>\n <span className=\"clarify-page-navigation-title mt-0.5 block truncate font-semibold text-(--clarify-theme-tokens-colors-foreground) dark:text-white\">{route.title}</span>\n </span>\n {isNext ? <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n </Link>\n )\n}\n","import { Fragment } from 'react'\n\nexport function PageSkeleton() {\n return (\n <div className=\"clarify-page-skeleton animate-pulse space-y-8 py-8\">\n <div className=\"h-11 w-full max-w-[24rem] rounded-3xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"space-y-6\">\n <div className=\"h-7 w-full max-w-[28rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-7 w-full max-w-[22rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"space-y-5\">\n {Array.from({ length: 3 }).map((_, index) => (\n <Fragment key={index}>\n <div className=\"h-5 w-full max-w-[18rem] rounded-full bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-32 rounded-[1.5rem] bg-zinc-200 dark:bg-zinc-800\" />\n </Fragment>\n ))}\n </div>\n </div>\n )\n}\n","import clsx from 'clsx'\nimport { Suspense, lazy, useEffect, useMemo } from 'react'\nimport type { CSSProperties, ComponentType } from 'react'\nimport { Routes, Route, useLocation } from 'react-router-dom'\n\nimport { ClarifyLocaleContext } from '../context'\nimport { ContentActions, Header, Navigation } from '../shell'\nimport type { RouteItem, ClarifyConfig, NavigationNode, NavigationTab, NavigationTree, TabbedNavigation } from '../types'\nimport { safeDecodeURIComponent } from '../utils/hash'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nimport { PageFooter } from './PageFooter'\nimport { PageNavigation } from './PageNavigation'\nimport { PageSkeleton } from './PageSkeleton'\nimport { SectionProvider, type Section } from './SectionProvider'\n\nexport type AppShellProps = {\n config: ClarifyConfig\n routes: RouteItem[]\n navigation: NavigationTree\n}\n\ntype ThemeCssVariables = CSSProperties & Record<`--clarify-theme-${string}`, string>\n\nfunction routeForPath(routes: RouteItem[], pathname: string): RouteItem | undefined {\n return routes.find((route) => isSameRoutePath(route.path, pathname))\n}\n\nfunction sectionsForRoute(route?: RouteItem): Section[] {\n return (\n route?.sections?.map((section) => ({\n id: section.id,\n title: section.title,\n badge: section.badge,\n tags: section.tags,\n })) ?? []\n )\n}\n\nfunction resolveRouteComponent(route: RouteItem): ComponentType {\n if (route.lazy) return lazy(route.component as () => Promise<{ default: ComponentType }>)\n return route.component as ComponentType\n}\n\nfunction scrollToHash(hash: string) {\n if (!hash) return\n\n const targetId = safeDecodeURIComponent(hash.slice(1))\n window.requestAnimationFrame(() => {\n document.getElementById(targetId)?.scrollIntoView()\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n })\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string, route?: RouteItem): string | undefined {\n if (route?.locale) return route.locale\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\nfunction isTabbedNavigation(navigation: NavigationTree): navigation is TabbedNavigation {\n return !Array.isArray(navigation) && 'tabs' in navigation\n}\n\nfunction hasPath(nodes: NavigationNode[], pathname: string): boolean {\n return nodes.some((node) => isSameRoutePath(node.path, pathname) || hasPath(node.children ?? [], pathname))\n}\n\ntype NavigationState = {\n items: NavigationNode[]\n tabs?: NavigationTab[]\n}\n\nfunction navigationFromTabs(navigation: TabbedNavigation, pathname: string): NavigationState {\n const currentTab = navigation.tabs.find((tab) => isSameRoutePath(tab.path, pathname) || hasPath(tab.children, pathname))\n return {\n items: currentTab?.children ?? navigation.tabs[0]?.children ?? [],\n tabs: navigation.tabs,\n }\n}\n\nfunction navigationForLocale(navigation: NavigationTree, locale: string | undefined, pathname: string): NavigationState {\n if (Array.isArray(navigation)) return { items: navigation }\n if (isTabbedNavigation(navigation)) return navigationFromTabs(navigation, pathname)\n if (!locale) return { items: [] }\n\n const localizedNavigation = navigation[locale]\n if (!localizedNavigation) return { items: [] }\n return Array.isArray(localizedNavigation) ? { items: localizedNavigation } : navigationFromTabs(localizedNavigation, pathname)\n}\n\nfunction themeStyle(config: ClarifyConfig): ThemeCssVariables {\n const { colors, radius } = config.theme.tokens\n const { layout } = config.theme\n\n return {\n '--clarify-theme-tokens-colors-primary': colors.primary,\n '--clarify-theme-tokens-colors-accent': colors.accent,\n '--clarify-theme-tokens-colors-background': colors.background,\n '--clarify-theme-tokens-colors-foreground': colors.foreground,\n '--clarify-theme-tokens-colors-surface': colors.surface,\n '--clarify-theme-tokens-colors-muted': colors.muted,\n '--clarify-theme-tokens-colors-border': colors.border,\n '--clarify-theme-tokens-colors-code-background': colors.codeBackground,\n '--clarify-theme-tokens-radius-sm': radius.sm,\n '--clarify-theme-tokens-radius-md': radius.md,\n '--clarify-theme-tokens-radius-lg': radius.lg,\n '--clarify-theme-tokens-radius-xl': radius.xl,\n '--clarify-theme-layout-max-width': layout.maxWidth,\n }\n}\n\nfunction pageTitle(config: ClarifyConfig, route?: RouteItem): string {\n const routeTitle = route?.title?.trim()\n if (!routeTitle || routeTitle === config.title) return config.title\n return `${routeTitle} - ${config.title}`\n}\n\nfunction setNamedMeta(name: string, content: string | undefined) {\n const existing = document.head.querySelector<HTMLMetaElement>(`meta[name=\"${name}\"]`)\n if (!content) {\n existing?.remove()\n return\n }\n\n const meta = existing ?? document.createElement('meta')\n meta.name = name\n meta.content = content\n if (!existing) document.head.appendChild(meta)\n}\n\nfunction applyDocumentMetadata(config: ClarifyConfig, route?: RouteItem) {\n document.title = pageTitle(config, route)\n setNamedMeta('description', route?.description ?? config.description)\n setNamedMeta('keywords', route?.keywords?.join(', '))\n}\n\nfunction applyRootThemeVariables(themeVariables: ThemeCssVariables): () => void {\n const rootStyle = document.documentElement.style\n\n for (const [property, value] of Object.entries(themeVariables)) {\n rootStyle.setProperty(property, value)\n }\n\n return () => {\n for (const property of Object.keys(themeVariables)) {\n rootStyle.removeProperty(property)\n }\n }\n}\n\nexport function AppShell(arg0: AppShellProps) {\n const { config, routes, navigation } = arg0\n const location = useLocation()\n const pathname = normalizeRoutePath(location.pathname)\n const currentRoute = routeForPath(routes, pathname)\n const currentLocale = localeForPath(config, pathname, currentRoute)\n const currentLocaleConfig = config.i18n?.locales.find((locale) => locale.code === currentLocale)\n const currentNavigation = navigationForLocale(navigation, currentLocale, pathname)\n const sections = useMemo(() => sectionsForRoute(currentRoute), [currentRoute])\n const hasTabs = Boolean(currentNavigation.tabs?.length)\n const themeVariables = useMemo(() => themeStyle(config), [config])\n const renderRoutes = useMemo(\n () => routes.map(route => ({ ...route, component: resolveRouteComponent(route) })),\n [routes],\n )\n\n useEffect(() => applyRootThemeVariables(themeVariables), [themeVariables])\n\n useEffect(() => {\n if (location.hash) {\n scrollToHash(location.hash)\n return\n }\n\n window.scrollTo({ top: 0, left: 0 })\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n }, [location.hash, location.pathname])\n\n useEffect(() => {\n if (!currentLocale) return\n document.documentElement.lang = currentLocale\n if (currentLocaleConfig?.dir) {\n document.documentElement.dir = currentLocaleConfig.dir\n } else {\n document.documentElement.removeAttribute('dir')\n }\n }, [currentLocale, currentLocaleConfig?.dir])\n\n useEffect(() => {\n applyDocumentMetadata(config, currentRoute)\n }, [config, currentRoute])\n\n return (\n <ClarifyLocaleContext.Provider value={currentLocale}>\n <SectionProvider sections={sections}>\n <div\n className=\"clarify-app h-full min-h-screen bg-(--clarify-theme-tokens-colors-background) text-(--clarify-theme-tokens-colors-foreground) dark:bg-zinc-950 dark:text-white\"\n data-theme-preset={config.theme.preset}\n style={themeVariables}\n >\n <Header\n config={config}\n navigation={currentNavigation.items}\n tabs={currentNavigation.tabs}\n routes={routes}\n currentLocale={currentLocale}\n currentRoute={currentRoute}\n />\n <div className=\"clarify-layout mx-auto grid w-full max-w-(--clarify-theme-layout-max-width) grid-cols-1 lg:grid-cols-[18rem_minmax(0,1fr)] xl:grid-cols-[20rem_minmax(0,1fr)]\">\n <aside\n className={clsx(\n 'clarify-sidebar hidden lg:sticky lg:z-30 lg:block lg:h-[calc(100vh-3.5rem)] lg:self-start lg:overflow-y-auto lg:bg-(--clarify-theme-tokens-colors-background) lg:px-5 lg:pb-8 xl:px-6 lg:dark:bg-zinc-950',\n hasTabs ? 'lg:top-28 lg:h-[calc(100vh-7rem)] lg:pt-6' : 'lg:top-14 lg:pt-6',\n )}\n >\n <Navigation navigation={currentNavigation.items} />\n </aside>\n <div className={clsx('clarify-content @container relative flex min-h-screen min-w-0 flex-col px-4 sm:px-6 lg:px-8 xl:px-10', hasTabs ? 'pt-14 lg:pt-28' : 'pt-14')}>\n <ContentActions hasTabs={hasTabs} route={currentRoute} routePrefix={config.routePrefix} />\n <main className=\"clarify-main min-w-0 flex-auto\">\n <Suspense fallback={<PageSkeleton />}>\n <Routes>\n {renderRoutes.map((route) => (\n <Route key={route.path} path={route.path} element={<route.component />} />\n ))}\n </Routes>\n </Suspense>\n </main>\n <PageNavigation navigation={currentNavigation.items} currentRoute={currentRoute} />\n </div>\n </div>\n <PageFooter />\n </div>\n </SectionProvider>\n </ClarifyLocaleContext.Provider>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppShell-DeaJ-rgo.cjs","names":[],"sources":["../source/app/BuiltWithClarify.tsx","../source/app/PageFooter.tsx","../source/app/PageNavigation.tsx","../source/app/PageSkeleton.tsx","../source/app/AppShell.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react'\n\nimport { useBuiltInText } from '../core/i18n'\n\nfunction ClarifyMark(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 279 200\" aria-hidden=\"true\" {...props}>\n <path d=\"M44.867217 0.00543761C130.715579 1.00591567 200 70.9091172 200 156.994562L199.986321 155.127494C199.384888 180.009127 179.026368 199.994562 154 199.994562H46C20.5949015 199.994562 0 179.399661 0 153.994562V45.9945624C0 21.0975659 19.7793434 0.820282524 44.4815926 0.0191499894Z\" fill=\"#00D492\" />\n <path d=\"M123.867217 0.00543761C209.715579 1.00591567 279 70.9091172 279 156.994562L278.986321 155.127494C278.384888 180.009127 258.026368 199.994562 233 199.994562H125C99.5949015 199.994562 79 179.399661 79 153.994562V45.9945624C79 21.0975659 98.7793434 0.820282524 123.481593 0.0191499894Z\" fill=\"#00F6C9\" fillOpacity=\"0.6\" transform=\"rotate(-90 179 100)\" />\n <path d=\"M199.979267 154.416906L199.984438 155.157125L199.962366 155.872459C198.977251 180.406837 178.776104 199.994562 154 199.994562L124.372438 199.994125L124.249053 199.994081C99.6939678 199.603921 79.8122712 179.973634 79.01915 155.518407L79.0054376 155.132783C79.5830823 105.566626 103.129768 61.5221348 139.498462 33.1463428C175.69419 61.3871018 199.186123 105.143863 199.979267 154.416906Z\" fill=\"#00F692\" />\n </svg>\n )\n}\n\nexport function BuiltWithClarify() {\n const t = useBuiltInText()\n\n return (\n <a\n href=\"https://clarify.pub\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={t('builtWith.label')}\n className=\"clarify-built-with inline-flex items-center gap-1.5 rounded-full px-2 py-1 font-medium no-underline transition\"\n >\n <span>{t('builtWith.prefix')}</span>\n <ClarifyMark className=\"clarify-built-with-logo h-3.5 w-5 flex-none\" />\n <span className=\"clarify-built-with-brand font-semibold\">Clarify</span>\n </a>\n )\n}\n","import clsx from 'clsx'\nimport { Link, useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig } from '../core/context'\nimport type { ClarifyConfig, ClarifyLocalizedText, ClarifyNavbarLink } from '../core/types'\nimport { isExternalHref, localizeHref } from '../utils/href'\n\nimport { BuiltWithClarify } from './BuiltWithClarify'\n\nfunction resolveLocalizedText(text: ClarifyLocalizedText, locale?: string, fallbackLocale?: string): string {\n if (typeof text === 'string') return text\n return (locale ? text[locale] : undefined) ?? (fallbackLocale ? text[fallbackLocale] : undefined) ?? Object.values(text)[0] ?? ''\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string): string | undefined {\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\ntype FooterLinkProps = { link: ClarifyNavbarLink; locale?: string; config: ClarifyConfig }\n\nfunction FooterLink(arg0: FooterLinkProps) {\n const { link, locale, config } = arg0\n const external = link.external ?? isExternalHref(link.href)\n const href = external ? link.href : localizeHref(link.href, config, locale)\n const className = \"clarify-footer-link no-underline transition\"\n const label = resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)\n\n if (external) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={className}>\n {label}\n </a>\n )\n }\n\n return (\n <Link to={href} className={className}>\n {label}\n </Link>\n )\n}\n\ntype SocialLinkProps = { name: string; href: string }\n\nfunction SocialLink(arg0: SocialLinkProps) {\n const { name, href } = arg0\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-footer-social capitalize no-underline transition\"\n >\n {name}\n </a>\n )\n}\n\nexport function PageFooter() {\n const config = useClarifyConfig()\n const location = useLocation()\n const locale = localeForPath(config, location.pathname)\n const footer = config.footer\n const links = footer?.links ?? []\n const socials = Object.entries(footer?.socials ?? {})\n const copyright = footer?.copyright\n ? resolveLocalizedText(footer.copyright, locale, config.i18n?.defaultLocale)\n : undefined\n const hasCustomFooter = Boolean(copyright || links.length > 0 || socials.length > 0)\n\n return (\n <footer\n className={clsx(\n 'clarify-page-footer mx-auto mt-16 flex w-full max-w-(--clarify-theme-layout-max-width) flex-col items-end gap-4 border-t border-(--clarify-theme-tokens-colors-border) px-4 py-8 sm:px-6 lg:mt-24 lg:px-5 dark:border-white/10',\n hasCustomFooter && 'sm:flex-row sm:items-center sm:justify-between',\n )}\n >\n {hasCustomFooter ? (\n <div className=\"clarify-footer-content flex flex-col gap-3 text-right sm:text-left\">\n {copyright ? (\n <p className=\"clarify-footer-copyright m-0\">{copyright}</p>\n ) : null}\n {links.length > 0 || socials.length > 0 ? (\n <div className=\"clarify-footer-links flex flex-wrap justify-end gap-x-4 gap-y-2 sm:justify-start\">\n {links.map((link) => (\n <FooterLink key={`${link.href}-${resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)}`} link={link} locale={locale} config={config} />\n ))}\n {socials.map(([name, href]) => (\n <SocialLink key={name} name={name} href={href} />\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"clarify-footer-brand flex justify-end\">\n <BuiltWithClarify />\n </div>\n </footer>\n )\n}\n","import clsx from 'clsx'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from 'react-router-dom'\n\nimport { useBuiltInText } from '../core/i18n'\nimport type { NavigationNode, RouteItem } from '../core/types'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nfunction flattenNavigation(nodes: NavigationNode[]): NavigationNode[] {\n return nodes.flatMap((node) => node.children?.length ? flattenNavigation(node.children) : [node])\n}\n\ntype PageNavigationProps = { navigation: NavigationNode[]; currentRoute?: RouteItem }\n\nexport function PageNavigation(arg0: PageNavigationProps) {\n const { navigation, currentRoute } = arg0\n const t = useBuiltInText()\n if (!currentRoute) return null\n\n const pageRoutes = flattenNavigation(navigation)\n const currentIndex = pageRoutes.findIndex((route) => isSameRoutePath(route.path, currentRoute.path))\n if (currentIndex === -1) return null\n\n const previous = pageRoutes[currentIndex - 1]\n const next = pageRoutes[currentIndex + 1]\n if (!previous && !next) return null\n\n return (\n <nav className=\"clarify-page-navigation mt-6 grid gap-3 @3xl:grid-cols-2\" aria-label={t('navigation.previousNext')}>\n <PageNavigationLink direction=\"previous\" route={previous} />\n <PageNavigationLink direction=\"next\" route={next} />\n </nav>\n )\n}\n\ntype PageNavigationLinkProps = { direction: 'previous' | 'next'; route?: NavigationNode }\n\nfunction PageNavigationLink(arg0: PageNavigationLinkProps) {\n const { direction, route } = arg0\n const t = useBuiltInText()\n if (!route) return <div className=\"hidden @3xl:block\" />\n\n const isNext = direction === 'next'\n\n return (\n <Link\n to={normalizeRoutePath(route.path)}\n className={clsx(\n 'group flex min-w-0 items-center gap-3 rounded-lg border border-(--clarify-theme-tokens-colors-border) px-4 py-3 no-underline transition hover:border-(--clarify-theme-tokens-colors-primary) hover:bg-(--clarify-theme-tokens-colors-surface) dark:border-white/10 dark:hover:border-(--clarify-theme-tokens-colors-primary) dark:hover:bg-white/2.5',\n isNext && '@3xl:justify-end @3xl:text-right',\n )}\n >\n {!isNext ? <ChevronLeft className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n <span className=\"min-w-0 flex-1\">\n <span className=\"clarify-page-navigation-label block font-medium uppercase tracking-wide text-(--clarify-theme-tokens-colors-muted)\">{isNext ? t('navigation.next') : t('navigation.previous')}</span>\n <span className=\"clarify-page-navigation-title mt-0.5 block truncate font-semibold text-(--clarify-theme-tokens-colors-foreground) dark:text-white\">{route.title}</span>\n </span>\n {isNext ? <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n </Link>\n )\n}\n","import { Fragment } from 'react'\n\nexport function PageSkeleton() {\n return (\n <div className=\"clarify-page-skeleton animate-pulse space-y-8 py-8\">\n <div className=\"h-11 w-full max-w-[24rem] rounded-3xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"space-y-6\">\n <div className=\"h-7 w-full max-w-[28rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-7 w-full max-w-[22rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"space-y-5\">\n {Array.from({ length: 3 }).map((_, index) => (\n <Fragment key={index}>\n <div className=\"h-5 w-full max-w-[18rem] rounded-full bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-32 rounded-[1.5rem] bg-zinc-200 dark:bg-zinc-800\" />\n </Fragment>\n ))}\n </div>\n </div>\n )\n}\n","import clsx from 'clsx'\nimport { motion } from 'framer-motion'\nimport { Suspense, lazy, useEffect, useMemo } from 'react'\nimport type { CSSProperties, ComponentType } from 'react'\nimport { Routes, Route, useLocation } from 'react-router-dom'\n\nimport { ClarifyLocaleContext } from '../context'\nimport { ContentActions, Header, Navigation } from '../shell'\nimport type { RouteItem, ClarifyConfig, NavigationNode, NavigationTab, NavigationTree, TabbedNavigation } from '../types'\nimport { safeDecodeURIComponent } from '../utils/hash'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nimport { PageFooter } from './PageFooter'\nimport { PageNavigation } from './PageNavigation'\nimport { PageSkeleton } from './PageSkeleton'\nimport { SectionProvider, type Section } from './SectionProvider'\n\nexport type AppShellProps = {\n config: ClarifyConfig\n routes: RouteItem[]\n navigation: NavigationTree\n}\n\ntype ThemeCssVariables = CSSProperties & Record<`--clarify-theme-${string}`, string>\n\nfunction routeForPath(routes: RouteItem[], pathname: string): RouteItem | undefined {\n return routes.find((route) => isSameRoutePath(route.path, pathname))\n}\n\nfunction sectionsForRoute(route?: RouteItem): Section[] {\n return (\n route?.sections?.map((section) => ({\n id: section.id,\n title: section.title,\n badge: section.badge,\n tags: section.tags,\n })) ?? []\n )\n}\n\nfunction resolveRouteComponent(route: RouteItem): ComponentType {\n if (route.lazy) return lazy(route.component as () => Promise<{ default: ComponentType }>)\n return route.component as ComponentType\n}\n\nfunction scrollToHash(hash: string) {\n if (!hash) return\n\n const targetId = safeDecodeURIComponent(hash.slice(1))\n window.requestAnimationFrame(() => {\n document.getElementById(targetId)?.scrollIntoView()\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n })\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string, route?: RouteItem): string | undefined {\n if (route?.locale) return route.locale\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\nfunction isTabbedNavigation(navigation: NavigationTree): navigation is TabbedNavigation {\n return !Array.isArray(navigation) && 'tabs' in navigation\n}\n\nfunction hasPath(nodes: NavigationNode[], pathname: string): boolean {\n return nodes.some((node) => isSameRoutePath(node.path, pathname) || hasPath(node.children ?? [], pathname))\n}\n\ntype NavigationState = {\n items: NavigationNode[]\n tabs?: NavigationTab[]\n}\n\nfunction navigationFromTabs(navigation: TabbedNavigation, pathname: string): NavigationState {\n const currentTab = navigation.tabs.find((tab) => isSameRoutePath(tab.path, pathname) || hasPath(tab.children, pathname))\n return {\n items: currentTab?.children ?? navigation.tabs[0]?.children ?? [],\n tabs: navigation.tabs,\n }\n}\n\nfunction navigationForLocale(navigation: NavigationTree, locale: string | undefined, pathname: string): NavigationState {\n if (Array.isArray(navigation)) return { items: navigation }\n if (isTabbedNavigation(navigation)) return navigationFromTabs(navigation, pathname)\n if (!locale) return { items: [] }\n\n const localizedNavigation = navigation[locale]\n if (!localizedNavigation) return { items: [] }\n return Array.isArray(localizedNavigation) ? { items: localizedNavigation } : navigationFromTabs(localizedNavigation, pathname)\n}\n\nfunction themeStyle(config: ClarifyConfig): ThemeCssVariables {\n const { colors, radius } = config.theme.tokens\n const { layout } = config.theme\n\n return {\n '--clarify-theme-tokens-colors-primary': colors.primary,\n '--clarify-theme-tokens-colors-accent': colors.accent,\n '--clarify-theme-tokens-colors-background': colors.background,\n '--clarify-theme-tokens-colors-foreground': colors.foreground,\n '--clarify-theme-tokens-colors-surface': colors.surface,\n '--clarify-theme-tokens-colors-muted': colors.muted,\n '--clarify-theme-tokens-colors-border': colors.border,\n '--clarify-theme-tokens-colors-code-background': colors.codeBackground,\n '--clarify-theme-tokens-radius-sm': radius.sm,\n '--clarify-theme-tokens-radius-md': radius.md,\n '--clarify-theme-tokens-radius-lg': radius.lg,\n '--clarify-theme-tokens-radius-xl': radius.xl,\n '--clarify-theme-layout-max-width': layout.maxWidth,\n }\n}\n\nfunction pageTitle(config: ClarifyConfig, route?: RouteItem): string {\n const routeTitle = route?.title?.trim()\n if (!routeTitle || routeTitle === config.title) return config.title\n return `${routeTitle} - ${config.title}`\n}\n\nfunction setNamedMeta(name: string, content: string | undefined) {\n const existing = document.head.querySelector<HTMLMetaElement>(`meta[name=\"${name}\"]`)\n if (!content) {\n existing?.remove()\n return\n }\n\n const meta = existing ?? document.createElement('meta')\n meta.name = name\n meta.content = content\n if (!existing) document.head.appendChild(meta)\n}\n\nfunction applyDocumentMetadata(config: ClarifyConfig, route?: RouteItem) {\n document.title = pageTitle(config, route)\n setNamedMeta('description', route?.description ?? config.description)\n setNamedMeta('keywords', route?.keywords?.join(', '))\n}\n\nfunction applyRootThemeVariables(themeVariables: ThemeCssVariables): () => void {\n const rootStyle = document.documentElement.style\n\n for (const [property, value] of Object.entries(themeVariables)) {\n rootStyle.setProperty(property, value)\n }\n\n return () => {\n for (const property of Object.keys(themeVariables)) {\n rootStyle.removeProperty(property)\n }\n }\n}\n\nexport function AppShell(arg0: AppShellProps) {\n const { config, routes, navigation } = arg0\n const location = useLocation()\n const pathname = normalizeRoutePath(location.pathname)\n const currentRoute = routeForPath(routes, pathname)\n const currentLocale = localeForPath(config, pathname, currentRoute)\n const currentLocaleConfig = config.i18n?.locales.find((locale) => locale.code === currentLocale)\n const currentNavigation = navigationForLocale(navigation, currentLocale, pathname)\n const sections = useMemo(() => sectionsForRoute(currentRoute), [currentRoute])\n const hasTabs = Boolean(currentNavigation.tabs?.length)\n const themeVariables = useMemo(() => themeStyle(config), [config])\n const renderRoutes = useMemo(\n () => routes.map(route => ({ ...route, component: resolveRouteComponent(route) })),\n [routes],\n )\n\n useEffect(() => applyRootThemeVariables(themeVariables), [themeVariables])\n\n useEffect(() => {\n if (location.hash) {\n scrollToHash(location.hash)\n return\n }\n\n window.scrollTo({ top: 0, left: 0 })\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n }, [location.hash, location.pathname])\n\n useEffect(() => {\n if (!currentLocale) return\n document.documentElement.lang = currentLocale\n if (currentLocaleConfig?.dir) {\n document.documentElement.dir = currentLocaleConfig.dir\n } else {\n document.documentElement.removeAttribute('dir')\n }\n }, [currentLocale, currentLocaleConfig?.dir])\n\n useEffect(() => {\n applyDocumentMetadata(config, currentRoute)\n }, [config, currentRoute])\n\n return (\n <ClarifyLocaleContext.Provider value={currentLocale}>\n <SectionProvider sections={sections}>\n <div\n className=\"clarify-app h-full min-h-screen bg-(--clarify-theme-tokens-colors-background) text-(--clarify-theme-tokens-colors-foreground) dark:bg-zinc-950 dark:text-white\"\n data-theme-preset={config.theme.preset}\n style={themeVariables}\n >\n <Header\n config={config}\n navigation={currentNavigation.items}\n tabs={currentNavigation.tabs}\n routes={routes}\n currentLocale={currentLocale}\n currentRoute={currentRoute}\n />\n <div className=\"clarify-layout mx-auto grid w-full max-w-(--clarify-theme-layout-max-width) grid-cols-1 lg:grid-cols-[18rem_minmax(0,1fr)] xl:grid-cols-[20rem_minmax(0,1fr)]\">\n <aside\n className={clsx(\n 'clarify-sidebar hidden lg:sticky lg:z-30 lg:block lg:h-[calc(100vh-3.5rem)] lg:self-start lg:overflow-y-auto lg:bg-(--clarify-theme-tokens-colors-background) lg:px-5 lg:pb-8 xl:px-6 lg:dark:bg-zinc-950',\n hasTabs ? 'lg:top-28 lg:h-[calc(100vh-7rem)] lg:pt-6' : 'lg:top-14 lg:pt-6',\n )}\n >\n <Navigation navigation={currentNavigation.items} />\n </aside>\n <div className={clsx('clarify-content @container relative flex min-h-screen min-w-0 flex-col px-4 sm:px-6 lg:px-8 xl:px-10', hasTabs ? 'pt-14 lg:pt-28' : 'pt-14')}>\n <ContentActions hasTabs={hasTabs} route={currentRoute} routePrefix={config.routePrefix} />\n <main className=\"clarify-main min-w-0 flex-auto\">\n <Suspense fallback={<PageSkeleton />}>\n <Routes>\n {renderRoutes.map((route) => (\n <Route key={route.path} path={route.path} element={<route.component />} />\n ))}\n </Routes>\n </Suspense>\n </main>\n <PageNavigation navigation={currentNavigation.items} currentRoute={currentRoute} />\n </div>\n </div>\n <PageFooter />\n </div>\n </SectionProvider>\n </ClarifyLocaleContext.Provider>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppShell-DeaJ-rgo.cjs","names":[],"sources":["../source/app/BuiltWithClarify.tsx","../source/app/PageFooter.tsx","../source/app/PageNavigation.tsx","../source/app/PageSkeleton.tsx","../source/app/AppShell.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react'\n\nimport { useBuiltInText } from '../core/i18n'\n\nfunction ClarifyMark(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 279 200\" aria-hidden=\"true\" {...props}>\n <path d=\"M44.867217 0.00543761C130.715579 1.00591567 200 70.9091172 200 156.994562L199.986321 155.127494C199.384888 180.009127 179.026368 199.994562 154 199.994562H46C20.5949015 199.994562 0 179.399661 0 153.994562V45.9945624C0 21.0975659 19.7793434 0.820282524 44.4815926 0.0191499894Z\" fill=\"#00D492\" />\n <path d=\"M123.867217 0.00543761C209.715579 1.00591567 279 70.9091172 279 156.994562L278.986321 155.127494C278.384888 180.009127 258.026368 199.994562 233 199.994562H125C99.5949015 199.994562 79 179.399661 79 153.994562V45.9945624C79 21.0975659 98.7793434 0.820282524 123.481593 0.0191499894Z\" fill=\"#00F6C9\" fillOpacity=\"0.6\" transform=\"rotate(-90 179 100)\" />\n <path d=\"M199.979267 154.416906L199.984438 155.157125L199.962366 155.872459C198.977251 180.406837 178.776104 199.994562 154 199.994562L124.372438 199.994125L124.249053 199.994081C99.6939678 199.603921 79.8122712 179.973634 79.01915 155.518407L79.0054376 155.132783C79.5830823 105.566626 103.129768 61.5221348 139.498462 33.1463428C175.69419 61.3871018 199.186123 105.143863 199.979267 154.416906Z\" fill=\"#00F692\" />\n </svg>\n )\n}\n\nexport function BuiltWithClarify() {\n const t = useBuiltInText()\n\n return (\n <a\n href=\"https://clarify.pub\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={t('builtWith.label')}\n className=\"clarify-built-with inline-flex items-center gap-1.5 rounded-full px-2 py-1 font-medium no-underline transition\"\n >\n <span>{t('builtWith.prefix')}</span>\n <ClarifyMark className=\"clarify-built-with-logo h-3.5 w-5 flex-none\" />\n <span className=\"clarify-built-with-brand font-semibold\">Clarify</span>\n </a>\n )\n}\n","import clsx from 'clsx'\nimport { Link, useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig } from '../core/context'\nimport type { ClarifyConfig, ClarifyLocalizedText, ClarifyNavbarLink } from '../core/types'\nimport { isExternalHref, localizeHref } from '../utils/href'\n\nimport { BuiltWithClarify } from './BuiltWithClarify'\n\nfunction resolveLocalizedText(text: ClarifyLocalizedText, locale?: string, fallbackLocale?: string): string {\n if (typeof text === 'string') return text\n return (locale ? text[locale] : undefined) ?? (fallbackLocale ? text[fallbackLocale] : undefined) ?? Object.values(text)[0] ?? ''\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string): string | undefined {\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\ntype FooterLinkProps = { link: ClarifyNavbarLink; locale?: string; config: ClarifyConfig }\n\nfunction FooterLink(arg0: FooterLinkProps) {\n const { link, locale, config } = arg0\n const external = link.external ?? isExternalHref(link.href)\n const href = external ? link.href : localizeHref(link.href, config, locale)\n const className = \"clarify-footer-link no-underline transition\"\n const label = resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)\n\n if (external) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={className}>\n {label}\n </a>\n )\n }\n\n return (\n <Link to={href} className={className}>\n {label}\n </Link>\n )\n}\n\ntype SocialLinkProps = { name: string; href: string }\n\nfunction SocialLink(arg0: SocialLinkProps) {\n const { name, href } = arg0\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-footer-social capitalize no-underline transition\"\n >\n {name}\n </a>\n )\n}\n\nexport function PageFooter() {\n const config = useClarifyConfig()\n const location = useLocation()\n const locale = localeForPath(config, location.pathname)\n const footer = config.footer\n const links = footer?.links ?? []\n const socials = Object.entries(footer?.socials ?? {})\n const copyright = footer?.copyright\n ? resolveLocalizedText(footer.copyright, locale, config.i18n?.defaultLocale)\n : undefined\n const hasCustomFooter = Boolean(copyright || links.length > 0 || socials.length > 0)\n\n return (\n <footer\n className={clsx(\n 'clarify-page-footer mx-auto mt-16 flex w-full max-w-(--clarify-theme-layout-max-width) flex-col items-end gap-4 border-t border-(--clarify-theme-tokens-colors-border) px-4 py-8 sm:px-6 lg:mt-24 lg:px-5 dark:border-white/10',\n hasCustomFooter && 'sm:flex-row sm:items-center sm:justify-between',\n )}\n >\n {hasCustomFooter ? (\n <div className=\"clarify-footer-content flex flex-col gap-3 text-right sm:text-left\">\n {copyright ? (\n <p className=\"clarify-footer-copyright m-0\">{copyright}</p>\n ) : null}\n {links.length > 0 || socials.length > 0 ? (\n <div className=\"clarify-footer-links flex flex-wrap justify-end gap-x-4 gap-y-2 sm:justify-start\">\n {links.map((link) => (\n <FooterLink key={`${link.href}-${resolveLocalizedText(link.label, locale, config.i18n?.defaultLocale)}`} link={link} locale={locale} config={config} />\n ))}\n {socials.map(([name, href]) => (\n <SocialLink key={name} name={name} href={href} />\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"clarify-footer-brand flex justify-end\">\n <BuiltWithClarify />\n </div>\n </footer>\n )\n}\n","import clsx from 'clsx'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Link } from 'react-router-dom'\n\nimport { useBuiltInText } from '../core/i18n'\nimport type { NavigationNode, RouteItem } from '../core/types'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nfunction flattenNavigation(nodes: NavigationNode[]): NavigationNode[] {\n return nodes.flatMap((node) => node.children?.length ? flattenNavigation(node.children) : [node])\n}\n\ntype PageNavigationProps = { navigation: NavigationNode[]; currentRoute?: RouteItem }\n\nexport function PageNavigation(arg0: PageNavigationProps) {\n const { navigation, currentRoute } = arg0\n const t = useBuiltInText()\n if (!currentRoute) return null\n\n const pageRoutes = flattenNavigation(navigation)\n const currentIndex = pageRoutes.findIndex((route) => isSameRoutePath(route.path, currentRoute.path))\n if (currentIndex === -1) return null\n\n const previous = pageRoutes[currentIndex - 1]\n const next = pageRoutes[currentIndex + 1]\n if (!previous && !next) return null\n\n return (\n <nav className=\"clarify-page-navigation mt-6 grid gap-3 @3xl:grid-cols-2\" aria-label={t('navigation.previousNext')}>\n <PageNavigationLink direction=\"previous\" route={previous} />\n <PageNavigationLink direction=\"next\" route={next} />\n </nav>\n )\n}\n\ntype PageNavigationLinkProps = { direction: 'previous' | 'next'; route?: NavigationNode }\n\nfunction PageNavigationLink(arg0: PageNavigationLinkProps) {\n const { direction, route } = arg0\n const t = useBuiltInText()\n if (!route) return <div className=\"hidden @3xl:block\" />\n\n const isNext = direction === 'next'\n\n return (\n <Link\n to={normalizeRoutePath(route.path)}\n className={clsx(\n 'group flex min-w-0 items-center gap-3 rounded-lg border border-(--clarify-theme-tokens-colors-border) px-4 py-3 no-underline transition hover:border-(--clarify-theme-tokens-colors-primary) hover:bg-(--clarify-theme-tokens-colors-surface) dark:border-white/10 dark:hover:border-(--clarify-theme-tokens-colors-primary) dark:hover:bg-white/2.5',\n isNext && '@3xl:justify-end @3xl:text-right',\n )}\n >\n {!isNext ? <ChevronLeft className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n <span className=\"min-w-0 flex-1\">\n <span className=\"clarify-page-navigation-label block font-medium uppercase tracking-wide text-(--clarify-theme-tokens-colors-muted)\">{isNext ? t('navigation.next') : t('navigation.previous')}</span>\n <span className=\"clarify-page-navigation-title mt-0.5 block truncate font-semibold text-(--clarify-theme-tokens-colors-foreground) dark:text-white\">{route.title}</span>\n </span>\n {isNext ? <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition group-hover:text-(--clarify-theme-tokens-colors-primary)\" /> : null}\n </Link>\n )\n}\n","import { Fragment } from 'react'\n\nexport function PageSkeleton() {\n return (\n <div className=\"clarify-page-skeleton animate-pulse space-y-8 py-8\">\n <div className=\"h-11 w-full max-w-[24rem] rounded-3xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"space-y-6\">\n <div className=\"h-7 w-full max-w-[28rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-7 w-full max-w-[22rem] rounded-2xl bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-52 rounded-[1.75rem] bg-zinc-200 dark:bg-zinc-800\" />\n </div>\n <div className=\"space-y-5\">\n {Array.from({ length: 3 }).map((_, index) => (\n <Fragment key={index}>\n <div className=\"h-5 w-full max-w-[18rem] rounded-full bg-zinc-200 dark:bg-zinc-800\" />\n <div className=\"h-32 rounded-[1.5rem] bg-zinc-200 dark:bg-zinc-800\" />\n </Fragment>\n ))}\n </div>\n </div>\n )\n}\n","import clsx from 'clsx'\nimport { Suspense, lazy, useEffect, useMemo } from 'react'\nimport type { CSSProperties, ComponentType } from 'react'\nimport { Routes, Route, useLocation } from 'react-router-dom'\n\nimport { ClarifyLocaleContext } from '../context'\nimport { ContentActions, Header, Navigation } from '../shell'\nimport type { RouteItem, ClarifyConfig, NavigationNode, NavigationTab, NavigationTree, TabbedNavigation } from '../types'\nimport { safeDecodeURIComponent } from '../utils/hash'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nimport { PageFooter } from './PageFooter'\nimport { PageNavigation } from './PageNavigation'\nimport { PageSkeleton } from './PageSkeleton'\nimport { SectionProvider, type Section } from './SectionProvider'\n\nexport type AppShellProps = {\n config: ClarifyConfig\n routes: RouteItem[]\n navigation: NavigationTree\n}\n\ntype ThemeCssVariables = CSSProperties & Record<`--clarify-theme-${string}`, string>\n\nfunction routeForPath(routes: RouteItem[], pathname: string): RouteItem | undefined {\n return routes.find((route) => isSameRoutePath(route.path, pathname))\n}\n\nfunction sectionsForRoute(route?: RouteItem): Section[] {\n return (\n route?.sections?.map((section) => ({\n id: section.id,\n title: section.title,\n badge: section.badge,\n tags: section.tags,\n })) ?? []\n )\n}\n\nfunction resolveRouteComponent(route: RouteItem): ComponentType {\n if (route.lazy) return lazy(route.component as () => Promise<{ default: ComponentType }>)\n return route.component as ComponentType\n}\n\nfunction scrollToHash(hash: string) {\n if (!hash) return\n\n const targetId = safeDecodeURIComponent(hash.slice(1))\n window.requestAnimationFrame(() => {\n document.getElementById(targetId)?.scrollIntoView()\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n })\n}\n\nfunction localeForPath(config: ClarifyConfig, pathname: string, route?: RouteItem): string | undefined {\n if (route?.locale) return route.locale\n const i18n = config.i18n\n if (!i18n) return undefined\n const firstSegment = pathname.split('/').filter(Boolean)[0]\n return i18n.locales.find((locale) => locale.code === firstSegment)?.code ?? i18n.defaultLocale\n}\n\nfunction isTabbedNavigation(navigation: NavigationTree): navigation is TabbedNavigation {\n return !Array.isArray(navigation) && 'tabs' in navigation\n}\n\nfunction hasPath(nodes: NavigationNode[], pathname: string): boolean {\n return nodes.some((node) => isSameRoutePath(node.path, pathname) || hasPath(node.children ?? [], pathname))\n}\n\ntype NavigationState = {\n items: NavigationNode[]\n tabs?: NavigationTab[]\n}\n\nfunction navigationFromTabs(navigation: TabbedNavigation, pathname: string): NavigationState {\n const currentTab = navigation.tabs.find((tab) => isSameRoutePath(tab.path, pathname) || hasPath(tab.children, pathname))\n return {\n items: currentTab?.children ?? navigation.tabs[0]?.children ?? [],\n tabs: navigation.tabs,\n }\n}\n\nfunction navigationForLocale(navigation: NavigationTree, locale: string | undefined, pathname: string): NavigationState {\n if (Array.isArray(navigation)) return { items: navigation }\n if (isTabbedNavigation(navigation)) return navigationFromTabs(navigation, pathname)\n if (!locale) return { items: [] }\n\n const localizedNavigation = navigation[locale]\n if (!localizedNavigation) return { items: [] }\n return Array.isArray(localizedNavigation) ? { items: localizedNavigation } : navigationFromTabs(localizedNavigation, pathname)\n}\n\nfunction themeStyle(config: ClarifyConfig): ThemeCssVariables {\n const { colors, radius } = config.theme.tokens\n const { layout } = config.theme\n\n return {\n '--clarify-theme-tokens-colors-primary': colors.primary,\n '--clarify-theme-tokens-colors-accent': colors.accent,\n '--clarify-theme-tokens-colors-background': colors.background,\n '--clarify-theme-tokens-colors-foreground': colors.foreground,\n '--clarify-theme-tokens-colors-surface': colors.surface,\n '--clarify-theme-tokens-colors-muted': colors.muted,\n '--clarify-theme-tokens-colors-border': colors.border,\n '--clarify-theme-tokens-colors-code-background': colors.codeBackground,\n '--clarify-theme-tokens-radius-sm': radius.sm,\n '--clarify-theme-tokens-radius-md': radius.md,\n '--clarify-theme-tokens-radius-lg': radius.lg,\n '--clarify-theme-tokens-radius-xl': radius.xl,\n '--clarify-theme-layout-max-width': layout.maxWidth,\n }\n}\n\nfunction pageTitle(config: ClarifyConfig, route?: RouteItem): string {\n const routeTitle = route?.title?.trim()\n if (!routeTitle || routeTitle === config.title) return config.title\n return `${routeTitle} - ${config.title}`\n}\n\nfunction setNamedMeta(name: string, content: string | undefined) {\n const existing = document.head.querySelector<HTMLMetaElement>(`meta[name=\"${name}\"]`)\n if (!content) {\n existing?.remove()\n return\n }\n\n const meta = existing ?? document.createElement('meta')\n meta.name = name\n meta.content = content\n if (!existing) document.head.appendChild(meta)\n}\n\nfunction applyDocumentMetadata(config: ClarifyConfig, route?: RouteItem) {\n document.title = pageTitle(config, route)\n setNamedMeta('description', route?.description ?? config.description)\n setNamedMeta('keywords', route?.keywords?.join(', '))\n}\n\nfunction applyRootThemeVariables(themeVariables: ThemeCssVariables): () => void {\n const rootStyle = document.documentElement.style\n\n for (const [property, value] of Object.entries(themeVariables)) {\n rootStyle.setProperty(property, value)\n }\n\n return () => {\n for (const property of Object.keys(themeVariables)) {\n rootStyle.removeProperty(property)\n }\n }\n}\n\nexport function AppShell(arg0: AppShellProps) {\n const { config, routes, navigation } = arg0\n const location = useLocation()\n const pathname = normalizeRoutePath(location.pathname)\n const currentRoute = routeForPath(routes, pathname)\n const currentLocale = localeForPath(config, pathname, currentRoute)\n const currentLocaleConfig = config.i18n?.locales.find((locale) => locale.code === currentLocale)\n const currentNavigation = navigationForLocale(navigation, currentLocale, pathname)\n const sections = useMemo(() => sectionsForRoute(currentRoute), [currentRoute])\n const hasTabs = Boolean(currentNavigation.tabs?.length)\n const themeVariables = useMemo(() => themeStyle(config), [config])\n const renderRoutes = useMemo(\n () => routes.map(route => ({ ...route, component: resolveRouteComponent(route) })),\n [routes],\n )\n\n useEffect(() => applyRootThemeVariables(themeVariables), [themeVariables])\n\n useEffect(() => {\n if (location.hash) {\n scrollToHash(location.hash)\n return\n }\n\n window.scrollTo({ top: 0, left: 0 })\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n }, [location.hash, location.pathname])\n\n useEffect(() => {\n if (!currentLocale) return\n document.documentElement.lang = currentLocale\n if (currentLocaleConfig?.dir) {\n document.documentElement.dir = currentLocaleConfig.dir\n } else {\n document.documentElement.removeAttribute('dir')\n }\n }, [currentLocale, currentLocaleConfig?.dir])\n\n useEffect(() => {\n applyDocumentMetadata(config, currentRoute)\n }, [config, currentRoute])\n\n return (\n <ClarifyLocaleContext.Provider value={currentLocale}>\n <SectionProvider sections={sections}>\n <div\n className=\"clarify-app h-full min-h-screen bg-(--clarify-theme-tokens-colors-background) text-(--clarify-theme-tokens-colors-foreground) dark:bg-zinc-950 dark:text-white\"\n data-theme-preset={config.theme.preset}\n style={themeVariables}\n >\n <Header\n config={config}\n navigation={currentNavigation.items}\n tabs={currentNavigation.tabs}\n routes={routes}\n currentLocale={currentLocale}\n currentRoute={currentRoute}\n />\n <div className=\"clarify-layout mx-auto grid w-full max-w-(--clarify-theme-layout-max-width) grid-cols-1 lg:grid-cols-[18rem_minmax(0,1fr)] xl:grid-cols-[20rem_minmax(0,1fr)]\">\n <aside\n className={clsx(\n 'clarify-sidebar hidden lg:sticky lg:z-30 lg:block lg:h-[calc(100vh-3.5rem)] lg:self-start lg:overflow-y-auto lg:bg-(--clarify-theme-tokens-colors-background) lg:px-5 lg:pb-8 xl:px-6 lg:dark:bg-zinc-950',\n hasTabs ? 'lg:top-28 lg:h-[calc(100vh-7rem)] lg:pt-6' : 'lg:top-14 lg:pt-6',\n )}\n >\n <Navigation navigation={currentNavigation.items} />\n </aside>\n <div className={clsx('clarify-content @container relative flex min-h-screen min-w-0 flex-col px-4 sm:px-6 lg:px-8 xl:px-10', hasTabs ? 'pt-14 lg:pt-28' : 'pt-14')}>\n <ContentActions hasTabs={hasTabs} route={currentRoute} routePrefix={config.routePrefix} />\n <main className=\"clarify-main min-w-0 flex-auto\">\n <Suspense fallback={<PageSkeleton />}>\n <Routes>\n {renderRoutes.map((route) => (\n <Route key={route.path} path={route.path} element={<route.component />} />\n ))}\n </Routes>\n </Suspense>\n </main>\n <PageNavigation navigation={currentNavigation.items} currentRoute={currentRoute} />\n </div>\n </div>\n <PageFooter />\n </div>\n </SectionProvider>\n </ClarifyLocaleContext.Provider>\n )\n}\n"],"mappings":"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"}
|
package/output/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useClarifyConfig()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"mb-16\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400\">\n {t('openapi.openApiReference')}\n </p>\n <h1>{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n {spec.info?.description ? <Markdown className=\"lead *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec } = arg0\n\n const entries = listOpenApiOperations(spec).map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\nimport { Collapse } from '../components/Collapse'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-white px-6 py-10 text-zinc-900 dark:bg-zinc-950 dark:text-white md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-zinc-600 dark:text-zinc-400\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useClarifyConfig()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"mb-16\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400\">\n {t('openapi.openApiReference')}\n </p>\n <h1>{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n {spec.info?.description ? <Markdown className=\"lead *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec } = arg0\n\n const entries = listOpenApiOperations(spec).map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { Collapse } from '../components/Collapse'\nimport { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-white px-6 py-10 text-zinc-900 dark:bg-zinc-950 dark:text-white md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-zinc-600 dark:text-zinc-400\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
|
package/output/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useClarifyConfig()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"mb-16\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400\">\n {t('openapi.openApiReference')}\n </p>\n <h1>{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n {spec.info?.description ? <Markdown className=\"lead *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec } = arg0\n\n const entries = listOpenApiOperations(spec).map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\nimport { Collapse } from '../components/Collapse'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-white px-6 py-10 text-zinc-900 dark:bg-zinc-950 dark:text-white md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-zinc-600 dark:text-zinc-400\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useClarifyConfig()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"mb-16\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400\">\n {t('openapi.openApiReference')}\n </p>\n <h1>{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n {spec.info?.description ? <Markdown className=\"lead *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec } = arg0\n\n const entries = listOpenApiOperations(spec).map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { Collapse } from '../components/Collapse'\nimport { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-white px-6 py-10 text-zinc-900 dark:bg-zinc-950 dark:text-white md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-zinc-600 dark:text-zinc-400\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { Collapse } from '../components/Collapse';
|
|
1
2
|
import { OpenApiDocument, OpenApiOperation } from '../openapi';
|
|
2
3
|
import { Markdown } from './Markdown';
|
|
3
|
-
import { Collapse } from '../components/Collapse';
|
|
4
4
|
import * as mdxPrimitives from './primitives';
|
|
5
5
|
export declare function useMDXComponents(components?: Record<string, unknown>): {
|
|
6
6
|
OpenApiDocument: typeof OpenApiDocument;
|