From 1915059629ebded0726511e35e8fc2a57cf461de Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Thu, 15 Jan 2026 16:22:58 -0330 Subject: [PATCH] Add magic link login --- apps/ui-library/__registry__/index.tsx | 12 + .../example/passwordless-auth-demo/layout.tsx | 45 ++ .../example/passwordless-auth-demo/page.tsx | 7 + apps/ui-library/config/docs.ts | 8 + .../content/docs/nextjs/passwordless-auth.mdx | 229 +++++++ .../docs/react-router/passwordless-auth.mdx | 229 +++++++ .../content/docs/react/passwordless-auth.mdx | 229 +++++++ .../docs/tanstack/passwordless-auth.mdx | 229 +++++++ apps/ui-library/public/r/ai-editor-rules.json | 2 +- .../r/password-based-auth-react-router.json | 2 +- .../public/r/password-based-auth-react.json | 2 +- .../r/password-based-auth-tanstack.json | 2 +- .../public/r/passwordless-auth-nextjs.json | 108 +++ .../r/passwordless-auth-react-router.json | 86 +++ .../public/r/passwordless-auth-react.json | 48 ++ .../public/r/passwordless-auth-tanstack.json | 95 +++ .../public/r/platform-kit-nextjs.json | 4 +- apps/ui-library/public/r/registry.json | 289 ++++++++ apps/ui-library/registry/blocks.ts | 10 + .../GETTING_STARTED.md | 398 +++++++++++ .../blocks/passwordless-auth-nextjs/INDEX.md | 286 ++++++++ .../INTEGRATION_EXAMPLES.md | 639 ++++++++++++++++++ .../QUICK_REFERENCE.md | 312 +++++++++ .../blocks/passwordless-auth-nextjs/README.md | 293 ++++++++ .../blocks/passwordless-auth-nextjs/USAGE.md | 468 +++++++++++++ .../app/auth/confirm/route.ts | 26 + .../app/auth/error/page.tsx | 35 + .../app/auth/magic-link/page.tsx | 11 + .../app/auth/otp/page.tsx | 11 + .../app/auth/passwordless/page.tsx | 11 + .../app/auth/verify-otp/page.tsx | 20 + .../app/protected/page.tsx | 59 ++ .../components/magic-link-form.tsx | 92 +++ .../components/otp-request-form.tsx | 82 +++ .../components/otp-verify-form.tsx | 122 ++++ .../components/passwordless-login-form.tsx | 130 ++++ .../passwordless-auth-nextjs/middleware.ts | 46 ++ .../registry-item.json | 66 ++ .../app/routes/auth.confirm.tsx | 27 + .../app/routes/auth.error.tsx | 35 + .../app/routes/passwordless.tsx | 11 + .../app/routes/protected.tsx | 55 ++ .../app/routes/verify-otp.tsx | 11 + .../components/magic-link-form.tsx | 92 +++ .../components/otp-request-form.tsx | 82 +++ .../components/otp-verify-form.tsx | 121 ++++ .../components/passwordless-login-form.tsx | 130 ++++ .../registry-item.json | 55 ++ .../components/magic-link-form.tsx | 92 +++ .../components/otp-request-form.tsx | 86 +++ .../components/otp-verify-form.tsx | 124 ++++ .../components/passwordless-login-form.tsx | 132 ++++ .../registry-item.json | 26 + .../components/magic-link-form.tsx | 92 +++ .../components/otp-request-form.tsx | 82 +++ .../components/otp-verify-form.tsx | 121 ++++ .../components/passwordless-login-form.tsx | 130 ++++ .../lib/supabase/fetch-user-server-fn.ts | 19 + .../registry-item.json | 60 ++ .../routes/_protected.tsx | 15 + .../routes/_protected/protected.tsx | 53 ++ .../routes/auth/confirm.ts | 61 ++ .../routes/auth/error.tsx | 39 ++ .../routes/passwordless.tsx | 16 + .../routes/verify-otp.tsx | 21 + .../default/examples/magic-link-auth.tsx | 13 + .../registry/default/examples/otp-auth.tsx | 13 + .../default/examples/passwordless-auth.tsx | 13 + apps/ui-library/registry/examples.ts | 33 + .../solutions/convex/convex-hero-dark.svg | 59 ++ .../solutions/convex/convex-hero-light.svg | 48 ++ 71 files changed, 6704 insertions(+), 6 deletions(-) create mode 100644 apps/ui-library/app/example/passwordless-auth-demo/layout.tsx create mode 100644 apps/ui-library/app/example/passwordless-auth-demo/page.tsx create mode 100644 apps/ui-library/content/docs/nextjs/passwordless-auth.mdx create mode 100644 apps/ui-library/content/docs/react-router/passwordless-auth.mdx create mode 100644 apps/ui-library/content/docs/react/passwordless-auth.mdx create mode 100644 apps/ui-library/content/docs/tanstack/passwordless-auth.mdx create mode 100644 apps/ui-library/public/r/passwordless-auth-nextjs.json create mode 100644 apps/ui-library/public/r/passwordless-auth-react-router.json create mode 100644 apps/ui-library/public/r/passwordless-auth-react.json create mode 100644 apps/ui-library/public/r/passwordless-auth-tanstack.json create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/GETTING_STARTED.md create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/INDEX.md create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/INTEGRATION_EXAMPLES.md create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/QUICK_REFERENCE.md create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/README.md create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/USAGE.md create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/auth/confirm/route.ts create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/auth/error/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/auth/magic-link/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/auth/otp/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/auth/passwordless/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/auth/verify-otp/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/app/protected/page.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/components/magic-link-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/components/otp-request-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/components/otp-verify-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/components/passwordless-login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/middleware.ts create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-nextjs/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/app/routes/auth.confirm.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/app/routes/auth.error.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/app/routes/passwordless.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/app/routes/protected.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/app/routes/verify-otp.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/components/magic-link-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/components/otp-request-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/components/otp-verify-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/components/passwordless-login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react-router/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react/components/magic-link-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react/components/otp-request-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react/components/otp-verify-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react/components/passwordless-login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-react/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/components/magic-link-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/components/otp-request-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/components/otp-verify-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/components/passwordless-login-form.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/lib/supabase/fetch-user-server-fn.ts create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/registry-item.json create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/routes/_protected.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/routes/_protected/protected.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/routes/auth/confirm.ts create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/routes/auth/error.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/routes/passwordless.tsx create mode 100644 apps/ui-library/registry/default/blocks/passwordless-auth-tanstack/routes/verify-otp.tsx create mode 100644 apps/ui-library/registry/default/examples/magic-link-auth.tsx create mode 100644 apps/ui-library/registry/default/examples/otp-auth.tsx create mode 100644 apps/ui-library/registry/default/examples/passwordless-auth.tsx diff --git a/apps/ui-library/__registry__/index.tsx b/apps/ui-library/__registry__/index.tsx index f20ed0206cd..377a96a39d3 100644 --- a/apps/ui-library/__registry__/index.tsx +++ b/apps/ui-library/__registry__/index.tsx @@ -19,6 +19,18 @@ export const Index = { component: React.lazy(() => import("@/registry/default/examples/password-based-auth.tsx")), } , + "passwordless-auth-demo": { + component: React.lazy(() => import("@/registry/default/examples/passwordless-auth.tsx")), + } + , + "magic-link-auth-demo": { + component: React.lazy(() => import("@/registry/default/examples/magic-link-auth.tsx")), + } + , + "otp-auth-demo": { + component: React.lazy(() => import("@/registry/default/examples/otp-auth.tsx")), + } + , "current-user-avatar-demo": { component: React.lazy(() => import("@/registry/default/examples/current-user-avatar-demo.tsx")), } diff --git a/apps/ui-library/app/example/passwordless-auth-demo/layout.tsx b/apps/ui-library/app/example/passwordless-auth-demo/layout.tsx new file mode 100644 index 00000000000..3a6efd5bfd4 --- /dev/null +++ b/apps/ui-library/app/example/passwordless-auth-demo/layout.tsx @@ -0,0 +1,45 @@ +import { Metadata } from 'next' +import { BaseInjector } from './../base-injector' +import { ThemeProvider } from '@/app/Providers' + +export const metadata: Metadata = { + title: 'Passwordless Auth Example', +} + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + +