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.
Files changed (206) hide show
  1. package/cli.js +5 -1
  2. package/dist/app/demo.js +5 -4
  3. package/dist/app/demo.js.map +1 -1
  4. package/dist/app/main.js +3 -1
  5. package/dist/app/main.js.map +1 -1
  6. package/dist/app/standalone.js +5 -4
  7. package/dist/app/standalone.js.map +1 -1
  8. package/dist/config/validators/ResolvedSidebarSchema.d.ts +18 -0
  9. package/dist/config/validators/ResolvedSidebarSchema.js +76 -0
  10. package/dist/config/validators/ResolvedSidebarSchema.js.map +1 -0
  11. package/dist/config/validators/SidebarSchema.d.ts +177 -0
  12. package/dist/config/validators/SidebarSchema.js +71 -0
  13. package/dist/config/validators/SidebarSchema.js.map +1 -0
  14. package/dist/config/validators/validate.d.ts +411 -59
  15. package/dist/config/validators/validate.js +22 -4
  16. package/dist/config/validators/validate.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/lib/components/DevPortal.js +1 -1
  19. package/dist/lib/components/DevPortal.js.map +1 -1
  20. package/dist/lib/components/Header.js +5 -4
  21. package/dist/lib/components/Header.js.map +1 -1
  22. package/dist/lib/components/Heading.d.ts +1 -1
  23. package/dist/lib/components/Layout.js +2 -2
  24. package/dist/lib/components/Layout.js.map +1 -1
  25. package/dist/lib/components/TopNavigation.js +5 -5
  26. package/dist/lib/components/TopNavigation.js.map +1 -1
  27. package/dist/lib/components/context/DevPortalProvider.d.ts +9 -3
  28. package/dist/lib/components/context/DevPortalProvider.js +11 -23
  29. package/dist/lib/components/context/DevPortalProvider.js.map +1 -1
  30. package/dist/lib/components/context/ThemeContext.d.ts +1 -4
  31. package/dist/lib/components/context/ThemeContext.js +3 -29
  32. package/dist/lib/components/context/ThemeContext.js.map +1 -1
  33. package/dist/lib/components/context/ThemeProvider.d.ts +4 -0
  34. package/dist/lib/components/context/ThemeProvider.js +23 -0
  35. package/dist/lib/components/context/ThemeProvider.js.map +1 -0
  36. package/dist/lib/components/navigation/Sidebar.d.ts +1 -0
  37. package/dist/lib/components/navigation/Sidebar.js +12 -0
  38. package/dist/lib/components/navigation/Sidebar.js.map +1 -0
  39. package/dist/lib/components/navigation/SidebarBadge.d.ts +22 -0
  40. package/dist/lib/components/navigation/SidebarBadge.js +24 -0
  41. package/dist/lib/components/navigation/SidebarBadge.js.map +1 -0
  42. package/dist/lib/components/navigation/SidebarCategory.d.ts +5 -0
  43. package/dist/lib/components/navigation/SidebarCategory.js +33 -0
  44. package/dist/lib/components/navigation/SidebarCategory.js.map +1 -0
  45. package/dist/lib/components/navigation/SidebarItem.d.ts +12 -0
  46. package/dist/lib/components/navigation/SidebarItem.js +42 -0
  47. package/dist/lib/components/navigation/SidebarItem.js.map +1 -0
  48. package/dist/lib/components/navigation/{SideNavigationWrapper.d.ts → SidebarWrapper.d.ts} +1 -1
  49. package/dist/lib/components/navigation/{SideNavigationWrapper.js → SidebarWrapper.js} +2 -2
  50. package/dist/lib/components/navigation/SidebarWrapper.js.map +1 -0
  51. package/dist/lib/components/navigation/utils.d.ts +16 -0
  52. package/dist/lib/components/navigation/utils.js +85 -0
  53. package/dist/lib/components/navigation/utils.js.map +1 -0
  54. package/dist/lib/core/DevPortalContext.d.ts +9 -32
  55. package/dist/lib/core/DevPortalContext.js +8 -5
  56. package/dist/lib/core/DevPortalContext.js.map +1 -1
  57. package/dist/lib/core/plugins.d.ts +6 -8
  58. package/dist/lib/core/plugins.js.map +1 -1
  59. package/dist/lib/plugins/markdown/MdxPage.js +5 -36
  60. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  61. package/dist/lib/plugins/markdown/generateRoutes.js +20 -43
  62. package/dist/lib/plugins/markdown/generateRoutes.js.map +1 -1
  63. package/dist/lib/plugins/openapi/OperationListItem.js +4 -3
  64. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  65. package/dist/lib/plugins/openapi/ParameterList.js +2 -1
  66. package/dist/lib/plugins/openapi/ParameterList.js.map +1 -1
  67. package/dist/lib/plugins/openapi/SchemaListView.js +6 -1
  68. package/dist/lib/plugins/openapi/SchemaListView.js.map +1 -1
  69. package/dist/lib/plugins/openapi/SchemaListViewItem.d.ts +3 -2
  70. package/dist/lib/plugins/openapi/SchemaListViewItem.js +6 -3
  71. package/dist/lib/plugins/openapi/SchemaListViewItem.js.map +1 -1
  72. package/dist/lib/plugins/openapi/Sidecar.js +12 -2
  73. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  74. package/dist/lib/plugins/openapi/index.js +14 -11
  75. package/dist/lib/plugins/openapi/index.js.map +1 -1
  76. package/dist/lib/plugins/openapi/interfaces.d.ts +1 -1
  77. package/dist/lib/plugins/openapi/playground/Headers.js +1 -1
  78. package/dist/lib/plugins/openapi/playground/Headers.js.map +1 -1
  79. package/dist/lib/plugins/openapi/playground/Playground.js +1 -1
  80. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  81. package/dist/lib/util/useScrollToAnchor.js +31 -17
  82. package/dist/lib/util/useScrollToAnchor.js.map +1 -1
  83. package/dist/vite/plugin-sidebar.d.ts +3 -0
  84. package/dist/vite/plugin-sidebar.js +23 -0
  85. package/dist/vite/plugin-sidebar.js.map +1 -0
  86. package/dist/vite/plugin.js +2 -0
  87. package/dist/vite/plugin.js.map +1 -1
  88. package/lib/{AuthenticationPlugin-XS0DoAhE.js → AuthenticationPlugin-DgwV0hVu.js} +7 -7
  89. package/lib/{AuthenticationPlugin-XS0DoAhE.js.map → AuthenticationPlugin-DgwV0hVu.js.map} +1 -1
  90. package/lib/{CategoryHeading-DCmchnA1.js → CategoryHeading-BWq12Bfa.js} +3 -3
  91. package/lib/{CategoryHeading-DCmchnA1.js.map → CategoryHeading-BWq12Bfa.js.map} +1 -1
  92. package/lib/{Combination-C442XfGG.js → Combination-DkycFHkm.js} +4 -4
  93. package/lib/{Combination-C442XfGG.js.map → Combination-DkycFHkm.js.map} +1 -1
  94. package/lib/{DevPortalProvider-BWeAysxF.js → DevPortalProvider-CTxoCHIT.js} +375 -417
  95. package/lib/DevPortalProvider-CTxoCHIT.js.map +1 -0
  96. package/lib/DeveloperHint-BQSFXH01.js +10 -0
  97. package/lib/{DeveloperHint-DQVwIery.js.map → DeveloperHint-BQSFXH01.js.map} +1 -1
  98. package/lib/{Input-3IEt27jb.js → Input-BclXSY0g.js} +5 -5
  99. package/lib/{Input-3IEt27jb.js.map → Input-BclXSY0g.js.map} +1 -1
  100. package/lib/{Markdown-QsZ-PHET.js → Markdown-B_Gax7at.js} +1136 -1152
  101. package/lib/{Markdown-QsZ-PHET.js.map → Markdown-B_Gax7at.js.map} +1 -1
  102. package/lib/{MdxPage-CA1WmW14.js → MdxPage-Crlr0GmN.js} +67 -81
  103. package/lib/MdxPage-Crlr0GmN.js.map +1 -0
  104. package/lib/{OperationList-CHK_erYP.js → OperationList-CMH3DPpj.js} +145 -129
  105. package/lib/OperationList-CMH3DPpj.js.map +1 -0
  106. package/lib/Route-CwXfyIUw.js +14 -0
  107. package/lib/{Route-D70pGn9n.js.map → Route-CwXfyIUw.js.map} +1 -1
  108. package/lib/{SlotletProvider-B71hNEUL.js → SlotletProvider-CzMAO73_.js} +12 -12
  109. package/lib/{SlotletProvider-B71hNEUL.js.map → SlotletProvider-CzMAO73_.js.map} +1 -1
  110. package/lib/Spinner-fF-Xv-gw.js +274 -0
  111. package/lib/Spinner-fF-Xv-gw.js.map +1 -0
  112. package/lib/index-7kcHaXD6.js +1771 -0
  113. package/lib/index-7kcHaXD6.js.map +1 -0
  114. package/lib/{index-Bl6YeerK.js → index-DUrF63A6.js} +1028 -1044
  115. package/lib/index-DUrF63A6.js.map +1 -0
  116. package/lib/{index-BH-Ub36F.js → index-DkuZvRNP.js} +4 -4
  117. package/lib/{index-BH-Ub36F.js.map → index-DkuZvRNP.js.map} +1 -1
  118. package/lib/joinPath-VeNuJa7y.js +8 -0
  119. package/lib/joinPath-VeNuJa7y.js.map +1 -0
  120. package/lib/jsx-runtime-B6kdoens.js +635 -0
  121. package/lib/jsx-runtime-B6kdoens.js.map +1 -0
  122. package/lib/{AnchorLink-BZcpTwOs.js → utils-CzT_9Tsn.js} +258 -214
  123. package/lib/utils-CzT_9Tsn.js.map +1 -0
  124. package/lib/zudoku.auth-clerk.js +1 -1
  125. package/lib/zudoku.auth-openid.js +2 -2
  126. package/lib/zudoku.components.js +1229 -1227
  127. package/lib/zudoku.components.js.map +1 -1
  128. package/lib/zudoku.plugin-api-keys.js +19 -19
  129. package/lib/zudoku.plugin-custom-page.js +2 -2
  130. package/lib/zudoku.plugin-markdown.js +21 -38
  131. package/lib/zudoku.plugin-markdown.js.map +1 -1
  132. package/lib/zudoku.plugin-openapi.js +8 -6
  133. package/lib/zudoku.plugin-openapi.js.map +1 -1
  134. package/package.json +4 -1
  135. package/src/app/demo.tsx +5 -4
  136. package/src/app/main.css +2 -2
  137. package/src/app/main.tsx +3 -1
  138. package/src/app/standalone.tsx +5 -4
  139. package/src/lib/components/DevPortal.tsx +1 -1
  140. package/src/lib/components/Header.tsx +21 -19
  141. package/src/lib/components/Layout.tsx +2 -2
  142. package/src/lib/components/TopNavigation.tsx +5 -5
  143. package/src/lib/components/context/DevPortalProvider.ts +11 -28
  144. package/src/lib/components/context/ThemeContext.tsx +3 -41
  145. package/src/lib/components/context/ThemeProvider.tsx +27 -0
  146. package/src/lib/components/navigation/{SideNavigation.tsx → Sidebar.tsx} +7 -7
  147. package/src/lib/components/navigation/SidebarBadge.tsx +40 -0
  148. package/src/lib/components/navigation/SidebarCategory.tsx +105 -0
  149. package/src/lib/components/navigation/SidebarItem.tsx +96 -0
  150. package/src/lib/components/navigation/{SideNavigationWrapper.tsx → SidebarWrapper.tsx} +1 -1
  151. package/src/lib/components/navigation/utils.ts +120 -0
  152. package/src/lib/core/DevPortalContext.ts +12 -44
  153. package/src/lib/core/plugins.ts +6 -13
  154. package/src/lib/plugins/markdown/MdxPage.tsx +14 -50
  155. package/src/lib/plugins/markdown/generateRoutes.tsx +29 -57
  156. package/src/lib/plugins/openapi/OperationListItem.tsx +5 -6
  157. package/src/lib/plugins/openapi/ParameterList.tsx +13 -10
  158. package/src/lib/plugins/openapi/SchemaListView.tsx +18 -2
  159. package/src/lib/plugins/openapi/SchemaListViewItem.tsx +16 -7
  160. package/src/lib/plugins/openapi/Sidecar.tsx +15 -2
  161. package/src/lib/plugins/openapi/index.tsx +17 -23
  162. package/src/lib/plugins/openapi/interfaces.ts +1 -1
  163. package/src/lib/plugins/openapi/playground/Headers.tsx +1 -1
  164. package/src/lib/plugins/openapi/playground/Playground.tsx +1 -1
  165. package/src/lib/util/useScrollToAnchor.ts +39 -18
  166. package/dist/lib/components/navigation/SideNavigation.d.ts +0 -1
  167. package/dist/lib/components/navigation/SideNavigation.js +0 -12
  168. package/dist/lib/components/navigation/SideNavigation.js.map +0 -1
  169. package/dist/lib/components/navigation/SideNavigationCategory.d.ts +0 -4
  170. package/dist/lib/components/navigation/SideNavigationCategory.js +0 -26
  171. package/dist/lib/components/navigation/SideNavigationCategory.js.map +0 -1
  172. package/dist/lib/components/navigation/SideNavigationItem.d.ts +0 -9
  173. package/dist/lib/components/navigation/SideNavigationItem.js +0 -44
  174. package/dist/lib/components/navigation/SideNavigationItem.js.map +0 -1
  175. package/dist/lib/components/navigation/SideNavigationWrapper.js.map +0 -1
  176. package/dist/lib/components/navigation/useNavigationCollapsibleState.d.ts +0 -9
  177. package/dist/lib/components/navigation/useNavigationCollapsibleState.js +0 -28
  178. package/dist/lib/components/navigation/useNavigationCollapsibleState.js.map +0 -1
  179. package/dist/lib/components/navigation/util.d.ts +0 -8
  180. package/dist/lib/components/navigation/util.js +0 -15
  181. package/dist/lib/components/navigation/util.js.map +0 -1
  182. package/dist/lib/plugins/openapi/MethodBadge.d.ts +0 -13
  183. package/dist/lib/plugins/openapi/MethodBadge.js +0 -26
  184. package/dist/lib/plugins/openapi/MethodBadge.js.map +0 -1
  185. package/dist/lib/util/traverseNavigation.d.ts +0 -6
  186. package/dist/lib/util/traverseNavigation.js +0 -30
  187. package/dist/lib/util/traverseNavigation.js.map +0 -1
  188. package/lib/AnchorLink-BZcpTwOs.js.map +0 -1
  189. package/lib/DevPortalProvider-BWeAysxF.js.map +0 -1
  190. package/lib/DeveloperHint-DQVwIery.js +0 -10
  191. package/lib/MdxPage-CA1WmW14.js.map +0 -1
  192. package/lib/OperationList-CHK_erYP.js.map +0 -1
  193. package/lib/Route-D70pGn9n.js +0 -13
  194. package/lib/Spinner-Coi7ORUV.js +0 -244
  195. package/lib/Spinner-Coi7ORUV.js.map +0 -1
  196. package/lib/index-Bl6YeerK.js.map +0 -1
  197. package/lib/index-Dt-pU7Vu.js +0 -916
  198. package/lib/index-Dt-pU7Vu.js.map +0 -1
  199. package/lib/jsx-runtime-CJBdjYYx.js +0 -1526
  200. package/lib/jsx-runtime-CJBdjYYx.js.map +0 -1
  201. package/src/lib/components/navigation/SideNavigationCategory.tsx +0 -72
  202. package/src/lib/components/navigation/SideNavigationItem.tsx +0 -148
  203. package/src/lib/components/navigation/useNavigationCollapsibleState.ts +0 -42
  204. package/src/lib/components/navigation/util.ts +0 -38
  205. package/src/lib/plugins/openapi/MethodBadge.tsx +0 -36
  206. package/src/lib/util/traverseNavigation.ts +0 -55
@@ -1,7 +1,4 @@
1
- import { Navigate, type RouteObject } from "react-router-dom";
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
- const routes = Object.entries(markdownFiles).flatMap(
16
- ([file, importPromise]) => {
17
- // @todo we can pass in the folder name and then filter the markdown files based on that path
18
- const match = file.match(/pages\/(.*).mdx?$/);
19
- const path = match?.at(1);
20
-
21
- if (!path) return [];
22
-
23
- const pathSegments = path.split("/");
24
- const isIndexFile = pathSegments.at(-1) === "index";
25
- const routePath = isIndexFile
26
- ? pathSegments.slice(0, -1).join("/")
27
- : path;
28
-
29
- return {
30
- path: routePath,
31
- lazy: async () => {
32
- const { MdxPage } = await import("./MdxPage.js");
33
- const { default: Component, ...props } = await importPromise();
34
- return {
35
- element: (
36
- <MdxPage
37
- mdxComponent={Component}
38
- {...props}
39
- defaultOptions={defaultOptions}
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 border-border"
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
- <div className="border-border font-mono text-sm border rounded p-4">
99
+ <Card className="font-mono text-sm p-4">
101
100
  No response body
102
- </div>
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
- <ul className="list-none m-0 px-0 overflow-hidden border divide-y divide-border rounded">
22
- {parameters.map((parameter) => (
23
- <ParameterListItem
24
- key={`${parameter.name}-${parameter.in}`}
25
- parameter={parameter}
26
- id={id}
27
- group={group}
28
- />
29
- ))}
30
- </ul>
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
- <ul className="border-border border rounded overflow-hidden">
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
- </ul>
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: string;
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={false}>
89
+ <Collapsible.Root className="CollapsibleRoot" defaultOpen={defaultOpen}>
85
90
  <Collapsible.Trigger asChild>
86
- <Button variant="ghost" size="sm">
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
- MethodTextColorMap[operation.method as keyof typeof MethodTextColorMap];
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.path ?? "/reference";
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<PluginNavigationCategory>((tag) => ({
156
- path,
153
+ .map<ResolvedSidebarItem>((tag) => ({
154
+ type: "category",
157
155
  label: tag.name ?? "",
158
156
  collapsible: false,
159
- children: tag.operations.map((operation) => ({
160
- path: `#${operation.slug}`,
161
- muted: !!operation.deprecated,
162
- title: operation.summary ?? operation.path,
163
- label: (
164
- <div className="flex flex-1 min-w-0 justify-between gap-2">
165
- <span className="truncate">
166
- {operation.summary ?? operation.path}
167
- </span>
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
- path,
170
+ type: "link",
176
171
  label: "Overview",
177
- collapsible: false,
178
- children: [{ path: "#description", label: "Description" }],
172
+ href: "#description",
179
173
  });
180
174
 
181
175
  return categories;
@@ -5,5 +5,5 @@ type OasSource =
5
5
 
6
6
  export type OasPluginConfig = {
7
7
  server?: string;
8
- path?: string;
8
+ navigationId?: string;
9
9
  } & OasSource;
@@ -71,7 +71,7 @@ export const Headers = ({
71
71
  >
72
72
  <XIcon size={16} />
73
73
  </button>
74
- <div className="col-span-full border-b border-border"></div>
74
+ <div className="col-span-full border-b"></div>
75
75
  </div>
76
76
  );
77
77
  })}
@@ -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 border-border">
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 element = document.getElementById(decodeURIComponent(hash));
15
- if (element) {
16
- // on page navigation element might be in DOM but not yet scrollable, so wait for a frame
17
- requestAnimationFrame(() => {
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
- return;
22
- }
42
+ return true;
43
+ }
23
44
 
24
- // on page load, the element might not be available yet
25
- const observer = new MutationObserver((_mutations, obs) => {
26
- const element = document.getElementById(decodeURIComponent(hash));
27
- if (!element) return;
45
+ return false;
46
+ };
28
47
 
29
- element.scrollIntoView();
30
- requestIdleCallback(() => setActiveAnchor(hash));
31
- obs.disconnect();
32
- });
48
+ if (!scrollToElement()) {
49
+ const observer = new MutationObserver((_, obs) => {
50
+ if (!scrollToElement()) return;
51
+ obs.disconnect();
52
+ });
33
53
 
34
- observer.observe(document.body, { childList: true, subtree: true });
54
+ observer.observe(document.body, { childList: true, subtree: true });
35
55
 
36
- return () => observer.disconnect();
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,4 +0,0 @@
1
- import type { NavigationCategory } from "../../core/DevPortalContext.js";
2
- export declare const SideNavigationCategory: ({ category, }: {
3
- category: NavigationCategory;
4
- }) => import("react/jsx-runtime").JSX.Element;
@@ -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
- };