@lukoweb/apitogo 0.1.0 → 0.1.2
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/cli/cli.js +37 -147
- package/dist/declarations/lib/ui/Command.d.ts +1 -1
- package/dist/declarations/lib/util/MdxComponents.d.ts +1 -1
- package/package.json +1 -1
- package/src/app/main.tsx +150 -150
- package/src/config/loader.ts +245 -245
- package/src/index.ts +33 -33
- package/src/lib/authentication/components/CallbackHandler.tsx +45 -45
- package/src/lib/authentication/components/SignIn.tsx +46 -46
- package/src/lib/authentication/components/SignUp.tsx +48 -48
- package/src/lib/authentication/providers/clerk.tsx +224 -224
- package/src/lib/authentication/ui/AuthCard.tsx +7 -7
- package/src/lib/authentication/ui/EmailLinkCallbackUi.tsx +129 -125
- package/src/lib/authentication/ui/EmailLinkSentUi.tsx +105 -101
- package/src/lib/authentication/ui/EmailLinkSignInUi.tsx +100 -96
- package/src/lib/authentication/ui/EmailVerificationUi.tsx +128 -124
- package/src/lib/authentication/ui/ZudokuAuthUi.tsx +620 -616
- package/src/lib/components/AiAssistantMenuItems.tsx +102 -102
- package/src/lib/components/Autocomplete.tsx +123 -123
- package/src/lib/components/DeveloperHint.tsx +39 -35
- package/src/lib/components/Header.tsx +260 -260
- package/src/lib/components/Layout.tsx +53 -53
- package/src/lib/components/Main.tsx +51 -51
- package/src/lib/components/Mermaid.tsx +74 -70
- package/src/lib/components/MobileTopNavigation.tsx +276 -276
- package/src/lib/components/MultiSelect.tsx +86 -82
- package/src/lib/components/TopNavigation.tsx +103 -103
- package/src/lib/components/index.ts +26 -26
- package/src/lib/components/navigation/NavigationCategory.tsx +157 -157
- package/src/lib/components/navigation/NavigationFilterInput.tsx +35 -35
- package/src/lib/components/navigation/NavigationItem.tsx +181 -177
- package/src/lib/core/RouteGuard.tsx +193 -193
- package/src/lib/errors/ErrorMessage.tsx +50 -46
- package/src/lib/plugins/api-catalog/Catalog.tsx +80 -80
- package/src/lib/plugins/api-keys/CreateApiKey.tsx +128 -124
- package/src/lib/plugins/api-keys/CreateApiKeyDialog.tsx +49 -49
- package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +72 -72
- package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -342
- package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +127 -127
- package/src/lib/plugins/markdown/MdxPage.tsx +285 -285
- package/src/lib/plugins/openapi/ApiHeader.tsx +96 -96
- package/src/lib/plugins/openapi/CollapsibleCode.tsx +88 -88
- package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +94 -94
- package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +52 -52
- package/src/lib/plugins/openapi/OperationListItem.tsx +183 -183
- package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +63 -63
- package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +120 -117
- package/src/lib/plugins/openapi/SchemaInfo.tsx +344 -344
- package/src/lib/plugins/openapi/SchemaList.tsx +113 -113
- package/src/lib/plugins/openapi/Sidecar.tsx +312 -309
- package/src/lib/plugins/openapi/SidecarExamples.tsx +177 -174
- package/src/lib/plugins/openapi/components/EnumValues.tsx +58 -58
- package/src/lib/plugins/openapi/components/ResponseContent.tsx +117 -114
- package/src/lib/plugins/openapi/playground/BodyPanel.tsx +274 -271
- package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +51 -51
- package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +60 -60
- package/src/lib/plugins/openapi/playground/Headers.tsx +188 -181
- package/src/lib/plugins/openapi/playground/IdentityDialog.tsx +75 -75
- package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +38 -38
- package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +45 -45
- package/src/lib/plugins/openapi/playground/Playground.tsx +602 -599
- package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +56 -56
- package/src/lib/plugins/openapi/playground/QueryParams.tsx +151 -148
- package/src/lib/plugins/openapi/playground/RequestLoginDialog.tsx +70 -70
- package/src/lib/plugins/openapi/playground/request-panel/MultipartField.tsx +91 -91
- package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +50 -50
- package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +355 -355
- package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +106 -102
- package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +189 -184
- package/src/lib/plugins/openapi/schema/SchemaView.tsx +299 -299
- package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +162 -162
- package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +202 -202
- package/src/lib/plugins/search-pagefind/ResultList.tsx +122 -118
- package/src/lib/ui/ActionButton.tsx +21 -21
- package/src/lib/ui/Command.tsx +191 -191
- package/src/lib/util/MdxComponents.tsx +150 -150
- package/src/vite/config.ts +234 -231
- package/src/vite/dev-server.ts +291 -291
- package/src/vite/plugin-api-keys.ts +50 -50
- package/src/vite/plugin-api.ts +320 -318
- package/src/vite/plugin-auth.ts +38 -38
- package/src/vite/plugin-component.ts +45 -39
- package/src/vite/plugin-config.ts +75 -75
- package/src/vite/plugin-custom-pages.ts +36 -36
- package/src/vite/plugin-docs.ts +202 -202
- package/src/vite/plugin-markdown-export.ts +214 -214
- package/src/vite/plugin-mdx.ts +149 -149
- package/src/vite/plugin-navigation.ts +106 -106
- package/src/vite/plugin-search.ts +47 -47
- package/src/vite/plugin.ts +42 -42
- package/src/vite/prerender/prerender.ts +233 -233
|
@@ -1,82 +1,86 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
1
|
+
import {
|
|
2
|
+
Popover,
|
|
3
|
+
PopoverContent,
|
|
4
|
+
PopoverTrigger,
|
|
5
|
+
} from "@lukoweb/apitogo/ui/Popover.js";
|
|
6
|
+
import { CheckIcon, ChevronDownIcon } from "lucide-react";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { cn } from "../util/cn.js";
|
|
9
|
+
|
|
10
|
+
type MultiSelectProps = {
|
|
11
|
+
options: readonly string[];
|
|
12
|
+
value: string[];
|
|
13
|
+
onChange: (value: string[]) => void;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const MultiSelect = ({
|
|
19
|
+
options,
|
|
20
|
+
value,
|
|
21
|
+
onChange,
|
|
22
|
+
placeholder = "Select values...",
|
|
23
|
+
className,
|
|
24
|
+
}: MultiSelectProps) => {
|
|
25
|
+
const [open, setOpen] = useState(false);
|
|
26
|
+
|
|
27
|
+
const toggleValue = (option: string) => {
|
|
28
|
+
if (value.includes(option)) {
|
|
29
|
+
onChange(value.filter((v) => v !== option));
|
|
30
|
+
} else {
|
|
31
|
+
onChange([...value, option]);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Popover open={open} onOpenChange={setOpen}>
|
|
37
|
+
<PopoverTrigger asChild>
|
|
38
|
+
<button
|
|
39
|
+
type="button"
|
|
40
|
+
className={cn(
|
|
41
|
+
"flex items-center justify-between w-full h-9 bg-transparent text-xs font-mono text-left truncate",
|
|
42
|
+
!value.length && "text-muted-foreground",
|
|
43
|
+
className,
|
|
44
|
+
)}
|
|
45
|
+
>
|
|
46
|
+
<span className="truncate">
|
|
47
|
+
{value.length > 0 ? value.join(", ") : placeholder}
|
|
48
|
+
</span>
|
|
49
|
+
<ChevronDownIcon className="size-3.5 shrink-0 opacity-50" />
|
|
50
|
+
</button>
|
|
51
|
+
</PopoverTrigger>
|
|
52
|
+
<PopoverContent
|
|
53
|
+
className="p-1 w-(--radix-popover-trigger-width)"
|
|
54
|
+
align="start"
|
|
55
|
+
side="bottom"
|
|
56
|
+
onWheel={(e) => e.stopPropagation()}
|
|
57
|
+
onTouchMove={(e) => e.stopPropagation()}
|
|
58
|
+
>
|
|
59
|
+
<div className="max-h-[140px] overflow-y-auto">
|
|
60
|
+
{options.map((option) => {
|
|
61
|
+
const isSelected = value.includes(option);
|
|
62
|
+
return (
|
|
63
|
+
<button
|
|
64
|
+
key={option}
|
|
65
|
+
type="button"
|
|
66
|
+
className="flex items-center gap-2 w-full rounded-xs px-2 py-1.5 text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground"
|
|
67
|
+
onClick={() => toggleValue(option)}
|
|
68
|
+
>
|
|
69
|
+
<span
|
|
70
|
+
className={cn(
|
|
71
|
+
"flex size-4 shrink-0 items-center justify-center rounded-[4px] border",
|
|
72
|
+
isSelected &&
|
|
73
|
+
"bg-primary border-primary text-primary-foreground",
|
|
74
|
+
)}
|
|
75
|
+
>
|
|
76
|
+
{isSelected && <CheckIcon className="size-3" />}
|
|
77
|
+
</span>
|
|
78
|
+
<span className="truncate font-mono text-xs">{option}</span>
|
|
79
|
+
</button>
|
|
80
|
+
);
|
|
81
|
+
})}
|
|
82
|
+
</div>
|
|
83
|
+
</PopoverContent>
|
|
84
|
+
</Popover>
|
|
85
|
+
);
|
|
86
|
+
};
|
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import type { NavigationItem } from "../../config/validators/NavigationSchema.js";
|
|
7
|
-
import { useAuth } from "../authentication/hook.js";
|
|
8
|
-
import { useCurrentNavigation, useZudoku } from "./context/ZudokuContext.js";
|
|
9
|
-
import { getFirstMatchingPath, shouldShowItem } from "./navigation/utils.js";
|
|
10
|
-
import { Slot } from "./Slot.js";
|
|
11
|
-
|
|
12
|
-
export const TopNavigation = () => {
|
|
13
|
-
const context = useZudoku();
|
|
14
|
-
const {
|
|
15
|
-
options: { navigation = [] },
|
|
16
|
-
} = context;
|
|
17
|
-
const auth = useAuth();
|
|
18
|
-
const filteredItems = navigation.filter(shouldShowItem({ auth, context }));
|
|
19
|
-
|
|
20
|
-
if (filteredItems.length === 0 || import.meta.env.MODE === "standalone") {
|
|
21
|
-
return <style>{`:root { --top-nav-height: 0px; }`}</style>;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<Suspense>
|
|
26
|
-
<div className="items-center justify-between px-8 h-(--top-nav-height) hidden lg:flex text-sm relative">
|
|
27
|
-
<nav className="text-sm">
|
|
28
|
-
<ul className="flex flex-row items-center gap-8">
|
|
29
|
-
{filteredItems.map((item) =>
|
|
30
|
-
item.type === "separator" ? (
|
|
31
|
-
<li key={item.label} className="-mx-4 h-7">
|
|
32
|
-
<Separator orientation="vertical" />
|
|
33
|
-
</li>
|
|
34
|
-
) : item.type !== "section" && item.type !== "filter" ? (
|
|
35
|
-
<li key={item.label + item.type}>
|
|
36
|
-
<TopNavItem {...item} />
|
|
37
|
-
</li>
|
|
38
|
-
) : null,
|
|
39
|
-
)}
|
|
40
|
-
</ul>
|
|
41
|
-
</nav>
|
|
42
|
-
<Slot.Target name="top-navigation-side" />
|
|
43
|
-
</div>
|
|
44
|
-
{/* <PageProgress /> */}
|
|
45
|
-
</Suspense>
|
|
46
|
-
);
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export const TopNavLink = ({
|
|
50
|
-
isActive,
|
|
51
|
-
children,
|
|
52
|
-
...props
|
|
53
|
-
}: {
|
|
54
|
-
isActive?: boolean;
|
|
55
|
-
children: React.ReactNode;
|
|
56
|
-
} & NavLinkProps) => {
|
|
57
|
-
return (
|
|
58
|
-
<NavLink
|
|
59
|
-
viewTransition
|
|
60
|
-
className={({ isActive: isActiveNavLink, isPending }) => {
|
|
61
|
-
const isActiveReal = isActiveNavLink || isActive;
|
|
62
|
-
return cx(
|
|
63
|
-
"flex items-center gap-2 lg:py-3.5 font-medium -mb-px transition duration-150 delay-75 relative",
|
|
64
|
-
isActiveReal || isPending
|
|
65
|
-
? [
|
|
66
|
-
"text-foreground",
|
|
67
|
-
// underline with view transition animation
|
|
68
|
-
"after:content-[''] after:absolute after:bottom-0 after:left-0 after:right-0",
|
|
69
|
-
"after:h-0.5 after:bg-primary",
|
|
70
|
-
isActiveReal &&
|
|
71
|
-
"after:[view-transition-name:top-nav-underline]",
|
|
72
|
-
isPending && "after:bg-primary/25",
|
|
73
|
-
]
|
|
74
|
-
: "text-foreground/75 hover:text-foreground",
|
|
75
|
-
);
|
|
76
|
-
}}
|
|
77
|
-
{...props}
|
|
78
|
-
>
|
|
79
|
-
{children}
|
|
80
|
-
</NavLink>
|
|
81
|
-
);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export const TopNavItem = (
|
|
85
|
-
item: Exclude<
|
|
86
|
-
NavigationItem,
|
|
87
|
-
{ type: "separator" } | { type: "section" } | { type: "filter" }
|
|
88
|
-
>,
|
|
89
|
-
) => {
|
|
90
|
-
const currentNav = useCurrentNavigation();
|
|
91
|
-
const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
|
|
92
|
-
|
|
93
|
-
const path = getFirstMatchingPath(item);
|
|
94
|
-
|
|
95
|
-
return (
|
|
96
|
-
// We don't use isActive here because it has to be inside the navigation,
|
|
97
|
-
// the top nav id doesn't necessarily start with the navigation id
|
|
98
|
-
<TopNavLink to={path} isActive={isActiveTopNavItem}>
|
|
99
|
-
{item.icon && <item.icon size={16} className="align-[-0.125em]" />}
|
|
100
|
-
{item.label}
|
|
101
|
-
</TopNavLink>
|
|
102
|
-
);
|
|
103
|
-
};
|
|
1
|
+
import { Separator } from "@lukoweb/apitogo/ui/Separator.js";
|
|
2
|
+
import { cx } from "class-variance-authority";
|
|
3
|
+
import { deepEqual } from "fast-equals";
|
|
4
|
+
import { Suspense } from "react";
|
|
5
|
+
import { NavLink, type NavLinkProps } from "react-router";
|
|
6
|
+
import type { NavigationItem } from "../../config/validators/NavigationSchema.js";
|
|
7
|
+
import { useAuth } from "../authentication/hook.js";
|
|
8
|
+
import { useCurrentNavigation, useZudoku } from "./context/ZudokuContext.js";
|
|
9
|
+
import { getFirstMatchingPath, shouldShowItem } from "./navigation/utils.js";
|
|
10
|
+
import { Slot } from "./Slot.js";
|
|
11
|
+
|
|
12
|
+
export const TopNavigation = () => {
|
|
13
|
+
const context = useZudoku();
|
|
14
|
+
const {
|
|
15
|
+
options: { navigation = [] },
|
|
16
|
+
} = context;
|
|
17
|
+
const auth = useAuth();
|
|
18
|
+
const filteredItems = navigation.filter(shouldShowItem({ auth, context }));
|
|
19
|
+
|
|
20
|
+
if (filteredItems.length === 0 || import.meta.env.MODE === "standalone") {
|
|
21
|
+
return <style>{`:root { --top-nav-height: 0px; }`}</style>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Suspense>
|
|
26
|
+
<div className="items-center justify-between px-8 h-(--top-nav-height) hidden lg:flex text-sm relative">
|
|
27
|
+
<nav className="text-sm">
|
|
28
|
+
<ul className="flex flex-row items-center gap-8">
|
|
29
|
+
{filteredItems.map((item) =>
|
|
30
|
+
item.type === "separator" ? (
|
|
31
|
+
<li key={item.label} className="-mx-4 h-7">
|
|
32
|
+
<Separator orientation="vertical" />
|
|
33
|
+
</li>
|
|
34
|
+
) : item.type !== "section" && item.type !== "filter" ? (
|
|
35
|
+
<li key={item.label + item.type}>
|
|
36
|
+
<TopNavItem {...item} />
|
|
37
|
+
</li>
|
|
38
|
+
) : null,
|
|
39
|
+
)}
|
|
40
|
+
</ul>
|
|
41
|
+
</nav>
|
|
42
|
+
<Slot.Target name="top-navigation-side" />
|
|
43
|
+
</div>
|
|
44
|
+
{/* <PageProgress /> */}
|
|
45
|
+
</Suspense>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const TopNavLink = ({
|
|
50
|
+
isActive,
|
|
51
|
+
children,
|
|
52
|
+
...props
|
|
53
|
+
}: {
|
|
54
|
+
isActive?: boolean;
|
|
55
|
+
children: React.ReactNode;
|
|
56
|
+
} & NavLinkProps) => {
|
|
57
|
+
return (
|
|
58
|
+
<NavLink
|
|
59
|
+
viewTransition
|
|
60
|
+
className={({ isActive: isActiveNavLink, isPending }) => {
|
|
61
|
+
const isActiveReal = isActiveNavLink || isActive;
|
|
62
|
+
return cx(
|
|
63
|
+
"flex items-center gap-2 lg:py-3.5 font-medium -mb-px transition duration-150 delay-75 relative",
|
|
64
|
+
isActiveReal || isPending
|
|
65
|
+
? [
|
|
66
|
+
"text-foreground",
|
|
67
|
+
// underline with view transition animation
|
|
68
|
+
"after:content-[''] after:absolute after:bottom-0 after:left-0 after:right-0",
|
|
69
|
+
"after:h-0.5 after:bg-primary",
|
|
70
|
+
isActiveReal &&
|
|
71
|
+
"after:[view-transition-name:top-nav-underline]",
|
|
72
|
+
isPending && "after:bg-primary/25",
|
|
73
|
+
]
|
|
74
|
+
: "text-foreground/75 hover:text-foreground",
|
|
75
|
+
);
|
|
76
|
+
}}
|
|
77
|
+
{...props}
|
|
78
|
+
>
|
|
79
|
+
{children}
|
|
80
|
+
</NavLink>
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const TopNavItem = (
|
|
85
|
+
item: Exclude<
|
|
86
|
+
NavigationItem,
|
|
87
|
+
{ type: "separator" } | { type: "section" } | { type: "filter" }
|
|
88
|
+
>,
|
|
89
|
+
) => {
|
|
90
|
+
const currentNav = useCurrentNavigation();
|
|
91
|
+
const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
|
|
92
|
+
|
|
93
|
+
const path = getFirstMatchingPath(item);
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
// We don't use isActive here because it has to be inside the navigation,
|
|
97
|
+
// the top nav id doesn't necessarily start with the navigation id
|
|
98
|
+
<TopNavLink to={path} isActive={isActiveTopNavItem}>
|
|
99
|
+
{item.icon && <item.icon size={16} className="align-[-0.125em]" />}
|
|
100
|
+
{item.label}
|
|
101
|
+
</TopNavLink>
|
|
102
|
+
);
|
|
103
|
+
};
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
export { Helmet as Head } from "@zudoku/react-helmet-async";
|
|
2
|
-
export { Link } from "react-router";
|
|
3
|
-
export { Button } from "../ui/Button.js";
|
|
4
|
-
export { Callout } from "../ui/Callout.js";
|
|
5
|
-
export { ZudokuError } from "../util/invariant.js";
|
|
6
|
-
export { ClientOnly } from "./ClientOnly.js";
|
|
7
|
-
export { Heading } from "./Heading.js";
|
|
8
|
-
export { Markdown } from "./Markdown.js";
|
|
9
|
-
export { Search } from "./Search.js";
|
|
10
|
-
export { type CustomSlotNames, Slot } from "./Slot.js";
|
|
11
|
-
export { Spinner } from "./Spinner.js";
|
|
12
|
-
export { Typography } from "./Typography.js";
|
|
13
|
-
export { Zudoku } from "./Zudoku.js";
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
/** @deprecated Import from `apitogo/hooks` instead */
|
|
18
|
-
export { useMDXComponents } from "@mdx-js/react";
|
|
19
|
-
/** @deprecated Import from `apitogo/hooks` instead */
|
|
20
|
-
export { useTheme } from "next-themes";
|
|
21
|
-
/** @deprecated Import from `apitogo/hooks` instead */
|
|
22
|
-
export { useAuth } from "../authentication/hook.js";
|
|
23
|
-
/** @deprecated Import from `apitogo/hooks` instead */
|
|
24
|
-
export { CACHE_KEYS, useCache } from "./cache.js";
|
|
25
|
-
/** @deprecated Import from `apitogo/hooks` instead */
|
|
26
|
-
export { useZudoku } from "./context/ZudokuContext.js";
|
|
1
|
+
export { Helmet as Head } from "@zudoku/react-helmet-async";
|
|
2
|
+
export { Link } from "react-router";
|
|
3
|
+
export { Button } from "../ui/Button.js";
|
|
4
|
+
export { Callout } from "../ui/Callout.js";
|
|
5
|
+
export { ZudokuError } from "../util/invariant.js";
|
|
6
|
+
export { ClientOnly } from "./ClientOnly.js";
|
|
7
|
+
export { Heading } from "./Heading.js";
|
|
8
|
+
export { Markdown } from "./Markdown.js";
|
|
9
|
+
export { Search } from "./Search.js";
|
|
10
|
+
export { type CustomSlotNames, Slot } from "./Slot.js";
|
|
11
|
+
export { Spinner } from "./Spinner.js";
|
|
12
|
+
export { Typography } from "./Typography.js";
|
|
13
|
+
export { Zudoku } from "./Zudoku.js";
|
|
14
|
+
|
|
15
|
+
//
|
|
16
|
+
|
|
17
|
+
/** @deprecated Import from `apitogo/hooks` instead */
|
|
18
|
+
export { useMDXComponents } from "@mdx-js/react";
|
|
19
|
+
/** @deprecated Import from `apitogo/hooks` instead */
|
|
20
|
+
export { useTheme } from "next-themes";
|
|
21
|
+
/** @deprecated Import from `apitogo/hooks` instead */
|
|
22
|
+
export { useAuth } from "../authentication/hook.js";
|
|
23
|
+
/** @deprecated Import from `apitogo/hooks` instead */
|
|
24
|
+
export { CACHE_KEYS, useCache } from "./cache.js";
|
|
25
|
+
/** @deprecated Import from `apitogo/hooks` instead */
|
|
26
|
+
export { useZudoku } from "./context/ZudokuContext.js";
|