mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-09 06:06:08 +00:00
9b91f0f42e
Fold the standalone 3x-ui-docs project (Next.js 16 + Fumadocs, deployed to docs.sanaei.dev) into docs/ so the panel and its documentation share a single source of truth, the way sing-box keeps its docs in-tree. The old repo becomes redundant and can be retired. - Import the full site under docs/ (app, components, content, lib, public, scripts, config). The self-contained pnpm project sits alongside the existing engineering notes with no filename collisions. - Re-point "Edit on GitHub" links from MHSanaei/3x-ui-docs to this repo's docs/content/docs path (docs/lib/shared.ts, docs/app/.../page.tsx). - Add docs-ci.yml and docs-deploy.yml under .github/workflows/, scoped to docs/** and run with working-directory: docs, since GitHub only runs workflows from the repo-root .github/. deploy-static.yml's GitHub Pages publish (CNAME docs.sanaei.dev) carries over unchanged. Follow-up (outside this commit): attach the docs.sanaei.dev custom domain to this repository's Pages (or set the Vercel project's root directory to docs), confirm the site is live from the monorepo, then delete MHSanaei/3x-ui-docs.
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
'use client';
|
|
|
|
import { create } from '@orama/orama';
|
|
import { useDocsSearch } from 'fumadocs-core/search/client';
|
|
import { oramaStaticClient } from 'fumadocs-core/search/client/orama-static';
|
|
import {
|
|
SearchDialog,
|
|
SearchDialogClose,
|
|
SearchDialogContent,
|
|
SearchDialogHeader,
|
|
SearchDialogIcon,
|
|
SearchDialogInput,
|
|
SearchDialogList,
|
|
SearchDialogOverlay,
|
|
} from 'fumadocs-ui/components/dialog/search';
|
|
import { useI18n } from 'fumadocs-ui/contexts/i18n';
|
|
import { useMemo } from 'react';
|
|
|
|
interface SharedProps {
|
|
open: boolean;
|
|
onOpenChange: (open: boolean) => void;
|
|
}
|
|
|
|
// The static search index is keyed by locale code (en/fa/ru/zh). Fumadocs'
|
|
// default static dialog feeds those codes to Orama as a tokenizer language, but
|
|
// Orama only accepts full names ("english") and throws on "en" — which silently
|
|
// breaks search entirely. All docs content is English (other locales fall back
|
|
// to it), so re-create the dialog — the documented escape hatch for custom Orama
|
|
// setups — with an initOrama that always builds an English index.
|
|
export default function SearchDialogClient(props: SharedProps) {
|
|
const { locale } = useI18n();
|
|
const client = useMemo(
|
|
() =>
|
|
oramaStaticClient({
|
|
from: '/api/search',
|
|
locale,
|
|
initOrama: () => create({ schema: { _: 'string' }, language: 'english' }),
|
|
}),
|
|
[locale],
|
|
);
|
|
const { search, setSearch, query } = useDocsSearch({ client });
|
|
|
|
return (
|
|
<SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>
|
|
<SearchDialogOverlay />
|
|
<SearchDialogContent>
|
|
<SearchDialogHeader>
|
|
<SearchDialogIcon />
|
|
<SearchDialogInput />
|
|
<SearchDialogClose />
|
|
</SearchDialogHeader>
|
|
<SearchDialogList items={query.data !== 'empty' ? query.data : null} />
|
|
</SearchDialogContent>
|
|
</SearchDialog>
|
|
);
|
|
}
|