zudoku 0.3.0-dev.83 → 0.3.0-dev.85
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/cli.js +5 -1
- package/dist/app/demo.js +5 -4
- package/dist/app/demo.js.map +1 -1
- package/dist/app/main.js +3 -1
- package/dist/app/main.js.map +1 -1
- package/dist/app/standalone.js +5 -4
- package/dist/app/standalone.js.map +1 -1
- package/dist/config/validators/ResolvedSidebarSchema.d.ts +18 -0
- package/dist/config/validators/ResolvedSidebarSchema.js +76 -0
- package/dist/config/validators/ResolvedSidebarSchema.js.map +1 -0
- package/dist/config/validators/SidebarSchema.d.ts +177 -0
- package/dist/config/validators/SidebarSchema.js +71 -0
- package/dist/config/validators/SidebarSchema.js.map +1 -0
- package/dist/config/validators/validate.d.ts +411 -59
- package/dist/config/validators/validate.js +22 -4
- package/dist/config/validators/validate.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/lib/components/DevPortal.js +1 -1
- package/dist/lib/components/DevPortal.js.map +1 -1
- package/dist/lib/components/Header.js +5 -4
- package/dist/lib/components/Header.js.map +1 -1
- package/dist/lib/components/Heading.d.ts +1 -1
- package/dist/lib/components/Layout.js +2 -2
- package/dist/lib/components/Layout.js.map +1 -1
- package/dist/lib/components/TopNavigation.js +5 -5
- package/dist/lib/components/TopNavigation.js.map +1 -1
- package/dist/lib/components/context/DevPortalProvider.d.ts +9 -3
- package/dist/lib/components/context/DevPortalProvider.js +11 -23
- package/dist/lib/components/context/DevPortalProvider.js.map +1 -1
- package/dist/lib/components/context/ThemeContext.d.ts +1 -4
- package/dist/lib/components/context/ThemeContext.js +3 -29
- package/dist/lib/components/context/ThemeContext.js.map +1 -1
- package/dist/lib/components/context/ThemeProvider.d.ts +4 -0
- package/dist/lib/components/context/ThemeProvider.js +23 -0
- package/dist/lib/components/context/ThemeProvider.js.map +1 -0
- package/dist/lib/components/navigation/Sidebar.d.ts +1 -0
- package/dist/lib/components/navigation/Sidebar.js +12 -0
- package/dist/lib/components/navigation/Sidebar.js.map +1 -0
- package/dist/lib/components/navigation/SidebarBadge.d.ts +22 -0
- package/dist/lib/components/navigation/SidebarBadge.js +24 -0
- package/dist/lib/components/navigation/SidebarBadge.js.map +1 -0
- package/dist/lib/components/navigation/SidebarCategory.d.ts +5 -0
- package/dist/lib/components/navigation/SidebarCategory.js +33 -0
- package/dist/lib/components/navigation/SidebarCategory.js.map +1 -0
- package/dist/lib/components/navigation/SidebarItem.d.ts +12 -0
- package/dist/lib/components/navigation/SidebarItem.js +42 -0
- package/dist/lib/components/navigation/SidebarItem.js.map +1 -0
- package/dist/lib/components/navigation/{SideNavigationWrapper.d.ts → SidebarWrapper.d.ts} +1 -1
- package/dist/lib/components/navigation/{SideNavigationWrapper.js → SidebarWrapper.js} +2 -2
- package/dist/lib/components/navigation/SidebarWrapper.js.map +1 -0
- package/dist/lib/components/navigation/utils.d.ts +16 -0
- package/dist/lib/components/navigation/utils.js +85 -0
- package/dist/lib/components/navigation/utils.js.map +1 -0
- package/dist/lib/core/DevPortalContext.d.ts +9 -32
- package/dist/lib/core/DevPortalContext.js +8 -5
- package/dist/lib/core/DevPortalContext.js.map +1 -1
- package/dist/lib/core/plugins.d.ts +6 -8
- package/dist/lib/core/plugins.js.map +1 -1
- package/dist/lib/plugins/markdown/MdxPage.js +5 -36
- package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
- package/dist/lib/plugins/markdown/generateRoutes.js +20 -43
- package/dist/lib/plugins/markdown/generateRoutes.js.map +1 -1
- package/dist/lib/plugins/openapi/OperationListItem.js +4 -3
- package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
- package/dist/lib/plugins/openapi/ParameterList.js +2 -1
- package/dist/lib/plugins/openapi/ParameterList.js.map +1 -1
- package/dist/lib/plugins/openapi/SchemaListView.js +6 -1
- package/dist/lib/plugins/openapi/SchemaListView.js.map +1 -1
- package/dist/lib/plugins/openapi/SchemaListViewItem.d.ts +3 -2
- package/dist/lib/plugins/openapi/SchemaListViewItem.js +6 -3
- package/dist/lib/plugins/openapi/SchemaListViewItem.js.map +1 -1
- package/dist/lib/plugins/openapi/Sidecar.js +12 -2
- package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
- package/dist/lib/plugins/openapi/index.js +14 -11
- package/dist/lib/plugins/openapi/index.js.map +1 -1
- package/dist/lib/plugins/openapi/interfaces.d.ts +1 -1
- package/dist/lib/plugins/openapi/playground/Headers.js +1 -1
- package/dist/lib/plugins/openapi/playground/Headers.js.map +1 -1
- package/dist/lib/plugins/openapi/playground/Playground.js +1 -1
- package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
- package/dist/lib/util/useScrollToAnchor.js +31 -17
- package/dist/lib/util/useScrollToAnchor.js.map +1 -1
- package/dist/vite/plugin-sidebar.d.ts +3 -0
- package/dist/vite/plugin-sidebar.js +23 -0
- package/dist/vite/plugin-sidebar.js.map +1 -0
- package/dist/vite/plugin.js +2 -0
- package/dist/vite/plugin.js.map +1 -1
- package/lib/{AuthenticationPlugin-XS0DoAhE.js → AuthenticationPlugin-DgwV0hVu.js} +7 -7
- package/lib/{AuthenticationPlugin-XS0DoAhE.js.map → AuthenticationPlugin-DgwV0hVu.js.map} +1 -1
- package/lib/{CategoryHeading-DCmchnA1.js → CategoryHeading-BWq12Bfa.js} +3 -3
- package/lib/{CategoryHeading-DCmchnA1.js.map → CategoryHeading-BWq12Bfa.js.map} +1 -1
- package/lib/{Combination-C442XfGG.js → Combination-DkycFHkm.js} +4 -4
- package/lib/{Combination-C442XfGG.js.map → Combination-DkycFHkm.js.map} +1 -1
- package/lib/{DevPortalProvider-BWeAysxF.js → DevPortalProvider-CTxoCHIT.js} +375 -417
- package/lib/DevPortalProvider-CTxoCHIT.js.map +1 -0
- package/lib/DeveloperHint-BQSFXH01.js +10 -0
- package/lib/{DeveloperHint-DQVwIery.js.map → DeveloperHint-BQSFXH01.js.map} +1 -1
- package/lib/{Input-3IEt27jb.js → Input-BclXSY0g.js} +5 -5
- package/lib/{Input-3IEt27jb.js.map → Input-BclXSY0g.js.map} +1 -1
- package/lib/{Markdown-QsZ-PHET.js → Markdown-B_Gax7at.js} +1136 -1152
- package/lib/{Markdown-QsZ-PHET.js.map → Markdown-B_Gax7at.js.map} +1 -1
- package/lib/{MdxPage-CA1WmW14.js → MdxPage-Crlr0GmN.js} +67 -81
- package/lib/MdxPage-Crlr0GmN.js.map +1 -0
- package/lib/{OperationList-CHK_erYP.js → OperationList-CMH3DPpj.js} +145 -129
- package/lib/OperationList-CMH3DPpj.js.map +1 -0
- package/lib/Route-CwXfyIUw.js +14 -0
- package/lib/{Route-D70pGn9n.js.map → Route-CwXfyIUw.js.map} +1 -1
- package/lib/{SlotletProvider-B71hNEUL.js → SlotletProvider-CzMAO73_.js} +12 -12
- package/lib/{SlotletProvider-B71hNEUL.js.map → SlotletProvider-CzMAO73_.js.map} +1 -1
- package/lib/Spinner-fF-Xv-gw.js +274 -0
- package/lib/Spinner-fF-Xv-gw.js.map +1 -0
- package/lib/index-7kcHaXD6.js +1771 -0
- package/lib/index-7kcHaXD6.js.map +1 -0
- package/lib/{index-Bl6YeerK.js → index-DUrF63A6.js} +1028 -1044
- package/lib/index-DUrF63A6.js.map +1 -0
- package/lib/{index-BH-Ub36F.js → index-DkuZvRNP.js} +4 -4
- package/lib/{index-BH-Ub36F.js.map → index-DkuZvRNP.js.map} +1 -1
- package/lib/joinPath-VeNuJa7y.js +8 -0
- package/lib/joinPath-VeNuJa7y.js.map +1 -0
- package/lib/jsx-runtime-B6kdoens.js +635 -0
- package/lib/jsx-runtime-B6kdoens.js.map +1 -0
- package/lib/{AnchorLink-BZcpTwOs.js → utils-CzT_9Tsn.js} +258 -214
- package/lib/utils-CzT_9Tsn.js.map +1 -0
- package/lib/zudoku.auth-clerk.js +1 -1
- package/lib/zudoku.auth-openid.js +2 -2
- package/lib/zudoku.components.js +1229 -1227
- package/lib/zudoku.components.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +19 -19
- package/lib/zudoku.plugin-custom-page.js +2 -2
- package/lib/zudoku.plugin-markdown.js +21 -38
- package/lib/zudoku.plugin-markdown.js.map +1 -1
- package/lib/zudoku.plugin-openapi.js +8 -6
- package/lib/zudoku.plugin-openapi.js.map +1 -1
- package/package.json +4 -1
- package/src/app/demo.tsx +5 -4
- package/src/app/main.css +2 -2
- package/src/app/main.tsx +3 -1
- package/src/app/standalone.tsx +5 -4
- package/src/lib/components/DevPortal.tsx +1 -1
- package/src/lib/components/Header.tsx +21 -19
- package/src/lib/components/Layout.tsx +2 -2
- package/src/lib/components/TopNavigation.tsx +5 -5
- package/src/lib/components/context/DevPortalProvider.ts +11 -28
- package/src/lib/components/context/ThemeContext.tsx +3 -41
- package/src/lib/components/context/ThemeProvider.tsx +27 -0
- package/src/lib/components/navigation/{SideNavigation.tsx → Sidebar.tsx} +7 -7
- package/src/lib/components/navigation/SidebarBadge.tsx +40 -0
- package/src/lib/components/navigation/SidebarCategory.tsx +105 -0
- package/src/lib/components/navigation/SidebarItem.tsx +96 -0
- package/src/lib/components/navigation/{SideNavigationWrapper.tsx → SidebarWrapper.tsx} +1 -1
- package/src/lib/components/navigation/utils.ts +120 -0
- package/src/lib/core/DevPortalContext.ts +12 -44
- package/src/lib/core/plugins.ts +6 -13
- package/src/lib/plugins/markdown/MdxPage.tsx +14 -50
- package/src/lib/plugins/markdown/generateRoutes.tsx +29 -57
- package/src/lib/plugins/openapi/OperationListItem.tsx +5 -6
- package/src/lib/plugins/openapi/ParameterList.tsx +13 -10
- package/src/lib/plugins/openapi/SchemaListView.tsx +18 -2
- package/src/lib/plugins/openapi/SchemaListViewItem.tsx +16 -7
- package/src/lib/plugins/openapi/Sidecar.tsx +15 -2
- package/src/lib/plugins/openapi/index.tsx +17 -23
- package/src/lib/plugins/openapi/interfaces.ts +1 -1
- package/src/lib/plugins/openapi/playground/Headers.tsx +1 -1
- package/src/lib/plugins/openapi/playground/Playground.tsx +1 -1
- package/src/lib/util/useScrollToAnchor.ts +39 -18
- package/dist/lib/components/navigation/SideNavigation.d.ts +0 -1
- package/dist/lib/components/navigation/SideNavigation.js +0 -12
- package/dist/lib/components/navigation/SideNavigation.js.map +0 -1
- package/dist/lib/components/navigation/SideNavigationCategory.d.ts +0 -4
- package/dist/lib/components/navigation/SideNavigationCategory.js +0 -26
- package/dist/lib/components/navigation/SideNavigationCategory.js.map +0 -1
- package/dist/lib/components/navigation/SideNavigationItem.d.ts +0 -9
- package/dist/lib/components/navigation/SideNavigationItem.js +0 -44
- package/dist/lib/components/navigation/SideNavigationItem.js.map +0 -1
- package/dist/lib/components/navigation/SideNavigationWrapper.js.map +0 -1
- package/dist/lib/components/navigation/useNavigationCollapsibleState.d.ts +0 -9
- package/dist/lib/components/navigation/useNavigationCollapsibleState.js +0 -28
- package/dist/lib/components/navigation/useNavigationCollapsibleState.js.map +0 -1
- package/dist/lib/components/navigation/util.d.ts +0 -8
- package/dist/lib/components/navigation/util.js +0 -15
- package/dist/lib/components/navigation/util.js.map +0 -1
- package/dist/lib/plugins/openapi/MethodBadge.d.ts +0 -13
- package/dist/lib/plugins/openapi/MethodBadge.js +0 -26
- package/dist/lib/plugins/openapi/MethodBadge.js.map +0 -1
- package/dist/lib/util/traverseNavigation.d.ts +0 -6
- package/dist/lib/util/traverseNavigation.js +0 -30
- package/dist/lib/util/traverseNavigation.js.map +0 -1
- package/lib/AnchorLink-BZcpTwOs.js.map +0 -1
- package/lib/DevPortalProvider-BWeAysxF.js.map +0 -1
- package/lib/DeveloperHint-DQVwIery.js +0 -10
- package/lib/MdxPage-CA1WmW14.js.map +0 -1
- package/lib/OperationList-CHK_erYP.js.map +0 -1
- package/lib/Route-D70pGn9n.js +0 -13
- package/lib/Spinner-Coi7ORUV.js +0 -244
- package/lib/Spinner-Coi7ORUV.js.map +0 -1
- package/lib/index-Bl6YeerK.js.map +0 -1
- package/lib/index-Dt-pU7Vu.js +0 -916
- package/lib/index-Dt-pU7Vu.js.map +0 -1
- package/lib/jsx-runtime-CJBdjYYx.js +0 -1526
- package/lib/jsx-runtime-CJBdjYYx.js.map +0 -1
- package/src/lib/components/navigation/SideNavigationCategory.tsx +0 -72
- package/src/lib/components/navigation/SideNavigationItem.tsx +0 -148
- package/src/lib/components/navigation/useNavigationCollapsibleState.ts +0 -42
- package/src/lib/components/navigation/util.ts +0 -38
- package/src/lib/plugins/openapi/MethodBadge.tsx +0 -36
- package/src/lib/util/traverseNavigation.ts +0 -55
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useTopNavigationItem } from "../../components/context/DevPortalProvider.js";
|
|
3
|
-
import { isPathItem } from "../../components/navigation/util.js";
|
|
4
|
-
import { traverseNavigation } from "../../util/traverseNavigation.js";
|
|
1
|
+
import { type RouteObject } from "react-router-dom";
|
|
5
2
|
|
|
6
3
|
import {
|
|
7
4
|
MarkdownPluginDefaultOptions,
|
|
@@ -11,57 +8,32 @@ import {
|
|
|
11
8
|
export const generateRoutes = (
|
|
12
9
|
markdownFiles: MarkdownPluginOptions["markdownFiles"],
|
|
13
10
|
defaultOptions?: MarkdownPluginDefaultOptions,
|
|
14
|
-
): RouteObject[] =>
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
} satisfies RouteObject;
|
|
45
|
-
},
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
const rootRoutes: RouteObject[] = Array.from(
|
|
49
|
-
new Set(routes.map((route) => route.path.split("/").at(0))),
|
|
50
|
-
).map((dir) => ({
|
|
51
|
-
path: `/${dir}`,
|
|
52
|
-
element: <Redirect />,
|
|
53
|
-
}));
|
|
54
|
-
|
|
55
|
-
return [...routes, ...rootRoutes];
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const Redirect = () => {
|
|
59
|
-
const navItem = useTopNavigationItem();
|
|
60
|
-
|
|
61
|
-
if (!navItem) return null;
|
|
62
|
-
|
|
63
|
-
return traverseNavigation(navItem, (node, fullPath) => {
|
|
64
|
-
if ("children" in node || !isPathItem(node)) return;
|
|
65
|
-
return <Navigate to={fullPath} replace />;
|
|
11
|
+
): RouteObject[] =>
|
|
12
|
+
Object.entries(markdownFiles).flatMap(([file, importPromise]) => {
|
|
13
|
+
// @todo we can pass in the folder name and then filter the markdown files based on that path
|
|
14
|
+
const match = file.match(/pages\/(.*).mdx?$/);
|
|
15
|
+
const path = match?.at(1);
|
|
16
|
+
|
|
17
|
+
if (!path) return [];
|
|
18
|
+
|
|
19
|
+
const pathSegments = path.split("/");
|
|
20
|
+
const isIndexFile = pathSegments.at(-1) === "index";
|
|
21
|
+
const routePath = isIndexFile ? pathSegments.slice(0, -1).join("/") : path;
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
path: routePath,
|
|
25
|
+
lazy: async () => {
|
|
26
|
+
const { MdxPage } = await import("./MdxPage.js");
|
|
27
|
+
const { default: Component, ...props } = await importPromise();
|
|
28
|
+
return {
|
|
29
|
+
element: (
|
|
30
|
+
<MdxPage
|
|
31
|
+
mdxComponent={Component}
|
|
32
|
+
{...props}
|
|
33
|
+
defaultOptions={defaultOptions}
|
|
34
|
+
/>
|
|
35
|
+
),
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
} satisfies RouteObject;
|
|
66
39
|
});
|
|
67
|
-
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Heading } from "../../components/Heading.js";
|
|
2
2
|
import { Markdown } from "../../components/Markdown.js";
|
|
3
|
+
import { Card } from "../../ui/Card.js";
|
|
3
4
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../ui/Tabs.js";
|
|
4
5
|
import { groupBy } from "../../util/groupBy.js";
|
|
5
6
|
import { renderIf } from "../../util/renderIf.js";
|
|
@@ -28,7 +29,7 @@ export const OperationListItem = ({
|
|
|
28
29
|
return (
|
|
29
30
|
<div
|
|
30
31
|
key={operation.operationId}
|
|
31
|
-
className="grid grid-cols-1 lg:grid-cols-[4fr_3fr] gap-8 items-start border-b-2 mb-16 pb-16
|
|
32
|
+
className="grid grid-cols-1 lg:grid-cols-[4fr_3fr] gap-8 items-start border-b-2 mb-16 pb-16"
|
|
32
33
|
>
|
|
33
34
|
<div className="flex flex-col gap-4">
|
|
34
35
|
<Heading level={2} id={operation.slug} registerSidebarAnchor>
|
|
@@ -92,14 +93,12 @@ export const OperationListItem = ({
|
|
|
92
93
|
{renderIf(
|
|
93
94
|
response.content?.find((content) => content.schema),
|
|
94
95
|
(content) => {
|
|
95
|
-
return
|
|
96
|
-
<SchemaListView schema={content.schema} name="" />
|
|
97
|
-
);
|
|
96
|
+
return <SchemaListView schema={content.schema} />;
|
|
98
97
|
},
|
|
99
98
|
) ?? (
|
|
100
|
-
<
|
|
99
|
+
<Card className="font-mono text-sm p-4">
|
|
101
100
|
No response body
|
|
102
|
-
</
|
|
101
|
+
</Card>
|
|
103
102
|
)}
|
|
104
103
|
</TabsContent>
|
|
105
104
|
))}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Heading } from "../../components/Heading.js";
|
|
2
|
+
import { Card } from "../../ui/Card.js";
|
|
2
3
|
import type { ParameterGroup } from "./OperationListItem.js";
|
|
3
4
|
import {
|
|
4
5
|
ParameterListItem,
|
|
@@ -18,15 +19,17 @@ export const ParameterList = ({
|
|
|
18
19
|
<Heading level={3} id={`${id}/${group}-parameters`} className="capitalize">
|
|
19
20
|
{group === "header" ? "Headers" : `${group} Parameters`}
|
|
20
21
|
</Heading>
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
<Card>
|
|
23
|
+
<ul className="list-none m-0 px-0 divide-y ">
|
|
24
|
+
{parameters.map((parameter) => (
|
|
25
|
+
<ParameterListItem
|
|
26
|
+
key={`${parameter.name}-${parameter.in}`}
|
|
27
|
+
parameter={parameter}
|
|
28
|
+
id={id}
|
|
29
|
+
group={group}
|
|
30
|
+
/>
|
|
31
|
+
))}
|
|
32
|
+
</ul>
|
|
33
|
+
</Card>
|
|
31
34
|
</>
|
|
32
35
|
);
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Markdown } from "../../components/Markdown.js";
|
|
2
2
|
import { SchemaObject } from "../../oas/parser/index.js";
|
|
3
|
+
import { Card } from "../../ui/Card.js";
|
|
3
4
|
import { groupBy } from "../../util/groupBy.js";
|
|
4
5
|
import { objectEntries } from "../../util/objectEntries.js";
|
|
6
|
+
import { SchemaListViewItem } from "./SchemaListViewItem.js";
|
|
5
7
|
import { SchemaListViewItemGroup } from "./SchemaListViewItemGroup.js";
|
|
6
8
|
import { SchemaProseClasses } from "./util/prose.js";
|
|
7
9
|
|
|
@@ -34,6 +36,20 @@ export const SchemaListView = ({
|
|
|
34
36
|
: "optional";
|
|
35
37
|
});
|
|
36
38
|
|
|
39
|
+
if (schema.type === "array") {
|
|
40
|
+
return (
|
|
41
|
+
<Card className="overflow-hidden">
|
|
42
|
+
<SchemaListViewItem
|
|
43
|
+
propertyName={schema.title ?? name}
|
|
44
|
+
isRequired={true}
|
|
45
|
+
property={schema}
|
|
46
|
+
defaultOpen={level === 0}
|
|
47
|
+
nestingLevel={level}
|
|
48
|
+
/>
|
|
49
|
+
</Card>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
37
53
|
return (
|
|
38
54
|
<div className="flex flex-col gap-2.5">
|
|
39
55
|
{(schema.title ?? name) && (
|
|
@@ -42,7 +58,7 @@ export const SchemaListView = ({
|
|
|
42
58
|
{level === 0 && schema.description && (
|
|
43
59
|
<Markdown className={SchemaProseClasses} content={schema.description} />
|
|
44
60
|
)}
|
|
45
|
-
<
|
|
61
|
+
<Card className="overflow-hidden">
|
|
46
62
|
{objectEntries(groups).map(([group, properties]) => (
|
|
47
63
|
<SchemaListViewItemGroup
|
|
48
64
|
key={group}
|
|
@@ -53,7 +69,7 @@ export const SchemaListView = ({
|
|
|
53
69
|
required={schema.required ?? []}
|
|
54
70
|
/>
|
|
55
71
|
))}
|
|
56
|
-
</
|
|
72
|
+
</Card>
|
|
57
73
|
</div>
|
|
58
74
|
);
|
|
59
75
|
};
|
|
@@ -11,27 +11,32 @@ export const SchemaListViewItem = ({
|
|
|
11
11
|
property,
|
|
12
12
|
nestingLevel,
|
|
13
13
|
isRequired,
|
|
14
|
+
defaultOpen = false,
|
|
14
15
|
}: {
|
|
15
|
-
propertyName
|
|
16
|
+
propertyName?: string;
|
|
16
17
|
isRequired: boolean;
|
|
17
18
|
property: SchemaObject;
|
|
18
19
|
nestingLevel: number;
|
|
20
|
+
defaultOpen?: boolean;
|
|
19
21
|
}) => {
|
|
20
22
|
if (!property) {
|
|
21
23
|
return <div>no property</div>;
|
|
22
24
|
}
|
|
25
|
+
|
|
26
|
+
const title =
|
|
27
|
+
propertyName || property.title
|
|
28
|
+
? [propertyName, property.title].filter(Boolean).join(" ")
|
|
29
|
+
: null;
|
|
30
|
+
|
|
23
31
|
return (
|
|
24
32
|
<div
|
|
25
|
-
key={propertyName}
|
|
26
33
|
className={cn(
|
|
27
34
|
"p-4 bg-border/20 hover:bg-border/30 flex gap-1 flex-col text-sm",
|
|
28
35
|
property.deprecated && "opacity-50",
|
|
29
36
|
)}
|
|
30
37
|
>
|
|
31
38
|
<div className="flex items-center gap-2 relative">
|
|
32
|
-
<code>
|
|
33
|
-
{propertyName} {property.title}
|
|
34
|
-
</code>
|
|
39
|
+
{title && <code>{title}</code>}
|
|
35
40
|
|
|
36
41
|
{property.type && (
|
|
37
42
|
<span className="text-muted-foreground">{property.type}</span>
|
|
@@ -81,9 +86,13 @@ export const SchemaListViewItem = ({
|
|
|
81
86
|
// this check is needed because the `items` can be undefined despite the type being defined
|
|
82
87
|
typeof property.items !== "undefined" &&
|
|
83
88
|
property.items.type === "object") ? (
|
|
84
|
-
<Collapsible.Root className="CollapsibleRoot" defaultOpen={
|
|
89
|
+
<Collapsible.Root className="CollapsibleRoot" defaultOpen={defaultOpen}>
|
|
85
90
|
<Collapsible.Trigger asChild>
|
|
86
|
-
<Button
|
|
91
|
+
<Button
|
|
92
|
+
variant="ghost"
|
|
93
|
+
size="sm"
|
|
94
|
+
className={cn(defaultOpen && "hidden")}
|
|
95
|
+
>
|
|
87
96
|
Show nested fields
|
|
88
97
|
<ListPlusIcon size={18} className="ml-1.5" />
|
|
89
98
|
</Button>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { HTTPSnippet } from "@zudoku/httpsnippet";
|
|
2
2
|
import { Fragment, useMemo, useTransition } from "react";
|
|
3
3
|
import { useSearchParams } from "react-router-dom";
|
|
4
|
+
import { TextColorMap } from "../../components/navigation/SidebarBadge.js";
|
|
4
5
|
import { SyntaxHighlight } from "../../components/SyntaxHighlight.js";
|
|
5
6
|
import type { SchemaObject } from "../../oas/parser/index.js";
|
|
6
7
|
import { cn } from "../../util/cn.js";
|
|
7
8
|
import { ColorizedParam } from "./ColorizedParam.js";
|
|
8
9
|
import { useOasConfig } from "./context.js";
|
|
9
10
|
import { graphql } from "./graphql/index.js";
|
|
10
|
-
import { MethodTextColorMap } from "./MethodBadge.js";
|
|
11
11
|
import type { OperationListItemResult } from "./OperationList.js";
|
|
12
12
|
import { PlaygroundDialogWrapper } from "./PlaygroundDialogWrapper.js";
|
|
13
13
|
import { RequestBodySidecarBox } from "./RequestBodySidecarBox.js";
|
|
@@ -71,6 +71,17 @@ export const GetServerQuery = graphql(/* GraphQL */ `
|
|
|
71
71
|
|
|
72
72
|
const context = { suspense: true };
|
|
73
73
|
|
|
74
|
+
const methodToColor = {
|
|
75
|
+
get: TextColorMap.green,
|
|
76
|
+
post: TextColorMap.blue,
|
|
77
|
+
put: TextColorMap.yellow,
|
|
78
|
+
delete: TextColorMap.red,
|
|
79
|
+
patch: TextColorMap.purple,
|
|
80
|
+
options: TextColorMap.indigo,
|
|
81
|
+
head: TextColorMap.gray,
|
|
82
|
+
trace: TextColorMap.gray,
|
|
83
|
+
};
|
|
84
|
+
|
|
74
85
|
export const Sidecar = ({
|
|
75
86
|
operation,
|
|
76
87
|
}: {
|
|
@@ -83,7 +94,9 @@ export const Sidecar = ({
|
|
|
83
94
|
context,
|
|
84
95
|
});
|
|
85
96
|
const methodTextColor =
|
|
86
|
-
|
|
97
|
+
methodToColor[
|
|
98
|
+
operation.method.toLocaleLowerCase() as keyof typeof methodToColor
|
|
99
|
+
] ?? TextColorMap.gray;
|
|
87
100
|
|
|
88
101
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
89
102
|
const [, startTransition] = useTransition();
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { matchPath, useRouteError, type RouteObject } from "react-router-dom";
|
|
2
|
-
import {
|
|
3
|
-
type DevPortalPlugin,
|
|
4
|
-
type PluginNavigationCategory,
|
|
5
|
-
} from "../../core/plugins.js";
|
|
2
|
+
import { type DevPortalPlugin } from "../../core/plugins.js";
|
|
6
3
|
import { graphql } from "./graphql/index.js";
|
|
7
|
-
import { MethodBadge } from "./MethodBadge.js";
|
|
8
4
|
import {
|
|
9
5
|
Client as UrqlClient,
|
|
10
6
|
cacheExchange,
|
|
@@ -14,10 +10,12 @@ import {
|
|
|
14
10
|
import { useQuery } from "@tanstack/react-query";
|
|
15
11
|
import { CirclePlayIcon, LogInIcon } from "lucide-react";
|
|
16
12
|
import { createClient } from "zudoku/openapi-worker";
|
|
13
|
+
import type { ResolvedSidebarItem } from "../../../config/validators/ResolvedSidebarSchema.js";
|
|
17
14
|
import { useAuth } from "../../authentication/hook.js";
|
|
18
15
|
import { ErrorPage } from "../../components/ErrorPage.js";
|
|
19
16
|
import { SyntaxHighlight } from "../../components/SyntaxHighlight.js";
|
|
20
17
|
import { Button } from "../../ui/Button.js";
|
|
18
|
+
import { joinPath } from "../../util/joinPath.js";
|
|
21
19
|
import { OasPluginConfig } from "./interfaces.js";
|
|
22
20
|
import type { PlaygroundContentProps } from "./playground/Playground.js";
|
|
23
21
|
import { PlaygroundDialog } from "./playground/PlaygroundDialog.js";
|
|
@@ -62,7 +60,7 @@ type InternalOasPluginConfig = { inMemory?: boolean };
|
|
|
62
60
|
export const openApiPlugin = (
|
|
63
61
|
config: OasPluginConfig & InternalOasPluginConfig,
|
|
64
62
|
): DevPortalPlugin => {
|
|
65
|
-
const basePath = config.
|
|
63
|
+
const basePath = joinPath(config.navigationId ?? "/reference");
|
|
66
64
|
|
|
67
65
|
const client = config.server
|
|
68
66
|
? new UrqlClient({
|
|
@@ -152,30 +150,26 @@ export const openApiPlugin = (
|
|
|
152
150
|
|
|
153
151
|
const categories = data.schema.tags
|
|
154
152
|
.filter((tag) => tag.operations.length > 0)
|
|
155
|
-
.map<
|
|
156
|
-
|
|
153
|
+
.map<ResolvedSidebarItem>((tag) => ({
|
|
154
|
+
type: "category",
|
|
157
155
|
label: tag.name ?? "",
|
|
158
156
|
collapsible: false,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
<MethodBadge method={operation.method} />
|
|
169
|
-
</div>
|
|
170
|
-
),
|
|
157
|
+
collapsed: false,
|
|
158
|
+
items: tag.operations.map((operation) => ({
|
|
159
|
+
type: "link",
|
|
160
|
+
label: operation.summary ?? operation.path,
|
|
161
|
+
href: `#${operation.slug}`,
|
|
162
|
+
badge: {
|
|
163
|
+
label: operation.method,
|
|
164
|
+
color: "green",
|
|
165
|
+
},
|
|
171
166
|
})),
|
|
172
167
|
}));
|
|
173
168
|
|
|
174
169
|
categories.unshift({
|
|
175
|
-
|
|
170
|
+
type: "link",
|
|
176
171
|
label: "Overview",
|
|
177
|
-
|
|
178
|
-
children: [{ path: "#description", label: "Description" }],
|
|
172
|
+
href: "#description",
|
|
179
173
|
});
|
|
180
174
|
|
|
181
175
|
return categories;
|
|
@@ -215,7 +215,7 @@ export const Playground = ({
|
|
|
215
215
|
<div className="grid grid-cols-2 text-sm h-full">
|
|
216
216
|
<div className="flex flex-col gap-4 p-8 bg-muted/50 after:bg-muted-foreground/20 relative after:absolute after:w-px after:inset-0 after:left-auto">
|
|
217
217
|
<div className="flex gap-2 items-stretch">
|
|
218
|
-
<div className="flex flex-1 items-center w-full border rounded-md
|
|
218
|
+
<div className="flex flex-1 items-center w-full border rounded-md">
|
|
219
219
|
<div className="border-r p-2 bg-muted rounded-l-md self-stretch font-semibold font-mono">
|
|
220
220
|
{method.toUpperCase()}
|
|
221
221
|
</div>
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
import { useEffect } from "react";
|
|
2
2
|
import { useLocation } from "react-router-dom";
|
|
3
3
|
import { useViewportAnchor } from "../components/context/ViewportAnchorContext.js";
|
|
4
|
+
import { DATA_ANCHOR_ATTR } from "../components/navigation/SidebarItem.js";
|
|
5
|
+
|
|
6
|
+
const scrollIntoViewIfNeeded = (
|
|
7
|
+
element: Element | null,
|
|
8
|
+
options: ScrollIntoViewOptions = { block: "center" },
|
|
9
|
+
) => {
|
|
10
|
+
if (!element) return;
|
|
11
|
+
|
|
12
|
+
const rect = element.getBoundingClientRect();
|
|
13
|
+
const isInView =
|
|
14
|
+
rect.top >= 0 &&
|
|
15
|
+
rect.left >= 0 &&
|
|
16
|
+
rect.bottom <=
|
|
17
|
+
(window.innerHeight || document.documentElement.clientHeight) &&
|
|
18
|
+
rect.right <= (window.innerWidth || document.documentElement.clientWidth);
|
|
19
|
+
|
|
20
|
+
if (isInView) return;
|
|
21
|
+
|
|
22
|
+
element.scrollIntoView(options);
|
|
23
|
+
};
|
|
4
24
|
|
|
5
25
|
export const useScrollToAnchor = () => {
|
|
6
26
|
const location = useLocation();
|
|
@@ -9,30 +29,31 @@ export const useScrollToAnchor = () => {
|
|
|
9
29
|
useEffect(() => {
|
|
10
30
|
if (!location.hash) return;
|
|
11
31
|
|
|
12
|
-
const hash = location.hash.split("/")[0].slice(1);
|
|
32
|
+
const hash = decodeURIComponent(location.hash.split("/")[0].slice(1));
|
|
13
33
|
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
34
|
+
const scrollToElement = () => {
|
|
35
|
+
const element = document.getElementById(hash);
|
|
36
|
+
const link = document.querySelector(`[${DATA_ANCHOR_ATTR}="${hash}"]`);
|
|
37
|
+
|
|
38
|
+
if (element) {
|
|
18
39
|
element.scrollIntoView();
|
|
40
|
+
scrollIntoViewIfNeeded(link);
|
|
19
41
|
requestIdleCallback(() => setActiveAnchor(hash));
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
23
44
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const element = document.getElementById(decodeURIComponent(hash));
|
|
27
|
-
if (!element) return;
|
|
45
|
+
return false;
|
|
46
|
+
};
|
|
28
47
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
48
|
+
if (!scrollToElement()) {
|
|
49
|
+
const observer = new MutationObserver((_, obs) => {
|
|
50
|
+
if (!scrollToElement()) return;
|
|
51
|
+
obs.disconnect();
|
|
52
|
+
});
|
|
33
53
|
|
|
34
|
-
|
|
54
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
35
55
|
|
|
36
|
-
|
|
56
|
+
return () => observer.disconnect();
|
|
57
|
+
}
|
|
37
58
|
}, [location.hash, setActiveAnchor]);
|
|
38
59
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const SideNavigation: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useRef } from "react";
|
|
3
|
-
import { useNavigation } from "../context/DevPortalProvider.js";
|
|
4
|
-
import { Slotlet } from "../SlotletProvider.js";
|
|
5
|
-
import { SideNavigationCategory } from "./SideNavigationCategory.js";
|
|
6
|
-
import { SideNavigationWrapper } from "./SideNavigationWrapper.js";
|
|
7
|
-
export const SideNavigation = () => {
|
|
8
|
-
const navRef = useRef(null);
|
|
9
|
-
const navigation = useNavigation();
|
|
10
|
-
return (_jsxs(SideNavigationWrapper, { ref: navRef, pushMainContent: navigation.data.items.length > 0, children: [_jsx(Slotlet, { name: "zudoku-before-navigation" }), navigation.data.items.map((category) => (_jsx(SideNavigationCategory, { category: category }, category.label))), _jsx(Slotlet, { name: "zudoku-after-navigation" })] }));
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=SideNavigation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SideNavigation.js","sourceRoot":"","sources":["../../../../src/lib/components/navigation/SideNavigation.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,MAAM,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,OAAO,CACL,MAAC,qBAAqB,IACpB,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,aAEjD,KAAC,OAAO,IAAC,IAAI,EAAC,0BAA0B,GAAG,EAC1C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACvC,KAAC,sBAAsB,IAAsB,QAAQ,EAAE,QAAQ,IAAlC,QAAQ,CAAC,KAAK,CAAwB,CACpE,CAAC,EACF,KAAC,OAAO,IAAC,IAAI,EAAC,yBAAyB,GAAG,IACpB,CACzB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import * as Collapsible from "@radix-ui/react-collapsible";
|
|
3
|
-
import { ChevronRightIcon } from "lucide-react";
|
|
4
|
-
import { useLocation } from "react-router-dom";
|
|
5
|
-
import { cn } from "../../util/cn.js";
|
|
6
|
-
import { joinPath } from "../../util/joinPath.js";
|
|
7
|
-
import { useTopNavigationItem } from "../context/DevPortalProvider.js";
|
|
8
|
-
import { useViewportAnchor } from "../context/ViewportAnchorContext.js";
|
|
9
|
-
import { SideNavigationItem } from "./SideNavigationItem.js";
|
|
10
|
-
import { useNavigationCollapsibleState } from "./useNavigationCollapsibleState.js";
|
|
11
|
-
import { checkHasActiveItem } from "./util.js";
|
|
12
|
-
export const SideNavigationCategory = ({ category, }) => {
|
|
13
|
-
const { activeAnchor } = useViewportAnchor();
|
|
14
|
-
const navItem = useTopNavigationItem();
|
|
15
|
-
const location = useLocation();
|
|
16
|
-
const isCollapsible = category.collapsible ?? true;
|
|
17
|
-
const collapsibleProps = useNavigationCollapsibleState({
|
|
18
|
-
item: category,
|
|
19
|
-
path: navItem?.path ?? "",
|
|
20
|
-
defaultOpen: () => !isCollapsible ||
|
|
21
|
-
category.expanded ||
|
|
22
|
-
checkHasActiveItem(category, location.pathname, navItem?.path ?? ""),
|
|
23
|
-
});
|
|
24
|
-
return (_jsxs(Collapsible.Root, { ...collapsibleProps, children: [category.label.length > 0 ? (_jsx(Collapsible.Trigger, { asChild: isCollapsible, disabled: !isCollapsible, children: _jsxs("h5", { className: cn("flex group items-center justify-between cursor-pointer font-semibold text-foreground/90 px-[--padding-nav-item] py-1.5 rounded-lg transition-colors duration-300 -mx-[--padding-nav-item]", isCollapsible ? "hover:bg-accent" : "cursor-auto"), children: [category.label, isCollapsible && (_jsx(ChevronRightIcon, { className: "group-data-[state=open]:rotate-90 transition", size: 16 }))] }) })) : ("Endpoints"), _jsx(Collapsible.Content, { className: "CollapsibleContent -mx-[--padding-nav-item]", children: _jsx("ul", { className: "space-y-0.5 mt-1.5 mb-4 ms-3", children: category.children.map((item, i) => (_jsx(SideNavigationItem, { category: category, item: item, activeAnchor: activeAnchor, currentTopNavItem: navItem, basePath: joinPath(navItem?.path, category.path) }, i))) }) })] }, category.label));
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=SideNavigationCategory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SideNavigationCategory.js","sourceRoot":"","sources":["../../../../src/lib/components/navigation/SideNavigationCategory.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,QAAQ,GAGT,EAAE,EAAE;IACH,MAAM,EAAE,YAAY,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC;IAEnD,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;QACrD,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE;QACzB,WAAW,EAAE,GAAG,EAAE,CAChB,CAAC,aAAa;YACd,QAAQ,CAAC,QAAQ;YACjB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;KACvE,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,WAAW,CAAC,IAAI,OAA0B,gBAAgB,aACxD,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC3B,KAAC,WAAW,CAAC,OAAO,IAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,aAAa,YACnE,cACE,SAAS,EAAE,EAAE,CACX,2LAA2L,EAC3L,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAClD,aAEA,QAAQ,CAAC,KAAK,EACd,aAAa,IAAI,CAChB,KAAC,gBAAgB,IACf,SAAS,EAAC,8CAA8C,EACxD,IAAI,EAAE,EAAE,GACR,CACH,IACE,GACe,CACvB,CAAC,CAAC,CAAC,CACF,WAAW,CACZ,EACD,KAAC,WAAW,CAAC,OAAO,IAAC,SAAS,EAAC,6CAA6C,YAE1E,aAAI,SAAS,EAAC,8BAA8B,YACzC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAClC,KAAC,kBAAkB,IAEjB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,OAAO,EAC1B,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAL3C,CAAC,CAMN,CACH,CAAC,GACC,GACe,KAnCD,QAAQ,CAAC,KAAK,CAoClB,CACpB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { NavigationCategory, NavigationCategoryItem, NavigationItem } from "../../core/DevPortalContext.js";
|
|
2
|
-
export declare const DATA_ANCHOR_ATTR = "data-anchor";
|
|
3
|
-
export declare const SideNavigationItem: ({ category, item, activeAnchor, currentTopNavItem, basePath, }: {
|
|
4
|
-
category: NavigationCategory;
|
|
5
|
-
item: NavigationCategoryItem;
|
|
6
|
-
activeAnchor?: string;
|
|
7
|
-
currentTopNavItem?: NavigationItem;
|
|
8
|
-
basePath?: string;
|
|
9
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import * as Collapsible from "@radix-ui/react-collapsible";
|
|
3
|
-
import { cva } from "class-variance-authority";
|
|
4
|
-
import { ChevronRightIcon, ExternalLinkIcon } from "lucide-react";
|
|
5
|
-
import { NavLink, useLocation } from "react-router-dom";
|
|
6
|
-
import { cn } from "../../util/cn.js";
|
|
7
|
-
import { joinPath } from "../../util/joinPath.js";
|
|
8
|
-
import { AnchorLink } from "../AnchorLink.js";
|
|
9
|
-
import { useNavigationCollapsibleState } from "./useNavigationCollapsibleState.js";
|
|
10
|
-
import { checkHasActiveItem, isLinkItem, isPathItem } from "./util.js";
|
|
11
|
-
const navigationListItem = cva("flex px-[--padding-nav-item] py-1.5 rounded-lg hover:bg-accent transition-colors duration-300", {
|
|
12
|
-
variants: {
|
|
13
|
-
isActive: {
|
|
14
|
-
true: "text-primary font-medium",
|
|
15
|
-
false: "text-foreground/80",
|
|
16
|
-
},
|
|
17
|
-
isMuted: {
|
|
18
|
-
true: "text-foreground/30",
|
|
19
|
-
false: "",
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
export const DATA_ANCHOR_ATTR = "data-anchor";
|
|
24
|
-
export const SideNavigationItem = ({ category, item, activeAnchor, currentTopNavItem, basePath = "", }) => {
|
|
25
|
-
const currentPath = isPathItem(item) ? joinPath(basePath, item.path) : "";
|
|
26
|
-
const location = useLocation();
|
|
27
|
-
const collapsibleProps = useNavigationCollapsibleState({
|
|
28
|
-
item,
|
|
29
|
-
path: currentPath,
|
|
30
|
-
defaultOpen: () => checkHasActiveItem(item, location.pathname, basePath),
|
|
31
|
-
});
|
|
32
|
-
if (isLinkItem(item)) {
|
|
33
|
-
const classes = cn("flex items-center gap-2", navigationListItem({
|
|
34
|
-
isActive: item.href === location.pathname,
|
|
35
|
-
}));
|
|
36
|
-
return item.href.startsWith("http") ? (_jsxs("a", { className: classes, href: item.href, target: "_blank", rel: "noopener noreferrer", children: [item.label, _jsx(ExternalLinkIcon, { size: 14 })] })) : (_jsx(NavLink, { className: classes, to: item.href, children: item.label }));
|
|
37
|
-
}
|
|
38
|
-
const linkContent = (_jsxs("div", { className: "flex justify-between w-full", children: [_jsxs("div", { className: "flex items-center gap-2 truncate w-full", children: [item.icon, typeof item.label !== "string" ? (item.label) : (_jsx("span", { className: "truncate", children: item.label }))] }), item.children && (_jsx(ChevronRightIcon, { size: 16, className: "transition shrink-0 group-data-[state=open]:rotate-90" }))] }));
|
|
39
|
-
return (_jsx("li", { title: typeof item.label === "string" ? item.label : item.title, children: item.children ? (_jsxs(Collapsible.Root, { ...collapsibleProps, className: "flex flex-col", children: [_jsx(Collapsible.Trigger, { className: cn("group text-start", navigationListItem({ isActive: false })), children: linkContent }), _jsx(Collapsible.Content, { className: "CollapsibleContent ms-[calc(var(--padding-nav-item)*1.125)]", children: _jsx("ul", { className: "mt-1 border-l ps-1.5", children: item.children.map((child) => (_jsx(SideNavigationItem, { category: category, item: child, activeAnchor: activeAnchor, currentTopNavItem: currentTopNavItem, basePath: currentPath }, isPathItem(child) ? child.path : child.href))) }) })] })) : item.path.startsWith("#") ? (_jsx(AnchorLink, { to: item.path, [DATA_ANCHOR_ATTR]: item.path, className: navigationListItem({
|
|
40
|
-
isActive: item.path.slice(1) === activeAnchor,
|
|
41
|
-
isMuted: item.muted,
|
|
42
|
-
}), children: linkContent })) : (_jsx(NavLink, { className: ({ isActive }) => navigationListItem({ isActive }), to: currentPath, children: linkContent })) }));
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=SideNavigationItem.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SideNavigationItem.js","sourceRoot":"","sources":["../../../../src/lib/components/navigation/SideNavigationItem.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SideNavigationWrapper.js","sourceRoot":"","sources":["../../../../src/lib/components/navigation/SideNavigationWrapper.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA0B,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAG7C,SAAS,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,GAAG;IACrE,OAAO,CACL,iCAKmB,MAAM,CAAC,eAAe,CAAC,EACxC,SAAS,EAAE,EAAE,CACX,iOAAiO,EACjO,SAAS,CACV,EACD,GAAG,EAAE,GAAG,YAEP,QAAQ,GACL,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { CollapsibleProps } from "@radix-ui/react-collapsible";
|
|
2
|
-
import type { NavigationNode } from "../../util/traverseNavigation.js";
|
|
3
|
-
export declare const useNavigationCollapsibleState: ({ item, defaultOpen, path, }: {
|
|
4
|
-
item: NavigationNode;
|
|
5
|
-
defaultOpen: () => boolean;
|
|
6
|
-
path: string;
|
|
7
|
-
}) => Partial<CollapsibleProps> & {
|
|
8
|
-
"data-animate": boolean;
|
|
9
|
-
};
|