@clarify-labs/renderer 0.7.2 → 0.8.2
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/output/{ThemeRoot-UWj0iK1X.cjs → ClarifyShell-B74Fq4UU.cjs} +389 -161
- package/output/ClarifyShell-B74Fq4UU.cjs.map +1 -0
- package/output/{ThemeRoot-QULrwQf6.js → ClarifyShell-BPv2bxI4.js} +361 -157
- package/output/ClarifyShell-BPv2bxI4.js.map +1 -0
- package/output/{OpenApiOperation-BcyW_ULy.cjs → OpenApiOperation-BMXfV15v.cjs} +209 -7
- package/output/OpenApiOperation-BMXfV15v.cjs.map +1 -0
- package/output/{OpenApiOperation-tUKf7lZ4.js → OpenApiOperation-fJ3QQOJX.js} +205 -9
- package/output/OpenApiOperation-fJ3QQOJX.js.map +1 -0
- package/output/{PageActions-yoDRjkq8.js → PageActions-BwY7ierv.js} +55 -81
- package/output/PageActions-BwY7ierv.js.map +1 -0
- package/output/{PageActions-1RDCHcUY.cjs → PageActions-DOKkt2zo.cjs} +59 -79
- package/output/PageActions-DOKkt2zo.cjs.map +1 -0
- package/output/app/AppShell.d.ts +2 -3
- package/output/app/PageBanner.d.ts +0 -2
- package/output/app/PageFooter.d.ts +1 -5
- package/output/client.cjs +8 -8
- package/output/client.js +3 -3
- package/output/components/Code.d.ts +5 -1
- package/output/components/Mermaid.d.ts +7 -0
- package/output/components/index.d.ts +1 -0
- package/output/context.d.ts +1 -1
- package/output/core/i18n.d.ts +1 -1
- package/output/core/types.d.ts +8 -14
- package/output/index.cjs +27 -24
- package/output/index.cjs.map +1 -1
- package/output/index.d.ts +7 -4
- package/output/index.js +14 -14
- package/output/index.js.map +1 -1
- package/output/mdx/components.d.ts +3 -0
- package/output/mdx/primitives.d.ts +1 -0
- package/output/preview.cjs +3 -2
- package/output/preview.cjs.map +1 -1
- package/output/preview.js +3 -2
- package/output/preview.js.map +1 -1
- package/output/{render-psutGbsg.js → render-Cghgq1AQ.js} +10 -20
- package/output/render-Cghgq1AQ.js.map +1 -0
- package/output/{render-ByWbJbrA.cjs → render-ZSckbg74.cjs} +10 -20
- package/output/render-ZSckbg74.cjs.map +1 -0
- package/output/renderer.css +77 -21
- package/output/runtime/ClarifyShell.d.ts +22 -0
- package/output/server.cjs +10 -19
- package/output/server.cjs.map +1 -1
- package/output/server.js +10 -19
- package/output/server.js.map +1 -1
- package/output/shell/search/pagefind.d.ts +0 -1
- package/output/slots/RuntimeSlot.d.ts +58 -0
- package/output/slots/context.d.ts +20 -0
- package/output/slots/index.d.ts +5 -0
- package/output/slots/types.d.ts +50 -0
- package/output/utils/localized-text.d.ts +7 -0
- package/package.json +8 -3
- package/output/OpenApiOperation-BcyW_ULy.cjs.map +0 -1
- package/output/OpenApiOperation-tUKf7lZ4.js.map +0 -1
- package/output/PageActions-1RDCHcUY.cjs.map +0 -1
- package/output/PageActions-yoDRjkq8.js.map +0 -1
- package/output/ThemeRoot-QULrwQf6.js.map +0 -1
- package/output/ThemeRoot-UWj0iK1X.cjs.map +0 -1
- package/output/render-ByWbJbrA.cjs.map +0 -1
- package/output/render-psutGbsg.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageActions-BwY7ierv.js","names":[],"sources":["../source/core/context.tsx","../source/core/i18n.ts","../source/utils/clipboard.ts","../source/utils/href.ts","../source/shell/ContentActions.tsx","../source/theme/cookies.ts","../source/theme/ThemeProvider.tsx","../source/theme/ThemeToggle.tsx","../source/utils/localized-text.ts","../source/utils/path.ts","../source/utils/lucide.ts","../source/shell/icons.tsx","../source/utils/remToPx.ts","../source/app/SectionProvider.tsx","../source/utils/hash.ts","../source/shell/Navigation.tsx","../source/shell/mobile.tsx","../source/shell/search/items.ts","../source/shell/search/pagefind.ts","../source/shell/search/SearchInput.tsx","../source/shell/search/Highlight.tsx","../source/shell/search/SearchResult.tsx","../source/shell/search/SearchDialog.tsx","../source/shell/search/useSearchProps.ts","../source/shell/Search.tsx","../source/shell/SiteLogo.tsx","../source/shell/Header.tsx","../source/app/PageActions.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { OpenAPISpec } from '../openapi/lib/utils'\n\nimport type { Config } from './types'\n\nexport const ConfigContext = createContext<Config | null>(null)\nexport const LocaleContext = createContext<string | undefined>(undefined)\nexport const OpenApisContext = createContext<Record<string, OpenAPISpec>>({})\n\nexport function useConfig(): Config {\n const config = useContext(ConfigContext)\n if (!config) {\n throw new Error(\n '[clarify] useConfig must be used within a ConfigContext.Provider'\n )\n }\n return config\n}\n\nexport function useLocale(): string | undefined {\n return useContext(LocaleContext)\n}\n\nexport function useOpenApis(): Record<string, OpenAPISpec> {\n return useContext(OpenApisContext)\n}\n","import { useContext } from 'react'\n\nimport { ConfigContext, LocaleContext } from './context'\n\nexport type BuiltInLocale = 'en' | 'zh-CN'\n\nexport type BuiltInTextKey =\n | 'actions.code'\n | 'actions.copy'\n | 'actions.copied'\n | 'builtWith.label'\n | 'builtWith.prefix'\n | 'callout.danger'\n | 'callout.info'\n | 'callout.note'\n | 'callout.success'\n | 'callout.tip'\n | 'callout.warning'\n | 'contentActions.copyContent'\n | 'contentActions.copyContentDescription'\n | 'contentActions.copyLink'\n | 'contentActions.copyLinkDescription'\n | 'contentActions.copyLlms'\n | 'contentActions.copyLlmsDescription'\n | 'contentActions.copiedLlms'\n | 'contentActions.editPage'\n | 'contentActions.editPageDescription'\n | 'contentActions.copyOptions'\n | 'contentActions.copiedContent'\n | 'contentActions.copiedLink'\n | 'contentActions.viewMarkdown'\n | 'contentActions.viewMarkdownDescription'\n | 'contentActions.viewOpenApi'\n | 'contentActions.viewOpenApiDescription'\n | 'feedback.no'\n | 'feedback.prompt'\n | 'feedback.thanks'\n | 'feedback.yes'\n | 'navigation.documentation'\n | 'navigation.next'\n | 'navigation.previous'\n | 'navigation.previousNext'\n | 'navigation.toggle'\n | 'navbar.home'\n | 'navbar.openLinks'\n | 'navbar.sections'\n | 'notFound.description'\n | 'notFound.home'\n | 'notFound.label'\n | 'notFound.title'\n | 'openapi.apiDocumentation'\n | 'openapi.bodyProperties'\n | 'openapi.collapse'\n | 'openapi.endpointNotFound'\n | 'openapi.example'\n | 'openapi.expand'\n | 'openapi.headers'\n | 'openapi.language'\n | 'openapi.client'\n | 'openapi.mediaType'\n | 'openapi.openApiReference'\n | 'openapi.operationParameter'\n | 'openapi.optional'\n | 'openapi.parameter'\n | 'openapi.pathParameters'\n | 'openapi.queryParameters'\n | 'openapi.request'\n | 'openapi.requestBody'\n | 'openapi.required'\n | 'openapi.requiredBadge'\n | 'openapi.response'\n | 'openapi.responses'\n | 'openapi.schemaExample'\n | 'openapi.scrollExamplesLeft'\n | 'openapi.scrollExamplesRight'\n | 'openapi.specNotFound'\n | 'openapi.specPathMissing'\n | 'openapi.status'\n | 'openapi.version'\n | 'search.button'\n | 'search.noResults'\n | 'search.placeholder'\n | 'search.shortcutCtrl'\n | 'renderError.componentStack'\n | 'renderError.description'\n | 'renderError.details'\n | 'renderError.message'\n | 'renderError.path'\n | 'renderError.reload'\n | 'renderError.stack'\n | 'renderError.timestamp'\n | 'renderError.title'\n | 'renderError.type'\n | 'theme.switchToDark'\n | 'theme.switchToLight'\n | 'theme.switchToSystem'\n | 'language.switch'\n | 'mermaid.zoomIn'\n | 'mermaid.zoomOut'\n | 'mermaid.resetZoom'\n | 'mermaid.renderError'\n | 'mermaid.scrollHint'\n\nconst builtInText = {\n en: {\n 'actions.code': 'Code',\n 'actions.copy': 'Copy',\n 'actions.copied': 'Copied!',\n 'builtWith.label': 'Built with Clarify',\n 'builtWith.prefix': 'Built with',\n 'callout.danger': 'Danger',\n 'callout.info': 'Info',\n 'callout.note': 'Note',\n 'callout.success': 'Success',\n 'callout.tip': 'Tip',\n 'callout.warning': 'Warning',\n 'contentActions.copyContent': 'Copy page',\n 'contentActions.copyContentDescription': 'Copy this page as {contentType} for LLMs',\n 'contentActions.copyLink': 'Copy {contentType} link',\n 'contentActions.copyLinkDescription': 'Copy the raw {contentType} content link for this page',\n 'contentActions.copyLlms': 'Copy llms.txt',\n 'contentActions.copyLlmsDescription': 'Copy the llms.txt link for this site',\n 'contentActions.copiedLlms': 'Copied llms.txt',\n 'contentActions.editPage': 'Edit this page',\n 'contentActions.editPageDescription': 'Open the source file for this page',\n 'contentActions.copyOptions': 'Choose copy option',\n 'contentActions.copiedContent': 'Copied page',\n 'contentActions.copiedLink': 'Copied link',\n 'contentActions.viewMarkdown': 'View as Markdown',\n 'contentActions.viewMarkdownDescription': 'View this page as plain text',\n 'contentActions.viewOpenApi': 'View raw OpenAPI',\n 'contentActions.viewOpenApiDescription': 'Open the API description file in a new tab',\n 'feedback.no': 'No',\n 'feedback.prompt': 'Was this page helpful?',\n 'feedback.thanks': 'Thanks for your feedback!',\n 'feedback.yes': 'Yes',\n 'navigation.documentation': 'Documentation',\n 'navigation.next': 'Next',\n 'navigation.previous': 'Previous',\n 'navigation.previousNext': 'Previous and next pages',\n 'navigation.toggle': 'Toggle navigation',\n 'navbar.home': 'Home',\n 'navbar.openLinks': 'Open navigation links',\n 'navbar.sections': 'Documentation sections',\n 'notFound.description': 'The page may have moved, been renamed, or never existed. Check the address or return to the homepage.',\n 'notFound.home': 'Back to homepage',\n 'notFound.label': '404',\n 'notFound.title': 'Page not found',\n 'openapi.apiDocumentation': 'API Documentation',\n 'openapi.bodyProperties': 'Body properties',\n 'openapi.collapse': 'Collapse',\n 'openapi.endpointNotFound': 'Endpoint not found: {endpoint}',\n 'openapi.example': 'Example',\n 'openapi.expand': 'Expand',\n 'openapi.headers': 'Headers',\n 'openapi.language': 'Language',\n 'openapi.client': 'Client',\n 'openapi.mediaType': 'Media type',\n 'openapi.openApiReference': 'OpenAPI Reference',\n 'openapi.operationParameter': 'Operation parameter.',\n 'openapi.optional': 'Optional.',\n 'openapi.parameter': 'parameter',\n 'openapi.pathParameters': 'Path parameters',\n 'openapi.queryParameters': 'Query parameters',\n 'openapi.request': 'Request',\n 'openapi.requestBody': 'Request body',\n 'openapi.required': 'Required.',\n 'openapi.requiredBadge': 'required',\n 'openapi.response': 'Response',\n 'openapi.responses': 'Responses',\n 'openapi.schemaExample': 'Schema example',\n 'openapi.scrollExamplesLeft': 'Scroll examples left',\n 'openapi.scrollExamplesRight': 'Scroll examples right',\n 'openapi.specNotFound': 'OpenAPI spec not found: {specPath}',\n 'openapi.specPathMissing': 'spec or specPath was not provided',\n 'openapi.status': 'Status',\n 'openapi.version': 'Version {version}',\n 'search.button': 'Search...',\n 'search.noResults': 'Nothing found for {query}.',\n 'search.placeholder': 'Find something...',\n 'search.shortcutCtrl': 'Ctrl ',\n 'renderError.componentStack': 'React component stack',\n 'renderError.description': 'Clarify stopped rendering this route to keep the rest of the shell responsive. Review the diagnostics below, fix the page source, then reload the route.',\n 'renderError.details': 'Runtime diagnostics',\n 'renderError.message': 'Message',\n 'renderError.path': 'Route',\n 'renderError.reload': 'Reload route',\n 'renderError.stack': 'JavaScript stack trace',\n 'renderError.timestamp': 'Captured at',\n 'renderError.title': 'Route render failed',\n 'renderError.type': 'Error type',\n 'theme.switchToDark': 'Switch to dark theme',\n 'theme.switchToLight': 'Switch to light theme',\n 'theme.switchToSystem': 'Follow system theme',\n 'language.switch': 'Switch language',\n 'mermaid.zoomIn': 'Zoom in',\n 'mermaid.zoomOut': 'Zoom out',\n 'mermaid.resetZoom': 'Reset zoom',\n 'mermaid.renderError': 'Mermaid render error',\n 'mermaid.scrollHint': 'Click the diagram to enable scroll-to-zoom',\n },\n 'zh-CN': {\n 'actions.code': '代码',\n 'actions.copy': '复制',\n 'actions.copied': '已复制!',\n 'builtWith.label': '由 Clarify 构建',\n 'builtWith.prefix': '构建来自',\n 'callout.danger': '危险',\n 'callout.info': '信息',\n 'callout.note': '注意',\n 'callout.success': '成功',\n 'callout.tip': '提示',\n 'callout.warning': '警告',\n 'contentActions.copyContent': '复制页面',\n 'contentActions.copyContentDescription': '将页面以 {contentType} 格式复制给 LLMs',\n 'contentActions.copyLink': '复制 {contentType} 链接',\n 'contentActions.copyLinkDescription': '复制当前页面的 {contentType} 原始内容链接',\n 'contentActions.copyLlms': '复制 llms.txt',\n 'contentActions.copyLlmsDescription': '复制此站点的 llms.txt 链接',\n 'contentActions.copiedLlms': '已复制 llms.txt',\n 'contentActions.editPage': '编辑此页面',\n 'contentActions.editPageDescription': '打开当前页面的源文件',\n 'contentActions.copyOptions': '选择复制选项',\n 'contentActions.copiedContent': '已复制页面',\n 'contentActions.copiedLink': '已复制链接',\n 'contentActions.viewMarkdown': '以 Markdown 格式查看',\n 'contentActions.viewMarkdownDescription': '以纯文本查看此页面',\n 'contentActions.viewOpenApi': '查看 OpenAPI 原始内容',\n 'contentActions.viewOpenApiDescription': '在新标签页打开 API 描述文件',\n 'feedback.no': '否',\n 'feedback.prompt': '这个页面有帮助吗?',\n 'feedback.thanks': '感谢你的反馈!',\n 'feedback.yes': '是',\n 'navigation.documentation': '文档',\n 'navigation.next': '下一页',\n 'navigation.previous': '上一页',\n 'navigation.previousNext': '上一页和下一页',\n 'navigation.toggle': '切换导航',\n 'navbar.home': '首页',\n 'navbar.openLinks': '打开导航链接',\n 'navbar.sections': '文档栏目',\n 'notFound.description': '页面可能已移动、重命名或不存在。请检查地址,或返回首页继续浏览。',\n 'notFound.home': '返回首页',\n 'notFound.label': '404',\n 'notFound.title': '页面未找到',\n 'openapi.apiDocumentation': 'API 文档',\n 'openapi.bodyProperties': '请求体属性',\n 'openapi.collapse': '收起',\n 'openapi.endpointNotFound': '未找到端点:{endpoint}',\n 'openapi.example': '示例',\n 'openapi.expand': '展开',\n 'openapi.headers': '请求头',\n 'openapi.language': '语言',\n 'openapi.client': '客户端',\n 'openapi.mediaType': '媒体类型',\n 'openapi.openApiReference': 'OpenAPI 参考',\n 'openapi.operationParameter': '操作参数。',\n 'openapi.optional': '可选。',\n 'openapi.parameter': '参数',\n 'openapi.pathParameters': '路径参数',\n 'openapi.queryParameters': '查询参数',\n 'openapi.request': '请求',\n 'openapi.requestBody': '请求体',\n 'openapi.required': '必填。',\n 'openapi.requiredBadge': '必填',\n 'openapi.response': '响应',\n 'openapi.responses': '响应',\n 'openapi.schemaExample': 'Schema 示例',\n 'openapi.scrollExamplesLeft': '向左滚动示例',\n 'openapi.scrollExamplesRight': '向右滚动示例',\n 'openapi.specNotFound': '未找到 OpenAPI 描述文件:{specPath}',\n 'openapi.specPathMissing': '未提供 spec 或 specPath',\n 'openapi.status': '状态',\n 'openapi.version': '版本 {version}',\n 'search.button': '搜索...',\n 'search.noResults': '没有找到与 {query} 相关的结果。',\n 'search.placeholder': '搜索内容...',\n 'search.shortcutCtrl': 'Ctrl ',\n 'renderError.componentStack': 'React 组件栈',\n 'renderError.description': 'Clarify 已停止渲染此路由,以保证文档 Shell 仍可响应。请查看下方诊断信息,修复页面源码后重新加载路由。',\n 'renderError.details': '运行时诊断',\n 'renderError.message': '错误消息',\n 'renderError.path': '路由',\n 'renderError.reload': '重新加载路由',\n 'renderError.stack': 'JavaScript 堆栈',\n 'renderError.timestamp': '捕获时间',\n 'renderError.title': '路由渲染失败',\n 'renderError.type': '错误类型',\n 'theme.switchToDark': '切换到深色主题',\n 'theme.switchToLight': '切换到浅色主题',\n 'theme.switchToSystem': '跟随系统主题',\n 'language.switch': '切换语言',\n 'mermaid.zoomIn': '放大',\n 'mermaid.zoomOut': '缩小',\n 'mermaid.resetZoom': '重置缩放',\n 'mermaid.renderError': 'Mermaid 渲染错误',\n 'mermaid.scrollHint': '点击图表后即可滚轮缩放',\n },\n} satisfies Record<BuiltInLocale, Record<BuiltInTextKey, string>>\n\nexport function resolveBuiltInLocale(locale?: string): BuiltInLocale {\n return locale === 'zh-CN' || locale?.toLowerCase().startsWith('zh') ? 'zh-CN' : 'en'\n}\n\nexport function translateBuiltInText(locale: string | undefined, key: BuiltInTextKey, replacements: Record<string, string> = {}): string {\n let value = builtInText[resolveBuiltInLocale(locale)]?.[key] ?? builtInText.en[key]\n for (const [name, replacement] of Object.entries(replacements)) {\n value = value.replaceAll(`{${name}}`, replacement)\n }\n return value\n}\n\nexport function useBuiltInText(locale?: string) {\n const config = useContext(ConfigContext)\n const currentLocale = useContext(LocaleContext)\n const resolvedLocale = locale ?? currentLocale ?? config?.i18n?.defaultLocale\n return (key: BuiltInTextKey, replacements?: Record<string, string>) => translateBuiltInText(resolvedLocale, key, replacements)\n}\n","export async function copyTextToClipboard(text: string): Promise<boolean> {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n // Fall back to a temporary textarea below.\n }\n }\n\n if (typeof document === 'undefined') return false\n\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('readonly', '')\n textarea.style.position = 'fixed'\n textarea.style.top = '-9999px'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n\n try {\n textarea.select()\n return document.execCommand('copy')\n } catch {\n return false\n } finally {\n textarea.remove()\n }\n}\n","import type { Config } from '../types'\n\nexport function isExternalHref(href: string): boolean {\n return /^[a-z][a-z\\d+.-]*:/i.test(href) || href.startsWith('//')\n}\n\nexport function hasLocalePrefix(href: string, config: Config): boolean {\n const firstSegment = href.replace(/^\\/+/, '').split('/')[0]\n return Boolean(firstSegment && config.i18n?.locales.some((locale) => locale.code === firstSegment))\n}\n\nexport function localizeHref(href: string, config: Config, locale?: string): string {\n if (!locale || !config.i18n || isExternalHref(href) || href.startsWith('#')) return href\n if (hasLocalePrefix(href, config)) return href\n if (locale === config.i18n.defaultLocale) return href.startsWith('/') ? href : `/${href}`\n\n const cleanHref = href === '/' ? '' : href.replace(/^\\/+/, '')\n return `/${locale}${cleanHref ? `/${cleanHref}` : ''}`\n}\n\nexport function prefixHref(href: string, routePrefix: string = '/'): string {\n if (isExternalHref(href) || href.startsWith('#')) return href\n if (!routePrefix || routePrefix === '/') return href.startsWith('/') ? href : `/${href}`\n\n const prefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const path = href.replace(/^\\/+/, '')\n if (!path) return `/${prefix}`\n if (path === prefix || path.startsWith(`${prefix}/`)) return `/${path}`\n return `/${prefix}/${path}`\n}\n","import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'\nimport { Check, ChevronDown, Copy, ExternalLink, FileText, Link2, PencilLine } from 'lucide-react'\nimport { useState } from 'react'\n\nimport { useBuiltInText } from '../i18n'\nimport type { RouteItem } from '../types'\nimport { copyTextToClipboard } from '../utils/clipboard'\nimport { prefixHref } from '../utils/href'\n\ntype ContentActionsProps = {\n route?: RouteItem\n routePrefix?: string\n}\n\ntype CopyState = 'idle' | 'content' | 'link' | 'llms'\ntype CopyAction = {\n key: Exclude<CopyState, 'idle'>\n label: string\n description: string\n icon: typeof Copy\n run: () => Promise<void>\n copiedLabel?: string\n}\n\nfunction resolveContentArtifactUrl(contentArtifactUrl: string, routePrefix: string = '/'): string {\n return prefixHref(contentArtifactUrl, routePrefix)\n}\n\nfunction getAbsoluteUrl(path: string): string {\n if (typeof window === 'undefined') return path\n return new URL(path, window.location.href).href\n}\n\nexport function ContentActions(arg0: ContentActionsProps) {\n const { route, routePrefix } = arg0\n const t = useBuiltInText()\n const [copied, setCopied] = useState<CopyState>('idle')\n\n if (!route?.contentArtifactUrl && !route?.sourceUrl) return null\n\n const contentArtifactUrl = route.contentArtifactUrl ? resolveContentArtifactUrl(route.contentArtifactUrl, routePrefix) : undefined\n const isOpenApi = route.kind === 'openapi'\n const contentTypeLabel = isOpenApi ? 'OpenAPI' : 'Markdown'\n const replacements = { contentType: contentTypeLabel }\n const viewLabel = isOpenApi ? t('contentActions.viewOpenApi') : t('contentActions.viewMarkdown')\n const viewDescription = isOpenApi ? t('contentActions.viewOpenApiDescription') : t('contentActions.viewMarkdownDescription')\n\n function markCopied(state: Exclude<CopyState, 'idle'>) {\n setCopied(state)\n window.setTimeout(() => setCopied('idle'), 1600)\n }\n\n async function handleCopyContent() {\n if (!contentArtifactUrl) return\n const response = await fetch(contentArtifactUrl)\n const text = await response.text()\n if (await copyTextToClipboard(text)) markCopied('content')\n }\n\n const llmsArtifactUrl = resolveContentArtifactUrl('/llms.txt', routePrefix)\n\n async function handleCopyLink() {\n if (!contentArtifactUrl) return\n if (await copyTextToClipboard(getAbsoluteUrl(contentArtifactUrl))) markCopied('link')\n }\n\n async function handleCopyLlms() {\n if (await copyTextToClipboard(getAbsoluteUrl(llmsArtifactUrl))) markCopied('llms')\n }\n\n const actions: CopyAction[] = contentArtifactUrl\n ? [\n {\n key: 'content',\n label: t('contentActions.copyContent'),\n description: t('contentActions.copyContentDescription', replacements),\n icon: Copy,\n run: handleCopyContent,\n copiedLabel: t('contentActions.copiedContent'),\n },\n {\n key: 'link',\n label: t('contentActions.copyLink', replacements),\n description: t('contentActions.copyLinkDescription', replacements),\n icon: Link2,\n run: handleCopyLink,\n copiedLabel: t('contentActions.copiedLink'),\n },\n ]\n : []\n\n const llmsAction: CopyAction = {\n key: 'llms',\n label: t('contentActions.copyLlms'),\n description: t('contentActions.copyLlmsDescription'),\n icon: FileText,\n run: handleCopyLlms,\n copiedLabel: t('contentActions.copiedLlms'),\n }\n const primaryAction = actions[0]\n const PrimaryIcon = primaryAction && copied === primaryAction.key ? Check : primaryAction?.icon ?? PencilLine\n\n return (\n <div className=\"clarify-content-actions not-prose flex shrink-0 justify-start sm:justify-end\">\n <Menu as=\"div\" className=\"clarify-content-actions-menu relative inline-flex min-w-0 text-sm font-medium\">\n <div className=\"clarify-content-actions-group inline-flex min-w-0 overflow-hidden rounded-full border border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-surface) shadow-sm shadow-zinc-900/5\">\n {primaryAction ? (\n <button\n type=\"button\"\n onClick={primaryAction.run}\n className=\"clarify-content-actions-primary clarify-ui-control inline-flex h-8 min-w-0 items-center gap-1.5 px-2.5 transition sm:px-3\"\n >\n <PrimaryIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{copied === primaryAction.key ? t('actions.copied') : primaryAction.label}</span>\n </button>\n ) : (\n <a\n href={route.sourceUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-content-actions-primary clarify-ui-control inline-flex h-8 min-w-0 items-center gap-1.5 px-2.5 no-underline transition sm:px-3\"\n >\n <PrimaryIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{t('contentActions.editPage')}</span>\n </a>\n )}\n <MenuButton className=\"clarify-content-actions-trigger clarify-ui-control inline-flex h-8 w-8 items-center justify-center border-l border-(--clarify-theme-tokens-colors-border) transition\" aria-label={t('contentActions.copyOptions')}>\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </MenuButton>\n </div>\n <MenuItems\n modal={false}\n anchor=\"bottom end\"\n className=\"clarify-content-actions-list clarify-ui-menu z-30 mt-2 w-(--clarify-ui-action-menu-width) origin-top-right rounded-(--clarify-theme-tokens-radius-xl) border border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-surface) p-1.5 shadow-xl shadow-zinc-900/5 transition [--anchor-gap:--spacing(2)] focus:outline-none data-closed:scale-95 data-closed:opacity-0\"\n >\n {route.sourceUrl ? (\n <MenuItem>\n <a\n href={route.sourceUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-content-actions-item clarify-ui-menu-item group flex w-full items-center gap-2 rounded-(--clarify-theme-tokens-radius-lg) px-1.5 py-1.5 text-left no-underline transition\"\n >\n <span className=\"clarify-ui-menu-icon flex shrink-0 rounded-(--clarify-theme-tokens-radius-md) border border-(--clarify-theme-tokens-colors-border) p-1.5\">\n <PencilLine className=\"h-4 w-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"clarify-ui-menu-title flex items-center gap-1\">\n {t('contentActions.editPage')}\n <ExternalLink className=\"clarify-ui-menu-icon h-3 w-3\" />\n </span>\n <span className=\"clarify-ui-menu-description truncate\">{t('contentActions.editPageDescription')}</span>\n </span>\n <Check className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-primary) opacity-0\" />\n </a>\n </MenuItem>\n ) : null}\n {actions.slice(0, 1).map((action) => {\n const Icon = action.icon\n const isCopied = copied === action.key\n\n return (\n <MenuItem key={action.key}>\n <button\n type=\"button\"\n onClick={action.run}\n className=\"clarify-content-actions-item clarify-ui-menu-item group flex w-full items-center gap-2 rounded-(--clarify-theme-tokens-radius-lg) px-1.5 py-1.5 text-left transition\"\n >\n <span className=\"clarify-ui-menu-icon flex shrink-0 rounded-(--clarify-theme-tokens-radius-md) border border-(--clarify-theme-tokens-colors-border) p-1.5\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"clarify-ui-menu-title\">{isCopied ? t('contentActions.copiedContent') : action.label}</span>\n <span className=\"clarify-ui-menu-description truncate\">{action.description}</span>\n </span>\n <Check className={`h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-primary) transition ${isCopied ? 'opacity-100' : 'opacity-0'}`} />\n </button>\n </MenuItem>\n )\n })}\n {contentArtifactUrl ? (\n <MenuItem>\n <a\n href={contentArtifactUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"clarify-content-actions-item clarify-ui-menu-item group flex w-full items-center gap-2 rounded-(--clarify-theme-tokens-radius-lg) px-1.5 py-1.5 text-left no-underline transition\"\n >\n <span className=\"clarify-ui-menu-icon flex shrink-0 rounded-(--clarify-theme-tokens-radius-md) border border-(--clarify-theme-tokens-colors-border) p-1.5\">\n <FileText className=\"h-4 w-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"clarify-ui-menu-title flex items-center gap-1\">\n {viewLabel}\n <ExternalLink className=\"clarify-ui-menu-icon h-3 w-3\" />\n </span>\n <span className=\"clarify-ui-menu-description truncate\">{viewDescription}</span>\n </span>\n <Check className=\"h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-primary) opacity-0\" />\n </a>\n </MenuItem>\n ) : null}\n {actions.slice(1).map((action) => {\n const Icon = action.icon\n const isCopied = copied === action.key\n\n return (\n <MenuItem key={action.key}>\n <button\n type=\"button\"\n onClick={action.run}\n className=\"clarify-content-actions-item clarify-ui-menu-item group flex w-full items-center gap-2 rounded-(--clarify-theme-tokens-radius-lg) px-1.5 py-1.5 text-left transition\"\n >\n <span className=\"clarify-ui-menu-icon flex shrink-0 rounded-(--clarify-theme-tokens-radius-md) border border-(--clarify-theme-tokens-colors-border) p-1.5\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"clarify-ui-menu-title\">{isCopied ? action.copiedLabel ?? action.label : action.label}</span>\n <span className=\"clarify-ui-menu-description truncate\">{action.description}</span>\n </span>\n <Check className={`h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-primary) transition ${isCopied ? 'opacity-100' : 'opacity-0'}`} />\n </button>\n </MenuItem>\n )\n })}\n <MenuItem key={llmsAction.key}>\n <button\n type=\"button\"\n onClick={llmsAction.run}\n className=\"clarify-content-actions-item clarify-ui-menu-item group flex w-full items-center gap-2 rounded-(--clarify-theme-tokens-radius-lg) px-1.5 py-1.5 text-left transition\"\n >\n <span className=\"clarify-ui-menu-icon flex shrink-0 rounded-(--clarify-theme-tokens-radius-md) border border-(--clarify-theme-tokens-colors-border) p-1.5\">\n <FileText className=\"h-4 w-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col px-1\">\n <span className=\"clarify-ui-menu-title\">{copied === llmsAction.key ? llmsAction.copiedLabel ?? llmsAction.label : llmsAction.label}</span>\n <span className=\"clarify-ui-menu-description truncate\">{llmsAction.description}</span>\n </span>\n <Check className={`h-3.5 w-3.5 shrink-0 text-(--clarify-theme-tokens-colors-primary) transition ${copied === llmsAction.key ? 'opacity-100' : 'opacity-0'}`} />\n </button>\n </MenuItem>\n </MenuItems>\n </Menu>\n </div>\n )\n}\n","export type ThemePreference = 'light' | 'dark' | 'system'\n\ntype CookieOptions = { domain?: string }\ntype WritableCookieOptions = CookieOptions & { maxAge: number }\n\nexport const themeCookieName = 'clarify-theme'\nexport const localeCookieName = 'clarify-locale'\n\nconst preferenceCookieMaxAge = 60 * 60 * 24 * 365\nconst cookiePath = '/'\n\nexport function isThemePreference(value: string | null | undefined): value is ThemePreference {\n return value === 'light' || value === 'dark' || value === 'system'\n}\n\nexport function readThemeCookie(): ThemePreference | null {\n if (typeof document === 'undefined') return null\n\n const value = readCookieValue(themeCookieName)\n return isThemePreference(value) ? value : null\n}\n\nexport function getStoredThemePreference(): ThemePreference {\n return readThemeCookie() ?? 'system'\n}\n\nexport function storeThemePreference(theme: ThemePreference): void {\n storeSharedPreferenceCookie(themeCookieName, theme)\n}\n\nexport function readLocaleCookie(): string | null {\n if (typeof document === 'undefined') return null\n return readCookieValue(localeCookieName)\n}\n\nexport function getStoredLocalePreference(locales?: readonly string[]): string | null {\n const locale = readLocaleCookie()\n if (!locale) return null\n return locales && !locales.includes(locale) ? null : locale\n}\n\nexport function storeLocalePreference(locale: string): void {\n storeSharedPreferenceCookie(localeCookieName, locale)\n}\n\nfunction storeSharedPreferenceCookie(name: string, value: string): void {\n if (typeof document === 'undefined') return\n\n const domains = resolveSharedCookieDomains()\n const domain = resolveWritableSharedCookieDomain(domains, name)\n\n deleteCookie(name)\n\n for (const candidateDomain of domains) {\n deleteCookie(name, { domain: candidateDomain })\n }\n\n writeCookie(name, value, { domain: domain ?? undefined, maxAge: preferenceCookieMaxAge })\n}\n\nexport function resolveSharedCookieDomains(hostname = typeof window !== 'undefined' ? window.location.hostname : ''): string[] {\n const normalizedHostname = hostname.toLowerCase().replace(/\\.$/, '')\n\n if (!normalizedHostname || normalizedHostname === 'localhost' || normalizedHostname.endsWith('.localhost') || isIpAddress(normalizedHostname)) {\n return []\n }\n\n const parts = normalizedHostname.split('.')\n\n if (parts.length < 2) return []\n\n const domains: string[] = []\n\n for (let index = parts.length - 2; index >= 0; index -= 1) {\n domains.push(parts.slice(index).join('.'))\n }\n\n return domains\n}\n\nfunction resolveWritableSharedCookieDomain(domains: string[], probePrefix = themeCookieName): string | null {\n for (const domain of domains) {\n const probeName = `${probePrefix}-probe-${Date.now()}-${Math.random().toString(36).slice(2)}`\n const probeValue = '1'\n\n writeCookie(probeName, probeValue, { domain, maxAge: 60 })\n\n const isWritable = readCookieValue(probeName) === probeValue\n deleteCookie(probeName, { domain })\n\n if (isWritable) return domain\n }\n\n return null\n}\n\nfunction readCookieValue(cookieName: string): string | null {\n const cookies = document.cookie ? document.cookie.split('; ') : []\n\n for (const cookie of cookies) {\n const separatorIndex = cookie.indexOf('=')\n const name = separatorIndex === -1 ? cookie : cookie.slice(0, separatorIndex)\n\n if (decodeURIComponent(name) !== cookieName) continue\n\n return separatorIndex === -1 ? '' : decodeURIComponent(cookie.slice(separatorIndex + 1))\n }\n\n return null\n}\n\nfunction deleteCookie(name: string, options: CookieOptions = {}): void {\n writeCookie(name, '', { domain: options.domain, maxAge: 0 })\n}\n\nfunction writeCookie(name: string, value: string, options: WritableCookieOptions): void {\n const attributes = [\n `${encodeURIComponent(name)}=${encodeURIComponent(value)}`,\n `Path=${cookiePath}`,\n `Max-Age=${options.maxAge}`,\n 'SameSite=Lax',\n ]\n\n if (options.domain) attributes.push(`Domain=.${options.domain}`)\n if (typeof window !== 'undefined' && window.location.protocol === 'https:') attributes.push('Secure')\n\n try {\n document.cookie = attributes.join('; ')\n } catch {\n // Ignore cookie write failures from restricted embeds.\n }\n}\n\nfunction isIpAddress(hostname: string): boolean {\n return /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostname) || hostname.includes(':')\n}\n","import { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\n\nimport { getStoredThemePreference, storeThemePreference } from './cookies'\nimport type { ThemePreference } from './cookies'\n\nexport type Theme = ThemePreference\nexport type ResolvedTheme = 'light' | 'dark'\n\ntype ThemeContextValue = {\n theme: Theme\n resolvedTheme: ResolvedTheme\n setTheme: (theme: Theme) => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') {\n return 'light'\n }\n\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getStoredTheme(): Theme {\n if (typeof window === 'undefined') {\n return 'system'\n }\n\n return getStoredThemePreference()\n}\n\nfunction storeTheme(theme: Theme) {\n storeThemePreference(theme)\n}\n\nfunction applyTheme(resolvedTheme: ResolvedTheme) {\n if (typeof document === 'undefined') {\n return\n }\n\n document.documentElement.classList.toggle('dark', resolvedTheme === 'dark')\n document.documentElement.style.colorScheme = resolvedTheme\n}\n\ntype ThemeProviderProps = { children: ReactNode }\n\nexport function ThemeProvider(props: ThemeProviderProps) {\n const { children } = props\n\n const [theme, setThemeState] = useState<Theme>(() => getStoredTheme())\n const [systemTheme, setSystemTheme] = useState<ResolvedTheme>(() => getSystemTheme())\n const resolvedTheme = theme === 'system' ? systemTheme : theme\n\n useEffect(() => {\n applyTheme(resolvedTheme)\n }, [resolvedTheme])\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return undefined\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n function updateSystemTheme() {\n setSystemTheme(mediaQuery.matches ? 'dark' : 'light')\n }\n\n updateSystemTheme()\n mediaQuery.addEventListener('change', updateSystemTheme)\n\n return () => mediaQuery.removeEventListener('change', updateSystemTheme)\n }, [])\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n resolvedTheme,\n setTheme(nextTheme) {\n setThemeState(nextTheme)\n storeTheme(nextTheme)\n },\n }),\n [resolvedTheme, theme],\n )\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext)\n\n if (!context) {\n throw new Error('[clarify] useTheme must be used within ThemeProvider')\n }\n\n return context\n}\n","import { Monitor, Moon, Sun } from 'lucide-react'\n\nimport { useBuiltInText } from '../core/i18n'\n\nimport { useTheme } from './ThemeProvider'\n\nexport function ThemeToggle() {\n const { theme, setTheme } = useTheme()\n const t = useBuiltInText()\n const nextTheme = getNextTheme(theme)\n const label = getThemeLabel(nextTheme, t)\n\n return (\n <button\n type=\"button\"\n className=\"clarify-theme-toggle relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition hover:bg-(--clarify-ui-hover-background)\"\n aria-label={label}\n title={label}\n onClick={() => setTheme(nextTheme)}\n >\n <span className=\"absolute size-12 pointer-fine:hidden\" />\n {theme === 'system' ? <Monitor className=\"h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground)\" /> : null}\n {theme === 'light' ? <Sun className=\"h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground)\" /> : null}\n {theme === 'dark' ? <Moon className=\"h-5 w-5 stroke-white\" /> : null}\n </button>\n )\n}\n\nfunction getNextTheme(theme: 'light' | 'dark' | 'system') {\n if (theme === 'system') return 'light'\n if (theme === 'light') return 'dark'\n return 'system'\n}\n\nfunction getThemeLabel(theme: 'light' | 'dark' | 'system', t: ReturnType<typeof useBuiltInText>) {\n if (theme === 'dark') return t('theme.switchToDark')\n if (theme === 'light') return t('theme.switchToLight')\n return t('theme.switchToSystem')\n}\n","import type { LocalizedText } from '../core/types'\n\n/**\n * Resolve a localized text value for the given locale.\n * Falls back to the fallback locale, then the first available value,\n * then an empty string.\n */\nexport function resolveLocalizedText(text: LocalizedText, locale?: string, fallbackLocale?: string): string {\n if (typeof text === 'string') return text\n return (locale ? text[locale] : undefined)\n ?? (fallbackLocale ? text[fallbackLocale] : undefined)\n ?? Object.values(text)[0]\n ?? ''\n}\n","export function normalizeRoutePath(path: string): string {\n const [pathname, suffix = ''] = path.split(/([?#].*)/, 2)\n const normalizedPathname = pathname.replace(/^\\/+/, '/').replace(/\\/+$/, '') || '/'\n return `${normalizedPathname}${suffix}`\n}\n\nexport function isSameRoutePath(a: string | undefined, b: string | undefined): boolean {\n if (!a || !b) return false\n return normalizeRoutePath(a) === normalizeRoutePath(b)\n}\n","import * as LucideIcons from 'lucide-react'\nimport type { ComponentType, SVGProps } from 'react'\n\nexport type LucideIconComponent = ComponentType<SVGProps<SVGSVGElement>>\n\n/**\n * Registry of all Lucide icon components keyed by their PascalCase export name.\n *\n * Access icons via index lookup (e.g. `lucideIconRegistry[name]`) so React\n * tooling does not mistake the access for a component created during render.\n */\nexport const lucideIconRegistry = LucideIcons as unknown as Record<string, LucideIconComponent | undefined>\n\nfunction toPascalCase(value: string): string {\n return value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map(part => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join('')\n}\n\n/**\n * Resolve an icon name into the matching Lucide registry key.\n *\n * Accepts both the exact PascalCase export name (e.g. `ArrowRight`) and\n * kebab/space/snake variants (e.g. `arrow-right`), returning `undefined`\n * when no matching icon exists.\n */\nexport function resolveLucideIconName(name: string | undefined): string | undefined {\n if (!name) return undefined\n if (lucideIconRegistry[name]) return name\n const pascalName = toPascalCase(name)\n return lucideIconRegistry[pascalName] ? pascalName : undefined\n}\n","import clsx from 'clsx'\n\nimport { lucideIconRegistry, resolveLucideIconName } from '../utils/lucide'\n\nexport type NavigationIconProps = { name?: string; className?: string }\n\nexport function NavigationIcon(arg0: NavigationIconProps) {\n const { name, className } = arg0\n\n if (!name) return null\n\n const iconName = resolveLucideIconName(name)\n if (!iconName) return null\n\n const Icon = lucideIconRegistry[iconName]\n if (!Icon) return null\n\n return <Icon className={clsx('shrink-0 stroke-current', className)} aria-hidden=\"true\" />\n}\n","export function remToPx(remValue: number) {\n const rootFontSize =\n typeof window === 'undefined'\n ? 16\n : Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize)\n\n return remValue * rootFontSize\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useState,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { createStore, useStore, type StoreApi } from 'zustand'\n\nimport { remToPx } from '../utils/remToPx'\n\nexport interface Section {\n id: string\n title: string\n level?: number\n offsetRem?: number\n badge?: string\n tags?: string[]\n headingRef?: RefObject<HTMLHeadingElement | null>\n}\n\ninterface SectionState {\n sections: Section[]\n visibleSections: string[]\n setVisibleSections: (visibleSections: string[]) => void\n registerHeading: (heading: {\n id: string\n ref: RefObject<HTMLHeadingElement | null>\n offsetRem: number\n }) => void\n}\n\nfunction createSectionStore(sections: Section[]) {\n return createStore<SectionState>()((set) => ({\n sections,\n visibleSections: [],\n setVisibleSections: (visibleSections) =>\n set((state) =>\n state.visibleSections.join() === visibleSections.join()\n ? {}\n : { visibleSections },\n ),\n registerHeading: ({ id, ref, offsetRem }) =>\n set((state) => ({\n sections: state.sections.map((section) =>\n section.id === id\n ? {\n ...section,\n headingRef: ref,\n offsetRem,\n }\n : section,\n ),\n })),\n }))\n}\n\nfunction useVisibleSections(sectionStore: StoreApi<SectionState>) {\n const setVisibleSections = useStore(sectionStore, (state) => state.setVisibleSections)\n const sections = useStore(sectionStore, (state) => state.sections)\n\n useEffect(() => {\n function checkVisibleSections() {\n const { innerHeight, scrollY } = window\n const viewportTop = scrollY\n const viewportBottom = scrollY + innerHeight\n const newVisibleSections: string[] = []\n\n for (let sectionIndex = 0; sectionIndex < sections.length; sectionIndex += 1) {\n const { id, headingRef, offsetRem = 0 } = sections[sectionIndex]\n\n if (!headingRef?.current) {\n continue\n }\n\n const offset = remToPx(offsetRem)\n const top = headingRef.current.getBoundingClientRect().top + scrollY\n\n if (sectionIndex === 0 && top - offset > viewportTop) {\n newVisibleSections.push('_top')\n }\n\n const nextSection = sections[sectionIndex + 1]\n const bottom =\n (nextSection?.headingRef?.current?.getBoundingClientRect().top ?? Infinity) +\n scrollY\n\n if (bottom > viewportTop && top < viewportBottom) {\n newVisibleSections.push(id)\n }\n }\n\n setVisibleSections(newVisibleSections)\n }\n\n const raf = window.requestAnimationFrame(() => checkVisibleSections())\n window.addEventListener('scroll', checkVisibleSections, { passive: true })\n window.addEventListener('resize', checkVisibleSections)\n\n return () => {\n window.cancelAnimationFrame(raf)\n window.removeEventListener('scroll', checkVisibleSections)\n window.removeEventListener('resize', checkVisibleSections)\n }\n }, [setVisibleSections, sections])\n}\n\nconst SectionStoreContext = createContext<StoreApi<SectionState> | null>(null)\n\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect\n\ntype SectionProviderProps = {\n sections: Section[]\n children: ReactNode\n}\n\nexport function SectionProvider(arg0: SectionProviderProps) { const {\n sections,\n children,\n} = arg0\n\n const [sectionStore] = useState(() => createSectionStore(sections))\n\n useVisibleSections(sectionStore)\n\n useIsomorphicLayoutEffect(() => {\n sectionStore.setState((state) => ({\n sections: sections.map((section) => {\n const registeredSection = state.sections.find((item) => item.id === section.id)\n return {\n ...section,\n headingRef: registeredSection?.headingRef,\n offsetRem: registeredSection?.offsetRem ?? section.offsetRem,\n }\n }),\n visibleSections: [],\n }))\n }, [sectionStore, sections])\n\n return <SectionStoreContext.Provider value={sectionStore}>{children}</SectionStoreContext.Provider>\n}\n\nexport function useSectionStore<T>(selector: (state: SectionState) => T) {\n const store = useContext(SectionStoreContext)\n\n if (!store) {\n throw new Error('[clarify] useSectionStore must be used within SectionProvider')\n }\n\n return useStore(store, selector)\n}\n","export function safeDecodeURIComponent(value: string): string {\n try {\n return decodeURIComponent(value)\n } catch {\n return value\n }\n}\n","import { CloseButton } from '@headlessui/react'\nimport clsx from 'clsx'\nimport { AnimatePresence, motion, useIsPresent } from 'framer-motion'\nimport { useState } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\n\nimport { useSectionStore } from '../app/SectionProvider'\nimport { useBuiltInText } from '../i18n'\nimport type { NavigationNode } from '../types'\nimport { safeDecodeURIComponent } from '../utils/hash'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\nimport { remToPx } from '../utils/remToPx'\n\nimport { NavigationIcon } from './icons'\nimport { useIsInsideMobileNavigation } from './mobile'\n\ntype NavGroup = {\n title: string\n icon?: string\n links: Array<{\n title: string\n href: string\n icon?: string\n }>\n}\n\nfunction useInitialValue<T>(value: T, condition = true) {\n const [initialValue] = useState(value)\n return condition ? initialValue : value\n}\n\nfunction normalizePath(path: string) {\n return path === '' ? '/' : path\n}\n\nfunction navigationToGroups(navigation: NavigationNode[], defaultTitle: string): NavGroup[] {\n return navigation.map((node) => {\n const children = node.children?.length ? node.children : [node]\n\n return {\n title: node.children?.length ? node.title : defaultTitle,\n icon: node.icon,\n links: children.map((child) => ({\n title: child.title,\n href: normalizePath(child.path),\n icon: child.icon,\n })),\n }\n })\n}\n\nconst sectionBadgeColorStyles: Record<string, string> = {\n GET: 'text-emerald-500 dark:text-emerald-400',\n POST: 'text-sky-500 dark:text-sky-400',\n PUT: 'text-amber-500 dark:text-amber-400',\n PATCH: 'text-amber-500 dark:text-amber-400',\n DELETE: 'text-red-500 dark:text-rose-500',\n OPTIONS: 'text-violet-500 dark:text-violet-400',\n HEAD: 'text-zinc-500 dark:text-zinc-400',\n TRACE: 'text-fuchsia-500 dark:text-fuchsia-400',\n}\n\ntype SectionBadgeProps = { children: string }\n\nfunction SectionBadge(arg0: SectionBadgeProps) { const { children } = arg0\n\n return (\n <span\n className={clsx(\n 'clarify-navigation-section-badge inline-flex shrink-0 justify-end font-semibold uppercase tracking-wide',\n sectionBadgeColorStyles[children.toUpperCase()] ?? 'clarify-ui-menu-description',\n )}\n >\n {children}\n </span>\n )\n}\n\ntype NavLinkProps = {\n href: string\n children: React.ReactNode\n badge?: string\n icon?: string\n tags?: string[]\n active?: boolean\n isAnchorLink?: boolean\n level?: number\n}\n\nfunction NavLink(arg0: NavLinkProps) { const {\n href,\n children,\n badge,\n icon,\n active = false,\n isAnchorLink = false,\n level,\n} = arg0\n\n function handleClick() {\n if (!isAnchorLink) return\n\n const hashIndex = href.indexOf('#')\n if (hashIndex === -1) return\n\n const targetId = safeDecodeURIComponent(href.slice(hashIndex + 1))\n window.requestAnimationFrame(() => {\n document.getElementById(targetId)?.scrollIntoView()\n window.requestAnimationFrame(() => {\n window.dispatchEvent(new Event('scroll'))\n })\n })\n }\n\n return (\n <CloseButton\n as={Link}\n to={href}\n aria-current={active ? 'page' : undefined}\n onClick={handleClick}\n className={clsx(\n 'clarify-navigation-link flex h-8 items-center justify-between gap-2 pr-3 transition',\n isAnchorLink ? 'clarify-navigation-anchor-link' : 'pl-4',\n )}\n style={isAnchorLink ? { paddingLeft: `${1.75 + Math.max(0, (level ?? 2) - 2) * 0.75}rem` } : undefined}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n {icon ? <NavigationIcon name={icon} className=\"h-3.5 w-3.5\" /> : null}\n {badge ? <SectionBadge>{badge}</SectionBadge> : null}\n <span className=\"min-w-0 truncate whitespace-nowrap\">{children}</span>\n </span>\n </CloseButton>\n )\n}\n\ntype VisibleSectionHighlightProps = { group: NavGroup; pathname: string }\n\nfunction VisibleSectionHighlight(arg0: VisibleSectionHighlightProps) { const { group, pathname } = arg0\n\n const [sections, visibleSections] = useInitialValue(\n [useSectionStore((s) => s.sections), useSectionStore((s) => s.visibleSections)],\n useIsInsideMobileNavigation(),\n )\n\n const isPresent = useIsPresent()\n const firstVisibleSectionIndex = Math.max(\n 0,\n [{ id: '_top' }, ...sections].findIndex((section) => section.id === visibleSections[0]),\n )\n const itemHeight = remToPx(2)\n const height = isPresent ? Math.max(1, visibleSections.length) * itemHeight : itemHeight\n const top = group.links.findIndex((link) => isSameRoutePath(link.href, pathname)) * itemHeight + firstVisibleSectionIndex * itemHeight\n\n return (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, top, height, transition: { duration: 0.2, ease: 'easeOut' } }}\n exit={{ opacity: 0, height: 0, transition: { duration: 0.15, ease: 'easeIn' } }}\n className=\"clarify-navigation-section-highlight absolute inset-x-0 top-0 will-change-transform\"\n style={{ borderRadius: 'var(--clarify-theme-tokens-radius-sm)', height, top }}\n />\n )\n}\n\ntype ActivePageMarkerProps = { group: NavGroup; pathname: string }\n\nfunction ActivePageMarker(arg0: ActivePageMarkerProps) { const { group, pathname } = arg0\n\n const itemHeight = remToPx(2)\n const offset = remToPx(0.25)\n const activePageIndex = group.links.findIndex((link) => isSameRoutePath(link.href, pathname))\n const top = offset + activePageIndex * itemHeight\n\n return (\n <motion.div\n className=\"absolute left-2 h-6 w-px bg-(--clarify-theme-tokens-colors-primary)\"\n initial={{ opacity: 0, top }}\n animate={{ opacity: 1, top, transition: { duration: 0.2, ease: 'easeOut' } }}\n exit={{ opacity: 0, transition: { duration: 0.15, ease: 'easeIn' } }}\n style={{ top }}\n />\n )\n}\n\ntype NavigationGroupProps = { group: NavGroup; className?: string }\n\nfunction NavigationGroup(arg0: NavigationGroupProps) { const { group, className } = arg0\n\n const isInsideMobileNavigation = useIsInsideMobileNavigation()\n const [pathname, sections] = useInitialValue(\n [normalizeRoutePath(useLocation().pathname), useSectionStore((s) => s.sections)],\n isInsideMobileNavigation,\n )\n const isActiveGroup = group.links.findIndex((link) => isSameRoutePath(link.href, pathname)) !== -1\n\n return (\n <li className={clsx('clarify-navigation-group relative mb-6', className)}>\n <h2 className=\"clarify-navigation-group-title flex items-center gap-2\">\n <NavigationIcon name={group.icon} className=\"clarify-navigation-group-title-icon h-3.5 w-3.5\" />\n <span>{group.title}</span>\n </h2>\n <div className=\"relative mt-3 pl-2\">\n <AnimatePresence initial={!isInsideMobileNavigation}>\n {isActiveGroup ? <VisibleSectionHighlight group={group} pathname={pathname} /> : null}\n </AnimatePresence>\n <div className=\"absolute inset-y-0 left-2 w-px bg-(--clarify-theme-tokens-colors-border) dark:bg-white/5\" />\n <AnimatePresence initial={false}>\n {isActiveGroup ? <ActivePageMarker group={group} pathname={pathname} /> : null}\n </AnimatePresence>\n <ul role=\"list\" className=\"border-l border-transparent\">\n {group.links.map((link) => {\n const active = isSameRoutePath(link.href, pathname)\n return (\n <li key={link.href} className=\"relative\">\n <NavLink href={link.href} icon={link.icon} active={active}>\n {link.title}\n </NavLink>\n <AnimatePresence initial={false}>\n {active && sections.length > 0 ? (\n <motion.ul\n role=\"list\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, transition: { delay: 0.1 } }}\n exit={{ opacity: 0, transition: { duration: 0.15 } }}\n >\n {sections.map((section) => (\n <li key={section.id}>\n <NavLink href={`${link.href}#${section.id}`} badge={section.badge} tags={section.tags} isAnchorLink level={section.level}>\n {section.title}\n </NavLink>\n </li>\n ))}\n </motion.ul>\n ) : null}\n </AnimatePresence>\n </li>\n )\n })}\n </ul>\n </div>\n </li>\n )\n}\n\nexport type NavigationProps = { navigation: NavigationNode[]; className?: string }\n\nexport function Navigation(arg0: NavigationProps) { const { navigation, className } = arg0\n\n const t = useBuiltInText()\n const groups = navigationToGroups(navigation, t('navigation.documentation'))\n\n return (\n <nav className={clsx('clarify-navigation', className)}>\n <ul role=\"list\" className=\"clarify-navigation-list\">\n {groups.map((group, groupIndex) => (\n <NavigationGroup key={group.title} group={group} className={groupIndex === 0 ? 'mt-0' : ''} />\n ))}\n </ul>\n </nav>\n )\n}\n","import { Dialog, DialogBackdrop, DialogPanel, Menu, MenuButton, MenuItem, MenuItems, TransitionChild } from '@headlessui/react'\nimport clsx from 'clsx'\nimport { motion } from 'framer-motion'\nimport { Check, ChevronDown, Menu as MenuGlyph, X } from 'lucide-react'\nimport { createContext, Suspense, useContext } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\nimport { create } from 'zustand'\n\nimport { useBuiltInText } from '../i18n'\nimport type { Config, NavigationNode, NavigationTab, RouteItem } from '../types'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nimport { Header } from './Header'\nimport { NavigationIcon } from './icons'\nimport { Navigation } from './Navigation'\n\nconst IsInsideMobileNavigationContext = createContext(false)\n\nfunction hasPath(nodes: NavigationNode[], pathname: string): boolean {\n return nodes.some((node) => isSameRoutePath(node.path, pathname) || hasPath(node.children ?? [], pathname))\n}\n\nfunction isActiveTab(tab: NavigationTab, pathname: string): boolean {\n return isSameRoutePath(tab.path, pathname) || hasPath(tab.children, pathname)\n}\n\ntype MobileTabsSelectProps = { tabs?: NavigationTab[] }\n\nfunction MobileTabsSelect(arg0: MobileTabsSelectProps) {\n const { tabs } = arg0\n const pathname = normalizeRoutePath(useLocation().pathname)\n if (!tabs?.length) return null\n\n const activeTab = tabs.find((tab) => isActiveTab(tab, pathname)) ?? tabs[0]\n\n return (\n <Menu as=\"div\" className=\"clarify-mobile-tabs-select mb-6\">\n <MenuButton className=\"clarify-mobile-tabs-select-trigger clarify-ui-control group flex h-10 w-full items-center justify-between gap-2 rounded-(--clarify-theme-tokens-radius-xl) border border-(--clarify-theme-tokens-colors-border) px-4 text-left font-semibold shadow-xs shadow-zinc-900/5 transition dark:border-white/10\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <NavigationIcon name={activeTab.icon} className=\"h-4 w-4 shrink-0 text-(--clarify-theme-tokens-colors-primary)\" />\n <span className=\"truncate\">{activeTab.title}</span>\n </span>\n <ChevronDown className=\"h-4 w-4 shrink-0 text-(--clarify-theme-tokens-colors-muted) transition-transform group-aria-expanded:rotate-180\" />\n </MenuButton>\n <MenuItems className=\"clarify-mobile-tabs-select-list clarify-ui-menu mt-2 flex flex-col gap-1 rounded-(--clarify-theme-tokens-radius-xl) border border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-surface) p-1 shadow-lg shadow-zinc-900/5 focus:outline-none dark:border-white/10 dark:bg-zinc-900 dark:shadow-none\">\n {tabs.map((tab) => {\n const active = isActiveTab(tab, pathname)\n\n return (\n <MenuItem key={`${tab.title}-${tab.path}`}>\n <Link\n to={tab.path}\n className={clsx(\n 'clarify-mobile-tabs-select-item clarify-ui-menu-item flex items-center justify-between gap-3 rounded-(--clarify-theme-tokens-radius-lg) px-3 py-2.5 no-underline transition',\n active && 'clarify-ui-menu-item-active',\n )}\n aria-current={active ? 'page' : undefined}\n >\n <span className=\"flex min-w-0 items-start gap-2\">\n <NavigationIcon name={tab.icon} className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 whitespace-normal wrap-anywhere font-medium leading-5\">{tab.title}</span>\n </span>\n {active ? <Check className=\"mt-0.5 h-4 w-4 shrink-0\" /> : null}\n </Link>\n </MenuItem>\n )\n })}\n </MenuItems>\n </Menu>\n )\n}\n\ntype MobileNavigationDialogProps = {\n config: Config\n isOpen: boolean\n navigation: NavigationNode[]\n tabs?: NavigationTab[]\n routes: RouteItem[]\n currentLocale?: string\n currentRoute?: RouteItem\n close: () => void\n}\n\nfunction MobileNavigationDialog(arg0: MobileNavigationDialogProps) { const {\n config,\n isOpen,\n navigation,\n tabs,\n routes,\n currentLocale,\n currentRoute,\n close,\n} = arg0\n\n return (\n <Dialog transition open={isOpen} onClose={close} className=\"clarify-mobile-navigation-dialog fixed inset-0 z-50 lg:hidden\">\n <DialogBackdrop\n transition\n className=\"clarify-mobile-navigation-backdrop clarify-ui-backdrop fixed inset-0 top-14 backdrop-blur-xs data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in\"\n />\n\n <DialogPanel>\n <TransitionChild>\n <Header\n config={config}\n navigation={navigation}\n tabs={tabs}\n routes={routes}\n currentLocale={currentLocale}\n currentRoute={currentRoute}\n className=\"data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in\"\n />\n </TransitionChild>\n\n <TransitionChild>\n <motion.div\n layoutScroll\n className=\"clarify-mobile-navigation-panel fixed top-14 bottom-0 left-0 w-full max-w-sm overflow-y-auto bg-(--clarify-theme-tokens-colors-background) px-4 pt-6 pb-4 shadow-lg ring-1 shadow-zinc-900/10 ring-(--clarify-theme-tokens-colors-border) duration-500 ease-in-out data-closed:-translate-x-full sm:px-6 sm:pb-10 dark:bg-zinc-950 dark:ring-zinc-800\"\n >\n <MobileTabsSelect tabs={tabs} />\n <Navigation navigation={navigation} />\n </motion.div>\n </TransitionChild>\n </DialogPanel>\n </Dialog>\n )\n}\n\nexport function useIsInsideMobileNavigation() {\n return useContext(IsInsideMobileNavigationContext)\n}\n\nexport const useMobileNavigationStore = create<{\n isOpen: boolean\n open: () => void\n close: () => void\n toggle: () => void\n}>()((set) => ({\n isOpen: false,\n open: () => set({ isOpen: true }),\n close: () => set({ isOpen: false }),\n toggle: () => set((state) => ({ isOpen: !state.isOpen })),\n}))\n\nexport type MobileNavigationProps = {\n config: Config\n navigation: NavigationNode[]\n tabs?: NavigationTab[]\n routes: RouteItem[]\n currentLocale?: string\n currentRoute?: RouteItem\n}\n\nexport function MobileNavigation(arg0: MobileNavigationProps) { const {\n config,\n navigation,\n tabs,\n routes,\n currentLocale,\n currentRoute,\n} = arg0\n\n const isInsideMobileNavigation = useIsInsideMobileNavigation()\n const { isOpen, toggle, close } = useMobileNavigationStore()\n const t = useBuiltInText()\n const ToggleIcon = isOpen ? X : MenuGlyph\n\n return (\n <IsInsideMobileNavigationContext.Provider value={true}>\n <button\n type=\"button\"\n className=\"clarify-mobile-navigation-button clarify-ui-icon-button relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition\"\n aria-label={t('navigation.toggle')}\n onClick={toggle}\n >\n <span className=\"absolute size-12 pointer-fine:hidden\" />\n <ToggleIcon className=\"h-4 w-4 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-white\" />\n </button>\n {!isInsideMobileNavigation ? (\n <Suspense fallback={null}>\n <MobileNavigationDialog\n config={config}\n navigation={navigation}\n tabs={tabs}\n routes={routes}\n currentLocale={currentLocale}\n currentRoute={currentRoute}\n isOpen={isOpen}\n close={close}\n />\n </Suspense>\n ) : null}\n </IsInsideMobileNavigationContext.Provider>\n )\n}\n","import type { NavigationNode, RouteItem } from '../../types'\n\nimport type { SearchItem } from './types'\n\nfunction routeGroupTitles(navigation: NavigationNode[]) {\n const titles = new Map<string, string>()\n\n for (const node of navigation) {\n if (node.children?.length) {\n for (const child of node.children) {\n titles.set(child.path, node.title)\n }\n } else {\n titles.set(node.path, node.title)\n }\n }\n\n return titles\n}\n\nexport function buildSearchItems(routes: RouteItem[], navigation: NavigationNode[]): SearchItem[] {\n const groupTitles = routeGroupTitles(navigation)\n\n return routes.flatMap((route) => {\n const groupTitle = groupTitles.get(route.path)\n const pageItem: SearchItem = {\n title: route.title,\n pageTitle: route.title,\n sectionTitle: groupTitle,\n url: route.path,\n keywords: [groupTitle, route.title, route.path, route.kind].filter(Boolean).join(' ').toLowerCase(),\n }\n\n const sectionItems = route.sections?.map((section) => ({\n title: section.title,\n pageTitle: route.title,\n sectionTitle: groupTitle,\n url: `${route.path}#${section.id}`,\n keywords: [groupTitle, route.title, section.title, route.path, section.id].filter(Boolean).join(' ').toLowerCase(),\n })) ?? []\n\n return [pageItem, ...sectionItems]\n })\n}\n","import { prefixHref } from '../../utils/href'\n\nimport type { Pagefind } from './types'\n\ntype PagefindModule = {\n createInstance: () => Pagefind\n}\n\nconst pagefindPromises = new Map<string, Promise<Pagefind | null>>()\n\nexport function pagefindCacheKey(routePrefix: string, locale: string | undefined) {\n return `${routePrefix || '/'}:${locale || 'default'}`\n}\n\nexport function loadPagefind(routePrefix: string, locale: string | undefined): Promise<Pagefind | null> {\n if (typeof window === 'undefined') return Promise.resolve(null)\n\n const language = locale ?? document.documentElement.lang\n const cacheKey = pagefindCacheKey(routePrefix, language)\n const cachedPagefind = pagefindPromises.get(cacheKey)\n if (cachedPagefind) {\n return cachedPagefind\n }\n\n const pagefindUrl = prefixHref('/pagefind/pagefind.js', routePrefix)\n const pagefindPromise = import(/* @vite-ignore */ pagefindUrl)\n .then(async (module: PagefindModule) => {\n const previousLanguage = document.documentElement.lang\n if (language) document.documentElement.lang = language\n const pagefind = module.createInstance()\n if (previousLanguage && previousLanguage !== language) document.documentElement.lang = previousLanguage\n await pagefind.init?.()\n return pagefind\n })\n .catch((error: unknown) => {\n pagefindPromises.delete(cacheKey)\n console.warn('[clarify:search] Pagefind instance failed', { cacheKey, language, error })\n return null\n })\n\n pagefindPromises.set(cacheKey, pagefindPromise)\n return pagefindPromise\n}\n\nexport function normalizePagefindUrl(url: string, routePrefix: string): string {\n const parsedUrl = new URL(url, window.location.origin)\n let pathname = parsedUrl.pathname\n const prefix = routePrefix && routePrefix !== '/' ? `/${routePrefix.replace(/^\\/+|\\/+$/g, '')}` : ''\n\n if (prefix && (pathname === prefix || pathname.startsWith(`${prefix}/`))) {\n pathname = pathname.slice(prefix.length) || '/'\n }\n\n return `${pathname}${parsedUrl.search}${parsedUrl.hash}`\n}\n","import clsx from 'clsx'\nimport { LoaderCircle, Search as SearchIcon } from 'lucide-react'\nimport { forwardRef } from 'react'\n\nimport { useBuiltInText } from '../../i18n'\n\nexport const SearchInput = forwardRef<\n React.ElementRef<'input'>,\n {\n query: string\n setQuery: (query: string) => void\n onClose: () => void\n onSubmit: () => void\n activeDescendantId?: string\n loading?: boolean\n }\n>(function SearchInput(arg0, inputRef) {\n const { query, setQuery, onClose, onSubmit, activeDescendantId, loading = false } = arg0\n const t = useBuiltInText()\n const Icon = loading ? LoaderCircle : SearchIcon\n\n return (\n <div className=\"clarify-search-input group relative flex h-12\">\n <Icon\n aria-hidden=\"true\"\n className={clsx(\n 'pointer-events-none absolute top-0 left-3 h-full w-5 stroke-(--clarify-theme-tokens-colors-muted)',\n loading && 'animate-spin',\n )}\n />\n <input\n ref={inputRef}\n data-autofocus\n role=\"combobox\"\n aria-expanded={query !== ''}\n aria-controls=\"clarify-search-results\"\n aria-activedescendant={activeDescendantId}\n value={query}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n if (query) setQuery('')\n else onClose()\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n onSubmit()\n }\n }}\n placeholder={t('search.placeholder')}\n className=\"clarify-search-field flex-auto appearance-none bg-transparent pr-4 pl-10 outline-hidden focus:w-full focus:flex-none [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden [&::-webkit-search-results-button]:hidden [&::-webkit-search-results-decoration]:hidden\"\n />\n </div>\n )\n})\n","import { Fragment } from 'react'\nimport type { ReactNode } from 'react'\n\nfunction stripHtml(value: string): string {\n if (typeof document === 'undefined') return value.replace(/<[^>]*>/g, '')\n const template = document.createElement('template')\n template.innerHTML = value\n return template.content.textContent ?? ''\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\ntype HighlightQueryProps = { text: string; query: string }\n\nexport function HighlightQuery(arg0: HighlightQueryProps) {\n const { text, query } = arg0\n\n if (!query) return text\n\n const parts = text.split(new RegExp(`(${escapeRegExp(query)})`, 'ig'))\n\n return (\n <>\n {parts.map((part, index) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <mark key={index} className=\"bg-transparent text-(--clarify-theme-tokens-colors-primary) underline\">\n {part}\n </mark>\n ) : (\n <Fragment key={index}>{part}</Fragment>\n ),\n )}\n </>\n )\n}\n\nfunction renderExcerptNode(node: ChildNode, key: string): ReactNode {\n if (node.nodeType === Node.TEXT_NODE) return node.textContent\n if (node.nodeType !== Node.ELEMENT_NODE) return null\n\n const element = node as HTMLElement\n const children = Array.from(element.childNodes).map((child, index) => renderExcerptNode(child, `${key}-${index}`))\n\n if (element.tagName.toLowerCase() === 'mark') {\n return (\n <mark key={key} className=\"bg-transparent text-(--clarify-theme-tokens-colors-primary) underline\">\n {children}\n </mark>\n )\n }\n\n return <Fragment key={key}>{children}</Fragment>\n}\n\ntype HighlightExcerptProps = { excerpt: string; query: string }\n\nexport function HighlightExcerpt(arg0: HighlightExcerptProps) {\n const { excerpt, query } = arg0\n\n if (typeof document === 'undefined' || !excerpt.includes('<mark')) {\n return <HighlightQuery text={stripHtml(excerpt)} query={query} />\n }\n\n const template = document.createElement('template')\n template.innerHTML = excerpt\n\n return <>{Array.from(template.content.childNodes).map((node, index) => renderExcerptNode(node, String(index)))}</>\n}\n","import clsx from 'clsx'\nimport { Fragment, useId } from 'react'\n\nimport { HighlightExcerpt, HighlightQuery } from './Highlight'\nimport type { SearchDisplayItem } from './types'\n\ntype SearchResultProps = {\n result: SearchDisplayItem\n query: string\n active: boolean\n onActive: () => void\n onSelect: () => void\n}\n\nexport function SearchResult(arg0: SearchResultProps) {\n const { result, query, active, onActive, onSelect } = arg0\n const id = useId()\n const hierarchy = result.type === 'quick'\n ? [result.sectionTitle, result.pageTitle].filter((value): value is string => typeof value === 'string')\n : []\n\n return (\n <li\n id={id}\n className={clsx('clarify-search-result group block cursor-pointer px-4 py-3', active && 'clarify-search-result-active')}\n aria-selected={active}\n onMouseEnter={onActive}\n onMouseMove={onActive}\n onMouseDown={(event) => {\n event.preventDefault()\n onSelect()\n }}\n >\n <div className=\"clarify-search-result-title\">\n <HighlightQuery text={result.title} query={query} />\n </div>\n {hierarchy.length > 0 ? (\n <div className=\"clarify-search-result-hierarchy mt-1 truncate whitespace-nowrap\">\n {hierarchy.map((item, itemIndex, items) => (\n <Fragment key={`${item}-${itemIndex}`}>\n <HighlightQuery text={item} query={query} />\n <span className={itemIndex === items.length - 1 ? 'sr-only' : 'clarify-search-result-separator mx-2'}>/</span>\n </Fragment>\n ))}\n </div>\n ) : null}\n {result.type === 'full-text' && result.excerpt ? (\n <p className=\"clarify-search-result-excerpt mt-1 line-clamp-2 text-xs leading-5 text-(--clarify-theme-tokens-colors-muted)\">\n <HighlightExcerpt excerpt={result.excerpt} query={query} />\n </p>\n ) : null}\n </li>\n )\n}\n","import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'\nimport clsx from 'clsx'\nimport { SearchX } from 'lucide-react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { useBuiltInText } from '../../i18n'\nimport type { NavigationNode, RouteItem } from '../../types'\n\nimport { buildSearchItems } from './items'\nimport { loadPagefind, normalizePagefindUrl, pagefindCacheKey } from './pagefind'\nimport { SearchInput } from './SearchInput'\nimport { SearchResult } from './SearchResult'\nimport type { FullTextSearchItem, Pagefind, SearchDisplayItem } from './types'\n\ntype SearchDialogProps = {\n open: boolean\n setOpen: (open: boolean) => void\n routes: RouteItem[]\n navigation: NavigationNode[]\n routePrefix?: string\n currentLocale?: string\n className?: string\n onNavigate?: () => void\n}\n\ntype PagefindState = {\n key: string\n pagefind: Pagefind | null\n available: boolean\n}\n\ntype FullTextSearchState = {\n key: string\n results: FullTextSearchItem[] | null\n}\n\nexport function SearchDialog(arg0: SearchDialogProps) {\n const {\n open,\n setOpen,\n routes,\n navigation,\n routePrefix = '/',\n currentLocale,\n className,\n onNavigate = () => {},\n } = arg0\n\n const t = useBuiltInText()\n const navigate = useNavigate()\n const location = useLocation()\n const inputRef = useRef<React.ElementRef<typeof SearchInput>>(null)\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [fullTextState, setFullTextState] = useState<FullTextSearchState | null>(null)\n const [pagefindState, setPagefindState] = useState<PagefindState | null>(null)\n const searchItems = useMemo(() => buildSearchItems(routes, navigation), [navigation, routes])\n const quickResults = useMemo(() => {\n const normalizedQuery = query.trim().toLowerCase()\n if (!normalizedQuery) return []\n return searchItems.filter((item) => item.keywords.includes(normalizedQuery)).slice(0, 8).map((item) => ({ ...item, type: 'quick' as const }))\n }, [query, searchItems])\n\n const pagefindKey = pagefindCacheKey(routePrefix, currentLocale)\n const activePagefindState = pagefindState?.key === pagefindKey ? pagefindState : null\n const pagefind = activePagefindState?.pagefind ?? null\n const pagefindAvailable = activePagefindState?.available ?? null\n const trimmedQuery = query.trim()\n const fullTextKey = `${pagefindKey}:${trimmedQuery}`\n const fullTextResults = fullTextState?.key === fullTextKey ? fullTextState.results : null\n const results: SearchDisplayItem[] = fullTextResults ?? quickResults\n const searchInputLoading = pagefindAvailable === null || Boolean(trimmedQuery && pagefind && fullTextState?.key !== fullTextKey)\n const showNoResults = query && results.length === 0 && pagefindAvailable !== null\n\n useEffect(() => {\n setOpen(false)\n }, [location.pathname, location.search, location.hash, setOpen])\n\n useEffect(() => {\n let cancelled = false\n\n loadPagefind(routePrefix, currentLocale).then((loadedPagefind) => {\n if (cancelled) {\n return\n }\n setPagefindState({ key: pagefindKey, pagefind: loadedPagefind, available: Boolean(loadedPagefind) })\n })\n\n return () => {\n cancelled = true\n }\n }, [currentLocale, pagefindKey, routePrefix])\n\n useEffect(() => {\n let cancelled = false\n if (!trimmedQuery || !pagefind) return undefined\n\n Promise.resolve().then(async () => {\n if (cancelled) return\n\n try {\n const search = await pagefind.search(trimmedQuery, { limit: 8 })\n const data = await Promise.all(search.results.map(async (result) => ({ id: result.id, data: await result.data() })))\n if (cancelled) return\n setFullTextState({\n key: fullTextKey,\n results: data.map(({ id, data }) => ({\n type: 'full-text',\n id,\n title: data.meta.title || data.url,\n url: normalizePagefindUrl(data.url, routePrefix),\n excerpt: data.excerpt,\n })),\n })\n } catch (error: unknown) {\n console.warn('[clarify:search] Pagefind search failed', { currentLocale, query: trimmedQuery, error })\n if (!cancelled) setFullTextState({ key: fullTextKey, results: null })\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [currentLocale, fullTextKey, pagefind, routePrefix, trimmedQuery])\n\n useEffect(() => {\n if (open) return undefined\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n setOpen(true)\n }\n }\n\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [open, setOpen])\n\n const updateQuery = (value: string) => {\n setQuery(value)\n setActiveIndex(0)\n }\n\n function closeDialog() {\n updateQuery('')\n setOpen(false)\n }\n\n function selectResult(result = results[activeIndex]) {\n if (!result) return\n navigate(result.url)\n onNavigate()\n closeDialog()\n }\n\n return (\n <Dialog open={open} onClose={closeDialog} className={clsx('clarify-search-dialog fixed inset-0 z-50', className)}>\n <DialogBackdrop\n transition\n className=\"clarify-search-backdrop clarify-ui-backdrop fixed inset-0 backdrop-blur-xs data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in\"\n />\n\n <div className=\"fixed inset-0 overflow-y-auto px-4 py-4 sm:px-6 sm:py-20 md:py-32 lg:px-8 lg:py-(--clarify-search-dialog-padding-block-lg)\">\n <DialogPanel\n transition\n className=\"clarify-search-panel mx-auto transform-gpu overflow-hidden rounded-(--clarify-theme-tokens-radius-lg) bg-(--clarify-theme-tokens-colors-surface) shadow-xl ring-1 ring-(--clarify-theme-tokens-colors-border) data-closed:scale-95 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:max-w-xl dark:bg-zinc-900 dark:ring-zinc-800\"\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActiveIndex((index) => (results.length ? (index + 1) % results.length : 0))\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActiveIndex((index) => (results.length ? (index - 1 + results.length) % results.length : 0))\n }\n }}\n >\n <SearchInput\n ref={inputRef}\n query={query}\n setQuery={updateQuery}\n onClose={closeDialog}\n onSubmit={() => selectResult()}\n loading={searchInputLoading}\n />\n <div className=\"border-t border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-background) empty:hidden dark:border-zinc-100/5 dark:bg-white/2.5\">\n {showNoResults ? (\n <div className=\"p-6 text-center\">\n <SearchX className=\"mx-auto h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-zinc-600\" />\n <p className=\"mt-2 text-xs text-(--clarify-theme-tokens-colors-muted) dark:text-zinc-400\">\n {t('search.noResults', { query })}\n </p>\n </div>\n ) : null}\n {results.length ? (\n <ul id=\"clarify-search-results\" className=\"clarify-search-results\" role=\"listbox\">\n {results.map((result, resultIndex) => (\n <SearchResult\n key={result.type === 'full-text' ? result.id : result.url}\n result={result}\n query={query}\n active={resultIndex === activeIndex}\n onActive={() => setActiveIndex(resultIndex)}\n onSelect={() => selectResult(result)}\n />\n ))}\n </ul>\n ) : null}\n </div>\n </DialogPanel>\n </div>\n </Dialog>\n )\n}\n","import { useRef, useState } from 'react'\n\nexport function useSearchProps() {\n const buttonRef = useRef<React.ElementRef<'button'>>(null)\n const [open, setOpen] = useState(false)\n\n return {\n buttonProps: {\n ref: buttonRef,\n onClick() {\n setOpen(true)\n },\n },\n dialogProps: {\n open,\n setOpen,\n },\n }\n}\n","import { Search as SearchIcon } from 'lucide-react'\nimport { Suspense } from 'react'\n\nimport { useBuiltInText } from '../i18n'\nimport type { NavigationNode, RouteItem } from '../types'\n\nimport { SearchDialog } from './search/SearchDialog'\nimport { useSearchProps } from './search/useSearchProps'\n\nfunction getModifierKey() {\n if (typeof navigator === 'undefined') return 'Ctrl '\n return /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? '⌘' : 'Ctrl '\n}\n\nexport type SearchProps = { routes: RouteItem[]; navigation: NavigationNode[]; routePrefix?: string; currentLocale?: string }\n\nexport function Search(arg0: SearchProps) { const { routes, navigation, routePrefix, currentLocale } = arg0\n\n const t = useBuiltInText()\n const modifierKey = getModifierKey()\n const { buttonProps, dialogProps } = useSearchProps()\n\n return (\n <div className=\"clarify-search hidden w-80 max-w-(--clarify-search-max-width) lg:block\">\n <button\n type=\"button\"\n className=\"clarify-search-button hidden h-9 w-full items-center gap-2 rounded-(--clarify-theme-tokens-radius-lg) bg-(--clarify-theme-tokens-colors-surface) pr-3 pl-2.5 font-medium ring-1 ring-(--clarify-theme-tokens-colors-border) transition hover:bg-(--clarify-theme-tokens-colors-background) lg:flex dark:bg-white/5 dark:ring-white/10 dark:ring-inset dark:hover:bg-white/10\"\n {...buttonProps}\n >\n <SearchIcon className=\"h-5 w-5 stroke-current\" />\n {t('search.button')}\n <kbd className=\"clarify-search-shortcut ml-auto rounded-(--clarify-theme-tokens-radius-sm) bg-(--clarify-theme-tokens-colors-background) px-1.5 py-0.5 ring-1 ring-(--clarify-theme-tokens-colors-border) dark:bg-white/5 dark:ring-white/10\">\n <kbd className=\"font-sans\">{modifierKey}</kbd>\n <kbd className=\"font-sans\">K</kbd>\n </kbd>\n </button>\n <Suspense fallback={null}>\n <SearchDialog className=\"hidden lg:block\" routes={routes} navigation={navigation} routePrefix={routePrefix} currentLocale={currentLocale} {...dialogProps} />\n </Suspense>\n </div>\n )\n}\n\nexport type MobileSearchProps = {\n routes: RouteItem[]\n navigation: NavigationNode[]\n routePrefix?: string\n currentLocale?: string\n onNavigate?: () => void\n}\n\nexport function MobileSearch(arg0: MobileSearchProps) { const {\n routes,\n navigation,\n routePrefix,\n currentLocale,\n onNavigate,\n} = arg0\n\n const t = useBuiltInText()\n const { buttonProps, dialogProps } = useSearchProps()\n\n return (\n <div className=\"clarify-mobile-search contents lg:hidden\">\n <button\n type=\"button\"\n className=\"clarify-mobile-search-button clarify-ui-control relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition lg:hidden\"\n aria-label={t('search.placeholder')}\n {...buttonProps}\n >\n <span className=\"absolute size-12 pointer-fine:hidden\" />\n <SearchIcon className=\"h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-white\" />\n </button>\n <Suspense fallback={null}>\n <SearchDialog className=\"lg:hidden\" routes={routes} navigation={navigation} routePrefix={routePrefix} currentLocale={currentLocale} onNavigate={onNavigate} {...dialogProps} />\n </Suspense>\n </div>\n )\n}\n","import clsx from 'clsx'\n\nimport type { LogoConfig } from '../core/types'\n\nexport type SiteLogoProps = {\n logo?: LogoConfig\n className?: string\n}\n\nexport function SiteLogo(arg0: SiteLogoProps) { const { logo, className } = arg0\n if (!logo) return null\n\n if (typeof logo === 'string') {\n return <img src={logo} alt=\"\" className={clsx('clarify-logo', className)} />\n }\n\n const lightLogo = logo.light ?? logo.dark\n const darkLogo = logo.dark ?? logo.light\n\n if (!lightLogo || !darkLogo) return null\n if (lightLogo === darkLogo) {\n return <img src={lightLogo} alt=\"\" className={clsx('clarify-logo', className)} />\n }\n\n return (\n <>\n <img src={lightLogo} alt=\"\" className={clsx('clarify-logo clarify-logo-light', className, 'dark:hidden')} />\n <img src={darkLogo} alt=\"\" className={clsx('clarify-logo clarify-logo-dark', className, 'hidden dark:block')} />\n </>\n )\n}\n","import { CloseButton, Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'\nimport clsx from 'clsx'\nimport { motion, useScroll, useTransform } from 'framer-motion'\nimport { Globe2, MoreHorizontal } from 'lucide-react'\nimport { forwardRef } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\n\nimport { useBuiltInText } from '../i18n'\nimport { storeLocalePreference } from '../theme/cookies'\nimport { ThemeToggle } from '../theme/ThemeToggle'\nimport type { Config, LocaleConfig, NavbarLink, NavigationNode, NavigationTab, RouteItem } from '../types'\nimport { isExternalHref, localizeHref } from '../utils/href'\nimport { resolveLocalizedText } from '../utils/localized-text'\nimport { isSameRoutePath, normalizeRoutePath } from '../utils/path'\n\nimport { NavigationIcon } from './icons'\nimport { MobileNavigation, useIsInsideMobileNavigation, useMobileNavigationStore } from './mobile'\nimport { MobileSearch, Search } from './Search'\nimport { SiteLogo } from './SiteLogo'\n\nfunction localizedRoutePath(config: Config, locale: string, route?: RouteItem): string | undefined {\n const alternatePath = route?.alternates?.[locale]\n if (alternatePath) return alternatePath\n if (route?.alternates) return undefined\n return localizeHref(route?.basePath ?? route?.path ?? '/', config, locale)\n}\n\ntype LanguageSwitcherProps = { config: Config; currentLocale?: string; currentRoute?: RouteItem }\n\nfunction LanguageSwitcher(arg0: LanguageSwitcherProps) { const { config, currentLocale, currentRoute } = arg0\n\n const t = useBuiltInText()\n const location = useLocation()\n const i18n = config.i18n\n if (!i18n || i18n.locales.length < 2) return null\n\n const selectedLocale = currentLocale ?? i18n.defaultLocale\n const selectedLocaleConfig = i18n.locales.find(locale => locale.code === selectedLocale) ?? i18n.locales[0]\n const suffix = `${location.search}${location.hash}`\n\n return (\n <Menu as=\"div\" className=\"clarify-language-switcher relative\">\n <MenuButton\n className=\"clarify-language-switcher-button clarify-ui-control flex h-8 items-center gap-1.5 rounded-(--clarify-theme-tokens-radius-md) px-1.5 transition\"\n aria-label={t('language.switch')}\n >\n <span className=\"absolute size-12 pointer-fine:hidden\" />\n <Globe2 className=\"h-5 w-5 stroke-current\" />\n <span className=\"hidden sm:inline\">{selectedLocaleConfig?.label ?? selectedLocale}</span>\n </MenuButton>\n <MenuItems\n transition\n className=\"clarify-language-switcher-menu clarify-ui-menu absolute right-0 z-50 mt-2 w-(--clarify-ui-menu-width) rounded-(--clarify-theme-tokens-radius-xl) bg-(--clarify-theme-tokens-colors-surface) p-1 shadow-lg ring-1 shadow-zinc-900/5 ring-(--clarify-theme-tokens-colors-border) transition data-closed:scale-95 data-closed:opacity-0 data-enter:duration-100 data-enter:ease-out data-leave:duration-75 data-leave:ease-in dark:bg-zinc-900 dark:ring-white/10\"\n >\n {i18n.locales.flatMap((locale: LocaleConfig) => {\n const localizedPath = localizedRoutePath(config, locale.code, currentRoute)\n if (!localizedPath) return []\n\n const selected = locale.code === selectedLocale\n return [\n <MenuItem key={locale.code}>\n {({ focus }) => (\n <Link\n to={`${localizedPath}${suffix}`}\n onClick={() => storeLocalePreference(locale.code)}\n className={clsx(\n 'clarify-language-switcher-item clarify-ui-menu-item flex items-center justify-between rounded-(--clarify-theme-tokens-radius-lg) px-3 py-2 no-underline transition',\n focus && 'clarify-ui-menu-item-focus',\n selected && 'clarify-ui-menu-item-active',\n )}\n aria-current={selected ? 'true' : undefined}\n lang={locale.code}\n dir={locale.dir}\n >\n <span>{locale.label}</span>\n <span className=\"clarify-ui-menu-code\">{locale.code}</span>\n </Link>\n )}\n </MenuItem>,\n ]\n })}\n </MenuItems>\n </Menu>\n )\n}\n\ntype TopLevelNavItemProps = { href: string; children: React.ReactNode }\n\nfunction TopLevelNavItem(arg0: TopLevelNavItemProps) { const { href, children } = arg0\n\n const external = isExternalHref(href)\n\n if (external) {\n return (\n <li>\n <a\n href={href}\n className=\"clarify-ui-top-link transition\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {children}\n </a>\n </li>\n )\n }\n\n return (\n <li>\n <Link\n to={href}\n className=\"clarify-ui-top-link transition\"\n >\n {children}\n </Link>\n </li>\n )\n}\n\ntype MobileNavbarMenuProps = { links?: NavbarLink[]; config: Config; currentLocale?: string }\n\nfunction resolveHomeHref(config: Config, currentLocale?: string): string {\n const homeUrl = config.homeUrl ?? '/'\n return isExternalHref(homeUrl) ? homeUrl : localizeHref(homeUrl, config, currentLocale)\n}\n\nfunction MobileNavbarMenu(arg0: MobileNavbarMenuProps) {\n const { links, config, currentLocale } = arg0\n const t = useBuiltInText()\n if (!links?.length) return null\n\n return (\n <Menu as=\"div\" className=\"clarify-mobile-navbar-menu relative md:hidden\">\n <MenuButton\n className=\"clarify-mobile-navbar-menu-button clarify-ui-control relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition\"\n aria-label={t('navbar.openLinks')}\n >\n <span className=\"absolute size-12 pointer-fine:hidden\" />\n <MoreHorizontal className=\"h-5 w-5\" />\n </MenuButton>\n <MenuItems\n transition\n anchor=\"bottom end\"\n className=\"clarify-mobile-navbar-menu-list clarify-ui-menu z-50 mt-2 w-(--clarify-ui-menu-width) rounded-(--clarify-theme-tokens-radius-xl) border border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-surface) p-1 shadow-lg transition [--anchor-gap:--spacing(2)] focus:outline-none data-closed:scale-95 data-closed:opacity-0 dark:border-white/10 dark:bg-zinc-900\"\n >\n {links.map((link) => {\n const label = resolveLocalizedText(link.label, currentLocale, config.i18n?.defaultLocale)\n const href = localizeHref(link.href, config, currentLocale)\n const external = isExternalHref(href)\n\n return (\n <MenuItem key={link.href}>\n {({ focus }) => {\n const className = clsx(\n 'clarify-mobile-navbar-menu-item clarify-ui-menu-item block rounded-(--clarify-theme-tokens-radius-lg) px-3 py-2 no-underline transition',\n focus && 'clarify-ui-menu-item-focus',\n )\n\n return external ? (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={className}>\n {label}\n </a>\n ) : (\n <Link to={href} className={className}>\n {label}\n </Link>\n )\n }}\n </MenuItem>\n )\n })}\n </MenuItems>\n </Menu>\n )\n}\n\nfunction hasPath(nodes: NavigationNode[], pathname: string): boolean {\n return nodes.some((node) => isSameRoutePath(node.path, pathname) || hasPath(node.children ?? [], pathname))\n}\n\nfunction isActiveTab(tab: NavigationTab, pathname: string): boolean {\n return isSameRoutePath(tab.path, pathname) || hasPath(tab.children, pathname)\n}\n\ntype ProductTabsProps = { tabs?: NavigationTab[] }\n\nfunction ProductTabs(arg0: ProductTabsProps) { const { tabs } = arg0\n\n const t = useBuiltInText()\n const pathname = normalizeRoutePath(useLocation().pathname)\n if (!tabs?.length) return null\n\n return (\n <div className=\"clarify-product-tabs hidden h-14 border-t border-(--clarify-theme-tokens-colors-border) lg:block dark:border-white/10\">\n <nav className=\"clarify-product-tabs-nav mx-auto flex h-full w-full max-w-(--clarify-theme-layout-max-width) items-stretch gap-6 overflow-x-auto px-5\" aria-label={t('navbar.sections')}>\n {tabs.map((tab) => {\n const active = isActiveTab(tab, pathname)\n return (\n <Link\n key={`${tab.title}-${tab.path}`}\n to={tab.path}\n aria-current={active ? 'page' : undefined}\n className={clsx(\n 'clarify-product-tab clarify-ui-tab relative inline-flex h-full shrink-0 items-center gap-2 px-0 transition',\n active && 'clarify-ui-tab-active',\n )}\n >\n <NavigationIcon name={tab.icon} className=\"h-4 w-4\" />\n <span>{tab.title}</span>\n {active ? (\n <motion.span\n layoutId=\"clarify-product-tab-indicator\"\n className=\"absolute inset-x-0 bottom-0 h-0.5 rounded-full bg-(--clarify-theme-tokens-colors-foreground) dark:bg-white\"\n transition={{ type: 'tween', duration: 0.16, ease: 'easeOut' }}\n />\n ) : null}\n </Link>\n )\n })}\n </nav>\n </div>\n )\n}\n\nexport const Header = forwardRef<\n React.ComponentRef<'header'>,\n React.ComponentPropsWithoutRef<typeof motion.header> & {\n config: Config\n navigation: NavigationNode[]\n tabs?: NavigationTab[]\n routes: RouteItem[]\n currentLocale?: string\n currentRoute?: RouteItem\n banner?: React.ReactNode\n }\n>(function Header(arg0, ref) { const { config, navigation, tabs, routes, currentLocale, currentRoute, banner, className, ...props } = arg0\n\n const t = useBuiltInText()\n const { isOpen: mobileNavIsOpen } = useMobileNavigationStore()\n const isInsideMobileNavigation = useIsInsideMobileNavigation()\n const homeHref = resolveHomeHref(config, currentLocale)\n const homeExternal = isExternalHref(homeHref)\n\n const { scrollY } = useScroll()\n const bgOpacityLight = useTransform(scrollY, [0, 72], ['70%', '95%'])\n const bgOpacityDark = useTransform(scrollY, [0, 72], ['60%', '92%'])\n\n return (\n <motion.header\n {...props}\n ref={ref}\n data-pagefind-ignore\n className={clsx(\n className,\n 'clarify-header fixed inset-x-0 top-0 z-50 border-b border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-background)/(--bg-opacity-light) backdrop-blur-xs transition dark:border-white/10 dark:bg-zinc-950/(--bg-opacity-dark) dark:backdrop-blur-sm',\n isInsideMobileNavigation && 'bg-(--clarify-theme-tokens-colors-background) dark:bg-zinc-950',\n )}\n style={\n {\n '--bg-opacity-light': bgOpacityLight,\n '--bg-opacity-dark': bgOpacityDark,\n } as React.CSSProperties\n }\n >\n <div\n className={clsx(\n 'clarify-header-main relative mx-auto flex h-14 w-full max-w-(--clarify-theme-layout-max-width) items-center justify-between gap-6 px-4 sm:px-6 lg:px-5',\n (isInsideMobileNavigation || !mobileNavIsOpen) && 'shadow-none',\n )}\n >\n <div className=\"clarify-header-left flex min-w-0 items-center gap-5\">\n <div className=\"clarify-mobile-brand flex items-center gap-5 lg:hidden\">\n <MobileNavigation config={config} navigation={navigation} tabs={tabs} routes={routes} currentLocale={currentLocale} currentRoute={currentRoute} />\n </div>\n {homeExternal ? (\n <CloseButton as=\"a\" href={homeHref} aria-label={t('navbar.home')} className=\"clarify-brand flex min-w-0 items-center gap-2 no-underline\">\n <SiteLogo logo={config.logo} className=\"h-6 w-auto shrink-0 object-contain\" />\n <span className=\"clarify-brand-title truncate font-semibold\">{config.title}</span>\n </CloseButton>\n ) : (\n <CloseButton as={Link} to={homeHref} aria-label={t('navbar.home')} className=\"clarify-brand flex min-w-0 items-center gap-2 no-underline\">\n <SiteLogo logo={config.logo} className=\"h-6 w-auto shrink-0 object-contain\" />\n <span className=\"clarify-brand-title truncate font-semibold\">{config.title}</span>\n </CloseButton>\n )}\n </div>\n <div className=\"clarify-header-center absolute left-1/2 hidden -translate-x-1/2 lg:block\">\n <Search routes={routes} navigation={navigation} routePrefix={config.routePrefix} currentLocale={currentLocale} />\n </div>\n <div className=\"clarify-header-actions flex shrink-0 items-center gap-5\">\n {config.navbar?.links?.length ? (\n <nav className=\"clarify-top-nav hidden md:block\">\n <ul role=\"list\" className=\"flex items-center gap-8\">\n {config.navbar.links.map((link) => (\n <TopLevelNavItem key={link.href} href={localizeHref(link.href, config, currentLocale)}>\n {resolveLocalizedText(link.label, currentLocale, config.i18n?.defaultLocale)}\n </TopLevelNavItem>\n ))}\n </ul>\n </nav>\n ) : null}\n {config.navbar?.links?.length ? <div className=\"hidden md:block md:h-5 md:w-px md:bg-(--clarify-theme-tokens-colors-border) md:dark:bg-white/15\" /> : null}\n <MobileSearch routes={routes} navigation={navigation} routePrefix={config.routePrefix} currentLocale={currentLocale} />\n <LanguageSwitcher config={config} currentLocale={currentLocale} currentRoute={currentRoute} />\n <ThemeToggle />\n <MobileNavbarMenu links={config.navbar?.links} config={config} currentLocale={currentLocale} />\n </div>\n </div>\n {banner}\n <ProductTabs tabs={tabs} />\n </motion.header>\n )\n})\n","import { createContext, useContext, type ReactNode } from 'react'\n\nimport { ContentActions } from '../shell/ContentActions'\nimport type { RouteItem } from '../types'\n\ntype PageActionsContextValue = {\n route?: RouteItem\n routePrefix?: string\n}\n\ntype PageActionsProviderProps = PageActionsContextValue & {\n children: ReactNode\n}\n\nconst PageActionsContext = createContext<PageActionsContextValue>({})\n\nexport function PageActionsProvider(props: PageActionsProviderProps) {\n const { children, route, routePrefix } = props\n\n return (\n <PageActionsContext.Provider value={{ route, routePrefix }}>\n {children}\n </PageActionsContext.Provider>\n )\n}\n\nexport function PageTitleActions() {\n const { route, routePrefix } = useContext(PageActionsContext)\n\n return <ContentActions route={route} routePrefix={routePrefix} />\n}\n"],"mappings":"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"}
|
|
@@ -116,7 +116,13 @@ var builtInText = {
|
|
|
116
116
|
"renderError.type": "Error type",
|
|
117
117
|
"theme.switchToDark": "Switch to dark theme",
|
|
118
118
|
"theme.switchToLight": "Switch to light theme",
|
|
119
|
-
"
|
|
119
|
+
"theme.switchToSystem": "Follow system theme",
|
|
120
|
+
"language.switch": "Switch language",
|
|
121
|
+
"mermaid.zoomIn": "Zoom in",
|
|
122
|
+
"mermaid.zoomOut": "Zoom out",
|
|
123
|
+
"mermaid.resetZoom": "Reset zoom",
|
|
124
|
+
"mermaid.renderError": "Mermaid render error",
|
|
125
|
+
"mermaid.scrollHint": "Click the diagram to enable scroll-to-zoom"
|
|
120
126
|
},
|
|
121
127
|
"zh-CN": {
|
|
122
128
|
"actions.code": "代码",
|
|
@@ -207,7 +213,13 @@ var builtInText = {
|
|
|
207
213
|
"renderError.type": "错误类型",
|
|
208
214
|
"theme.switchToDark": "切换到深色主题",
|
|
209
215
|
"theme.switchToLight": "切换到浅色主题",
|
|
210
|
-
"
|
|
216
|
+
"theme.switchToSystem": "跟随系统主题",
|
|
217
|
+
"language.switch": "切换语言",
|
|
218
|
+
"mermaid.zoomIn": "放大",
|
|
219
|
+
"mermaid.zoomOut": "缩小",
|
|
220
|
+
"mermaid.resetZoom": "重置缩放",
|
|
221
|
+
"mermaid.renderError": "Mermaid 渲染错误",
|
|
222
|
+
"mermaid.scrollHint": "点击图表后即可滚轮缩放"
|
|
211
223
|
}
|
|
212
224
|
};
|
|
213
225
|
function resolveBuiltInLocale(locale) {
|
|
@@ -259,7 +271,8 @@ function hasLocalePrefix(href, config) {
|
|
|
259
271
|
}
|
|
260
272
|
function localizeHref(href, config, locale) {
|
|
261
273
|
if (!locale || !config.i18n || isExternalHref(href) || href.startsWith("#")) return href;
|
|
262
|
-
if (
|
|
274
|
+
if (hasLocalePrefix(href, config)) return href;
|
|
275
|
+
if (locale === config.i18n.defaultLocale) return href.startsWith("/") ? href : `/${href}`;
|
|
263
276
|
const cleanHref = href === "/" ? "" : href.replace(/^\/+/, "");
|
|
264
277
|
return `/${locale}${cleanHref ? `/${cleanHref}` : ""}`;
|
|
265
278
|
}
|
|
@@ -647,21 +660,45 @@ function useTheme() {
|
|
|
647
660
|
//#endregion
|
|
648
661
|
//#region source/theme/ThemeToggle.tsx
|
|
649
662
|
function ThemeToggle() {
|
|
650
|
-
const {
|
|
663
|
+
const { theme, setTheme } = useTheme();
|
|
651
664
|
const t = useBuiltInText();
|
|
652
|
-
const
|
|
665
|
+
const nextTheme = getNextTheme(theme);
|
|
666
|
+
const label = getThemeLabel(nextTheme, t);
|
|
653
667
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
654
668
|
type: "button",
|
|
655
669
|
className: "clarify-theme-toggle relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition hover:bg-(--clarify-ui-hover-background)",
|
|
656
|
-
"aria-label":
|
|
657
|
-
|
|
670
|
+
"aria-label": label,
|
|
671
|
+
title: label,
|
|
672
|
+
onClick: () => setTheme(nextTheme),
|
|
658
673
|
children: [
|
|
659
674
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "absolute size-12 pointer-fine:hidden" }),
|
|
660
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.
|
|
661
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.
|
|
675
|
+
theme === "system" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Monitor, { className: "h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground)" }) : null,
|
|
676
|
+
theme === "light" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Sun, { className: "h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground)" }) : null,
|
|
677
|
+
theme === "dark" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Moon, { className: "h-5 w-5 stroke-white" }) : null
|
|
662
678
|
]
|
|
663
679
|
});
|
|
664
680
|
}
|
|
681
|
+
function getNextTheme(theme) {
|
|
682
|
+
if (theme === "system") return "light";
|
|
683
|
+
if (theme === "light") return "dark";
|
|
684
|
+
return "system";
|
|
685
|
+
}
|
|
686
|
+
function getThemeLabel(theme, t) {
|
|
687
|
+
if (theme === "dark") return t("theme.switchToDark");
|
|
688
|
+
if (theme === "light") return t("theme.switchToLight");
|
|
689
|
+
return t("theme.switchToSystem");
|
|
690
|
+
}
|
|
691
|
+
//#endregion
|
|
692
|
+
//#region source/utils/localized-text.ts
|
|
693
|
+
/**
|
|
694
|
+
* Resolve a localized text value for the given locale.
|
|
695
|
+
* Falls back to the fallback locale, then the first available value,
|
|
696
|
+
* then an empty string.
|
|
697
|
+
*/
|
|
698
|
+
function resolveLocalizedText(text, locale, fallbackLocale) {
|
|
699
|
+
if (typeof text === "string") return text;
|
|
700
|
+
return (locale ? text[locale] : void 0) ?? (fallbackLocale ? text[fallbackLocale] : void 0) ?? Object.values(text)[0] ?? "";
|
|
701
|
+
}
|
|
665
702
|
//#endregion
|
|
666
703
|
//#region source/utils/path.ts
|
|
667
704
|
function normalizeRoutePath(path) {
|
|
@@ -1040,7 +1077,6 @@ function isActiveTab$1(tab, pathname) {
|
|
|
1040
1077
|
function MobileTabsSelect(arg0) {
|
|
1041
1078
|
const { tabs } = arg0;
|
|
1042
1079
|
const pathname = normalizeRoutePath((0, react_router_dom.useLocation)().pathname);
|
|
1043
|
-
const { close } = useMobileNavigationStore();
|
|
1044
1080
|
if (!tabs?.length) return null;
|
|
1045
1081
|
const activeTab = tabs.find((tab) => isActiveTab$1(tab, pathname)) ?? tabs[0];
|
|
1046
1082
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_headlessui_react.Menu, {
|
|
@@ -1064,7 +1100,6 @@ function MobileTabsSelect(arg0) {
|
|
|
1064
1100
|
const active = isActiveTab$1(tab, pathname);
|
|
1065
1101
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_headlessui_react.MenuItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_router_dom.Link, {
|
|
1066
1102
|
to: tab.path,
|
|
1067
|
-
onClick: close,
|
|
1068
1103
|
className: (0, clsx.default)("clarify-mobile-tabs-select-item clarify-ui-menu-item flex items-center justify-between gap-3 rounded-(--clarify-theme-tokens-radius-lg) px-3 py-2.5 no-underline transition", active && "clarify-ui-menu-item-active"),
|
|
1069
1104
|
"aria-current": active ? "page" : void 0,
|
|
1070
1105
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -1126,7 +1161,7 @@ function MobileNavigation(arg0) {
|
|
|
1126
1161
|
value: true,
|
|
1127
1162
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
1128
1163
|
type: "button",
|
|
1129
|
-
className: "clarify-mobile-navigation-button clarify-ui-icon-button relative flex size-
|
|
1164
|
+
className: "clarify-mobile-navigation-button clarify-ui-icon-button relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition",
|
|
1130
1165
|
"aria-label": t("navigation.toggle"),
|
|
1131
1166
|
onClick: toggle,
|
|
1132
1167
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "absolute size-12 pointer-fine:hidden" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleIcon, { className: "h-4 w-4 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-white" })]
|
|
@@ -1189,48 +1224,21 @@ var pagefindPromises = /* @__PURE__ */ new Map();
|
|
|
1189
1224
|
function pagefindCacheKey(routePrefix, locale) {
|
|
1190
1225
|
return `${routePrefix || "/"}:${locale || "default"}`;
|
|
1191
1226
|
}
|
|
1192
|
-
function logSearchDebug(message, data) {
|
|
1193
|
-
if (typeof window === "undefined") return;
|
|
1194
|
-
console.info(`[clarify:search] ${message}`, data ?? "");
|
|
1195
|
-
}
|
|
1196
1227
|
function loadPagefind(routePrefix, locale) {
|
|
1197
1228
|
if (typeof window === "undefined") return Promise.resolve(null);
|
|
1198
1229
|
const language = locale ?? document.documentElement.lang;
|
|
1199
1230
|
const cacheKey = pagefindCacheKey(routePrefix, language);
|
|
1200
1231
|
const cachedPagefind = pagefindPromises.get(cacheKey);
|
|
1201
|
-
if (cachedPagefind)
|
|
1202
|
-
logSearchDebug("reuse Pagefind instance promise", {
|
|
1203
|
-
cacheKey,
|
|
1204
|
-
language,
|
|
1205
|
-
routePrefix
|
|
1206
|
-
});
|
|
1207
|
-
return cachedPagefind;
|
|
1208
|
-
}
|
|
1209
|
-
const pagefindUrl = prefixHref("/pagefind/pagefind.js", routePrefix);
|
|
1210
|
-
logSearchDebug("create Pagefind instance promise", {
|
|
1211
|
-
cacheKey,
|
|
1212
|
-
language,
|
|
1213
|
-
pagefindUrl,
|
|
1214
|
-
routePrefix
|
|
1215
|
-
});
|
|
1232
|
+
if (cachedPagefind) return cachedPagefind;
|
|
1216
1233
|
const pagefindPromise = import(
|
|
1217
1234
|
/* @vite-ignore */
|
|
1218
|
-
|
|
1235
|
+
prefixHref("/pagefind/pagefind.js", routePrefix)
|
|
1219
1236
|
).then(async (module) => {
|
|
1220
1237
|
const previousLanguage = document.documentElement.lang;
|
|
1221
1238
|
if (language) document.documentElement.lang = language;
|
|
1222
|
-
logSearchDebug("create Pagefind instance", {
|
|
1223
|
-
cacheKey,
|
|
1224
|
-
detectedLanguage: document.documentElement.lang,
|
|
1225
|
-
previousLanguage
|
|
1226
|
-
});
|
|
1227
1239
|
const pagefind = module.createInstance();
|
|
1228
1240
|
if (previousLanguage && previousLanguage !== language) document.documentElement.lang = previousLanguage;
|
|
1229
1241
|
await pagefind.init?.();
|
|
1230
|
-
logSearchDebug("Pagefind instance ready", {
|
|
1231
|
-
cacheKey,
|
|
1232
|
-
language
|
|
1233
|
-
});
|
|
1234
1242
|
return pagefind;
|
|
1235
1243
|
}).catch((error) => {
|
|
1236
1244
|
pagefindPromises.delete(cacheKey);
|
|
@@ -1407,24 +1415,8 @@ function SearchDialog(arg0) {
|
|
|
1407
1415
|
]);
|
|
1408
1416
|
(0, react.useEffect)(() => {
|
|
1409
1417
|
let cancelled = false;
|
|
1410
|
-
logSearchDebug("locale or route prefix changed; reload Pagefind", {
|
|
1411
|
-
currentLocale,
|
|
1412
|
-
routePrefix,
|
|
1413
|
-
documentLanguage: document.documentElement.lang
|
|
1414
|
-
});
|
|
1415
1418
|
loadPagefind(routePrefix, currentLocale).then((loadedPagefind) => {
|
|
1416
|
-
if (cancelled)
|
|
1417
|
-
logSearchDebug("ignore stale Pagefind load", {
|
|
1418
|
-
currentLocale,
|
|
1419
|
-
routePrefix
|
|
1420
|
-
});
|
|
1421
|
-
return;
|
|
1422
|
-
}
|
|
1423
|
-
logSearchDebug("Pagefind load applied", {
|
|
1424
|
-
currentLocale,
|
|
1425
|
-
routePrefix,
|
|
1426
|
-
available: Boolean(loadedPagefind)
|
|
1427
|
-
});
|
|
1419
|
+
if (cancelled) return;
|
|
1428
1420
|
setPagefindState({
|
|
1429
1421
|
key: pagefindKey,
|
|
1430
1422
|
pagefind: loadedPagefind,
|
|
@@ -1433,10 +1425,6 @@ function SearchDialog(arg0) {
|
|
|
1433
1425
|
});
|
|
1434
1426
|
return () => {
|
|
1435
1427
|
cancelled = true;
|
|
1436
|
-
logSearchDebug("cancel Pagefind load effect", {
|
|
1437
|
-
currentLocale,
|
|
1438
|
-
routePrefix
|
|
1439
|
-
});
|
|
1440
1428
|
};
|
|
1441
1429
|
}, [
|
|
1442
1430
|
currentLocale,
|
|
@@ -1449,22 +1437,12 @@ function SearchDialog(arg0) {
|
|
|
1449
1437
|
Promise.resolve().then(async () => {
|
|
1450
1438
|
if (cancelled) return;
|
|
1451
1439
|
try {
|
|
1452
|
-
logSearchDebug("run Pagefind search", {
|
|
1453
|
-
currentLocale,
|
|
1454
|
-
query: trimmedQuery,
|
|
1455
|
-
routePrefix
|
|
1456
|
-
});
|
|
1457
1440
|
const search = await pagefind.search(trimmedQuery, { limit: 8 });
|
|
1458
1441
|
const data = await Promise.all(search.results.map(async (result) => ({
|
|
1459
1442
|
id: result.id,
|
|
1460
1443
|
data: await result.data()
|
|
1461
1444
|
})));
|
|
1462
1445
|
if (cancelled) return;
|
|
1463
|
-
logSearchDebug("Pagefind search results", {
|
|
1464
|
-
currentLocale,
|
|
1465
|
-
query: trimmedQuery,
|
|
1466
|
-
count: data.length
|
|
1467
|
-
});
|
|
1468
1446
|
setFullTextState({
|
|
1469
1447
|
key: fullTextKey,
|
|
1470
1448
|
results: data.map(({ id, data }) => ({
|
|
@@ -1646,7 +1624,7 @@ function MobileSearch(arg0) {
|
|
|
1646
1624
|
className: "clarify-mobile-search contents lg:hidden",
|
|
1647
1625
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
1648
1626
|
type: "button",
|
|
1649
|
-
className: "clarify-mobile-search-button clarify-ui-control relative flex size-
|
|
1627
|
+
className: "clarify-mobile-search-button clarify-ui-control relative flex size-8 items-center justify-center rounded-(--clarify-theme-tokens-radius-md) transition lg:hidden",
|
|
1650
1628
|
"aria-label": t("search.placeholder"),
|
|
1651
1629
|
...buttonProps,
|
|
1652
1630
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "absolute size-12 pointer-fine:hidden" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Search, { className: "h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-white" })]
|
|
@@ -1694,10 +1672,6 @@ function SiteLogo(arg0) {
|
|
|
1694
1672
|
}
|
|
1695
1673
|
//#endregion
|
|
1696
1674
|
//#region source/shell/Header.tsx
|
|
1697
|
-
function resolveLocalizedText(text, locale, fallbackLocale) {
|
|
1698
|
-
if (typeof text === "string") return text;
|
|
1699
|
-
return (locale ? text[locale] : void 0) ?? (fallbackLocale ? text[fallbackLocale] : void 0) ?? Object.values(text)[0] ?? "";
|
|
1700
|
-
}
|
|
1701
1675
|
function localizedRoutePath(config, locale, route) {
|
|
1702
1676
|
const alternatePath = route?.alternates?.[locale];
|
|
1703
1677
|
if (alternatePath) return alternatePath;
|
|
@@ -1717,7 +1691,7 @@ function LanguageSwitcher(arg0) {
|
|
|
1717
1691
|
as: "div",
|
|
1718
1692
|
className: "clarify-language-switcher relative",
|
|
1719
1693
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_headlessui_react.MenuButton, {
|
|
1720
|
-
className: "clarify-language-switcher-button clarify-ui-control flex h-
|
|
1694
|
+
className: "clarify-language-switcher-button clarify-ui-control flex h-8 items-center gap-1.5 rounded-(--clarify-theme-tokens-radius-md) px-1.5 transition",
|
|
1721
1695
|
"aria-label": t("language.switch"),
|
|
1722
1696
|
children: [
|
|
1723
1697
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "absolute size-12 pointer-fine:hidden" }),
|
|
@@ -2113,6 +2087,12 @@ Object.defineProperty(exports, "remToPx", {
|
|
|
2113
2087
|
return remToPx;
|
|
2114
2088
|
}
|
|
2115
2089
|
});
|
|
2090
|
+
Object.defineProperty(exports, "resolveLocalizedText", {
|
|
2091
|
+
enumerable: true,
|
|
2092
|
+
get: function() {
|
|
2093
|
+
return resolveLocalizedText;
|
|
2094
|
+
}
|
|
2095
|
+
});
|
|
2116
2096
|
Object.defineProperty(exports, "resolveLucideIconName", {
|
|
2117
2097
|
enumerable: true,
|
|
2118
2098
|
get: function() {
|
|
@@ -2180,4 +2160,4 @@ Object.defineProperty(exports, "useTheme", {
|
|
|
2180
2160
|
}
|
|
2181
2161
|
});
|
|
2182
2162
|
|
|
2183
|
-
//# sourceMappingURL=PageActions-
|
|
2163
|
+
//# sourceMappingURL=PageActions-DOKkt2zo.cjs.map
|