@fumadocs/base-ui 16.6.10 → 16.6.12
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/dist/_virtual/_rolldown/runtime.js +6 -11
- package/dist/components/accordion.js +2 -4
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/banner.js +2 -4
- package/dist/components/banner.js.map +1 -1
- package/dist/components/callout.js +1 -2
- package/dist/components/callout.js.map +1 -1
- package/dist/components/card.js +1 -2
- package/dist/components/card.js.map +1 -1
- package/dist/components/codeblock.js +2 -4
- package/dist/components/codeblock.js.map +1 -1
- package/dist/components/codeblock.rsc.js +5 -6
- package/dist/components/codeblock.rsc.js.map +1 -1
- package/dist/components/dialog/search-algolia.js +2 -4
- package/dist/components/dialog/search-algolia.js.map +1 -1
- package/dist/components/dialog/search-default.js +2 -4
- package/dist/components/dialog/search-default.js.map +1 -1
- package/dist/components/dialog/search-orama.js +2 -4
- package/dist/components/dialog/search-orama.js.map +1 -1
- package/dist/components/dialog/search.js +2 -4
- package/dist/components/dialog/search.js.map +1 -1
- package/dist/components/dynamic-codeblock.core.js +2 -4
- package/dist/components/dynamic-codeblock.core.js.map +1 -1
- package/dist/components/dynamic-codeblock.js +2 -4
- package/dist/components/dynamic-codeblock.js.map +1 -1
- package/dist/components/files.js +2 -4
- package/dist/components/files.js.map +1 -1
- package/dist/components/github-info.js +1 -2
- package/dist/components/github-info.js.map +1 -1
- package/dist/components/heading.js +1 -2
- package/dist/components/heading.js.map +1 -1
- package/dist/components/image-zoom.js +3 -5
- package/dist/components/image-zoom.js.map +1 -1
- package/dist/components/inline-toc.js +2 -4
- package/dist/components/inline-toc.js.map +1 -1
- package/dist/components/sidebar/base.js +2 -4
- package/dist/components/sidebar/base.js.map +1 -1
- package/dist/components/sidebar/link-item.js +2 -4
- package/dist/components/sidebar/link-item.js.map +1 -1
- package/dist/components/sidebar/page-tree.js +1 -2
- package/dist/components/sidebar/page-tree.js.map +1 -1
- package/dist/components/sidebar/tabs/dropdown.js +2 -4
- package/dist/components/sidebar/tabs/dropdown.js.map +1 -1
- package/dist/components/sidebar/tabs/index.js +1 -2
- package/dist/components/sidebar/tabs/index.js.map +1 -1
- package/dist/components/steps.js +1 -2
- package/dist/components/steps.js.map +1 -1
- package/dist/components/tabs.js +2 -4
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toc/clerk.js +2 -4
- package/dist/components/toc/clerk.js.map +1 -1
- package/dist/components/toc/default.js +2 -4
- package/dist/components/toc/default.js.map +1 -1
- package/dist/components/toc/index.js +2 -4
- package/dist/components/toc/index.js.map +1 -1
- package/dist/components/type-table.js +2 -4
- package/dist/components/type-table.js.map +1 -1
- package/dist/components/ui/accordion.js +2 -4
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.js +1 -2
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/collapsible.js +2 -4
- package/dist/components/ui/collapsible.js.map +1 -1
- package/dist/components/ui/navigation-menu.js +2 -4
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/popover.js +2 -4
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/scroll-area.js +1 -2
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/tabs.js +2 -4
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/contexts/i18n.js +2 -4
- package/dist/contexts/i18n.js.map +1 -1
- package/dist/contexts/search.js +2 -4
- package/dist/contexts/search.js.map +1 -1
- package/dist/contexts/tree.js +2 -4
- package/dist/contexts/tree.js.map +1 -1
- package/dist/i18n.js +1 -2
- package/dist/i18n.js.map +1 -1
- package/dist/layouts/docs/client.js +2 -4
- package/dist/layouts/docs/client.js.map +1 -1
- package/dist/layouts/docs/index.js +1 -2
- package/dist/layouts/docs/index.js.map +1 -1
- package/dist/layouts/docs/page/client.js +2 -4
- package/dist/layouts/docs/page/client.js.map +1 -1
- package/dist/layouts/docs/page/index.js +1 -2
- package/dist/layouts/docs/page/index.js.map +1 -1
- package/dist/layouts/docs/sidebar.js +2 -4
- package/dist/layouts/docs/sidebar.js.map +1 -1
- package/dist/layouts/flux/index.js +2 -4
- package/dist/layouts/flux/index.js.map +1 -1
- package/dist/layouts/flux/page/client.js +2 -4
- package/dist/layouts/flux/page/client.js.map +1 -1
- package/dist/layouts/flux/page/index.js +1 -2
- package/dist/layouts/flux/page/index.js.map +1 -1
- package/dist/layouts/flux/sidebar.js +2 -4
- package/dist/layouts/flux/sidebar.js.map +1 -1
- package/dist/layouts/flux/tab-dropdown.js +2 -4
- package/dist/layouts/flux/tab-dropdown.js.map +1 -1
- package/dist/layouts/home/client.d.ts +1 -1
- package/dist/layouts/home/client.js +2 -4
- package/dist/layouts/home/client.js.map +1 -1
- package/dist/layouts/home/index.js +1 -2
- package/dist/layouts/home/index.js.map +1 -1
- package/dist/layouts/home/navbar.js +2 -4
- package/dist/layouts/home/navbar.js.map +1 -1
- package/dist/layouts/home/not-found.js +1 -2
- package/dist/layouts/home/not-found.js.map +1 -1
- package/dist/layouts/notebook/client.d.ts +1 -1
- package/dist/layouts/notebook/client.d.ts.map +1 -1
- package/dist/layouts/notebook/client.js +2 -4
- package/dist/layouts/notebook/client.js.map +1 -1
- package/dist/layouts/notebook/index.js +1 -2
- package/dist/layouts/notebook/index.js.map +1 -1
- package/dist/layouts/notebook/page/client.js +2 -4
- package/dist/layouts/notebook/page/client.js.map +1 -1
- package/dist/layouts/notebook/page/index.js +1 -2
- package/dist/layouts/notebook/page/index.js.map +1 -1
- package/dist/layouts/notebook/sidebar.js +2 -4
- package/dist/layouts/notebook/sidebar.js.map +1 -1
- package/dist/layouts/shared/index.d.ts +1 -1
- package/dist/layouts/shared/index.d.ts.map +1 -1
- package/dist/layouts/shared/index.js +1 -2
- package/dist/layouts/shared/index.js.map +1 -1
- package/dist/layouts/shared/language-toggle.js +2 -4
- package/dist/layouts/shared/language-toggle.js.map +1 -1
- package/dist/layouts/shared/search-toggle.js +2 -4
- package/dist/layouts/shared/search-toggle.js.map +1 -1
- package/dist/layouts/shared/theme-toggle.js +2 -4
- package/dist/layouts/shared/theme-toggle.js.map +1 -1
- package/dist/mdx.js +1 -2
- package/dist/mdx.js.map +1 -1
- package/dist/mdx.server.js +1 -2
- package/dist/mdx.server.js.map +1 -1
- package/dist/og/takumi.js +1 -2
- package/dist/og/takumi.js.map +1 -1
- package/dist/og.js +1 -2
- package/dist/og.js.map +1 -1
- package/dist/page.js +2 -4
- package/dist/page.js.map +1 -1
- package/dist/provider/base.js +2 -4
- package/dist/provider/base.js.map +1 -1
- package/dist/provider/next.js +2 -4
- package/dist/provider/next.js.map +1 -1
- package/dist/provider/react-router.js +2 -4
- package/dist/provider/react-router.js.map +1 -1
- package/dist/provider/tanstack.js +2 -4
- package/dist/provider/tanstack.js.map +1 -1
- package/dist/provider/waku.js +2 -4
- package/dist/provider/waku.js.map +1 -1
- package/dist/tailwind/typography.js +1 -2
- package/dist/utils/cn.js +1 -2
- package/dist/utils/link-item.js +2 -4
- package/dist/utils/link-item.js.map +1 -1
- package/dist/utils/merge-refs.js +1 -1
- package/dist/utils/urls.js +1 -1
- package/dist/utils/use-copy-button.js +2 -4
- package/dist/utils/use-copy-button.js.map +1 -1
- package/dist/utils/use-footer-items.js +2 -4
- package/dist/utils/use-footer-items.js.map +1 -1
- package/dist/utils/use-is-scroll-top.js +2 -4
- package/dist/utils/use-is-scroll-top.js.map +1 -1
- package/package.json +5 -5
- package/dist/components/image-zoom-DGvp66QF.css +0 -80
- package/dist/components/image-zoom-DGvp66QF.css.map +0 -1
- package/dist/components/image-zoom2.js +0 -1
|
@@ -2,17 +2,12 @@
|
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __exportAll = (all, no_symbols) => {
|
|
4
4
|
let target = {};
|
|
5
|
-
for (var name in all) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
if (!no_symbols) {
|
|
12
|
-
__defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
13
|
-
}
|
|
5
|
+
for (var name in all) __defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true
|
|
8
|
+
});
|
|
9
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
14
10
|
return target;
|
|
15
11
|
};
|
|
16
|
-
|
|
17
12
|
//#endregion
|
|
18
|
-
export { __exportAll };
|
|
13
|
+
export { __exportAll };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { cn } from "../utils/cn.js";
|
|
4
3
|
import { useCopyButton } from "../utils/use-copy-button.js";
|
|
5
4
|
import { buttonVariants } from "./ui/button.js";
|
|
@@ -8,7 +7,6 @@ import { Accordion as Accordion$1, AccordionContent, AccordionHeader, AccordionI
|
|
|
8
7
|
import { useEffect, useRef, useState } from "react";
|
|
9
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
9
|
import { Check, Link } from "lucide-react";
|
|
11
|
-
|
|
12
10
|
//#region src/components/accordion.tsx
|
|
13
11
|
function Accordions({ ref, className, defaultValue, ...props }) {
|
|
14
12
|
const rootRef = useRef(null);
|
|
@@ -65,7 +63,7 @@ function CopyButton({ id }) {
|
|
|
65
63
|
children: checked ? /* @__PURE__ */ jsx(Check, { className: "size-3.5" }) : /* @__PURE__ */ jsx(Link, { className: "size-3.5" })
|
|
66
64
|
});
|
|
67
65
|
}
|
|
68
|
-
|
|
69
66
|
//#endregion
|
|
70
67
|
export { Accordion, Accordions };
|
|
68
|
+
|
|
71
69
|
//# sourceMappingURL=accordion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","names":["Root","LinkIcon"],"sources":["../../src/components/accordion.tsx"],"sourcesContent":["'use client';\n\nimport { Check, Link as LinkIcon } from 'lucide-react';\nimport { ComponentProps, type ReactNode, useEffect, useRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { useCopyButton } from '@/utils/use-copy-button';\nimport { buttonVariants } from '@/components/ui/button';\nimport { mergeRefs } from '@/utils/merge-refs';\nimport {\n Accordion as Root,\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n AccordionTrigger,\n} from '@/components/ui/accordion';\n\nexport function Accordions({\n ref,\n className,\n defaultValue,\n ...props\n}: ComponentProps<typeof Root>) {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = mergeRefs(ref, rootRef);\n const [value, setValue] = useState<string[]>(defaultValue ?? []);\n\n useEffect(() => {\n const id = window.location.hash.substring(1);\n const element = rootRef.current;\n if (!element || id.length === 0) return;\n\n const selected = document.getElementById(id);\n if (!selected || !element.contains(selected)) return;\n const value = selected.getAttribute('data-accordion-value');\n\n if (value) setValue((prev) => [value, ...prev]);\n }, []);\n\n return (\n <Root\n ref={composedRef}\n value={value}\n onValueChange={setValue}\n className={(s) =>\n cn(\n 'divide-y divide-fd-border overflow-hidden rounded-lg border bg-fd-card',\n typeof className === 'function' ? className(s) : className,\n )\n }\n {...props}\n />\n );\n}\n\nexport function Accordion({\n title,\n id,\n value = String(title),\n children,\n ...props\n}: Omit<ComponentProps<typeof AccordionItem>, 'value' | 'title'> & {\n title: string | ReactNode;\n value?: string;\n}) {\n return (\n <AccordionItem value={value} {...props}>\n <AccordionHeader id={id} data-accordion-value={value}>\n <AccordionTrigger>{title}</AccordionTrigger>\n {id ? <CopyButton id={id} /> : null}\n </AccordionHeader>\n <AccordionContent hiddenUntilFound>\n <div className=\"px-4 pb-2 text-[0.9375rem] prose-no-margin [&[hidden]:not([hidden='until-found'])]:hidden\">\n {children}\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n}\n\nfunction CopyButton({ id }: { id: string }) {\n const [checked, onClick] = useCopyButton(() => {\n const url = new URL(window.location.href);\n url.hash = id;\n\n return navigator.clipboard.writeText(url.toString());\n });\n\n return (\n <button\n type=\"button\"\n aria-label=\"Copy Link\"\n className={cn(\n buttonVariants({\n color: 'ghost',\n className: 'text-fd-muted-foreground me-2',\n }),\n )}\n onClick={onClick}\n >\n {checked ? <Check className=\"size-3.5\" /> : <LinkIcon className=\"size-3.5\" />}\n </button>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"accordion.js","names":["Root","LinkIcon"],"sources":["../../src/components/accordion.tsx"],"sourcesContent":["'use client';\n\nimport { Check, Link as LinkIcon } from 'lucide-react';\nimport { ComponentProps, type ReactNode, useEffect, useRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { useCopyButton } from '@/utils/use-copy-button';\nimport { buttonVariants } from '@/components/ui/button';\nimport { mergeRefs } from '@/utils/merge-refs';\nimport {\n Accordion as Root,\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n AccordionTrigger,\n} from '@/components/ui/accordion';\n\nexport function Accordions({\n ref,\n className,\n defaultValue,\n ...props\n}: ComponentProps<typeof Root>) {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = mergeRefs(ref, rootRef);\n const [value, setValue] = useState<string[]>(defaultValue ?? []);\n\n useEffect(() => {\n const id = window.location.hash.substring(1);\n const element = rootRef.current;\n if (!element || id.length === 0) return;\n\n const selected = document.getElementById(id);\n if (!selected || !element.contains(selected)) return;\n const value = selected.getAttribute('data-accordion-value');\n\n if (value) setValue((prev) => [value, ...prev]);\n }, []);\n\n return (\n <Root\n ref={composedRef}\n value={value}\n onValueChange={setValue}\n className={(s) =>\n cn(\n 'divide-y divide-fd-border overflow-hidden rounded-lg border bg-fd-card',\n typeof className === 'function' ? className(s) : className,\n )\n }\n {...props}\n />\n );\n}\n\nexport function Accordion({\n title,\n id,\n value = String(title),\n children,\n ...props\n}: Omit<ComponentProps<typeof AccordionItem>, 'value' | 'title'> & {\n title: string | ReactNode;\n value?: string;\n}) {\n return (\n <AccordionItem value={value} {...props}>\n <AccordionHeader id={id} data-accordion-value={value}>\n <AccordionTrigger>{title}</AccordionTrigger>\n {id ? <CopyButton id={id} /> : null}\n </AccordionHeader>\n <AccordionContent hiddenUntilFound>\n <div className=\"px-4 pb-2 text-[0.9375rem] prose-no-margin [&[hidden]:not([hidden='until-found'])]:hidden\">\n {children}\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n}\n\nfunction CopyButton({ id }: { id: string }) {\n const [checked, onClick] = useCopyButton(() => {\n const url = new URL(window.location.href);\n url.hash = id;\n\n return navigator.clipboard.writeText(url.toString());\n });\n\n return (\n <button\n type=\"button\"\n aria-label=\"Copy Link\"\n className={cn(\n buttonVariants({\n color: 'ghost',\n className: 'text-fd-muted-foreground me-2',\n }),\n )}\n onClick={onClick}\n >\n {checked ? <Check className=\"size-3.5\" /> : <LinkIcon className=\"size-3.5\" />}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,WAAW,EACzB,KACA,WACA,cACA,GAAG,SAC2B;CAC9B,MAAM,UAAU,OAAuB,KAAK;CAC5C,MAAM,cAAc,UAAU,KAAK,QAAQ;CAC3C,MAAM,CAAC,OAAO,YAAY,SAAmB,gBAAgB,EAAE,CAAC;AAEhE,iBAAgB;EACd,MAAM,KAAK,OAAO,SAAS,KAAK,UAAU,EAAE;EAC5C,MAAM,UAAU,QAAQ;AACxB,MAAI,CAAC,WAAW,GAAG,WAAW,EAAG;EAEjC,MAAM,WAAW,SAAS,eAAe,GAAG;AAC5C,MAAI,CAAC,YAAY,CAAC,QAAQ,SAAS,SAAS,CAAE;EAC9C,MAAM,QAAQ,SAAS,aAAa,uBAAuB;AAE3D,MAAI,MAAO,WAAU,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IAC9C,EAAE,CAAC;AAEN,QACE,oBAACA,aAAD;EACE,KAAK;EACE;EACP,eAAe;EACf,YAAY,MACV,GACE,0EACA,OAAO,cAAc,aAAa,UAAU,EAAE,GAAG,UAClD;EAEH,GAAI;EACJ,CAAA;;AAIN,SAAgB,UAAU,EACxB,OACA,IACA,QAAQ,OAAO,MAAM,EACrB,UACA,GAAG,SAIF;AACD,QACE,qBAAC,eAAD;EAAsB;EAAO,GAAI;YAAjC,CACE,qBAAC,iBAAD;GAAqB;GAAI,wBAAsB;aAA/C,CACE,oBAAC,kBAAD,EAAA,UAAmB,OAAyB,CAAA,EAC3C,KAAK,oBAAC,YAAD,EAAgB,IAAM,CAAA,GAAG,KACf;MAClB,oBAAC,kBAAD;GAAkB,kBAAA;aAChB,oBAAC,OAAD;IAAK,WAAU;IACZ;IACG,CAAA;GACW,CAAA,CACL;;;AAIpB,SAAS,WAAW,EAAE,MAAsB;CAC1C,MAAM,CAAC,SAAS,WAAW,oBAAoB;EAC7C,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,KAAK;AACzC,MAAI,OAAO;AAEX,SAAO,UAAU,UAAU,UAAU,IAAI,UAAU,CAAC;GACpD;AAEF,QACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAW;EACX,WAAW,GACT,eAAe;GACb,OAAO;GACP,WAAW;GACZ,CAAC,CACH;EACQ;YAER,UAAU,oBAAC,OAAD,EAAO,WAAU,YAAa,CAAA,GAAG,oBAACC,MAAD,EAAU,WAAU,YAAa,CAAA;EACtE,CAAA"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { cn } from "../utils/cn.js";
|
|
4
3
|
import { buttonVariants } from "./ui/button.js";
|
|
5
4
|
import { useEffect, useState } from "react";
|
|
6
5
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
import { X } from "lucide-react";
|
|
8
|
-
|
|
9
7
|
//#region src/components/banner.tsx
|
|
10
8
|
function Banner({ id, variant = "normal", changeLayout = true, height = "3rem", rainbowColors = [
|
|
11
9
|
"rgba(0,149,255,0.56)",
|
|
@@ -64,7 +62,7 @@ function flow({ colors }) {
|
|
|
64
62
|
to { background-position: 100% 0; }
|
|
65
63
|
}` })] });
|
|
66
64
|
}
|
|
67
|
-
|
|
68
65
|
//#endregion
|
|
69
66
|
export { Banner };
|
|
67
|
+
|
|
70
68
|
//# sourceMappingURL=banner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","names":[],"sources":["../../src/components/banner.tsx"],"sourcesContent":["'use client';\n\nimport { type HTMLAttributes, useEffect, useState } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from '@/components/ui/button';\n\ntype BannerVariant = 'rainbow' | 'normal';\n\nexport function Banner({\n id,\n variant = 'normal',\n changeLayout = true,\n height = '3rem',\n rainbowColors = [\n 'rgba(0,149,255,0.56)',\n 'rgba(231,77,255,0.77)',\n 'rgba(255,0,0,0.73)',\n 'rgba(131,255,166,0.66)',\n ],\n ...props\n}: HTMLAttributes<HTMLDivElement> & {\n /**\n * @defaultValue 3rem\n */\n height?: string;\n\n /**\n * @defaultValue 'normal'\n */\n variant?: BannerVariant;\n\n /**\n * For rainbow variant only, customise the colors\n */\n rainbowColors?: string[];\n\n /**\n * Change Fumadocs layout styles\n *\n * @defaultValue true\n */\n changeLayout?: boolean;\n}) {\n const [open, setOpen] = useState(true);\n const globalKey = id ? `nd-banner-${id}` : null;\n\n useEffect(() => {\n if (globalKey) setOpen(localStorage.getItem(globalKey) !== 'true');\n }, [globalKey]);\n\n if (!open) return null;\n\n return (\n <div\n id={id}\n {...props}\n className={cn(\n 'sticky top-0 z-40 flex flex-row items-center justify-center px-4 text-center text-sm font-medium',\n variant === 'normal' && 'bg-fd-secondary',\n variant === 'rainbow' && 'bg-fd-background',\n !open && 'hidden',\n props.className,\n )}\n style={{\n height,\n }}\n >\n {changeLayout && open ? (\n <style>\n {globalKey\n ? `:root:not(.${globalKey}) { --fd-banner-height: ${height}; }`\n : `:root { --fd-banner-height: ${height}; }`}\n </style>\n ) : null}\n {globalKey ? <style>{`.${globalKey} #${id} { display: none; }`}</style> : null}\n {globalKey ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `if (localStorage.getItem('${globalKey}') === 'true') document.documentElement.classList.add('${globalKey}');`,\n }}\n />\n ) : null}\n\n {variant === 'rainbow'\n ? flow({\n colors: rainbowColors,\n })\n : null}\n {props.children}\n {id ? (\n <button\n type=\"button\"\n aria-label=\"Close Banner\"\n onClick={() => {\n setOpen(false);\n if (globalKey) localStorage.setItem(globalKey, 'true');\n }}\n className={cn(\n buttonVariants({\n color: 'ghost',\n className: 'absolute end-2 top-1/2 -translate-y-1/2 text-fd-muted-foreground/50',\n size: 'icon-sm',\n }),\n )}\n >\n <X />\n </button>\n ) : null}\n </div>\n );\n}\n\nconst maskImage =\n 'linear-gradient(to bottom,white,transparent), radial-gradient(circle at top center, white, transparent)';\n\nfunction flow({ colors }: { colors: string[] }) {\n return (\n <>\n <div\n className=\"absolute inset-0 z-[-1]\"\n style={\n {\n maskImage,\n maskComposite: 'intersect',\n animation: 'fd-moving-banner 20s linear infinite',\n backgroundImage: `repeating-linear-gradient(70deg, ${[...colors, colors[0]].map((color, i) => `${color} ${(i * 50) / colors.length}%`).join(', ')})`,\n backgroundSize: '200% 100%',\n filter: 'saturate(2)',\n } as object\n }\n />\n <style>\n {`@keyframes fd-moving-banner {\n from { background-position: 0% 0; }\n to { background-position: 100% 0; }\n }`}\n </style>\n </>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"banner.js","names":[],"sources":["../../src/components/banner.tsx"],"sourcesContent":["'use client';\n\nimport { type HTMLAttributes, useEffect, useState } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from '@/components/ui/button';\n\ntype BannerVariant = 'rainbow' | 'normal';\n\nexport function Banner({\n id,\n variant = 'normal',\n changeLayout = true,\n height = '3rem',\n rainbowColors = [\n 'rgba(0,149,255,0.56)',\n 'rgba(231,77,255,0.77)',\n 'rgba(255,0,0,0.73)',\n 'rgba(131,255,166,0.66)',\n ],\n ...props\n}: HTMLAttributes<HTMLDivElement> & {\n /**\n * @defaultValue 3rem\n */\n height?: string;\n\n /**\n * @defaultValue 'normal'\n */\n variant?: BannerVariant;\n\n /**\n * For rainbow variant only, customise the colors\n */\n rainbowColors?: string[];\n\n /**\n * Change Fumadocs layout styles\n *\n * @defaultValue true\n */\n changeLayout?: boolean;\n}) {\n const [open, setOpen] = useState(true);\n const globalKey = id ? `nd-banner-${id}` : null;\n\n useEffect(() => {\n if (globalKey) setOpen(localStorage.getItem(globalKey) !== 'true');\n }, [globalKey]);\n\n if (!open) return null;\n\n return (\n <div\n id={id}\n {...props}\n className={cn(\n 'sticky top-0 z-40 flex flex-row items-center justify-center px-4 text-center text-sm font-medium',\n variant === 'normal' && 'bg-fd-secondary',\n variant === 'rainbow' && 'bg-fd-background',\n !open && 'hidden',\n props.className,\n )}\n style={{\n height,\n }}\n >\n {changeLayout && open ? (\n <style>\n {globalKey\n ? `:root:not(.${globalKey}) { --fd-banner-height: ${height}; }`\n : `:root { --fd-banner-height: ${height}; }`}\n </style>\n ) : null}\n {globalKey ? <style>{`.${globalKey} #${id} { display: none; }`}</style> : null}\n {globalKey ? (\n <script\n dangerouslySetInnerHTML={{\n __html: `if (localStorage.getItem('${globalKey}') === 'true') document.documentElement.classList.add('${globalKey}');`,\n }}\n />\n ) : null}\n\n {variant === 'rainbow'\n ? flow({\n colors: rainbowColors,\n })\n : null}\n {props.children}\n {id ? (\n <button\n type=\"button\"\n aria-label=\"Close Banner\"\n onClick={() => {\n setOpen(false);\n if (globalKey) localStorage.setItem(globalKey, 'true');\n }}\n className={cn(\n buttonVariants({\n color: 'ghost',\n className: 'absolute end-2 top-1/2 -translate-y-1/2 text-fd-muted-foreground/50',\n size: 'icon-sm',\n }),\n )}\n >\n <X />\n </button>\n ) : null}\n </div>\n );\n}\n\nconst maskImage =\n 'linear-gradient(to bottom,white,transparent), radial-gradient(circle at top center, white, transparent)';\n\nfunction flow({ colors }: { colors: string[] }) {\n return (\n <>\n <div\n className=\"absolute inset-0 z-[-1]\"\n style={\n {\n maskImage,\n maskComposite: 'intersect',\n animation: 'fd-moving-banner 20s linear infinite',\n backgroundImage: `repeating-linear-gradient(70deg, ${[...colors, colors[0]].map((color, i) => `${color} ${(i * 50) / colors.length}%`).join(', ')})`,\n backgroundSize: '200% 100%',\n filter: 'saturate(2)',\n } as object\n }\n />\n <style>\n {`@keyframes fd-moving-banner {\n from { background-position: 0% 0; }\n to { background-position: 100% 0; }\n }`}\n </style>\n </>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,OAAO,EACrB,IACA,UAAU,UACV,eAAe,MACf,SAAS,QACT,gBAAgB;CACd;CACA;CACA;CACA;CACD,EACD,GAAG,SAuBF;CACD,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,YAAY,KAAK,aAAa,OAAO;AAE3C,iBAAgB;AACd,MAAI,UAAW,SAAQ,aAAa,QAAQ,UAAU,KAAK,OAAO;IACjE,CAAC,UAAU,CAAC;AAEf,KAAI,CAAC,KAAM,QAAO;AAElB,QACE,qBAAC,OAAD;EACM;EACJ,GAAI;EACJ,WAAW,GACT,oGACA,YAAY,YAAY,mBACxB,YAAY,aAAa,oBACzB,CAAC,QAAQ,UACT,MAAM,UACP;EACD,OAAO,EACL,QACD;YAZH;GAcG,gBAAgB,OACf,oBAAC,SAAD,EAAA,UACG,YACG,cAAc,UAAU,0BAA0B,OAAO,OACzD,+BAA+B,OAAO,MACpC,CAAA,GACN;GACH,YAAY,oBAAC,SAAD,EAAA,UAAQ,IAAI,UAAU,IAAI,GAAG,sBAA6B,CAAA,GAAG;GACzE,YACC,oBAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ,6BAA6B,UAAU,yDAAyD,UAAU,MACnH,EACD,CAAA,GACA;GAEH,YAAY,YACT,KAAK,EACH,QAAQ,eACT,CAAC,GACF;GACH,MAAM;GACN,KACC,oBAAC,UAAD;IACE,MAAK;IACL,cAAW;IACX,eAAe;AACb,aAAQ,MAAM;AACd,SAAI,UAAW,cAAa,QAAQ,WAAW,OAAO;;IAExD,WAAW,GACT,eAAe;KACb,OAAO;KACP,WAAW;KACX,MAAM;KACP,CAAC,CACH;cAED,oBAAC,GAAD,EAAK,CAAA;IACE,CAAA,GACP;GACA;;;AAIV,MAAM,YACJ;AAEF,SAAS,KAAK,EAAE,UAAgC;AAC9C,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EACE,WAAU;EACV,OACE;GACE;GACA,eAAe;GACf,WAAW;GACX,iBAAiB,oCAAoC,CAAC,GAAG,QAAQ,OAAO,GAAG,CAAC,KAAK,OAAO,MAAM,GAAG,MAAM,GAAI,IAAI,KAAM,OAAO,OAAO,GAAG,CAAC,KAAK,KAAK,CAAC;GAClJ,gBAAgB;GAChB,QAAQ;GACT;EAEH,CAAA,EACF,oBAAC,SAAD,EAAA,UACG;;;aAIK,CAAA,CACP,EAAA,CAAA"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { cn } from "../utils/cn.js";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { CircleCheck, CircleX, Info, Lightbulb, TriangleAlert } from "lucide-react";
|
|
4
|
-
|
|
5
4
|
//#region src/components/callout.tsx
|
|
6
5
|
const iconClass = "size-5 -me-0.5 fill-(--callout-color) text-fd-card";
|
|
7
6
|
function Callout({ children, title, ...props }) {
|
|
@@ -57,7 +56,7 @@ function CalloutDescription({ children, className, ...props }) {
|
|
|
57
56
|
children
|
|
58
57
|
});
|
|
59
58
|
}
|
|
60
|
-
|
|
61
59
|
//#endregion
|
|
62
60
|
export { Callout, CalloutContainer, CalloutDescription, CalloutTitle };
|
|
61
|
+
|
|
63
62
|
//# sourceMappingURL=callout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callout.js","names":[],"sources":["../../src/components/callout.tsx"],"sourcesContent":["import { CircleCheck, CircleX, Info, Lightbulb, TriangleAlert } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport type CalloutType = 'info' | 'warn' | 'error' | 'success' | 'warning' | 'idea';\n\nconst iconClass = 'size-5 -me-0.5 fill-(--callout-color) text-fd-card';\n\nexport function Callout({\n children,\n title,\n ...props\n}: { title?: ReactNode } & Omit<CalloutContainerProps, 'title'>) {\n return (\n <CalloutContainer {...props}>\n {title && <CalloutTitle>{title}</CalloutTitle>}\n <CalloutDescription>{children}</CalloutDescription>\n </CalloutContainer>\n );\n}\n\nexport interface CalloutContainerProps extends ComponentProps<'div'> {\n /**\n * @defaultValue info\n */\n type?: CalloutType;\n\n /**\n * Force an icon\n */\n icon?: ReactNode;\n}\n\nfunction resolveAlias(type: CalloutType) {\n if (type === 'warn') return 'warning';\n if ((type as unknown) === 'tip') return 'info';\n return type;\n}\n\nexport function CalloutContainer({\n type: inputType = 'info',\n icon,\n children,\n className,\n style,\n ...props\n}: CalloutContainerProps) {\n const type = resolveAlias(inputType);\n\n return (\n <div\n className={cn(\n 'flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md',\n className,\n )}\n style={\n {\n '--callout-color': `var(--color-fd-${type}, var(--color-fd-muted))`,\n ...style,\n } as object\n }\n {...props}\n >\n <div role=\"none\" className=\"w-0.5 bg-(--callout-color)/50 rounded-sm\" />\n {icon ??\n {\n info: <Info className={iconClass} />,\n warning: <TriangleAlert className={iconClass} />,\n error: <CircleX className={iconClass} />,\n success: <CircleCheck className={iconClass} />,\n idea: (\n <Lightbulb className=\"size-5 -me-0.5 fill-(--callout-color) text-(--callout-color)\" />\n ),\n }[type]}\n <div className=\"flex flex-col gap-2 min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n\nexport function CalloutTitle({ children, className, ...props }: ComponentProps<'p'>) {\n return (\n <p className={cn('font-medium my-0!', className)} {...props}>\n {children}\n </p>\n );\n}\n\nexport function CalloutDescription({ children, className, ...props }: ComponentProps<'p'>) {\n return (\n <div\n className={cn('text-fd-muted-foreground prose-no-margin empty:hidden', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"callout.js","names":[],"sources":["../../src/components/callout.tsx"],"sourcesContent":["import { CircleCheck, CircleX, Info, Lightbulb, TriangleAlert } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport type CalloutType = 'info' | 'warn' | 'error' | 'success' | 'warning' | 'idea';\n\nconst iconClass = 'size-5 -me-0.5 fill-(--callout-color) text-fd-card';\n\nexport function Callout({\n children,\n title,\n ...props\n}: { title?: ReactNode } & Omit<CalloutContainerProps, 'title'>) {\n return (\n <CalloutContainer {...props}>\n {title && <CalloutTitle>{title}</CalloutTitle>}\n <CalloutDescription>{children}</CalloutDescription>\n </CalloutContainer>\n );\n}\n\nexport interface CalloutContainerProps extends ComponentProps<'div'> {\n /**\n * @defaultValue info\n */\n type?: CalloutType;\n\n /**\n * Force an icon\n */\n icon?: ReactNode;\n}\n\nfunction resolveAlias(type: CalloutType) {\n if (type === 'warn') return 'warning';\n if ((type as unknown) === 'tip') return 'info';\n return type;\n}\n\nexport function CalloutContainer({\n type: inputType = 'info',\n icon,\n children,\n className,\n style,\n ...props\n}: CalloutContainerProps) {\n const type = resolveAlias(inputType);\n\n return (\n <div\n className={cn(\n 'flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md',\n className,\n )}\n style={\n {\n '--callout-color': `var(--color-fd-${type}, var(--color-fd-muted))`,\n ...style,\n } as object\n }\n {...props}\n >\n <div role=\"none\" className=\"w-0.5 bg-(--callout-color)/50 rounded-sm\" />\n {icon ??\n {\n info: <Info className={iconClass} />,\n warning: <TriangleAlert className={iconClass} />,\n error: <CircleX className={iconClass} />,\n success: <CircleCheck className={iconClass} />,\n idea: (\n <Lightbulb className=\"size-5 -me-0.5 fill-(--callout-color) text-(--callout-color)\" />\n ),\n }[type]}\n <div className=\"flex flex-col gap-2 min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n\nexport function CalloutTitle({ children, className, ...props }: ComponentProps<'p'>) {\n return (\n <p className={cn('font-medium my-0!', className)} {...props}>\n {children}\n </p>\n );\n}\n\nexport function CalloutDescription({ children, className, ...props }: ComponentProps<'p'>) {\n return (\n <div\n className={cn('text-fd-muted-foreground prose-no-margin empty:hidden', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":";;;;AAMA,MAAM,YAAY;AAElB,SAAgB,QAAQ,EACtB,UACA,OACA,GAAG,SAC4D;AAC/D,QACE,qBAAC,kBAAD;EAAkB,GAAI;YAAtB,CACG,SAAS,oBAAC,cAAD,EAAA,UAAe,OAAqB,CAAA,EAC9C,oBAAC,oBAAD,EAAqB,UAA8B,CAAA,CAClC;;;AAgBvB,SAAS,aAAa,MAAmB;AACvC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAK,SAAqB,MAAO,QAAO;AACxC,QAAO;;AAGT,SAAgB,iBAAiB,EAC/B,MAAM,YAAY,QAClB,MACA,UACA,WACA,OACA,GAAG,SACqB;CACxB,MAAM,OAAO,aAAa,UAAU;AAEpC,QACE,qBAAC,OAAD;EACE,WAAW,GACT,mGACA,UACD;EACD,OACE;GACE,mBAAmB,kBAAkB,KAAK;GAC1C,GAAG;GACJ;EAEH,GAAI;YAXN;GAaE,oBAAC,OAAD;IAAK,MAAK;IAAO,WAAU;IAA6C,CAAA;GACvE,QACC;IACE,MAAM,oBAAC,MAAD,EAAM,WAAW,WAAa,CAAA;IACpC,SAAS,oBAAC,eAAD,EAAe,WAAW,WAAa,CAAA;IAChD,OAAO,oBAAC,SAAD,EAAS,WAAW,WAAa,CAAA;IACxC,SAAS,oBAAC,aAAD,EAAa,WAAW,WAAa,CAAA;IAC9C,MACE,oBAAC,WAAD,EAAW,WAAU,gEAAiE,CAAA;IAEzF,CAAC;GACJ,oBAAC,OAAD;IAAK,WAAU;IAAsC;IAAe,CAAA;GAChE;;;AAIV,SAAgB,aAAa,EAAE,UAAU,WAAW,GAAG,SAA8B;AACnF,QACE,oBAAC,KAAD;EAAG,WAAW,GAAG,qBAAqB,UAAU;EAAE,GAAI;EACnD;EACC,CAAA;;AAIR,SAAgB,mBAAmB,EAAE,UAAU,WAAW,GAAG,SAA8B;AACzF,QACE,oBAAC,OAAD;EACE,WAAW,GAAG,yDAAyD,UAAU;EACjF,GAAI;EAEH;EACG,CAAA"}
|
package/dist/components/card.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { cn } from "../utils/cn.js";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import Link from "fumadocs-core/link";
|
|
4
|
-
|
|
5
4
|
//#region src/components/card.tsx
|
|
6
5
|
function Cards(props) {
|
|
7
6
|
return /* @__PURE__ */ jsx("div", {
|
|
@@ -35,7 +34,7 @@ function Card({ icon, title, description, ...props }) {
|
|
|
35
34
|
]
|
|
36
35
|
});
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
//#endregion
|
|
40
38
|
export { Card, Cards };
|
|
39
|
+
|
|
41
40
|
//# sourceMappingURL=card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","names":[],"sources":["../../src/components/card.tsx"],"sourcesContent":["import Link from 'fumadocs-core/link';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport function Cards(props: HTMLAttributes<HTMLDivElement>) {\n return (\n <div {...props} className={cn('grid grid-cols-2 gap-3 @container', props.className)}>\n {props.children}\n </div>\n );\n}\n\nexport type CardProps = Omit<HTMLAttributes<HTMLElement>, 'title'> & {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n\n href?: string;\n external?: boolean;\n};\n\nexport function Card({ icon, title, description, ...props }: CardProps) {\n const E = props.href ? Link : 'div';\n\n return (\n <E\n {...props}\n data-card\n className={cn(\n 'block rounded-xl border bg-fd-card p-4 text-fd-card-foreground transition-colors @max-lg:col-span-full',\n props.href && 'hover:bg-fd-accent/80',\n props.className,\n )}\n >\n {icon ? (\n <div className=\"not-prose mb-2 w-fit shadow-md rounded-lg border bg-fd-muted p-1.5 text-fd-muted-foreground [&_svg]:size-4\">\n {icon}\n </div>\n ) : null}\n <h3 className=\"not-prose mb-1 text-sm font-medium\">{title}</h3>\n {description ? <p className=\"my-0! text-sm text-fd-muted-foreground\">{description}</p> : null}\n <div className=\"text-sm text-fd-muted-foreground prose-no-margin empty:hidden\">\n {props.children}\n </div>\n </E>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"card.js","names":[],"sources":["../../src/components/card.tsx"],"sourcesContent":["import Link from 'fumadocs-core/link';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport function Cards(props: HTMLAttributes<HTMLDivElement>) {\n return (\n <div {...props} className={cn('grid grid-cols-2 gap-3 @container', props.className)}>\n {props.children}\n </div>\n );\n}\n\nexport type CardProps = Omit<HTMLAttributes<HTMLElement>, 'title'> & {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n\n href?: string;\n external?: boolean;\n};\n\nexport function Card({ icon, title, description, ...props }: CardProps) {\n const E = props.href ? Link : 'div';\n\n return (\n <E\n {...props}\n data-card\n className={cn(\n 'block rounded-xl border bg-fd-card p-4 text-fd-card-foreground transition-colors @max-lg:col-span-full',\n props.href && 'hover:bg-fd-accent/80',\n props.className,\n )}\n >\n {icon ? (\n <div className=\"not-prose mb-2 w-fit shadow-md rounded-lg border bg-fd-muted p-1.5 text-fd-muted-foreground [&_svg]:size-4\">\n {icon}\n </div>\n ) : null}\n <h3 className=\"not-prose mb-1 text-sm font-medium\">{title}</h3>\n {description ? <p className=\"my-0! text-sm text-fd-muted-foreground\">{description}</p> : null}\n <div className=\"text-sm text-fd-muted-foreground prose-no-margin empty:hidden\">\n {props.children}\n </div>\n </E>\n );\n}\n"],"mappings":";;;;AAIA,SAAgB,MAAM,OAAuC;AAC3D,QACE,oBAAC,OAAD;EAAK,GAAI;EAAO,WAAW,GAAG,qCAAqC,MAAM,UAAU;YAChF,MAAM;EACH,CAAA;;AAaV,SAAgB,KAAK,EAAE,MAAM,OAAO,aAAa,GAAG,SAAoB;AAGtE,QACE,qBAHQ,MAAM,OAAO,OAAO,OAG5B;EACE,GAAI;EACJ,aAAA;EACA,WAAW,GACT,0GACA,MAAM,QAAQ,yBACd,MAAM,UACP;YAPH;GASG,OACC,oBAAC,OAAD;IAAK,WAAU;cACZ;IACG,CAAA,GACJ;GACJ,oBAAC,MAAD;IAAI,WAAU;cAAsC;IAAW,CAAA;GAC9D,cAAc,oBAAC,KAAD;IAAG,WAAU;cAA0C;IAAgB,CAAA,GAAG;GACzF,oBAAC,OAAD;IAAK,WAAU;cACZ,MAAM;IACH,CAAA;GACJ"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { cn } from "../utils/cn.js";
|
|
4
3
|
import { useCopyButton } from "../utils/use-copy-button.js";
|
|
5
4
|
import { buttonVariants } from "./ui/button.js";
|
|
@@ -8,7 +7,6 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs.js";
|
|
|
8
7
|
import { createContext, use, useMemo, useRef } from "react";
|
|
9
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
9
|
import { Check, Clipboard } from "lucide-react";
|
|
11
|
-
|
|
12
10
|
//#region src/components/codeblock.tsx
|
|
13
11
|
const TabsContext = createContext(null);
|
|
14
12
|
function Pre(props) {
|
|
@@ -120,7 +118,7 @@ function CodeBlockTabsTrigger({ children, className, ...props }) {
|
|
|
120
118
|
function CodeBlockTab(props) {
|
|
121
119
|
return /* @__PURE__ */ jsx(TabsContent, { ...props });
|
|
122
120
|
}
|
|
123
|
-
|
|
124
121
|
//#endregion
|
|
125
122
|
export { CodeBlock, CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger, Pre };
|
|
123
|
+
|
|
126
124
|
//# sourceMappingURL=codeblock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeblock.js","names":[],"sources":["../../src/components/codeblock.tsx"],"sourcesContent":["'use client';\nimport { Check, Clipboard } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n use,\n useMemo,\n useRef,\n} from 'react';\nimport { cn } from '@/utils/cn';\nimport { useCopyButton } from '@/utils/use-copy-button';\nimport { buttonVariants } from '@/components/ui/button';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { mergeRefs } from '@/utils/merge-refs';\n\nexport interface CodeBlockProps extends ComponentProps<'figure'> {\n /**\n * Icon of code block\n *\n * When passed as a string, it assumes the value is the HTML of icon\n */\n icon?: ReactNode;\n\n /**\n * Allow to copy code with copy button\n *\n * @defaultValue true\n */\n allowCopy?: boolean;\n\n /**\n * Keep original background color generated by Shiki or Rehype Code\n *\n * @defaultValue false\n */\n keepBackground?: boolean;\n\n viewportProps?: HTMLAttributes<HTMLElement>;\n\n /**\n * show line numbers\n */\n 'data-line-numbers'?: boolean;\n\n /**\n * @defaultValue 1\n */\n 'data-line-numbers-start'?: number;\n\n Actions?: (props: { className?: string; children?: ReactNode }) => ReactNode;\n}\n\nconst TabsContext = createContext<{\n containerRef: RefObject<HTMLDivElement | null>;\n nested: boolean;\n} | null>(null);\n\nexport function Pre(props: ComponentProps<'pre'>) {\n return (\n <pre {...props} className={cn('min-w-full w-max *:flex *:flex-col', props.className)}>\n {props.children}\n </pre>\n );\n}\n\nexport function CodeBlock({\n ref,\n title,\n allowCopy = true,\n keepBackground = false,\n icon,\n viewportProps = {},\n children,\n Actions = (props) => <div {...props} className={cn('empty:hidden', props.className)} />,\n ...props\n}: CodeBlockProps) {\n const inTab = use(TabsContext) !== null;\n const areaRef = useRef<HTMLDivElement>(null);\n\n return (\n <figure\n ref={ref}\n dir=\"ltr\"\n {...props}\n tabIndex={-1}\n className={cn(\n inTab ? 'bg-fd-secondary -mx-px -mb-px last:rounded-b-xl' : 'my-4 bg-fd-card rounded-xl',\n keepBackground && 'bg-(--shiki-light-bg) dark:bg-(--shiki-dark-bg)',\n\n 'shiki relative border shadow-sm not-prose overflow-hidden text-sm',\n props.className,\n )}\n >\n {title ? (\n <div className=\"flex text-fd-muted-foreground items-center gap-2 h-9.5 border-b px-4\">\n {typeof icon === 'string' ? (\n <div\n className=\"[&_svg]:size-3.5\"\n dangerouslySetInnerHTML={{\n __html: icon,\n }}\n />\n ) : (\n icon\n )}\n <figcaption className=\"flex-1 truncate\">{title}</figcaption>\n {Actions({\n className: '-me-2',\n children: allowCopy && <CopyButton containerRef={areaRef} />,\n })}\n </div>\n ) : (\n Actions({\n className:\n 'absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground',\n children: allowCopy && <CopyButton containerRef={areaRef} />,\n })\n )}\n <div\n ref={areaRef}\n {...viewportProps}\n role=\"region\"\n tabIndex={0}\n className={cn(\n 'text-[0.8125rem] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring',\n viewportProps.className,\n )}\n style={\n {\n // space for toolbar\n '--padding-right': !title ? 'calc(var(--spacing) * 8)' : undefined,\n counterSet: props['data-line-numbers']\n ? `line ${Number(props['data-line-numbers-start'] ?? 1) - 1}`\n : undefined,\n ...viewportProps.style,\n } as object\n }\n >\n {children}\n </div>\n </figure>\n );\n}\n\nfunction CopyButton({\n className,\n containerRef,\n ...props\n}: ComponentProps<'button'> & {\n containerRef: RefObject<HTMLElement | null>;\n}) {\n const [checked, onClick] = useCopyButton(() => {\n const pre = containerRef.current?.getElementsByTagName('pre').item(0);\n if (!pre) return;\n\n const clone = pre.cloneNode(true) as HTMLElement;\n clone.querySelectorAll('.nd-copy-ignore').forEach((node) => {\n node.replaceWith('\\n');\n });\n\n void navigator.clipboard.writeText(clone.textContent ?? '');\n });\n\n return (\n <button\n type=\"button\"\n data-checked={checked || undefined}\n className={cn(\n buttonVariants({\n className: 'hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground',\n size: 'icon-xs',\n }),\n className,\n )}\n aria-label={checked ? 'Copied Text' : 'Copy Text'}\n onClick={onClick}\n {...props}\n >\n {checked ? <Check /> : <Clipboard />}\n </button>\n );\n}\n\nexport function CodeBlockTabs({ ref, className, ...props }: ComponentProps<typeof Tabs>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const nested = use(TabsContext) !== null;\n\n return (\n <Tabs\n ref={mergeRefs(containerRef, ref)}\n {...props}\n className={(s) =>\n cn(\n 'bg-fd-card rounded-xl border',\n !nested && 'my-4',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <TabsContext\n value={useMemo(\n () => ({\n containerRef,\n nested,\n }),\n [nested],\n )}\n >\n {props.children}\n </TabsContext>\n </Tabs>\n );\n}\n\nexport function CodeBlockTabsList({ className, ...props }: ComponentProps<typeof TabsList>) {\n return (\n <TabsList\n {...props}\n className={(s) =>\n cn(\n 'flex flex-row px-2 overflow-x-auto text-fd-muted-foreground',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n {props.children}\n </TabsList>\n );\n}\n\nexport function CodeBlockTabsTrigger({\n children,\n className,\n ...props\n}: ComponentProps<typeof TabsTrigger>) {\n return (\n <TabsTrigger\n {...props}\n className={(s) =>\n cn(\n 'relative group inline-flex text-sm font-medium text-nowrap items-center transition-colors gap-2 px-2 py-1.5 [&_svg]:size-3.5',\n s.active ? 'text-fd-primary' : 'hover:text-fd-accent-foreground',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <div className=\"absolute inset-x-2 bottom-0 h-px group-data-active:bg-fd-primary\" />\n {children}\n </TabsTrigger>\n );\n}\n\nexport function CodeBlockTab(props: ComponentProps<typeof TabsContent>) {\n return <TabsContent {...props} />;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"codeblock.js","names":[],"sources":["../../src/components/codeblock.tsx"],"sourcesContent":["'use client';\nimport { Check, Clipboard } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n use,\n useMemo,\n useRef,\n} from 'react';\nimport { cn } from '@/utils/cn';\nimport { useCopyButton } from '@/utils/use-copy-button';\nimport { buttonVariants } from '@/components/ui/button';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { mergeRefs } from '@/utils/merge-refs';\n\nexport interface CodeBlockProps extends ComponentProps<'figure'> {\n /**\n * Icon of code block\n *\n * When passed as a string, it assumes the value is the HTML of icon\n */\n icon?: ReactNode;\n\n /**\n * Allow to copy code with copy button\n *\n * @defaultValue true\n */\n allowCopy?: boolean;\n\n /**\n * Keep original background color generated by Shiki or Rehype Code\n *\n * @defaultValue false\n */\n keepBackground?: boolean;\n\n viewportProps?: HTMLAttributes<HTMLElement>;\n\n /**\n * show line numbers\n */\n 'data-line-numbers'?: boolean;\n\n /**\n * @defaultValue 1\n */\n 'data-line-numbers-start'?: number;\n\n Actions?: (props: { className?: string; children?: ReactNode }) => ReactNode;\n}\n\nconst TabsContext = createContext<{\n containerRef: RefObject<HTMLDivElement | null>;\n nested: boolean;\n} | null>(null);\n\nexport function Pre(props: ComponentProps<'pre'>) {\n return (\n <pre {...props} className={cn('min-w-full w-max *:flex *:flex-col', props.className)}>\n {props.children}\n </pre>\n );\n}\n\nexport function CodeBlock({\n ref,\n title,\n allowCopy = true,\n keepBackground = false,\n icon,\n viewportProps = {},\n children,\n Actions = (props) => <div {...props} className={cn('empty:hidden', props.className)} />,\n ...props\n}: CodeBlockProps) {\n const inTab = use(TabsContext) !== null;\n const areaRef = useRef<HTMLDivElement>(null);\n\n return (\n <figure\n ref={ref}\n dir=\"ltr\"\n {...props}\n tabIndex={-1}\n className={cn(\n inTab ? 'bg-fd-secondary -mx-px -mb-px last:rounded-b-xl' : 'my-4 bg-fd-card rounded-xl',\n keepBackground && 'bg-(--shiki-light-bg) dark:bg-(--shiki-dark-bg)',\n\n 'shiki relative border shadow-sm not-prose overflow-hidden text-sm',\n props.className,\n )}\n >\n {title ? (\n <div className=\"flex text-fd-muted-foreground items-center gap-2 h-9.5 border-b px-4\">\n {typeof icon === 'string' ? (\n <div\n className=\"[&_svg]:size-3.5\"\n dangerouslySetInnerHTML={{\n __html: icon,\n }}\n />\n ) : (\n icon\n )}\n <figcaption className=\"flex-1 truncate\">{title}</figcaption>\n {Actions({\n className: '-me-2',\n children: allowCopy && <CopyButton containerRef={areaRef} />,\n })}\n </div>\n ) : (\n Actions({\n className:\n 'absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground',\n children: allowCopy && <CopyButton containerRef={areaRef} />,\n })\n )}\n <div\n ref={areaRef}\n {...viewportProps}\n role=\"region\"\n tabIndex={0}\n className={cn(\n 'text-[0.8125rem] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring',\n viewportProps.className,\n )}\n style={\n {\n // space for toolbar\n '--padding-right': !title ? 'calc(var(--spacing) * 8)' : undefined,\n counterSet: props['data-line-numbers']\n ? `line ${Number(props['data-line-numbers-start'] ?? 1) - 1}`\n : undefined,\n ...viewportProps.style,\n } as object\n }\n >\n {children}\n </div>\n </figure>\n );\n}\n\nfunction CopyButton({\n className,\n containerRef,\n ...props\n}: ComponentProps<'button'> & {\n containerRef: RefObject<HTMLElement | null>;\n}) {\n const [checked, onClick] = useCopyButton(() => {\n const pre = containerRef.current?.getElementsByTagName('pre').item(0);\n if (!pre) return;\n\n const clone = pre.cloneNode(true) as HTMLElement;\n clone.querySelectorAll('.nd-copy-ignore').forEach((node) => {\n node.replaceWith('\\n');\n });\n\n void navigator.clipboard.writeText(clone.textContent ?? '');\n });\n\n return (\n <button\n type=\"button\"\n data-checked={checked || undefined}\n className={cn(\n buttonVariants({\n className: 'hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground',\n size: 'icon-xs',\n }),\n className,\n )}\n aria-label={checked ? 'Copied Text' : 'Copy Text'}\n onClick={onClick}\n {...props}\n >\n {checked ? <Check /> : <Clipboard />}\n </button>\n );\n}\n\nexport function CodeBlockTabs({ ref, className, ...props }: ComponentProps<typeof Tabs>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const nested = use(TabsContext) !== null;\n\n return (\n <Tabs\n ref={mergeRefs(containerRef, ref)}\n {...props}\n className={(s) =>\n cn(\n 'bg-fd-card rounded-xl border',\n !nested && 'my-4',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <TabsContext\n value={useMemo(\n () => ({\n containerRef,\n nested,\n }),\n [nested],\n )}\n >\n {props.children}\n </TabsContext>\n </Tabs>\n );\n}\n\nexport function CodeBlockTabsList({ className, ...props }: ComponentProps<typeof TabsList>) {\n return (\n <TabsList\n {...props}\n className={(s) =>\n cn(\n 'flex flex-row px-2 overflow-x-auto text-fd-muted-foreground',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n {props.children}\n </TabsList>\n );\n}\n\nexport function CodeBlockTabsTrigger({\n children,\n className,\n ...props\n}: ComponentProps<typeof TabsTrigger>) {\n return (\n <TabsTrigger\n {...props}\n className={(s) =>\n cn(\n 'relative group inline-flex text-sm font-medium text-nowrap items-center transition-colors gap-2 px-2 py-1.5 [&_svg]:size-3.5',\n s.active ? 'text-fd-primary' : 'hover:text-fd-accent-foreground',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <div className=\"absolute inset-x-2 bottom-0 h-px group-data-active:bg-fd-primary\" />\n {children}\n </TabsTrigger>\n );\n}\n\nexport function CodeBlockTab(props: ComponentProps<typeof TabsContent>) {\n return <TabsContent {...props} />;\n}\n"],"mappings":";;;;;;;;;;AAuDA,MAAM,cAAc,cAGV,KAAK;AAEf,SAAgB,IAAI,OAA8B;AAChD,QACE,oBAAC,OAAD;EAAK,GAAI;EAAO,WAAW,GAAG,sCAAsC,MAAM,UAAU;YACjF,MAAM;EACH,CAAA;;AAIV,SAAgB,UAAU,EACxB,KACA,OACA,YAAY,MACZ,iBAAiB,OACjB,MACA,gBAAgB,EAAE,EAClB,UACA,WAAW,UAAU,oBAAC,OAAD;CAAK,GAAI;CAAO,WAAW,GAAG,gBAAgB,MAAM,UAAU;CAAI,CAAA,EACvF,GAAG,SACc;CACjB,MAAM,QAAQ,IAAI,YAAY,KAAK;CACnC,MAAM,UAAU,OAAuB,KAAK;AAE5C,QACE,qBAAC,UAAD;EACO;EACL,KAAI;EACJ,GAAI;EACJ,UAAU;EACV,WAAW,GACT,QAAQ,oDAAoD,8BAC5D,kBAAkB,mDAElB,qEACA,MAAM,UACP;YAXH,CAaG,QACC,qBAAC,OAAD;GAAK,WAAU;aAAf;IACG,OAAO,SAAS,WACf,oBAAC,OAAD;KACE,WAAU;KACV,yBAAyB,EACvB,QAAQ,MACT;KACD,CAAA,GAEF;IAEF,oBAAC,cAAD;KAAY,WAAU;eAAmB;KAAmB,CAAA;IAC3D,QAAQ;KACP,WAAW;KACX,UAAU,aAAa,oBAAC,YAAD,EAAY,cAAc,SAAW,CAAA;KAC7D,CAAC;IACE;OAEN,QAAQ;GACN,WACE;GACF,UAAU,aAAa,oBAAC,YAAD,EAAY,cAAc,SAAW,CAAA;GAC7D,CAAC,EAEJ,oBAAC,OAAD;GACE,KAAK;GACL,GAAI;GACJ,MAAK;GACL,UAAU;GACV,WAAW,GACT,+KACA,cAAc,UACf;GACD,OACE;IAEE,mBAAmB,CAAC,QAAQ,6BAA6B,KAAA;IACzD,YAAY,MAAM,uBACd,QAAQ,OAAO,MAAM,8BAA8B,EAAE,GAAG,MACxD,KAAA;IACJ,GAAG,cAAc;IAClB;GAGF;GACG,CAAA,CACC;;;AAIb,SAAS,WAAW,EAClB,WACA,cACA,GAAG,SAGF;CACD,MAAM,CAAC,SAAS,WAAW,oBAAoB;EAC7C,MAAM,MAAM,aAAa,SAAS,qBAAqB,MAAM,CAAC,KAAK,EAAE;AACrE,MAAI,CAAC,IAAK;EAEV,MAAM,QAAQ,IAAI,UAAU,KAAK;AACjC,QAAM,iBAAiB,kBAAkB,CAAC,SAAS,SAAS;AAC1D,QAAK,YAAY,KAAK;IACtB;AAEG,YAAU,UAAU,UAAU,MAAM,eAAe,GAAG;GAC3D;AAEF,QACE,oBAAC,UAAD;EACE,MAAK;EACL,gBAAc,WAAW,KAAA;EACzB,WAAW,GACT,eAAe;GACb,WAAW;GACX,MAAM;GACP,CAAC,EACF,UACD;EACD,cAAY,UAAU,gBAAgB;EAC7B;EACT,GAAI;YAEH,UAAU,oBAAC,OAAD,EAAS,CAAA,GAAG,oBAAC,WAAD,EAAa,CAAA;EAC7B,CAAA;;AAIb,SAAgB,cAAc,EAAE,KAAK,WAAW,GAAG,SAAsC;CACvF,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,SAAS,IAAI,YAAY,KAAK;AAEpC,QACE,oBAAC,MAAD;EACE,KAAK,UAAU,cAAc,IAAI;EACjC,GAAI;EACJ,YAAY,MACV,GACE,gCACA,CAAC,UAAU,QACX,OAAO,cAAc,aAAa,UAAU,EAAE,GAAG,UAClD;YAGH,oBAAC,aAAD;GACE,OAAO,eACE;IACL;IACA;IACD,GACD,CAAC,OAAO,CACT;aAEA,MAAM;GACK,CAAA;EACT,CAAA;;AAIX,SAAgB,kBAAkB,EAAE,WAAW,GAAG,SAA0C;AAC1F,QACE,oBAAC,UAAD;EACE,GAAI;EACJ,YAAY,MACV,GACE,+DACA,OAAO,cAAc,aAAa,UAAU,EAAE,GAAG,UAClD;YAGF,MAAM;EACE,CAAA;;AAIf,SAAgB,qBAAqB,EACnC,UACA,WACA,GAAG,SACkC;AACrC,QACE,qBAAC,aAAD;EACE,GAAI;EACJ,YAAY,MACV,GACE,gIACA,EAAE,SAAS,oBAAoB,mCAC/B,OAAO,cAAc,aAAa,UAAU,EAAE,GAAG,UAClD;YAPL,CAUE,oBAAC,OAAD,EAAK,WAAU,oEAAqE,CAAA,EACnF,SACW;;;AAIlB,SAAgB,aAAa,OAA2C;AACtE,QAAO,oBAAC,aAAD,EAAa,GAAI,OAAS,CAAA"}
|
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import { cn } from "../utils/cn.js";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import "./codeblock.js";
|
|
3
|
+
import "react/jsx-runtime";
|
|
4
4
|
import { highlight } from "fumadocs-core/highlight";
|
|
5
|
-
|
|
6
5
|
//#region src/components/codeblock.rsc.tsx
|
|
7
6
|
async function ServerCodeBlock({ code, codeblock, ...options }) {
|
|
8
7
|
return await highlight(code, {
|
|
9
8
|
...options,
|
|
10
9
|
components: {
|
|
11
10
|
pre: (props) => {
|
|
12
|
-
|
|
11
|
+
({
|
|
13
12
|
...props,
|
|
14
13
|
...codeblock
|
|
15
|
-
}, cn("my-0", props.className, codeblock?.className),
|
|
14
|
+
}), cn("my-0", props.className, codeblock?.className), props.children;
|
|
16
15
|
},
|
|
17
16
|
...options.components
|
|
18
17
|
}
|
|
19
18
|
});
|
|
20
19
|
}
|
|
21
|
-
|
|
22
20
|
//#endregion
|
|
23
21
|
export { ServerCodeBlock };
|
|
22
|
+
|
|
24
23
|
//# sourceMappingURL=codeblock.rsc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeblock.rsc.js","names":["Base.CodeBlock","Base.Pre"],"sources":["../../src/components/codeblock.rsc.tsx"],"sourcesContent":["import * as Base from './codeblock';\nimport { highlight, type HighlightOptions } from 'fumadocs-core/highlight';\nimport { cn } from '@/utils/cn';\n\nexport type ServerCodeBlockProps = HighlightOptions & {\n code: string;\n\n /**\n * Extra props for the underlying `<CodeBlock />` component.\n *\n * Ignored if you defined your own `pre` component in `components`.\n */\n codeblock?: Base.CodeBlockProps;\n};\n\nexport async function ServerCodeBlock({ code, codeblock, ...options }: ServerCodeBlockProps) {\n return await highlight(code, {\n ...options,\n components: {\n pre: (props) => {\n <Base.CodeBlock\n {...props}\n {...codeblock}\n className={cn('my-0', props.className, codeblock?.className)}\n >\n <Base.Pre>{props.children}</Base.Pre>\n </Base.CodeBlock>;\n },\n ...options.components,\n },\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"codeblock.rsc.js","names":["Base.CodeBlock","Base.Pre"],"sources":["../../src/components/codeblock.rsc.tsx"],"sourcesContent":["import * as Base from './codeblock';\nimport { highlight, type HighlightOptions } from 'fumadocs-core/highlight';\nimport { cn } from '@/utils/cn';\n\nexport type ServerCodeBlockProps = HighlightOptions & {\n code: string;\n\n /**\n * Extra props for the underlying `<CodeBlock />` component.\n *\n * Ignored if you defined your own `pre` component in `components`.\n */\n codeblock?: Base.CodeBlockProps;\n};\n\nexport async function ServerCodeBlock({ code, codeblock, ...options }: ServerCodeBlockProps) {\n return await highlight(code, {\n ...options,\n components: {\n pre: (props) => {\n <Base.CodeBlock\n {...props}\n {...codeblock}\n className={cn('my-0', props.className, codeblock?.className)}\n >\n <Base.Pre>{props.children}</Base.Pre>\n </Base.CodeBlock>;\n },\n ...options.components,\n },\n });\n}\n"],"mappings":";;;;;AAeA,eAAsB,gBAAgB,EAAE,MAAM,WAAW,GAAG,WAAiC;AAC3F,QAAO,MAAM,UAAU,MAAM;EAC3B,GAAG;EACH,YAAY;GACV,MAAM,UAAU;AACbA,KAGC;KAFA,GAAI;KACJ,GAAI;KACyD,GAAlD,GAAG,QAAQ,MAAM,WAAW,WAAW,UAAU,EAEjD,MAAM;;GAGrB,GAAG,QAAQ;GACZ;EACF,CAAC"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { useI18n } from "../../contexts/i18n.js";
|
|
4
3
|
import { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogOverlay, TagsList, TagsListItem } from "./search.js";
|
|
5
4
|
import { useMemo, useState } from "react";
|
|
6
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
import { useOnChange } from "fumadocs-core/utils/use-on-change";
|
|
8
7
|
import { useDocsSearch } from "fumadocs-core/search/client";
|
|
9
|
-
|
|
10
8
|
//#region src/components/dialog/search-algolia.tsx
|
|
11
9
|
function AlgoliaSearchDialog({ searchOptions, tags = [], defaultTag, showAlgolia = false, allowClear = false, links = [], footer, ...props }) {
|
|
12
10
|
const [tag, setTag] = useState(defaultTag);
|
|
@@ -62,7 +60,7 @@ function AlgoliaTitle() {
|
|
|
62
60
|
children: "Search powered by Algolia"
|
|
63
61
|
});
|
|
64
62
|
}
|
|
65
|
-
|
|
66
63
|
//#endregion
|
|
67
64
|
export { AlgoliaSearchDialog as default };
|
|
65
|
+
|
|
68
66
|
//# sourceMappingURL=search-algolia.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-algolia.js","names":[],"sources":["../../../src/components/dialog/search-algolia.tsx"],"sourcesContent":["'use client';\n\nimport { type AlgoliaOptions, useDocsSearch } from 'fumadocs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from 'fumadocs-core/utils/use-on-change';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from 'fumadocs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\nimport { useI18n } from '@/contexts/i18n';\n\nexport interface AlgoliaSearchDialogProps extends SharedProps {\n searchOptions: AlgoliaOptions;\n links?: SearchLink[];\n\n footer?: ReactNode;\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Add the \"Powered by Algolia\" label, this is useful for free tier users\n *\n * @defaultValue false\n */\n showAlgolia?: boolean;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\nexport default function AlgoliaSearchDialog({\n searchOptions,\n tags = [],\n defaultTag,\n showAlgolia = false,\n allowClear = false,\n links = [],\n footer,\n ...props\n}: AlgoliaSearchDialogProps) {\n const [tag, setTag] = useState(defaultTag);\n const { locale } = useI18n();\n const { search, setSearch, query } = useDocsSearch({\n type: 'algolia',\n tag,\n locale,\n ...searchOptions,\n });\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n const label = showAlgolia && <AlgoliaTitle />;\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n </SearchDialogContent>\n <SearchDialogFooter>\n {tags.length > 0 ? (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n {label}\n </TagsList>\n ) : (\n label\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialog>\n );\n}\n\nfunction AlgoliaTitle() {\n return (\n <a\n href=\"https://algolia.com\"\n rel=\"noreferrer noopener\"\n className=\"ms-auto text-xs text-fd-muted-foreground\"\n >\n Search powered by Algolia\n </a>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-algolia.js","names":[],"sources":["../../../src/components/dialog/search-algolia.tsx"],"sourcesContent":["'use client';\n\nimport { type AlgoliaOptions, useDocsSearch } from 'fumadocs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from 'fumadocs-core/utils/use-on-change';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from 'fumadocs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\nimport { useI18n } from '@/contexts/i18n';\n\nexport interface AlgoliaSearchDialogProps extends SharedProps {\n searchOptions: AlgoliaOptions;\n links?: SearchLink[];\n\n footer?: ReactNode;\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Add the \"Powered by Algolia\" label, this is useful for free tier users\n *\n * @defaultValue false\n */\n showAlgolia?: boolean;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\nexport default function AlgoliaSearchDialog({\n searchOptions,\n tags = [],\n defaultTag,\n showAlgolia = false,\n allowClear = false,\n links = [],\n footer,\n ...props\n}: AlgoliaSearchDialogProps) {\n const [tag, setTag] = useState(defaultTag);\n const { locale } = useI18n();\n const { search, setSearch, query } = useDocsSearch({\n type: 'algolia',\n tag,\n locale,\n ...searchOptions,\n });\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n const label = showAlgolia && <AlgoliaTitle />;\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n </SearchDialogContent>\n <SearchDialogFooter>\n {tags.length > 0 ? (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n {label}\n </TagsList>\n ) : (\n label\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialog>\n );\n}\n\nfunction AlgoliaTitle() {\n return (\n <a\n href=\"https://algolia.com\"\n rel=\"noreferrer noopener\"\n className=\"ms-auto text-xs text-fd-muted-foreground\"\n >\n Search powered by Algolia\n </a>\n );\n}\n"],"mappings":";;;;;;;;AA+CA,SAAwB,oBAAoB,EAC1C,eACA,OAAO,EAAE,EACT,YACA,cAAc,OACd,aAAa,OACb,QAAQ,EAAE,EACV,QACA,GAAG,SACwB;CAC3B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,EAAE,QAAQ,WAAW,UAAU,cAAc;EACjD,MAAM;EACN;EACA;EACA,GAAG;EACJ,CAAC;CACF,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;CAEF,MAAM,QAAQ,eAAe,oBAAC,cAAD,EAAgB,CAAA;AAE7C,QACE,qBAAC,cAAD;EAAsB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;YAAzF;GACE,oBAAC,qBAAD,EAAuB,CAAA;GACvB,qBAAC,qBAAD,EAAA,UAAA,CACE,qBAAC,oBAAD,EAAA,UAAA;IACE,oBAAC,kBAAD,EAAoB,CAAA;IACpB,oBAAC,mBAAD,EAAqB,CAAA;IACrB,oBAAC,mBAAD,EAAqB,CAAA;IACF,EAAA,CAAA,EACrB,oBAAC,kBAAD,EAAkB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,cAAgB,CAAA,CAC3D,EAAA,CAAA;GACtB,qBAAC,oBAAD,EAAA,UAAA,CACG,KAAK,SAAS,IACb,qBAAC,UAAD;IAAe;IAAK,aAAa;IAAoB;cAArD,CACG,KAAK,KAAK,QACT,oBAAC,cAAD;KAA8B,OAAO,IAAI;eACtC,IAAI;KACQ,EAFI,IAAI,MAER,CACf,EACD,MACQ;QAEX,OAED,OACkB,EAAA,CAAA;GACR;;;AAInB,SAAS,eAAe;AACtB,QACE,oBAAC,KAAD;EACE,MAAK;EACL,KAAI;EACJ,WAAU;YACX;EAEG,CAAA"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { useI18n } from "../../contexts/i18n.js";
|
|
4
3
|
import { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogOverlay, TagsList, TagsListItem } from "./search.js";
|
|
5
4
|
import { useMemo, useState } from "react";
|
|
6
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
import { useOnChange } from "fumadocs-core/utils/use-on-change";
|
|
8
7
|
import { useDocsSearch } from "fumadocs-core/search/client";
|
|
9
|
-
|
|
10
8
|
//#region src/components/dialog/search-default.tsx
|
|
11
9
|
function DefaultSearchDialog({ defaultTag, tags = [], api, delayMs, type = "fetch", allowClear = false, links = [], footer, ...props }) {
|
|
12
10
|
const { locale } = useI18n();
|
|
@@ -60,7 +58,7 @@ function DefaultSearchDialog({ defaultTag, tags = [], api, delayMs, type = "fetc
|
|
|
60
58
|
]
|
|
61
59
|
});
|
|
62
60
|
}
|
|
63
|
-
|
|
64
61
|
//#endregion
|
|
65
62
|
export { DefaultSearchDialog as default };
|
|
63
|
+
|
|
66
64
|
//# sourceMappingURL=search-default.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-default.js","names":[],"sources":["../../../src/components/dialog/search-default.tsx"],"sourcesContent":["'use client';\n\nimport { useDocsSearch } from 'fumadocs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from 'fumadocs-core/utils/use-on-change';\nimport { useI18n } from '@/contexts/i18n';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from 'fumadocs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\n\nexport interface DefaultSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n\n /**\n * @defaultValue 'fetch'\n */\n type?: 'fetch' | 'static';\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Search API URL\n */\n api?: string;\n\n /**\n * The debounced delay for performing a search.\n */\n delayMs?: number;\n\n footer?: ReactNode;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\nexport default function DefaultSearchDialog({\n defaultTag,\n tags = [],\n api,\n delayMs,\n type = 'fetch',\n allowClear = false,\n links = [],\n footer,\n ...props\n}: DefaultSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch(\n type === 'fetch'\n ? {\n type: 'fetch',\n api,\n locale,\n tag,\n delayMs,\n }\n : {\n type: 'static',\n from: api,\n locale,\n tag,\n delayMs,\n },\n );\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n </SearchDialogContent>\n <SearchDialogFooter>\n {tags.length > 0 && (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n </TagsList>\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialog>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-default.js","names":[],"sources":["../../../src/components/dialog/search-default.tsx"],"sourcesContent":["'use client';\n\nimport { useDocsSearch } from 'fumadocs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from 'fumadocs-core/utils/use-on-change';\nimport { useI18n } from '@/contexts/i18n';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from 'fumadocs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\n\nexport interface DefaultSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n\n /**\n * @defaultValue 'fetch'\n */\n type?: 'fetch' | 'static';\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Search API URL\n */\n api?: string;\n\n /**\n * The debounced delay for performing a search.\n */\n delayMs?: number;\n\n footer?: ReactNode;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\nexport default function DefaultSearchDialog({\n defaultTag,\n tags = [],\n api,\n delayMs,\n type = 'fetch',\n allowClear = false,\n links = [],\n footer,\n ...props\n}: DefaultSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch(\n type === 'fetch'\n ? {\n type: 'fetch',\n api,\n locale,\n tag,\n delayMs,\n }\n : {\n type: 'static',\n from: api,\n locale,\n tag,\n delayMs,\n },\n );\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n </SearchDialogContent>\n <SearchDialogFooter>\n {tags.length > 0 && (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n </TagsList>\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialog>\n );\n}\n"],"mappings":";;;;;;;;AAsDA,SAAwB,oBAAoB,EAC1C,YACA,OAAO,EAAE,EACT,KACA,SACA,OAAO,SACP,aAAa,OACb,QAAQ,EAAE,EACV,QACA,GAAG,SACwB;CAC3B,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,QAAQ,WAAW,UAAU,cACnC,SAAS,UACL;EACE,MAAM;EACN;EACA;EACA;EACA;EACD,GACD;EACE,MAAM;EACN,MAAM;EACN;EACA;EACA;EACD,CACN;CACD,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;AAEF,QACE,qBAAC,cAAD;EAAsB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;YAAzF;GACE,oBAAC,qBAAD,EAAuB,CAAA;GACvB,qBAAC,qBAAD,EAAA,UAAA,CACE,qBAAC,oBAAD,EAAA,UAAA;IACE,oBAAC,kBAAD,EAAoB,CAAA;IACpB,oBAAC,mBAAD,EAAqB,CAAA;IACrB,oBAAC,mBAAD,EAAqB,CAAA;IACF,EAAA,CAAA,EACrB,oBAAC,kBAAD,EAAkB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,cAAgB,CAAA,CAC3D,EAAA,CAAA;GACtB,qBAAC,oBAAD,EAAA,UAAA,CACG,KAAK,SAAS,KACb,oBAAC,UAAD;IAAe;IAAK,aAAa;IAAoB;cAClD,KAAK,KAAK,QACT,oBAAC,cAAD;KAA8B,OAAO,IAAI;eACtC,IAAI;KACQ,EAFI,IAAI,MAER,CACf;IACO,CAAA,EAEZ,OACkB,EAAA,CAAA;GACR"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { useI18n } from "../../contexts/i18n.js";
|
|
4
3
|
import { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogOverlay, TagsList, TagsListItem } from "./search.js";
|
|
5
4
|
import { useMemo, useState } from "react";
|
|
6
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
import { useOnChange } from "fumadocs-core/utils/use-on-change";
|
|
8
7
|
import { useDocsSearch } from "fumadocs-core/search/client";
|
|
9
|
-
|
|
10
8
|
//#region src/components/dialog/search-orama.tsx
|
|
11
9
|
/**
|
|
12
10
|
* Orama Cloud integration
|
|
@@ -67,7 +65,7 @@ function Label() {
|
|
|
67
65
|
children: "Search powered by Orama"
|
|
68
66
|
});
|
|
69
67
|
}
|
|
70
|
-
|
|
71
68
|
//#endregion
|
|
72
69
|
export { OramaSearchDialog as default };
|
|
70
|
+
|
|
73
71
|
//# sourceMappingURL=search-orama.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-orama.js","names":[],"sources":["../../../src/components/dialog/search-orama.tsx"],"sourcesContent":["'use client';\n\nimport { type OramaCloudOptions, useDocsSearch } from 'fumadocs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from 'fumadocs-core/utils/use-on-change';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from 'fumadocs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\nimport { useI18n } from '@/contexts/i18n';\n\nexport interface OramaSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n client: OramaCloudOptions['client'];\n searchOptions?: OramaCloudOptions['params'];\n index?: OramaCloudOptions['index'];\n\n footer?: ReactNode;\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Add the \"Powered by Orama\" label\n *\n * @defaultValue true\n */\n showOrama?: boolean;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\n/**\n * Orama Cloud integration\n */\nexport default function OramaSearchDialog({\n client,\n searchOptions,\n tags = [],\n defaultTag,\n showOrama = true,\n allowClear = false,\n index,\n footer,\n links = [],\n ...props\n}: OramaSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch({\n type: 'orama-cloud',\n client,\n index,\n params: searchOptions,\n locale,\n tag,\n });\n\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n const label = showOrama && <Label />;\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n <SearchDialogFooter>\n {tags.length > 0 ? (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n {label}\n </TagsList>\n ) : (\n label\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialogContent>\n </SearchDialog>\n );\n}\n\nfunction Label() {\n return (\n <a\n href=\"https://orama.com\"\n rel=\"noreferrer noopener\"\n className=\"ms-auto text-xs text-fd-muted-foreground\"\n >\n Search powered by Orama\n </a>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-orama.js","names":[],"sources":["../../../src/components/dialog/search-orama.tsx"],"sourcesContent":["'use client';\n\nimport { type OramaCloudOptions, useDocsSearch } from 'fumadocs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from 'fumadocs-core/utils/use-on-change';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from 'fumadocs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\nimport { useI18n } from '@/contexts/i18n';\n\nexport interface OramaSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n client: OramaCloudOptions['client'];\n searchOptions?: OramaCloudOptions['params'];\n index?: OramaCloudOptions['index'];\n\n footer?: ReactNode;\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Add the \"Powered by Orama\" label\n *\n * @defaultValue true\n */\n showOrama?: boolean;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\n/**\n * Orama Cloud integration\n */\nexport default function OramaSearchDialog({\n client,\n searchOptions,\n tags = [],\n defaultTag,\n showOrama = true,\n allowClear = false,\n index,\n footer,\n links = [],\n ...props\n}: OramaSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch({\n type: 'orama-cloud',\n client,\n index,\n params: searchOptions,\n locale,\n tag,\n });\n\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n const label = showOrama && <Label />;\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n <SearchDialogFooter>\n {tags.length > 0 ? (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n {label}\n </TagsList>\n ) : (\n label\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialogContent>\n </SearchDialog>\n );\n}\n\nfunction Label() {\n return (\n <a\n href=\"https://orama.com\"\n rel=\"noreferrer noopener\"\n className=\"ms-auto text-xs text-fd-muted-foreground\"\n >\n Search powered by Orama\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;;AAoDA,SAAwB,kBAAkB,EACxC,QACA,eACA,OAAO,EAAE,EACT,YACA,YAAY,MACZ,aAAa,OACb,OACA,QACA,QAAQ,EAAE,EACV,GAAG,SACsB;CACzB,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,QAAQ,WAAW,UAAU,cAAc;EACjD,MAAM;EACN;EACA;EACA,QAAQ;EACR;EACA;EACD,CAAC;CAEF,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;CAEF,MAAM,QAAQ,aAAa,oBAAC,OAAD,EAAS,CAAA;AAEpC,QACE,qBAAC,cAAD;EAAsB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;YAAzF,CACE,oBAAC,qBAAD,EAAuB,CAAA,EACvB,qBAAC,qBAAD,EAAA,UAAA;GACE,qBAAC,oBAAD,EAAA,UAAA;IACE,oBAAC,kBAAD,EAAoB,CAAA;IACpB,oBAAC,mBAAD,EAAqB,CAAA;IACrB,oBAAC,mBAAD,EAAqB,CAAA;IACF,EAAA,CAAA;GACrB,oBAAC,kBAAD,EAAkB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,cAAgB,CAAA;GAC/E,qBAAC,oBAAD,EAAA,UAAA,CACG,KAAK,SAAS,IACb,qBAAC,UAAD;IAAe;IAAK,aAAa;IAAoB;cAArD,CACG,KAAK,KAAK,QACT,oBAAC,cAAD;KAA8B,OAAO,IAAI;eACtC,IAAI;KACQ,EAFI,IAAI,MAER,CACf,EACD,MACQ;QAEX,OAED,OACkB,EAAA,CAAA;GACD,EAAA,CAAA,CACT;;;AAInB,SAAS,QAAQ;AACf,QACE,oBAAC,KAAD;EACE,MAAK;EACL,KAAI;EACJ,WAAU;YACX;EAEG,CAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { I18nLabel, useI18n } from "../../contexts/i18n.js";
|
|
4
3
|
import { cn } from "../../utils/cn.js";
|
|
5
4
|
import { buttonVariants } from "../ui/button.js";
|
|
@@ -14,7 +13,6 @@ import { Dialog } from "@base-ui/react/dialog";
|
|
|
14
13
|
import { createMarkdownRenderer } from "fumadocs-core/content/md";
|
|
15
14
|
import rehypeRaw from "rehype-raw";
|
|
16
15
|
import { visit } from "unist-util-visit";
|
|
17
|
-
|
|
18
16
|
//#region src/components/dialog/search.tsx
|
|
19
17
|
const RootContext = createContext(null);
|
|
20
18
|
const ListContext = createContext(null);
|
|
@@ -346,7 +344,7 @@ function useSearchList() {
|
|
|
346
344
|
if (!ctx) throw new Error("Missing <SearchDialogList />");
|
|
347
345
|
return ctx;
|
|
348
346
|
}
|
|
349
|
-
|
|
350
347
|
//#endregion
|
|
351
348
|
export { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogListItem, SearchDialogOverlay, TagsList, TagsListItem, useSearch, useSearchList, useTagsList };
|
|
349
|
+
|
|
352
350
|
//# sourceMappingURL=search.js.map
|