zudoku 0.13.2 → 0.13.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/config/validators/InputSidebarSchema.d.ts +19 -4
- package/dist/config/validators/InputSidebarSchema.js +7 -28
- package/dist/config/validators/InputSidebarSchema.js.map +1 -1
- package/dist/config/validators/SidebarSchema.js +5 -6
- package/dist/config/validators/SidebarSchema.js.map +1 -1
- package/dist/config/validators/validate.d.ts +13 -6
- package/dist/config/validators/validate.js +4 -0
- package/dist/config/validators/validate.js.map +1 -1
- package/dist/lib/authentication/hook.d.ts +1 -1
- package/dist/lib/authentication/hook.js +1 -1
- package/dist/lib/authentication/hook.js.map +1 -1
- package/dist/lib/components/MobileTopNavigation.js +4 -1
- package/dist/lib/components/MobileTopNavigation.js.map +1 -1
- package/dist/lib/components/TopNavigation.d.ts +3 -0
- package/dist/lib/components/TopNavigation.js +9 -1
- package/dist/lib/components/TopNavigation.js.map +1 -1
- package/dist/lib/components/context/ZudokuContext.d.ts +2 -0
- package/dist/lib/components/index.d.ts +1 -0
- package/dist/lib/components/index.js +2 -0
- package/dist/lib/components/index.js.map +1 -1
- package/dist/lib/components/navigation/Sidebar.js +1 -1
- package/dist/lib/components/navigation/Sidebar.js.map +1 -1
- package/dist/lib/components/navigation/SidebarCategory.js +18 -7
- package/dist/lib/components/navigation/SidebarCategory.js.map +1 -1
- package/dist/lib/components/navigation/SidebarItem.js +12 -5
- package/dist/lib/components/navigation/SidebarItem.js.map +1 -1
- package/dist/lib/core/DevPortalContext.d.ts +1 -0
- package/dist/lib/core/DevPortalContext.js.map +1 -1
- package/dist/lib/plugins/markdown/MdxPage.js +1 -1
- package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
- package/dist/lib/plugins/openapi/playground/Playground.js +1 -0
- package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
- package/dist/vite/dev-server.js +1 -1
- package/dist/vite/dev-server.js.map +1 -1
- package/dist/vite/plugin-mdx.js +17 -0
- package/dist/vite/plugin-mdx.js.map +1 -1
- package/lib/{AuthenticationPlugin-CbgJ5SAh.js → AuthenticationPlugin-D1nhROkO.js} +3 -3
- package/lib/{AuthenticationPlugin-CbgJ5SAh.js.map → AuthenticationPlugin-D1nhROkO.js.map} +1 -1
- package/lib/{CategoryHeading-3Qtp2yZ8.js → CategoryHeading-B7TlPvuN.js} +2 -2
- package/lib/{CategoryHeading-3Qtp2yZ8.js.map → CategoryHeading-B7TlPvuN.js.map} +1 -1
- package/lib/{DeveloperHint-BE9DzNhv.js → DeveloperHint-B_QCCafl.js} +2 -2
- package/lib/{DeveloperHint-BE9DzNhv.js.map → DeveloperHint-B_QCCafl.js.map} +1 -1
- package/lib/{ErrorPage-B0COs372.js → ErrorPage-DqqAV1dr.js} +3 -3
- package/lib/{ErrorPage-B0COs372.js.map → ErrorPage-DqqAV1dr.js.map} +1 -1
- package/lib/{Input-CHfE_2Qk.js → Input-DrR6P3mq.js} +4 -4
- package/lib/{Input-CHfE_2Qk.js.map → Input-DrR6P3mq.js.map} +1 -1
- package/lib/{Markdown-CWI6lU11.js → Markdown-Y__eLG0x.js} +2 -2
- package/lib/{Markdown-CWI6lU11.js.map → Markdown-Y__eLG0x.js.map} +1 -1
- package/lib/{MdxPage-C3tlrV4j.js → MdxPage-B4FcPIi5.js} +6 -6
- package/lib/MdxPage-B4FcPIi5.js.map +1 -0
- package/lib/{OperationList-BO-ES1C5.js → OperationList-C2jKCTwZ.js} +8 -8
- package/lib/{OperationList-BO-ES1C5.js.map → OperationList-C2jKCTwZ.js.map} +1 -1
- package/lib/{Route-Dq6zv0Pi.js → Route-DWXcQzRK.js} +3 -3
- package/lib/{Route-Dq6zv0Pi.js.map → Route-DWXcQzRK.js.map} +1 -1
- package/lib/{SidebarBadge-DmI5hT04.js → SidebarBadge-C0iWtji9.js} +3 -3
- package/lib/{SidebarBadge-DmI5hT04.js.map → SidebarBadge-C0iWtji9.js.map} +1 -1
- package/lib/{SlotletProvider-RvaeLR6z.js → SlotletProvider-DmqWiVFt.js} +7 -7
- package/lib/{SlotletProvider-RvaeLR6z.js.map → SlotletProvider-DmqWiVFt.js.map} +1 -1
- package/lib/{ZudokuContext-BEmsYQoq.js → ZudokuContext-MRoel6bS.js} +2 -2
- package/lib/{ZudokuContext-BEmsYQoq.js.map → ZudokuContext-MRoel6bS.js.map} +1 -1
- package/lib/{index-Do_BBSIs.js → index-Ch8VO_uX.js} +4 -4
- package/lib/index-Ch8VO_uX.js.map +1 -0
- package/lib/{index-BRCiYFaL.js → index-DFN92YJN.js} +3 -2
- package/lib/{index-BRCiYFaL.js.map → index-DFN92YJN.js.map} +1 -1
- package/lib/{index-DNfiZTPV.js → index-Dso_b0di.js} +102 -101
- package/lib/index-Dso_b0di.js.map +1 -0
- package/lib/{index-Dvh1BL_e.js → index-bYAqbdYl.js} +3 -3
- package/lib/{index-Dvh1BL_e.js.map → index-bYAqbdYl.js.map} +1 -1
- package/lib/{router-Oe6YmY6B.js → router-BsfSoK2j.js} +3 -3
- package/lib/{router-Oe6YmY6B.js.map → router-BsfSoK2j.js.map} +1 -1
- package/lib/{useExposedProps-Csw8oAlt.js → useExposedProps-BWwxa-Hg.js} +2 -2
- package/lib/{useExposedProps-Csw8oAlt.js.map → useExposedProps-BWwxa-Hg.js.map} +1 -1
- package/lib/{utils-Chi3p5nE.js → utils-C8S3st2k.js} +3 -3
- package/lib/{utils-Chi3p5nE.js.map → utils-C8S3st2k.js.map} +1 -1
- package/lib/zudoku.auth-clerk.js +1 -1
- package/lib/zudoku.auth-openid.js +5 -5
- package/lib/zudoku.components.js +788 -780
- package/lib/zudoku.components.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +7 -7
- package/lib/zudoku.plugin-custom-pages.js +2 -2
- package/lib/zudoku.plugin-markdown.js +1 -1
- package/lib/zudoku.plugin-openapi.js +7 -7
- package/lib/zudoku.plugin-redirect.js +1 -1
- package/package.json +1 -1
- package/src/app/main.css +0 -1
- package/src/lib/authentication/hook.ts +1 -1
- package/src/lib/components/MobileTopNavigation.tsx +6 -2
- package/src/lib/components/TopNavigation.tsx +14 -1
- package/src/lib/components/index.ts +2 -0
- package/src/lib/components/navigation/Sidebar.tsx +1 -1
- package/src/lib/components/navigation/SidebarCategory.tsx +34 -26
- package/src/lib/components/navigation/SidebarItem.tsx +16 -17
- package/src/lib/core/DevPortalContext.ts +6 -1
- package/src/lib/plugins/markdown/MdxPage.tsx +10 -8
- package/src/lib/plugins/openapi/playground/Playground.tsx +1 -0
- package/lib/MdxPage-C3tlrV4j.js.map +0 -1
- package/lib/index-DNfiZTPV.js.map +0 -1
- package/lib/index-Do_BBSIs.js.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { j as e } from "./jsx-runtime-B6kdoens.js";
|
|
2
|
-
import { S as x, R as f } from "./SlotletProvider-
|
|
3
|
-
import { u as g, a as d, I as j, S as v, b as w, c as b, d as k, e as K, f as m } from "./Input-
|
|
4
|
-
import { a as N, L as u, O as I } from "./index-
|
|
5
|
-
import { u as h, a as E, b as S } from "./ZudokuContext-
|
|
6
|
-
import { B as l, n as A } from "./index-
|
|
7
|
-
import { D as C } from "./DeveloperHint-
|
|
2
|
+
import { S as x, R as f } from "./SlotletProvider-DmqWiVFt.js";
|
|
3
|
+
import { u as g, a as d, I as j, S as v, b as w, c as b, d as k, e as K, f as m } from "./Input-DrR6P3mq.js";
|
|
4
|
+
import { a as N, L as u, O as I } from "./index-DFN92YJN.js";
|
|
5
|
+
import { u as h, a as E, b as S } from "./ZudokuContext-MRoel6bS.js";
|
|
6
|
+
import { B as l, n as A } from "./index-Ch8VO_uX.js";
|
|
7
|
+
import { D as C } from "./DeveloperHint-B_QCCafl.js";
|
|
8
8
|
import { RotateCwIcon as P, TrashIcon as D, EyeOffIcon as R, EyeIcon as q, CheckIcon as O, CopyIcon as z } from "lucide-react";
|
|
9
9
|
import { useState as p } from "react";
|
|
10
|
-
import { a as T } from "./Markdown-
|
|
10
|
+
import { a as T } from "./Markdown-Y__eLG0x.js";
|
|
11
11
|
function c(t, s) {
|
|
12
12
|
if (t)
|
|
13
13
|
return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { j as o } from "./jsx-runtime-B6kdoens.js";
|
|
2
2
|
import a from "react";
|
|
3
|
-
import { a as n, P as u } from "./Markdown-
|
|
4
|
-
import { u as c } from "./useExposedProps-
|
|
3
|
+
import { a as n, P as u } from "./Markdown-Y__eLG0x.js";
|
|
4
|
+
import { u as c } from "./useExposedProps-BWwxa-Hg.js";
|
|
5
5
|
const l = ({
|
|
6
6
|
element: t,
|
|
7
7
|
render: s,
|
|
@@ -6,7 +6,7 @@ const x = (t, e, n) => Object.entries(t).flatMap(([a, p]) => {
|
|
|
6
6
|
return s ? {
|
|
7
7
|
path: s,
|
|
8
8
|
lazy: async () => {
|
|
9
|
-
const { MdxPage: i } = await import("./MdxPage-
|
|
9
|
+
const { MdxPage: i } = await import("./MdxPage-B4FcPIi5.js"), { default: m, ...l } = await p();
|
|
10
10
|
return {
|
|
11
11
|
element: /* @__PURE__ */ u.jsx(
|
|
12
12
|
i,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import "./jsx-runtime-B6kdoens.js";
|
|
2
|
-
import { o as u } from "./index-
|
|
3
|
-
import "./ZudokuContext-
|
|
2
|
+
import { o as u } from "./index-Dso_b0di.js";
|
|
3
|
+
import "./ZudokuContext-MRoel6bS.js";
|
|
4
4
|
import "lucide-react";
|
|
5
5
|
import "zudoku/openapi-worker";
|
|
6
|
-
import "./index-
|
|
7
|
-
import "./ErrorPage-
|
|
8
|
-
import "./Markdown-
|
|
6
|
+
import "./index-Ch8VO_uX.js";
|
|
7
|
+
import "./ErrorPage-DqqAV1dr.js";
|
|
8
|
+
import "./Markdown-Y__eLG0x.js";
|
|
9
9
|
import "./joinPath-B7kNnUX4.js";
|
|
10
10
|
import "./urql-core-KJnLL26g.js";
|
|
11
|
-
import "./router-
|
|
12
|
-
import "./index-
|
|
11
|
+
import "./router-BsfSoK2j.js";
|
|
12
|
+
import "./index-DFN92YJN.js";
|
|
13
13
|
export {
|
|
14
14
|
u as openApiPlugin
|
|
15
15
|
};
|
package/package.json
CHANGED
package/src/app/main.css
CHANGED
|
@@ -2,6 +2,7 @@ import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
|
|
|
2
2
|
import { cx } from "class-variance-authority";
|
|
3
3
|
import { MenuIcon } from "lucide-react";
|
|
4
4
|
import { NavLink } from "react-router-dom";
|
|
5
|
+
import { useAuth } from "../authentication/hook.js";
|
|
5
6
|
import {
|
|
6
7
|
Drawer,
|
|
7
8
|
DrawerClose,
|
|
@@ -11,9 +12,12 @@ import {
|
|
|
11
12
|
} from "../ui/Drawer.js";
|
|
12
13
|
import { useZudoku } from "./context/ZudokuContext.js";
|
|
13
14
|
import { Search } from "./Search.js";
|
|
15
|
+
import { isHiddenItem } from "./TopNavigation.js";
|
|
14
16
|
|
|
15
17
|
export const MobileTopNavigation = () => {
|
|
16
18
|
const { topNavigation } = useZudoku();
|
|
19
|
+
const { isAuthenticated } = useAuth();
|
|
20
|
+
|
|
17
21
|
return (
|
|
18
22
|
<Drawer direction="right">
|
|
19
23
|
<div className="flex lg:hidden justify-self-end">
|
|
@@ -22,7 +26,7 @@ export const MobileTopNavigation = () => {
|
|
|
22
26
|
</DrawerTrigger>
|
|
23
27
|
</div>
|
|
24
28
|
<DrawerContent
|
|
25
|
-
className="lg:hidden h-screen right-0 left-auto w-[320px] rounded-none"
|
|
29
|
+
className="lg:hidden h-screen right-0 left-auto w-[320px] rounded-none overflow-auto"
|
|
26
30
|
aria-describedby={undefined}
|
|
27
31
|
>
|
|
28
32
|
<VisuallyHidden>
|
|
@@ -32,7 +36,7 @@ export const MobileTopNavigation = () => {
|
|
|
32
36
|
<Search />
|
|
33
37
|
</div>
|
|
34
38
|
<ul className="flex flex-col items-center gap-4 p-4">
|
|
35
|
-
{topNavigation.map((item) => (
|
|
39
|
+
{topNavigation.filter(isHiddenItem(isAuthenticated)).map((item) => (
|
|
36
40
|
<li key={item.label}>
|
|
37
41
|
<NavLink
|
|
38
42
|
className={({ isActive }) =>
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import { cx } from "class-variance-authority";
|
|
2
2
|
import { NavLink } from "react-router-dom";
|
|
3
3
|
|
|
4
|
+
import { useAuth } from "../authentication/hook.js";
|
|
4
5
|
import { useZudoku } from "./context/ZudokuContext.js";
|
|
5
6
|
|
|
7
|
+
export const isHiddenItem =
|
|
8
|
+
(isAuthenticated?: boolean) =>
|
|
9
|
+
(item: { display?: "auth" | "anon" | "always" }) => {
|
|
10
|
+
return (
|
|
11
|
+
(item.display === "auth" && isAuthenticated) ||
|
|
12
|
+
(item.display === "anon" && !isAuthenticated) ||
|
|
13
|
+
!item.display ||
|
|
14
|
+
item.display === "always"
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
6
18
|
export const TopNavigation = () => {
|
|
7
19
|
const { topNavigation } = useZudoku();
|
|
20
|
+
const { isAuthenticated } = useAuth();
|
|
8
21
|
|
|
9
22
|
// Hide top nav if there is only one item
|
|
10
23
|
if (topNavigation.length <= 1) {
|
|
@@ -14,7 +27,7 @@ export const TopNavigation = () => {
|
|
|
14
27
|
return (
|
|
15
28
|
<nav className="hidden lg:block border-b text-sm px-12 h-[--top-nav-height]">
|
|
16
29
|
<ul className="flex flex-row items-center gap-8">
|
|
17
|
-
{topNavigation.map((item) => (
|
|
30
|
+
{topNavigation.filter(isHiddenItem(isAuthenticated)).map((item) => (
|
|
18
31
|
<li key={item.label}>
|
|
19
32
|
<NavLink
|
|
20
33
|
className={({ isActive }) =>
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "./Bootstrap.js";
|
|
12
12
|
import { DevPortal as DevPortalImport } from "./DevPortal.js";
|
|
13
13
|
import { Layout as LayoutImport } from "./Layout.js";
|
|
14
|
+
import { useZudoku as useZudokuImport } from "./context/ZudokuContext.js";
|
|
14
15
|
|
|
15
16
|
export const useMDXComponents = /*@__PURE__*/ useMDXComponentsImport;
|
|
16
17
|
export const Callout = /*@__PURE__*/ CalloutImport;
|
|
@@ -23,3 +24,4 @@ export const Bootstrap = /*@__PURE__*/ BootstrapImport;
|
|
|
23
24
|
export const BootstrapStatic = /*@__PURE__*/ BootstrapStaticImport;
|
|
24
25
|
export const Button = /*@__PURE__*/ ButtonImport;
|
|
25
26
|
export const Head = /*@__PURE__*/ Helmet;
|
|
27
|
+
export const useZudoku = /*@__PURE__*/ useZudokuImport;
|
|
@@ -24,7 +24,7 @@ export const Sidebar = () => {
|
|
|
24
24
|
<Slotlet name="zudoku-after-navigation" />
|
|
25
25
|
</SidebarWrapper>
|
|
26
26
|
<DrawerContent
|
|
27
|
-
className="lg:hidden h-screen left-0 p-6 w-[320px] rounded-none"
|
|
27
|
+
className="lg:hidden h-screen left-0 p-6 w-[320px] rounded-none overflow-auto"
|
|
28
28
|
aria-describedby={undefined}
|
|
29
29
|
>
|
|
30
30
|
<VisuallyHidden>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Collapsible from "@radix-ui/react-collapsible";
|
|
2
2
|
import { ChevronRightIcon } from "lucide-react";
|
|
3
3
|
import { useEffect, useState } from "react";
|
|
4
|
-
import { NavLink } from "react-router-dom";
|
|
4
|
+
import { NavLink, useMatch } from "react-router-dom";
|
|
5
5
|
import type { SidebarItemCategory } from "../../../config/validators/SidebarSchema.js";
|
|
6
6
|
import { cn } from "../../util/cn.js";
|
|
7
7
|
import { joinPath } from "../../util/joinPath.js";
|
|
@@ -26,6 +26,7 @@ export const SidebarCategory = ({
|
|
|
26
26
|
!isCollapsible || !isCollapsed || isCategoryOpen,
|
|
27
27
|
);
|
|
28
28
|
const [open, setOpen] = useState(isDefaultOpen);
|
|
29
|
+
const isActive = useMatch(joinPath(topNavItem?.id, category.link?.id));
|
|
29
30
|
|
|
30
31
|
useEffect(() => {
|
|
31
32
|
// this is triggered when an item from the sidebar is clicked
|
|
@@ -56,46 +57,54 @@ export const SidebarCategory = ({
|
|
|
56
57
|
|
|
57
58
|
return (
|
|
58
59
|
<Collapsible.Root
|
|
59
|
-
className=
|
|
60
|
+
className="flex flex-col"
|
|
60
61
|
defaultOpen={isDefaultOpen}
|
|
61
62
|
open={open}
|
|
62
63
|
onOpenChange={() => setOpen(true)}
|
|
63
64
|
>
|
|
64
65
|
<Collapsible.Trigger className="group" asChild disabled={!isCollapsible}>
|
|
65
66
|
<div
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
onClick={() => setHasInteracted(true)}
|
|
68
|
+
className={navigationListItem({
|
|
69
|
+
isActive: false,
|
|
70
|
+
isTopLevel: level === 0,
|
|
71
|
+
className: [
|
|
72
|
+
"text-start",
|
|
73
|
+
isCollapsible
|
|
74
|
+
? "cursor-pointer"
|
|
75
|
+
: "cursor-default hover:bg-transparent",
|
|
76
|
+
],
|
|
77
|
+
})}
|
|
73
78
|
>
|
|
74
79
|
{category.icon && (
|
|
75
80
|
<category.icon
|
|
76
81
|
size={16}
|
|
77
|
-
className=
|
|
82
|
+
className={cn(
|
|
83
|
+
"align-[-0.125em] -translate-x-1",
|
|
84
|
+
isActive && "text-primary",
|
|
85
|
+
)}
|
|
78
86
|
/>
|
|
79
87
|
)}
|
|
80
88
|
{category.link?.type === "doc" ? (
|
|
81
89
|
<NavLink
|
|
82
90
|
to={joinPath(topNavItem?.id, category.link.id)}
|
|
83
91
|
className="flex-1"
|
|
84
|
-
onClick={() =>
|
|
92
|
+
onClick={() => {
|
|
93
|
+
// if it is the current path and closed then open it because there's no path change to trigger the open
|
|
94
|
+
if (isActive && !open) {
|
|
95
|
+
setOpen(true);
|
|
96
|
+
}
|
|
97
|
+
}}
|
|
85
98
|
>
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
<div className="truncate">{category.label}</div>
|
|
96
|
-
{ToggleButton}
|
|
97
|
-
</div>
|
|
98
|
-
)}
|
|
99
|
+
<div
|
|
100
|
+
className={cn(
|
|
101
|
+
"flex items-center gap-2 justify-between w-full",
|
|
102
|
+
isActive ? "text-primary" : "text-foreground/80",
|
|
103
|
+
)}
|
|
104
|
+
>
|
|
105
|
+
<div className="truncate">{category.label}</div>
|
|
106
|
+
{ToggleButton}
|
|
107
|
+
</div>
|
|
99
108
|
</NavLink>
|
|
100
109
|
) : (
|
|
101
110
|
<div className="flex items-center justify-between w-full">
|
|
@@ -109,10 +118,9 @@ export const SidebarCategory = ({
|
|
|
109
118
|
className={cn(
|
|
110
119
|
// CollapsibleContent class is used to animate and it should only be applied when the user has triggered the toggle
|
|
111
120
|
hasInteracted && "CollapsibleContent",
|
|
112
|
-
"ms-[calc(var(--padding-nav-item)*1.125)]",
|
|
113
121
|
)}
|
|
114
122
|
>
|
|
115
|
-
<ul className="mt-1 border-l
|
|
123
|
+
<ul className="mt-1 border-l ms-0.5">
|
|
116
124
|
{category.items.map((item) => (
|
|
117
125
|
<SidebarItem
|
|
118
126
|
key={
|
|
@@ -3,7 +3,6 @@ import { ExternalLinkIcon } from "lucide-react";
|
|
|
3
3
|
import { NavLink, useSearchParams } from "react-router-dom";
|
|
4
4
|
|
|
5
5
|
import type { SidebarItem as SidebarItemType } from "../../../config/validators/SidebarSchema.js";
|
|
6
|
-
import { cn } from "../../util/cn.js";
|
|
7
6
|
import { joinPath } from "../../util/joinPath.js";
|
|
8
7
|
import { AnchorLink } from "../AnchorLink.js";
|
|
9
8
|
import { useViewportAnchor } from "../context/ViewportAnchorContext.js";
|
|
@@ -16,7 +15,8 @@ export const navigationListItem = cva(
|
|
|
16
15
|
{
|
|
17
16
|
variants: {
|
|
18
17
|
isTopLevel: {
|
|
19
|
-
true: "font-
|
|
18
|
+
true: "font-medium -mx-[--padding-nav-item]",
|
|
19
|
+
false: "-mr-[--padding-nav-item] ml-[--padding-nav-item]",
|
|
20
20
|
},
|
|
21
21
|
isActive: {
|
|
22
22
|
true: "text-primary font-medium",
|
|
@@ -27,6 +27,9 @@ export const navigationListItem = cva(
|
|
|
27
27
|
false: "",
|
|
28
28
|
},
|
|
29
29
|
},
|
|
30
|
+
defaultVariants: {
|
|
31
|
+
isActive: false,
|
|
32
|
+
},
|
|
30
33
|
},
|
|
31
34
|
);
|
|
32
35
|
|
|
@@ -58,7 +61,7 @@ export const SidebarItem = ({
|
|
|
58
61
|
{item.icon && <item.icon size={16} className="align-[-0.125em]" />}
|
|
59
62
|
{item.badge ? (
|
|
60
63
|
<>
|
|
61
|
-
<span className="truncate" title={item.label}>
|
|
64
|
+
<span className="truncate flex-1" title={item.label}>
|
|
62
65
|
{item.label}
|
|
63
66
|
</span>
|
|
64
67
|
<SidebarBadge {...item.badge} />
|
|
@@ -73,13 +76,11 @@ export const SidebarItem = ({
|
|
|
73
76
|
<AnchorLink
|
|
74
77
|
to={{ hash: item.href, search: searchParams.toString() }}
|
|
75
78
|
{...{ [DATA_ANCHOR_ATTR]: item.href.slice(1) }}
|
|
76
|
-
className={
|
|
77
|
-
|
|
78
|
-
level === 0
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}),
|
|
82
|
-
)}
|
|
79
|
+
className={navigationListItem({
|
|
80
|
+
isActive: item.href.slice(1) === activeAnchor,
|
|
81
|
+
isTopLevel: level === 0,
|
|
82
|
+
className: item.badge?.placement !== "start" && "justify-between",
|
|
83
|
+
})}
|
|
83
84
|
>
|
|
84
85
|
{item.badge ? (
|
|
85
86
|
<>
|
|
@@ -94,7 +95,9 @@ export const SidebarItem = ({
|
|
|
94
95
|
</AnchorLink>
|
|
95
96
|
) : !item.href.startsWith("http") ? (
|
|
96
97
|
<NavLink
|
|
97
|
-
className={
|
|
98
|
+
className={navigationListItem({
|
|
99
|
+
className: item.badge?.placement !== "start" && "justify-between",
|
|
100
|
+
})}
|
|
98
101
|
to={item.href}
|
|
99
102
|
>
|
|
100
103
|
{item.badge ? (
|
|
@@ -110,10 +113,7 @@ export const SidebarItem = ({
|
|
|
110
113
|
</NavLink>
|
|
111
114
|
) : (
|
|
112
115
|
<a
|
|
113
|
-
className={
|
|
114
|
-
navigationListItem({ isTopLevel: level === 0 }),
|
|
115
|
-
"block",
|
|
116
|
-
)}
|
|
116
|
+
className={navigationListItem({ isTopLevel: level === 0 })}
|
|
117
117
|
href={item.href}
|
|
118
118
|
target="_blank"
|
|
119
119
|
rel="noopener noreferrer"
|
|
@@ -121,8 +121,7 @@ export const SidebarItem = ({
|
|
|
121
121
|
<span className="whitespace-normal">{item.label}</span>
|
|
122
122
|
{/* This prevents that the icon would be positioned in its own line if the text fills a line entirely */}
|
|
123
123
|
<span className="whitespace-nowrap">
|
|
124
|
-
|
|
125
|
-
<ExternalLinkIcon className="inline ml-1" size={12} />
|
|
124
|
+
<ExternalLinkIcon className="inline -translate-y-0.5" size={12} />
|
|
126
125
|
</span>
|
|
127
126
|
</a>
|
|
128
127
|
);
|
|
@@ -60,7 +60,12 @@ export type ZudokuContextOptions = {
|
|
|
60
60
|
metadata?: Metadata;
|
|
61
61
|
page?: Page;
|
|
62
62
|
authentication?: AuthenticationProvider;
|
|
63
|
-
topNavigation?: Array<{
|
|
63
|
+
topNavigation?: Array<{
|
|
64
|
+
id: string;
|
|
65
|
+
label: string;
|
|
66
|
+
default?: string;
|
|
67
|
+
display?: "auth" | "anon" | "always";
|
|
68
|
+
}>;
|
|
64
69
|
sidebars?: SidebarConfig;
|
|
65
70
|
plugins?: DevPortalPlugin[];
|
|
66
71
|
slotlets?: Slotlets;
|
|
@@ -68,14 +68,16 @@ export const MdxPage = ({
|
|
|
68
68
|
"max-w-full xl:w-full xl:max-w-prose flex-1 flex-shrink pt-[--padding-content-top] pb-[--padding-content-bottom]",
|
|
69
69
|
)}
|
|
70
70
|
>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
{title}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
71
|
+
{(category || title) && (
|
|
72
|
+
<header>
|
|
73
|
+
{category && <CategoryHeading>{category}</CategoryHeading>}
|
|
74
|
+
{title && (
|
|
75
|
+
<Heading level={1} id={slugify(title)}>
|
|
76
|
+
{title}
|
|
77
|
+
</Heading>
|
|
78
|
+
)}
|
|
79
|
+
</header>
|
|
80
|
+
)}
|
|
79
81
|
<MdxComponent
|
|
80
82
|
components={{ ...useMDXComponents(), ...MarkdownHeadings }}
|
|
81
83
|
/>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MdxPage-C3tlrV4j.js","sources":["../src/lib/plugins/markdown/Toc.tsx","../src/lib/plugins/markdown/MdxPage.tsx"],"sourcesContent":["import type { TocEntry } from \"@stefanprobst/rehype-extract-toc\";\nimport { ListTreeIcon } from \"lucide-react\";\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type PropsWithChildren,\n} from \"react\";\nimport { AnchorLink } from \"../../components/AnchorLink.js\";\nimport { useViewportAnchor } from \"../../components/context/ViewportAnchorContext.js\";\nimport { cn } from \"../../util/cn.js\";\n\nconst DATA_ANCHOR_ATTR = \"data-active\";\n\nconst TocItem = ({\n item,\n children,\n className,\n isActive,\n}: PropsWithChildren<{\n item: TocEntry;\n isActive: boolean;\n className?: string;\n}>) => {\n return (\n <li\n className={cn(\n \"truncate\",\n isActive\n ? \"text-primary\"\n : \"text-foreground/65 dark:text-foreground/75\",\n className,\n )}\n title={item.value}\n >\n <AnchorLink\n to={`#${item.id}`}\n {...{ [DATA_ANCHOR_ATTR]: item.id }}\n className={cn(\n isActive\n ? \"text-primary\"\n : \"text-foreground/65 dark:text-foreground/75 hover:text-foreground\",\n )}\n >\n {item.value}\n </AnchorLink>\n {children}\n </li>\n );\n};\n\nexport const Toc = ({ entries }: { entries: TocEntry[] }) => {\n const { activeAnchor } = useViewportAnchor();\n const listWrapperRef = useRef<HTMLUListElement>(null);\n const paintedOnce = useRef(false);\n const [indicatorStyle, setIndicatorStyles] = useState<CSSProperties>({\n top: 0,\n opacity: 0,\n });\n\n // synchronize active anchor indicator with the scroll position\n useEffect(() => {\n if (!listWrapperRef.current) return;\n\n const activeElement = listWrapperRef.current.querySelector(\n `[${DATA_ANCHOR_ATTR}='${activeAnchor}']`,\n );\n\n if (!activeElement) {\n setIndicatorStyles({ top: 0, opacity: 0 });\n return;\n }\n\n const topParent = listWrapperRef.current.getBoundingClientRect().top;\n const topElement = activeElement.getBoundingClientRect().top;\n\n setIndicatorStyles({\n opacity: 1,\n top: `${topElement - topParent}px`,\n });\n\n if (paintedOnce.current) return;\n\n // after all is painted, the indicator should animate\n requestIdleCallback(() => {\n paintedOnce.current = true;\n });\n }, [activeAnchor]);\n\n return (\n <aside className=\"sticky scrollbar top-[--header-height] h-[calc(100vh-var(--header-height))] pt-[--padding-content-top] pb-[--padding-content-bottom] overflow-y-auto ps-1 text-sm\">\n <div className=\"flex items-center gap-2 font-medium mb-2\">\n <ListTreeIcon size={16} />\n On this page\n </div>\n <div className=\"relative ms-2 ps-4\">\n <div className=\"absolute inset-0 right-auto bg-border w-[2px]\" />\n <div\n className={cn(\n \"absolute -left-px -translate-y-1 h-6 w-[4px] rounded bg-primary\",\n paintedOnce.current &&\n \"ease-out [transition:top_150ms,opacity_325ms]\",\n )}\n style={indicatorStyle}\n />\n <ul\n ref={listWrapperRef}\n className=\"relative font-medium list-none space-y-2\"\n >\n {entries.map((item) => (\n <TocItem\n isActive={item.id === activeAnchor}\n key={item.id}\n item={item}\n className=\"pl-0\"\n >\n {item.children && (\n <ul className=\"list-none pl-4 pt-2 space-y-2\">\n {item.children.map((child) => (\n <TocItem\n item={child}\n isActive={child.id === activeAnchor}\n key={child.id}\n />\n ))}\n </ul>\n )}\n </TocItem>\n ))}\n </ul>\n </div>\n </aside>\n );\n};\n","import { useMDXComponents } from \"@mdx-js/react\";\nimport slugify from \"@sindresorhus/slugify\";\nimport { Helmet } from \"@zudoku/react-helmet-async\";\nimport { type PropsWithChildren } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CategoryHeading } from \"../../components/CategoryHeading.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { ProseClasses } from \"../../components/Markdown.js\";\nimport {\n useCurrentItem,\n usePrevNext,\n} from \"../../components/navigation/utils.js\";\nimport type { MdxComponentsType } from \"../../util/MdxComponents.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { Toc } from \"./Toc.js\";\nimport { MarkdownPluginDefaultOptions, MDXImport } from \"./index.js\";\n\nconst MarkdownHeadings = {\n h2: ({ children, id }) => (\n <Heading level={2} id={id} registerSidebarAnchor>\n {children}\n </Heading>\n ),\n h3: ({ children, id }) => (\n <Heading level={3} id={id} registerSidebarAnchor>\n {children}\n </Heading>\n ),\n} satisfies MdxComponentsType;\n\nexport const MdxPage = ({\n mdxComponent: MdxComponent,\n frontmatter = {},\n defaultOptions,\n tableOfContents,\n}: PropsWithChildren<\n Omit<MDXImport, \"default\"> & {\n mdxComponent: MDXImport[\"default\"];\n defaultOptions?: MarkdownPluginDefaultOptions;\n }\n>) => {\n const categoryTitle = useCurrentItem()?.categoryLabel;\n const title = frontmatter.title;\n const category = frontmatter.category ?? categoryTitle;\n const hideToc = frontmatter.toc === false || defaultOptions?.toc === false;\n const pageTitle =\n tableOfContents.find((item) => item.depth === 1)?.value ?? title;\n const hidePager =\n frontmatter.disablePager ?? defaultOptions?.disablePager ?? false;\n\n const tocEntries =\n tableOfContents.find((item) => item.depth === 1)?.children ??\n // if `title` is provided by frontmatter it does not appear in the table of contents\n tableOfContents.filter((item) => item.depth === 2);\n\n const showToc = !hideToc && tocEntries.length > 0;\n\n const { prev, next } = usePrevNext();\n\n return (\n <div className=\"xl:grid grid-cols-[--sidecar-grid-cols] gap-8 justify-between\">\n <Helmet>\n <title>{pageTitle}</title>\n </Helmet>\n <div\n className={cn(\n ProseClasses,\n \"max-w-full xl:w-full xl:max-w-prose flex-1 flex-shrink pt-[--padding-content-top] pb-[--padding-content-bottom]\",\n )}\n >\n <header>\n {category && <CategoryHeading>{category}</CategoryHeading>}\n {title && (\n <Heading level={1} id={slugify(title)}>\n {title}\n </Heading>\n )}\n </header>\n <MdxComponent\n components={{ ...useMDXComponents(), ...MarkdownHeadings }}\n />\n {!hidePager && (\n <>\n <hr />\n <div className=\"not-prose flex flex-wrap items-center justify-between gap-2 lg:gap-8\">\n {prev ? (\n <Link\n to={prev.id}\n className=\"flex flex-col items-stretch gap-2 flex-1 min-w-max border rounded px-6 py-4 text-start hover:border-primary/85 transition shadow-sm hover:shadow-md\"\n title={prev.label}\n >\n <div className=\"text-sm text-muted-foreground\">\n ← Previous page\n </div>\n <div className=\"text-lg text-primary truncate\">\n {prev.label}\n </div>\n </Link>\n ) : (\n <div className=\"flex-1\" />\n )}\n {next ? (\n <Link\n to={next.id}\n className=\"flex flex-col items-stretch gap-2 flex-1 min-w-max border rounded px-6 py-4 text-end hover:border-primary/85 transition shadow-sm hover:shadow-md\"\n title={next.label}\n >\n <div className=\"text-sm text-muted-foreground\">\n Next page →\n </div>\n <div className=\"text-lg text-primary truncate\">\n {next.label}\n </div>\n </Link>\n ) : (\n <div className=\"flex-1\" />\n )}\n </div>\n </>\n )}\n </div>\n <div className=\"hidden xl:block\">\n {showToc && <Toc entries={tocEntries} />}\n </div>\n </div>\n );\n};\n"],"names":["DATA_ANCHOR_ATTR","TocItem","item","children","className","isActive","jsxs","cn","jsx","AnchorLink","Toc","entries","activeAnchor","useViewportAnchor","listWrapperRef","useRef","paintedOnce","indicatorStyle","setIndicatorStyles","useState","useEffect","activeElement","topParent","topElement","ListTreeIcon","child","MarkdownHeadings","id","Heading","MdxPage","MdxComponent","frontmatter","defaultOptions","tableOfContents","categoryTitle","_a","useCurrentItem","title","category","hideToc","pageTitle","_b","hidePager","tocEntries","_c","showToc","prev","next","usePrevNext","Helmet","ProseClasses","CategoryHeading","slugify","useMDXComponents","Fragment","Link"],"mappings":"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"}
|