zudoku 0.53.0 → 0.53.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.
Files changed (91) hide show
  1. package/README.md +2 -2
  2. package/dist/app/demo.js +16 -1
  3. package/dist/app/demo.js.map +1 -1
  4. package/dist/cli/build/handler.js +9 -1
  5. package/dist/cli/build/handler.js.map +1 -1
  6. package/dist/config/loader.js +2 -5
  7. package/dist/config/loader.js.map +1 -1
  8. package/dist/config/validators/BuildSchema.js +5 -0
  9. package/dist/config/validators/BuildSchema.js.map +1 -1
  10. package/dist/config/validators/validate.d.ts +1 -1
  11. package/dist/config/validators/validate.js +11 -2
  12. package/dist/config/validators/validate.js.map +1 -1
  13. package/dist/config/validators/validate.test.js +65 -2
  14. package/dist/config/validators/validate.test.js.map +1 -1
  15. package/dist/lib/authentication/authentication.d.ts +2 -0
  16. package/dist/lib/authentication/components/SignIn.js +4 -3
  17. package/dist/lib/authentication/components/SignIn.js.map +1 -1
  18. package/dist/lib/authentication/providers/openid.d.ts +4 -2
  19. package/dist/lib/authentication/providers/openid.js +11 -5
  20. package/dist/lib/authentication/providers/openid.js.map +1 -1
  21. package/dist/lib/components/MobileTopNavigation.js +8 -5
  22. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  23. package/dist/lib/components/TopNavigation.d.ts +5 -0
  24. package/dist/lib/components/TopNavigation.js +16 -12
  25. package/dist/lib/components/TopNavigation.js.map +1 -1
  26. package/dist/lib/core/ZudokuContext.d.ts +2 -1
  27. package/dist/lib/core/ZudokuContext.js +14 -1
  28. package/dist/lib/core/ZudokuContext.js.map +1 -1
  29. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +4 -4
  30. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  31. package/dist/lib/plugins/api-keys/index.js +1 -1
  32. package/dist/lib/plugins/markdown/MdxPage.js +3 -2
  33. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  34. package/dist/lib/plugins/openapi/OperationList.js +1 -1
  35. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  36. package/dist/lib/plugins/openapi/index.js +1 -1
  37. package/dist/lib/plugins/openapi/index.js.map +1 -1
  38. package/dist/vite/mdx/remark-last-modified.js +1 -28
  39. package/dist/vite/mdx/remark-last-modified.js.map +1 -1
  40. package/lib/{MdxPage-swXPJ0gf.js → MdxPage-8UuEK446.js} +37 -37
  41. package/lib/MdxPage-8UuEK446.js.map +1 -0
  42. package/lib/{OasProvider-CDAM3TB1.js → OasProvider-BsWpguVO.js} +2 -2
  43. package/lib/{OasProvider-CDAM3TB1.js.map → OasProvider-BsWpguVO.js.map} +1 -1
  44. package/lib/{OperationList-C9Hb9ql8.js → OperationList-PnZbf3b2.js} +6 -6
  45. package/lib/{OperationList-C9Hb9ql8.js.map → OperationList-PnZbf3b2.js.map} +1 -1
  46. package/lib/{Pagination-VGlgeCmS.js → Pagination-DY7gCrm4.js} +2 -2
  47. package/lib/{Pagination-VGlgeCmS.js.map → Pagination-DY7gCrm4.js.map} +1 -1
  48. package/lib/{SchemaList-BAbh1BXO.js → SchemaList-D6k4DKWH.js} +3 -3
  49. package/lib/{SchemaList-BAbh1BXO.js.map → SchemaList-D6k4DKWH.js.map} +1 -1
  50. package/lib/{SchemaView-C2Io712T.js → SchemaView-BhgJ9WB8.js} +3 -3
  51. package/lib/{SchemaView-C2Io712T.js.map → SchemaView-BhgJ9WB8.js.map} +1 -1
  52. package/lib/SignUp-CpUD6DUM.js +56 -0
  53. package/lib/SignUp-CpUD6DUM.js.map +1 -0
  54. package/lib/{circular-B42RaanD.js → circular-BUMjK3JF.js} +2 -2
  55. package/lib/{circular-B42RaanD.js.map → circular-BUMjK3JF.js.map} +1 -1
  56. package/lib/{createServer-BKFsRuuk.js → createServer-BPz8ZCrd.js} +3 -3
  57. package/lib/createServer-BPz8ZCrd.js.map +1 -0
  58. package/lib/{errors-CF2X_x5o.js → errors-DY-qOx9n.js} +3 -3
  59. package/lib/{errors-CF2X_x5o.js.map → errors-DY-qOx9n.js.map} +1 -1
  60. package/lib/{index-CLy1XyH0.js → index-C_xVKbf9.js} +1285 -1240
  61. package/lib/index-C_xVKbf9.js.map +1 -0
  62. package/lib/{index-B6Re5_cx.js → index-dVBKCNMa.js} +123 -123
  63. package/lib/{index-B6Re5_cx.js.map → index-dVBKCNMa.js.map} +1 -1
  64. package/lib/zudoku.auth-azureb2c.js +1 -1
  65. package/lib/zudoku.auth-clerk.js +1 -1
  66. package/lib/zudoku.auth-openid.js +114 -105
  67. package/lib/zudoku.auth-openid.js.map +1 -1
  68. package/lib/zudoku.components.js +1 -1
  69. package/lib/zudoku.plugin-api-catalog.js +1 -1
  70. package/lib/zudoku.plugin-api-keys.js +286 -272
  71. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  72. package/lib/zudoku.plugin-markdown.js +1 -1
  73. package/lib/zudoku.plugin-openapi.js +1 -1
  74. package/package.json +7 -7
  75. package/src/app/demo.tsx +19 -2
  76. package/src/lib/authentication/authentication.ts +2 -2
  77. package/src/lib/authentication/components/SignIn.tsx +5 -12
  78. package/src/lib/authentication/providers/openid.tsx +23 -4
  79. package/src/lib/components/MobileTopNavigation.tsx +56 -7
  80. package/src/lib/components/TopNavigation.tsx +30 -14
  81. package/src/lib/core/ZudokuContext.ts +21 -0
  82. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +13 -9
  83. package/src/lib/plugins/api-keys/index.tsx +1 -1
  84. package/src/lib/plugins/markdown/MdxPage.tsx +3 -2
  85. package/src/lib/plugins/openapi/OperationList.tsx +1 -1
  86. package/src/lib/plugins/openapi/index.tsx +1 -1
  87. package/lib/MdxPage-swXPJ0gf.js.map +0 -1
  88. package/lib/SignUp-5RUdVhnq.js +0 -63
  89. package/lib/SignUp-5RUdVhnq.js.map +0 -1
  90. package/lib/createServer-BKFsRuuk.js.map +0 -1
  91. package/lib/index-CLy1XyH0.js.map +0 -1
@@ -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,13 +17,14 @@ 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 (
@@ -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
- <li>
54
- <ThemeSwitch />
55
- </li>
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,6 +90,25 @@ 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
114
  {options.site?.showPoweredBy !== false && (
@@ -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, type 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 TopNavItem = (item: NavigationItem) => {
66
- const currentNav = useCurrentNavigation();
67
- const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
68
-
69
- const path = getPathForItem(item);
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 isActive = isActiveNavLink || isActiveTopNavItem;
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
- isActive || isPending
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
- isActive && "after:[view-transition-name:top-nav-underline]",
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
- </NavLink>
112
+ </TopNavLink>
97
113
  );
98
114
  };
@@ -18,8 +18,10 @@ import {
18
18
  isAuthenticationPlugin,
19
19
  isEventConsumerPlugin,
20
20
  isNavigationPlugin,
21
+ isProfileMenuPlugin,
21
22
  type NavigationPlugin,
22
23
  needsInitialization,
24
+ type ProfileNavigationItem,
23
25
  type ZudokuPlugin,
24
26
  } from "./plugins.js";
25
27
 
@@ -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
+ };
@@ -226,8 +226,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
226
226
  ) : (
227
227
  <ul
228
228
  className={cn(
229
- "grid grid-cols-1 divide-y divide-border col-span-6",
230
- "lg:grid-cols-[1fr_min-content]",
229
+ "grid grid-cols-[1fr_min-content] divide-y divide-border col-span-6",
231
230
  )}
232
231
  >
233
232
  {data.map((consumers) => (
@@ -310,7 +309,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
310
309
  disabled={editingConsumerId === consumers.id}
311
310
  >
312
311
  <PencilLineIcon size={16} />
313
- Edit label
312
+ <span className="hidden md:block">Edit label</span>
314
313
  </Button>
315
314
  )}
316
315
  {service.rollKey && (
@@ -330,7 +329,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
330
329
  : undefined
331
330
  }
332
331
  />
333
- Roll key
332
+ <span className="hidden md:block">Roll key</span>
334
333
  </Button>
335
334
  </DialogTrigger>
336
335
  <DialogContent>
@@ -436,21 +435,26 @@ const RevealApiKey = ({
436
435
  return (
437
436
  <div className={cn("grid col-span-full grid-cols-subgrid p-6", className)}>
438
437
  <div className="flex flex-col gap-1">
439
- <div className="flex gap-2 items-center text-sm border rounded-md w-fit px-1">
440
- <div className="font-mono truncate h-9 items-center flex px-2 text-xs gap-2">
438
+ <div className="flex gap-2 items-center text-sm border rounded-md w-full max-w-fit px-1">
439
+ <div className="font-mono w-full h-9 items-center flex px-2 text-xs gap-2">
441
440
  <div
442
441
  className={cn(
443
442
  "rounded-full w-2 h-2 bg-emerald-400 mr-2",
444
443
  (expiresSoon || isExpired) && "bg-neutral-200",
445
444
  )}
446
445
  ></div>
447
- <span>
448
- <span className={revealed ? "" : "opacity-20"}>
446
+ <span className="w-full truncate">
447
+ <div
448
+ className={cn(
449
+ "w-40 inline-block md:w-full truncate",
450
+ revealed ? "" : "opacity-20",
451
+ )}
452
+ >
449
453
  {revealed
450
454
  ? key.slice(0, -5)
451
455
  : "**** ".repeat(key.slice(0, -5).length / 5) +
452
456
  "*".repeat(key.slice(0, -5).length % 5)}
453
- </span>
457
+ </div>
454
458
  <span>{key.slice(-5)}</span>
455
459
  </span>
456
460
  </div>
@@ -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 ?? consumer.subject ?? "API Key",
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 ?? title;
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
- {excerpt && <meta name="description" content={excerpt} />}
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 ?? "Other endpoints"}
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-swXPJ0gf.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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"}
@@ -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-CLy1XyH0.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-5RUdVhnq.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SignUp-5RUdVhnq.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;"}