@arkenv/fumadocs-ui 0.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Yam Borodetsky <https://yam.codes/>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # @arkenv/fumadocs-ui
2
+
3
+ A Fumadocs-ready component and theme package for ArkEnv documentation. It ships sharpened Tailwind v4 styling, external link handling, enhanced headings/code blocks, AI actions, and a ready-to-use MDX component map.
4
+
5
+ ## Highlights
6
+ - Design system CSS with 0.125rem radius and 80px header/nav height overrides
7
+ - External link detection with safe targets and visual indicators
8
+ - Anchorable headings with scroll margin for tall headers
9
+ - Enhanced code blocks and AI actions (copy markdown, open in AI assistants)
10
+ - Preconfigured `arkenvComponents` MDX map that layers our overrides onto `fumadocs-ui` defaults
11
+
12
+ ## Install
13
+ Ensure peer dependencies from `fumadocs-ui` are available, then install:
14
+
15
+ ```bash
16
+ pnpm add @arkenv/fumadocs-ui
17
+ ```
18
+
19
+ ## Style entry
20
+ Import the theme CSS once (Tailwind v4 style):
21
+
22
+ ```css
23
+ /* e.g. apps/www/app/globals.css */
24
+ @import "@arkenv/fumadocs-ui/css/theme.css";
25
+ ```
26
+
27
+ ## MDX components
28
+ Use the prebuilt mapping in your MDX provider:
29
+
30
+ ```ts
31
+ import { arkenvComponents } from "@arkenv/fumadocs-ui/mdx";
32
+
33
+ export const mdxComponents = {
34
+ ...arkenvComponents,
35
+ };
36
+ ```
37
+
38
+ ## Components
39
+ Client components suitable for Next.js App Router:
40
+
41
+ ```tsx
42
+ import { AIActions, CodeBlock, ExternalLink, Heading } from "@arkenv/fumadocs-ui/components";
43
+
44
+ // Example
45
+ <Heading as="h2" id="getting-started">Getting started</Heading>
46
+ <ExternalLink href="https://arkenv.js.org">Docs</ExternalLink>
47
+ ```
48
+
49
+ ## Utilities
50
+
51
+ ```ts
52
+ import { isExternalUrl, cn } from "@arkenv/fumadocs-ui/utils";
53
+ ```
54
+
55
+ ## Notes
56
+ - Components are client-side and include the required `"use client"` directives in the published bundle.
57
+ - CSS overrides Fumadocs defaults; no additional config is needed beyond importing `theme.css`.
package/css/theme.css ADDED
@@ -0,0 +1,190 @@
1
+ @import "tailwindcss";
2
+
3
+ :root {
4
+ --radius: 0.125rem;
5
+ --fd-nav-height: 80px !important;
6
+ --fd-header-height: 80px !important;
7
+ }
8
+
9
+ @theme inline {
10
+ --radius-sm: var(--radius);
11
+ --radius-md: var(--radius);
12
+ --radius-lg: var(--radius);
13
+ --radius-xl: var(--radius);
14
+
15
+ --icon-external: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23374151' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='7 7 17 7 17 17'%3E%3C/polyline%3E%3Cline x1='7' y1='17' x2='17' y2='7'%3E%3C/line%3E%3C/svg%3E");
16
+ --icon-external-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d1d5db' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='7 7 17 7 17 17'%3E%3C/polyline%3E%3Cline x1='7' y1='17' x2='17' y2='7'%3E%3C/line%3E%3C/svg%3E");
17
+ }
18
+
19
+ /* Override Fumadocs :has() selector that sets header height to 64px */
20
+ #nd-notebook-layout,
21
+ #nd-home-layout,
22
+ #nd-docs-layout {
23
+ --fd-header-height: 80px !important;
24
+ }
25
+
26
+ /* Override search bar and keyboard shortcuts to use minimal radius */
27
+ button[data-search-full],
28
+ button[data-search],
29
+ [data-search-full],
30
+ [data-search],
31
+ [data-card],
32
+ .prose .rounded-xl,
33
+ [data-radix-popper-content-wrapper] [role="dialog"],
34
+ kbd {
35
+ border-radius: 0.125rem !important;
36
+ }
37
+
38
+ #nd-nav,
39
+ #nd-subnav {
40
+ height: var(--fd-nav-height) !important;
41
+ z-index: 50;
42
+ }
43
+
44
+ #nd-nav nav,
45
+ #nd-subnav nav,
46
+ #nd-nav > div,
47
+ #nd-subnav > div {
48
+ height: var(--fd-nav-height) !important;
49
+ }
50
+
51
+ /* Heading anchors: avoid underlines and keep icons aligned */
52
+ [data-arkenv-heading] {
53
+ overflow: visible;
54
+ }
55
+
56
+ [data-arkenv-heading-link] {
57
+ text-decoration: none;
58
+ border-bottom: 0 !important;
59
+ }
60
+
61
+ [data-arkenv-heading-link]:hover {
62
+ border-bottom: 0 !important;
63
+ }
64
+
65
+ /* Icon floats to the left of the heading without taking space */
66
+ [data-arkenv-heading-icon] {
67
+ position: absolute;
68
+ left: -1.5rem;
69
+ }
70
+
71
+ /* Link underlines in documentation */
72
+ article
73
+ a:not(:has(img)):not(.fd-card):not([data-card]):not([class*="fd-"]):not(
74
+ [data-no-underline]
75
+ ),
76
+ [data-external-link]:not(:has(img)):not(.fd-card):not([data-card]):not(
77
+ [class*="fd-"]
78
+ ):not([data-no-underline]) {
79
+ text-decoration: none;
80
+ border-bottom: 2px solid currentColor;
81
+ padding-bottom: 1px;
82
+ transition: border-bottom-width 0.1s ease;
83
+ }
84
+
85
+ article
86
+ a:not(:has(img)):not(.fd-card):not([data-card]):not([class*="fd-"]):not(
87
+ [data-no-underline]
88
+ ):hover,
89
+ [data-external-link]:not(:has(img)):not(.fd-card):not([data-card]):not(
90
+ [class*="fd-"]
91
+ ):not([data-no-underline]):hover {
92
+ border-bottom-width: 3px;
93
+ }
94
+
95
+ /* External links in documentation */
96
+ article
97
+ a[rel*="noopener"][target="_blank"]:not(.fd-card):not([data-card]):not(
98
+ [data-no-arrow]
99
+ ):not(:has(img)),
100
+ [data-external-link]:not(.fd-card):not([data-card]):not([data-no-arrow]):not(
101
+ :has(img)
102
+ ) {
103
+ padding-right: 1.1em;
104
+ background-image: var(--icon-external);
105
+ background-repeat: no-repeat;
106
+ background-size: 0.9em;
107
+ background-position: center right;
108
+ }
109
+
110
+ .dark
111
+ article
112
+ a[rel*="noopener"][target="_blank"]:not(.fd-card):not([data-card]):not(
113
+ [data-no-arrow]
114
+ ):not(:has(img)),
115
+ .dark
116
+ [data-external-link]:not(.fd-card):not([data-card]):not([data-no-arrow]):not(
117
+ :has(img)
118
+ ) {
119
+ background-image: var(--icon-external-dark);
120
+ }
121
+
122
+ /* Sidebar & Nav: External link icons using ::after for flex containers */
123
+ [data-radix-scroll-area-viewport]
124
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
125
+ :has(> svg:only-child)
126
+ ),
127
+ #nd-nav
128
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
129
+ :has(> svg:only-child)
130
+ ),
131
+ #nd-subnav
132
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
133
+ :has(> svg:only-child)
134
+ ) {
135
+ background-image: none !important;
136
+ padding-right: 0 !important;
137
+ display: inline-flex;
138
+ align-items: center;
139
+ gap: 0 !important;
140
+ }
141
+
142
+ /* Sidebar specifically needs full flex for better link hit-areas */
143
+ [data-radix-scroll-area-viewport]
144
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
145
+ :has(> svg:only-child)
146
+ ) {
147
+ display: flex;
148
+ }
149
+
150
+ [data-radix-scroll-area-viewport]
151
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
152
+ :has(> svg:only-child)
153
+ )::after,
154
+ #nd-nav
155
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
156
+ :has(> svg:only-child)
157
+ )::after,
158
+ #nd-subnav
159
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
160
+ :has(> svg:only-child)
161
+ )::after {
162
+ content: "";
163
+ width: 0.9em;
164
+ height: 0.9em;
165
+ margin-left: 0.1em;
166
+ background-image: var(--icon-external);
167
+ background-size: contain;
168
+ background-repeat: no-repeat;
169
+ background-position: center;
170
+ flex-shrink: 0;
171
+ opacity: 0.5;
172
+ }
173
+
174
+ .dark
175
+ [data-radix-scroll-area-viewport]
176
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
177
+ :has(> svg:only-child)
178
+ )::after,
179
+ .dark
180
+ #nd-nav
181
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
182
+ :has(> svg:only-child)
183
+ )::after,
184
+ .dark
185
+ #nd-subnav
186
+ a[target="_blank"]:not([data-no-arrow]):not(:has(img)):not(
187
+ :has(> svg:only-child)
188
+ )::after {
189
+ background-image: var(--icon-external-dark);
190
+ }
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ const e=require(`../heading-11j3HQh7.cjs`),t=require(`../url-xnMEOisP.cjs`);let n=require(`fumadocs-ui/components/ui/button`),r=require(`fumadocs-ui/components/ui/popover`),i=require(`fumadocs-ui/utils/use-copy-button`),a=require(`lucide-react`),o=require(`react`),s=require(`react/jsx-runtime`);const c=new Map;function l({markdownUrl:e,githubUrl:l}){let[u,d]=(0,o.useState)(!1),[f,p]=(0,o.useState)(null);(0,o.useEffect)(()=>{p(window.location.origin)},[]);let[m,h]=(0,i.useCopyButton)(async()=>{let t=c.get(e);if(t)return navigator.clipboard.writeText(t);d(!0);try{await navigator.clipboard.write([new ClipboardItem({"text/plain":fetch(e).then(async t=>{if(!t.ok)throw Error(`Failed to fetch markdown: ${t.statusText}`);let n=await t.text();return c.set(e,n),n})})])}catch(e){console.error(e)}finally{d(!1)}}),g=(0,o.useMemo)(()=>{if(!f)return[];let t=`Read ${new URL(e,f)}, I want to ask questions about it.`;return[{title:`Open in GitHub`,href:l,icon:(0,s.jsxs)(`svg`,{fill:`currentColor`,role:`img`,viewBox:`0 0 24 24`,className:`size-4`,children:[(0,s.jsx)(`title`,{children:`GitHub`}),(0,s.jsx)(`path`,{d:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`})]})},{title:`Open in Scira AI`,href:`https://scira.ai/?${new URLSearchParams({q:t})}`,icon:(0,s.jsxs)(`svg`,{width:`910`,height:`934`,viewBox:`0 0 910 934`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,className:`size-4`,children:[(0,s.jsx)(`title`,{children:`Scira AI`}),(0,s.jsx)(`path`,{d:`M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`}),(0,s.jsx)(`path`,{d:`M516.774 304.217C510.299 275.491 498.208 252.087 480.335 234.214C462.462 216.341 439.058 204.251 410.333 197.775C439.059 191.3 462.462 179.209 480.335 161.336C498.208 143.463 510.299 120.06 516.774 91.334C523.25 120.059 535.34 143.463 553.213 161.336C571.086 179.209 594.49 191.3 623.216 197.775C594.49 204.251 571.086 216.341 553.213 234.214C535.34 252.087 523.25 275.491 516.774 304.217Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`}),(0,s.jsx)(`path`,{d:`M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z`,stroke:`currentColor`,strokeWidth:`20`,strokeLinejoin:`round`}),(0,s.jsx)(`path`,{d:`M700.432 615.957C691.848 589.05 678.575 566.357 660.383 548.165C642.191 529.973 619.499 516.7 592.593 508.116C619.499 499.533 642.191 486.258 660.383 468.066C678.575 449.874 691.848 427.181 700.432 400.274C709.015 427.181 722.289 449.874 740.481 468.066C758.673 486.258 781.365 499.533 808.271 508.116C781.365 516.7 758.673 529.973 740.481 548.165C722.289 566.357 709.015 589.05 700.432 615.957Z`,stroke:`currentColor`,strokeWidth:`20`,strokeLinejoin:`round`}),(0,s.jsx)(`path`,{d:`M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`}),(0,s.jsx)(`path`,{d:`M791.782 196.795C786.697 176.937 777.869 160.567 765.16 147.858C752.452 135.15 736.082 126.322 716.226 121.237C736.082 116.152 752.452 107.324 765.16 94.6152C777.869 81.9065 786.697 65.5368 791.782 45.6797C796.867 65.5367 805.695 81.9066 818.403 94.6152C831.112 107.324 847.481 116.152 867.338 121.237C847.481 126.322 831.112 135.15 818.403 147.858C805.694 160.567 796.867 176.937 791.782 196.795Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`})]})},{title:`Open in ChatGPT`,href:`https://chatgpt.com/?${new URLSearchParams({hints:`search`,q:t})}`,icon:(0,s.jsxs)(`svg`,{role:`img`,viewBox:`0 0 24 24`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`,className:`size-4`,children:[(0,s.jsx)(`title`,{children:`OpenAI`}),(0,s.jsx)(`path`,{d:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`})]})},{title:`Open in Claude`,href:`https://claude.ai/new?${new URLSearchParams({q:t})}`,icon:(0,s.jsxs)(`svg`,{fill:`currentColor`,role:`img`,viewBox:`0 0 24 24`,xmlns:`http://www.w3.org/2000/svg`,className:`size-4`,children:[(0,s.jsx)(`title`,{children:`Anthropic`}),(0,s.jsx)(`path`,{d:`M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z`})]})},{title:`Open in T3 Chat`,href:`https://t3.chat/new?${new URLSearchParams({q:t})}`,icon:(0,s.jsx)(a.MessageCircleIcon,{className:`size-4`})}]},[l,e,f]);return(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsxs)(`button`,{type:`button`,disabled:u,className:t.r((0,n.buttonVariants)({color:`secondary`,size:`sm`,className:`gap-2 [&_svg]:size-3.5 [&_svg]:text-fd-muted-foreground`})),onClick:h,children:[m?(0,s.jsx)(a.Check,{}):(0,s.jsx)(a.Copy,{}),`Copy Markdown`]}),(0,s.jsxs)(r.Popover,{children:[(0,s.jsxs)(r.PopoverTrigger,{className:t.r((0,n.buttonVariants)({color:`secondary`,size:`sm`,className:`gap-2`})),children:[`Open`,(0,s.jsx)(a.ChevronDown,{className:`size-3.5 text-fd-muted-foreground`})]}),(0,s.jsx)(r.PopoverContent,{className:`flex flex-col p-1`,children:g.map(e=>(0,s.jsxs)(`a`,{href:e.href,rel:`noreferrer noopener`,target:`_blank`,className:`text-sm p-2 rounded-lg inline-flex items-center gap-2 hover:text-fd-accent-foreground hover:bg-fd-accent [&_svg]:size-4`,children:[e.icon,e.title,(0,s.jsx)(a.ExternalLinkIcon,{className:`text-fd-muted-foreground size-3.5 ms-auto`})]},e.href))})]})]})}exports.AIActions=l,exports.CodeBlock=e.r,exports.CodeBlockTab=e.i,exports.CodeBlockTabs=e.a,exports.CodeBlockTabsList=e.o,exports.CodeBlockTabsTrigger=e.s,exports.ExternalLink=e.n,exports.Heading=e.t,exports.Pre=e.c;
@@ -0,0 +1,96 @@
1
+ import * as react_jsx_runtime6 from "react/jsx-runtime";
2
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "fumadocs-ui/components/tabs";
3
+ import { ComponentProps, ComponentPropsWithoutRef, FC, HTMLAttributes, ReactNode } from "react";
4
+ import FumadocsLink from "fumadocs-core/link";
5
+
6
+ //#region src/components/ai-actions.d.ts
7
+ declare function AIActions({
8
+ markdownUrl,
9
+ githubUrl
10
+ }: {
11
+ markdownUrl: string;
12
+ githubUrl: string;
13
+ }): react_jsx_runtime6.JSX.Element;
14
+ //#endregion
15
+ //#region src/components/code-blocks.d.ts
16
+ interface CodeBlockProps extends ComponentProps<"figure"> {
17
+ /**
18
+ * Icon of code block
19
+ *
20
+ * When passed as a string, it assumes the value is SVG markup.
21
+ * The string will be sanitized at runtime and should be trusted SVG only.
22
+ */
23
+ icon?: ReactNode;
24
+ /**
25
+ * Allow to copy code with copy button
26
+ *
27
+ * @defaultValue true
28
+ */
29
+ allowCopy?: boolean;
30
+ /**
31
+ * Keep original background color generated by Shiki or Rehype Code
32
+ *
33
+ * @defaultValue false
34
+ */
35
+ keepBackground?: boolean;
36
+ viewportProps?: HTMLAttributes<HTMLElement>;
37
+ /**
38
+ * show line numbers
39
+ */
40
+ "data-line-numbers"?: boolean;
41
+ /**
42
+ * @defaultValue 1
43
+ */
44
+ "data-line-numbers-start"?: number;
45
+ title?: string;
46
+ Actions?: (props: {
47
+ className?: string;
48
+ children?: ReactNode;
49
+ }) => ReactNode;
50
+ }
51
+ declare function Pre(props: ComponentProps<"pre">): react_jsx_runtime6.JSX.Element;
52
+ declare function CodeBlock({
53
+ ref,
54
+ title,
55
+ allowCopy,
56
+ keepBackground,
57
+ icon,
58
+ viewportProps,
59
+ children,
60
+ Actions,
61
+ ...props
62
+ }: CodeBlockProps): react_jsx_runtime6.JSX.Element;
63
+ declare function CodeBlockTabs({
64
+ ref,
65
+ ...props
66
+ }: ComponentProps<typeof Tabs>): react_jsx_runtime6.JSX.Element;
67
+ declare function CodeBlockTabsList(props: ComponentProps<typeof TabsList>): react_jsx_runtime6.JSX.Element;
68
+ declare function CodeBlockTabsTrigger({
69
+ children,
70
+ ...props
71
+ }: ComponentProps<typeof TabsTrigger>): react_jsx_runtime6.JSX.Element;
72
+ declare function CodeBlockTab(props: ComponentProps<typeof TabsContent>): react_jsx_runtime6.JSX.Element;
73
+ //#endregion
74
+ //#region src/components/external-link.d.ts
75
+ interface ExternalLinkProps extends ComponentProps<typeof FumadocsLink> {
76
+ href?: string;
77
+ }
78
+ /**
79
+ * ExternalLink component that automatically adds an arrow icon to external links.
80
+ * Wraps fumadocs Link component and adds data attributes for styling.
81
+ */
82
+ declare const ExternalLink: FC<ExternalLinkProps>;
83
+ //#endregion
84
+ //#region src/components/heading.d.ts
85
+ type Types = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
86
+ type HeadingProps<T extends Types> = Omit<ComponentPropsWithoutRef<T>, "as"> & {
87
+ as?: T;
88
+ };
89
+ declare function Heading<T extends Types = "h1">({
90
+ as,
91
+ className,
92
+ children,
93
+ ...props
94
+ }: HeadingProps<T>): react_jsx_runtime6.JSX.Element;
95
+ //#endregion
96
+ export { AIActions, CodeBlock, CodeBlockProps, CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger, ExternalLink, ExternalLinkProps, Heading, Pre };
@@ -0,0 +1,96 @@
1
+ import { ComponentProps, ComponentPropsWithoutRef, FC, HTMLAttributes, ReactNode } from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "fumadocs-ui/components/tabs";
4
+ import FumadocsLink from "fumadocs-core/link";
5
+
6
+ //#region src/components/ai-actions.d.ts
7
+ declare function AIActions({
8
+ markdownUrl,
9
+ githubUrl
10
+ }: {
11
+ markdownUrl: string;
12
+ githubUrl: string;
13
+ }): react_jsx_runtime0.JSX.Element;
14
+ //#endregion
15
+ //#region src/components/code-blocks.d.ts
16
+ interface CodeBlockProps extends ComponentProps<"figure"> {
17
+ /**
18
+ * Icon of code block
19
+ *
20
+ * When passed as a string, it assumes the value is SVG markup.
21
+ * The string will be sanitized at runtime and should be trusted SVG only.
22
+ */
23
+ icon?: ReactNode;
24
+ /**
25
+ * Allow to copy code with copy button
26
+ *
27
+ * @defaultValue true
28
+ */
29
+ allowCopy?: boolean;
30
+ /**
31
+ * Keep original background color generated by Shiki or Rehype Code
32
+ *
33
+ * @defaultValue false
34
+ */
35
+ keepBackground?: boolean;
36
+ viewportProps?: HTMLAttributes<HTMLElement>;
37
+ /**
38
+ * show line numbers
39
+ */
40
+ "data-line-numbers"?: boolean;
41
+ /**
42
+ * @defaultValue 1
43
+ */
44
+ "data-line-numbers-start"?: number;
45
+ title?: string;
46
+ Actions?: (props: {
47
+ className?: string;
48
+ children?: ReactNode;
49
+ }) => ReactNode;
50
+ }
51
+ declare function Pre(props: ComponentProps<"pre">): react_jsx_runtime0.JSX.Element;
52
+ declare function CodeBlock({
53
+ ref,
54
+ title,
55
+ allowCopy,
56
+ keepBackground,
57
+ icon,
58
+ viewportProps,
59
+ children,
60
+ Actions,
61
+ ...props
62
+ }: CodeBlockProps): react_jsx_runtime0.JSX.Element;
63
+ declare function CodeBlockTabs({
64
+ ref,
65
+ ...props
66
+ }: ComponentProps<typeof Tabs>): react_jsx_runtime0.JSX.Element;
67
+ declare function CodeBlockTabsList(props: ComponentProps<typeof TabsList>): react_jsx_runtime0.JSX.Element;
68
+ declare function CodeBlockTabsTrigger({
69
+ children,
70
+ ...props
71
+ }: ComponentProps<typeof TabsTrigger>): react_jsx_runtime0.JSX.Element;
72
+ declare function CodeBlockTab(props: ComponentProps<typeof TabsContent>): react_jsx_runtime0.JSX.Element;
73
+ //#endregion
74
+ //#region src/components/external-link.d.ts
75
+ interface ExternalLinkProps extends ComponentProps<typeof FumadocsLink> {
76
+ href?: string;
77
+ }
78
+ /**
79
+ * ExternalLink component that automatically adds an arrow icon to external links.
80
+ * Wraps fumadocs Link component and adds data attributes for styling.
81
+ */
82
+ declare const ExternalLink: FC<ExternalLinkProps>;
83
+ //#endregion
84
+ //#region src/components/heading.d.ts
85
+ type Types = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
86
+ type HeadingProps<T extends Types> = Omit<ComponentPropsWithoutRef<T>, "as"> & {
87
+ as?: T;
88
+ };
89
+ declare function Heading<T extends Types = "h1">({
90
+ as,
91
+ className,
92
+ children,
93
+ ...props
94
+ }: HeadingProps<T>): react_jsx_runtime0.JSX.Element;
95
+ //#endregion
96
+ export { AIActions, CodeBlock, CodeBlockProps, CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger, ExternalLink, ExternalLinkProps, Heading, Pre };
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ import{r as e}from"../url-CZOXzYIy.mjs";import{a as t,c as n,i as r,n as i,o as a,r as o,s,t as c}from"../heading-CvyTA_oR.mjs";import{buttonVariants as l}from"fumadocs-ui/components/ui/button";import{Popover as u,PopoverContent as d,PopoverTrigger as f}from"fumadocs-ui/components/ui/popover";import{useCopyButton as p}from"fumadocs-ui/utils/use-copy-button";import{Check as m,ChevronDown as h,Copy as g,ExternalLinkIcon as _,MessageCircleIcon as v}from"lucide-react";import{useEffect as y,useMemo as b,useState as x}from"react";import{jsx as S,jsxs as C}from"react/jsx-runtime";const w=new Map;function T({markdownUrl:t,githubUrl:n}){let[r,i]=x(!1),[a,o]=x(null);y(()=>{o(window.location.origin)},[]);let[s,c]=p(async()=>{let e=w.get(t);if(e)return navigator.clipboard.writeText(e);i(!0);try{await navigator.clipboard.write([new ClipboardItem({"text/plain":fetch(t).then(async e=>{if(!e.ok)throw Error(`Failed to fetch markdown: ${e.statusText}`);let n=await e.text();return w.set(t,n),n})})])}catch(e){console.error(e)}finally{i(!1)}}),T=b(()=>{if(!a)return[];let e=`Read ${new URL(t,a)}, I want to ask questions about it.`;return[{title:`Open in GitHub`,href:n,icon:C(`svg`,{fill:`currentColor`,role:`img`,viewBox:`0 0 24 24`,className:`size-4`,children:[S(`title`,{children:`GitHub`}),S(`path`,{d:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`})]})},{title:`Open in Scira AI`,href:`https://scira.ai/?${new URLSearchParams({q:e})}`,icon:C(`svg`,{width:`910`,height:`934`,viewBox:`0 0 910 934`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,className:`size-4`,children:[S(`title`,{children:`Scira AI`}),S(`path`,{d:`M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`}),S(`path`,{d:`M516.774 304.217C510.299 275.491 498.208 252.087 480.335 234.214C462.462 216.341 439.058 204.251 410.333 197.775C439.059 191.3 462.462 179.209 480.335 161.336C498.208 143.463 510.299 120.06 516.774 91.334C523.25 120.059 535.34 143.463 553.213 161.336C571.086 179.209 594.49 191.3 623.216 197.775C594.49 204.251 571.086 216.341 553.213 234.214C535.34 252.087 523.25 275.491 516.774 304.217Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`}),S(`path`,{d:`M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z`,stroke:`currentColor`,strokeWidth:`20`,strokeLinejoin:`round`}),S(`path`,{d:`M700.432 615.957C691.848 589.05 678.575 566.357 660.383 548.165C642.191 529.973 619.499 516.7 592.593 508.116C619.499 499.533 642.191 486.258 660.383 468.066C678.575 449.874 691.848 427.181 700.432 400.274C709.015 427.181 722.289 449.874 740.481 468.066C758.673 486.258 781.365 499.533 808.271 508.116C781.365 516.7 758.673 529.973 740.481 548.165C722.289 566.357 709.015 589.05 700.432 615.957Z`,stroke:`currentColor`,strokeWidth:`20`,strokeLinejoin:`round`}),S(`path`,{d:`M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`}),S(`path`,{d:`M791.782 196.795C786.697 176.937 777.869 160.567 765.16 147.858C752.452 135.15 736.082 126.322 716.226 121.237C736.082 116.152 752.452 107.324 765.16 94.6152C777.869 81.9065 786.697 65.5368 791.782 45.6797C796.867 65.5367 805.695 81.9066 818.403 94.6152C831.112 107.324 847.481 116.152 867.338 121.237C847.481 126.322 831.112 135.15 818.403 147.858C805.694 160.567 796.867 176.937 791.782 196.795Z`,fill:`currentColor`,stroke:`currentColor`,strokeWidth:`8`,strokeLinejoin:`round`})]})},{title:`Open in ChatGPT`,href:`https://chatgpt.com/?${new URLSearchParams({hints:`search`,q:e})}`,icon:C(`svg`,{role:`img`,viewBox:`0 0 24 24`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`,className:`size-4`,children:[S(`title`,{children:`OpenAI`}),S(`path`,{d:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`})]})},{title:`Open in Claude`,href:`https://claude.ai/new?${new URLSearchParams({q:e})}`,icon:C(`svg`,{fill:`currentColor`,role:`img`,viewBox:`0 0 24 24`,xmlns:`http://www.w3.org/2000/svg`,className:`size-4`,children:[S(`title`,{children:`Anthropic`}),S(`path`,{d:`M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z`})]})},{title:`Open in T3 Chat`,href:`https://t3.chat/new?${new URLSearchParams({q:e})}`,icon:S(v,{className:`size-4`})}]},[n,t,a]);return C(`div`,{className:`flex items-center gap-2`,children:[C(`button`,{type:`button`,disabled:r,className:e(l({color:`secondary`,size:`sm`,className:`gap-2 [&_svg]:size-3.5 [&_svg]:text-fd-muted-foreground`})),onClick:c,children:[S(s?m:g,{}),`Copy Markdown`]}),C(u,{children:[C(f,{className:e(l({color:`secondary`,size:`sm`,className:`gap-2`})),children:[`Open`,S(h,{className:`size-3.5 text-fd-muted-foreground`})]}),S(d,{className:`flex flex-col p-1`,children:T.map(e=>C(`a`,{href:e.href,rel:`noreferrer noopener`,target:`_blank`,className:`text-sm p-2 rounded-lg inline-flex items-center gap-2 hover:text-fd-accent-foreground hover:bg-fd-accent [&_svg]:size-4`,children:[e.icon,e.title,S(_,{className:`text-fd-muted-foreground size-3.5 ms-auto`})]},e.href))})]})]})}export{T as AIActions,o as CodeBlock,r as CodeBlockTab,t as CodeBlockTabs,a as CodeBlockTabsList,s as CodeBlockTabsTrigger,i as ExternalLink,c as Heading,n as Pre};
@@ -0,0 +1,3 @@
1
+ 'use client';
2
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=require(`./url-xnMEOisP.cjs`);let l=require(`fumadocs-ui/components/ui/button`),u=require(`fumadocs-ui/utils/use-copy-button`),d=require(`lucide-react`),f=require(`react`),p=require(`react/jsx-runtime`),m=require(`@fumadocs/ui/merge-refs`),h=require(`fumadocs-ui/components/tabs`),g=require(`fumadocs-core/link`);g=s(g);const _=(0,f.createContext)(null);function v(e){let t=e.trim();return/^<svg[\s\S]*<\/svg>$/.test(t)?t.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi,``).replace(/<foreignObject[\s\S]*?>[\s\S]*?<\/foreignObject>/gi,``).replace(/\son\w+\s*=\s*"[^"]*"/gi,``).replace(/\son\w+\s*=\s*'[^']*'/gi,``).replace(/\son\w+\s*=\s*[^\s>]+/gi,``).replace(/\s(xlink:href|href)\s*=\s*"\s*javascript:[^"]*"/gi,``).replace(/\s(xlink:href|href)\s*=\s*'\s*javascript:[^']*'/gi,``):``}function y(e){return(0,p.jsx)(`pre`,{...e,className:c.r(`min-w-full w-max *:flex *:flex-col`,e.className),children:e.children})}function b({ref:e,title:t,allowCopy:n=!0,keepBackground:r=!1,icon:i,viewportProps:a={},children:o,Actions:s=e=>(0,p.jsx)(`div`,{...e,className:c.r(`empty:hidden`,e.className)}),...l}){let u=(0,f.use)(_)!==null,d=(0,f.useRef)(null);return(0,p.jsxs)(`figure`,{ref:e,dir:`ltr`,...l,tabIndex:-1,className:c.r(u?`bg-fd-secondary -mx-px -mb-px last:rounded-b-sm`:`my-4 bg-fd-card rounded-sm`,r&&`bg-(--shiki-light-bg) dark:bg-(--shiki-dark-bg)`,`shiki relative border shadow-sm not-prose overflow-hidden text-sm`,l.className),children:[t?(0,p.jsxs)(`div`,{className:`flex text-fd-muted-foreground items-center gap-2 h-9.5 border-b px-4`,children:[typeof i==`string`?(0,p.jsx)(`div`,{className:`[&_svg]:size-3.5`,dangerouslySetInnerHTML:{__html:v(i)}}):i,(0,p.jsx)(`figcaption`,{className:`flex-1 truncate`,children:t}),s({className:`-me-2`,children:n&&(0,p.jsx)(x,{containerRef:d})})]}):s({className:`absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground`,children:n&&(0,p.jsx)(x,{containerRef:d})}),(0,p.jsx)(`section`,{ref:d,...a,className:c.r(`text-[0.8125rem] py-3.5 overflow-auto max-h-150 fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring`,a.className),style:{"--padding-right":t?void 0:`calc(var(--spacing) * 8)`,counterSet:l[`data-line-numbers`]?`line ${Number(l[`data-line-numbers-start`]??1)-1}`:void 0,...a.style},children:o})]})}function x({className:e,containerRef:t,...n}){let[r,i]=(0,u.useCopyButton)(()=>{let e=t.current?.getElementsByTagName(`pre`).item(0);if(!e)return;let n=e.cloneNode(!0);n.querySelectorAll(`.nd-copy-ignore`).forEach(e=>{e.replaceWith(`
3
+ `)}),navigator.clipboard.writeText(n.textContent??``)});return(0,p.jsx)(`button`,{type:`button`,"data-checked":r||void 0,className:c.r((0,l.buttonVariants)({className:`hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground`,size:`icon-xs`}),e),"aria-label":r?`Copied Text`:`Copy Text`,onClick:i,...n,children:r?(0,p.jsx)(d.Check,{}):(0,p.jsx)(d.Copy,{})})}function S({ref:e,...t}){let n=(0,f.useRef)(null),r=(0,f.use)(_)!==null;return(0,p.jsx)(h.Tabs,{ref:(0,m.mergeRefs)(n,e),...t,className:c.r(`bg-fd-card rounded-sm border`,!r&&`my-4`,t.className),children:(0,p.jsx)(_,{value:(0,f.useMemo)(()=>({containerRef:n,nested:r}),[r]),children:t.children})})}function C(e){return(0,p.jsx)(h.TabsList,{...e,className:c.r(`flex flex-row px-2 overflow-x-auto text-fd-muted-foreground`,e.className),children:e.children})}function w({children:e,...t}){return(0,p.jsx)(h.TabsTrigger,{...t,className:c.r(`inline-flex text-sm font-medium text-nowrap items-center transition-colors gap-2 px-2 py-1.5 hover:text-fd-accent-foreground data-[state=active]:text-fd-primary [&_svg]:size-3.5`,t.className),children:e})}function T(e){return(0,p.jsx)(h.TabsContent,{...e})}const E=({href:e,children:t,...n})=>{let r=c.t(e);return(0,p.jsx)(g.default,{href:e,"data-external-link":r||void 0,...n,children:t})};function D({as:e,className:t,children:n,...r}){let i=e||`h1`;return r.id?(0,p.jsxs)(i,{className:c.r(`group relative scroll-m-32 font-bold tracking-tight`,t),"data-arkenv-heading":!0,...r,children:[(0,p.jsx)(`div`,{className:`absolute top-1/2 -translate-y-1/2 hidden md:flex items-center justify-end pr-2 opacity-0 group-hover:opacity-100 w-7`,"data-arkenv-heading-icon":!0,children:(0,p.jsx)(`a`,{href:`#${r.id}`,className:`p-1 rounded-md text-fd-primary focus:outline-none opacity-100 hover:opacity-100 hover:text-fd-primary active:ring-2 active:ring-fd-primary`,"aria-label":`Link to section`,"data-no-underline":!0,"data-arkenv-heading-link":!0,children:(0,p.jsx)(d.LinkIcon,{className:`size-4`})})}),(0,p.jsx)(`a`,{href:`#${r.id}`,className:`inline font-inherit text-inherit no-underline opacity-100 hover:opacity-100 hover:text-inherit`,"data-no-underline":!0,"data-arkenv-heading-link":!0,children:n})]}):(0,p.jsx)(i,{className:c.r(`font-bold tracking-tight`,t),...r,children:n})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return D}});
@@ -0,0 +1,3 @@
1
+ 'use client';
2
+ import{r as e,t}from"./url-CZOXzYIy.mjs";import{buttonVariants as n}from"fumadocs-ui/components/ui/button";import{useCopyButton as r}from"fumadocs-ui/utils/use-copy-button";import{Check as i,Copy as a,LinkIcon as o}from"lucide-react";import{createContext as s,use as c,useMemo as l,useRef as u}from"react";import{jsx as d,jsxs as f}from"react/jsx-runtime";import{mergeRefs as p}from"@fumadocs/ui/merge-refs";import{Tabs as m,TabsContent as h,TabsList as g,TabsTrigger as _}from"fumadocs-ui/components/tabs";import v from"fumadocs-core/link";const y=s(null);function b(e){let t=e.trim();return/^<svg[\s\S]*<\/svg>$/.test(t)?t.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi,``).replace(/<foreignObject[\s\S]*?>[\s\S]*?<\/foreignObject>/gi,``).replace(/\son\w+\s*=\s*"[^"]*"/gi,``).replace(/\son\w+\s*=\s*'[^']*'/gi,``).replace(/\son\w+\s*=\s*[^\s>]+/gi,``).replace(/\s(xlink:href|href)\s*=\s*"\s*javascript:[^"]*"/gi,``).replace(/\s(xlink:href|href)\s*=\s*'\s*javascript:[^']*'/gi,``):``}function x(t){return d(`pre`,{...t,className:e(`min-w-full w-max *:flex *:flex-col`,t.className),children:t.children})}function S({ref:t,title:n,allowCopy:r=!0,keepBackground:i=!1,icon:a,viewportProps:o={},children:s,Actions:l=t=>d(`div`,{...t,className:e(`empty:hidden`,t.className)}),...p}){let m=c(y)!==null,h=u(null);return f(`figure`,{ref:t,dir:`ltr`,...p,tabIndex:-1,className:e(m?`bg-fd-secondary -mx-px -mb-px last:rounded-b-sm`:`my-4 bg-fd-card rounded-sm`,i&&`bg-(--shiki-light-bg) dark:bg-(--shiki-dark-bg)`,`shiki relative border shadow-sm not-prose overflow-hidden text-sm`,p.className),children:[n?f(`div`,{className:`flex text-fd-muted-foreground items-center gap-2 h-9.5 border-b px-4`,children:[typeof a==`string`?d(`div`,{className:`[&_svg]:size-3.5`,dangerouslySetInnerHTML:{__html:b(a)}}):a,d(`figcaption`,{className:`flex-1 truncate`,children:n}),l({className:`-me-2`,children:r&&d(C,{containerRef:h})})]}):l({className:`absolute top-3 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground`,children:r&&d(C,{containerRef:h})}),d(`section`,{ref:h,...o,className:e(`text-[0.8125rem] py-3.5 overflow-auto max-h-150 fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring`,o.className),style:{"--padding-right":n?void 0:`calc(var(--spacing) * 8)`,counterSet:p[`data-line-numbers`]?`line ${Number(p[`data-line-numbers-start`]??1)-1}`:void 0,...o.style},children:s})]})}function C({className:t,containerRef:o,...s}){let[c,l]=r(()=>{let e=o.current?.getElementsByTagName(`pre`).item(0);if(!e)return;let t=e.cloneNode(!0);t.querySelectorAll(`.nd-copy-ignore`).forEach(e=>{e.replaceWith(`
3
+ `)}),navigator.clipboard.writeText(t.textContent??``)});return d(`button`,{type:`button`,"data-checked":c||void 0,className:e(n({className:`hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground`,size:`icon-xs`}),t),"aria-label":c?`Copied Text`:`Copy Text`,onClick:l,...s,children:d(c?i:a,{})})}function w({ref:t,...n}){let r=u(null),i=c(y)!==null;return d(m,{ref:p(r,t),...n,className:e(`bg-fd-card rounded-sm border`,!i&&`my-4`,n.className),children:d(y,{value:l(()=>({containerRef:r,nested:i}),[i]),children:n.children})})}function T(t){return d(g,{...t,className:e(`flex flex-row px-2 overflow-x-auto text-fd-muted-foreground`,t.className),children:t.children})}function E({children:t,...n}){return d(_,{...n,className:e(`inline-flex text-sm font-medium text-nowrap items-center transition-colors gap-2 px-2 py-1.5 hover:text-fd-accent-foreground data-[state=active]:text-fd-primary [&_svg]:size-3.5`,n.className),children:t})}function D(e){return d(h,{...e})}const O=({href:e,children:n,...r})=>{let i=t(e);return d(v,{href:e,"data-external-link":i||void 0,...r,children:n})};function k({as:t,className:n,children:r,...i}){let a=t||`h1`;return i.id?f(a,{className:e(`group relative scroll-m-32 font-bold tracking-tight`,n),"data-arkenv-heading":!0,...i,children:[d(`div`,{className:`absolute top-1/2 -translate-y-1/2 hidden md:flex items-center justify-end pr-2 opacity-0 group-hover:opacity-100 w-7`,"data-arkenv-heading-icon":!0,children:d(`a`,{href:`#${i.id}`,className:`p-1 rounded-md text-fd-primary focus:outline-none opacity-100 hover:opacity-100 hover:text-fd-primary active:ring-2 active:ring-fd-primary`,"aria-label":`Link to section`,"data-no-underline":!0,"data-arkenv-heading-link":!0,children:d(o,{className:`size-4`})})}),d(`a`,{href:`#${i.id}`,className:`inline font-inherit text-inherit no-underline opacity-100 hover:opacity-100 hover:text-inherit`,"data-no-underline":!0,"data-arkenv-heading-link":!0,children:r})]}):d(a,{className:e(`font-bold tracking-tight`,n),...i,children:r})}export{w as a,x as c,D as i,O as n,T as o,S as r,E as s,k as t};
@@ -0,0 +1 @@
1
+ const e=require(`../heading-11j3HQh7.cjs`);require(`../url-xnMEOisP.cjs`);let t=require(`react/jsx-runtime`),n=require(`fumadocs-ui/components/tabs`),r=require(`fumadocs-ui/components/accordion`),i=require(`fumadocs-ui/components/files`),a=require(`fumadocs-ui/components/image-zoom`),o=require(`fumadocs-ui/components/steps`),s=require(`fumadocs-ui/mdx`);s=e.l(s);const c={...s.default,a:e.n,img:e=>(0,t.jsx)(a.ImageZoom,{...e}),Step:o.Step,Steps:o.Steps,File:i.File,Folder:i.Folder,Files:i.Files,Accordion:r.Accordion,Accordions:r.Accordions,Tab:n.Tab,Tabs:n.Tabs,pre:({ref:n,...r})=>(0,t.jsx)(e.r,{...r,children:(0,t.jsx)(e.c,{children:r.children})}),CodeBlockTabs:e.a,CodeBlockTabsList:e.o,CodeBlockTabsTrigger:e.s,CodeBlockTab:e.i,h1:n=>(0,t.jsx)(e.t,{as:`h1`,...n}),h2:n=>(0,t.jsx)(e.t,{as:`h2`,...n}),h3:n=>(0,t.jsx)(e.t,{as:`h3`,...n}),h4:n=>(0,t.jsx)(e.t,{as:`h4`,...n}),h5:n=>(0,t.jsx)(e.t,{as:`h5`,...n}),h6:n=>(0,t.jsx)(e.t,{as:`h6`,...n})};exports.arkenvComponents=c;
@@ -0,0 +1,6 @@
1
+ import { MDXComponents } from "mdx/types";
2
+
3
+ //#region src/mdx/index.d.ts
4
+ declare const arkenvComponents: MDXComponents;
5
+ //#endregion
6
+ export { arkenvComponents };
@@ -0,0 +1,6 @@
1
+ import { MDXComponents } from "mdx/types";
2
+
3
+ //#region src/mdx/index.d.ts
4
+ declare const arkenvComponents: MDXComponents;
5
+ //#endregion
6
+ export { arkenvComponents };
@@ -0,0 +1 @@
1
+ import"../url-CZOXzYIy.mjs";import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"../heading-CvyTA_oR.mjs";import{jsx as c}from"react/jsx-runtime";import{Tab as l,Tabs as u}from"fumadocs-ui/components/tabs";import{Accordion as d,Accordions as f}from"fumadocs-ui/components/accordion";import{File as p,Files as m,Folder as h}from"fumadocs-ui/components/files";import{ImageZoom as g}from"fumadocs-ui/components/image-zoom";import{Step as _,Steps as v}from"fumadocs-ui/components/steps";import y from"fumadocs-ui/mdx";const b={...y,a:r,img:e=>c(g,{...e}),Step:_,Steps:v,File:p,Folder:h,Files:m,Accordion:d,Accordions:f,Tab:l,Tabs:u,pre:({ref:e,...n})=>c(a,{...n,children:c(t,{children:n.children})}),CodeBlockTabs:e,CodeBlockTabsList:i,CodeBlockTabsTrigger:o,CodeBlockTab:n,h1:e=>c(s,{as:`h1`,...e}),h2:e=>c(s,{as:`h2`,...e}),h3:e=>c(s,{as:`h3`,...e}),h4:e=>c(s,{as:`h4`,...e}),h5:e=>c(s,{as:`h5`,...e}),h6:e=>c(s,{as:`h6`,...e})};export{b as arkenvComponents};
@@ -0,0 +1 @@
1
+ import{clsx as e}from"clsx";import{twMerge as t}from"tailwind-merge";function n(...n){return t(e(n))}function r(e){if(!e||e.startsWith(`/`)||e.startsWith(`#`))return!1;try{let t=new URL(e,`http://localhost`),n=t.hostname.toLowerCase();return n===`arkenv.js.org`||n===`www.arkenv.js.org`||n===`localhost`||n===`127.0.0.1`?!1:t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function i(e){if(!e)return e;try{let t=new URL(e,`http://localhost`),n=t.hostname.toLowerCase();return n===`arkenv.js.org`||n===`www.arkenv.js.org`?t.pathname+t.search+t.hash:e}catch{return e}}export{i as n,n as r,r as t};
@@ -0,0 +1 @@
1
+ const e=require(`./heading-11j3HQh7.cjs`);let t=require(`clsx`),n=require(`tailwind-merge`);function r(...e){return(0,n.twMerge)((0,t.clsx)(e))}function i(e){if(!e||e.startsWith(`/`)||e.startsWith(`#`))return!1;try{let t=new URL(e,`http://localhost`),n=t.hostname.toLowerCase();return n===`arkenv.js.org`||n===`www.arkenv.js.org`||n===`localhost`||n===`127.0.0.1`?!1:t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function a(e){if(!e)return e;try{let t=new URL(e,`http://localhost`),n=t.hostname.toLowerCase();return n===`arkenv.js.org`||n===`www.arkenv.js.org`?t.pathname+t.search+t.hash:e}catch{return e}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
@@ -0,0 +1 @@
1
+ const e=require(`../url-xnMEOisP.cjs`);exports.cn=e.r,exports.isExternalUrl=e.t,exports.optimizeInternalLink=e.n;
@@ -0,0 +1,13 @@
1
+ import { ClassValue } from "clsx";
2
+
3
+ //#region src/utils/cn.d.ts
4
+ declare function cn(...inputs: ClassValue[]): string;
5
+ //#endregion
6
+ //#region src/utils/url.d.ts
7
+ type ArkenvUrl = string;
8
+ declare function isExternalUrl(url: string | undefined): boolean;
9
+ declare function optimizeInternalLink(url: string): string;
10
+ declare function optimizeInternalLink(url: undefined): undefined;
11
+ declare function optimizeInternalLink(url: string | undefined): string | undefined;
12
+ //#endregion
13
+ export { ArkenvUrl, cn, isExternalUrl, optimizeInternalLink };
@@ -0,0 +1,13 @@
1
+ import { ClassValue } from "clsx";
2
+
3
+ //#region src/utils/cn.d.ts
4
+ declare function cn(...inputs: ClassValue[]): string;
5
+ //#endregion
6
+ //#region src/utils/url.d.ts
7
+ type ArkenvUrl = string;
8
+ declare function isExternalUrl(url: string | undefined): boolean;
9
+ declare function optimizeInternalLink(url: string): string;
10
+ declare function optimizeInternalLink(url: undefined): undefined;
11
+ declare function optimizeInternalLink(url: string | undefined): string | undefined;
12
+ //#endregion
13
+ export { ArkenvUrl, cn, isExternalUrl, optimizeInternalLink };
@@ -0,0 +1 @@
1
+ import{n as e,r as t,t as n}from"../url-CZOXzYIy.mjs";export{t as cn,n as isExternalUrl,e as optimizeInternalLink};
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@arkenv/fumadocs-ui",
3
+ "version": "0.0.2",
4
+ "type": "module",
5
+ "exports": {
6
+ "./css/*": "./css/*",
7
+ "./mdx": {
8
+ "types": {
9
+ "import": "./dist/mdx/index.d.mts",
10
+ "require": "./dist/mdx/index.d.cts"
11
+ },
12
+ "import": "./dist/mdx/index.mjs",
13
+ "require": "./dist/mdx/index.cjs"
14
+ },
15
+ "./components": {
16
+ "types": {
17
+ "import": "./dist/components/index.d.mts",
18
+ "require": "./dist/components/index.d.cts"
19
+ },
20
+ "import": "./dist/components/index.mjs",
21
+ "require": "./dist/components/index.cjs"
22
+ },
23
+ "./utils": {
24
+ "types": {
25
+ "import": "./dist/utils/index.d.mts",
26
+ "require": "./dist/utils/index.d.cts"
27
+ },
28
+ "import": "./dist/utils/index.mjs",
29
+ "require": "./dist/utils/index.cjs"
30
+ }
31
+ },
32
+ "files": [
33
+ "css/*",
34
+ "dist/*"
35
+ ],
36
+ "dependencies": {
37
+ "clsx": "2.1.1",
38
+ "tailwind-merge": "3.4.0"
39
+ },
40
+ "peerDependencies": {
41
+ "@fumadocs/ui": "16.4.7",
42
+ "fumadocs-core": "16.4.7",
43
+ "fumadocs-ui": "16.4.7",
44
+ "lucide-react": "0.562.0",
45
+ "react": "19.2.3",
46
+ "react-dom": "19.2.3",
47
+ "tailwindcss": "4.1.18"
48
+ },
49
+ "devDependencies": {
50
+ "@fumadocs/ui": "16.4.7",
51
+ "@types/mdx": "2.0.13",
52
+ "@types/react": "19.2.9",
53
+ "@types/react-dom": "19.2.3",
54
+ "fumadocs-core": "16.4.7",
55
+ "fumadocs-ui": "16.4.7",
56
+ "lucide-react": "0.562.0",
57
+ "react": "19.2.3",
58
+ "react-dom": "19.2.3",
59
+ "rimraf": "6.1.2",
60
+ "rollup-plugin-preserve-use-client": "^3.0.1",
61
+ "tailwindcss": "4.1.18",
62
+ "tsdown": "0.19.0",
63
+ "typescript": "5.9.3"
64
+ },
65
+ "publishConfig": {
66
+ "access": "public"
67
+ },
68
+ "scripts": {
69
+ "build": "tsdown",
70
+ "clean": "rimraf dist",
71
+ "typecheck": "tsc --noEmit",
72
+ "fix": "pnpm -w run fix"
73
+ }
74
+ }