fumadocs-openapi 10.2.2 → 10.2.4
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/generate-file.d.ts +53 -49
- package/dist/generate-file.d.ts.map +1 -1
- package/dist/generate-file.js +88 -102
- package/dist/generate-file.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +3 -1
- package/dist/playground/client.d.ts +88 -72
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +446 -296
- package/dist/playground/client.js.map +1 -0
- package/dist/playground/components/inputs.js +395 -172
- package/dist/playground/components/inputs.js.map +1 -0
- package/dist/playground/components/oauth-dialog.js +270 -174
- package/dist/playground/components/oauth-dialog.js.map +1 -0
- package/dist/playground/components/server-select.js +115 -55
- package/dist/playground/components/server-select.js.map +1 -0
- package/dist/playground/fetcher.d.ts +10 -18
- package/dist/playground/fetcher.d.ts.map +1 -1
- package/dist/playground/fetcher.js +67 -75
- package/dist/playground/fetcher.js.map +1 -0
- package/dist/playground/get-default-values.js +23 -26
- package/dist/playground/get-default-values.js.map +1 -0
- package/dist/playground/index.d.ts +23 -13
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +87 -91
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/lazy.js +9 -2
- package/dist/playground/lazy.js.map +1 -0
- package/dist/playground/schema.d.ts +18 -55
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +117 -106
- package/dist/playground/schema.js.map +1 -0
- package/dist/playground/status-info.js +49 -37
- package/dist/playground/status-info.js.map +1 -0
- package/dist/requests/generators/csharp.js +40 -50
- package/dist/requests/generators/csharp.js.map +1 -0
- package/dist/requests/generators/curl.js +28 -27
- package/dist/requests/generators/curl.js.map +1 -0
- package/dist/requests/generators/go.js +39 -35
- package/dist/requests/generators/go.js.map +1 -0
- package/dist/requests/generators/index.js +49 -43
- package/dist/requests/generators/index.js.map +1 -0
- package/dist/requests/generators/java.js +56 -67
- package/dist/requests/generators/java.js.map +1 -0
- package/dist/requests/generators/javascript.js +38 -45
- package/dist/requests/generators/javascript.js.map +1 -0
- package/dist/requests/generators/python.js +33 -37
- package/dist/requests/generators/python.js.map +1 -0
- package/dist/requests/media/adapter.d.ts +38 -84
- package/dist/requests/media/adapter.d.ts.map +1 -1
- package/dist/requests/media/adapter.js +122 -169
- package/dist/requests/media/adapter.js.map +1 -0
- package/dist/requests/media/encode.d.ts +12 -7
- package/dist/requests/media/encode.d.ts.map +1 -1
- package/dist/requests/media/encode.js +131 -109
- package/dist/requests/media/encode.js.map +1 -0
- package/dist/requests/media/resolve-adapter.js +28 -28
- package/dist/requests/media/resolve-adapter.js.map +1 -0
- package/dist/requests/string-utils.js +28 -35
- package/dist/requests/string-utils.js.map +1 -0
- package/dist/requests/to-python-object.js +16 -28
- package/dist/requests/to-python-object.js.map +1 -0
- package/dist/requests/types.d.ts +25 -21
- package/dist/requests/types.d.ts.map +1 -1
- package/dist/scalar/client.js +57 -20
- package/dist/scalar/client.js.map +1 -0
- package/dist/scalar/index.d.ts +8 -2
- package/dist/scalar/index.d.ts.map +1 -1
- package/dist/scalar/index.js +29 -19
- package/dist/scalar/index.js.map +1 -0
- package/dist/server/create.d.ts +29 -25
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +42 -39
- package/dist/server/create.js.map +1 -0
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +4 -2
- package/dist/server/proxy.d.ts +28 -28
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +58 -75
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/source-api.d.ts +32 -29
- package/dist/server/source-api.d.ts.map +1 -1
- package/dist/server/source-api.js +82 -75
- package/dist/server/source-api.js.map +1 -0
- package/dist/types.d.ts +41 -36
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +140 -136
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +134 -118
- package/dist/ui/api-page.js.map +1 -0
- package/dist/ui/client/index.d.ts +30 -26
- package/dist/ui/client/index.d.ts.map +1 -1
- package/dist/ui/client/index.js +8 -2
- package/dist/ui/client/index.js.map +1 -0
- package/dist/ui/client/storage-key.js +16 -10
- package/dist/ui/client/storage-key.js.map +1 -0
- package/dist/ui/components/accordion.js +40 -14
- package/dist/ui/components/accordion.js.map +1 -0
- package/dist/ui/components/dialog.js +51 -15
- package/dist/ui/components/dialog.js.map +1 -0
- package/dist/ui/components/input.js +18 -8
- package/dist/ui/components/input.js.map +1 -0
- package/dist/ui/components/method-label.js +38 -33
- package/dist/ui/components/method-label.js.map +1 -0
- package/dist/ui/components/select.js +66 -15
- package/dist/ui/components/select.js.map +1 -0
- package/dist/ui/contexts/api.js +96 -85
- package/dist/ui/contexts/api.js.map +1 -0
- package/dist/ui/contexts/api.lazy.js +9 -2
- package/dist/ui/contexts/api.lazy.js.map +1 -0
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +3 -1
- package/dist/ui/operation/client.js +65 -27
- package/dist/ui/operation/client.js.map +1 -0
- package/dist/ui/operation/index.js +403 -186
- package/dist/ui/operation/index.js.map +1 -0
- package/dist/ui/operation/request-tabs.d.ts +15 -16
- package/dist/ui/operation/request-tabs.d.ts.map +1 -1
- package/dist/ui/operation/request-tabs.js +151 -131
- package/dist/ui/operation/request-tabs.js.map +1 -0
- package/dist/ui/operation/response-tabs.d.ts +27 -28
- package/dist/ui/operation/response-tabs.d.ts.map +1 -1
- package/dist/ui/operation/response-tabs.js +73 -56
- package/dist/ui/operation/response-tabs.js.map +1 -0
- package/dist/ui/operation/usage-tabs/client.js +117 -88
- package/dist/ui/operation/usage-tabs/client.js.map +1 -0
- package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
- package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js +63 -48
- package/dist/ui/operation/usage-tabs/index.js.map +1 -0
- package/dist/ui/operation/usage-tabs/lazy.js +11 -4
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
- package/dist/ui/schema/client.d.ts +11 -7
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +213 -127
- package/dist/ui/schema/client.js.map +1 -0
- package/dist/ui/schema/index.d.ts +51 -50
- package/dist/ui/schema/index.d.ts.map +1 -1
- package/dist/ui/schema/index.js +225 -248
- package/dist/ui/schema/index.js.map +1 -0
- package/dist/ui/schema/lazy.js +9 -2
- package/dist/ui/schema/lazy.js.map +1 -0
- package/dist/utils/cn.js +3 -1
- package/dist/utils/deep-equal.js +18 -26
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/get-typescript-schema.js +21 -19
- package/dist/utils/get-typescript-schema.js.map +1 -0
- package/dist/utils/id-to-title.js +13 -16
- package/dist/utils/id-to-title.js.map +1 -0
- package/dist/utils/lazy.js +13 -11
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/merge-schema.js +130 -174
- package/dist/utils/merge-schema.js.map +1 -0
- package/dist/utils/pages/builder.d.ts +80 -76
- package/dist/utils/pages/builder.d.ts.map +1 -1
- package/dist/utils/pages/builder.js +101 -118
- package/dist/utils/pages/builder.js.map +1 -0
- package/dist/utils/pages/preset-auto.d.ts +58 -55
- package/dist/utils/pages/preset-auto.d.ts.map +1 -1
- package/dist/utils/pages/preset-auto.js +124 -137
- package/dist/utils/pages/preset-auto.js.map +1 -0
- package/dist/utils/pages/to-body.js +21 -18
- package/dist/utils/pages/to-body.js.map +1 -0
- package/dist/utils/pages/to-static-data.js +48 -40
- package/dist/utils/pages/to-static-data.js.map +1 -0
- package/dist/utils/pages/to-text.d.ts +43 -41
- package/dist/utils/pages/to-text.d.ts.map +1 -1
- package/dist/utils/pages/to-text.js +93 -126
- package/dist/utils/pages/to-text.js.map +1 -0
- package/dist/utils/process-document.d.ts +18 -19
- package/dist/utils/process-document.d.ts.map +1 -1
- package/dist/utils/process-document.js +43 -54
- package/dist/utils/process-document.js.map +1 -0
- package/dist/utils/remove-undefined.js +18 -18
- package/dist/utils/remove-undefined.js.map +1 -0
- package/dist/utils/schema-to-string.js +46 -64
- package/dist/utils/schema-to-string.js.map +1 -0
- package/dist/utils/schema.d.ts +11 -27
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +43 -44
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/url.js +35 -56
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/use-query.js +39 -33
- package/dist/utils/use-query.js.map +1 -0
- package/package.json +34 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/playground/components/inputs.d.ts +0 -25
- package/dist/playground/components/inputs.d.ts.map +0 -1
- package/dist/playground/components/oauth-dialog.d.ts +0 -13
- package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
- package/dist/playground/components/server-select.d.ts +0 -3
- package/dist/playground/components/server-select.d.ts.map +0 -1
- package/dist/playground/get-default-values.d.ts +0 -3
- package/dist/playground/get-default-values.d.ts.map +0 -1
- package/dist/playground/lazy.d.ts +0 -2
- package/dist/playground/lazy.d.ts.map +0 -1
- package/dist/playground/status-info.d.ts +0 -8
- package/dist/playground/status-info.d.ts.map +0 -1
- package/dist/requests/generators/csharp.d.ts +0 -3
- package/dist/requests/generators/csharp.d.ts.map +0 -1
- package/dist/requests/generators/curl.d.ts +0 -3
- package/dist/requests/generators/curl.d.ts.map +0 -1
- package/dist/requests/generators/go.d.ts +0 -3
- package/dist/requests/generators/go.d.ts.map +0 -1
- package/dist/requests/generators/index.d.ts +0 -3
- package/dist/requests/generators/index.d.ts.map +0 -1
- package/dist/requests/generators/java.d.ts +0 -3
- package/dist/requests/generators/java.d.ts.map +0 -1
- package/dist/requests/generators/javascript.d.ts +0 -3
- package/dist/requests/generators/javascript.d.ts.map +0 -1
- package/dist/requests/generators/python.d.ts +0 -3
- package/dist/requests/generators/python.d.ts.map +0 -1
- package/dist/requests/media/resolve-adapter.d.ts +0 -19
- package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
- package/dist/requests/string-utils.d.ts +0 -7
- package/dist/requests/string-utils.d.ts.map +0 -1
- package/dist/requests/to-python-object.d.ts +0 -2
- package/dist/requests/to-python-object.d.ts.map +0 -1
- package/dist/requests/types.js +0 -1
- package/dist/scalar/client.d.ts +0 -7
- package/dist/scalar/client.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/ui/client/storage-key.d.ts +0 -9
- package/dist/ui/client/storage-key.d.ts.map +0 -1
- package/dist/ui/components/accordion.d.ts +0 -8
- package/dist/ui/components/accordion.d.ts.map +0 -1
- package/dist/ui/components/dialog.d.ts +0 -20
- package/dist/ui/components/dialog.d.ts.map +0 -1
- package/dist/ui/components/input.d.ts +0 -6
- package/dist/ui/components/input.d.ts.map +0 -1
- package/dist/ui/components/method-label.d.ts +0 -10
- package/dist/ui/components/method-label.d.ts.map +0 -1
- package/dist/ui/components/select.d.ts +0 -14
- package/dist/ui/components/select.d.ts.map +0 -1
- package/dist/ui/contexts/api.d.ts +0 -33
- package/dist/ui/contexts/api.d.ts.map +0 -1
- package/dist/ui/contexts/api.lazy.d.ts +0 -2
- package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
- package/dist/ui/icons.d.ts +0 -49
- package/dist/ui/icons.d.ts.map +0 -1
- package/dist/ui/icons.js +0 -281
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/operation/client.d.ts +0 -19
- package/dist/ui/operation/client.d.ts.map +0 -1
- package/dist/ui/operation/index.d.ts +0 -12
- package/dist/ui/operation/index.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
- package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
- package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
- package/dist/ui/schema/lazy.d.ts +0 -2
- package/dist/ui/schema/lazy.d.ts.map +0 -1
- package/dist/utils/cn.d.ts +0 -2
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/deep-equal.d.ts +0 -2
- package/dist/utils/deep-equal.d.ts.map +0 -1
- package/dist/utils/get-typescript-schema.d.ts +0 -4
- package/dist/utils/get-typescript-schema.d.ts.map +0 -1
- package/dist/utils/id-to-title.d.ts +0 -2
- package/dist/utils/id-to-title.d.ts.map +0 -1
- package/dist/utils/lazy.d.ts +0 -5
- package/dist/utils/lazy.d.ts.map +0 -1
- package/dist/utils/merge-schema.d.ts +0 -7
- package/dist/utils/merge-schema.d.ts.map +0 -1
- package/dist/utils/pages/to-body.d.ts +0 -4
- package/dist/utils/pages/to-body.d.ts.map +0 -1
- package/dist/utils/pages/to-static-data.d.ts +0 -10
- package/dist/utils/pages/to-static-data.d.ts.map +0 -1
- package/dist/utils/remove-undefined.d.ts +0 -2
- package/dist/utils/remove-undefined.d.ts.map +0 -1
- package/dist/utils/schema-to-string.d.ts +0 -8
- package/dist/utils/schema-to-string.d.ts.map +0 -1
- package/dist/utils/url.d.ts +0 -11
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/use-query.d.ts +0 -8
- package/dist/utils/use-query.d.ts.map +0 -1
package/dist/ui/api-page.js
CHANGED
|
@@ -1,120 +1,136 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
return _jsx(APIPage, { ...props, ctx: ctx });
|
|
86
|
-
};
|
|
1
|
+
import { createMethod } from "../utils/schema.js";
|
|
2
|
+
import { defaultAdapters } from "../requests/media/adapter.js";
|
|
3
|
+
import { Operation } from "./operation/index.js";
|
|
4
|
+
import { ApiProviderLazy } from "./contexts/api.lazy.js";
|
|
5
|
+
import Slugger from "github-slugger";
|
|
6
|
+
import * as JsxRuntime from "react/jsx-runtime";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
|
|
9
|
+
import { highlight } from "fumadocs-core/highlight";
|
|
10
|
+
import { Heading } from "fumadocs-ui/components/heading";
|
|
11
|
+
import { rehypeCode } from "fumadocs-core/mdx-plugins/rehype-code";
|
|
12
|
+
import { remarkGfm } from "fumadocs-core/mdx-plugins/remark-gfm";
|
|
13
|
+
import defaultMdxComponents from "fumadocs-ui/mdx";
|
|
14
|
+
import { remark } from "remark";
|
|
15
|
+
import remarkRehype from "remark-rehype";
|
|
16
|
+
import { toJsxRuntime } from "hast-util-to-jsx-runtime";
|
|
17
|
+
|
|
18
|
+
//#region src/ui/api-page.tsx
|
|
19
|
+
function createAPIPage(server, options = {}) {
|
|
20
|
+
let processor;
|
|
21
|
+
function createMarkdownProcessor() {
|
|
22
|
+
function rehypeReact() {
|
|
23
|
+
this.compiler = (tree, file) => {
|
|
24
|
+
return toJsxRuntime(tree, {
|
|
25
|
+
development: false,
|
|
26
|
+
filePath: file.path,
|
|
27
|
+
...JsxRuntime,
|
|
28
|
+
components: defaultMdxComponents
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return remark().use(remarkGfm).use(remarkRehype).use(rehypeCode, {
|
|
33
|
+
langs: [],
|
|
34
|
+
lazy: true
|
|
35
|
+
}).use(rehypeReact);
|
|
36
|
+
}
|
|
37
|
+
return async function APIPageWrapper({ document, ...props }) {
|
|
38
|
+
let processed;
|
|
39
|
+
if (typeof document === "string") processed = await server.getSchema(document);
|
|
40
|
+
else processed = await document;
|
|
41
|
+
const { dereferenced } = processed;
|
|
42
|
+
const servers = dereferenced.servers && dereferenced.servers.length > 0 ? dereferenced.servers : [{ url: "/" }];
|
|
43
|
+
const slugger = new Slugger();
|
|
44
|
+
const ctx = {
|
|
45
|
+
schema: processed,
|
|
46
|
+
proxyUrl: server.options.proxyUrl,
|
|
47
|
+
...options,
|
|
48
|
+
servers,
|
|
49
|
+
mediaAdapters: {
|
|
50
|
+
...defaultAdapters,
|
|
51
|
+
...options.mediaAdapters
|
|
52
|
+
},
|
|
53
|
+
slugger,
|
|
54
|
+
renderHeading(depth, text, props$1) {
|
|
55
|
+
const id = slugger.slug(text);
|
|
56
|
+
return /* @__PURE__ */ jsx(Heading, {
|
|
57
|
+
id,
|
|
58
|
+
as: `h${depth}`,
|
|
59
|
+
...props$1,
|
|
60
|
+
children: text
|
|
61
|
+
}, id);
|
|
62
|
+
},
|
|
63
|
+
async renderMarkdown(text) {
|
|
64
|
+
processor ??= createMarkdownProcessor();
|
|
65
|
+
return (await processor.process({ value: text })).result;
|
|
66
|
+
},
|
|
67
|
+
async renderCodeBlock(lang, code) {
|
|
68
|
+
return /* @__PURE__ */ jsx(CodeBlock, {
|
|
69
|
+
className: "my-0",
|
|
70
|
+
children: await highlight(code, {
|
|
71
|
+
lang,
|
|
72
|
+
...options.shikiOptions,
|
|
73
|
+
components: { pre: (props$1) => /* @__PURE__ */ jsx(Pre, { ...props$1 }) }
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return /* @__PURE__ */ jsx(APIPage, {
|
|
79
|
+
...props,
|
|
80
|
+
ctx
|
|
81
|
+
});
|
|
82
|
+
};
|
|
87
83
|
}
|
|
88
|
-
async function APIPage({ showTitle: hasHead = false, showDescription, operations, webhooks, ctx
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
84
|
+
async function APIPage({ showTitle: hasHead = false, showDescription, operations, webhooks, ctx }) {
|
|
85
|
+
const { dereferenced } = ctx.schema;
|
|
86
|
+
let { renderPageLayout } = ctx.content ?? {};
|
|
87
|
+
renderPageLayout ??= (slots) => /* @__PURE__ */ jsxs("div", {
|
|
88
|
+
className: "flex flex-col gap-24 text-sm @container",
|
|
89
|
+
children: [slots.operations?.map((op) => op.children), slots.webhooks?.map((op) => op.children)]
|
|
90
|
+
});
|
|
91
|
+
const content = await renderPageLayout({
|
|
92
|
+
operations: operations?.map((item) => {
|
|
93
|
+
const pathItem = dereferenced.paths?.[item.path];
|
|
94
|
+
if (!pathItem) throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);
|
|
95
|
+
const operation = pathItem[item.method];
|
|
96
|
+
if (!operation) throw new Error(`[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`);
|
|
97
|
+
return {
|
|
98
|
+
item,
|
|
99
|
+
children: /* @__PURE__ */ jsx(Operation, {
|
|
100
|
+
method: createMethod(item.method, pathItem, operation),
|
|
101
|
+
path: item.path,
|
|
102
|
+
ctx,
|
|
103
|
+
showTitle: hasHead,
|
|
104
|
+
showDescription
|
|
105
|
+
}, `${item.path}:${item.method}`)
|
|
106
|
+
};
|
|
107
|
+
}),
|
|
108
|
+
webhooks: webhooks?.map((item) => {
|
|
109
|
+
const webhook = dereferenced.webhooks?.[item.name];
|
|
110
|
+
if (!webhook) throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);
|
|
111
|
+
const hook = webhook[item.method];
|
|
112
|
+
if (!hook) throw new Error(`[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`);
|
|
113
|
+
return {
|
|
114
|
+
item,
|
|
115
|
+
children: /* @__PURE__ */ jsx(Operation, {
|
|
116
|
+
type: "webhook",
|
|
117
|
+
method: createMethod(item.method, webhook, hook),
|
|
118
|
+
ctx,
|
|
119
|
+
path: `/${item.name}`,
|
|
120
|
+
showTitle: hasHead,
|
|
121
|
+
showDescription
|
|
122
|
+
}, `${item.name}:${item.method}`)
|
|
123
|
+
};
|
|
124
|
+
})
|
|
125
|
+
}, ctx);
|
|
126
|
+
return /* @__PURE__ */ jsx(ApiProviderLazy, {
|
|
127
|
+
servers: ctx.servers,
|
|
128
|
+
shikiOptions: ctx.shikiOptions,
|
|
129
|
+
client: ctx.client ?? {},
|
|
130
|
+
children: content
|
|
131
|
+
});
|
|
120
132
|
}
|
|
133
|
+
|
|
134
|
+
//#endregion
|
|
135
|
+
export { createAPIPage };
|
|
136
|
+
//# sourceMappingURL=api-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-page.js","names":["processor: ReturnType<typeof createMarkdownProcessor>","processed: ProcessedDocument","ctx: RenderContext","props"],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport { Operation } from '@/ui/operation';\nimport type { MethodInformation, RenderContext } from '@/types';\nimport { createMethod, type NoReference } from '@/utils/schema';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, ReactNode } from 'react';\nimport {\n highlight,\n type HighlightOptionsCommon,\n type HighlightOptionsThemes,\n} from 'fumadocs-core/highlight';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport type { CodeUsageGenerator } from './operation/usage-tabs';\nimport { ApiProviderLazy } from './contexts/api.lazy';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { rehypeCode, type RehypeCodeOptions } from 'fumadocs-core/mdx-plugins/rehype-code';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport type { ExampleRequestItem } from './operation/request-tabs';\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n */\n generateTypeScriptSchema?:\n | ((method: NoReference<MethodInformation>, statusCode: string) => Awaitable<string>)\n | false;\n\n /**\n * Generate example code usage for endpoints.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<CodeUsageGenerator[]>;\n\n shikiOptions?: Omit<HighlightOptionsCommon, 'lang' | 'components'> & HighlightOptionsThemes;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGenerator[],\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n client?: APIPageClientOptions;\n}\n\nexport interface ApiPageProps {\n document: Promise<ProcessedDocument> | string | ProcessedDocument;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport interface OperationItem {\n /**\n * the path of operation in `paths`\n */\n path: string;\n /**\n * the HTTP method of operation\n */\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions = {},\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(rehypeCode, {\n langs: [],\n lazy: true,\n } satisfies Partial<RehypeCodeOptions>)\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const { dereferenced } = processed;\n const servers =\n dereferenced.servers && dereferenced.servers.length > 0\n ? dereferenced.servers\n : [{ url: '/' }];\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n servers,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n renderHeading(depth, text, props) {\n const id = slugger.slug(text);\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n async renderMarkdown(text) {\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n const rendered = await highlight(code, {\n lang,\n ...options.shikiOptions,\n components: {\n pre: (props) => <Pre {...props} />,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nasync function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = await renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n\n return (\n <ApiProviderLazy\n servers={ctx.servers}\n shikiOptions={ctx.shikiOptions}\n client={ctx.client ?? {}}\n >\n {content}\n </ApiProviderLazy>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,29 +1,33 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { MediaAdapter } from "../../requests/media/adapter.js";
|
|
2
|
+
import { PlaygroundClientOptions } from "../../playground/client.js";
|
|
3
|
+
import { ExampleRequestItem } from "../operation/request-tabs.js";
|
|
4
|
+
import { FC } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/client/index.d.ts
|
|
7
|
+
interface APIPageClientOptions {
|
|
8
|
+
playground?: PlaygroundClientOptions;
|
|
9
|
+
operation?: OperationClientOptions;
|
|
10
|
+
/**
|
|
11
|
+
* Set a prefix for `localStorage` keys.
|
|
12
|
+
*
|
|
13
|
+
* Useful when using multiple OpenAPI instances to prevent state conflicts.
|
|
14
|
+
*
|
|
15
|
+
* @defaultValue `fumadocs-openapi-`
|
|
16
|
+
*/
|
|
17
|
+
storageKeyPrefix?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Support other media types (for client-side serialization)
|
|
20
|
+
*/
|
|
21
|
+
mediaAdapters?: Record<string, MediaAdapter>;
|
|
20
22
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
interface OperationClientOptions {
|
|
24
|
+
APIExampleSelector?: FC<{
|
|
25
|
+
items: ExampleRequestItem[];
|
|
26
|
+
value: string | undefined;
|
|
27
|
+
onValueChange: (id: string) => void;
|
|
28
|
+
}>;
|
|
27
29
|
}
|
|
28
|
-
|
|
30
|
+
declare function defineClientConfig(options?: APIPageClientOptions): APIPageClientOptions;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { APIPageClientOptions, OperationClientOptions, defineClientConfig };
|
|
29
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/client/index.tsx"],"sourcesContent":[],"mappings":";;;;;;UAMiB,oBAAA;eACF;EADE,SAAA,CAAA,EAEH,sBAFuB;EACtB;;;;;AAkBf;AASA;;;;;kBAZkB,eAAe;;UAGhB,sBAAA;uBACM;WACZ;;;;;iBAOK,kBAAA,WAA4B,uBAA4B"}
|
package/dist/ui/client/index.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
//#region src/ui/client/index.tsx
|
|
4
|
+
function defineClientConfig(options = {}) {
|
|
5
|
+
return options;
|
|
4
6
|
}
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
export { defineClientConfig };
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/client/index.tsx"],"sourcesContent":["'use client';\nimport type { PlaygroundClientOptions } from '@/playground/client';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport type { FC } from 'react';\nimport type { ExampleRequestItem } from '../operation/request-tabs';\n\nexport interface APIPageClientOptions {\n playground?: PlaygroundClientOptions;\n operation?: OperationClientOptions;\n\n /**\n * Set a prefix for `localStorage` keys.\n *\n * Useful when using multiple OpenAPI instances to prevent state conflicts.\n *\n * @defaultValue `fumadocs-openapi-`\n */\n storageKeyPrefix?: string;\n\n /**\n * Support other media types (for client-side serialization)\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n}\n\nexport interface OperationClientOptions {\n APIExampleSelector?: FC<{\n items: ExampleRequestItem[];\n\n value: string | undefined;\n onValueChange: (id: string) => void;\n }>;\n}\n\nexport function defineClientConfig(options: APIPageClientOptions = {}): APIPageClientOptions {\n return options;\n}\n"],"mappings":";;;AAkCA,SAAgB,mBAAmB,UAAgC,EAAE,EAAwB;AAC3F,QAAO"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { useApiContext } from
|
|
2
|
-
import { useMemo } from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { useApiContext } from "../contexts/api.js";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/client/storage-key.ts
|
|
5
|
+
function useStorageKey() {
|
|
6
|
+
const { storageKeyPrefix } = useApiContext().client;
|
|
7
|
+
return useMemo(() => ({
|
|
8
|
+
of: (name) => getStorageKey(storageKeyPrefix, name),
|
|
9
|
+
AuthField: (field) => getStorageKey(storageKeyPrefix, `auth-${field.original?.id ?? field.fieldName}`)
|
|
10
|
+
}), [storageKeyPrefix]);
|
|
9
11
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
function getStorageKey(prefix = "fumadocs-openapi-", name) {
|
|
13
|
+
return prefix + name;
|
|
12
14
|
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { useStorageKey };
|
|
18
|
+
//# sourceMappingURL=storage-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-key.js","names":[],"sources":["../../../src/ui/client/storage-key.ts"],"sourcesContent":["import type { AuthField } from '@/playground/client';\nimport { useApiContext } from '../contexts/api';\nimport { useMemo } from 'react';\n\ntype KeyName = 'server-url' | `auth-${string}`;\n\nexport function useStorageKey() {\n const { storageKeyPrefix } = useApiContext().client;\n\n return useMemo(\n () => ({\n of: (name: KeyName) => getStorageKey(storageKeyPrefix, name),\n AuthField: (field: AuthField) =>\n getStorageKey(storageKeyPrefix, `auth-${field.original?.id ?? field.fieldName}`),\n }),\n [storageKeyPrefix],\n );\n}\n\nexport function getStorageKey(prefix = 'fumadocs-openapi-', name: KeyName) {\n return prefix + name;\n}\n"],"mappings":";;;;AAMA,SAAgB,gBAAgB;CAC9B,MAAM,EAAE,qBAAqB,eAAe,CAAC;AAE7C,QAAO,eACE;EACL,KAAK,SAAkB,cAAc,kBAAkB,KAAK;EAC5D,YAAY,UACV,cAAc,kBAAkB,QAAQ,MAAM,UAAU,MAAM,MAAM,YAAY;EACnF,GACD,CAAC,iBAAiB,CACnB;;AAGH,SAAgB,cAAc,SAAS,qBAAqB,MAAe;AACzE,QAAO,SAAS"}
|
|
@@ -1,20 +1,46 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../utils/cn.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { ChevronRight } from "lucide-react";
|
|
6
|
+
import * as Primitive from "@radix-ui/react-accordion";
|
|
7
|
+
|
|
8
|
+
//#region src/ui/components/accordion.tsx
|
|
9
|
+
function Accordions(props) {
|
|
10
|
+
return /* @__PURE__ */ jsx(Primitive.Root, {
|
|
11
|
+
...props,
|
|
12
|
+
className: cn("divide-y divide-fd-border", props.className)
|
|
13
|
+
});
|
|
8
14
|
}
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
function AccordionItem(props) {
|
|
16
|
+
return /* @__PURE__ */ jsx(Primitive.Item, {
|
|
17
|
+
...props,
|
|
18
|
+
className: cn("scroll-m-20", props.className),
|
|
19
|
+
children: props.children
|
|
20
|
+
});
|
|
11
21
|
}
|
|
12
|
-
|
|
13
|
-
|
|
22
|
+
function AccordionContent(props) {
|
|
23
|
+
return /* @__PURE__ */ jsx(Primitive.Content, {
|
|
24
|
+
...props,
|
|
25
|
+
className: cn("overflow-hidden data-[state=closed]:animate-fd-accordion-up data-[state=open]:animate-fd-accordion-down", props.className),
|
|
26
|
+
children: props.children
|
|
27
|
+
});
|
|
14
28
|
}
|
|
15
|
-
|
|
16
|
-
|
|
29
|
+
function AccordionHeader(props) {
|
|
30
|
+
return /* @__PURE__ */ jsx(Primitive.Header, {
|
|
31
|
+
...props,
|
|
32
|
+
className: cn("not-prose flex py-2 text-fd-foreground font-medium", props.className),
|
|
33
|
+
children: props.children
|
|
34
|
+
});
|
|
17
35
|
}
|
|
18
|
-
|
|
19
|
-
|
|
36
|
+
function AccordionTrigger(props) {
|
|
37
|
+
return /* @__PURE__ */ jsxs(Primitive.Trigger, {
|
|
38
|
+
...props,
|
|
39
|
+
className: cn("flex flex-1 items-center gap-1 text-start group/accordion focus-visible:outline-none", props.className),
|
|
40
|
+
children: [/* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5 text-fd-muted-foreground shrink-0 transition-transform group-focus-visible/accordion:text-fd-primary group-data-[state=open]/accordion:rotate-90" }), props.children]
|
|
41
|
+
});
|
|
20
42
|
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions };
|
|
46
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","names":[],"sources":["../../../src/ui/components/accordion.tsx"],"sourcesContent":["'use client';\n\nimport * as Primitive from '@radix-ui/react-accordion';\nimport { ChevronRight } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport function Accordions(props: ComponentProps<typeof Primitive.Root>) {\n return <Primitive.Root {...props} className={cn('divide-y divide-fd-border', props.className)} />;\n}\n\nexport function AccordionItem(props: ComponentProps<typeof Primitive.Item>) {\n return (\n <Primitive.Item {...props} className={cn('scroll-m-20', props.className)}>\n {props.children}\n </Primitive.Item>\n );\n}\n\nexport function AccordionContent(props: ComponentProps<typeof Primitive.Content>) {\n return (\n <Primitive.Content\n {...props}\n className={cn(\n 'overflow-hidden data-[state=closed]:animate-fd-accordion-up data-[state=open]:animate-fd-accordion-down',\n props.className,\n )}\n >\n {props.children}\n </Primitive.Content>\n );\n}\n\nexport function AccordionHeader(props: ComponentProps<typeof Primitive.Header>) {\n return (\n <Primitive.Header\n {...props}\n className={cn('not-prose flex py-2 text-fd-foreground font-medium', props.className)}\n >\n {props.children}\n </Primitive.Header>\n );\n}\n\nexport function AccordionTrigger(props: ComponentProps<typeof Primitive.Trigger>) {\n return (\n <Primitive.Trigger\n {...props}\n className={cn(\n 'flex flex-1 items-center gap-1 text-start group/accordion focus-visible:outline-none',\n props.className,\n )}\n >\n <ChevronRight className=\"size-3.5 text-fd-muted-foreground shrink-0 transition-transform group-focus-visible/accordion:text-fd-primary group-data-[state=open]/accordion:rotate-90\" />\n {props.children}\n </Primitive.Trigger>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,WAAW,OAA8C;AACvE,QAAO,oBAAC,UAAU;EAAK,GAAI;EAAO,WAAW,GAAG,6BAA6B,MAAM,UAAU;GAAI;;AAGnG,SAAgB,cAAc,OAA8C;AAC1E,QACE,oBAAC,UAAU;EAAK,GAAI;EAAO,WAAW,GAAG,eAAe,MAAM,UAAU;YACrE,MAAM;GACQ;;AAIrB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,oBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GACT,2GACA,MAAM,UACP;YAEA,MAAM;GACW;;AAIxB,SAAgB,gBAAgB,OAAgD;AAC9E,QACE,oBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GAAG,sDAAsD,MAAM,UAAU;YAEnF,MAAM;GACU;;AAIvB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,qBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GACT,wFACA,MAAM,UACP;aAED,oBAAC,gBAAa,WAAU,8JAA8J,EACrL,MAAM;GACW"}
|
|
@@ -1,24 +1,60 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import * as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { buttonVariants } from
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../utils/cn.js";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { X } from "lucide-react";
|
|
7
|
+
import { buttonVariants } from "fumadocs-ui/components/ui/button";
|
|
8
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
9
|
+
|
|
10
|
+
//#region src/ui/components/dialog.tsx
|
|
8
11
|
const Dialog = DialogPrimitive.Root;
|
|
9
12
|
const DialogTrigger = DialogPrimitive.Trigger;
|
|
10
13
|
const DialogPortal = DialogPrimitive.Portal;
|
|
11
14
|
const DialogClose = DialogPrimitive.Close;
|
|
12
|
-
const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => (
|
|
15
|
+
const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Overlay, {
|
|
16
|
+
ref,
|
|
17
|
+
className: cn("fixed inset-0 z-50 bg-black/30 backdrop-blur-sm data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out", className),
|
|
18
|
+
...props
|
|
19
|
+
}));
|
|
13
20
|
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
14
|
-
const DialogContent = React.forwardRef(({ className, children, ...props }, ref) =>
|
|
21
|
+
const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
|
|
22
|
+
ref,
|
|
23
|
+
className: cn("fixed left-1/2 top-1/2 z-50 flex flex-col gap-4 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 border bg-fd-popover p-4 shadow-lg rounded-xl duration-200 data-[state=open]:animate-fd-dialog-in data-[state=closed]:animate-fd-dialog-out focus-visible:outline-none", className),
|
|
24
|
+
...props,
|
|
25
|
+
children: [children, /* @__PURE__ */ jsx(DialogPrimitive.Close, {
|
|
26
|
+
"aria-label": "Close",
|
|
27
|
+
className: cn(buttonVariants({
|
|
28
|
+
size: "icon-sm",
|
|
29
|
+
color: "ghost"
|
|
30
|
+
}), "absolute end-2 top-2 text-fd-muted-foreground/70"),
|
|
31
|
+
children: /* @__PURE__ */ jsx(X, {})
|
|
32
|
+
})]
|
|
33
|
+
})] }));
|
|
15
34
|
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
16
|
-
const DialogHeader = ({ className, ...props }) => (
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
35
|
+
const DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
36
|
+
className: cn("flex flex-col gap-1.5 text-center sm:text-start", className),
|
|
37
|
+
...props
|
|
38
|
+
});
|
|
39
|
+
DialogHeader.displayName = "DialogHeader";
|
|
40
|
+
const DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
41
|
+
className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2", className),
|
|
42
|
+
...props
|
|
43
|
+
});
|
|
44
|
+
DialogFooter.displayName = "DialogFooter";
|
|
45
|
+
const DialogTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Title, {
|
|
46
|
+
ref,
|
|
47
|
+
className: cn("text-lg font-semibold leading-none tracking-tight", className),
|
|
48
|
+
...props
|
|
49
|
+
}));
|
|
21
50
|
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
22
|
-
const DialogDescription = React.forwardRef(({ className, ...props }, ref) => (
|
|
51
|
+
const DialogDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, {
|
|
52
|
+
ref,
|
|
53
|
+
className: cn("text-sm text-fd-muted-foreground", className),
|
|
54
|
+
...props
|
|
55
|
+
}));
|
|
23
56
|
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
24
|
-
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger };
|
|
60
|
+
//# sourceMappingURL=dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.js","names":[],"sources":["../../../src/ui/components/dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/30 backdrop-blur-sm data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 flex flex-col gap-4 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 border bg-fd-popover p-4 shadow-lg rounded-xl duration-200 data-[state=open]:animate-fd-dialog-in data-[state=closed]:animate-fd-dialog-out focus-visible:outline-none',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n aria-label=\"Close\"\n className={cn(\n buttonVariants({ size: 'icon-sm', color: 'ghost' }),\n 'absolute end-2 top-2 text-fd-muted-foreground/70',\n )}\n >\n <X />\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col gap-1.5 text-center sm:text-start', className)} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-fd-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAM,SAAS,gBAAgB;AAE/B,MAAM,gBAAgB,gBAAgB;AAEtC,MAAM,eAAe,gBAAgB;AAErC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GACT,gIACA,UACD;CACD,GAAI;EACJ,CACF;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,2BACC,oBAAC,kBAAgB,EACjB,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,4QACA,UACD;CACD,GAAI;YAEH,UACD,oBAAC,gBAAgB;EACf,cAAW;EACX,WAAW,GACT,eAAe;GAAE,MAAM;GAAW,OAAO;GAAS,CAAC,EACnD,mDACD;YAED,oBAAC,MAAI;GACiB;EACA,IACb,CACf;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC;CAAI,WAAW,GAAG,mDAAmD,UAAU;CAAE,GAAI;EAAS;AAEjG,aAAa,cAAc;AAE3B,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC;CACC,WAAW,GAAG,6DAA6D,UAAU;CACrF,GAAI;EACJ;AAEJ,aAAa,cAAc;AAE3B,MAAM,cAAc,MAAM,YAGvB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,qDAAqD,UAAU;CAC7E,GAAI;EACJ,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,oBAAoB,MAAM,YAG7B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,oCAAoC,UAAU;CAC5D,GAAI;EACJ,CACF;AACF,kBAAkB,cAAc,gBAAgB,YAAY"}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import * as React from
|
|
3
|
-
import {
|
|
4
|
-
import { cva } from
|
|
5
|
-
|
|
1
|
+
import { cn } from "../../utils/cn.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/components/input.tsx
|
|
7
|
+
const labelVariants = cva("text-xs font-medium text-fd-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70");
|
|
6
8
|
const Input = React.forwardRef(({ className, type, ...props }, ref) => {
|
|
7
|
-
|
|
9
|
+
return /* @__PURE__ */ jsx("input", {
|
|
10
|
+
type,
|
|
11
|
+
className: cn("flex h-9 w-full rounded-md border bg-fd-secondary px-2 py-1.5 text-[0.8125rem] text-fd-secondary-foreground transition-colors placeholder:text-fd-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50", className),
|
|
12
|
+
ref,
|
|
13
|
+
...props
|
|
14
|
+
});
|
|
8
15
|
});
|
|
9
|
-
Input.displayName =
|
|
10
|
-
|
|
16
|
+
Input.displayName = "Input";
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { Input, labelVariants };
|
|
20
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","names":[],"sources":["../../../src/ui/components/input.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const labelVariants = cva(\n 'text-xs font-medium text-fd-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n);\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border bg-fd-secondary px-2 py-1.5 text-[0.8125rem] text-fd-secondary-foreground transition-colors placeholder:text-fd-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n"],"mappings":";;;;;;AAMA,MAAa,gBAAgB,IAC3B,mGACD;AAED,MAAM,QAAQ,MAAM,YACjB,EAAE,WAAW,MAAM,GAAG,SAAS,QAAQ;AACtC,QACE,oBAAC;EACO;EACN,WAAW,GACT,iSACA,UACD;EACI;EACL,GAAI;GACJ;EAGP;AACD,MAAM,cAAc"}
|