zudoku 0.52.2 → 0.53.1
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/app/demo.js +16 -2
- package/dist/app/demo.js.map +1 -1
- package/dist/app/main.js +4 -4
- package/dist/app/standalone.js +3 -3
- package/dist/app/standalone.js.map +1 -1
- package/dist/config/validators/validate.d.ts +2 -2
- package/dist/config/validators/validate.js +3 -3
- package/dist/config/validators/validate.js.map +1 -1
- package/dist/lib/authentication/authentication.d.ts +2 -0
- package/dist/lib/authentication/components/SignIn.js +4 -3
- package/dist/lib/authentication/components/SignIn.js.map +1 -1
- package/dist/lib/authentication/providers/openid.d.ts +4 -2
- package/dist/lib/authentication/providers/openid.js +11 -5
- package/dist/lib/authentication/providers/openid.js.map +1 -1
- package/dist/lib/components/Banner.js +1 -1
- package/dist/lib/components/Banner.js.map +1 -1
- package/dist/lib/components/Footer.js +1 -1
- package/dist/lib/components/Footer.js.map +1 -1
- package/dist/lib/components/Header.js +10 -10
- package/dist/lib/components/Header.js.map +1 -1
- package/dist/lib/components/Main.js +1 -1
- package/dist/lib/components/MobileTopNavigation.js +8 -5
- package/dist/lib/components/MobileTopNavigation.js.map +1 -1
- package/dist/lib/components/TopNavigation.d.ts +5 -0
- package/dist/lib/components/TopNavigation.js +16 -12
- package/dist/lib/components/TopNavigation.js.map +1 -1
- package/dist/lib/components/navigation/NavigationWrapper.js +1 -1
- package/dist/lib/core/ZudokuContext.d.ts +6 -5
- package/dist/lib/core/ZudokuContext.js +16 -3
- package/dist/lib/core/ZudokuContext.js.map +1 -1
- package/dist/lib/plugins/api-keys/index.js +1 -1
- package/dist/lib/plugins/markdown/MdxPage.js +3 -2
- package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
- package/dist/lib/plugins/openapi/OperationList.js +1 -1
- package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
- package/dist/lib/plugins/openapi/index.js +1 -1
- package/dist/lib/plugins/openapi/index.js.map +1 -1
- package/dist/vite/build.js +1 -1
- package/dist/vite/dev-server.js +1 -1
- package/lib/{MdxPage-Glqk-5sb.js → MdxPage-8UuEK446.js} +37 -37
- package/lib/MdxPage-8UuEK446.js.map +1 -0
- package/lib/{OasProvider-Cks7Ky_-.js → OasProvider-BsWpguVO.js} +2 -2
- package/lib/{OasProvider-Cks7Ky_-.js.map → OasProvider-BsWpguVO.js.map} +1 -1
- package/lib/{OperationList-BP3gUFCx.js → OperationList-PnZbf3b2.js} +6 -6
- package/lib/{OperationList-BP3gUFCx.js.map → OperationList-PnZbf3b2.js.map} +1 -1
- package/lib/{Pagination-D2xTtsFG.js → Pagination-DY7gCrm4.js} +2 -2
- package/lib/{Pagination-D2xTtsFG.js.map → Pagination-DY7gCrm4.js.map} +1 -1
- package/lib/{SchemaList-BQOuyEO7.js → SchemaList-D6k4DKWH.js} +3 -3
- package/lib/{SchemaList-BQOuyEO7.js.map → SchemaList-D6k4DKWH.js.map} +1 -1
- package/lib/{SchemaView-C6fqo8Th.js → SchemaView-BhgJ9WB8.js} +3 -3
- package/lib/{SchemaView-C6fqo8Th.js.map → SchemaView-BhgJ9WB8.js.map} +1 -1
- package/lib/SignUp-CpUD6DUM.js +56 -0
- package/lib/SignUp-CpUD6DUM.js.map +1 -0
- package/lib/{circular-BNp-4wdn.js → circular-BUMjK3JF.js} +2 -2
- package/lib/{circular-BNp-4wdn.js.map → circular-BUMjK3JF.js.map} +1 -1
- package/lib/{createServer-D7OPYwXA.js → createServer-BPz8ZCrd.js} +3 -3
- package/lib/createServer-BPz8ZCrd.js.map +1 -0
- package/lib/{errors-C473PjdR.js → errors-DY-qOx9n.js} +3 -3
- package/lib/{errors-C473PjdR.js.map → errors-DY-qOx9n.js.map} +1 -1
- package/lib/{index-Chtnw-sn.js → index-C_xVKbf9.js} +1291 -1246
- package/lib/index-C_xVKbf9.js.map +1 -0
- package/lib/{index-BLRAtPoq.js → index-dVBKCNMa.js} +123 -123
- package/lib/{index-BLRAtPoq.js.map → index-dVBKCNMa.js.map} +1 -1
- package/lib/zudoku.auth-azureb2c.js +1 -1
- package/lib/zudoku.auth-clerk.js +1 -1
- package/lib/zudoku.auth-openid.js +114 -105
- package/lib/zudoku.auth-openid.js.map +1 -1
- package/lib/zudoku.components.js +1 -1
- package/lib/zudoku.plugin-api-catalog.js +1 -1
- package/lib/zudoku.plugin-api-keys.js +271 -265
- package/lib/zudoku.plugin-api-keys.js.map +1 -1
- package/lib/zudoku.plugin-markdown.js +1 -1
- package/lib/zudoku.plugin-openapi.js +1 -1
- package/package.json +4 -4
- package/src/app/demo.tsx +18 -3
- package/src/app/main.tsx +4 -4
- package/src/app/standalone.tsx +3 -3
- package/src/lib/authentication/authentication.ts +2 -2
- package/src/lib/authentication/components/SignIn.tsx +5 -12
- package/src/lib/authentication/providers/openid.tsx +23 -4
- package/src/lib/components/Banner.tsx +1 -1
- package/src/lib/components/Footer.tsx +1 -1
- package/src/lib/components/Header.tsx +15 -17
- package/src/lib/components/Main.tsx +1 -1
- package/src/lib/components/MobileTopNavigation.tsx +58 -9
- package/src/lib/components/TopNavigation.tsx +30 -14
- package/src/lib/components/navigation/NavigationWrapper.tsx +1 -1
- package/src/lib/core/ZudokuContext.ts +26 -5
- package/src/lib/plugins/api-keys/index.tsx +1 -1
- package/src/lib/plugins/markdown/MdxPage.tsx +3 -2
- package/src/lib/plugins/openapi/OperationList.tsx +1 -1
- package/src/lib/plugins/openapi/index.tsx +1 -1
- package/lib/MdxPage-Glqk-5sb.js.map +0 -1
- package/lib/SignUp-M9Jz4SXJ.js +0 -63
- package/lib/SignUp-M9Jz4SXJ.js.map +0 -1
- package/lib/createServer-D7OPYwXA.js.map +0 -1
- package/lib/index-Chtnw-sn.js.map +0 -1
|
@@ -60,22 +60,22 @@ export const Header = memo(function HeaderInner() {
|
|
|
60
60
|
const auth = useAuth();
|
|
61
61
|
const { isAuthenticated, profile, isAuthEnabled } = useAuth();
|
|
62
62
|
const context = useZudoku();
|
|
63
|
-
const {
|
|
63
|
+
const { site, plugins, options } = context;
|
|
64
64
|
|
|
65
65
|
const accountItems = plugins
|
|
66
66
|
.filter((p) => isProfileMenuPlugin(p))
|
|
67
67
|
.flatMap((p) => p.getProfileMenuItems(context))
|
|
68
68
|
.sort((i) => i.weight ?? 0);
|
|
69
69
|
|
|
70
|
-
const logoLightSrc =
|
|
71
|
-
? /https?:\/\//.test(
|
|
72
|
-
?
|
|
73
|
-
: joinUrl(options.basePath,
|
|
70
|
+
const logoLightSrc = site?.logo
|
|
71
|
+
? /https?:\/\//.test(site.logo.src.light)
|
|
72
|
+
? site.logo.src.light
|
|
73
|
+
: joinUrl(options.basePath, site.logo.src.light)
|
|
74
74
|
: undefined;
|
|
75
|
-
const logoDarkSrc =
|
|
76
|
-
? /https?:\/\//.test(
|
|
77
|
-
?
|
|
78
|
-
: joinUrl(options.basePath,
|
|
75
|
+
const logoDarkSrc = site?.logo
|
|
76
|
+
? /https?:\/\//.test(site.logo.src.dark)
|
|
77
|
+
? site.logo.src.dark
|
|
78
|
+
: joinUrl(options.basePath, site.logo.src.dark)
|
|
79
79
|
: undefined;
|
|
80
80
|
|
|
81
81
|
const borderBottom = "inset-shadow-[0_-1px_0_0_var(--border)]";
|
|
@@ -89,27 +89,25 @@ export const Header = memo(function HeaderInner() {
|
|
|
89
89
|
<div className="flex">
|
|
90
90
|
<Link to="/">
|
|
91
91
|
<div className="flex items-center gap-3.5">
|
|
92
|
-
{
|
|
92
|
+
{site?.logo && (
|
|
93
93
|
<>
|
|
94
94
|
<img
|
|
95
95
|
src={logoLightSrc}
|
|
96
|
-
alt={
|
|
97
|
-
style={{ width:
|
|
96
|
+
alt={site.logo.alt ?? site.title}
|
|
97
|
+
style={{ width: site.logo.width }}
|
|
98
98
|
className="max-h-(--top-header-height) dark:hidden"
|
|
99
99
|
loading="lazy"
|
|
100
100
|
/>
|
|
101
101
|
<img
|
|
102
102
|
src={logoDarkSrc}
|
|
103
|
-
alt={
|
|
104
|
-
style={{ width:
|
|
103
|
+
alt={site.logo.alt ?? site.title}
|
|
104
|
+
style={{ width: site.logo.width }}
|
|
105
105
|
className="max-h-(--top-header-height) hidden dark:block"
|
|
106
106
|
loading="lazy"
|
|
107
107
|
/>
|
|
108
108
|
</>
|
|
109
109
|
)}
|
|
110
|
-
<span className="font-semibold text-2xl">
|
|
111
|
-
{page?.pageTitle}
|
|
112
|
-
</span>
|
|
110
|
+
<span className="font-semibold text-2xl">{site?.title}</span>
|
|
113
111
|
</div>
|
|
114
112
|
</Link>
|
|
115
113
|
</div>
|
|
@@ -16,7 +16,7 @@ export const Main = ({ children }: PropsWithChildren) => {
|
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
18
|
<Drawer
|
|
19
|
-
direction={options.
|
|
19
|
+
direction={options.site?.dir === "rtl" ? "right" : "left"}
|
|
20
20
|
open={isDrawerOpen}
|
|
21
21
|
onOpenChange={(open) => setDrawerOpen(open)}
|
|
22
22
|
>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
|
|
2
2
|
import { MenuIcon } from "lucide-react";
|
|
3
|
-
import { useState } from "react";
|
|
3
|
+
import { Fragment, useState } from "react";
|
|
4
|
+
import { Skeleton } from "zudoku/ui/Skeleton.js";
|
|
4
5
|
import { useAuth } from "../authentication/hook.js";
|
|
5
6
|
import {
|
|
6
7
|
Drawer,
|
|
@@ -8,6 +9,7 @@ import {
|
|
|
8
9
|
DrawerTitle,
|
|
9
10
|
DrawerTrigger,
|
|
10
11
|
} from "../ui/Drawer.js";
|
|
12
|
+
import { ClientOnly } from "./ClientOnly.js";
|
|
11
13
|
import { useZudoku } from "./context/ZudokuContext.js";
|
|
12
14
|
import { PoweredByZudoku } from "./navigation/PoweredByZudoku.js";
|
|
13
15
|
import { isHiddenItem } from "./navigation/utils.js";
|
|
@@ -15,18 +17,19 @@ import { PageProgress } from "./PageProgress.js";
|
|
|
15
17
|
import { Search } from "./Search.js";
|
|
16
18
|
import { Slot } from "./Slot.js";
|
|
17
19
|
import { ThemeSwitch } from "./ThemeSwitch.js";
|
|
18
|
-
import { TopNavItem } from "./TopNavigation.js";
|
|
20
|
+
import { TopNavItem, TopNavLink } from "./TopNavigation.js";
|
|
19
21
|
|
|
20
22
|
export const MobileTopNavigation = () => {
|
|
21
|
-
const { navigation, options } = useZudoku();
|
|
22
|
-
const { isAuthenticated } = useAuth();
|
|
23
|
+
const { navigation, options, getProfileMenuItems } = useZudoku();
|
|
24
|
+
const { isAuthenticated, profile, isAuthEnabled, login } = useAuth();
|
|
23
25
|
const [drawerOpen, setDrawerOpen] = useState(false);
|
|
24
26
|
|
|
27
|
+
const accountItems = getProfileMenuItems();
|
|
25
28
|
const filteredItems = navigation.filter(isHiddenItem(isAuthenticated));
|
|
26
29
|
|
|
27
30
|
return (
|
|
28
31
|
<Drawer
|
|
29
|
-
direction={options.
|
|
32
|
+
direction={options.site?.dir === "rtl" ? "left" : "right"}
|
|
30
33
|
open={drawerOpen}
|
|
31
34
|
onOpenChange={(open) => setDrawerOpen(open)}
|
|
32
35
|
>
|
|
@@ -50,9 +53,36 @@ export const MobileTopNavigation = () => {
|
|
|
50
53
|
<li className="empty:hidden">
|
|
51
54
|
<Slot.Target name="top-navigation-side" />
|
|
52
55
|
</li>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
|
|
57
|
+
{isAuthEnabled && (
|
|
58
|
+
<ClientOnly
|
|
59
|
+
fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}
|
|
60
|
+
>
|
|
61
|
+
{!isAuthenticated ? (
|
|
62
|
+
<li>
|
|
63
|
+
<TopNavLink
|
|
64
|
+
to="/signin"
|
|
65
|
+
onClick={() => setDrawerOpen(false)}
|
|
66
|
+
>
|
|
67
|
+
Login
|
|
68
|
+
</TopNavLink>
|
|
69
|
+
</li>
|
|
70
|
+
) : (
|
|
71
|
+
Object.values(getProfileMenuItems()).length > 0 && (
|
|
72
|
+
<Fragment>
|
|
73
|
+
<li>
|
|
74
|
+
{profile?.name ? `${profile.name}` : "My Account"}
|
|
75
|
+
{profile?.email && (
|
|
76
|
+
<div className="font-normal text-muted-foreground">
|
|
77
|
+
{profile.email}
|
|
78
|
+
</div>
|
|
79
|
+
)}
|
|
80
|
+
</li>
|
|
81
|
+
</Fragment>
|
|
82
|
+
)
|
|
83
|
+
)}
|
|
84
|
+
</ClientOnly>
|
|
85
|
+
)}
|
|
56
86
|
{filteredItems.map((item) => (
|
|
57
87
|
<li key={item.label}>
|
|
58
88
|
<button type="button" onClick={() => setDrawerOpen(false)}>
|
|
@@ -60,9 +90,28 @@ export const MobileTopNavigation = () => {
|
|
|
60
90
|
</button>
|
|
61
91
|
</li>
|
|
62
92
|
))}
|
|
93
|
+
{isAuthEnabled && isAuthenticated && accountItems.length > 0 && (
|
|
94
|
+
<ClientOnly
|
|
95
|
+
fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}
|
|
96
|
+
>
|
|
97
|
+
{accountItems.map((i) => (
|
|
98
|
+
<li key={i.label}>
|
|
99
|
+
<TopNavLink
|
|
100
|
+
to={i.path ?? ""}
|
|
101
|
+
onClick={() => setDrawerOpen(false)}
|
|
102
|
+
>
|
|
103
|
+
{i.label}
|
|
104
|
+
</TopNavLink>
|
|
105
|
+
</li>
|
|
106
|
+
))}
|
|
107
|
+
</ClientOnly>
|
|
108
|
+
)}
|
|
109
|
+
<li>
|
|
110
|
+
<ThemeSwitch />
|
|
111
|
+
</li>
|
|
63
112
|
</ul>
|
|
64
113
|
</div>
|
|
65
|
-
{options.
|
|
114
|
+
{options.site?.showPoweredBy !== false && (
|
|
66
115
|
<PoweredByZudoku className="grow-0 justify-center gap-1" />
|
|
67
116
|
)}
|
|
68
117
|
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cx } from "class-variance-authority";
|
|
2
2
|
import { deepEqual } from "fast-equals";
|
|
3
3
|
import { Suspense } from "react";
|
|
4
|
-
import { NavLink } from "react-router";
|
|
4
|
+
import { NavLink, NavLinkProps } from "react-router";
|
|
5
5
|
import { type NavigationItem } from "../../config/validators/NavigationSchema.js";
|
|
6
6
|
import { useAuth } from "../authentication/hook.js";
|
|
7
7
|
import { joinUrl } from "../util/joinUrl.js";
|
|
@@ -62,37 +62,53 @@ const getPathForItem = (item: NavigationItem): string => {
|
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
-
export const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
export const TopNavLink = ({
|
|
66
|
+
isActive,
|
|
67
|
+
children,
|
|
68
|
+
...props
|
|
69
|
+
}: {
|
|
70
|
+
isActive?: boolean;
|
|
71
|
+
children: React.ReactNode;
|
|
72
|
+
} & NavLinkProps) => {
|
|
71
73
|
return (
|
|
72
|
-
// We don't use isActive here because it has to be inside the navigation,
|
|
73
|
-
// the top nav id doesn't necessarily start with the navigation id
|
|
74
74
|
<NavLink
|
|
75
75
|
viewTransition
|
|
76
|
-
to={path}
|
|
77
76
|
className={({ isActive: isActiveNavLink, isPending }) => {
|
|
78
|
-
const
|
|
77
|
+
const isActiveReal = isActiveNavLink || isActive;
|
|
79
78
|
return cx(
|
|
80
79
|
"flex items-center gap-2 lg:py-3.5 font-medium -mb-px transition duration-150 delay-75 relative",
|
|
81
|
-
|
|
80
|
+
isActiveReal || isPending
|
|
82
81
|
? [
|
|
83
82
|
"text-foreground",
|
|
84
83
|
// underline with view transition animation
|
|
85
84
|
"after:content-[''] after:absolute after:bottom-0 after:left-0 after:right-0",
|
|
86
85
|
"after:h-0.5 after:bg-primary",
|
|
87
|
-
|
|
86
|
+
isActiveReal &&
|
|
87
|
+
"after:[view-transition-name:top-nav-underline]",
|
|
88
88
|
isPending && "after:bg-primary/25",
|
|
89
89
|
]
|
|
90
90
|
: "text-foreground/75 hover:text-foreground",
|
|
91
91
|
);
|
|
92
92
|
}}
|
|
93
|
+
{...props}
|
|
93
94
|
>
|
|
95
|
+
{children}
|
|
96
|
+
</NavLink>
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const TopNavItem = (item: NavigationItem) => {
|
|
101
|
+
const currentNav = useCurrentNavigation();
|
|
102
|
+
const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
|
|
103
|
+
|
|
104
|
+
const path = getPathForItem(item);
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
// We don't use isActive here because it has to be inside the navigation,
|
|
108
|
+
// the top nav id doesn't necessarily start with the navigation id
|
|
109
|
+
<TopNavLink to={path} isActive={isActiveTopNavItem}>
|
|
94
110
|
{item.icon && <item.icon size={16} className="align-[-0.125em]" />}
|
|
95
111
|
{item.label}
|
|
96
|
-
</
|
|
112
|
+
</TopNavLink>
|
|
97
113
|
);
|
|
98
114
|
};
|
|
@@ -37,7 +37,7 @@ export const NavigationWrapper = ({
|
|
|
37
37
|
</nav>
|
|
38
38
|
|
|
39
39
|
<div className="bg-background border-t p-2 mx-5 gap-2 items-center mt-2 drop-shadow-[0_-3px_1px_rgba(0,0,0,0.015)] hidden lg:[&:has(>_:nth-child(1):last-child)]:flex">
|
|
40
|
-
{options.
|
|
40
|
+
{options.site?.showPoweredBy !== false && <PoweredByZudoku />}
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
43
43
|
);
|
|
@@ -18,8 +18,10 @@ import {
|
|
|
18
18
|
isAuthenticationPlugin,
|
|
19
19
|
isEventConsumerPlugin,
|
|
20
20
|
isNavigationPlugin,
|
|
21
|
+
isProfileMenuPlugin,
|
|
21
22
|
type NavigationPlugin,
|
|
22
23
|
needsInitialization,
|
|
24
|
+
ProfileNavigationItem,
|
|
23
25
|
type ZudokuPlugin,
|
|
24
26
|
} from "./plugins.js";
|
|
25
27
|
|
|
@@ -54,10 +56,10 @@ type Metadata = Partial<{
|
|
|
54
56
|
publisher: string;
|
|
55
57
|
}>;
|
|
56
58
|
|
|
57
|
-
type
|
|
59
|
+
type Site = Partial<{
|
|
58
60
|
dir?: "ltr" | "rtl";
|
|
59
61
|
showPoweredBy?: boolean;
|
|
60
|
-
|
|
62
|
+
title?: string;
|
|
61
63
|
logo?: {
|
|
62
64
|
src: {
|
|
63
65
|
light: string;
|
|
@@ -78,7 +80,7 @@ export type ZudokuContextOptions = {
|
|
|
78
80
|
basePath?: string;
|
|
79
81
|
canonicalUrlOrigin?: string;
|
|
80
82
|
metadata?: Metadata;
|
|
81
|
-
|
|
83
|
+
site?: Site;
|
|
82
84
|
authentication?: AuthenticationPlugin;
|
|
83
85
|
navigation?: Navigation;
|
|
84
86
|
plugins?: ZudokuPlugin[];
|
|
@@ -102,7 +104,7 @@ export class ZudokuContext {
|
|
|
102
104
|
public plugins: NonNullable<ZudokuContextOptions["plugins"]>;
|
|
103
105
|
public navigation: Navigation;
|
|
104
106
|
public meta: ZudokuContextOptions["metadata"];
|
|
105
|
-
public
|
|
107
|
+
public site: ZudokuContextOptions["site"];
|
|
106
108
|
public readonly authentication?: ZudokuContextOptions["authentication"];
|
|
107
109
|
public readonly queryClient: QueryClient;
|
|
108
110
|
public readonly options: ZudokuContextOptions;
|
|
@@ -123,7 +125,7 @@ export class ZudokuContext {
|
|
|
123
125
|
this.navigationPlugins = this.plugins.filter(isNavigationPlugin);
|
|
124
126
|
this.authentication = this.plugins.find(isAuthenticationPlugin);
|
|
125
127
|
this.meta = options.metadata;
|
|
126
|
-
this.
|
|
128
|
+
this.site = options.site;
|
|
127
129
|
this.plugins.forEach((plugin) => {
|
|
128
130
|
if (!isEventConsumerPlugin(plugin)) return;
|
|
129
131
|
|
|
@@ -182,6 +184,16 @@ export class ZudokuContext {
|
|
|
182
184
|
return navigations.flatMap((nav) => nav ?? []);
|
|
183
185
|
};
|
|
184
186
|
|
|
187
|
+
getProfileMenuItems = () => {
|
|
188
|
+
const accountItems = this.plugins
|
|
189
|
+
.filter((p) => isProfileMenuPlugin(p))
|
|
190
|
+
.flatMap((p) => p.getProfileMenuItems(this))
|
|
191
|
+
.sort(sortByCategory(["top", "middle", "bottom"]))
|
|
192
|
+
.sort((i) => i.weight ?? 0);
|
|
193
|
+
|
|
194
|
+
return accountItems;
|
|
195
|
+
};
|
|
196
|
+
|
|
185
197
|
signRequest = async (request: Request) => {
|
|
186
198
|
if (!this.authentication) {
|
|
187
199
|
throw new Error("No authentication provider configured");
|
|
@@ -190,3 +202,12 @@ export class ZudokuContext {
|
|
|
190
202
|
return await this.authentication.signRequest(request);
|
|
191
203
|
};
|
|
192
204
|
}
|
|
205
|
+
|
|
206
|
+
const sortByCategory =
|
|
207
|
+
(categories: string[]) =>
|
|
208
|
+
(a: ProfileNavigationItem, b: ProfileNavigationItem) => {
|
|
209
|
+
const aIndex = categories.indexOf(a.category ?? "middle");
|
|
210
|
+
const bIndex = categories.indexOf(b.category ?? "middle");
|
|
211
|
+
|
|
212
|
+
return aIndex - bIndex;
|
|
213
|
+
};
|
|
@@ -154,7 +154,7 @@ const createDefaultHandler = (deploymentName: string): ApiKeyService => {
|
|
|
154
154
|
|
|
155
155
|
return data.data.map((consumer) => ({
|
|
156
156
|
id: consumer.id,
|
|
157
|
-
label: consumer.label
|
|
157
|
+
label: consumer.label || consumer.subject || "API Key",
|
|
158
158
|
apiKeys: consumer.apiKeys.data,
|
|
159
159
|
key: consumer.apiKeys.data.at(0),
|
|
160
160
|
}));
|
|
@@ -53,10 +53,11 @@ export const MdxPage = ({
|
|
|
53
53
|
const categoryTitle = useCurrentItem()?.categoryLabel;
|
|
54
54
|
|
|
55
55
|
const title = frontmatter.title;
|
|
56
|
+
const description = frontmatter.description ?? excerpt;
|
|
56
57
|
const category = frontmatter.category ?? categoryTitle;
|
|
57
58
|
const hideToc = frontmatter.toc === false || defaultOptions?.toc === false;
|
|
58
59
|
const pageTitle =
|
|
59
|
-
tableOfContents.find((item) => item.depth === 1)?.value
|
|
60
|
+
title ?? tableOfContents.find((item) => item.depth === 1)?.value;
|
|
60
61
|
const hidePager =
|
|
61
62
|
frontmatter.disable_pager ??
|
|
62
63
|
frontmatter.disablePager ??
|
|
@@ -110,7 +111,7 @@ export const MdxPage = ({
|
|
|
110
111
|
>
|
|
111
112
|
<Helmet>
|
|
112
113
|
<title>{pageTitle}</title>
|
|
113
|
-
{
|
|
114
|
+
{description && <meta name="description" content={description} />}
|
|
114
115
|
</Helmet>
|
|
115
116
|
<Typography className="max-w-full xl:w-full xl:max-w-3xl flex-1 shrink pt-(--padding-content-top)">
|
|
116
117
|
{(category || title) && (
|
|
@@ -243,7 +243,7 @@ export const OperationList = ({
|
|
|
243
243
|
registerNavigationAnchor
|
|
244
244
|
className="mb-0"
|
|
245
245
|
>
|
|
246
|
-
{schema.tag.name ?? "
|
|
246
|
+
{schema.tag.name ?? "Documentation"}
|
|
247
247
|
{showVersions && (
|
|
248
248
|
<span className="text-xl text-muted-foreground ms-1.5">
|
|
249
249
|
{" "}
|
|
@@ -166,7 +166,7 @@ export const openApiPlugin = (config: OasPluginConfig): ZudokuPlugin => {
|
|
|
166
166
|
if (untaggedOperations) {
|
|
167
167
|
categories.push(
|
|
168
168
|
createNavigationCategory({
|
|
169
|
-
label: "Other endpoints",
|
|
169
|
+
label: categories.length === 0 ? "Endpoints" : "Other endpoints",
|
|
170
170
|
path: joinUrl(basePath, versionParam, UNTAGGED_PATH),
|
|
171
171
|
operations: untaggedOperations,
|
|
172
172
|
collapsed: !config.options?.expandAllTags,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MdxPage-Glqk-5sb.js","sources":["../src/lib/plugins/markdown/MdxPage.tsx"],"sourcesContent":["import { useMDXComponents } from \"@mdx-js/react\";\nimport slugify from \"@sindresorhus/slugify\";\nimport { Helmet } from \"@zudoku/react-helmet-async\";\nimport { EditIcon } from \"lucide-react\";\nimport { type PropsWithChildren, useEffect } from \"react\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport { CategoryHeading } from \"../../components/CategoryHeading.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Pagination } from \"../../components/Pagination.js\";\nimport { Typography } from \"../../components/Typography.js\";\nimport { Toc } from \"../../components/navigation/Toc.js\";\nimport {\n useCurrentItem,\n usePrevNext,\n} from \"../../components/navigation/utils.js\";\nimport type { MdxComponentsType } from \"../../util/MdxComponents.js\";\nimport { type MarkdownPluginDefaultOptions, type MDXImport } from \"./index.js\";\n\ndeclare global {\n interface Window {\n __getReactRefreshIgnoredExports?: (args: {\n id: string;\n }) => string[] | undefined;\n }\n}\n\nconst MarkdownHeadings = {\n h2: ({ children, id }) => (\n <Heading level={2} id={id} registerNavigationAnchor>\n {children}\n </Heading>\n ),\n h3: ({ children, id }) => (\n <Heading level={3} id={id} registerNavigationAnchor>\n {children}\n </Heading>\n ),\n} satisfies MdxComponentsType;\n\nexport const MdxPage = ({\n mdxComponent: MdxComponent,\n frontmatter = {},\n defaultOptions,\n __filepath,\n tableOfContents,\n excerpt,\n}: PropsWithChildren<\n Omit<MDXImport, \"default\"> & {\n mdxComponent: MDXImport[\"default\"];\n defaultOptions?: MarkdownPluginDefaultOptions;\n }\n>) => {\n const categoryTitle = useCurrentItem()?.categoryLabel;\n\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.disable_pager ??\n frontmatter.disablePager ??\n defaultOptions?.disablePager ??\n false;\n\n const showLastModified =\n frontmatter.showLastModified ?? defaultOptions?.showLastModified ?? true;\n\n const lastModifiedDate = frontmatter.lastModifiedTime\n ? new Date(frontmatter.lastModifiedTime)\n : null;\n\n const editConfig =\n frontmatter.suggestEdit !== false &&\n (frontmatter.suggestEdit ?? defaultOptions?.suggestEdit);\n\n const editUrl = editConfig\n ? editConfig.url.replaceAll(\"{filePath}\", __filepath)\n : null;\n const editText = editConfig ? editConfig.text || \"Edit this page\" : null;\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 useEffect(() => {\n if (process.env.NODE_ENV === \"development\") {\n window.__getReactRefreshIgnoredExports = ({ id }) => {\n if (!id.endsWith(__filepath)) return;\n\n return [\"frontmatter\", \"tableOfContents\"];\n };\n\n return () => {\n window.__getReactRefreshIgnoredExports = undefined;\n };\n }\n }, [__filepath]);\n\n return (\n <div\n className=\"grid grid-cols-1 xl:grid-cols-(--sidecar-grid-cols) gap-8 justify-between\"\n data-pagefind-filter=\"section:markdown\"\n data-pagefind-meta=\"section:markdown\"\n >\n <Helmet>\n <title>{pageTitle}</title>\n {excerpt && <meta name=\"description\" content={excerpt} />}\n </Helmet>\n <Typography className=\"max-w-full xl:w-full xl:max-w-3xl flex-1 shrink pt-(--padding-content-top)\">\n {(category || title) && (\n <header>\n {category && <CategoryHeading>{category}</CategoryHeading>}\n {title && (\n <Heading level={1} id={slugify(title)}>\n {title}\n </Heading>\n )}\n </header>\n )}\n <MdxComponent\n components={{ ...useMDXComponents(), ...MarkdownHeadings }}\n />\n <div className=\"h-16\" />\n {(showLastModified && lastModifiedDate) || editUrl ? (\n <div className=\"flex justify-between text-xs text-muted-foreground \">\n <div />\n <div className=\"flex items-center gap-2\">\n <div>\n {editUrl && (\n <Button asChild variant=\"ghost\" size=\"sm\">\n <a\n href={editUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1\"\n >\n <EditIcon size={12} />\n {editText}\n </a>\n </Button>\n )}\n </div>\n <div>\n {showLastModified && lastModifiedDate && (\n <div\n title={lastModifiedDate.toLocaleString(undefined, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n })}\n >\n Last modified on{\" \"}\n <time dateTime={lastModifiedDate.toISOString()}>\n {lastModifiedDate.toLocaleDateString(undefined, {\n dateStyle: \"long\",\n })}\n </time>\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n {!hidePager && (\n <>\n <div className=\"h-px bg-border mt-2 mb-6\" />\n <Pagination\n prev={prev ? { to: prev.id, label: prev.label } : undefined}\n next={next ? { to: next.id, label: next.label } : undefined}\n className=\"mb-10\"\n />\n </>\n )}\n </Typography>\n <div className=\"hidden xl:block\">\n {showToc && <Toc entries={tocEntries} />}\n </div>\n </div>\n );\n};\n"],"names":["MarkdownHeadings","children","id","jsx","Heading","MdxPage","MdxComponent","frontmatter","defaultOptions","__filepath","tableOfContents","excerpt","categoryTitle","useCurrentItem","title","category","hideToc","pageTitle","item","hidePager","showLastModified","lastModifiedDate","editConfig","editUrl","editText","tocEntries","showToc","prev","next","usePrevNext","useEffect","jsxs","Helmet","Typography","CategoryHeading","slugify","useMDXComponents","Button","EditIcon","Fragment","Pagination","Toc"],"mappings":"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"}
|
package/lib/SignUp-M9Jz4SXJ.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { j as e } from "./jsx-runtime-C5mzlN2N.js";
|
|
2
|
-
import { useEffect as n } from "react";
|
|
3
|
-
import { b as m, L as x, a as h } from "./chunk-DQRVZFIR-DHK7_Ilc.js";
|
|
4
|
-
import { B as r } from "./Button-BE9IVkWV.js";
|
|
5
|
-
import { C as o, a as c, b as l, c as d, d as u } from "./Card-DPhGbYUM.js";
|
|
6
|
-
import { d as s } from "./hook-Bd0yS8M0.js";
|
|
7
|
-
import { B as a, L as g } from "./index-Chtnw-sn.js";
|
|
8
|
-
const S = () => {
|
|
9
|
-
const t = s(), [i] = m();
|
|
10
|
-
return n(() => {
|
|
11
|
-
t.authentication?.signIn({
|
|
12
|
-
redirectTo: i.get("redirect") ?? void 0
|
|
13
|
-
});
|
|
14
|
-
}, [t.authentication, i]), /* @__PURE__ */ e.jsx("div", { className: "flex items-center justify-center mt-8", children: /* @__PURE__ */ e.jsxs(o, { className: "max-w-md w-full", children: [
|
|
15
|
-
/* @__PURE__ */ e.jsxs(c, { children: [
|
|
16
|
-
/* @__PURE__ */ e.jsx(l, { className: "text-lg", children: "Sign in" }),
|
|
17
|
-
/* @__PURE__ */ e.jsx(d, { children: "You're being redirected to our secure login provider to complete your sign-in process." })
|
|
18
|
-
] }),
|
|
19
|
-
/* @__PURE__ */ e.jsx(u, { children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-2 justify-center", children: [
|
|
20
|
-
/* @__PURE__ */ e.jsx(
|
|
21
|
-
r,
|
|
22
|
-
{
|
|
23
|
-
onClick: () => t.authentication?.signIn(),
|
|
24
|
-
variant: "default",
|
|
25
|
-
children: "Login"
|
|
26
|
-
}
|
|
27
|
-
),
|
|
28
|
-
/* @__PURE__ */ e.jsx(r, { variant: "link", className: "text-muted-foreground", asChild: !0, children: /* @__PURE__ */ e.jsx(x, { to: "/", children: "Go home" }) })
|
|
29
|
-
] }) })
|
|
30
|
-
] }) });
|
|
31
|
-
}, y = () => {
|
|
32
|
-
const t = s(), i = h();
|
|
33
|
-
return n(() => {
|
|
34
|
-
t.authentication?.signOut().then(() => i("/"));
|
|
35
|
-
}, []), null;
|
|
36
|
-
}, b = () => {
|
|
37
|
-
const t = s();
|
|
38
|
-
return n(() => {
|
|
39
|
-
t.authentication?.signUp() ?? t.authentication?.signIn();
|
|
40
|
-
}, [t.authentication]), /* @__PURE__ */ e.jsx("div", { className: "flex items-center justify-center mt-8", children: /* @__PURE__ */ e.jsxs(o, { className: "max-w-md w-full", children: [
|
|
41
|
-
/* @__PURE__ */ e.jsxs(c, { children: [
|
|
42
|
-
/* @__PURE__ */ e.jsx(l, { className: "text-lg", children: "Sign up" }),
|
|
43
|
-
/* @__PURE__ */ e.jsx(d, { children: "You're being redirected to our secure login provider to complete your sign up process." })
|
|
44
|
-
] }),
|
|
45
|
-
/* @__PURE__ */ e.jsx(u, { children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-2 justify-center", children: [
|
|
46
|
-
/* @__PURE__ */ e.jsx(
|
|
47
|
-
a,
|
|
48
|
-
{
|
|
49
|
-
onClick: () => t.authentication?.signIn(),
|
|
50
|
-
variant: "default",
|
|
51
|
-
children: "Register"
|
|
52
|
-
}
|
|
53
|
-
),
|
|
54
|
-
/* @__PURE__ */ e.jsx(a, { variant: "link", className: "text-muted-foreground", asChild: !0, children: /* @__PURE__ */ e.jsx(g, { to: "/", children: "Go home" }) })
|
|
55
|
-
] }) })
|
|
56
|
-
] }) });
|
|
57
|
-
};
|
|
58
|
-
export {
|
|
59
|
-
y as S,
|
|
60
|
-
S as a,
|
|
61
|
-
b
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=SignUp-M9Jz4SXJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SignUp-M9Jz4SXJ.js","sources":["../src/lib/authentication/components/SignIn.tsx","../src/lib/authentication/components/SignOut.tsx","../src/lib/authentication/components/SignUp.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { Link, useSearchParams } from \"react-router\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"zudoku/ui/Card.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\n\nexport const SignIn = () => {\n const context = useZudoku();\n const [search] = useSearchParams();\n useEffect(() => {\n void context.authentication?.signIn({\n redirectTo: search.get(\"redirect\") ?? undefined,\n });\n }, [context.authentication, search]);\n\n return (\n <div className=\"flex items-center justify-center mt-8\">\n <Card className=\"max-w-md w-full\">\n <CardHeader>\n <CardTitle className=\"text-lg\">Sign in</CardTitle>\n <CardDescription>\n You're being redirected to our secure login provider to complete\n your sign-in process.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-col gap-2 justify-center\">\n <Button\n onClick={() => context.authentication?.signIn()}\n variant=\"default\"\n >\n Login\n </Button>\n <Button variant=\"link\" className=\"text-muted-foreground\" asChild>\n <Link to=\"/\">Go home</Link>\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n};\n","import { useEffect } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\n\nexport const SignOut = () => {\n const context = useZudoku();\n const navigate = useNavigate();\n\n useEffect(() => {\n void context.authentication?.signOut().then(() => navigate(\"/\"));\n }, []);\n\n return null;\n};\n","import { useEffect } from \"react\";\nimport { Button, Link } from \"zudoku/components\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"zudoku/ui/Card.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\n\nexport const SignUp = () => {\n const context = useZudoku();\n\n useEffect(() => {\n void (context.authentication?.signUp() ?? context.authentication?.signIn());\n }, [context.authentication]);\n\n return (\n <div className=\"flex items-center justify-center mt-8\">\n <Card className=\"max-w-md w-full\">\n <CardHeader>\n <CardTitle className=\"text-lg\">Sign up</CardTitle>\n <CardDescription>\n You're being redirected to our secure login provider to complete\n your sign up process.\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-col gap-2 justify-center\">\n <Button\n onClick={() => context.authentication?.signIn()}\n variant=\"default\"\n >\n Register\n </Button>\n <Button variant=\"link\" className=\"text-muted-foreground\" asChild>\n <Link to=\"/\">Go home</Link>\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n};\n"],"names":["SignIn","context","useZudoku","search","useSearchParams","useEffect","jsxs","Card","CardHeader","jsx","CardTitle","CardDescription","CardContent","Button","Link","SignOut","navigate","useNavigate","SignUp"],"mappings":";;;;;;;AAYO,MAAMA,IAAS,MAAM;AAC1B,QAAMC,IAAUC,EAAU,GACpB,CAACC,CAAM,IAAIC,EAAgB;AACjC,SAAAC,EAAU,MAAM;AACT,IAAAJ,EAAQ,gBAAgB,OAAO;AAAA,MAClC,YAAYE,EAAO,IAAI,UAAU,KAAK;AAAA,IAAA,CACvC;AAAA,EACA,GAAA,CAACF,EAAQ,gBAAgBE,CAAM,CAAC,yBAGhC,OAAI,EAAA,WAAU,yCACb,UAACG,gBAAAA,EAAA,KAAAC,GAAA,EAAK,WAAU,mBACd,UAAA;AAAA,IAAAD,gBAAAA,OAACE,GACC,EAAA,UAAA;AAAA,MAACC,gBAAAA,EAAA,IAAAC,GAAA,EAAU,WAAU,WAAU,UAAO,WAAA;AAAA,MACtCD,gBAAAA,EAAAA,IAACE,KAAgB,UAGjB,yFAAA,CAAA;AAAA,IAAA,GACF;AAAA,IACCF,gBAAAA,MAAAG,GAAA,EACC,UAACN,gBAAAA,EAAAA,KAAA,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,MAAAG,gBAAAA,EAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,SAAS,MAAMZ,EAAQ,gBAAgB,OAAO;AAAA,UAC9C,SAAQ;AAAA,UACT,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,MACCQ,gBAAAA,EAAA,IAAAI,GAAA,EAAO,SAAQ,QAAO,WAAU,yBAAwB,SAAO,IAC9D,UAACJ,gBAAAA,EAAAA,IAAAK,GAAA,EAAK,IAAG,KAAI,qBAAO,EACtB,CAAA;AAAA,IAAA,EAAA,CACF,EACF,CAAA;AAAA,EAAA,EAAA,CACF,EACF,CAAA;AAEJ,GC3CaC,IAAU,MAAM;AAC3B,QAAMd,IAAUC,EAAU,GACpBc,IAAWC,EAAY;AAE7B,SAAAZ,EAAU,MAAM;AACT,IAAAJ,EAAQ,gBAAgB,QAAQ,EAAE,KAAK,MAAMe,EAAS,GAAG,CAAC;AAAA,EACjE,GAAG,EAAE,GAEE;AACT,GCFaE,IAAS,MAAM;AAC1B,QAAMjB,IAAUC,EAAU;AAE1B,SAAAG,EAAU,MAAM;AACd,IAAMJ,EAAQ,gBAAgB,OAAA,KAAYA,EAAQ,gBAAgB;EAAO,GACxE,CAACA,EAAQ,cAAc,CAAC,yBAGxB,OAAI,EAAA,WAAU,yCACb,UAACK,gBAAAA,EAAA,KAAAC,GAAA,EAAK,WAAU,mBACd,UAAA;AAAA,IAAAD,gBAAAA,OAACE,GACC,EAAA,UAAA;AAAA,MAACC,gBAAAA,EAAA,IAAAC,GAAA,EAAU,WAAU,WAAU,UAAO,WAAA;AAAA,MACtCD,gBAAAA,EAAAA,IAACE,KAAgB,UAGjB,yFAAA,CAAA;AAAA,IAAA,GACF;AAAA,IACCF,gBAAAA,MAAAG,GAAA,EACC,UAACN,gBAAAA,EAAAA,KAAA,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,MAAAG,gBAAAA,EAAA;AAAA,QAACI;AAAAA,QAAA;AAAA,UACC,SAAS,MAAMZ,EAAQ,gBAAgB,OAAO;AAAA,UAC9C,SAAQ;AAAA,UACT,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,MACCQ,gBAAAA,EAAA,IAAAI,GAAA,EAAO,SAAQ,QAAO,WAAU,yBAAwB,SAAO,IAC9D,UAACJ,gBAAAA,EAAAA,IAAAK,GAAA,EAAK,IAAG,KAAI,qBAAO,EACtB,CAAA;AAAA,IAAA,EAAA,CACF,EACF,CAAA;AAAA,EAAA,EAAA,CACF,EACF,CAAA;AAEJ;"}
|