From 8bc73dd94523ddcf46b75db115b631e255ec2b2b Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:01:18 -0400 Subject: [PATCH 01/10] added shadcn registry --- docs/app/global.css | 130 + docs/package.json | 19 +- docs/pnpm-lock.yaml | 621 ++- docs/public/r/accept-invitation-card.json | 28 + docs/public/r/account-cell.json | 29 + docs/public/r/account-options.json | 19 + docs/public/r/account-settings-cards.json | 27 + docs/public/r/account-view.json | 31 + docs/public/r/accounts-card.json | 23 + docs/public/r/additional-fields.json | 17 + docs/public/r/admin-error-codes.json | 17 + docs/public/r/alert.json | 20 + docs/public/r/anonymous-error-codes.json | 17 + docs/public/r/any-auth-client.json | 19 + docs/public/r/api-key-cell.json | 29 + docs/public/r/api-key-delete-dialog.json | 29 + docs/public/r/api-key-display-dialog.json | 25 + docs/public/r/api-key-error-codes.json | 17 + docs/public/r/api-key.json | 17 + docs/public/r/api-keys-card.json | 24 + docs/public/r/auth-callback.json | 21 + docs/public/r/auth-client.json | 19 + docs/public/r/auth-data-cache.json | 16 + docs/public/r/auth-form.json | 31 + docs/public/r/auth-hooks.json | 26 + docs/public/r/auth-loading.json | 18 + docs/public/r/auth-localization.json | 33 + docs/public/r/auth-mutators.json | 17 + docs/public/r/auth-ui-provider-tanstack.json | 19 + docs/public/r/auth-ui-provider.json | 41 + docs/public/r/auth-view.json | 36 + docs/public/r/avatar-options.json | 19 + docs/public/r/avatar.json | 20 + docs/public/r/backup-codes-dialog.json | 24 + docs/public/r/base-error-codes.json | 17 + docs/public/r/button.json | 21 + docs/public/r/captcha-error-codes.json | 17 + docs/public/r/captcha-options.json | 19 + docs/public/r/captcha-provider.json | 17 + docs/public/r/captcha.json | 25 + docs/public/r/card.json | 18 + docs/public/r/change-email-card.json | 28 + docs/public/r/change-password-card.json | 30 + docs/public/r/checkbox.json | 21 + docs/public/r/create-api-key-dialog.json | 36 + docs/public/r/create-organization-dialog.json | 33 + docs/public/r/credentials-options.json | 19 + docs/public/r/delete-account-card.json | 21 + docs/public/r/delete-account-dialog.json | 32 + docs/public/r/delete-organization-card.json | 23 + docs/public/r/delete-organization-dialog.json | 33 + docs/public/r/delete-user-options.json | 17 + docs/public/r/dialog.json | 21 + docs/public/r/drawer.json | 20 + docs/public/r/dropdown-menu.json | 21 + docs/public/r/email-otp-button.json | 25 + docs/public/r/email-otp-error-codes.json | 17 + docs/public/r/email-otp-form.json | 33 + docs/public/r/email-template.json | 20 + docs/public/r/fetch-error.json | 17 + docs/public/r/forgot-password-form.json | 33 + docs/public/r/form-error.json | 23 + docs/public/r/form.json | 23 + docs/public/r/generic-oauth-error-codes.json | 17 + docs/public/r/generic-oauth-options.json | 20 + docs/public/r/gravatar-options.json | 17 + docs/public/r/gravatar-utils.json | 20 + docs/public/r/haveibeenpwned-error-codes.json | 17 + docs/public/r/image-utils.json | 16 + docs/public/r/image.json | 17 + docs/public/r/input-field-skeleton.json | 20 + docs/public/r/input-otp.json | 21 + docs/public/r/input.json | 18 + docs/public/r/invitation-cell.json | 29 + docs/public/r/invitation.json | 17 + docs/public/r/invite-member-dialog.json | 32 + docs/public/r/label.json | 20 + docs/public/r/leave-organization-dialog.json | 28 + docs/public/r/link.json | 17 + docs/public/r/magic-link-button.json | 25 + docs/public/r/magic-link-form.json | 33 + docs/public/r/member-cell.json | 31 + docs/public/r/model-names.json | 16 + docs/public/r/multi-session-error-codes.json | 17 + docs/public/r/one-tap.json | 21 + docs/public/r/organization-cell-view.json | 24 + docs/public/r/organization-cell.json | 29 + docs/public/r/organization-error-codes.json | 17 + .../r/organization-invitations-card.json | 25 + docs/public/r/organization-logo-card.json | 32 + docs/public/r/organization-logo.json | 25 + docs/public/r/organization-members-card.json | 26 + docs/public/r/organization-name-card.json | 30 + docs/public/r/organization-options.json | 19 + docs/public/r/organization-refetcher.json | 19 + .../public/r/organization-settings-cards.json | 25 + docs/public/r/organization-slug-card.json | 30 + docs/public/r/organization-switcher.json | 33 + docs/public/r/organization-view.json | 30 + docs/public/r/organizations-card.json | 25 + docs/public/r/otp-input-group.json | 18 + docs/public/r/passkey-button.json | 25 + docs/public/r/passkey-cell.json | 26 + docs/public/r/passkey-error-codes.json | 17 + docs/public/r/passkeys-card.json | 27 + docs/public/r/password-input.json | 22 + docs/public/r/password-validation.json | 17 + docs/public/r/personal-account-view.json | 22 + docs/public/r/phone-number-error-codes.json | 17 + docs/public/r/profile.json | 17 + docs/public/r/provider-button.json | 25 + docs/public/r/provider-cell.json | 29 + docs/public/r/provider-icons.json | 16 + docs/public/r/providers-card.json | 26 + docs/public/r/recaptcha-badge.json | 21 + docs/public/r/recaptcha-v2.json | 23 + docs/public/r/recaptcha-v3.json | 23 + docs/public/r/recover-account-form.json | 30 + docs/public/r/redirect-to-sign-in.json | 18 + docs/public/r/redirect-to-sign-up.json | 18 + docs/public/r/refetch.json | 17 + docs/public/r/remove-member-dialog.json | 27 + docs/public/r/render-toast.json | 17 + docs/public/r/reset-password-form.json | 30 + docs/public/r/security-settings-cards.json | 27 + docs/public/r/select.json | 21 + docs/public/r/separator.json | 20 + docs/public/r/session-cell.json | 28 + docs/public/r/session-freshness-dialog.json | 23 + docs/public/r/sessions-card.json | 24 + docs/public/r/settings-action-button.json | 23 + docs/public/r/settings-card-footer.json | 22 + docs/public/r/settings-card-header.json | 21 + docs/public/r/settings-card.json | 23 + docs/public/r/settings-cell-skeleton.json | 21 + docs/public/r/sign-in-form.json | 37 + docs/public/r/sign-out.json | 21 + docs/public/r/sign-up-form.json | 41 + docs/public/r/sign-up-options.json | 17 + docs/public/r/signed-in.json | 18 + docs/public/r/signed-out.json | 18 + docs/public/r/skeleton.json | 18 + docs/public/r/social-options.json | 21 + docs/public/r/social-providers.json | 18 + docs/public/r/stripe-localization.json | 17 + docs/public/r/tabs.json | 20 + docs/public/r/textarea.json | 18 + docs/public/r/two-factor-card.json | 22 + docs/public/r/two-factor-error-codes.json | 17 + docs/public/r/two-factor-form.json | 37 + docs/public/r/two-factor-password-dialog.json | 30 + docs/public/r/update-avatar-card.json | 30 + docs/public/r/update-field-card.json | 32 + docs/public/r/update-member-role-dialog.json | 28 + docs/public/r/update-name-card.json | 20 + docs/public/r/update-username-card.json | 21 + docs/public/r/use-auth-data.json | 21 + docs/public/r/use-authenticate.json | 19 + docs/public/r/use-captcha.json | 24 + docs/public/r/use-conditional-query.json | 19 + docs/public/r/use-current-organization.json | 20 + docs/public/r/use-hydrated.json | 16 + docs/public/r/use-instant-options.json | 28 + docs/public/r/use-lang.json | 16 + docs/public/r/use-list-accounts.json | 22 + docs/public/r/use-list-sessions.json | 24 + docs/public/r/use-session.json | 23 + docs/public/r/use-success-transition.json | 19 + docs/public/r/use-tanstack-options.json | 24 + docs/public/r/use-theme.json | 16 + docs/public/r/use-triplit-hooks.json | 26 + docs/public/r/use-triplit-token.json | 19 + docs/public/r/user-avatar.json | 26 + docs/public/r/user-button.json | 29 + docs/public/r/user-invitations-card.json | 26 + docs/public/r/user-view.json | 23 + docs/public/r/username-error-codes.json | 17 + docs/public/r/utils.json | 23 + docs/public/r/view-paths.json | 16 + docs/view-paths.ts | 55 + package.json | 313 +- pnpm-lock.yaml | 2089 ++++++++- registry.json | 3567 +++++++++++++++ registry/registry.json | 3814 +++++++++++++++++ scripts/generate.mjs | 540 +++ 185 files changed, 15021 insertions(+), 171 deletions(-) create mode 100644 docs/public/r/accept-invitation-card.json create mode 100644 docs/public/r/account-cell.json create mode 100644 docs/public/r/account-options.json create mode 100644 docs/public/r/account-settings-cards.json create mode 100644 docs/public/r/account-view.json create mode 100644 docs/public/r/accounts-card.json create mode 100644 docs/public/r/additional-fields.json create mode 100644 docs/public/r/admin-error-codes.json create mode 100644 docs/public/r/alert.json create mode 100644 docs/public/r/anonymous-error-codes.json create mode 100644 docs/public/r/any-auth-client.json create mode 100644 docs/public/r/api-key-cell.json create mode 100644 docs/public/r/api-key-delete-dialog.json create mode 100644 docs/public/r/api-key-display-dialog.json create mode 100644 docs/public/r/api-key-error-codes.json create mode 100644 docs/public/r/api-key.json create mode 100644 docs/public/r/api-keys-card.json create mode 100644 docs/public/r/auth-callback.json create mode 100644 docs/public/r/auth-client.json create mode 100644 docs/public/r/auth-data-cache.json create mode 100644 docs/public/r/auth-form.json create mode 100644 docs/public/r/auth-hooks.json create mode 100644 docs/public/r/auth-loading.json create mode 100644 docs/public/r/auth-localization.json create mode 100644 docs/public/r/auth-mutators.json create mode 100644 docs/public/r/auth-ui-provider-tanstack.json create mode 100644 docs/public/r/auth-ui-provider.json create mode 100644 docs/public/r/auth-view.json create mode 100644 docs/public/r/avatar-options.json create mode 100644 docs/public/r/avatar.json create mode 100644 docs/public/r/backup-codes-dialog.json create mode 100644 docs/public/r/base-error-codes.json create mode 100644 docs/public/r/button.json create mode 100644 docs/public/r/captcha-error-codes.json create mode 100644 docs/public/r/captcha-options.json create mode 100644 docs/public/r/captcha-provider.json create mode 100644 docs/public/r/captcha.json create mode 100644 docs/public/r/card.json create mode 100644 docs/public/r/change-email-card.json create mode 100644 docs/public/r/change-password-card.json create mode 100644 docs/public/r/checkbox.json create mode 100644 docs/public/r/create-api-key-dialog.json create mode 100644 docs/public/r/create-organization-dialog.json create mode 100644 docs/public/r/credentials-options.json create mode 100644 docs/public/r/delete-account-card.json create mode 100644 docs/public/r/delete-account-dialog.json create mode 100644 docs/public/r/delete-organization-card.json create mode 100644 docs/public/r/delete-organization-dialog.json create mode 100644 docs/public/r/delete-user-options.json create mode 100644 docs/public/r/dialog.json create mode 100644 docs/public/r/drawer.json create mode 100644 docs/public/r/dropdown-menu.json create mode 100644 docs/public/r/email-otp-button.json create mode 100644 docs/public/r/email-otp-error-codes.json create mode 100644 docs/public/r/email-otp-form.json create mode 100644 docs/public/r/email-template.json create mode 100644 docs/public/r/fetch-error.json create mode 100644 docs/public/r/forgot-password-form.json create mode 100644 docs/public/r/form-error.json create mode 100644 docs/public/r/form.json create mode 100644 docs/public/r/generic-oauth-error-codes.json create mode 100644 docs/public/r/generic-oauth-options.json create mode 100644 docs/public/r/gravatar-options.json create mode 100644 docs/public/r/gravatar-utils.json create mode 100644 docs/public/r/haveibeenpwned-error-codes.json create mode 100644 docs/public/r/image-utils.json create mode 100644 docs/public/r/image.json create mode 100644 docs/public/r/input-field-skeleton.json create mode 100644 docs/public/r/input-otp.json create mode 100644 docs/public/r/input.json create mode 100644 docs/public/r/invitation-cell.json create mode 100644 docs/public/r/invitation.json create mode 100644 docs/public/r/invite-member-dialog.json create mode 100644 docs/public/r/label.json create mode 100644 docs/public/r/leave-organization-dialog.json create mode 100644 docs/public/r/link.json create mode 100644 docs/public/r/magic-link-button.json create mode 100644 docs/public/r/magic-link-form.json create mode 100644 docs/public/r/member-cell.json create mode 100644 docs/public/r/model-names.json create mode 100644 docs/public/r/multi-session-error-codes.json create mode 100644 docs/public/r/one-tap.json create mode 100644 docs/public/r/organization-cell-view.json create mode 100644 docs/public/r/organization-cell.json create mode 100644 docs/public/r/organization-error-codes.json create mode 100644 docs/public/r/organization-invitations-card.json create mode 100644 docs/public/r/organization-logo-card.json create mode 100644 docs/public/r/organization-logo.json create mode 100644 docs/public/r/organization-members-card.json create mode 100644 docs/public/r/organization-name-card.json create mode 100644 docs/public/r/organization-options.json create mode 100644 docs/public/r/organization-refetcher.json create mode 100644 docs/public/r/organization-settings-cards.json create mode 100644 docs/public/r/organization-slug-card.json create mode 100644 docs/public/r/organization-switcher.json create mode 100644 docs/public/r/organization-view.json create mode 100644 docs/public/r/organizations-card.json create mode 100644 docs/public/r/otp-input-group.json create mode 100644 docs/public/r/passkey-button.json create mode 100644 docs/public/r/passkey-cell.json create mode 100644 docs/public/r/passkey-error-codes.json create mode 100644 docs/public/r/passkeys-card.json create mode 100644 docs/public/r/password-input.json create mode 100644 docs/public/r/password-validation.json create mode 100644 docs/public/r/personal-account-view.json create mode 100644 docs/public/r/phone-number-error-codes.json create mode 100644 docs/public/r/profile.json create mode 100644 docs/public/r/provider-button.json create mode 100644 docs/public/r/provider-cell.json create mode 100644 docs/public/r/provider-icons.json create mode 100644 docs/public/r/providers-card.json create mode 100644 docs/public/r/recaptcha-badge.json create mode 100644 docs/public/r/recaptcha-v2.json create mode 100644 docs/public/r/recaptcha-v3.json create mode 100644 docs/public/r/recover-account-form.json create mode 100644 docs/public/r/redirect-to-sign-in.json create mode 100644 docs/public/r/redirect-to-sign-up.json create mode 100644 docs/public/r/refetch.json create mode 100644 docs/public/r/remove-member-dialog.json create mode 100644 docs/public/r/render-toast.json create mode 100644 docs/public/r/reset-password-form.json create mode 100644 docs/public/r/security-settings-cards.json create mode 100644 docs/public/r/select.json create mode 100644 docs/public/r/separator.json create mode 100644 docs/public/r/session-cell.json create mode 100644 docs/public/r/session-freshness-dialog.json create mode 100644 docs/public/r/sessions-card.json create mode 100644 docs/public/r/settings-action-button.json create mode 100644 docs/public/r/settings-card-footer.json create mode 100644 docs/public/r/settings-card-header.json create mode 100644 docs/public/r/settings-card.json create mode 100644 docs/public/r/settings-cell-skeleton.json create mode 100644 docs/public/r/sign-in-form.json create mode 100644 docs/public/r/sign-out.json create mode 100644 docs/public/r/sign-up-form.json create mode 100644 docs/public/r/sign-up-options.json create mode 100644 docs/public/r/signed-in.json create mode 100644 docs/public/r/signed-out.json create mode 100644 docs/public/r/skeleton.json create mode 100644 docs/public/r/social-options.json create mode 100644 docs/public/r/social-providers.json create mode 100644 docs/public/r/stripe-localization.json create mode 100644 docs/public/r/tabs.json create mode 100644 docs/public/r/textarea.json create mode 100644 docs/public/r/two-factor-card.json create mode 100644 docs/public/r/two-factor-error-codes.json create mode 100644 docs/public/r/two-factor-form.json create mode 100644 docs/public/r/two-factor-password-dialog.json create mode 100644 docs/public/r/update-avatar-card.json create mode 100644 docs/public/r/update-field-card.json create mode 100644 docs/public/r/update-member-role-dialog.json create mode 100644 docs/public/r/update-name-card.json create mode 100644 docs/public/r/update-username-card.json create mode 100644 docs/public/r/use-auth-data.json create mode 100644 docs/public/r/use-authenticate.json create mode 100644 docs/public/r/use-captcha.json create mode 100644 docs/public/r/use-conditional-query.json create mode 100644 docs/public/r/use-current-organization.json create mode 100644 docs/public/r/use-hydrated.json create mode 100644 docs/public/r/use-instant-options.json create mode 100644 docs/public/r/use-lang.json create mode 100644 docs/public/r/use-list-accounts.json create mode 100644 docs/public/r/use-list-sessions.json create mode 100644 docs/public/r/use-session.json create mode 100644 docs/public/r/use-success-transition.json create mode 100644 docs/public/r/use-tanstack-options.json create mode 100644 docs/public/r/use-theme.json create mode 100644 docs/public/r/use-triplit-hooks.json create mode 100644 docs/public/r/use-triplit-token.json create mode 100644 docs/public/r/user-avatar.json create mode 100644 docs/public/r/user-button.json create mode 100644 docs/public/r/user-invitations-card.json create mode 100644 docs/public/r/user-view.json create mode 100644 docs/public/r/username-error-codes.json create mode 100644 docs/public/r/utils.json create mode 100644 docs/public/r/view-paths.json create mode 100644 docs/view-paths.ts create mode 100644 registry.json create mode 100644 registry/registry.json create mode 100644 scripts/generate.mjs diff --git a/docs/app/global.css b/docs/app/global.css index 20a564b9..4b9d8b8a 100644 --- a/docs/app/global.css +++ b/docs/app/global.css @@ -1,6 +1,11 @@ @import "tailwindcss"; @import "fumadocs-ui/css/black.css"; @import "fumadocs-ui/css/preset.css"; +@import "tw-animate-css"; +/* +---break--- +*/ +@custom-variant dark (&:is(.dark *)); @source "../node_modules/fumadocs-ui/dist/**/*.js"; @@ -27,4 +32,129 @@ Make sure disabled buttons don't get the pointer cursor. .dark { --color-fd-ring: var(--color-orange-300); --color-fd-primary: var(--color-orange-300); + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +/* +---break--- +*/ + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +/* +---break--- +*/ + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +/* +---break--- +*/ + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } } diff --git a/docs/package.json b/docs/package.json index 445c495d..76cde97e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,6 +10,18 @@ "check-types": "tsc --noEmit" }, "dependencies": { + "@better-fetch/fetch": "^1.1.18", + "@hookform/resolvers": "^5.2.1", + "@noble/hashes": "^1.8.0", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@wojtekmaj/react-recaptcha-v3": "^0.1.4", + "better-auth": "^1.3.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "fumadocs-core": "15.5.1", "fumadocs-docgen": "^2.0.0", "fumadocs-mdx": "11.6.7", @@ -20,11 +32,15 @@ "next": "15.3.3", "react": "^19.1.0", "react-dom": "^19.1.0", + "react-hook-form": "^7.62.0", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-mdx": "^3.1.0", "shiki": "^3.6.0", - "ts-morph": "^26.0.0" + "sonner": "^2.0.7", + "tailwind-merge": "^3.3.1", + "ts-morph": "^26.0.0", + "zod": "^4.0.17" }, "devDependencies": { "@biomejs/biome": "1.9.4", @@ -37,6 +53,7 @@ "remark-code-import": "^1.2.0", "tailwindcss": "^4.1.8", "turbo": "^2.5.4", + "tw-animate-css": "^1.3.6", "typescript": "^5.8.3" }, "packageManager": "pnpm@10.1.0" diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 64810f78..900bdd03 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -8,6 +8,42 @@ importers: .: dependencies: + '@better-fetch/fetch': + specifier: ^1.1.18 + version: 1.1.18 + '@hookform/resolvers': + specifier: ^5.2.1 + version: 5.2.1(react-hook-form@7.62.0(react@19.1.0)) + '@noble/hashes': + specifier: ^1.8.0 + version: 1.8.0 + '@radix-ui/react-avatar': + specifier: ^1.1.10 + version: 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-label': + specifier: ^2.1.7 + version: 2.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.3(@types/react@19.1.7)(react@19.1.0) + '@wojtekmaj/react-recaptcha-v3': + specifier: ^0.1.4 + version: 0.1.4(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + better-auth: + specifier: ^1.3.6 + version: 1.3.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@4.0.17) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 fumadocs-core: specifier: 15.5.1 version: 15.5.1(@types/react@19.1.7)(next@15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -38,6 +74,9 @@ importers: react-dom: specifier: ^19.1.0 version: 19.1.0(react@19.1.0) + react-hook-form: + specifier: ^7.62.0 + version: 7.62.0(react@19.1.0) remark: specifier: ^15.0.1 version: 15.0.1 @@ -50,9 +89,18 @@ importers: shiki: specifier: ^3.6.0 version: 3.6.0 + sonner: + specifier: ^2.0.7 + version: 2.0.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 ts-morph: specifier: ^26.0.0 version: 26.0.0 + zod: + specifier: ^4.0.17 + version: 4.0.17 devDependencies: '@biomejs/biome': specifier: 1.9.4 @@ -84,6 +132,9 @@ importers: turbo: specifier: ^2.5.4 version: 2.5.4 + tw-animate-css: + specifier: ^1.3.6 + version: 1.3.6 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -98,6 +149,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@better-auth/utils@0.2.6': + resolution: {integrity: sha512-3y/vaL5Ox33dBwgJ6ub3OPkVqr6B5xL2kgxNHG8eHZuryLyG/4JSPGqjbdRSgjuy9kALUZYDFl+ORIAxlWMSuA==} + + '@better-fetch/fetch@1.1.18': + resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==} + '@biomejs/biome@1.9.4': resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} engines: {node: '>=14.21.3'} @@ -322,6 +379,14 @@ packages: '@formatjs/intl-localematcher@0.6.1': resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} + '@hexagon/base64@1.1.28': + resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} + + '@hookform/resolvers@5.2.1': + resolution: {integrity: sha512-u0+6X58gkjMcxur1wRWokA7XsiiBJ6aK17aPZxhkoYiK5J+HcTx0Vhu9ovXe6H+dVpO6cjrn2FkJTryXEMlryQ==} + peerDependencies: + react-hook-form: ^7.55.0 + '@img/sharp-darwin-arm64@0.34.2': resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -460,6 +525,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@levischuck/tiny-cbor@0.2.11': + resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@mdx-js/mdx@3.1.0': resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} @@ -514,6 +582,13 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@0.6.0': + resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -570,12 +645,30 @@ packages: cpu: [x64] os: [win32] + '@peculiar/asn1-android@2.4.0': + resolution: {integrity: sha512-YFueREq97CLslZZBI8dKzis7jMfEHSLxM+nr0Zdx1POiXFLjqqwoY5s0F1UimdBiEw/iKlHey2m56MRDv7Jtyg==} + + '@peculiar/asn1-ecc@2.4.0': + resolution: {integrity: sha512-fJiYUBCJBDkjh347zZe5H81BdJ0+OGIg0X9z06v8xXUoql3MFeENUX0JsjCaVaU9A0L85PefLPGYkIoGpTnXLQ==} + + '@peculiar/asn1-rsa@2.4.0': + resolution: {integrity: sha512-6PP75voaEnOSlWR9sD25iCQyLgFZHXbmxvUfnnDcfL6Zh5h2iHW38+bve4LfH7a60x7fkhZZNmiYqAlAff9Img==} + + '@peculiar/asn1-schema@2.4.0': + resolution: {integrity: sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==} + + '@peculiar/asn1-x509@2.4.0': + resolution: {integrity: sha512-F7mIZY2Eao2TaoVqigGMLv+NDdpwuBKU1fucHPONfzaBS4JXXCNCmfO0Z3dsy7JzKGqtDcYC1mr9JjaZQZNiuw==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} '@radix-ui/primitive@1.1.2': resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/react-accordion@1.2.11': resolution: {integrity: sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==} peerDependencies: @@ -602,6 +695,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-avatar@1.1.10': + resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collapsible@1.1.11': resolution: {integrity: sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==} peerDependencies: @@ -646,8 +752,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.14': - resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -681,6 +787,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.1.2': resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} peerDependencies: @@ -690,6 +822,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.1.7': resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: @@ -712,6 +853,32 @@ packages: '@types/react': optional: true + '@radix-ui/react-label@2.1.7': + resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-navigation-menu@1.2.13': resolution: {integrity: sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g==} peerDependencies: @@ -751,6 +918,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.9': resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: @@ -777,6 +957,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: @@ -803,6 +996,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-scroll-area@1.2.9': resolution: {integrity: sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==} peerDependencies: @@ -874,6 +1080,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-is-hydrated@0.1.0': + resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: @@ -953,9 +1168,19 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simplewebauthn/browser@13.1.2': + resolution: {integrity: sha512-aZnW0KawAM83fSBUgglP5WofbrLbLyr7CoPqYr66Eppm7zO86YX6rrCjRB3hQKPrL7ATvY4FVXlykZ6w6FwYYw==} + + '@simplewebauthn/server@13.1.2': + resolution: {integrity: sha512-VwoDfvLXSCaRiD+xCIuyslU0HLxVggeE5BL06+GbsP2l1fGf5op8e0c3ZtKoi+vSg1q4ikjtAghC23ze2Q3H9g==} + engines: {node: '>=20.0.0'} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -1094,6 +1319,16 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@wojtekmaj/react-recaptcha-v3@0.1.4': + resolution: {integrity: sha512-zszMOdgI+y1Dz3496pRFr3t68n9+OmX/puLQNnOBDC7WrjM+nOKGyjIMCTe+3J14KDvzcxETeiglyDMGl0Yh/Q==} + peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1114,6 +1349,10 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -1124,6 +1363,21 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-auth@1.3.6: + resolution: {integrity: sha512-zjwbz9GpgGt3LuvJ8ZXfQeowSRpzdGojVvkhxvXjhCLwGOaOrZmFiNdEVyIKWTraN4oBtgNimcxUIQTGs6OKYg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + better-call@1.0.13: + resolution: {integrity: sha512-auqdP9lnNOli9tKpZIiv0nEIwmmyaD/RotM3Mucql+Ef88etoZi/t7Ph5LjlmZt/hiSahhNTt6YVnx6++rziXA==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1217,6 +1471,9 @@ packages: decode-named-character-reference@1.1.0: resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1447,6 +1704,12 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1459,6 +1722,10 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kysely@0.28.5: + resolution: {integrity: sha512-rlB0I/c6FBDWPcQoDtkxi9zIvpmnV5xoIalfCMSMCa7nuA6VGA3F54TW9mEgX4DVf10sXAWCF5fDbamI/5ZpKA==} + engines: {node: '>=20.0.0'} + lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} @@ -1529,6 +1796,10 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lru-cache@11.1.0: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} @@ -1738,6 +2009,10 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanostores@0.11.4: + resolution: {integrity: sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==} + engines: {node: ^18.0.0 || >=20.0.0} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -1814,6 +2089,13 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1822,6 +2104,12 @@ packages: peerDependencies: react: ^19.1.0 + react-hook-form@7.62.0: + resolution: {integrity: sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + react-medium-image-zoom@5.2.14: resolution: {integrity: sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w==} peerDependencies: @@ -1916,6 +2204,9 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rou3@0.5.1: + resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1934,6 +2225,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + sharp@0.34.2: resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1944,6 +2238,12 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sonner@2.0.7: + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2069,11 +2369,17 @@ packages: resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} hasBin: true + tw-animate-css@1.3.6: + resolution: {integrity: sha512-9dy0R9UsYEGmgf26L8UcHiLmSFTHa9+D7+dAt/G/sF5dCnPePZbfgDYinc7/UzAM7g/baVrmS6m9yEpU46d+LA==} + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} @@ -2130,6 +2436,11 @@ packages: '@types/react': optional: true + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2145,6 +2456,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} @@ -2152,6 +2466,9 @@ packages: zod@3.25.58: resolution: {integrity: sha512-DVLmMQzSZwNYzQoMaM3MQWnxr2eq+AtM9Hx3w1/Yl0pH8sLTSjN4jGP7w6f7uand6Hw44tsnSu1hz1AOA6qI2Q==} + zod@4.0.17: + resolution: {integrity: sha512-1PHjlYRevNxxdy2JZ8JcNAw7rX8V9P1AKkP+x/xZfxB0K5FYfuV+Ug6P/6NVSR2jHQ+FzDDoDHS04nYUsOIyLQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2164,6 +2481,12 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 + '@better-auth/utils@0.2.6': + dependencies: + uncrypto: 0.1.3 + + '@better-fetch/fetch@1.1.18': {} + '@biomejs/biome@1.9.4': optionalDependencies: '@biomejs/cli-darwin-arm64': 1.9.4 @@ -2300,6 +2623,13 @@ snapshots: dependencies: tslib: 2.8.1 + '@hexagon/base64@1.1.28': {} + + '@hookform/resolvers@5.2.1(react-hook-form@7.62.0(react@19.1.0))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.62.0(react@19.1.0) + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 @@ -2402,6 +2732,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@levischuck/tiny-cbor@0.2.11': {} + '@mdx-js/mdx@3.1.0(acorn@8.15.0)': dependencies: '@types/estree': 1.0.8 @@ -2458,6 +2790,10 @@ snapshots: '@next/swc-win32-x64-msvc@15.3.3': optional: true + '@noble/ciphers@0.6.0': {} + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2496,10 +2832,45 @@ snapshots: '@oxc-transform/binding-win32-x64-msvc@0.53.0': optional: true + '@peculiar/asn1-android@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-x509': 2.4.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-x509': 2.4.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.4.0': + dependencies: + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.2': {} + '@radix-ui/primitive@1.1.3': {} + '@radix-ui/react-accordion@1.2.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -2526,6 +2897,19 @@ snapshots: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.7)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-collapsible@1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -2566,17 +2950,17 @@ snapshots: optionalDependencies: '@types/react': 19.1.7 - '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) '@radix-ui/react-context': 1.1.2(@types/react@19.1.7)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.7)(react@19.1.0) '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-id': 1.1.1(@types/react@19.1.7)(react@19.1.0) '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-slot': 1.2.3(@types/react@19.1.7)(react@19.1.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.7)(react@19.1.0) @@ -2607,12 +2991,46 @@ snapshots: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.7)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.7)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.7)(react@19.1.0)': dependencies: react: 19.1.0 optionalDependencies: '@types/react': 19.1.7 + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.7)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.7 + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) @@ -2631,6 +3049,41 @@ snapshots: optionalDependencies: '@types/react': 19.1.7 + '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.7)(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.1(@types/react@19.1.7)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-navigation-menu@1.2.13(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -2694,6 +3147,24 @@ snapshots: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2714,6 +3185,16 @@ snapshots: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.7)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@19.1.7)(react@19.1.0) @@ -2740,6 +3221,23 @@ snapshots: '@types/react': 19.1.7 '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.7)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.7)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@types/react-dom': 19.1.6(@types/react@19.1.7) + '@radix-ui/react-scroll-area@1.2.9(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/number': 1.1.1 @@ -2808,6 +3306,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.7 + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.7)(react@19.1.0)': + dependencies: + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.7 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.7)(react@19.1.0)': dependencies: react: 19.1.0 @@ -2892,8 +3397,22 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@simplewebauthn/browser@13.1.2': {} + + '@simplewebauthn/server@13.1.2': + dependencies: + '@hexagon/base64': 1.1.28 + '@levischuck/tiny-cbor': 0.2.11 + '@peculiar/asn1-android': 2.4.0 + '@peculiar/asn1-ecc': 2.4.0 + '@peculiar/asn1-rsa': 2.4.0 + '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-x509': 2.4.0 + '@standard-schema/spec@1.0.0': {} + '@standard-schema/utils@0.3.0': {} + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.15': @@ -3018,6 +3537,14 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@wojtekmaj/react-recaptcha-v3@0.1.4(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + warning: 4.0.3 + optionalDependencies: + '@types/react': 19.1.7 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -3034,12 +3561,43 @@ snapshots: dependencies: tslib: 2.8.1 + asn1js@3.0.6: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 + astring@1.9.0: {} bail@2.0.2: {} balanced-match@1.0.2: {} + better-auth@1.3.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@4.0.17): + dependencies: + '@better-auth/utils': 0.2.6 + '@better-fetch/fetch': 1.1.18 + '@noble/ciphers': 0.6.0 + '@noble/hashes': 1.8.0 + '@simplewebauthn/browser': 13.1.2 + '@simplewebauthn/server': 13.1.2 + better-call: 1.0.13 + defu: 6.1.4 + jose: 5.10.0 + kysely: 0.28.5 + nanostores: 0.11.4 + zod: 4.0.17 + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + better-call@1.0.13: + dependencies: + '@better-fetch/fetch': 1.1.18 + rou3: 0.5.1 + set-cookie-parser: 2.7.1 + uncrypto: 0.1.3 + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3118,6 +3676,8 @@ snapshots: dependencies: character-entities: 2.0.2 + defu@6.1.4: {} + dequal@2.0.3: {} detect-libc@2.0.4: {} @@ -3317,7 +3877,7 @@ snapshots: dependencies: '@radix-ui/react-accordion': 1.2.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-collapsible': 1.1.11(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-direction': 1.1.1(@types/react@19.1.7)(react@19.1.0) '@radix-ui/react-navigation-menu': 1.2.13(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-popover': 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -3465,6 +4025,10 @@ snapshots: jiti@2.4.2: {} + jose@5.10.0: {} + + js-tokens@4.0.0: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -3476,6 +4040,8 @@ snapshots: kind-of@6.0.3: {} + kysely@0.28.5: {} + lightningcss-darwin-arm64@1.30.1: optional: true @@ -3525,6 +4091,10 @@ snapshots: longest-streak@3.1.0: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lru-cache@11.1.0: {} lucide-react@0.514.0(react@19.1.0): @@ -3991,6 +4561,8 @@ snapshots: nanoid@3.3.11: {} + nanostores@0.11.4: {} + negotiator@1.0.0: {} next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -4081,6 +4653,12 @@ snapshots: property-information@7.1.0: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.3: {} + queue-microtask@1.2.3: {} react-dom@19.1.0(react@19.1.0): @@ -4088,6 +4666,10 @@ snapshots: react: 19.1.0 scheduler: 0.26.0 + react-hook-form@7.62.0(react@19.1.0): + dependencies: + react: 19.1.0 + react-medium-image-zoom@5.2.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 @@ -4230,6 +4812,8 @@ snapshots: reusify@1.1.0: {} + rou3@0.5.1: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -4248,6 +4832,8 @@ snapshots: semver@7.7.2: optional: true + set-cookie-parser@2.7.1: {} + sharp@0.34.2: dependencies: color: 4.2.3 @@ -4293,6 +4879,11 @@ snapshots: is-arrayish: 0.3.2 optional: true + sonner@2.0.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + source-map-js@1.2.1: {} source-map@0.7.4: {} @@ -4400,8 +4991,12 @@ snapshots: turbo-windows-64: 2.5.4 turbo-windows-arm64: 2.5.4 + tw-animate-css@1.3.6: {} + typescript@5.8.3: {} + uncrypto@0.1.3: {} + undici-types@7.8.0: {} unified@11.0.5: @@ -4475,6 +5070,10 @@ snapshots: optionalDependencies: '@types/react': 19.1.7 + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + util-deprecate@1.0.2: {} vfile-message@2.0.4: @@ -4499,8 +5098,14 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + yallist@5.0.0: {} zod@3.25.58: {} + zod@4.0.17: {} + zwitch@2.0.4: {} diff --git a/docs/public/r/accept-invitation-card.json b/docs/public/r/accept-invitation-card.json new file mode 100644 index 00000000..6ef5610c --- /dev/null +++ b/docs/public/r/accept-invitation-card.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "accept-invitation-card", + "type": "registry:component", + "title": "Accept Invitation Card", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-authenticate.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/accept-invitation-card.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, Loader2, XIcon } from \"lucide-react\"\nimport { useCallback, useContext, useEffect, useMemo, useState } from \"react\"\n\nimport { useAuthenticate } from \"../../hooks/use-authenticate\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle\n} from \"../ui/card\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface AcceptInvitationCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function AcceptInvitationCard({\n className,\n classNames,\n localization: localizationProp\n}: AcceptInvitationCardProps) {\n const {\n localization: contextLocalization,\n redirectTo,\n replace,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: sessionData } = useAuthenticate()\n const [invitationId, setInvitationId] = useState(null)\n\n useEffect(() => {\n const invitationIdParam = getSearchParam(\"invitationId\")\n\n if (!invitationIdParam) {\n toast({\n variant: \"error\",\n message: localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n return\n }\n\n setInvitationId(invitationIdParam)\n }, [localization.INVITATION_NOT_FOUND, toast, replace, redirectTo])\n\n if (!sessionData || !invitationId) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nfunction AcceptInvitationContent({\n className,\n classNames,\n localization: localizationProp,\n invitationId\n}: AcceptInvitationCardProps & { invitationId: string }) {\n const {\n authClient,\n hooks: { useInvitation },\n localization: contextLocalization,\n organization,\n redirectTo,\n replace,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [isRejecting, setIsRejecting] = useState(false)\n const [isAccepting, setIsAccepting] = useState(false)\n const isProcessing = isRejecting || isAccepting\n\n const { data: invitation, isPending } = useInvitation({\n query: {\n id: invitationId\n }\n })\n\n const getRedirectTo = useCallback(\n () => getSearchParam(\"redirectTo\") || redirectTo,\n [redirectTo]\n )\n\n useEffect(() => {\n if (isPending || !invitationId) return\n\n if (!invitation) {\n toast({\n variant: \"error\",\n message: localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n return\n }\n\n if (\n invitation.status !== \"pending\" ||\n new Date(invitation.expiresAt) < new Date()\n ) {\n toast({\n variant: \"error\",\n message:\n new Date(invitation.expiresAt) < new Date()\n ? localization.INVITATION_EXPIRED\n : localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n }\n }, [\n invitation,\n isPending,\n invitationId,\n localization,\n toast,\n replace,\n redirectTo\n ])\n\n const acceptInvitation = async () => {\n setIsAccepting(true)\n\n try {\n await authClient.organization.acceptInvitation({\n invitationId: invitationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message:\n localization.INVITATION_ACCEPTED || \"Invitation accepted\"\n })\n\n replace(getRedirectTo())\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsAccepting(false)\n }\n }\n\n const rejectInvitation = async () => {\n setIsRejecting(true)\n\n try {\n await authClient.organization.rejectInvitation({\n invitationId: invitationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_REJECTED\n })\n\n replace(redirectTo)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsRejecting(false)\n }\n }\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organization?.customRoles || [])]\n const roleLabel =\n roles.find((r) => r.role === invitation?.role)?.label ||\n invitation?.role\n\n if (!invitation)\n return (\n \n )\n\n return (\n \n \n \n {localization.ACCEPT_INVITATION}\n \n\n \n {localization.ACCEPT_INVITATION_DESCRIPTION}\n \n \n\n \n \n \n\n

\n {roleLabel}\n

\n
\n\n
\n \n {isRejecting ? (\n \n ) : (\n \n )}\n\n {localization.REJECT}\n \n\n \n {isAccepting ? (\n \n ) : (\n \n )}\n\n {localization.ACCEPT}\n \n
\n \n
\n )\n}\n\nconst AcceptInvitationSkeleton = ({\n className,\n classNames,\n localization\n}: AcceptInvitationCardProps) => {\n return (\n \n \n \n\n \n \n\n \n \n \n\n \n \n\n
\n \n\n \n
\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/account-cell.json b/docs/public/r/account-cell.json new file mode 100644 index 00000000..8605496e --- /dev/null +++ b/docs/public/r/account-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-cell", + "type": "registry:component", + "title": "Account Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/account-cell.tsx", + "content": "\"use client\"\n\nimport type { Session, User } from \"better-auth\"\nimport {\n EllipsisIcon,\n Loader2,\n LogOutIcon,\n RepeatIcon,\n UserX2Icon\n} from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport { UserView } from \"../../user-view\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface AccountCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n deviceSession: { user: User; session: Session }\n localization?: Partial\n refetch?: Refetch\n}\n\nexport function AccountCell({\n className,\n classNames,\n deviceSession,\n localization,\n refetch\n}: AccountCellProps) {\n const {\n basePath,\n localization: contextLocalization,\n hooks: { useSession },\n mutators: { revokeDeviceSession, setActiveSession },\n toast,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleRevoke = async () => {\n setIsLoading(true)\n\n try {\n await revokeDeviceSession({\n sessionToken: deviceSession.session.token\n })\n\n refetch?.()\n } catch (error) {\n setIsLoading(false)\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const handleSetActiveSession = async () => {\n setIsLoading(true)\n\n try {\n await setActiveSession({\n sessionToken: deviceSession.session.token\n })\n\n refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n const isCurrentSession =\n deviceSession.session.id === sessionData?.session.id\n\n return (\n \n \n\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n\n \n {!isCurrentSession && (\n \n \n\n {localization.SWITCH_ACCOUNT}\n \n )}\n\n {\n if (isCurrentSession) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n handleRevoke()\n }}\n variant=\"destructive\"\n >\n {isCurrentSession ? (\n \n ) : (\n \n )}\n\n {isCurrentSession\n ? localization.SIGN_OUT\n : localization.REVOKE}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/account-options.json b/docs/public/r/account-options.json new file mode 100644 index 00000000..42449ff8 --- /dev/null +++ b/docs/public/r/account-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-options", + "type": "registry:file", + "title": "Account Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/types/account-options.ts", + "content": "import type { AccountViewPaths } from \"../lib/view-paths\"\n\nexport type AccountOptions = {\n /**\n * Base path for account-scoped views\n * @default \"/account\"\n */\n basePath?: string\n /**\n * Array of fields to show in Account Settings\n * @default [\"image\", \"name\"]\n */\n fields: string[]\n /**\n * Customize account view paths\n */\n viewPaths?: Partial\n}\n\nexport type AccountOptionsContext = {\n /**\n * Base path for account-scoped views\n * @default \"/account\"\n */\n basePath: string\n /**\n * Array of fields to show in Account Settings\n * @default [\"image\", \"name\"]\n */\n fields: string[]\n /**\n * Customize account view paths\n */\n viewPaths: AccountViewPaths\n}\n", + "type": "registry:file", + "target": "types/account-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/account-settings-cards.json b/docs/public/r/account-settings-cards.json new file mode 100644 index 00000000..6217528d --- /dev/null +++ b/docs/public/r/account-settings-cards.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-settings-cards", + "type": "registry:component", + "title": "Account Settings Cards", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/accounts-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-email-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-avatar-card.json", + "http://localhost:3000/r/update-field-card.json", + "http://localhost:3000/r/update-name-card.json", + "http://localhost:3000/r/update-username-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account-settings-cards.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { AccountsCard } from \"./account/accounts-card\"\nimport { UpdateAvatarCard } from \"./account/update-avatar-card\"\nimport { UpdateFieldCard } from \"./account/update-field-card\"\nimport { UpdateNameCard } from \"./account/update-name-card\"\nimport { UpdateUsernameCard } from \"./account/update-username-card\"\nimport { ChangeEmailCard } from \"./security/change-email-card\"\nimport type { SettingsCardClassNames } from \"./shared/settings-card\"\n\nexport function AccountSettingsCards({\n className,\n classNames,\n localization\n}: {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n}) {\n const {\n additionalFields,\n avatar,\n changeEmail,\n credentials,\n hooks: { useSession },\n multiSession,\n account: accountOptions\n } = useContext(AuthUIContext)\n\n const { data: sessionData } = useSession()\n\n return (\n \n {accountOptions?.fields?.includes(\"image\") && avatar && (\n \n )}\n\n {credentials?.username && (\n \n )}\n\n {accountOptions?.fields?.includes(\"name\") && (\n \n )}\n\n {changeEmail && (\n \n )}\n\n {accountOptions?.fields?.map((field) => {\n if (field === \"image\") return null\n if (field === \"name\") return null\n const additionalField = additionalFields?.[field]\n if (!additionalField) return null\n\n const {\n label,\n description,\n instructions,\n placeholder,\n required,\n type,\n multiline,\n validate\n } = additionalField\n\n // @ts-ignore Custom fields are not typed\n const defaultValue = sessionData?.user[field] as unknown\n\n return (\n \n )\n })}\n\n {multiSession && (\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/account-view.json b/docs/public/r/account-view.json new file mode 100644 index 00000000..cd79fad7 --- /dev/null +++ b/docs/public/r/account-view.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-view", + "type": "registry:component", + "title": "Account View", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-settings-cards.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organizations-card.json", + "http://localhost:3000/r/security-settings-cards.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-invitations-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/account/account-view.tsx", + "content": "\"use client\"\n\nimport { MenuIcon } from \"lucide-react\"\nimport { useContext, useMemo } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { AccountViewPath } from \"../../server\"\nimport { OrganizationsCard } from \"../organization/organizations-card\"\nimport { UserInvitationsCard } from \"../organization/user-invitations-card\"\nimport { AccountSettingsCards } from \"../settings/account-settings-cards\"\nimport { ApiKeysCard } from \"../settings/api-key/api-keys-card\"\nimport { SecuritySettingsCards } from \"../settings/security-settings-cards\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger\n} from \"../ui/drawer\"\nimport { Label } from \"../ui/label\"\n\nexport interface AccountViewProps {\n className?: string\n classNames?: {\n base?: string\n cards?: string\n drawer?: { menuItem?: string }\n sidebar?: { base?: string; button?: string; buttonActive?: string }\n card?: SettingsCardClassNames\n }\n localization?: AuthLocalization\n pathname?: string\n view?: AccountViewPath\n hideNav?: boolean\n}\n\nexport function AccountView({\n className,\n classNames,\n localization: localizationProp,\n pathname,\n view: viewProp,\n hideNav\n}: AccountViewProps) {\n const {\n apiKey,\n localization: contextLocalization,\n organization,\n account: accountOptions,\n Link\n } = useContext(AuthUIContext)\n\n if (!accountOptions) {\n return null\n }\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const view =\n viewProp ||\n getViewByPath(accountOptions.viewPaths, pathname) ||\n \"SETTINGS\"\n\n const navItems: {\n view: AccountViewPath\n label: string\n }[] = [\n { view: \"SETTINGS\", label: localization.ACCOUNT },\n { view: \"SECURITY\", label: localization.SECURITY }\n ]\n\n if (apiKey) {\n navItems.push({\n view: \"API_KEYS\",\n label: localization.API_KEYS\n })\n }\n\n if (organization) {\n navItems.push({\n view: \"ORGANIZATIONS\",\n label: localization.ORGANIZATIONS\n })\n }\n\n return (\n \n {!hideNav && (\n
\n \n\n \n \n \n \n \n \n \n {localization.SETTINGS}\n \n \n
\n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n
\n
\n
\n )}\n\n {!hideNav && (\n
\n \n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n \n )}\n\n {view === \"SETTINGS\" && (\n \n )}\n\n {view === \"SECURITY\" && (\n \n )}\n\n {view === \"API_KEYS\" && (\n \n )}\n\n {view === \"ORGANIZATIONS\" && organization && (\n
\n \n\n \n
\n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/accounts-card.json b/docs/public/r/accounts-card.json new file mode 100644 index 00000000..6bbe023b --- /dev/null +++ b/docs/public/r/accounts-card.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "accounts-card", + "type": "registry:component", + "title": "Accounts Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/account-cell.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/accounts-card.tsx", + "content": "\"use client\"\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { AccountCell } from \"./account-cell\"\n\nexport interface AccountsCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function AccountsCard({\n className,\n classNames,\n localization\n}: AccountsCardProps) {\n const {\n basePath,\n hooks: { useListDeviceSessions, useSession },\n localization: contextLocalization,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: deviceSessions, isPending, refetch } = useListDeviceSessions()\n const { data: sessionData } = useSession()\n\n const otherDeviceSessions = (deviceSessions || []).filter(\n (ds) => ds.session.id !== sessionData?.session.id\n )\n\n return (\n navigate(`${basePath}/${viewPaths.SIGN_IN}`)}\n >\n {deviceSessions?.length && (\n \n {sessionData && (\n \n )}\n\n {otherDeviceSessions.map((deviceSession) => (\n \n ))}\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/additional-fields.json b/docs/public/r/additional-fields.json new file mode 100644 index 00000000..88fd9e06 --- /dev/null +++ b/docs/public/r/additional-fields.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "additional-fields", + "type": "registry:file", + "title": "Additional Fields", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/additional-fields.ts", + "content": "import type { ReactNode } from \"react\"\n\nexport type FieldType = \"string\" | \"number\" | \"boolean\"\n\nexport interface AdditionalField {\n description?: ReactNode\n instructions?: ReactNode\n label: ReactNode\n placeholder?: string\n required?: boolean\n type: FieldType\n /**\n * Render a multi-line textarea for string fields\n */\n multiline?: boolean\n validate?: (value: string) => Promise\n}\n\nexport interface AdditionalFields {\n [key: string]: AdditionalField\n}\n", + "type": "registry:file", + "target": "types/additional-fields.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/admin-error-codes.json b/docs/public/r/admin-error-codes.json new file mode 100644 index 00000000..34a14b87 --- /dev/null +++ b/docs/public/r/admin-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "admin-error-codes", + "type": "registry:file", + "title": "Admin Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/admin-error-codes.ts", + "content": "export const ADMIN_ERROR_CODES = {\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n USER_ALREADY_EXISTS: \"User already exists\",\n YOU_CANNOT_BAN_YOURSELF: \"You cannot ban yourself\",\n YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE:\n \"You are not allowed to change users role\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS: \"You are not allowed to create users\",\n YOU_ARE_NOT_ALLOWED_TO_LIST_USERS: \"You are not allowed to list users\",\n YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS:\n \"You are not allowed to list users sessions\",\n YOU_ARE_NOT_ALLOWED_TO_BAN_USERS: \"You are not allowed to ban users\",\n YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS:\n \"You are not allowed to impersonate users\",\n YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS:\n \"You are not allowed to revoke users sessions\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS: \"You are not allowed to delete users\",\n YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD:\n \"You are not allowed to set users password\",\n BANNED_USER: \"You have been banned from this application\"\n}\n", + "type": "registry:file", + "target": "localization/admin-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/alert.json b/docs/public/r/alert.json new file mode 100644 index 00000000..8f0cff66 --- /dev/null +++ b/docs/public/r/alert.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "alert", + "type": "registry:ui", + "title": "Alert", + "description": "", + "dependencies": [ + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/alert.tsx", + "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps) {\n return (\n \n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/anonymous-error-codes.json b/docs/public/r/anonymous-error-codes.json new file mode 100644 index 00000000..2ad5d185 --- /dev/null +++ b/docs/public/r/anonymous-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "anonymous-error-codes", + "type": "registry:file", + "title": "Anonymous Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/anonymous-error-codes.ts", + "content": "export const ANONYMOUS_ERROR_CODES = {\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n COULD_NOT_CREATE_SESSION: \"Could not create session\",\n ANONYMOUS_USERS_CANNOT_SIGN_IN_AGAIN_ANONYMOUSLY:\n \"Anonymous users cannot sign in again anonymously\"\n}\n", + "type": "registry:file", + "target": "localization/anonymous-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/any-auth-client.json b/docs/public/r/any-auth-client.json new file mode 100644 index 00000000..ed67452a --- /dev/null +++ b/docs/public/r/any-auth-client.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "any-auth-client", + "type": "registry:file", + "title": "Any Auth Client", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/types/any-auth-client.ts", + "content": "import type { createAuthClient } from \"better-auth/react\"\n\nexport type AnyAuthClient = Omit<\n ReturnType,\n \"signUp\" | \"getSession\"\n>\n", + "type": "registry:file", + "target": "types/any-auth-client.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/api-key-cell.json b/docs/public/r/api-key-cell.json new file mode 100644 index 00000000..da2eab9b --- /dev/null +++ b/docs/public/r/api-key-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-cell", + "type": "registry:component", + "title": "Api Key Cell", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/api-key-delete-dialog.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-cell.tsx", + "content": "\"use client\"\n\nimport { KeyRoundIcon } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { ApiKey } from \"../../../types/api-key\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { ApiKeyDeleteDialog } from \"./api-key-delete-dialog\"\n\nexport interface ApiKeyCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n apiKey: ApiKey\n localization?: Partial\n refetch?: Refetch\n}\n\nexport function ApiKeyCell({\n className,\n classNames,\n apiKey,\n localization,\n refetch\n}: ApiKeyCellProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n\n // Format expiration date or show \"Never expires\"\n const formatExpiration = () => {\n if (!apiKey.expiresAt) return localization.NEVER_EXPIRES\n\n const expiresDate = new Date(apiKey.expiresAt)\n return `${localization.EXPIRES} ${expiresDate.toLocaleDateString(\n lang ?? \"en\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\"\n }\n )}`\n }\n\n return (\n <>\n \n \n\n
\n
\n \n {apiKey.name}\n \n\n \n {apiKey.start}\n {\"******\"}\n \n
\n\n
\n {formatExpiration()}\n
\n
\n\n setShowDeleteDialog(true)}\n >\n {localization.DELETE}\n \n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/api-key-delete-dialog.json b/docs/public/r/api-key-delete-dialog.json new file mode 100644 index 00000000..c80298b8 --- /dev/null +++ b/docs/public/r/api-key-delete-dialog.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-delete-dialog", + "type": "registry:component", + "title": "Api Key Delete Dialog", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-delete-dialog.tsx", + "content": "\"use client\"\n\nimport { KeyRoundIcon, Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { ApiKey } from \"../../../types/api-key\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface ApiKeyDeleteDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n apiKey: ApiKey\n localization?: AuthLocalization\n refetch?: Refetch\n}\n\nexport function ApiKeyDeleteDialog({\n classNames,\n apiKey,\n localization,\n refetch,\n onOpenChange,\n ...props\n}: ApiKeyDeleteDialogProps) {\n const {\n localization: contextLocalization,\n mutators: { deleteApiKey },\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleDelete = async () => {\n setIsLoading(true)\n\n try {\n await deleteApiKey({ keyId: apiKey.id })\n await refetch?.()\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n // Format expiration date or show \"Never expires\"\n const formatExpiration = () => {\n if (!apiKey.expiresAt) return localization.NEVER_EXPIRES\n\n const expiresDate = new Date(apiKey.expiresAt)\n return `${localization.EXPIRES} ${expiresDate.toLocaleDateString(\n lang ?? \"en\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\"\n }\n )}`\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.DELETE} {localization.API_KEY}\n \n\n \n {localization.DELETE_API_KEY_CONFIRM}\n \n \n\n \n \n\n
\n
\n \n {apiKey.name}\n \n\n \n {apiKey.start}\n {\"******\"}\n \n
\n\n
\n {formatExpiration()}\n
\n
\n \n\n \n onOpenChange?.(false)}\n disabled={isLoading}\n className={cn(\n classNames?.button,\n classNames?.secondaryButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isLoading && }\n {localization.DELETE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/api-key-display-dialog.json b/docs/public/r/api-key-display-dialog.json new file mode 100644 index 00000000..f0857a2b --- /dev/null +++ b/docs/public/r/api-key-display-dialog.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-display-dialog", + "type": "registry:component", + "title": "Api Key Display Dialog", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-display-dialog.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface ApiKeyDisplayDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n apiKey: string\n}\n\nexport function ApiKeyDisplayDialog({\n classNames,\n apiKey,\n localization,\n onOpenChange,\n ...props\n}: ApiKeyDisplayDialogProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n localization = { ...contextLocalization, ...localization }\n\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n navigator.clipboard.writeText(apiKey)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.API_KEY_CREATED}\n \n\n \n {localization.CREATE_API_KEY_SUCCESS}\n \n \n\n
\n {apiKey}\n
\n\n \n \n {copied ? (\n <>\n \n {localization.COPIED_TO_CLIPBOARD}\n \n ) : (\n <>\n \n {localization.COPY_TO_CLIPBOARD}\n \n )}\n \n\n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.primaryButton\n )}\n >\n {localization.DONE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/api-key-error-codes.json b/docs/public/r/api-key-error-codes.json new file mode 100644 index 00000000..09f95a5e --- /dev/null +++ b/docs/public/r/api-key-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-error-codes", + "type": "registry:file", + "title": "Api Key Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/api-key-error-codes.ts", + "content": "export const API_KEY_ERROR_CODES = {\n INVALID_METADATA_TYPE: \"metadata must be an object or undefined\",\n REFILL_AMOUNT_AND_INTERVAL_REQUIRED:\n \"refillAmount is required when refillInterval is provided\",\n REFILL_INTERVAL_AND_AMOUNT_REQUIRED:\n \"refillInterval is required when refillAmount is provided\",\n USER_BANNED: \"User is banned\",\n UNAUTHORIZED_SESSION: \"Unauthorized or invalid session\",\n KEY_NOT_FOUND: \"API Key not found\",\n KEY_DISABLED: \"API Key is disabled\",\n KEY_EXPIRED: \"API Key has expired\",\n USAGE_EXCEEDED: \"API Key has reached its usage limit\",\n KEY_NOT_RECOVERABLE: \"API Key is not recoverable\",\n EXPIRES_IN_IS_TOO_SMALL:\n \"The expiresIn is smaller than the predefined minimum value.\",\n EXPIRES_IN_IS_TOO_LARGE:\n \"The expiresIn is larger than the predefined maximum value.\",\n INVALID_REMAINING: \"The remaining count is either too large or too small.\",\n INVALID_PREFIX_LENGTH:\n \"The prefix length is either too large or too small.\",\n INVALID_NAME_LENGTH: \"The name length is either too large or too small.\",\n METADATA_DISABLED: \"Metadata is disabled.\",\n RATE_LIMIT_EXCEEDED: \"Rate limit exceeded.\",\n NO_VALUES_TO_UPDATE: \"No values to update.\",\n KEY_DISABLED_EXPIRATION: \"Custom key expiration values are disabled.\",\n INVALID_API_KEY: \"Invalid API key.\",\n INVALID_USER_ID_FROM_API_KEY: \"The user id from the API key is invalid.\",\n INVALID_API_KEY_GETTER_RETURN_TYPE:\n \"API Key getter returned an invalid key type. Expected string.\",\n SERVER_ONLY_PROPERTY:\n \"The property you're trying to set can only be set from the server auth instance only.\"\n}\n", + "type": "registry:file", + "target": "localization/api-key-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/api-key.json b/docs/public/r/api-key.json new file mode 100644 index 00000000..fd0eecb8 --- /dev/null +++ b/docs/public/r/api-key.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key", + "type": "registry:file", + "title": "Api Key", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/api-key.ts", + "content": "export type ApiKey = {\n id: string\n name?: string | null\n start?: string | null\n expiresAt?: Date | null\n createdAt: Date\n updatedAt: Date\n metadata?: Record | null\n}\n", + "type": "registry:file", + "target": "types/api-key.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/api-keys-card.json b/docs/public/r/api-keys-card.json new file mode 100644 index 00000000..15f03919 --- /dev/null +++ b/docs/public/r/api-keys-card.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-keys-card", + "type": "registry:component", + "title": "Api Keys Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/api-key-cell.json", + "http://localhost:3000/r/api-key-display-dialog.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-api-key-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-keys-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useMemo, useState } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { ApiKeyCell } from \"./api-key-cell\"\nimport { ApiKeyDisplayDialog } from \"./api-key-display-dialog\"\nimport { CreateApiKeyDialog } from \"./create-api-key-dialog\"\n\nexport interface ApiKeysCardProps extends SettingsCardProps {\n organizationId?: string\n}\n\nexport function ApiKeysCard({\n className,\n classNames,\n localization,\n organizationId,\n ...props\n}: ApiKeysCardProps) {\n const {\n hooks: { useListApiKeys },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: apiKeys, isPending, refetch } = useListApiKeys()\n\n // Filter API keys by organizationId\n const filteredApiKeys = useMemo(() => {\n return apiKeys?.filter(\n (apiKey) => organizationId === apiKey.metadata?.organizationId\n )\n }, [apiKeys, organizationId])\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false)\n const [displayDialogOpen, setDisplayDialogOpen] = useState(false)\n const [createdApiKey, setCreatedApiKey] = useState(\"\")\n\n const handleCreateApiKey = (apiKey: string) => {\n setCreatedApiKey(apiKey)\n setDisplayDialogOpen(true)\n }\n\n return (\n <>\n setCreateDialogOpen(true)}\n {...props}\n >\n {filteredApiKeys && filteredApiKeys.length > 0 && (\n \n {filteredApiKeys?.map((apiKey) => (\n \n ))}\n \n )}\n \n\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-callback.json b/docs/public/r/auth-callback.json new file mode 100644 index 00000000..182c4b2f --- /dev/null +++ b/docs/public/r/auth-callback.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-callback", + "type": "registry:component", + "title": "Auth Callback", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/auth-callback.tsx", + "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function AuthCallback({ redirectTo }: { redirectTo?: string }) {\n const {\n hooks: { useIsRestoring },\n persistClient\n } = useContext(AuthUIContext)\n\n const isRestoring = useIsRestoring?.()\n const isRedirecting = useRef(false)\n\n const { onSuccess } = useOnSuccessTransition({ redirectTo })\n\n useEffect(() => {\n if (isRedirecting.current) return\n\n if (!persistClient) {\n isRedirecting.current = true\n onSuccess()\n return\n }\n\n if (isRestoring) return\n\n isRedirecting.current = true\n onSuccess()\n }, [isRestoring, persistClient, onSuccess])\n\n return \n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-client.json b/docs/public/r/auth-client.json new file mode 100644 index 00000000..1d2ecc08 --- /dev/null +++ b/docs/public/r/auth-client.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-client", + "type": "registry:file", + "title": "Auth Client", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-client.ts", + "content": "import {\n anonymousClient,\n apiKeyClient,\n emailOTPClient,\n genericOAuthClient,\n magicLinkClient,\n multiSessionClient,\n oneTapClient,\n organizationClient,\n passkeyClient,\n twoFactorClient,\n usernameClient\n} from \"better-auth/client/plugins\"\nimport { createAuthClient } from \"better-auth/react\"\n\nexport const authClient = createAuthClient({\n plugins: [\n apiKeyClient(),\n multiSessionClient(),\n passkeyClient(),\n oneTapClient({\n clientId: \"\"\n }),\n genericOAuthClient(),\n anonymousClient(),\n usernameClient(),\n magicLinkClient(),\n emailOTPClient(),\n twoFactorClient(),\n organizationClient()\n ]\n})\n\nexport type AuthClient = typeof authClient\n\nexport type Session = AuthClient[\"$Infer\"][\"Session\"][\"session\"]\nexport type User = AuthClient[\"$Infer\"][\"Session\"][\"user\"]\n", + "type": "registry:file", + "target": "types/auth-client.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-data-cache.json b/docs/public/r/auth-data-cache.json new file mode 100644 index 00000000..73188ee4 --- /dev/null +++ b/docs/public/r/auth-data-cache.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-data-cache", + "type": "registry:lib", + "title": "Auth Data Cache", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/auth-data-cache.ts", + "content": "type CacheEntry = {\n data: T | null\n timestamp: number\n isRefetching: boolean\n}\n\nclass AuthDataCache {\n private cache = new Map>()\n private listeners = new Map void>>()\n private inFlightRequests = new Map>()\n\n get(key: string): CacheEntry | undefined {\n return this.cache.get(key) as CacheEntry | undefined\n }\n\n set(key: string, data: T | null) {\n const entry: CacheEntry = {\n data,\n timestamp: Date.now(),\n isRefetching: false\n }\n this.cache.set(key, entry)\n this.notify(key)\n }\n\n setRefetching(key: string, isRefetching: boolean) {\n const entry = this.cache.get(key)\n if (entry) {\n entry.isRefetching = isRefetching\n this.notify(key)\n }\n }\n\n clear(key?: string) {\n if (key) {\n this.cache.delete(key)\n this.inFlightRequests.delete(key)\n this.notify(key)\n } else {\n this.cache.clear()\n this.inFlightRequests.clear()\n const keys = Array.from(this.listeners.keys())\n for (const key of keys) {\n this.notify(key)\n }\n }\n }\n\n getInFlightRequest(key: string): Promise | undefined {\n return this.inFlightRequests.get(key) as Promise | undefined\n }\n\n setInFlightRequest(key: string, promise: Promise) {\n this.inFlightRequests.set(key, promise)\n }\n\n removeInFlightRequest(key: string) {\n this.inFlightRequests.delete(key)\n }\n\n subscribe(key: string, callback: () => void) {\n if (!this.listeners.has(key)) {\n this.listeners.set(key, new Set())\n }\n this.listeners.get(key)!.add(callback)\n\n return () => {\n const callbacks = this.listeners.get(key)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.listeners.delete(key)\n }\n }\n }\n }\n\n private notify(key: string) {\n const callbacks = this.listeners.get(key)\n if (callbacks) {\n const callbackArray = Array.from(callbacks)\n for (const callback of callbackArray) {\n callback()\n }\n }\n }\n}\n\n// Global singleton instance\nexport const authDataCache = new AuthDataCache()\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-form.json b/docs/public/r/auth-form.json new file mode 100644 index 00000000..50212291 --- /dev/null +++ b/docs/public/r/auth-form.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-form", + "type": "registry:component", + "title": "Auth Form", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/email-otp-form.json", + "http://localhost:3000/r/forgot-password-form.json", + "http://localhost:3000/r/magic-link-form.json", + "http://localhost:3000/r/recover-account-form.json", + "http://localhost:3000/r/reset-password-form.json", + "http://localhost:3000/r/sign-in-form.json", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/sign-up-form.json", + "http://localhost:3000/r/two-factor-form.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-form.tsx", + "content": "\"use client\"\n\nimport { useContext, useEffect } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { getViewByPath } from \"../../lib/utils\"\nimport type { AuthViewPath } from \"../../lib/view-paths\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { AuthCallback } from \"./auth-callback\"\nimport { EmailOTPForm } from \"./forms/email-otp-form\"\nimport { ForgotPasswordForm } from \"./forms/forgot-password-form\"\nimport { MagicLinkForm } from \"./forms/magic-link-form\"\nimport { RecoverAccountForm } from \"./forms/recover-account-form\"\nimport { ResetPasswordForm } from \"./forms/reset-password-form\"\nimport { SignInForm } from \"./forms/sign-in-form\"\nimport { SignUpForm } from \"./forms/sign-up-form\"\nimport { TwoFactorForm } from \"./forms/two-factor-form\"\nimport { SignOut } from \"./sign-out\"\n\nexport type AuthFormClassNames = {\n base?: string\n button?: string\n checkbox?: string\n description?: string\n error?: string\n forgotPasswordLink?: string\n icon?: string\n input?: string\n label?: string\n otpInput?: string\n otpInputContainer?: string\n outlineButton?: string\n primaryButton?: string\n providerButton?: string\n qrCode?: string\n secondaryButton?: string\n}\n\nexport interface AuthFormProps {\n className?: string\n classNames?: AuthFormClassNames\n callbackURL?: string\n isSubmitting?: boolean\n localization?: Partial\n pathname?: string\n redirectTo?: string\n view?: AuthViewPath\n otpSeparators?: 0 | 1 | 2\n setIsSubmitting?: (isSubmitting: boolean) => void\n}\n\nexport function AuthForm({\n className,\n classNames,\n callbackURL,\n isSubmitting,\n localization,\n pathname,\n redirectTo,\n view,\n otpSeparators = 0,\n setIsSubmitting\n}: AuthFormProps) {\n const {\n basePath,\n credentials,\n localization: contextLocalization,\n magicLink,\n emailOTP,\n signUp,\n twoFactor: twoFactorEnabled,\n viewPaths,\n replace\n } = useContext(AuthUIContext)\n\n const signUpEnabled = !!signUp\n\n localization = { ...contextLocalization, ...localization }\n\n useEffect(() => {\n if (pathname && !getViewByPath(viewPaths, pathname)) {\n console.error(`Invalid auth view: ${pathname}`)\n replace(`${basePath}/${viewPaths.SIGN_IN}${window.location.search}`)\n }\n }, [pathname, viewPaths, basePath, replace])\n\n view =\n view ||\n (getViewByPath(viewPaths, pathname) as AuthViewPath) ||\n \"SIGN_IN\"\n\n // Redirect to appropriate view based on enabled features\n useEffect(() => {\n let isInvalidView = false\n\n if (\n view === \"MAGIC_LINK\" &&\n (!magicLink || (!credentials && !emailOTP))\n ) {\n isInvalidView = true\n }\n\n if (\n view === \"EMAIL_OTP\" &&\n (!emailOTP || (!credentials && !magicLink))\n ) {\n isInvalidView = true\n }\n\n if (view === \"SIGN_UP\" && !signUpEnabled) {\n isInvalidView = true\n }\n\n if (\n !credentials &&\n [\n \"SIGN_UP\",\n \"FORGOT_PASSWORD\",\n \"RESET_PASSWORD\",\n \"TWO_FACTOR\",\n \"RECOVER_ACCOUNT\"\n ].includes(view)\n ) {\n isInvalidView = true\n }\n\n if (\n [\"TWO_FACTOR\", \"RECOVER_ACCOUNT\"].includes(view) &&\n !twoFactorEnabled\n ) {\n isInvalidView = true\n }\n\n if (isInvalidView) {\n replace(`${basePath}/${viewPaths.SIGN_IN}${window.location.search}`)\n }\n }, [\n basePath,\n view,\n viewPaths,\n credentials,\n replace,\n emailOTP,\n signUpEnabled,\n magicLink,\n twoFactorEnabled\n ])\n\n if (view === \"SIGN_OUT\") return \n if (view === \"CALLBACK\") return \n\n if (view === \"SIGN_IN\") {\n return credentials ? (\n \n ) : magicLink ? (\n \n ) : emailOTP ? (\n \n ) : null\n }\n\n if (view === \"TWO_FACTOR\") {\n return (\n \n )\n }\n\n if (view === \"RECOVER_ACCOUNT\") {\n return (\n \n )\n }\n\n if (view === \"MAGIC_LINK\") {\n return (\n \n )\n }\n\n if (view === \"EMAIL_OTP\") {\n return (\n \n )\n }\n\n if (view === \"FORGOT_PASSWORD\") {\n return (\n \n )\n }\n\n if (view === \"RESET_PASSWORD\") {\n return (\n \n )\n }\n\n if (view === \"SIGN_UP\") {\n return (\n signUpEnabled && (\n \n )\n )\n }\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-hooks.json b/docs/public/r/auth-hooks.json new file mode 100644 index 00000000..5c0ecf48 --- /dev/null +++ b/docs/public/r/auth-hooks.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-hooks", + "type": "registry:file", + "title": "Auth Hooks", + "description": "", + "dependencies": [ + "@better-fetch/fetch", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/invitation.json", + "http://localhost:3000/r/refetch.json" + ], + "files": [ + { + "path": "src/types/auth-hooks.ts", + "content": "import type { BetterFetchError } from \"@better-fetch/fetch\"\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport type { AnyAuthClient } from \"./any-auth-client\"\nimport type { ApiKey } from \"./api-key\"\nimport type { AuthClient } from \"./auth-client\"\nimport type { Invitation } from \"./invitation\"\nimport type { Refetch } from \"./refetch\"\n\ntype AnyAuthSession = AnyAuthClient[\"$Infer\"][\"Session\"]\n\ntype AuthHook = {\n isPending: boolean\n data?: T | null\n error?: BetterFetchError | null\n refetch?: Refetch\n}\n\nexport type AuthHooks = {\n useSession: () => ReturnType\n useListAccounts: () => AuthHook<{ accountId: string; provider: string }[]>\n useAccountInfo: (\n params: Parameters[0]\n ) => AuthHook<{ user: User }>\n useListDeviceSessions: () => AuthHook\n useListSessions: () => AuthHook\n useListPasskeys: () => Partial>\n useListApiKeys: () => AuthHook\n useActiveOrganization: () => Partial<\n ReturnType\n >\n useListOrganizations: () => Partial<\n ReturnType\n >\n useHasPermission: (\n params: Parameters[0]\n ) => AuthHook<{\n error: null\n success: boolean\n }>\n useInvitation: (\n params: Parameters[0]\n ) => AuthHook<\n Invitation & {\n organizationName: string\n organizationSlug: string\n organizationLogo?: string\n }\n >\n useListInvitations: (\n params: Parameters[0]\n ) => AuthHook\n useListUserInvitations: () => AuthHook\n useListMembers: (\n params: Parameters[0]\n ) => AuthHook<{\n members: (Member & { user?: Partial | null })[]\n total: number\n }>\n useIsRestoring?: () => boolean\n}\n", + "type": "registry:file", + "target": "types/auth-hooks.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-loading.json b/docs/public/r/auth-loading.json new file mode 100644 index 00000000..11bffd45 --- /dev/null +++ b/docs/public/r/auth-loading.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-loading", + "type": "registry:component", + "title": "Auth Loading", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/auth-loading.tsx", + "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content during authentication loading state\n *\n * Renders its children only when the authentication state is being determined\n * (during the loading/pending phase). Once the authentication state is resolved,\n * nothing is rendered. Useful for displaying loading indicators or temporary\n * content while waiting for the authentication check to complete.\n */\nexport function AuthLoading({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { isPending } = useSession()\n\n return isPending ? children : null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-localization.json b/docs/public/r/auth-localization.json new file mode 100644 index 00000000..747c23e1 --- /dev/null +++ b/docs/public/r/auth-localization.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-localization", + "type": "registry:file", + "title": "Auth Localization", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/admin-error-codes.json", + "http://localhost:3000/r/anonymous-error-codes.json", + "http://localhost:3000/r/api-key-error-codes.json", + "http://localhost:3000/r/base-error-codes.json", + "http://localhost:3000/r/captcha-error-codes.json", + "http://localhost:3000/r/email-otp-error-codes.json", + "http://localhost:3000/r/generic-oauth-error-codes.json", + "http://localhost:3000/r/haveibeenpwned-error-codes.json", + "http://localhost:3000/r/multi-session-error-codes.json", + "http://localhost:3000/r/organization-error-codes.json", + "http://localhost:3000/r/passkey-error-codes.json", + "http://localhost:3000/r/phone-number-error-codes.json", + "http://localhost:3000/r/stripe-localization.json", + "http://localhost:3000/r/two-factor-error-codes.json", + "http://localhost:3000/r/username-error-codes.json" + ], + "files": [ + { + "path": "src/localization/auth-localization.ts", + "content": "import { ADMIN_ERROR_CODES } from \"./admin-error-codes\"\nimport { ANONYMOUS_ERROR_CODES } from \"./anonymous-error-codes\"\nimport { API_KEY_ERROR_CODES } from \"./api-key-error-codes\"\nimport { BASE_ERROR_CODES } from \"./base-error-codes\"\nimport { CAPTCHA_ERROR_CODES } from \"./captcha-error-codes\"\nimport { EMAIL_OTP_ERROR_CODES } from \"./email-otp-error-codes\"\nimport { GENERIC_OAUTH_ERROR_CODES } from \"./generic-oauth-error-codes\"\nimport { HAVEIBEENPWNED_ERROR_CODES } from \"./haveibeenpwned-error-codes\"\nimport { MULTI_SESSION_ERROR_CODES } from \"./multi-session-error-codes\"\nimport { ORGANIZATION_ERROR_CODES } from \"./organization-error-codes\"\nimport { PASSKEY_ERROR_CODES } from \"./passkey-error-codes\"\nimport { PHONE_NUMBER_ERROR_CODES } from \"./phone-number-error-codes\"\nimport { STRIPE_ERROR_CODES } from \"./stripe-localization\"\nimport { TWO_FACTOR_ERROR_CODES } from \"./two-factor-error-codes\"\nimport { USERNAME_ERROR_CODES } from \"./username-error-codes\"\n\nexport const authLocalization = {\n /** @default \"Account\" */\n ACCOUNT: \"Account\",\n\n /** @default \"Accounts\" */\n ACCOUNTS: \"Accounts\",\n\n /** @default \"Manage your currently signed in accounts.\" */\n ACCOUNTS_DESCRIPTION: \"Switch between your currently signed in accounts.\",\n\n /** @default \"Sign in to an additional account.\" */\n ACCOUNTS_INSTRUCTIONS: \"Sign in to an additional account.\",\n\n /** @default \"Add Account\" */\n ADD_ACCOUNT: \"Add Account\",\n\n /** @default \"Add Passkey\" */\n ADD_PASSKEY: \"Add Passkey\",\n\n /** @default \"Already have an account?\" */\n ALREADY_HAVE_AN_ACCOUNT: \"Already have an account?\",\n\n /** @default \"Avatar\" */\n AVATAR: \"Avatar\",\n\n /** @default \"Click on the avatar to upload a custom one from your files.\" */\n AVATAR_DESCRIPTION:\n \"Click on the avatar to upload a custom one from your files.\",\n\n /** @default \"An avatar is optional but strongly recommended.\" */\n AVATAR_INSTRUCTIONS: \"An avatar is optional but strongly recommended.\",\n\n /** @default \"Backup code is required\" */\n BACKUP_CODE_REQUIRED: \"Backup code is required\",\n\n /** @default \"Backup Codes\" */\n BACKUP_CODES: \"Backup Codes\",\n\n /** @default \"Save these backup codes in a secure place. You can use them to access your account if you lose your two-factor authentication method.\" */\n BACKUP_CODES_DESCRIPTION:\n \"Save these backup codes in a secure place. You can use them to access your account if you lose your two-factor authentication method.\",\n\n /** @default \"Backup Code.\" */\n BACKUP_CODE_PLACEHOLDER: \"Backup Code\",\n\n /** @default \"Backup Code\" */\n BACKUP_CODE: \"Backup Code\",\n\n /** @default \"Cancel\" */\n CANCEL: \"Cancel\",\n\n /** @default \"Change Password\" */\n CHANGE_PASSWORD: \"Change Password\",\n\n /** @default \"Enter your current password and a new password.\" */\n CHANGE_PASSWORD_DESCRIPTION:\n \"Enter your current password and a new password.\",\n\n /** @default \"Please use 8 characters at minimum.\" */\n CHANGE_PASSWORD_INSTRUCTIONS: \"Please use 8 characters at minimum.\",\n\n /** @default \"Your password has been changed.\" */\n CHANGE_PASSWORD_SUCCESS: \"Your password has been changed.\",\n\n /** @default \"Confirm Password\" */\n CONFIRM_PASSWORD: \"Confirm Password\",\n\n /** @default \"Confirm Password\" */\n CONFIRM_PASSWORD_PLACEHOLDER: \"Confirm Password\",\n\n /** @default \"Confirm password is required\" */\n CONFIRM_PASSWORD_REQUIRED: \"Confirm password is required\",\n\n /** @default \"Continue with Authenticator\" */\n CONTINUE_WITH_AUTHENTICATOR: \"Continue with Authenticator\",\n\n /** @default \"Copied to clipboard\" */\n COPIED_TO_CLIPBOARD: \"Copied to clipboard\",\n\n /** @default \"Copy to clipboard\" */\n COPY_TO_CLIPBOARD: \"Copy to clipboard\",\n\n /** @default \"Copy all codes\" */\n COPY_ALL_CODES: \"Copy all codes\",\n\n /** @default \"Continue\" */\n CONTINUE: \"Continue\",\n\n /** @default \"Current Password\" */\n CURRENT_PASSWORD: \"Current Password\",\n\n /** @default \"Current Password\" */\n CURRENT_PASSWORD_PLACEHOLDER: \"Current Password\",\n\n /** @default \"Current Session\" */\n CURRENT_SESSION: \"Current Session\",\n\n /** @default \"Delete\" */\n DELETE: \"Delete\",\n\n /** @default \"Delete Avatar\" */\n DELETE_AVATAR: \"Delete Avatar\",\n\n /** @default \"Delete Account\" */\n DELETE_ACCOUNT: \"Delete Account\",\n\n /** @default \"Permanently remove your account and all of its contents. This action is not reversible, so please continue with caution.\" */\n DELETE_ACCOUNT_DESCRIPTION:\n \"Permanently remove your account and all of its contents. This action is not reversible, so please continue with caution.\",\n\n /** @default \"Please confirm the deletion of your account. This action is not reversible, so please continue with caution.\" */\n DELETE_ACCOUNT_INSTRUCTIONS:\n \"Please confirm the deletion of your account. This action is not reversible, so please continue with caution.\",\n\n /** @default \"Please check your email to verify the deletion of your account.\" */\n DELETE_ACCOUNT_VERIFY:\n \"Please check your email to verify the deletion of your account.\",\n\n /** @default \"Your account has been deleted.\" */\n DELETE_ACCOUNT_SUCCESS: \"Your account has been deleted.\",\n\n /** @default \"Disable Two-Factor\" */\n DISABLE_TWO_FACTOR: \"Disable Two-Factor\",\n\n /** @default \"Choose a provider to login to your account\" */\n DISABLED_CREDENTIALS_DESCRIPTION:\n \"Choose a provider to login to your account\",\n\n /** @default \"Don't have an account?\" */\n DONT_HAVE_AN_ACCOUNT: \"Don't have an account?\",\n\n /** @default \"Done\" */\n DONE: \"Done\",\n\n /** @default \"Email\" */\n EMAIL: \"Email\",\n\n /** @default \"Enter the email address you want to use to log in.\" */\n EMAIL_DESCRIPTION: \"Enter the email address you want to use to log in.\",\n\n /** @default \"Please enter a valid email address.\" */\n EMAIL_INSTRUCTIONS: \"Please enter a valid email address.\",\n\n /** @default \"Email is the same\" */\n EMAIL_IS_THE_SAME: \"Email is the same\",\n\n /** @default \"m@example.com\" */\n EMAIL_PLACEHOLDER: \"m@example.com\",\n\n /** @default \"Email address is required\" */\n EMAIL_REQUIRED: \"Email address is required\",\n\n /** @default \"Please check your email to verify the change.\" */\n EMAIL_VERIFY_CHANGE: \"Please check your email to verify the change.\",\n\n /** @default \"Please check your email for the verification link.\" */\n EMAIL_VERIFICATION: \"Please check your email for the verification link.\",\n\n /** @default \"Enable Two-Factor\" */\n ENABLE_TWO_FACTOR: \"Enable Two-Factor\",\n\n /** @default \"is invalid\" */\n IS_INVALID: \"is invalid\",\n\n /** @default \"is required\" */\n IS_REQUIRED: \"is required\",\n\n /** @default \"is the same\" */\n IS_THE_SAME: \"is the same\",\n\n /** @default \"Forgot authenticator?\" */\n FORGOT_AUTHENTICATOR: \"Forgot authenticator?\",\n\n /** @default \"Forgot Password\" */\n FORGOT_PASSWORD: \"Forgot Password\",\n\n /** @default \"Send reset link\" */\n FORGOT_PASSWORD_ACTION: \"Send reset link\",\n\n /** @default \"Enter your email to reset your password\" */\n FORGOT_PASSWORD_DESCRIPTION: \"Enter your email to reset your password\",\n\n /** @default \"Check your email for the password reset link.\" */\n FORGOT_PASSWORD_EMAIL: \"Check your email for the password reset link.\",\n\n /** @default \"Forgot your password?\" */\n FORGOT_PASSWORD_LINK: \"Forgot your password?\",\n\n /** @default \"Link\" */\n LINK: \"Link\",\n\n /** @default \"Magic Link\" */\n MAGIC_LINK: \"Magic Link\",\n\n /** @default \"Send magic link\" */\n MAGIC_LINK_ACTION: \"Send magic link\",\n\n /** @default \"Enter your email to receive a magic link\" */\n MAGIC_LINK_DESCRIPTION: \"Enter your email to receive a magic link\",\n\n /** @default \"Check your email for the magic link\" */\n MAGIC_LINK_EMAIL: \"Check your email for the magic link\",\n\n /** @default \"Email Code\" */\n EMAIL_OTP: \"Email Code\",\n\n /** @default \"Send code\" */\n EMAIL_OTP_SEND_ACTION: \"Send code\",\n\n /** @default \"Verify code\" */\n EMAIL_OTP_VERIFY_ACTION: \"Verify code\",\n\n /** @default \"Enter your email to receive a code\" */\n EMAIL_OTP_DESCRIPTION: \"Enter your email to receive a code\",\n\n /** @default \"Please check your email for the verification code.\" */\n EMAIL_OTP_VERIFICATION_SENT:\n \"Please check your email for the verification code.\",\n\n /** @default \"Name\" */\n NAME: \"Name\",\n\n /** @default \"Please enter your full name, or a display name.\" */\n NAME_DESCRIPTION: \"Please enter your full name, or a display name.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n NAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Name\" */\n NAME_PLACEHOLDER: \"Name\",\n\n /** @default \"New Password\" */\n NEW_PASSWORD: \"New Password\",\n\n /** @default \"New Password\" */\n NEW_PASSWORD_PLACEHOLDER: \"New Password\",\n\n /** @default \"New password is required\" */\n NEW_PASSWORD_REQUIRED: \"New password is required\",\n\n /** @default \"One-Time Password\" */\n ONE_TIME_PASSWORD: \"One-Time Password\",\n\n /** @default \"Or continue with\" */\n OR_CONTINUE_WITH: \"Or continue with\",\n\n /** @default \"Passkey\" */\n PASSKEY: \"Passkey\",\n\n /** @default \"Passkeys\" */\n PASSKEYS: \"Passkeys\",\n\n /** @default \"Manage your passkeys for secure access.\" */\n PASSKEYS_DESCRIPTION: \"Manage your passkeys for secure access.\",\n\n /** @default \"Securely access your account without a password.\" */\n PASSKEYS_INSTRUCTIONS: \"Securely access your account without a password.\",\n\n /** @default \"Personal Account\" */\n PERSONAL_ACCOUNT: \"Personal Account\",\n\n /** @default \"API Keys\" */\n API_KEYS: \"API Keys\",\n\n /** @default \"Manage your API keys for secure access.\" */\n API_KEYS_DESCRIPTION: \"Manage your API keys for secure access.\",\n\n /** @default \"Generate API keys to access your account programmatically.\" */\n API_KEYS_INSTRUCTIONS:\n \"Generate API keys to access your account programmatically.\",\n\n /** @default \"Create API Key\" */\n CREATE_API_KEY: \"Create API Key\",\n\n /** @default \"Enter a unique name for your API key to differentiate it from other keys.\" */\n CREATE_API_KEY_DESCRIPTION:\n \"Enter a unique name for your API key to differentiate it from other keys.\",\n\n /** @default \"New API Key\" */\n API_KEY_NAME_PLACEHOLDER: \"New API Key\",\n\n /** @default \"API Key Created\" */\n API_KEY_CREATED: \"API Key Created\",\n\n /** @default \"Please copy your API key and store it in a safe place. For security reasons we cannot show it again.\" */\n CREATE_API_KEY_SUCCESS:\n \"Please copy your API key and store it in a safe place. For security reasons we cannot show it again.\",\n\n /** @default \"Never Expires\" */\n NEVER_EXPIRES: \"Never Expires\",\n\n /** @default \"Expires\" */\n EXPIRES: \"Expires\",\n\n /** @default \"No Expiration\" */\n NO_EXPIRATION: \"No Expiration\",\n\n /** @default \"Create Organization\" */\n CREATE_ORGANIZATION: \"Create Organization\",\n\n /** @default \"Organization\" */\n ORGANIZATION: \"Organization\",\n\n /** @default \"Name\" */\n ORGANIZATION_NAME: \"Name\",\n\n /** @default \"Acme Inc.\" */\n ORGANIZATION_NAME_PLACEHOLDER: \"Acme Inc.\",\n\n /** @default \"This is your organization's visible name.\" */\n ORGANIZATION_NAME_DESCRIPTION: \"This is your organization's visible name.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n ORGANIZATION_NAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Slug URL\" */\n ORGANIZATION_SLUG: \"Slug URL\",\n\n /** @default \"This is your organization's URL namespace.\" */\n ORGANIZATION_SLUG_DESCRIPTION: \"This is your organization's URL namespace.\",\n\n /** @default \"Please use 48 characters at maximum.\" */\n ORGANIZATION_SLUG_INSTRUCTIONS: \"Please use 48 characters at maximum.\",\n\n /** @default \"acme-inc\" */\n ORGANIZATION_SLUG_PLACEHOLDER: \"acme-inc\",\n\n /** @default \"Organization created successfully\" */\n CREATE_ORGANIZATION_SUCCESS: \"Organization created successfully\",\n\n /** @default \"Password\" */\n PASSWORD: \"Password\",\n\n /** @default \"Password\" */\n PASSWORD_PLACEHOLDER: \"Password\",\n\n /** @default \"Password is required\" */\n PASSWORD_REQUIRED: \"Password is required\",\n\n /** @default \"Passwords do not match\" */\n PASSWORDS_DO_NOT_MATCH: \"Passwords do not match\",\n\n /** @default \"Providers\" */\n PROVIDERS: \"Providers\",\n\n /** @default \"Connect your account with a third-party service.\" */\n PROVIDERS_DESCRIPTION: \"Connect your account with a third-party service.\",\n\n /** @default \"Recover Account\" */\n RECOVER_ACCOUNT: \"Recover Account\",\n\n /** @default \"Recover account\" */\n RECOVER_ACCOUNT_ACTION: \"Recover account\",\n\n /** @default \"Please enter a backup code to access your account\" */\n RECOVER_ACCOUNT_DESCRIPTION:\n \"Please enter a backup code to access your account\",\n\n /** @default \"Remember me\" */\n REMEMBER_ME: \"Remember me\",\n\n /** @default \"Resend code\" */\n RESEND_CODE: \"Resend code\",\n\n /** @default \"Resend verification email\" */\n RESEND_VERIFICATION_EMAIL: \"Resend Verification Email\",\n\n /** @default \"Reset Password\" */\n RESET_PASSWORD: \"Reset Password\",\n\n /** @default \"Save new password\" */\n RESET_PASSWORD_ACTION: \"Save new password\",\n\n /** @default \"Enter your new password below\" */\n RESET_PASSWORD_DESCRIPTION: \"Enter your new password below\",\n\n /** @default \"Password reset successfully\" */\n RESET_PASSWORD_SUCCESS: \"Password reset successfully\",\n\n /** @default \"Request failed\" */\n REQUEST_FAILED: \"Request failed\",\n\n /** @default \"Revoke\" */\n REVOKE: \"Revoke\",\n\n /** @default \"Delete API Key\" */\n DELETE_API_KEY: \"Delete API Key\",\n\n /** @default \"Are you sure you want to delete this API key?\" */\n DELETE_API_KEY_CONFIRM: \"Are you sure you want to delete this API key?\",\n\n /** @default \"API Key\" */\n API_KEY: \"API Key\",\n\n /** @default \"Sign In\" */\n SIGN_IN: \"Sign In\",\n\n /** @default \"Login\" */\n SIGN_IN_ACTION: \"Login\",\n\n /** @default \"Enter your email below to login to your account\" */\n SIGN_IN_DESCRIPTION: \"Enter your email below to login to your account\",\n\n /** @default \"Enter your username or email below to login to your account\" */\n SIGN_IN_USERNAME_DESCRIPTION:\n \"Enter your username or email to login to your account\",\n\n /** @default \"Sign in with\" */\n SIGN_IN_WITH: \"Sign in with\",\n\n /** @default \"Sign Out\" */\n SIGN_OUT: \"Sign Out\",\n\n /** @default \"Sign Up\" */\n SIGN_UP: \"Sign Up\",\n\n /** @default \"Create an account\" */\n SIGN_UP_ACTION: \"Create an account\",\n\n /** @default \"Enter your information to create an account\" */\n SIGN_UP_DESCRIPTION: \"Enter your information to create an account\",\n\n /** @default \"Check your email for the verification link.\" */\n SIGN_UP_EMAIL: \"Check your email for the verification link.\",\n\n /** @default \"Sessions\" */\n SESSIONS: \"Sessions\",\n\n /** @default \"Manage your active sessions and revoke access.\" */\n SESSIONS_DESCRIPTION: \"Manage your active sessions and revoke access.\",\n\n /** @default \"Set Password\" */\n SET_PASSWORD: \"Set Password\",\n\n /** @default \"Click the button below to receive an email to set up a password for your account.\" */\n SET_PASSWORD_DESCRIPTION:\n \"Click the button below to receive an email to set up a password for your account.\",\n\n /** @default \"Settings\" */\n SETTINGS: \"Settings\",\n\n /** @default \"Save\" */\n SAVE: \"Save\",\n\n /** @default \"Security\" */\n SECURITY: \"Security\",\n\n /** @default \"Switch Account\" */\n SWITCH_ACCOUNT: \"Switch Account\",\n\n /** @default \"Trust this device\" */\n TRUST_DEVICE: \"Trust this device\",\n\n /** @default \"Two-Factor\" */\n TWO_FACTOR: \"Two-Factor\",\n\n /** @default \"Verify code\" */\n TWO_FACTOR_ACTION: \"Verify code\",\n\n /** @default \"Please enter your one-time password to continue\" */\n TWO_FACTOR_DESCRIPTION: \"Please enter your one-time password to continue\",\n\n /** @default \"Add an extra layer of security to your account.\" */\n TWO_FACTOR_CARD_DESCRIPTION:\n \"Add an extra layer of security to your account.\",\n\n /** @default \"Please enter your password to disable 2FA.\" */\n TWO_FACTOR_DISABLE_INSTRUCTIONS:\n \"Please enter your password to disable 2FA.\",\n\n /** @default \"Please enter your password to enable 2FA\" */\n TWO_FACTOR_ENABLE_INSTRUCTIONS: \"Please enter your password to enable 2FA.\",\n\n /** @default \"Two-factor authentication has been enabled\" */\n TWO_FACTOR_ENABLED: \"Two-factor authentication has been enabled\",\n\n /** @default \"Two-Factor Authentication has been disabled\" */\n TWO_FACTOR_DISABLED: \"Two-Factor Authentication has been disabled\",\n\n /** @default \"Two-Factor Authentication\" */\n TWO_FACTOR_PROMPT: \"Two-Factor Authentication\",\n\n /** @default \"Scan the QR Code with your Authenticator\" */\n TWO_FACTOR_TOTP_LABEL: \"Scan the QR Code with your Authenticator\",\n\n /** @default \"Send verification code\" */\n SEND_VERIFICATION_CODE: \"Send verification code\",\n\n /** @default \"Unlink\" */\n UNLINK: \"Unlink\",\n\n /** @default \"Updated successfully\" */\n UPDATED_SUCCESSFULLY: \"updated successfully\",\n\n /** @default \"Username\" */\n USERNAME: \"Username\",\n\n /** @default \"Enter the username you want to use to log in.\" */\n USERNAME_DESCRIPTION: \"Enter the username you want to use to log in.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n USERNAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Username\" */\n USERNAME_PLACEHOLDER: \"Username\",\n\n /** @default \"Username or email\" */\n SIGN_IN_USERNAME_PLACEHOLDER: \"Username or email\",\n\n /** @default \"Verify Your Email\" */\n VERIFY_YOUR_EMAIL: \"Verify Your Email\",\n\n /** @default \"Please verify your email address. Check your inbox for the verification email. If you haven't received the email, click the button below to resend.\" */\n VERIFY_YOUR_EMAIL_DESCRIPTION:\n \"Please verify your email address. Check your inbox for the verification email. If you haven't received the email, click the button below to resend.\",\n\n /** @default \"Go back\" */\n GO_BACK: \"Go back\",\n\n /** @default \"Your session is not fresh. Please sign in again.\" */\n SESSION_NOT_FRESH: \"Your session is not fresh. Please sign in again.\",\n\n /** @default \"Upload Avatar\" */\n UPLOAD_AVATAR: \"Upload Avatar\",\n\n /** @default \"Logo\" */\n LOGO: \"Logo\",\n\n /** @default \"Click on the logo to upload a custom one from your files.\" */\n LOGO_DESCRIPTION:\n \"Click on the logo to upload a custom one from your files.\",\n\n /** @default \"A logo is optional but strongly recommended.\" */\n LOGO_INSTRUCTIONS: \"A logo is optional but strongly recommended.\",\n\n /** @default \"Upload\" */\n UPLOAD: \"Upload\",\n\n /** @default \"Upload Logo\" */\n UPLOAD_LOGO: \"Upload Logo\",\n\n /** @default \"Delete Logo\" */\n DELETE_LOGO: \"Delete Logo\",\n\n /** @default \"Privacy Policy\" */\n PRIVACY_POLICY: \"Privacy Policy\",\n\n /** @default \"Terms of Service\" */\n TERMS_OF_SERVICE: \"Terms of Service\",\n\n /** @default \"This site is protected by reCAPTCHA.\" */\n PROTECTED_BY_RECAPTCHA: \"This site is protected by reCAPTCHA.\",\n\n /** @default \"By continuing, you agree to the\" */\n BY_CONTINUING_YOU_AGREE: \"By continuing, you agree to the\",\n\n /** @default \"User\" */\n USER: \"User\",\n\n /** @default \"Organizations\" */\n ORGANIZATIONS: \"Organizations\",\n\n /** @default \"Manage your organizations and memberships.\" */\n ORGANIZATIONS_DESCRIPTION: \"Manage your organizations and memberships.\",\n\n /** @default \"Create an organization to collaborate with other users.\" */\n ORGANIZATIONS_INSTRUCTIONS:\n \"Create an organization to collaborate with other users.\",\n\n /** @default \"Leave Organization\" */\n LEAVE_ORGANIZATION: \"Leave Organization\",\n\n /** @default \"Are you sure you want to leave this organization?\" */\n LEAVE_ORGANIZATION_CONFIRM:\n \"Are you sure you want to leave this organization?\",\n\n /** @default \"You have successfully left the organization.\" */\n LEAVE_ORGANIZATION_SUCCESS: \"You have successfully left the organization.\",\n\n /** @default \"Manage Organization\" */\n MANAGE_ORGANIZATION: \"Manage Organization\",\n\n /** @default \"Remove Member\" */\n REMOVE_MEMBER: \"Remove Member\",\n\n /** @default \"Are you sure you want to remove this member from the organization?\" */\n REMOVE_MEMBER_CONFIRM:\n \"Are you sure you want to remove this member from the organization?\",\n\n /** @default \"Member removed successfully\" */\n REMOVE_MEMBER_SUCCESS: \"Member removed successfully\",\n\n /** @default \"Invite Member\" */\n INVITE_MEMBER: \"Invite Member\",\n\n /** @default \"Members\" */\n MEMBERS: \"Members\",\n\n /** @default \"Add or remove members and manage their roles.\" */\n MEMBERS_DESCRIPTION: \"Add or remove members and manage their roles.\",\n\n /** @default \"Invite new members to your organization.\" */\n MEMBERS_INSTRUCTIONS: \"Invite new members to your organization.\",\n\n /** @default \"Send an invitation to add a new member to your organization.\" */\n INVITE_MEMBER_DESCRIPTION:\n \"Send an invitation to add a new member to your organization.\",\n\n /** @default \"Role\" */\n ROLE: \"Role\",\n\n /** @default \"Select a role\" */\n SELECT_ROLE: \"Select a role\",\n\n /** @default \"Admin\" */\n ADMIN: \"Admin\",\n\n /** @default \"Member\" */\n MEMBER: \"Member\",\n\n /** @default \"Guest\" */\n GUEST: \"Guest\",\n\n /** @default \"Owner\" */\n OWNER: \"Owner\",\n\n /** @default \"Update the role for this member\" */\n UPDATE_ROLE_DESCRIPTION: \"Update the role for this member\",\n\n /** @default \"Update Role\" */\n UPDATE_ROLE: \"Update Role\",\n\n /** @default \"Member role updated successfully\" */\n MEMBER_ROLE_UPDATED: \"Member role updated successfully\",\n\n /** @default \"Send Invitation\" */\n SEND_INVITATION: \"Send Invitation\",\n\n /** @default \"Invitation sent successfully\" */\n SEND_INVITATION_SUCCESS: \"Invitation sent successfully\",\n\n /** @default \"Pending Invitations\" */\n PENDING_INVITATIONS: \"Pending Invitations\",\n\n /** @default \"Manage pending invitations to your organization.\" */\n PENDING_INVITATIONS_DESCRIPTION:\n \"Manage pending invitations to your organization.\",\n\n /** @default \"Invitations you've received from organizations.\" */\n PENDING_USER_INVITATIONS_DESCRIPTION:\n \"Invitations you've received from organizations.\",\n\n /** @default \"Cancel Invitation\" */\n CANCEL_INVITATION: \"Cancel Invitation\",\n\n /** @default \"Invitation cancelled successfully\" */\n INVITATION_CANCELLED: \"Invitation cancelled successfully\",\n\n /** @default \"Accept Invitation\" */\n ACCEPT_INVITATION: \"Accept Invitation\",\n\n /** @default \"You have been invited to join an organization.\" */\n ACCEPT_INVITATION_DESCRIPTION:\n \"You have been invited to join an organization.\",\n\n /** @default \"Invitation accepted successfully\" */\n INVITATION_ACCEPTED: \"Invitation accepted successfully\",\n\n /** @default \"Invitation rejected successfully\" */\n INVITATION_REJECTED: \"Invitation rejected successfully\",\n\n /** @default \"Accept\" */\n ACCEPT: \"Accept\",\n\n /** @default \"Reject\" */\n REJECT: \"Reject\",\n\n /** @default \"This invitation has expired\" */\n INVITATION_EXPIRED: \"This invitation has expired\",\n\n /** @default \"Delete Organization\" */\n DELETE_ORGANIZATION: \"Delete Organization\",\n\n /** @default \"Permanently remove your organization and all of its contents. This action is not reversible — please continue with caution.\" */\n DELETE_ORGANIZATION_DESCRIPTION:\n \"Permanently remove your organization and all of its contents. This action is not reversible — please continue with caution.\",\n\n /** @default \"Organization deleted successfully\" */\n DELETE_ORGANIZATION_SUCCESS: \"Organization deleted successfully\",\n\n /** @default \"Enter the organization slug to continue:\" */\n DELETE_ORGANIZATION_INSTRUCTIONS:\n \"Enter the organization slug to continue:\",\n\n /** @default \"Organization slug is required\" */\n SLUG_REQUIRED: \"Organization slug is required\",\n\n /** @default \"The slug does not match\" */\n SLUG_DOES_NOT_MATCH: \"The slug does not match\",\n ...BASE_ERROR_CODES,\n ...ADMIN_ERROR_CODES,\n ...ANONYMOUS_ERROR_CODES,\n ...API_KEY_ERROR_CODES,\n ...CAPTCHA_ERROR_CODES,\n ...EMAIL_OTP_ERROR_CODES,\n ...GENERIC_OAUTH_ERROR_CODES,\n ...HAVEIBEENPWNED_ERROR_CODES,\n ...MULTI_SESSION_ERROR_CODES,\n ...ORGANIZATION_ERROR_CODES,\n ...PASSKEY_ERROR_CODES,\n ...PHONE_NUMBER_ERROR_CODES,\n ...STRIPE_ERROR_CODES,\n ...TWO_FACTOR_ERROR_CODES,\n ...USERNAME_ERROR_CODES\n}\n\nexport type AuthLocalization = Partial\n", + "type": "registry:file", + "target": "localization/auth-localization.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-mutators.json b/docs/public/r/auth-mutators.json new file mode 100644 index 00000000..0e5c6efa --- /dev/null +++ b/docs/public/r/auth-mutators.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-mutators", + "type": "registry:file", + "title": "Auth Mutators", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-mutators.ts", + "content": "type MutateFn> = (\n params: T\n) => Promise | Promise\n\nexport interface AuthMutators {\n deleteApiKey: MutateFn<{ keyId: string }>\n deletePasskey: MutateFn<{ id: string }>\n revokeDeviceSession: MutateFn<{ sessionToken: string }>\n revokeSession: MutateFn<{ token: string }>\n setActiveSession: MutateFn<{ sessionToken: string }>\n updateOrganization: MutateFn<{\n organizationId: string\n data: Record\n }>\n updateUser: MutateFn\n unlinkAccount: MutateFn<{ providerId: string; accountId?: string }>\n}\n", + "type": "registry:file", + "target": "types/auth-mutators.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-ui-provider-tanstack.json b/docs/public/r/auth-ui-provider-tanstack.json new file mode 100644 index 00000000..a7b618bd --- /dev/null +++ b/docs/public/r/auth-ui-provider-tanstack.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-ui-provider-tanstack", + "type": "registry:lib", + "title": "Auth Ui Provider Tanstack", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-tanstack-options.json" + ], + "files": [ + { + "path": "src/lib/tanstack/auth-ui-provider-tanstack.tsx", + "content": "import { useCallback, useMemo } from \"react\"\nimport {\n AuthUIProvider,\n type AuthUIProviderProps\n} from \"../../lib/auth-ui-provider\"\nimport { useTanstackOptions } from \"./use-tanstack-options\"\n\nexport function AuthUIProviderTanstack({\n children,\n authClient,\n hooks: hooksProp,\n mutators: mutatorsProp,\n onSessionChange: onSessionChangeProp,\n ...props\n}: AuthUIProviderProps) {\n const {\n hooks: contextHooks,\n mutators: contextMutators,\n onSessionChange,\n optimistic\n } = useTanstackOptions({ authClient })\n\n const hooks = useMemo(\n () => ({ ...contextHooks, ...hooksProp }),\n [contextHooks, hooksProp]\n )\n const mutators = useMemo(\n () => ({ ...contextMutators, ...mutatorsProp }),\n [contextMutators, mutatorsProp]\n )\n\n const onSessionChangeCallback = useCallback(async () => {\n await onSessionChange()\n await onSessionChangeProp?.()\n }, [onSessionChangeProp, onSessionChange])\n\n return (\n \n {children}\n \n )\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-ui-provider.json b/docs/public/r/auth-ui-provider.json new file mode 100644 index 00000000..ce0131ab --- /dev/null +++ b/docs/public/r/auth-ui-provider.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-ui-provider", + "type": "registry:lib", + "title": "Auth Ui Provider", + "description": "", + "dependencies": [ + "sonner" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-options.json", + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/avatar-options.json", + "http://localhost:3000/r/captcha-options.json", + "http://localhost:3000/r/credentials-options.json", + "http://localhost:3000/r/delete-user-options.json", + "http://localhost:3000/r/generic-oauth-options.json", + "http://localhost:3000/r/gravatar-options.json", + "http://localhost:3000/r/link.json", + "http://localhost:3000/r/organization-options.json", + "http://localhost:3000/r/organization-refetcher.json", + "http://localhost:3000/r/recaptcha-v3.json", + "http://localhost:3000/r/render-toast.json", + "http://localhost:3000/r/sign-up-options.json", + "http://localhost:3000/r/social-options.json", + "http://localhost:3000/r/use-auth-data.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/lib/auth-ui-provider.tsx", + "content": "\"use client\"\n\nimport { createContext, type ReactNode, useMemo } from \"react\"\nimport { toast } from \"sonner\"\n\nimport { RecaptchaV3 } from \"../components/captcha/recaptcha-v3\"\nimport { useAuthData } from \"../hooks/use-auth-data\"\nimport {\n type AuthLocalization,\n authLocalization\n} from \"../localization/auth-localization\"\nimport type {\n AccountOptions,\n AccountOptionsContext\n} from \"../types/account-options\"\nimport type { AdditionalFields } from \"../types/additional-fields\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\nimport type { AuthClient } from \"../types/auth-client\"\nimport type { AuthHooks } from \"../types/auth-hooks\"\nimport type { AuthMutators } from \"../types/auth-mutators\"\nimport type { AvatarOptions } from \"../types/avatar-options\"\nimport type { CaptchaOptions } from \"../types/captcha-options\"\nimport type { CredentialsOptions } from \"../types/credentials-options\"\nimport type { DeleteUserOptions } from \"../types/delete-user-options\"\nimport type { GenericOAuthOptions } from \"../types/generic-oauth-options\"\nimport type { GravatarOptions } from \"../types/gravatar-options\"\nimport type { Link } from \"../types/link\"\nimport type {\n OrganizationOptions,\n OrganizationOptionsContext\n} from \"../types/organization-options\"\nimport type { RenderToast } from \"../types/render-toast\"\nimport type { SignUpOptions } from \"../types/sign-up-options\"\nimport type { SocialOptions } from \"../types/social-options\"\nimport { OrganizationRefetcher } from \"./organization-refetcher\"\nimport type { AuthViewPaths } from \"./view-paths\"\nimport {\n accountViewPaths,\n authViewPaths,\n organizationViewPaths\n} from \"./view-paths\"\n\nconst DefaultLink: Link = ({ href, className, children }) => (\n \n {children}\n \n)\n\nconst defaultNavigate = (href: string) => {\n window.location.href = href\n}\n\nconst defaultReplace = (href: string) => {\n window.location.replace(href)\n}\n\nconst defaultToast: RenderToast = ({ variant = \"default\", message }) => {\n if (variant === \"default\") {\n toast(message)\n } else {\n toast[variant](message)\n }\n}\n\nexport type AuthUIContextType = {\n authClient: AuthClient\n /**\n * Additional fields for users\n */\n additionalFields?: AdditionalFields\n /**\n * API Key plugin configuration\n */\n apiKey?:\n | {\n /**\n * Prefix for API Keys\n */\n prefix?: string\n /**\n * Metadata for API Keys\n */\n metadata?: Record\n }\n | boolean\n /**\n * Avatar configuration\n * @default undefined\n */\n avatar?: AvatarOptions\n /**\n * Base path for the auth views\n * @default \"/auth\"\n */\n basePath: string\n /**\n * Front end base URL for auth API callbacks\n */\n baseURL?: string\n /**\n * Captcha configuration\n */\n captcha?: CaptchaOptions\n credentials?: CredentialsOptions\n /**\n * Default redirect URL after authenticating\n * @default \"/\"\n */\n redirectTo: string\n /**\n * Enable or disable user change email support\n * @default true\n */\n changeEmail?: boolean\n /**\n * User Account deletion configuration\n * @default undefined\n */\n deleteUser?: DeleteUserOptions\n /**\n * Show Verify Email card for unverified emails\n */\n emailVerification?: boolean\n /**\n * Freshness age for Session data\n * @default 60 * 60 * 24\n */\n freshAge: number\n /**\n * Generic OAuth provider configuration\n */\n genericOAuth?: GenericOAuthOptions\n /**\n * Gravatar configuration\n */\n gravatar?: boolean | GravatarOptions\n hooks: AuthHooks\n localization: typeof authLocalization\n /**\n * Enable or disable Magic Link support\n * @default false\n */\n magicLink?: boolean\n /**\n * Enable or disable Email OTP support\n * @default false\n */\n emailOTP?: boolean\n /**\n * Enable or disable Multi Session support\n * @default false\n */\n multiSession?: boolean\n mutators: AuthMutators\n /**\n * Whether the name field should be required\n * @default true\n */\n nameRequired?: boolean\n /**\n * Enable or disable One Tap support\n * @default false\n */\n oneTap?: boolean\n /**\n * Perform some User updates optimistically\n * @default false\n */\n optimistic?: boolean\n /**\n * Organization configuration\n */\n organization?: OrganizationOptionsContext\n /**\n * Enable or disable Passkey support\n * @default false\n */\n passkey?: boolean\n /**\n * Forces better-auth-tanstack to refresh the Session on the auth callback page\n * @default false\n */\n persistClient?: boolean\n /**\n * Account configuration\n */\n account?: AccountOptionsContext\n /**\n * Sign Up configuration\n */\n signUp?: SignUpOptions\n /**\n * Social provider configuration\n */\n social?: SocialOptions\n toast: RenderToast\n /**\n * Enable or disable two-factor authentication support\n * @default undefined\n */\n twoFactor?: (\"otp\" | \"totp\")[]\n viewPaths: AuthViewPaths\n /**\n * Navigate to a new URL\n * @default window.location.href\n */\n navigate: (href: string) => void\n /**\n * Called whenever the Session changes\n */\n onSessionChange?: () => void | Promise\n /**\n * Replace the current URL\n * @default navigate\n */\n replace: (href: string) => void\n /**\n * Custom Link component for navigation\n * @default \n */\n Link: Link\n}\n\nexport type AuthUIProviderProps = {\n children: ReactNode\n /**\n * Better Auth client returned from createAuthClient\n * @default Required\n * @remarks `AuthClient`\n */\n authClient: AnyAuthClient\n /**\n * Enable account view & account configuration\n * @default { fields: [\"image\", \"name\"] }\n */\n account?: boolean | Partial\n /**\n * Avatar configuration\n * @default undefined\n */\n avatar?: boolean | Partial\n /**\n * User Account deletion configuration\n * @default undefined\n */\n deleteUser?: DeleteUserOptions | boolean\n /**\n * ADVANCED: Custom hooks for fetching auth data\n */\n hooks?: Partial\n /**\n * Customize the paths for the auth views\n * @default authViewPaths\n * @remarks `AuthViewPaths`\n */\n viewPaths?: Partial\n /**\n * Render custom Toasts\n * @default Sonner\n */\n toast?: RenderToast\n /**\n * Customize the Localization strings\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n /**\n * ADVANCED: Custom mutators for updating auth data\n */\n mutators?: Partial\n /**\n * Organization plugin configuration\n */\n organization?: OrganizationOptions | boolean\n /**\n * Enable or disable Credentials support\n * @default { forgotPassword: true }\n */\n credentials?: boolean | CredentialsOptions\n /**\n * Enable or disable Sign Up form\n * @default { fields: [\"name\"] }\n */\n signUp?: SignUpOptions | boolean\n} & Partial<\n Omit<\n AuthUIContextType,\n | \"authClient\"\n | \"viewPaths\"\n | \"localization\"\n | \"mutators\"\n | \"toast\"\n | \"hooks\"\n | \"avatar\"\n | \"account\"\n | \"deleteUser\"\n | \"credentials\"\n | \"signUp\"\n | \"organization\"\n >\n>\n\nexport const AuthUIContext = createContext(\n {} as unknown as AuthUIContextType\n)\n\nexport const AuthUIProvider = ({\n children,\n authClient: authClientProp,\n account: accountProp,\n avatar: avatarProp,\n deleteUser: deleteUserProp,\n social: socialProp,\n genericOAuth: genericOAuthProp,\n basePath = \"/auth\",\n baseURL = \"\",\n captcha,\n redirectTo = \"/\",\n credentials: credentialsProp,\n changeEmail = true,\n freshAge = 60 * 60 * 24,\n hooks: hooksProp,\n mutators: mutatorsProp,\n localization: localizationProp,\n nameRequired = true,\n organization: organizationProp,\n signUp: signUpProp = true,\n toast = defaultToast,\n viewPaths: viewPathsProp,\n navigate,\n replace,\n Link = DefaultLink,\n ...props\n}: AuthUIProviderProps) => {\n const authClient = authClientProp as AuthClient\n\n const avatar = useMemo(() => {\n if (!avatarProp) return\n\n if (avatarProp === true) {\n return {\n extension: \"png\",\n size: 128\n }\n }\n\n return {\n upload: avatarProp.upload,\n delete: avatarProp.delete,\n extension: avatarProp.extension || \"png\",\n size: avatarProp.size || (avatarProp.upload ? 256 : 128)\n }\n }, [avatarProp])\n\n const account = useMemo(() => {\n if (accountProp === false) return\n\n if (accountProp === true || accountProp === undefined) {\n return {\n basePath: \"/account\",\n fields: [\"image\", \"name\"],\n viewPaths: accountViewPaths\n }\n }\n\n // Remove trailing slash from basePath\n const basePath = accountProp.basePath?.endsWith(\"/\")\n ? accountProp.basePath.slice(0, -1)\n : accountProp.basePath\n\n return {\n basePath: basePath ?? \"/account\",\n fields: accountProp.fields || [\"image\", \"name\"],\n viewPaths: { ...accountViewPaths, ...accountProp.viewPaths }\n }\n }, [accountProp])\n\n const deleteUser = useMemo(() => {\n if (!deleteUserProp) return\n\n if (deleteUserProp === true) {\n return {}\n }\n\n return deleteUserProp\n }, [deleteUserProp])\n\n const social = useMemo(() => {\n if (!socialProp) return\n\n return socialProp\n }, [socialProp])\n\n const genericOAuth = useMemo(() => {\n if (!genericOAuthProp) return\n\n return genericOAuthProp\n }, [genericOAuthProp])\n\n const credentials = useMemo(() => {\n if (credentialsProp === false) return\n\n if (credentialsProp === true) {\n return {\n forgotPassword: true\n }\n }\n\n return {\n ...credentialsProp,\n forgotPassword: credentialsProp?.forgotPassword ?? true\n }\n }, [credentialsProp])\n\n const signUp = useMemo(() => {\n if (signUpProp === false) return\n\n if (signUpProp === true || signUpProp === undefined) {\n return {\n fields: [\"name\"]\n }\n }\n\n return {\n fields: signUpProp.fields || [\"name\"]\n }\n }, [signUpProp])\n\n const organization = useMemo(() => {\n if (!organizationProp) return\n\n if (organizationProp === true) {\n return {\n basePath: \"/organization\",\n viewPaths: organizationViewPaths,\n customRoles: []\n }\n }\n\n let logo: OrganizationOptionsContext[\"logo\"] | undefined\n\n if (organizationProp.logo === true) {\n logo = {\n extension: \"png\",\n size: 128\n }\n } else if (organizationProp.logo) {\n logo = {\n upload: organizationProp.logo.upload,\n delete: organizationProp.logo.delete,\n extension: organizationProp.logo.extension || \"png\",\n size:\n organizationProp.logo.size || organizationProp.logo.upload\n ? 256\n : 128\n }\n }\n\n // Remove trailing slash from basePath\n const basePath = organizationProp.basePath?.endsWith(\"/\")\n ? organizationProp.basePath.slice(0, -1)\n : organizationProp.basePath\n\n return {\n ...organizationProp,\n logo,\n basePath: basePath ?? \"/organization\",\n customRoles: organizationProp.customRoles || [],\n viewPaths: {\n ...organizationViewPaths,\n ...organizationProp.viewPaths\n }\n }\n }, [organizationProp])\n\n const defaultMutators = useMemo(() => {\n return {\n deleteApiKey: (params) =>\n authClient.apiKey.delete({\n ...params,\n fetchOptions: { throw: true }\n }),\n deletePasskey: (params) =>\n authClient.passkey.deletePasskey({\n ...params,\n fetchOptions: { throw: true }\n }),\n revokeDeviceSession: (params) =>\n authClient.multiSession.revoke({\n ...params,\n fetchOptions: { throw: true }\n }),\n revokeSession: (params) =>\n authClient.revokeSession({\n ...params,\n fetchOptions: { throw: true }\n }),\n setActiveSession: (params) =>\n authClient.multiSession.setActive({\n ...params,\n fetchOptions: { throw: true }\n }),\n updateOrganization: (params) =>\n authClient.organization.update({\n ...params,\n fetchOptions: { throw: true }\n }),\n updateUser: (params) =>\n authClient.updateUser({\n ...params,\n fetchOptions: { throw: true }\n }),\n unlinkAccount: (params) =>\n authClient.unlinkAccount({\n ...params,\n fetchOptions: { throw: true }\n })\n } as AuthMutators\n }, [authClient])\n\n const defaultHooks = useMemo(() => {\n return {\n useSession: authClient.useSession,\n useListAccounts: () =>\n useAuthData({\n queryFn: authClient.listAccounts,\n cacheKey: \"listAccounts\"\n }),\n useAccountInfo: (params) =>\n useAuthData({\n queryFn: () => authClient.accountInfo(params),\n cacheKey: `accountInfo:${JSON.stringify(params)}`\n }),\n useListDeviceSessions: () =>\n useAuthData({\n queryFn: authClient.multiSession.listDeviceSessions,\n cacheKey: \"listDeviceSessions\"\n }),\n useListSessions: () =>\n useAuthData({\n queryFn: authClient.listSessions,\n cacheKey: \"listSessions\"\n }),\n useListPasskeys: authClient.useListPasskeys,\n useListApiKeys: () =>\n useAuthData({\n queryFn: authClient.apiKey.list,\n cacheKey: \"listApiKeys\"\n }),\n useActiveOrganization: authClient.useActiveOrganization,\n useListOrganizations: authClient.useListOrganizations,\n useHasPermission: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\"/organization/has-permission\", {\n method: \"POST\",\n body: params\n }),\n cacheKey: `hasPermission:${JSON.stringify(params)}`\n }),\n useInvitation: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.organization.getInvitation(params),\n cacheKey: `invitation:${JSON.stringify(params)}`\n }),\n useListInvitations: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n `/organization/list-invitations?organizationId=${params?.query?.organizationId || \"\"}`\n ),\n cacheKey: `listInvitations:${JSON.stringify(params)}`\n }),\n useListUserInvitations: () =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n \"/organization/list-user-invitations\"\n ),\n cacheKey: `listUserInvitations`\n }),\n useListMembers: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n `/organization/list-members?organizationId=${params?.query?.organizationId || \"\"}`\n ),\n cacheKey: `listMembers:${JSON.stringify(params)}`\n })\n } as AuthHooks\n }, [authClient])\n\n const viewPaths = useMemo(() => {\n return { ...authViewPaths, ...viewPathsProp }\n }, [viewPathsProp])\n\n const localization = useMemo(() => {\n return { ...authLocalization, ...localizationProp }\n }, [localizationProp])\n\n const hooks = useMemo(() => {\n return { ...defaultHooks, ...hooksProp }\n }, [defaultHooks, hooksProp])\n\n const mutators = useMemo(() => {\n return { ...defaultMutators, ...mutatorsProp }\n }, [defaultMutators, mutatorsProp])\n\n // Remove trailing slash from baseURL\n baseURL = baseURL.endsWith(\"/\") ? baseURL.slice(0, -1) : baseURL\n\n // Remove trailing slash from basePath\n basePath = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath\n\n const { data: sessionData } = hooks.useSession()\n\n return (\n \n {sessionData && organization && }\n\n {captcha?.provider === \"google-recaptcha-v3\" ? (\n {children}\n ) : (\n children\n )}\n \n )\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/auth-view.json b/docs/public/r/auth-view.json new file mode 100644 index 00000000..c22f99a9 --- /dev/null +++ b/docs/public/r/auth-view.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-view", + "type": "registry:component", + "title": "Auth View", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/email-otp-button.json", + "http://localhost:3000/r/magic-link-button.json", + "http://localhost:3000/r/one-tap.json", + "http://localhost:3000/r/passkey-button.json", + "http://localhost:3000/r/provider-button.json", + "separator", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-view.tsx", + "content": "\"use client\"\n\nimport { ArrowLeftIcon } from \"lucide-react\"\nimport { type ReactNode, useContext, useEffect, useState } from \"react\"\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { socialProviders } from \"../../lib/social-providers\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { AuthViewPaths } from \"../../lib/view-paths\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle\n} from \"../ui/card\"\nimport { Separator } from \"../ui/separator\"\nimport { AuthCallback } from \"./auth-callback\"\nimport { AuthForm, type AuthFormClassNames } from \"./auth-form\"\nimport { EmailOTPButton } from \"./email-otp-button\"\nimport { MagicLinkButton } from \"./magic-link-button\"\nimport { OneTap } from \"./one-tap\"\nimport { PasskeyButton } from \"./passkey-button\"\nimport { ProviderButton } from \"./provider-button\"\nimport { SignOut } from \"./sign-out\"\n\nexport type AuthViewClassNames = {\n base?: string\n content?: string\n description?: string\n footer?: string\n footerLink?: string\n continueWith?: string\n form?: AuthFormClassNames\n header?: string\n separator?: string\n title?: string\n}\n\nexport interface AuthViewProps {\n className?: string\n classNames?: AuthViewClassNames\n callbackURL?: string\n cardHeader?: ReactNode\n localization?: AuthLocalization\n pathname?: string\n redirectTo?: string\n socialLayout?: \"auto\" | \"horizontal\" | \"grid\" | \"vertical\"\n view?: keyof AuthViewPaths\n otpSeparators?: 0 | 1 | 2\n}\n\nexport function AuthView({\n className,\n classNames,\n callbackURL,\n cardHeader,\n localization,\n pathname,\n redirectTo,\n socialLayout: socialLayoutProp = \"auto\",\n view: viewProp,\n otpSeparators = 0\n}: AuthViewProps) {\n const isHydrated = useIsHydrated()\n const {\n basePath,\n credentials,\n localization: contextLocalization,\n magicLink,\n emailOTP,\n oneTap,\n passkey,\n signUp,\n social,\n genericOAuth,\n viewPaths,\n Link\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n let socialLayout = socialLayoutProp\n if (socialLayout === \"auto\") {\n socialLayout = !credentials\n ? \"vertical\"\n : social?.providers && social.providers.length > 2\n ? \"horizontal\"\n : \"vertical\"\n }\n\n const path = pathname?.split(\"/\").pop()\n const view =\n viewProp ||\n (getViewByPath(\n viewPaths as unknown as Record,\n path\n ) as typeof viewProp) ||\n \"SIGN_IN\"\n\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n useEffect(() => {\n const handlePageHide = () => setIsSubmitting(false)\n window.addEventListener(\"pagehide\", handlePageHide)\n return () => {\n setIsSubmitting(false)\n window.removeEventListener(\"pagehide\", handlePageHide)\n }\n }, [])\n\n if (view === \"CALLBACK\") return \n if (view === \"SIGN_OUT\") return \n\n const description =\n !credentials && !magicLink && !emailOTP\n ? localization.DISABLED_CREDENTIALS_DESCRIPTION\n : localization[`${view}_DESCRIPTION` as keyof typeof localization]\n\n return (\n \n \n {cardHeader ? (\n cardHeader\n ) : (\n <>\n \n {localization[view as keyof typeof localization]}\n \n {description && (\n \n {description}\n \n )}\n \n )}\n \n\n \n {oneTap &&\n [\"SIGN_IN\", \"SIGN_UP\", \"MAGIC_LINK\", \"EMAIL_OTP\"].includes(\n view as string\n ) && (\n \n )}\n\n {(credentials || magicLink || emailOTP) && (\n
\n \n\n {magicLink &&\n ((credentials &&\n [\n \"FORGOT_PASSWORD\",\n \"SIGN_UP\",\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\"\n ].includes(view as string)) ||\n (emailOTP && view === \"EMAIL_OTP\")) && (\n \n )}\n\n {emailOTP &&\n ((credentials &&\n [\n \"FORGOT_PASSWORD\",\n \"SIGN_UP\",\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\"\n ].includes(view as string)) ||\n (magicLink &&\n [\"SIGN_IN\", \"MAGIC_LINK\"].includes(\n view as string\n ))) && (\n \n )}\n
\n )}\n\n {view !== \"RESET_PASSWORD\" &&\n (social?.providers?.length ||\n genericOAuth?.providers?.length ||\n (view === \"SIGN_IN\" && passkey)) && (\n <>\n {(credentials || magicLink || emailOTP) && (\n \n \n \n {localization.OR_CONTINUE_WITH}\n \n \n \n )}\n\n
\n {(social?.providers?.length ||\n genericOAuth?.providers?.length) && (\n \n {social?.providers?.map((provider) => {\n const socialProvider =\n socialProviders.find(\n (socialProvider) =>\n socialProvider.provider ===\n provider\n )\n if (!socialProvider) return null\n return (\n \n )\n })}\n {genericOAuth?.providers?.map(\n (provider) => (\n \n )\n )}\n
\n )}\n\n {passkey &&\n [\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\",\n \"RECOVER_ACCOUNT\",\n \"TWO_FACTOR\",\n \"FORGOT_PASSWORD\"\n ].includes(view as string) && (\n \n )}\n \n \n )}\n
\n\n {credentials && signUp && (\n \n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\" ? (\n localization.DONT_HAVE_AN_ACCOUNT\n ) : view === \"SIGN_UP\" ? (\n localization.ALREADY_HAVE_AN_ACCOUNT\n ) : (\n \n )}\n\n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\" ||\n view === \"SIGN_UP\" ? (\n \n \n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\"\n ? localization.SIGN_UP\n : localization.SIGN_IN}\n \n \n ) : (\n window.history.back()}\n >\n {localization.GO_BACK}\n \n )}\n \n )}\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/avatar-options.json b/docs/public/r/avatar-options.json new file mode 100644 index 00000000..a24c2830 --- /dev/null +++ b/docs/public/r/avatar-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "avatar-options", + "type": "registry:file", + "title": "Avatar Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/image.json" + ], + "files": [ + { + "path": "src/types/avatar-options.ts", + "content": "import type { Image } from \"./image\"\n\nexport type AvatarOptions = {\n /**\n * Upload an avatar image and return the URL string\n * @remarks `(file: File) => Promise`\n */\n upload?: (file: File) => Promise\n /**\n * Delete a previously uploaded avatar image from your storage/CDN\n * @remarks `(url: string) => Promise`\n */\n delete?: (url: string) => Promise\n /**\n * Avatar size for resizing\n * @default 128 (or 256 if upload is provided)\n */\n size: number\n /**\n * File extension for avatar uploads\n * @default \"png\"\n */\n extension: string\n /**\n * Custom Image component for rendering avatar images\n * @default AvatarImage from Radix UI\n */\n Image?: Image\n}\n", + "type": "registry:file", + "target": "types/avatar-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/avatar.json b/docs/public/r/avatar.json new file mode 100644 index 00000000..312a6a9f --- /dev/null +++ b/docs/public/r/avatar.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "avatar", + "type": "registry:ui", + "title": "Avatar", + "description": "", + "dependencies": [ + "@radix-ui/react-avatar" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/avatar.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/backup-codes-dialog.json b/docs/public/r/backup-codes-dialog.json new file mode 100644 index 00000000..07ff49dd --- /dev/null +++ b/docs/public/r/backup-codes-dialog.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "backup-codes-dialog", + "type": "registry:component", + "title": "Backup Codes Dialog", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/backup-codes-dialog.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface BackupCodesDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n backupCodes: string[]\n}\n\nexport function BackupCodesDialog({\n classNames,\n backupCodes,\n onOpenChange,\n ...props\n}: BackupCodesDialogProps) {\n const { localization } = useContext(AuthUIContext)\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n const codeText = backupCodes.join(\"\\n\")\n navigator.clipboard.writeText(codeText)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.BACKUP_CODES}\n \n\n \n {localization.BACKUP_CODES_DESCRIPTION}\n \n \n\n
\n {backupCodes.map((code, index) => (\n \n {code}\n
\n ))}\n \n\n \n \n {copied ? (\n <>\n \n {localization.COPIED_TO_CLIPBOARD}\n \n ) : (\n <>\n \n {localization.COPY_ALL_CODES}\n \n )}\n \n\n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.primaryButton\n )}\n >\n {localization.CONTINUE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/base-error-codes.json b/docs/public/r/base-error-codes.json new file mode 100644 index 00000000..35ce5cea --- /dev/null +++ b/docs/public/r/base-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "base-error-codes", + "type": "registry:file", + "title": "Base Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/base-error-codes.ts", + "content": "export const BASE_ERROR_CODES = {\n USER_NOT_FOUND: \"User not found\",\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n FAILED_TO_CREATE_SESSION: \"Failed to create session\",\n FAILED_TO_UPDATE_USER: \"Failed to update user\",\n FAILED_TO_GET_SESSION: \"Failed to get session\",\n INVALID_PASSWORD: \"Invalid password\",\n INVALID_EMAIL: \"Invalid email\",\n INVALID_EMAIL_OR_PASSWORD: \"Invalid email or password\",\n SOCIAL_ACCOUNT_ALREADY_LINKED: \"Social account already linked\",\n PROVIDER_NOT_FOUND: \"Provider not found\",\n INVALID_TOKEN: \"Invalid token\",\n ID_TOKEN_NOT_SUPPORTED: \"id_token not supported\",\n FAILED_TO_GET_USER_INFO: \"Failed to get user info\",\n USER_EMAIL_NOT_FOUND: \"User email not found\",\n EMAIL_NOT_VERIFIED: \"Email not verified\",\n PASSWORD_TOO_SHORT: \"Password too short\",\n PASSWORD_TOO_LONG: \"Password too long\",\n USER_ALREADY_EXISTS: \"User already exists\",\n EMAIL_CAN_NOT_BE_UPDATED: \"Email can not be updated\",\n CREDENTIAL_ACCOUNT_NOT_FOUND: \"Credential account not found\",\n SESSION_EXPIRED: \"Session expired. Re-authenticate to perform this action.\",\n FAILED_TO_UNLINK_LAST_ACCOUNT: \"You can't unlink your last account\",\n ACCOUNT_NOT_FOUND: \"Account not found\",\n USER_ALREADY_HAS_PASSWORD:\n \"User already has a password. Provide that to delete the account.\"\n}\n", + "type": "registry:file", + "target": "localization/base-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/button.json b/docs/public/r/button.json new file mode 100644 index 00000000..9a3f3387 --- /dev/null +++ b/docs/public/r/button.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "button", + "type": "registry:ui", + "title": "Button", + "description": "", + "dependencies": [ + "@radix-ui/react-slot", + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/button.tsx", + "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n \n )\n}\n\nexport { Button, buttonVariants }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/captcha-error-codes.json b/docs/public/r/captcha-error-codes.json new file mode 100644 index 00000000..bc53de8d --- /dev/null +++ b/docs/public/r/captcha-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha-error-codes", + "type": "registry:file", + "title": "Captcha Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/captcha-error-codes.ts", + "content": "// These error codes are returned by the API\nconst EXTERNAL_ERROR_CODES = {\n VERIFICATION_FAILED: \"Captcha verification failed\",\n MISSING_RESPONSE: \"Missing CAPTCHA response\",\n UNKNOWN_ERROR: \"Something went wrong\"\n}\n\n// These error codes are only visible in the server logs\nconst INTERNAL_ERROR_CODES = {\n MISSING_SECRET_KEY: \"Missing secret key\",\n SERVICE_UNAVAILABLE: \"CAPTCHA service unavailable\"\n}\n\nexport const CAPTCHA_ERROR_CODES = {\n ...EXTERNAL_ERROR_CODES,\n ...INTERNAL_ERROR_CODES\n}\n", + "type": "registry:file", + "target": "localization/captcha-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/captcha-options.json b/docs/public/r/captcha-options.json new file mode 100644 index 00000000..0fbc8690 --- /dev/null +++ b/docs/public/r/captcha-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha-options", + "type": "registry:file", + "title": "Captcha Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/captcha-provider.json" + ], + "files": [ + { + "path": "src/types/captcha-options.ts", + "content": "import type { CaptchaProvider } from \"./captcha-provider\"\n\nexport type CaptchaOptions = {\n /**\n * Captcha site key\n */\n siteKey: string\n /**\n * Captcha provider type\n */\n provider: CaptchaProvider\n /**\n * Hide the captcha badge\n * @default false\n */\n hideBadge?: boolean\n /**\n * Use recaptcha.net domain instead of google.com\n * @default false\n */\n recaptchaNet?: boolean\n /**\n * Enable enterprise mode for Google reCAPTCHA\n * @default false\n */\n enterprise?: boolean\n /**\n * Overrides the default array of paths where captcha validation is enforced\n * @default [\"/sign-up/email\", \"/sign-in/email\", \"/forget-password\"]\n */\n endpoints?: string[]\n}\n", + "type": "registry:file", + "target": "types/captcha-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/captcha-provider.json b/docs/public/r/captcha-provider.json new file mode 100644 index 00000000..76fe9715 --- /dev/null +++ b/docs/public/r/captcha-provider.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha-provider", + "type": "registry:file", + "title": "Captcha Provider", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/captcha-provider.ts", + "content": "export type CaptchaProvider =\n | \"cloudflare-turnstile\"\n | \"google-recaptcha-v2-checkbox\"\n | \"google-recaptcha-v2-invisible\"\n | \"google-recaptcha-v3\"\n | \"hcaptcha\"\n", + "type": "registry:file", + "target": "types/captcha-provider.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/captcha.json b/docs/public/r/captcha.json new file mode 100644 index 00000000..59e0746f --- /dev/null +++ b/docs/public/r/captcha.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha", + "type": "registry:component", + "title": "Captcha", + "description": "", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/recaptcha-badge.json", + "http://localhost:3000/r/recaptcha-v2.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/captcha.tsx", + "content": "import HCaptcha from \"@hcaptcha/react-hcaptcha\"\nimport { Turnstile } from \"@marsidev/react-turnstile\"\nimport { type RefObject, useContext } from \"react\"\n\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { RecaptchaBadge } from \"./recaptcha-badge\"\nimport { RecaptchaV2 } from \"./recaptcha-v2\"\n\n// Default captcha endpoints\nconst DEFAULT_CAPTCHA_ENDPOINTS = [\n \"/sign-up/email\",\n \"/sign-in/email\",\n \"/forget-password\"\n]\n\ninterface CaptchaProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n ref: RefObject\n localization: Partial\n action?: string // Optional action to check if it's in the endpoints list\n}\n\nexport function Captcha({ ref, localization, action }: CaptchaProps) {\n const { captcha } = useContext(AuthUIContext)\n if (!captcha) return null\n\n // If action is provided, check if it's in the list of captcha-enabled endpoints\n if (action) {\n const endpoints = captcha.endpoints || DEFAULT_CAPTCHA_ENDPOINTS\n if (!endpoints.includes(action)) {\n return null\n }\n }\n\n const { theme } = useTheme()\n\n const showRecaptchaV2 =\n captcha.provider === \"google-recaptcha-v2-checkbox\" ||\n captcha.provider === \"google-recaptcha-v2-invisible\"\n\n const showRecaptchaBadge =\n captcha.provider === \"google-recaptcha-v3\" ||\n captcha.provider === \"google-recaptcha-v2-invisible\"\n\n const showTurnstile = captcha.provider === \"cloudflare-turnstile\"\n\n const showHCaptcha = captcha.provider === \"hcaptcha\"\n\n return (\n <>\n {showRecaptchaV2 && }\n {showRecaptchaBadge && (\n \n )}\n {showTurnstile && (\n \n )}\n {showHCaptcha && (\n
\n \n
\n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/card.json b/docs/public/r/card.json new file mode 100644 index 00000000..494673c8 --- /dev/null +++ b/docs/public/r/card.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "card", + "type": "registry:ui", + "title": "Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/card.tsx", + "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/change-email-card.json b/docs/public/r/change-email-card.json new file mode 100644 index 00000000..6bceca94 --- /dev/null +++ b/docs/public/r/change-email-card.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "change-email-card", + "type": "registry:component", + "title": "Change Email Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-email-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport { CardContent } from \"../../ui/card\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\n\nexport function ChangeEmailCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n authClient,\n emailVerification,\n hooks: { useSession },\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData, isPending, refetch } = useSession()\n const [resendDisabled, setResendDisabled] = useState(false)\n\n const formSchema = z.object({\n email: z\n .string()\n .min(1, { message: localization.EMAIL_REQUIRED })\n .email({ message: localization.INVALID_EMAIL })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: {\n email: sessionData?.user.email || \"\"\n }\n })\n\n const resendForm = useForm()\n\n const { isSubmitting } = form.formState\n\n const changeEmail = async ({ email }: z.infer) => {\n if (email === sessionData?.user.email) {\n await new Promise((resolve) => setTimeout(resolve))\n toast({\n variant: \"error\",\n message: localization.EMAIL_IS_THE_SAME\n })\n return\n }\n\n try {\n await authClient.changeEmail({\n newEmail: email,\n callbackURL: window.location.pathname,\n fetchOptions: { throw: true }\n })\n\n if (sessionData?.user.emailVerified) {\n toast({\n variant: \"success\",\n message: localization.EMAIL_VERIFY_CHANGE!\n })\n } else {\n await refetch?.()\n toast({\n variant: \"success\",\n message: `${localization.EMAIL} ${localization.UPDATED_SUCCESSFULLY}`\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const resendVerification = async () => {\n if (!sessionData) return\n const email = sessionData.user.email\n\n setResendDisabled(true)\n\n try {\n await authClient.sendVerificationEmail({\n email,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.EMAIL_VERIFICATION!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n setResendDisabled(false)\n throw error\n }\n }\n\n return (\n <>\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n\n {emailVerification &&\n sessionData?.user &&\n !sessionData?.user.emailVerified && (\n
\n \n \n \n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/change-password-card.json b/docs/public/r/change-password-card.json new file mode 100644 index 00000000..37e0f3ca --- /dev/null +++ b/docs/public/r/change-password-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "change-password-card", + "type": "registry:component", + "title": "Change Password Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/input-field-skeleton.json", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-password-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getPasswordSchema } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { PasswordInput } from \"../../password-input\"\nimport { CardContent } from \"../../ui/card\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport {\n SettingsCard,\n type SettingsCardClassNames\n} from \"../shared/settings-card\"\nimport { InputFieldSkeleton } from \"../skeletons/input-field-skeleton\"\n\nexport interface ChangePasswordCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n isPending?: boolean\n localization?: AuthLocalization\n skipHook?: boolean\n passwordValidation?: PasswordValidation\n}\n\nexport function ChangePasswordCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook,\n passwordValidation\n}: ChangePasswordCardProps) {\n const {\n authClient,\n basePath,\n baseURL,\n credentials,\n hooks: { useSession, useListAccounts },\n localization: contextLocalization,\n viewPaths,\n toast\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const { data: sessionData } = useSession()\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n }\n\n const formSchema = z\n .object({\n currentPassword: getPasswordSchema(\n passwordValidation,\n localization\n ),\n newPassword: getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.NEW_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n }),\n confirmPassword: confirmPasswordEnabled\n ? getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n : z.string().optional()\n })\n .refine(\n (data) =>\n !confirmPasswordEnabled ||\n data.newPassword === data.confirmPassword,\n {\n message: localization.PASSWORDS_DO_NOT_MATCH,\n path: [\"confirmPassword\"]\n }\n )\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n currentPassword: \"\",\n newPassword: \"\",\n confirmPassword: \"\"\n }\n })\n\n const setPasswordForm = useForm()\n\n const { isSubmitting } = form.formState\n\n const setPassword = async () => {\n if (!sessionData) return\n const email = sessionData?.user.email\n\n try {\n await authClient.requestPasswordReset({\n email,\n redirectTo: `${baseURL}${basePath}/${viewPaths.RESET_PASSWORD}`,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.FORGOT_PASSWORD_EMAIL!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const changePassword = async ({\n currentPassword,\n newPassword\n }: z.infer) => {\n try {\n await authClient.changePassword({\n currentPassword,\n newPassword,\n revokeOtherSessions: true,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.CHANGE_PASSWORD_SUCCESS!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n form.reset()\n }\n\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n if (!isPending && !credentialsLinked) {\n return (\n
\n \n \n \n \n )\n }\n\n return (\n
\n \n \n \n {isPending || !accounts ? (\n <>\n \n \n\n {confirmPasswordEnabled && (\n \n )}\n \n ) : (\n <>\n (\n \n \n {localization.CURRENT_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.NEW_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {\n localization.CONFIRM_PASSWORD\n }\n \n\n \n \n \n\n \n \n )}\n />\n )}\n \n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/checkbox.json b/docs/public/r/checkbox.json new file mode 100644 index 00000000..e58038e5 --- /dev/null +++ b/docs/public/r/checkbox.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "checkbox", + "type": "registry:ui", + "title": "Checkbox", + "description": "", + "dependencies": [ + "@radix-ui/react-checkbox", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/checkbox.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n\nexport { Checkbox }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/create-api-key-dialog.json b/docs/public/r/create-api-key-dialog.json new file mode 100644 index 00000000..38394ef7 --- /dev/null +++ b/docs/public/r/create-api-key-dialog.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "create-api-key-dialog", + "type": "registry:component", + "title": "Create Api Key Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/refetch.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/create-api-key-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { OrganizationCellView } from \"../../organization/organization-cell-view\"\nimport { PersonalAccountView } from \"../../organization/personal-account-view\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue\n} from \"../../ui/select\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface CreateApiKeyDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n onSuccess: (key: string) => void\n refetch?: Refetch\n organizationId?: string\n}\n\nexport function CreateApiKeyDialog({\n classNames,\n localization,\n onSuccess,\n refetch,\n organizationId,\n onOpenChange,\n ...props\n}: CreateApiKeyDialogProps) {\n const {\n authClient,\n apiKey,\n hooks: { useListOrganizations, useSession },\n localization: contextLocalization,\n organization: contextOrganization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n\n let organizations: Organization[] | null | undefined\n if (contextOrganization) {\n const { data } = useListOrganizations()\n organizations = data\n }\n\n const { data: sessionData } = useSession()\n const user = sessionData?.user\n\n const showOrganizationSelect = contextOrganization?.apiKey\n\n const formSchema = z.object({\n name: z\n .string()\n .min(1, `${localization.NAME} ${localization.IS_REQUIRED}`),\n expiresInDays: z.string().optional(),\n organizationId: showOrganizationSelect\n ? z\n .string()\n .min(\n 1,\n `${localization.ORGANIZATION} ${localization.IS_REQUIRED}`\n )\n : z.string().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: {\n name: \"\",\n expiresInDays: \"none\",\n organizationId: organizationId ?? \"personal\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const onSubmit = async (values: z.infer) => {\n try {\n const expiresIn =\n values.expiresInDays && values.expiresInDays !== \"none\"\n ? Number.parseInt(values.expiresInDays) * 60 * 60 * 24\n : undefined\n\n const selectedOrgId =\n values.organizationId === \"personal\"\n ? undefined\n : values.organizationId\n\n const metadata = {\n ...(typeof apiKey === \"object\" ? apiKey.metadata : {}),\n ...(contextOrganization && selectedOrgId\n ? { organizationId: selectedOrgId }\n : {})\n }\n\n const result = await authClient.apiKey.create({\n name: values.name,\n expiresIn,\n prefix: typeof apiKey === \"object\" ? apiKey.prefix : undefined,\n metadata:\n Object.keys(metadata).length > 0 ? metadata : undefined,\n fetchOptions: { throw: true }\n })\n\n await refetch?.()\n onSuccess(result.key)\n onOpenChange?.(false)\n form.reset()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const rtf = new Intl.RelativeTimeFormat(lang ?? \"en\")\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.CREATE_API_KEY}\n \n\n \n {localization.CREATE_API_KEY_DESCRIPTION}\n \n \n\n
\n \n {showOrganizationSelect && (\n (\n \n \n {localization.ORGANIZATION}\n \n\n \n \n \n \n \n \n\n \n \n \n \n\n {organizations?.map((org) => (\n \n \n \n ))}\n \n \n\n \n \n )}\n />\n )}\n\n
\n (\n \n \n {localization.NAME}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.EXPIRES}\n \n\n \n \n \n \n \n \n\n \n \n {localization.NO_EXPIRATION}\n \n\n {[\n 1, 7, 30, 60, 90, 180, 365\n ].map((days) => (\n \n {days === 365\n ? rtf.format(\n 1,\n \"year\"\n )\n : rtf.format(\n days,\n \"day\"\n )}\n \n ))}\n \n \n\n \n \n )}\n />\n
\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isSubmitting}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization.CREATE_API_KEY}\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/create-organization-dialog.json b/docs/public/r/create-organization-dialog.json new file mode 100644 index 00000000..31f5c1fd --- /dev/null +++ b/docs/public/r/create-organization-dialog.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "create-organization-dialog", + "type": "registry:component", + "title": "Create Organization Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/create-organization-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2, Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport {\n type ComponentProps,\n useContext,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { OrganizationLogo } from \"./organization-logo\"\n\nexport interface CreateOrganizationDialogProps\n extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function CreateOrganizationDialog({\n className,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: CreateOrganizationDialogProps) {\n const {\n authClient,\n localization: contextLocalization,\n organization: organizationOptions,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [logo, setLogo] = useState(null)\n const [logoPending, setLogoPending] = useState(false)\n\n const fileInputRef = useRef(null)\n const openFileDialog = () => fileInputRef.current?.click()\n\n const formSchema = z.object({\n logo: z.string().optional(),\n name: z.string().min(1, {\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`\n }),\n slug: z\n .string()\n .min(1, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_REQUIRED}`\n })\n .regex(/^[a-z0-9-]+$/, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_INVALID}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n logo: \"\",\n name: \"\",\n slug: \"\"\n }\n })\n\n const isSubmitting = form.formState.isSubmitting\n\n const handleLogoChange = async (file: File) => {\n if (!organizationOptions?.logo) return\n\n setLogoPending(true)\n\n try {\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n organizationOptions.logo.size,\n organizationOptions.logo.extension\n )\n\n let image: string | undefined | null\n\n if (organizationOptions?.logo.upload) {\n image = await organizationOptions.logo.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n setLogo(image || null)\n form.setValue(\"logo\", image || \"\")\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLogoPending(false)\n }\n\n const deleteLogo = async () => {\n setLogoPending(true)\n\n const currentUrl = logo || undefined\n if (currentUrl && organizationOptions?.logo?.delete) {\n await organizationOptions.logo.delete(currentUrl)\n }\n\n setLogo(null)\n form.setValue(\"logo\", \"\")\n setLogoPending(false)\n }\n\n async function onSubmit({ name, slug, logo }: z.infer) {\n try {\n const organization = await authClient.organization.create({\n name,\n slug,\n logo,\n fetchOptions: { throw: true }\n })\n\n if (organizationOptions?.pathMode === \"slug\") {\n navigate(`${organizationOptions.basePath}/${organization.slug}`)\n return\n }\n\n await authClient.organization.setActive({\n organizationId: organization.id\n })\n\n onOpenChange?.(false)\n form.reset()\n setLogo(null)\n\n toast({\n variant: \"success\",\n message: localization.CREATE_ORGANIZATION_SUCCESS\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n \n \n \n \n {localization.CREATE_ORGANIZATION}\n \n\n \n {localization.ORGANIZATIONS_INSTRUCTIONS}\n \n \n\n
\n \n {organizationOptions?.logo && (\n (\n \n {\n const file =\n e.target.files?.item(0)\n if (file) handleLogoChange(file)\n e.target.value = \"\"\n }}\n />\n\n \n {localization.LOGO}\n \n\n
\n \n \n \n \n \n \n\n \n e.preventDefault()\n }\n >\n \n \n\n {\n localization.UPLOAD_LOGO\n }\n \n\n {logo && (\n \n \n\n {\n localization.DELETE_LOGO\n }\n \n )}\n \n \n\n \n {logoPending && (\n \n )}\n\n {localization.UPLOAD}\n \n
\n\n \n
\n )}\n />\n )}\n\n (\n \n \n {localization.ORGANIZATION_NAME}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.ORGANIZATION_SLUG}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization.CREATE_ORGANIZATION}\n \n \n \n \n
\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/credentials-options.json b/docs/public/r/credentials-options.json new file mode 100644 index 00000000..97cb89d7 --- /dev/null +++ b/docs/public/r/credentials-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "credentials-options", + "type": "registry:file", + "title": "Credentials Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/types/credentials-options.ts", + "content": "import type { PasswordValidation } from \"./password-validation\"\n\nexport type CredentialsOptions = {\n /**\n * Enable or disable the Confirm Password input\n * @default false\n */\n confirmPassword?: boolean\n\n /**\n * Enable or disable Forgot Password flow\n * @default true\n */\n forgotPassword?: boolean\n\n /**\n * Customize the password validation\n */\n passwordValidation?: PasswordValidation\n\n /**\n * Enable or disable Remember Me checkbox\n * @default false\n */\n rememberMe?: boolean\n\n /**\n * Enable or disable Username support\n * @default false\n */\n username?: boolean\n}\n", + "type": "registry:file", + "target": "types/credentials-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/delete-account-card.json b/docs/public/r/delete-account-card.json new file mode 100644 index 00000000..2966299f --- /dev/null +++ b/docs/public/r/delete-account-card.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-account-card", + "type": "registry:component", + "title": "Delete Account Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-account-dialog.json", + "http://localhost:3000/r/settings-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { DeleteAccountDialog } from \"./delete-account-dialog\"\n\nexport interface DeleteAccountCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n isPending?: boolean\n localization?: AuthLocalization\n skipHook?: boolean\n}\n\nexport function DeleteAccountCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook\n}: DeleteAccountCardProps) {\n const {\n hooks: { useListAccounts },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const [showDialog, setShowDialog] = useState(false)\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n }\n\n return (\n
\n setShowDialog(true)}\n />\n\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/delete-account-dialog.json b/docs/public/r/delete-account-dialog.json new file mode 100644 index 00000000..1c1ebfb9 --- /dev/null +++ b/docs/public/r/delete-account-dialog.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-account-dialog", + "type": "registry:component", + "title": "Delete Account Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-dialog.tsx", + "content": "import { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { UserView } from \"../../user-view\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface DeleteAccountDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n localization?: AuthLocalization\n}\n\nexport function DeleteAccountDialog({\n classNames,\n accounts,\n localization,\n onOpenChange,\n ...props\n}: DeleteAccountDialogProps) {\n const {\n authClient,\n basePath,\n baseURL,\n deleteUser,\n freshAge,\n hooks: { useSession },\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const user = sessionData?.user\n\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n const formSchema = z.object({\n password: credentialsLinked\n ? z.string().min(1, { message: localization.PASSWORD_REQUIRED! })\n : z.string().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n password: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const deleteAccount = async ({ password }: z.infer) => {\n const params = {} as Record\n\n if (credentialsLinked) {\n params.password = password!\n } else if (!isFresh) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n if (deleteUser?.verification) {\n params.callbackURL = `${baseURL}${basePath}/${viewPaths.SIGN_OUT}`\n }\n\n try {\n await authClient.deleteUser({\n ...params,\n fetchOptions: {\n throw: true\n }\n })\n\n if (deleteUser?.verification) {\n toast({\n variant: \"success\",\n message: localization.DELETE_ACCOUNT_VERIFY!\n })\n } else {\n toast({\n variant: \"success\",\n message: localization.DELETE_ACCOUNT_SUCCESS!\n })\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n onOpenChange?.(false)\n }\n\n return (\n \n \n \n \n {localization?.DELETE_ACCOUNT}\n \n\n \n {isFresh\n ? localization?.DELETE_ACCOUNT_INSTRUCTIONS\n : localization?.SESSION_NOT_FRESH}\n \n \n\n \n \n \n\n
\n \n {credentialsLinked && (\n (\n \n \n {localization?.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n {isFresh\n ? localization?.DELETE_ACCOUNT\n : localization?.SIGN_OUT}\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/delete-organization-card.json b/docs/public/r/delete-organization-card.json new file mode 100644 index 00000000..265f6d22 --- /dev/null +++ b/docs/public/r/delete-organization-card.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-organization-card", + "type": "registry:component", + "title": "Delete Organization Card", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { DeleteOrganizationDialog } from \"./delete-organization-dialog\"\n\nexport function DeleteOrganizationCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization)\n return (\n \n )\n\n return (\n \n )\n}\n\nfunction DeleteOrganizationForm({\n className,\n classNames,\n localization: localizationProp,\n organization\n}: SettingsCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission }\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: hasPermission, isPending } = useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"delete\"]\n }\n })\n\n const [showDialog, setShowDialog] = useState(false)\n\n if (!hasPermission?.success) return null\n\n return (\n <>\n setShowDialog(true)}\n />\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/delete-organization-dialog.json b/docs/public/r/delete-organization-dialog.json new file mode 100644 index 00000000..82c8af10 --- /dev/null +++ b/docs/public/r/delete-organization-dialog.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-organization-dialog", + "type": "registry:component", + "title": "Delete Organization Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface DeleteOrganizationDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n organization: Organization\n}\n\nexport function DeleteOrganizationDialog({\n classNames,\n localization: localizationProp,\n onOpenChange,\n organization,\n ...props\n}: DeleteOrganizationDialogProps) {\n const {\n authClient,\n account: accountOptions,\n hooks: { useListOrganizations },\n localization: contextLocalization,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganizations } = useListOrganizations()\n\n const formSchema = z.object({\n slug: z\n .string()\n .min(1, { message: localization.SLUG_REQUIRED! })\n .refine((val) => val === organization.slug, {\n message: localization.SLUG_DOES_NOT_MATCH!\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n slug: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const deleteOrganization = async () => {\n try {\n await authClient.organization.delete({\n organizationId: organization.id,\n fetchOptions: { throw: true }\n })\n\n await refetchOrganizations?.()\n\n toast({\n variant: \"success\",\n message: localization.DELETE_ORGANIZATION_SUCCESS!\n })\n\n navigate(\n `${accountOptions?.basePath}/${accountOptions?.viewPaths.ORGANIZATIONS}`\n )\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n \n \n \n \n {localization?.DELETE_ORGANIZATION}\n \n\n \n {localization?.DELETE_ORGANIZATION_DESCRIPTION}\n \n \n\n \n \n \n\n
\n \n (\n \n \n {\n localization?.DELETE_ORGANIZATION_INSTRUCTIONS\n }\n\n \n {organization.slug}\n \n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization?.DELETE_ORGANIZATION}\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/delete-user-options.json b/docs/public/r/delete-user-options.json new file mode 100644 index 00000000..e2a1e41c --- /dev/null +++ b/docs/public/r/delete-user-options.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-user-options", + "type": "registry:file", + "title": "Delete User Options", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/delete-user-options.ts", + "content": "export type DeleteUserOptions = {\n /**\n * Enable or disable email verification for account deletion\n * @default undefined\n */\n verification?: boolean\n}\n", + "type": "registry:file", + "target": "types/delete-user-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/dialog.json b/docs/public/r/dialog.json new file mode 100644 index 00000000..94861251 --- /dev/null +++ b/docs/public/r/dialog.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dialog", + "type": "registry:ui", + "title": "Dialog", + "description": "", + "dependencies": [ + "@radix-ui/react-dialog", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/dialog.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/drawer.json b/docs/public/r/drawer.json new file mode 100644 index 00000000..9f958f48 --- /dev/null +++ b/docs/public/r/drawer.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "drawer", + "type": "registry:ui", + "title": "Drawer", + "description": "", + "dependencies": [ + "vaul" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/drawer.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-cell.json b/docs/public/r/organization-cell.json new file mode 100644 index 00000000..6ba436fa --- /dev/null +++ b/docs/public/r/organization-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-cell", + "type": "registry:component", + "title": "Organization Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/leave-organization-dialog.json", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-cell.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { EllipsisIcon, Loader2, LogOutIcon, SettingsIcon } from \"lucide-react\"\nimport { useCallback, useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { LeaveOrganizationDialog } from \"./leave-organization-dialog\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface OrganizationCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n organization: Organization\n localization?: AuthLocalization\n}\n\nexport function OrganizationCell({\n className,\n classNames,\n organization,\n localization: localizationProp\n}: OrganizationCellProps) {\n const {\n authClient,\n localization: contextLocalization,\n organization: organizationOptions,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { pathMode } = organizationOptions || {}\n\n const [isLeaveDialogOpen, setIsLeaveDialogOpen] = useState(false)\n const [isManagingOrganization, setIsManagingOrganization] = useState(false)\n\n const handleManageOrganization = useCallback(async () => {\n setIsManagingOrganization(true)\n\n if (pathMode === \"slug\") {\n navigate(\n `${organizationOptions?.basePath}/${organization.slug}/${organizationOptions?.viewPaths.SETTINGS}`\n )\n\n return\n }\n\n try {\n await authClient.organization.setActive({\n organizationId: organization.id,\n fetchOptions: {\n throw: true\n }\n })\n\n navigate(\n `${organizationOptions?.basePath}/${organizationOptions?.viewPaths?.SETTINGS}`\n )\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsManagingOrganization(false)\n }\n }, [\n authClient,\n organization.id,\n organizationOptions?.basePath,\n organizationOptions?.viewPaths?.SETTINGS,\n organization.slug,\n pathMode,\n navigate,\n toast,\n localization\n ])\n\n return (\n <>\n \n \n\n \n \n \n {isManagingOrganization ? (\n \n ) : (\n \n )}\n \n \n\n \n \n \n\n {localization.MANAGE_ORGANIZATION}\n \n\n setIsLeaveDialogOpen(true)}\n variant=\"destructive\"\n >\n \n\n {localization.LEAVE_ORGANIZATION}\n \n \n \n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-error-codes.json b/docs/public/r/organization-error-codes.json new file mode 100644 index 00000000..160c1c39 --- /dev/null +++ b/docs/public/r/organization-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-error-codes", + "type": "registry:file", + "title": "Organization Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/organization-error-codes.ts", + "content": "export const ORGANIZATION_ERROR_CODES = {\n YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION:\n \"You are not allowed to create a new organization\",\n YOU_HAVE_REACHED_THE_MAXIMUM_NUMBER_OF_ORGANIZATIONS:\n \"You have reached the maximum number of organizations\",\n ORGANIZATION_ALREADY_EXISTS: \"Organization already exists\",\n ORGANIZATION_NOT_FOUND: \"Organization not found\",\n USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION:\n \"User is not a member of the organization\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_ORGANIZATION:\n \"You are not allowed to update this organization\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_ORGANIZATION:\n \"You are not allowed to delete this organization\",\n NO_ACTIVE_ORGANIZATION: \"No active organization\",\n USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION:\n \"User is already a member of this organization\",\n MEMBER_NOT_FOUND: \"Member not found\",\n ROLE_NOT_FOUND: \"Role not found\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_TEAM:\n \"You are not allowed to create a new team\",\n TEAM_ALREADY_EXISTS: \"Team already exists\",\n TEAM_NOT_FOUND: \"Team not found\",\n YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER:\n \"You cannot leave the organization as the only owner\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER:\n \"You are not allowed to delete this member\",\n YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION:\n \"You are not allowed to invite users to this organization\",\n USER_IS_ALREADY_INVITED_TO_THIS_ORGANIZATION:\n \"User is already invited to this organization\",\n INVITATION_NOT_FOUND: \"Invitation not found\",\n YOU_ARE_NOT_THE_RECIPIENT_OF_THE_INVITATION:\n \"You are not the recipient of the invitation\",\n YOU_ARE_NOT_ALLOWED_TO_CANCEL_THIS_INVITATION:\n \"You are not allowed to cancel this invitation\",\n INVITER_IS_NO_LONGER_A_MEMBER_OF_THE_ORGANIZATION:\n \"Inviter is no longer a member of the organization\",\n YOU_ARE_NOT_ALLOWED_TO_INVITE_USER_WITH_THIS_ROLE:\n \"you are not allowed to invite user with this role\",\n FAILED_TO_RETRIEVE_INVITATION: \"Failed to retrieve invitation\",\n YOU_HAVE_REACHED_THE_MAXIMUM_NUMBER_OF_TEAMS:\n \"You have reached the maximum number of teams\",\n UNABLE_TO_REMOVE_LAST_TEAM: \"Unable to remove last team\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER:\n \"You are not allowed to update this member\",\n ORGANIZATION_MEMBERSHIP_LIMIT_REACHED:\n \"Organization membership limit reached\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_TEAMS_IN_THIS_ORGANIZATION:\n \"You are not allowed to create teams in this organization\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_TEAMS_IN_THIS_ORGANIZATION:\n \"You are not allowed to delete teams in this organization\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_TEAM:\n \"You are not allowed to update this team\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_TEAM:\n \"You are not allowed to delete this team\",\n INVITATION_LIMIT_REACHED: \"Invitation limit reached\"\n}\n", + "type": "registry:file", + "target": "localization/organization-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-invitations-card.json b/docs/public/r/organization-invitations-card.json new file mode 100644 index 00000000..884465c0 --- /dev/null +++ b/docs/public/r/organization-invitations-card.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-invitations-card", + "type": "registry:component", + "title": "Organization Invitations Card", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invitation-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-invitations-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { InvitationCell } from \"./invitation-cell\"\n\nexport function OrganizationInvitationsCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) return null\n\n return (\n \n )\n}\n\nfunction OrganizationInvitationsContent({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: SettingsCardProps & { organization: Organization }) {\n const {\n hooks: { useListInvitations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: invitations } = useListInvitations({\n query: { organizationId: organization.id }\n })\n\n const pendingInvitations = invitations?.filter(\n (invitation) => invitation.status === \"pending\"\n )\n if (!pendingInvitations?.length) return null\n\n return (\n \n \n {pendingInvitations.map((invitation) => (\n \n ))}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-logo-card.json b/docs/public/r/organization-logo-card.json new file mode 100644 index 00000000..88ea3f9a --- /dev/null +++ b/docs/public/r/organization-logo-card.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-logo-card", + "type": "registry:component", + "title": "Organization Logo Card", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport {\n type ComponentProps,\n useContext,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { SettingsCardFooter } from \"../settings/shared/settings-card-footer\"\nimport { SettingsCardHeader } from \"../settings/shared/settings-card-header\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { OrganizationLogo } from \"./organization-logo\"\n\nexport interface OrganizationLogoCardProps extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n slug?: string\n}\n\nexport function OrganizationLogoCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: OrganizationLogoCardProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n
\n \n\n \n \n \n
\n\n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationLogoForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationLogoCardProps & { organization: Organization }) {\n const {\n hooks: { useHasPermission },\n localization: authLocalization,\n organization: organizationOptions,\n mutators: { updateOrganization },\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...authLocalization, ...localizationProp }),\n [authLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const { data: hasPermission, isPending: permissionPending } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const isPending = permissionPending\n\n const fileInputRef = useRef(null)\n const [loading, setLoading] = useState(false)\n\n const handleLogoChange = async (file: File) => {\n if (!organizationOptions?.logo || !hasPermission?.success) return\n\n setLoading(true)\n\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n organizationOptions.logo.size,\n organizationOptions.logo.extension\n )\n\n let image: string | undefined | null\n\n if (organizationOptions.logo.upload) {\n image = await organizationOptions.logo.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (!image) {\n setLoading(false)\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { logo: image }\n })\n\n await refetchOrganization?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const handleDeleteLogo = async () => {\n if (!hasPermission?.success) return\n\n setLoading(true)\n\n try {\n if (organization.logo) {\n await organizationOptions?.logo?.delete?.(organization.logo)\n }\n\n await updateOrganization({\n organizationId: organization.id,\n data: { logo: \"\" }\n })\n\n await refetchOrganization?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const openFileDialog = () => {\n fileInputRef.current?.click()\n }\n\n return (\n \n {\n const file = e.target.files?.item(0)\n if (file) handleLogoChange(file)\n\n e.target.value = \"\"\n }}\n />\n\n
\n \n\n \n \n \n \n \n \n\n e.preventDefault()}\n >\n \n \n\n {localization.UPLOAD_LOGO}\n \n\n {organization.logo && (\n \n \n\n {localization.DELETE_LOGO}\n \n )}\n \n \n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-logo.json b/docs/public/r/organization-logo.json new file mode 100644 index 00000000..c6fcc074 --- /dev/null +++ b/docs/public/r/organization-logo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-logo", + "type": "registry:component", + "title": "Organization Logo", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { BuildingIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationLogoClassNames {\n base?: string\n image?: string\n fallback?: string\n fallbackIcon?: string\n skeleton?: string\n}\n\nexport interface OrganizationLogoProps {\n classNames?: OrganizationLogoClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\" | null\n organization?: Partial | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays an organization logo with image and fallback support\n *\n * Renders an organization's logo image when available, with appropriate fallbacks:\n * - Shows a skeleton when isPending is true\n * - Falls back to a building icon when no logo is available\n */\nexport function OrganizationLogo({\n className,\n classNames,\n isPending,\n size,\n organization,\n localization: propLocalization,\n ...props\n}: OrganizationLogoProps & ComponentProps) {\n const { localization: contextLocalization, avatar } =\n useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n const name = organization?.name\n const src = organization?.logo\n\n if (isPending) {\n return (\n \n )\n }\n\n return (\n \n {avatar?.Image ? (\n \n ) : (\n \n )}\n\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-members-card.json b/docs/public/r/organization-members-card.json new file mode 100644 index 00000000..2fa79988 --- /dev/null +++ b/docs/public/r/organization-members-card.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-members-card", + "type": "registry:component", + "title": "Organization Members Card", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invite-member-dialog.json", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-members-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { InviteMemberDialog } from \"./invite-member-dialog\"\nimport { MemberCell } from \"./member-cell\"\n\nexport function OrganizationMembersCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationMembersContent({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: SettingsCardProps & { organization: Organization }) {\n const {\n hooks: { useHasPermission, useListMembers },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: hasPermissionInvite, isPending: isPendingInvite } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n invitation: [\"create\"]\n }\n })\n\n const {\n data: hasPermissionUpdateMember,\n isPending: isPendingUpdateMember\n } = useHasPermission({\n organizationId: organization.id,\n permission: {\n member: [\"update\"]\n }\n })\n\n const isPending = isPendingInvite || isPendingUpdateMember\n\n const { data } = useListMembers({\n query: { organizationId: organization.id }\n })\n\n const members = data?.members\n\n const [inviteDialogOpen, setInviteDialogOpen] = useState(false)\n\n return (\n <>\n setInviteDialogOpen(true)}\n isPending={isPending}\n disabled={!hasPermissionInvite?.success}\n {...props}\n >\n {!isPending && members && members.length > 0 && (\n \n {members\n .sort(\n (a, b) =>\n new Date(a.createdAt).getTime() -\n new Date(b.createdAt).getTime()\n )\n .map((member) => (\n \n ))}\n \n )}\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-name-card.json b/docs/public/r/organization-name-card.json new file mode 100644 index 00000000..bc112dcf --- /dev/null +++ b/docs/public/r/organization-name-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-name-card", + "type": "registry:component", + "title": "Organization Name Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-name-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport {\n SettingsCard,\n type SettingsCardProps\n} from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { Form, FormControl, FormField, FormItem, FormMessage } from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationNameCardProps extends SettingsCardProps {\n slug?: string\n}\n\nexport function OrganizationNameCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: OrganizationNameCardProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationNameForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationNameCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission },\n mutators: { updateOrganization },\n optimistic,\n toast\n } = useContext(AuthUIContext)\n\n const localization = { ...contextLocalization, ...localizationProp }\n\n const { data: hasPermission, isPending: permissionPending } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const isPending = permissionPending\n\n const formSchema = z.object({\n name: z.string().min(1, {\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: { name: organization.name || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateOrganizationName = async ({\n name\n }: z.infer) => {\n if (organization.name === name) {\n toast({\n variant: \"error\",\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { name }\n })\n\n await refetchOrganization?.()\n\n toast({\n variant: \"success\",\n message: `${localization.ORGANIZATION_NAME} ${localization.UPDATED_SUCCESSFULLY}`\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-options.json b/docs/public/r/organization-options.json new file mode 100644 index 00000000..5e1cc229 --- /dev/null +++ b/docs/public/r/organization-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-options", + "type": "registry:file", + "title": "Organization Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/types/organization-options.ts", + "content": "export type OrganizationLogoOptions = {\n /**\n * Upload a logo image and return the URL string\n * @remarks `(file: File) => Promise`\n */\n upload?: (file: File) => Promise\n /**\n * Delete a previously uploaded logo image from your storage/CDN\n * @remarks `(url: string) => Promise`\n */\n delete?: (url: string) => Promise\n /**\n * Logo size for resizing\n * @default 256 if upload is provided, 128 otherwise\n */\n size: number\n /**\n * File extension for logo uploads\n * @default \"png\"\n */\n extension: string\n}\n\nimport type { OrganizationViewPaths } from \"../lib/view-paths\"\n\nexport type OrganizationOptions = {\n /**\n * Logo configuration\n * @default undefined\n */\n logo?: boolean | Partial\n /**\n * Custom roles to add to the built-in roles (owner, admin, member)\n * @default []\n */\n customRoles?: Array<{ role: string; label: string }>\n /**\n * Enable or disable API key support for organizations\n * @default false\n */\n apiKey?: boolean\n /**\n * Base path for organization-scoped views (supports slugged or static base)\n * When using slug paths, set this to the common prefix (e.g. \"/organization\")\n */\n basePath?: string\n /**\n * Organization path mode\n * - \"default\": use active-organization based routes\n * - \"slug\": use slug-based URLs where slug becomes the first path segment\n * e.g. \"/[slug]/members\" (or `${basePath}/[slug]/members` if basePath provided)\n * @default \"default\"\n */\n pathMode?: \"default\" | \"slug\"\n /**\n * The current organization slug\n */\n slug?: string\n /**\n * The path to redirect to when Personal Account is selected\n */\n personalPath?: string\n /**\n * Customize organization view paths\n */\n viewPaths?: Partial\n}\n\nexport type OrganizationOptionsContext = {\n /**\n * Logo configuration\n * @default undefined\n */\n logo?: OrganizationLogoOptions\n /**\n * Custom roles to add to the built-in roles (owner, admin, member)\n * @default []\n */\n customRoles: Array<{ role: string; label: string }>\n /**\n * Enable or disable API key support for organizations\n * @default false\n */\n apiKey?: boolean\n /**\n * Base path for organization-scoped views\n */\n basePath: string\n /**\n * Organization path mode\n * @default \"default\"\n */\n pathMode?: \"default\" | \"slug\"\n /**\n * The current organization slug\n */\n slug?: string\n /**\n * The path to redirect to when Personal Account is selected\n */\n personalPath?: string\n /**\n * Customize organization view paths\n */\n viewPaths: OrganizationViewPaths\n}\n", + "type": "registry:file", + "target": "types/organization-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-refetcher.json b/docs/public/r/organization-refetcher.json new file mode 100644 index 00000000..6abfa7e4 --- /dev/null +++ b/docs/public/r/organization-refetcher.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-refetcher", + "type": "registry:lib", + "title": "Organization Refetcher", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/lib/organization-refetcher.tsx", + "content": "import { useContext, useEffect } from \"react\"\nimport { useCurrentOrganization } from \"../hooks/use-current-organization\"\nimport { AuthUIContext } from \"./auth-ui-provider\"\n\nexport const OrganizationRefetcher = () => {\n const {\n hooks: { useListOrganizations, useSession },\n organization: organizationOptions,\n navigate,\n redirectTo\n } = useContext(AuthUIContext)\n\n const { slug, pathMode, personalPath } = organizationOptions || {}\n\n const { data: sessionData } = useSession()\n\n const {\n data: organization,\n isPending: organizationPending,\n isRefetching: organizationRefetching,\n refetch: refetchOrganization\n } = useCurrentOrganization()\n\n const { refetch: refetchListOrganizations } = useListOrganizations()\n\n const { data: organizations } = useListOrganizations()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Refetch fix\n useEffect(() => {\n if (!sessionData?.user.id) return\n\n if (organization || organizations) {\n refetchOrganization?.()\n refetchListOrganizations?.()\n }\n }, [sessionData?.user.id])\n\n useEffect(() => {\n if (organizationRefetching || organizationPending) return\n\n if (slug && pathMode === \"slug\" && !organization) {\n navigate(personalPath || redirectTo)\n }\n }, [\n organization,\n organizationRefetching,\n organizationPending,\n slug,\n pathMode,\n personalPath,\n navigate,\n redirectTo\n ])\n\n return null\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-settings-cards.json b/docs/public/r/organization-settings-cards.json new file mode 100644 index 00000000..28373edd --- /dev/null +++ b/docs/public/r/organization-settings-cards.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-settings-cards", + "type": "registry:component", + "title": "Organization Settings Cards", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-card.json", + "http://localhost:3000/r/organization-logo-card.json", + "http://localhost:3000/r/organization-name-card.json", + "http://localhost:3000/r/organization-slug-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-settings-cards.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { DeleteOrganizationCard } from \"./delete-organization-card\"\nimport { OrganizationLogoCard } from \"./organization-logo-card\"\nimport { OrganizationNameCard } from \"./organization-name-card\"\nimport { OrganizationSlugCard } from \"./organization-slug-card\"\n\nexport type OrganizationSettingsCardsProps = {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n slug?: string\n}\n\nexport function OrganizationSettingsCards({\n className,\n classNames,\n localization,\n slug\n}: OrganizationSettingsCardsProps) {\n const { organization: organizationOptions } = useContext(AuthUIContext)\n\n return (\n \n {organizationOptions?.logo && (\n \n )}\n\n \n\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-slug-card.json b/docs/public/r/organization-slug-card.json new file mode 100644 index 00000000..9d5664c3 --- /dev/null +++ b/docs/public/r/organization-slug-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-slug-card", + "type": "registry:component", + "title": "Organization Slug Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-slug-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport {\n SettingsCard,\n type SettingsCardProps\n} from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { Form, FormControl, FormField, FormItem, FormMessage } from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationSlugCardProps extends SettingsCardProps {\n slug?: string\n}\n\nexport function OrganizationSlugCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: OrganizationSlugCardProps) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationSlugForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationSlugCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission },\n mutators: { updateOrganization },\n optimistic,\n toast,\n organization: organizationOptions,\n replace\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const { data: hasPermission, isPending } = useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const formSchema = z.object({\n slug: z\n .string()\n .min(1, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_REQUIRED}`\n })\n .regex(/^[a-z0-9-]+$/, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_INVALID}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: { slug: organization.slug || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateOrganizationSlug = async ({\n slug\n }: z.infer) => {\n if (organization.slug === slug) {\n toast({\n variant: \"error\",\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { slug }\n })\n\n await refetchOrganization?.()\n\n toast({\n variant: \"success\",\n message: `${localization.ORGANIZATION_SLUG} ${localization.UPDATED_SUCCESSFULLY}`\n })\n\n // If using slug-based paths, redirect to the new slug's settings route\n if (organizationOptions?.pathMode === \"slug\") {\n const basePath = organizationOptions.basePath\n const settingsPath = organizationOptions.viewPaths.SETTINGS\n replace(`${basePath}/${slug}/${settingsPath}`)\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-switcher.json b/docs/public/r/organization-switcher.json new file mode 100644 index 00000000..1de2c5b9 --- /dev/null +++ b/docs/public/r/organization-switcher.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-switcher", + "type": "registry:component", + "title": "Organization Switcher", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/create-organization-dialog.json", + "dropdown-menu", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-switcher.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport {\n ChevronsUpDown,\n LogInIcon,\n PlusCircleIcon,\n SettingsIcon\n} from \"lucide-react\"\nimport {\n type ComponentProps,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { User } from \"../../types/auth-client\"\nimport { Button } from \"../ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { UserAvatar, type UserAvatarClassNames } from \"../user-avatar\"\nimport type { UserViewClassNames } from \"../user-view\"\nimport { CreateOrganizationDialog } from \"./create-organization-dialog\"\nimport {\n OrganizationCellView,\n type OrganizationViewClassNames\n} from \"./organization-cell-view\"\nimport { OrganizationLogo } from \"./organization-logo\"\nimport { PersonalAccountView } from \"./personal-account-view\"\n\nexport interface OrganizationSwitcherClassNames {\n base?: string\n skeleton?: string\n trigger?: {\n base?: string\n avatar?: UserAvatarClassNames\n user?: UserViewClassNames\n organization?: OrganizationViewClassNames\n skeleton?: string\n }\n content?: {\n base?: string\n user?: UserViewClassNames\n organization?: OrganizationViewClassNames\n avatar?: UserAvatarClassNames\n menuItem?: string\n separator?: string\n }\n}\n\nexport interface OrganizationSwitcherProps\n extends Omit, \"trigger\"> {\n classNames?: OrganizationSwitcherClassNames\n align?: \"center\" | \"start\" | \"end\"\n trigger?: ReactNode\n localization?: AuthLocalization\n slug?: string\n onSetActive?: (organization: Organization | null) => void\n /**\n * Hide the personal organization option from the switcher.\n * When true, users can only switch between organizations and cannot access their personal account.\n * If no organization is active, the first available organization will be automatically selected.\n * @default false\n */\n hidePersonal?: boolean\n}\n\n/**\n * Displays an interactive user button with dropdown menu functionality\n *\n * Renders a user interface element that can be displayed as either an icon or full button:\n * - Shows a user avatar or placeholder when in icon mode\n * - Displays user name and email with dropdown indicator in full mode\n * - Provides dropdown menu with authentication options (sign in/out, settings, etc.)\n * - Supports multi-session functionality for switching between accounts\n * - Can be customized with additional links and styling options\n */\nexport function OrganizationSwitcher({\n className,\n classNames,\n align,\n trigger,\n localization: localizationProp,\n slug: slugProp,\n size,\n onSetActive,\n hidePersonal,\n ...props\n}: OrganizationSwitcherProps) {\n const {\n authClient,\n basePath,\n hooks: { useSession, useListOrganizations },\n localization: contextLocalization,\n account: accountOptions,\n organization: organizationOptions,\n redirectTo,\n navigate,\n toast,\n viewPaths,\n Link\n } = useContext(AuthUIContext)\n\n const {\n pathMode,\n slug: contextSlug,\n personalPath\n } = organizationOptions || {}\n\n const slug = slugProp || contextSlug\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [activeOrganizationPending, setActiveOrganizationPending] =\n useState(false)\n const [isCreateOrgDialogOpen, setIsCreateOrgDialogOpen] = useState(false)\n const [dropdownOpen, setDropdownOpen] = useState(false)\n\n const { data: sessionData, isPending: sessionPending } = useSession()\n const user = sessionData?.user\n\n const { data: organizations, isPending: organizationsPending } =\n useListOrganizations()\n\n const {\n data: activeOrganization,\n isPending: organizationPending,\n isRefetching: organizationRefetching\n } = useCurrentOrganization({ slug })\n\n const isPending =\n organizationsPending ||\n sessionPending ||\n activeOrganizationPending ||\n organizationPending\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (organizationRefetching) return\n\n setActiveOrganizationPending(false)\n }, [activeOrganization, organizationRefetching])\n\n const switchOrganization = useCallback(\n async (organization: Organization | null) => {\n // Prevent switching to personal account when hidePersonal is true\n if (hidePersonal && organization === null) {\n return\n }\n\n if (pathMode === \"slug\") {\n if (organization) {\n navigate(\n `${organizationOptions?.basePath}/${organization.slug}`\n )\n } else {\n navigate(personalPath ?? redirectTo)\n }\n\n return\n }\n\n setActiveOrganizationPending(true)\n\n try {\n onSetActive?.(organization)\n\n await authClient.organization.setActive({\n organizationId: organization?.id || null,\n fetchOptions: {\n throw: true\n }\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setActiveOrganizationPending(false)\n }\n },\n [\n authClient,\n toast,\n localization,\n onSetActive,\n hidePersonal,\n pathMode,\n personalPath,\n organizationOptions?.basePath,\n redirectTo,\n navigate\n ]\n )\n\n // Auto-select first organization when hidePersonal is true\n useEffect(() => {\n if (\n hidePersonal &&\n !activeOrganization &&\n !activeOrganizationPending &&\n organizations &&\n organizations.length > 0 &&\n !sessionPending &&\n !organizationPending &&\n !slug\n ) {\n switchOrganization(organizations[0])\n }\n }, [\n hidePersonal,\n activeOrganization,\n activeOrganizationPending,\n organizations,\n sessionPending,\n organizationPending,\n switchOrganization,\n slug\n ])\n\n return (\n <>\n \n \n {trigger ||\n (size === \"icon\" ? (\n \n {isPending ||\n activeOrganization ||\n !sessionData ||\n (user as User)?.isAnonymous ||\n hidePersonal ? (\n \n ) : (\n \n )}\n \n ) : (\n \n {isPending ||\n activeOrganization ||\n !sessionData ||\n (user as User)?.isAnonymous ||\n hidePersonal ? (\n \n ) : (\n \n )}\n\n \n \n ))}\n \n\n e.preventDefault()}\n >\n \n {(user && !(user as User).isAnonymous) || isPending ? (\n <>\n {activeOrganizationPending ||\n activeOrganization ||\n hidePersonal ? (\n \n ) : (\n \n )}\n\n {!isPending && (\n \n \n setDropdownOpen(false)\n }\n >\n \n \n \n )}\n \n ) : (\n
\n {localization.ORGANIZATION}\n
\n )}\n \n\n \n\n {activeOrganization && !hidePersonal && (\n switchOrganization(null)}\n >\n \n \n )}\n\n {organizations?.map(\n (organization) =>\n organization.id !== activeOrganization?.id && (\n \n switchOrganization(organization)\n }\n >\n \n \n )\n )}\n\n {organizations &&\n organizations.length > 0 &&\n (!hidePersonal || organizations.length > 1) && (\n \n )}\n\n {!isPending &&\n sessionData &&\n !(user as User).isAnonymous ? (\n setIsCreateOrgDialogOpen(true)}\n >\n \n {localization.CREATE_ORGANIZATION}\n \n ) : (\n \n \n \n {localization.SIGN_IN}\n \n \n )}\n \n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organization-view.json b/docs/public/r/organization-view.json new file mode 100644 index 00000000..c908138e --- /dev/null +++ b/docs/public/r/organization-view.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-view", + "type": "registry:component", + "title": "Organization View", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-view.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organization-invitations-card.json", + "http://localhost:3000/r/organization-members-card.json", + "http://localhost:3000/r/organization-settings-cards.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-view.tsx", + "content": "\"use client\"\n\nimport { MenuIcon } from \"lucide-react\"\nimport { useContext, useEffect, useMemo } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { OrganizationViewPath } from \"../../server\"\nimport type { AccountViewProps } from \"../account/account-view\"\nimport { ApiKeysCard } from \"../settings/api-key/api-keys-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger\n} from \"../ui/drawer\"\nimport { Label } from \"../ui/label\"\nimport { OrganizationInvitationsCard } from \"./organization-invitations-card\"\nimport { OrganizationMembersCard } from \"./organization-members-card\"\nimport { OrganizationSettingsCards } from \"./organization-settings-cards\"\n\nexport type OrganizationViewPageProps = Omit & {\n slug?: string\n view?: OrganizationViewPath\n}\n\nexport function OrganizationView({\n className,\n classNames,\n localization: localizationProp,\n pathname,\n view: viewProp,\n hideNav,\n slug: slugProp\n}: OrganizationViewPageProps) {\n const {\n organization: organizationOptions,\n localization: contextLocalization,\n account: accountOptions,\n Link,\n replace\n } = useContext(AuthUIContext)\n\n const { slug: contextSlug, viewPaths, apiKey } = organizationOptions || {}\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const view = viewProp || getViewByPath(viewPaths!, pathname) || \"SETTINGS\"\n\n const slug = slugProp || contextSlug\n\n const {\n data: organization,\n isPending: organizationPending,\n isRefetching: organizationRefetching\n } = useCurrentOrganization({ slug })\n\n const navItems: {\n view: OrganizationViewPath\n label: string\n }[] = [\n { view: \"SETTINGS\", label: localization.SETTINGS },\n { view: \"MEMBERS\", label: localization.MEMBERS }\n ]\n\n if (apiKey) {\n navItems.push({\n view: \"API_KEYS\",\n label: localization.API_KEYS\n })\n }\n\n useEffect(() => {\n if (organization || organizationPending || organizationRefetching)\n return\n\n replace(\n `${accountOptions?.basePath}/${accountOptions?.viewPaths?.ORGANIZATIONS}`\n )\n }, [\n organization,\n organizationPending,\n organizationRefetching,\n accountOptions?.basePath,\n accountOptions?.viewPaths?.ORGANIZATIONS,\n replace\n ])\n\n return (\n \n {!hideNav && (\n
\n \n\n \n \n \n \n\n \n \n \n {localization.ORGANIZATION}\n \n \n
\n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n
\n
\n
\n )}\n\n {!hideNav && (\n
\n \n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n \n )}\n\n {view === \"MEMBERS\" && (\n \n \n\n \n \n )}\n\n {view === \"API_KEYS\" && (\n \n )}\n\n {view === \"SETTINGS\" && (\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/organizations-card.json b/docs/public/r/organizations-card.json new file mode 100644 index 00000000..b5e70067 --- /dev/null +++ b/docs/public/r/organizations-card.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organizations-card", + "type": "registry:component", + "title": "Organizations Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-organization-dialog.json", + "http://localhost:3000/r/organization-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organizations-card.tsx", + "content": "\"use client\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../settings/skeletons/settings-cell-skeleton\"\nimport { CardContent } from \"../ui/card\"\nimport { CreateOrganizationDialog } from \"./create-organization-dialog\"\nimport { OrganizationCell } from \"./organization-cell\"\n\nexport function OrganizationsCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useListOrganizations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = useMemo(\n () => ({ ...contextLocalization, ...localization }),\n [contextLocalization, localization]\n )\n\n const isHydrated = useIsHydrated()\n const { data: organizations, isPending: organizationsPending } =\n useListOrganizations()\n\n const isPending = !isHydrated || organizationsPending\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false)\n\n return (\n <>\n setCreateDialogOpen(true)}\n isPending={isPending}\n {...props}\n >\n \n {isPending && }\n {organizations?.map((organization) => (\n \n ))}\n \n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/otp-input-group.json b/docs/public/r/otp-input-group.json new file mode 100644 index 00000000..3ea726ae --- /dev/null +++ b/docs/public/r/otp-input-group.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "otp-input-group", + "type": "registry:component", + "title": "Otp Input Group", + "description": "", + "dependencies": [], + "registryDependencies": [ + "input-otp" + ], + "files": [ + { + "path": "src/components/auth/otp-input-group.tsx", + "content": "\"use client\"\n\nimport { InputOTPGroup, InputOTPSeparator, InputOTPSlot } from \"../ui/input-otp\"\n\nexport function OTPInputGroup({\n otpSeparators = 0\n}: {\n otpSeparators?: 0 | 1 | 2\n}) {\n if (otpSeparators === 0) {\n return (\n \n \n \n \n \n \n \n \n )\n }\n\n if (otpSeparators === 1) {\n return (\n <>\n \n \n \n \n \n\n \n\n \n \n \n \n \n \n )\n }\n\n return (\n <>\n \n \n \n \n\n \n\n \n \n \n \n\n \n\n \n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/passkey-button.json b/docs/public/r/passkey-button.json new file mode 100644 index 00000000..c63f76f6 --- /dev/null +++ b/docs/public/r/passkey-button.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkey-button", + "type": "registry:component", + "title": "Passkey Button", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/passkey-button.tsx", + "content": "import { FingerprintIcon } from \"lucide-react\"\nimport { useContext } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport type { AuthViewClassNames } from \"./auth-view\"\n\ninterface PasskeyButtonProps {\n classNames?: AuthViewClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (isSubmitting: boolean) => void\n}\n\nexport function PasskeyButton({\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting\n}: PasskeyButtonProps) {\n const {\n authClient,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess } = useOnSuccessTransition({ redirectTo })\n\n const signInPassKey = async () => {\n setIsSubmitting?.(true)\n\n try {\n const response = await authClient.signIn.passkey({\n fetchOptions: { throw: true }\n })\n\n if (response?.error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({\n error: response.error,\n localization\n })\n })\n\n setIsSubmitting?.(false)\n } else {\n onSuccess()\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsSubmitting?.(false)\n }\n }\n\n return (\n \n \n {localization.SIGN_IN_WITH} {localization.PASSKEY}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/passkey-cell.json b/docs/public/r/passkey-cell.json new file mode 100644 index 00000000..6d9d507b --- /dev/null +++ b/docs/public/r/passkey-cell.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkey-cell", + "type": "registry:component", + "title": "Passkey Cell", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkey-cell.tsx", + "content": "\"use client\"\n\nimport { FingerprintIcon, Loader2 } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport { SessionFreshnessDialog } from \"../shared/session-freshness-dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface PasskeyCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n passkey: { id: string; createdAt: Date }\n}\n\nexport function PasskeyCell({\n className,\n classNames,\n localization,\n passkey\n}: PasskeyCellProps) {\n const {\n freshAge,\n hooks: { useSession, useListPasskeys },\n localization: contextLocalization,\n mutators: { deletePasskey },\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { refetch } = useListPasskeys()\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n\n const [showFreshnessDialog, setShowFreshnessDialog] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleDeletePasskey = async () => {\n // If session isn't fresh, show the freshness dialog\n if (!isFresh) {\n setShowFreshnessDialog(true)\n return\n }\n\n setIsLoading(true)\n\n try {\n await deletePasskey({ id: passkey.id })\n refetch?.()\n } catch (error) {\n setIsLoading(false)\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n <>\n \n\n \n
\n \n \n {new Date(passkey.createdAt).toLocaleString()}\n \n
\n\n \n {isLoading && }\n\n {localization.DELETE}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/passkey-error-codes.json b/docs/public/r/passkey-error-codes.json new file mode 100644 index 00000000..318fed19 --- /dev/null +++ b/docs/public/r/passkey-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkey-error-codes", + "type": "registry:file", + "title": "Passkey Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/passkey-error-codes.ts", + "content": "export const PASSKEY_ERROR_CODES = {\n CHALLENGE_NOT_FOUND: \"Challenge not found\",\n YOU_ARE_NOT_ALLOWED_TO_REGISTER_THIS_PASSKEY:\n \"You are not allowed to register this passkey\",\n FAILED_TO_VERIFY_REGISTRATION: \"Failed to verify registration\",\n PASSKEY_NOT_FOUND: \"Passkey not found\",\n AUTHENTICATION_FAILED: \"Authentication failed\",\n UNABLE_TO_CREATE_SESSION: \"Unable to create session\",\n FAILED_TO_UPDATE_PASSKEY: \"Failed to update passkey\"\n}\n", + "type": "registry:file", + "target": "localization/passkey-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/passkeys-card.json b/docs/public/r/passkeys-card.json new file mode 100644 index 00000000..2f40c110 --- /dev/null +++ b/docs/public/r/passkeys-card.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkeys-card", + "type": "registry:component", + "title": "Passkeys Card", + "description": "", + "dependencies": [ + "react-hook-form" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/passkey-cell.json", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkeys-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport { Form } from \"../../ui/form\"\nimport { SessionFreshnessDialog } from \"../shared/session-freshness-dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { PasskeyCell } from \"./passkey-cell\"\n\nexport interface PasskeysCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function PasskeysCard({\n className,\n classNames,\n localization\n}: PasskeysCardProps) {\n const {\n authClient,\n freshAge,\n hooks: { useListPasskeys, useSession },\n localization: authLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...authLocalization, ...localization }\n\n const { data: passkeys, isPending, refetch } = useListPasskeys()\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n\n const [showFreshnessDialog, setShowFreshnessDialog] = useState(false)\n\n const addPasskey = async () => {\n // If session isn't fresh, show the freshness dialog\n if (!isFresh) {\n setShowFreshnessDialog(true)\n return\n }\n\n try {\n await authClient.passkey.addPasskey({\n fetchOptions: { throw: true }\n })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const form = useForm()\n\n return (\n <>\n \n\n
\n \n \n {passkeys && passkeys.length > 0 && (\n \n {passkeys?.map((passkey) => (\n \n ))}\n \n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/password-input.json b/docs/public/r/password-input.json new file mode 100644 index 00000000..49878dc0 --- /dev/null +++ b/docs/public/r/password-input.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "password-input", + "type": "registry:component", + "title": "Password Input", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "button", + "input", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/password-input.tsx", + "content": "\"use client\"\n\nimport { EyeIcon, EyeOffIcon } from \"lucide-react\"\nimport { type ComponentProps, useState } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\n\nexport function PasswordInput({\n className,\n enableToggle,\n onChange,\n ...props\n}: ComponentProps & { enableToggle?: boolean }) {\n const [disabled, setDisabled] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n return (\n
\n {\n setDisabled(!event.target.value)\n onChange?.(event)\n }}\n />\n\n {enableToggle && (\n <>\n setIsVisible(!isVisible)}\n >\n {isVisible ? : }\n \n\n \n \n )}\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/password-validation.json b/docs/public/r/password-validation.json new file mode 100644 index 00000000..636bea10 --- /dev/null +++ b/docs/public/r/password-validation.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "password-validation", + "type": "registry:file", + "title": "Password Validation", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/password-validation.ts", + "content": "export type PasswordValidation = {\n /**\n * Maximum password length\n */\n maxLength?: number\n\n /**\n * Minimum password length\n */\n minLength?: number\n\n /**\n * Password validation regex\n */\n regex?: RegExp\n}\n", + "type": "registry:file", + "target": "types/password-validation.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/personal-account-view.json b/docs/public/r/personal-account-view.json new file mode 100644 index 00000000..383f1e53 --- /dev/null +++ b/docs/public/r/personal-account-view.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "personal-account-view", + "type": "registry:component", + "title": "Personal Account View", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/personal-account-view.tsx", + "content": "\"use client\"\n\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { UserAvatar } from \"../user-avatar\"\nimport type { UserViewProps } from \"../user-view\"\n\n/**\n * Displays user information with avatar and details in a compact view for personal accounts\n *\n * Renders a user's profile information with appropriate fallbacks:\n * - Shows avatar alongside user name and \"Personal Account\" subtitle when available\n * - Shows loading skeletons when isPending is true\n * - Falls back to generic \"User\" text when neither name nor email is available\n * - Always shows \"Personal Account\" as subtitle for default and lg sizes\n * - Supports customization through classNames prop\n */\nexport function PersonalAccountView({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization\n}: UserViewProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n return (\n \n \n\n \n {isPending ? (\n <>\n \n\n {size !== \"sm\" && (\n \n )}\n \n ) : (\n <>\n \n {user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email ||\n localization?.USER}\n \n\n {size !== \"sm\" && (\n \n {localization?.PERSONAL_ACCOUNT}\n \n )}\n \n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/phone-number-error-codes.json b/docs/public/r/phone-number-error-codes.json new file mode 100644 index 00000000..3dce253e --- /dev/null +++ b/docs/public/r/phone-number-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "phone-number-error-codes", + "type": "registry:file", + "title": "Phone Number Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/phone-number-error-codes.ts", + "content": "export const PHONE_NUMBER_ERROR_CODES = {\n INVALID_PHONE_NUMBER: \"Invalid phone number\",\n PHONE_NUMBER_EXIST: \"Phone number already exists\",\n INVALID_PHONE_NUMBER_OR_PASSWORD: \"Invalid phone number or password\",\n UNEXPECTED_ERROR: \"Unexpected error\",\n OTP_NOT_FOUND: \"OTP not found\",\n OTP_EXPIRED: \"OTP expired\",\n INVALID_OTP: \"Invalid OTP\",\n PHONE_NUMBER_NOT_VERIFIED: \"Phone number not verified\"\n}\n", + "type": "registry:file", + "target": "localization/phone-number-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/profile.json b/docs/public/r/profile.json new file mode 100644 index 00000000..47c7828c --- /dev/null +++ b/docs/public/r/profile.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "profile", + "type": "registry:file", + "title": "Profile", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/profile.ts", + "content": "export type Profile = {\n id?: string | number\n email?: string | null\n name?: string | null\n displayUsername?: string | null\n username?: string | null\n displayName?: string | null\n firstName?: string | null\n fullName?: string | null\n isAnonymous?: boolean | null\n emailVerified?: boolean | null\n image?: string | null\n avatar?: string | null\n avatarUrl?: string | null\n}\n", + "type": "registry:file", + "target": "types/profile.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/provider-button.json b/docs/public/r/provider-button.json new file mode 100644 index 00000000..0de4abc1 --- /dev/null +++ b/docs/public/r/provider-button.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "provider-button", + "type": "registry:component", + "title": "Provider Button", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/provider-button.tsx", + "content": "import type { SocialProvider } from \"better-auth/social-providers\"\nimport { useCallback, useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { Provider } from \"../../lib/social-providers\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport type { AuthViewClassNames } from \"./auth-view\"\n\ninterface ProviderButtonProps {\n className?: string\n classNames?: AuthViewClassNames\n callbackURL?: string\n isSubmitting: boolean\n localization: Partial\n other?: boolean\n provider: Provider\n redirectTo?: string\n socialLayout: \"auto\" | \"horizontal\" | \"grid\" | \"vertical\"\n setIsSubmitting: (isSubmitting: boolean) => void\n}\n\nexport function ProviderButton({\n className,\n classNames,\n callbackURL: callbackURLProp,\n isSubmitting,\n localization,\n other,\n provider,\n redirectTo: redirectToProp,\n socialLayout,\n setIsSubmitting\n}: ProviderButtonProps) {\n const {\n authClient,\n basePath,\n baseURL,\n persistClient,\n redirectTo: contextRedirectTo,\n viewPaths,\n social,\n genericOAuth,\n toast\n } = useContext(AuthUIContext)\n\n const getRedirectTo = useCallback(\n () =>\n redirectToProp || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectToProp, contextRedirectTo]\n )\n\n const getCallbackURL = useCallback(\n () =>\n `${baseURL}${\n callbackURLProp ||\n (persistClient\n ? `${basePath}/${viewPaths.CALLBACK}?redirectTo=${getRedirectTo()}`\n : getRedirectTo())\n }`,\n [\n callbackURLProp,\n persistClient,\n basePath,\n viewPaths,\n baseURL,\n getRedirectTo\n ]\n )\n\n const doSignInSocial = async () => {\n setIsSubmitting(true)\n\n try {\n if (other) {\n const oauth2Params = {\n providerId: provider.provider,\n callbackURL: getCallbackURL(),\n fetchOptions: { throw: true }\n }\n\n if (genericOAuth?.signIn) {\n await genericOAuth.signIn(oauth2Params)\n\n setTimeout(() => {\n setIsSubmitting(false)\n }, 10000)\n } else {\n await authClient.signIn.oauth2(oauth2Params)\n }\n } else {\n const socialParams = {\n provider: provider.provider as SocialProvider,\n callbackURL: getCallbackURL(),\n fetchOptions: { throw: true }\n }\n\n if (social?.signIn) {\n await social.signIn(socialParams)\n\n setTimeout(() => {\n setIsSubmitting(false)\n }, 10000)\n } else {\n await authClient.signIn.social(socialParams)\n }\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsSubmitting(false)\n }\n }\n\n return (\n \n {provider.icon && (\n \n )}\n\n {socialLayout === \"grid\" && provider.name}\n {socialLayout === \"vertical\" &&\n `${localization.SIGN_IN_WITH} ${provider.name}`}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/provider-cell.json b/docs/public/r/provider-cell.json new file mode 100644 index 00000000..9aa164d1 --- /dev/null +++ b/docs/public/r/provider-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "provider-cell", + "type": "registry:component", + "title": "Provider Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/provider-cell.tsx", + "content": "\"use client\"\n\nimport type { SocialProvider } from \"better-auth/social-providers\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { Provider } from \"../../../lib/social-providers\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface ProviderCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n account?: {\n accountId: string\n provider: string\n } | null\n isPending?: boolean\n localization?: Partial\n other?: boolean\n provider: Provider\n refetch?: Refetch\n}\n\nexport function ProviderCell({\n className,\n classNames,\n account,\n localization,\n other,\n provider,\n refetch\n}: ProviderCellProps) {\n const {\n authClient,\n basePath,\n baseURL,\n localization: contextLocalization,\n mutators: { unlinkAccount },\n viewPaths,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const [isLoading, setIsLoading] = useState(false)\n\n const handleLink = async () => {\n setIsLoading(true)\n const callbackURL = `${baseURL}${basePath}/${viewPaths.CALLBACK}?redirectTo=${window.location.pathname}`\n\n try {\n if (other) {\n await authClient.oauth2.link({\n providerId: provider.provider as SocialProvider,\n callbackURL,\n fetchOptions: { throw: true }\n })\n } else {\n await authClient.linkSocial({\n provider: provider.provider as SocialProvider,\n callbackURL,\n fetchOptions: { throw: true }\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsLoading(false)\n }\n }\n\n const handleUnlink = async () => {\n setIsLoading(true)\n\n try {\n await unlinkAccount({\n accountId: account?.accountId,\n providerId: provider.provider\n })\n\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n return (\n \n {provider.icon && (\n \n )}\n\n
\n
{provider.name}
\n\n {account && }\n
\n\n \n {isLoading && }\n {account ? localization.UNLINK : localization.LINK}\n \n \n )\n}\n\nfunction AccountInfo({ account }: { account: { accountId: string } }) {\n const {\n hooks: { useAccountInfo }\n } = useContext(AuthUIContext)\n\n const { data: accountInfo, isPending } = useAccountInfo({\n accountId: account.accountId\n })\n\n if (isPending) {\n return \n }\n\n if (!accountInfo) return null\n\n return (\n
\n {accountInfo?.user.email}\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/provider-icons.json b/docs/public/r/provider-icons.json new file mode 100644 index 00000000..09ee8c6b --- /dev/null +++ b/docs/public/r/provider-icons.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "provider-icons", + "type": "registry:component", + "title": "Provider Icons", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/components/provider-icons.tsx", + "content": "import type { ComponentType } from \"react\"\n\nexport interface ProviderIconProps {\n className?: string\n}\n\nexport type ProviderIcon = ComponentType\n\nexport const AppleIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const DiscordIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const DropboxIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const FacebookIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n \n)\n\nexport const GitHubIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const GitLabIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n \n \n \n \n \n)\n\nexport const GoogleIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n\n \n\n \n \n)\n\nexport const HuggingFaceIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const KickIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const LinearIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const LinkedInIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n)\n\nexport const MicrosoftIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n \n \n)\n\nexport const NotionIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const RedditIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n \n)\n\nexport const RobloxIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const SlackIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const SpotifyIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const TikTokIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n\n \n \n)\n\nexport const TwitchIcon: ProviderIcon = ({ className }) => (\n \n \n\n Asset 2\n\n \n \n\n \n \n \n\n \n \n \n \n \n \n)\n\nexport const VKIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const XIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const ZoomIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/providers-card.json b/docs/public/r/providers-card.json new file mode 100644 index 00000000..03c26378 --- /dev/null +++ b/docs/public/r/providers-card.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "providers-card", + "type": "registry:component", + "title": "Providers Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/provider-cell.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/providers-card.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { socialProviders } from \"../../../lib/social-providers\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../skeletons/settings-cell-skeleton\"\nimport { ProviderCell } from \"./provider-cell\"\n\nexport interface ProvidersCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { accountId: string; provider: string }[] | null\n isPending?: boolean\n localization?: Partial\n skipHook?: boolean\n refetch?: Refetch\n}\n\nexport function ProvidersCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook,\n refetch\n}: ProvidersCardProps) {\n const {\n hooks: { useListAccounts },\n localization: contextLocalization,\n social,\n genericOAuth\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n refetch = result.refetch\n }\n\n return (\n \n \n {isPending ? (\n social?.providers?.map((provider) => (\n \n ))\n ) : (\n <>\n {social?.providers?.map((provider) => {\n const socialProvider = socialProviders.find(\n (socialProvider) =>\n socialProvider.provider === provider\n )\n\n if (!socialProvider) return null\n\n return (\n acc.provider === provider\n )}\n provider={socialProvider}\n refetch={refetch}\n />\n )\n })}\n\n {genericOAuth?.providers?.map((provider) => (\n acc.provider === provider.provider\n )}\n provider={provider}\n refetch={refetch}\n other\n />\n ))}\n \n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/recaptcha-badge.json b/docs/public/r/recaptcha-badge.json new file mode 100644 index 00000000..309f8bf8 --- /dev/null +++ b/docs/public/r/recaptcha-badge.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recaptcha-badge", + "type": "registry:component", + "title": "Recaptcha Badge", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-badge.tsx", + "content": "import { useContext } from \"react\"\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\n\nexport interface RecaptchaBadgeProps {\n className?: string\n localization?: Partial\n}\n\nexport function RecaptchaBadge({\n className,\n localization: propLocalization\n}: RecaptchaBadgeProps) {\n const isHydrated = useIsHydrated()\n const { captcha, localization: contextLocalization } =\n useContext(AuthUIContext)\n const localization = { ...contextLocalization, ...propLocalization }\n\n if (!captcha) return null\n\n if (!captcha.hideBadge) {\n return isHydrated ? (\n \n ) : null\n }\n\n return (\n <>\n \n\n

\n {localization.PROTECTED_BY_RECAPTCHA}{\" \"}\n {localization.BY_CONTINUING_YOU_AGREE} Google{\" \"}\n \n {localization.PRIVACY_POLICY}\n {\" \"}\n &{\" \"}\n \n {localization.TERMS_OF_SERVICE}\n \n .\n

\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/recaptcha-v2.json b/docs/public/r/recaptcha-v2.json new file mode 100644 index 00000000..cce6faa7 --- /dev/null +++ b/docs/public/r/recaptcha-v2.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recaptcha-v2", + "type": "registry:component", + "title": "Recaptcha V2", + "description": "", + "dependencies": [ + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v2.tsx", + "content": "import { type RefObject, useContext, useEffect } from \"react\"\nimport ReCAPTCHA from \"react-google-recaptcha\"\nimport { useLang } from \"../../hooks/use-lang\"\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\n\nexport function RecaptchaV2({ ref }: { ref: RefObject }) {\n const { captcha } = useContext(AuthUIContext)\n const { theme } = useTheme()\n const { lang } = useLang()\n\n useEffect(() => {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n ;(window as any).recaptchaOptions = {\n useRecaptchaNet: captcha?.recaptchaNet,\n enterprise: captcha?.enterprise\n }\n }, [captcha])\n\n if (!captcha) return null\n\n return (\n <>\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/recaptcha-v3.json b/docs/public/r/recaptcha-v3.json new file mode 100644 index 00000000..d8829c4c --- /dev/null +++ b/docs/public/r/recaptcha-v3.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recaptcha-v3", + "type": "registry:component", + "title": "Recaptcha V3", + "description": "", + "dependencies": [ + "@wojtekmaj/react-recaptcha-v3" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v3.tsx", + "content": "import {\n GoogleReCaptchaProvider,\n useGoogleReCaptcha\n} from \"@wojtekmaj/react-recaptcha-v3\"\nimport { type ReactNode, useContext, useEffect } from \"react\"\n\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { useLang } from \"../../hooks/use-lang\"\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function RecaptchaV3({ children }: { children: ReactNode }) {\n const isHydrated = useIsHydrated()\n const { captcha } = useContext(AuthUIContext)\n\n if (captcha?.provider !== \"google-recaptcha-v3\") return children\n\n return (\n \n {isHydrated && (\n \n )}\n\n \n\n {children}\n \n )\n}\n\nfunction RecaptchaV3Style() {\n const { executeRecaptcha } = useGoogleReCaptcha()\n const { theme } = useTheme()\n const { lang } = useLang()\n\n useEffect(() => {\n if (!executeRecaptcha) return\n\n const updateRecaptcha = async () => {\n // find iframe with title \"reCAPTCHA\"\n const iframe = document.querySelector(\n \"iframe[title='reCAPTCHA']\"\n ) as HTMLIFrameElement\n if (iframe) {\n const iframeSrcUrl = new URL(iframe.src)\n iframeSrcUrl.searchParams.set(\"theme\", theme)\n if (lang) iframeSrcUrl.searchParams.set(\"hl\", lang)\n iframe.src = iframeSrcUrl.toString()\n }\n }\n\n updateRecaptcha()\n }, [executeRecaptcha, theme, lang])\n\n return null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/recover-account-form.json b/docs/public/r/recover-account-form.json new file mode 100644 index 00000000..81235d33 --- /dev/null +++ b/docs/public/r/recover-account-form.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recover-account-form", + "type": "registry:component", + "title": "Recover Account Form", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "input", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/recover-account-form.tsx", + "content": "\"use client\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface RecoverAccountFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n}\n\nexport function RecoverAccountForm({\n className,\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting\n}: RecoverAccountFormProps) {\n const {\n authClient,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const formSchema = z.object({\n code: z.string().min(1, { message: localization.BACKUP_CODE_REQUIRED })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n code: \"\"\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n async function verifyBackupCode({ code }: z.infer) {\n try {\n await authClient.twoFactor.verifyBackupCode({\n code,\n fetchOptions: { throw: true }\n })\n\n await onSuccess()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n (\n \n \n {localization.BACKUP_CODE}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n {isSubmitting ? (\n \n ) : (\n localization.RECOVER_ACCOUNT_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/redirect-to-sign-in.json b/docs/public/r/redirect-to-sign-in.json new file mode 100644 index 00000000..8a17c12d --- /dev/null +++ b/docs/public/r/redirect-to-sign-in.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "redirect-to-sign-in", + "type": "registry:component", + "title": "Redirect To Sign In", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], + "files": [ + { + "path": "src/components/redirect-to-sign-in.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { useAuthenticate } from \"../hooks/use-authenticate\"\n\n/**\n * Redirects the user to the sign-in page\n *\n * Renders nothing and automatically redirects the current user to the authentication\n * sign-in page. Useful for protecting routes that require authentication or\n * redirecting users to sign in from various parts of the application.\n */\nexport function RedirectToSignIn(): ReactNode {\n useAuthenticate({ authView: \"SIGN_IN\" })\n return null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/redirect-to-sign-up.json b/docs/public/r/redirect-to-sign-up.json new file mode 100644 index 00000000..57856f9f --- /dev/null +++ b/docs/public/r/redirect-to-sign-up.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "redirect-to-sign-up", + "type": "registry:component", + "title": "Redirect To Sign Up", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], + "files": [ + { + "path": "src/components/redirect-to-sign-up.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { useAuthenticate } from \"../hooks/use-authenticate\"\n\n/**\n * Redirects the user to the sign-up page\n *\n * Renders nothing and automatically redirects the current user to the authentication\n * sign-up page. Useful for directing new users to create an account or\n * for redirecting from marketing pages to the registration flow.\n */\nexport function RedirectToSignUp(): ReactNode {\n useAuthenticate({ authView: \"SIGN_UP\" })\n return null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/refetch.json b/docs/public/r/refetch.json new file mode 100644 index 00000000..97c80c1f --- /dev/null +++ b/docs/public/r/refetch.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "refetch", + "type": "registry:file", + "title": "Refetch", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/refetch.ts", + "content": "export type Refetch = () => Promise | unknown\n", + "type": "registry:file", + "target": "types/refetch.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/remove-member-dialog.json b/docs/public/r/remove-member-dialog.json new file mode 100644 index 00000000..f5ea009f --- /dev/null +++ b/docs/public/r/remove-member-dialog.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "remove-member-dialog", + "type": "registry:component", + "title": "Remove Member Dialog", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/remove-member-dialog.tsx", + "content": "\"use client\"\n\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport { MemberCell } from \"./member-cell\"\n\nexport interface RemoveMemberDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n member: Member & { user?: Partial | null }\n}\n\nexport function RemoveMemberDialog({\n member,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: RemoveMemberDialogProps) {\n const {\n authClient,\n hooks: { useListMembers },\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch } = useListMembers({\n query: { organizationId: member.organizationId }\n })\n\n const [isRemoving, setIsRemoving] = useState(false)\n\n const removeMember = async () => {\n setIsRemoving(true)\n\n try {\n await authClient.organization.removeMember({\n memberIdOrEmail: member.id,\n organizationId: member.organizationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.REMOVE_MEMBER_SUCCESS\n })\n\n await refetch?.()\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsRemoving(false)\n }\n\n return (\n \n e.preventDefault()}\n >\n \n \n {localization.REMOVE_MEMBER}\n \n\n \n {localization.REMOVE_MEMBER_CONFIRM}\n \n \n\n \n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isRemoving}\n >\n {localization.CANCEL}\n \n\n \n {isRemoving && }\n\n {localization.REMOVE_MEMBER}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/render-toast.json b/docs/public/r/render-toast.json new file mode 100644 index 00000000..2076238c --- /dev/null +++ b/docs/public/r/render-toast.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "render-toast", + "type": "registry:file", + "title": "Render Toast", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/render-toast.ts", + "content": "type ToastVariant = \"default\" | \"success\" | \"error\" | \"info\" | \"warning\"\n\nexport type RenderToast = ({\n variant,\n message\n}: {\n variant?: ToastVariant\n message?: string\n}) => void\n", + "type": "registry:file", + "target": "types/render-toast.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/reset-password-form.json b/docs/public/r/reset-password-form.json new file mode 100644 index 00000000..a8a6b24a --- /dev/null +++ b/docs/public/r/reset-password-form.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "reset-password-form", + "type": "registry:component", + "title": "Reset Password Form", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/reset-password-form.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getPasswordSchema } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface ResetPasswordFormProps {\n className?: string\n classNames?: AuthFormClassNames\n localization: Partial\n passwordValidation?: PasswordValidation\n}\n\nexport function ResetPasswordForm({\n className,\n classNames,\n localization,\n passwordValidation\n}: ResetPasswordFormProps) {\n const tokenChecked = useRef(false)\n\n const {\n authClient,\n basePath,\n credentials,\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const formSchema = z\n .object({\n newPassword: getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.NEW_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n }),\n confirmPassword: confirmPasswordEnabled\n ? getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n : z.string().optional()\n })\n .refine(\n (data) =>\n !confirmPasswordEnabled ||\n data.newPassword === data.confirmPassword,\n {\n message: localization.PASSWORDS_DO_NOT_MATCH,\n path: [\"confirmPassword\"]\n }\n )\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n newPassword: \"\",\n confirmPassword: \"\"\n }\n })\n\n const isSubmitting = form.formState.isSubmitting\n\n useEffect(() => {\n if (tokenChecked.current) return\n tokenChecked.current = true\n\n const searchParams = new URLSearchParams(window.location.search)\n const token = searchParams.get(\"token\")\n\n if (!token || token === \"INVALID_TOKEN\") {\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n toast({ variant: \"error\", message: localization.INVALID_TOKEN })\n }\n }, [basePath, navigate, toast, viewPaths, localization])\n\n async function resetPassword({ newPassword }: z.infer) {\n try {\n const searchParams = new URLSearchParams(window.location.search)\n const token = searchParams.get(\"token\") as string\n\n await authClient.resetPassword({\n newPassword,\n token,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.RESET_PASSWORD_SUCCESS\n })\n\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n (\n \n \n {localization.NEW_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {localization.CONFIRM_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n \n {isSubmitting ? (\n \n ) : (\n localization.RESET_PASSWORD_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/security-settings-cards.json b/docs/public/r/security-settings-cards.json new file mode 100644 index 00000000..db45e62e --- /dev/null +++ b/docs/public/r/security-settings-cards.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "security-settings-cards", + "type": "registry:component", + "title": "Security Settings Cards", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-password-card.json", + "http://localhost:3000/r/delete-account-card.json", + "http://localhost:3000/r/passkeys-card.json", + "http://localhost:3000/r/providers-card.json", + "http://localhost:3000/r/sessions-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security-settings-cards.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { DeleteAccountCard } from \"./account/delete-account-card\"\nimport { PasskeysCard } from \"./passkey/passkeys-card\"\nimport { ProvidersCard } from \"./providers/providers-card\"\nimport { ChangePasswordCard } from \"./security/change-password-card\"\nimport { SessionsCard } from \"./security/sessions-card\"\nimport type { SettingsCardClassNames } from \"./shared/settings-card\"\nimport { TwoFactorCard } from \"./two-factor/two-factor-card\"\n\nexport function SecuritySettingsCards({\n className,\n classNames,\n localization\n}: {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n}) {\n const {\n credentials,\n deleteUser,\n hooks,\n localization: contextLocalization,\n passkey,\n social,\n genericOAuth,\n twoFactor\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { useListAccounts } = hooks\n\n const {\n data: accounts,\n isPending: accountsPending,\n refetch: refetchAccounts\n } = useListAccounts()\n\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n return (\n \n {credentials && (\n \n )}\n\n {(social?.providers?.length || genericOAuth?.providers?.length) && (\n \n )}\n\n {twoFactor && credentialsLinked && (\n \n )}\n\n {passkey && (\n \n )}\n\n \n\n {deleteUser && (\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/select.json b/docs/public/r/select.json new file mode 100644 index 00000000..968c7425 --- /dev/null +++ b/docs/public/r/select.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "select", + "type": "registry:ui", + "title": "Select", + "description": "", + "dependencies": [ + "@radix-ui/react-select", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/select.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/separator.json b/docs/public/r/separator.json new file mode 100644 index 00000000..10e8a44f --- /dev/null +++ b/docs/public/r/separator.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "separator", + "type": "registry:ui", + "title": "Separator", + "description": "", + "dependencies": [ + "@radix-ui/react-separator" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/separator.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Separator }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/session-cell.json b/docs/public/r/session-cell.json new file mode 100644 index 00000000..88752ec5 --- /dev/null +++ b/docs/public/r/session-cell.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "session-cell", + "type": "registry:component", + "title": "Session Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react", + "ua-parser-js" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/session-cell.tsx", + "content": "\"use client\"\n\nimport type { Session } from \"better-auth\"\nimport { LaptopIcon, Loader2, SmartphoneIcon } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\nimport { UAParser } from \"ua-parser-js\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface SessionCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n session: Session\n refetch?: Refetch\n}\n\nexport function SessionCell({\n className,\n classNames,\n localization,\n session,\n refetch\n}: SessionCellProps) {\n const {\n basePath,\n hooks: { useSession },\n localization: contextLocalization,\n mutators: { revokeSession },\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const isCurrentSession = session.id === sessionData?.session?.id\n\n const [isLoading, setIsLoading] = useState(false)\n\n const handleRevoke = async () => {\n setIsLoading(true)\n\n if (isCurrentSession) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n try {\n await revokeSession({ token: session.token })\n refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsLoading(false)\n }\n }\n\n const parser = UAParser(session.userAgent as string)\n const isMobile = parser.device.type === \"mobile\"\n\n return (\n \n {isMobile ? (\n \n ) : (\n \n )}\n\n
\n \n {isCurrentSession\n ? localization.CURRENT_SESSION\n : session?.ipAddress}\n \n\n \n {parser.os.name}, {parser.browser.name}\n \n
\n\n \n {isLoading && }\n {isCurrentSession ? localization.SIGN_OUT : localization.REVOKE}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/session-freshness-dialog.json b/docs/public/r/session-freshness-dialog.json new file mode 100644 index 00000000..775dca3b --- /dev/null +++ b/docs/public/r/session-freshness-dialog.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "session-freshness-dialog", + "type": "registry:component", + "title": "Session Freshness Dialog", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/session-freshness-dialog.tsx", + "content": "import { type ComponentProps, useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SessionFreshnessDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n title?: string\n description?: string\n}\n\nexport function SessionFreshnessDialog({\n classNames,\n localization,\n title,\n description,\n onOpenChange,\n ...props\n}: SessionFreshnessDialogProps) {\n const {\n basePath,\n localization: contextLocalization,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const handleSignOut = () => {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n onOpenChange?.(false)\n }\n\n return (\n \n \n \n \n {title ||\n localization?.SESSION_EXPIRED ||\n \"Session Expired\"}\n \n\n \n {description || localization?.SESSION_NOT_FRESH}\n \n \n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {localization?.SIGN_OUT}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/sessions-card.json b/docs/public/r/sessions-card.json new file mode 100644 index 00000000..2ad6809b --- /dev/null +++ b/docs/public/r/sessions-card.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sessions-card", + "type": "registry:component", + "title": "Sessions Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/session-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/sessions-card.tsx", + "content": "\"use client\"\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../skeletons/settings-cell-skeleton\"\nimport { SessionCell } from \"./session-cell\"\n\nexport interface SessionsCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function SessionsCard({\n className,\n classNames,\n localization\n}: SessionsCardProps) {\n const {\n hooks: { useListSessions },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessions, isPending, refetch } = useListSessions()\n\n return (\n \n \n {isPending ? (\n \n ) : (\n sessions?.map((session) => (\n \n ))\n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/settings-action-button.json b/docs/public/r/settings-action-button.json new file mode 100644 index 00000000..9d7951f8 --- /dev/null +++ b/docs/public/r/settings-action-button.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-action-button", + "type": "registry:component", + "title": "Settings Action Button", + "description": "", + "dependencies": [ + "lucide-react", + "react-hook-form" + ], + "registryDependencies": [ + "button", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-action-button.tsx", + "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport type { ComponentProps, ReactNode } from \"react\"\nimport { useFormState } from \"react-hook-form\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../ui/button\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\ninterface SettingsActionButtonProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n actionLabel: ReactNode\n disabled?: boolean\n isSubmitting?: boolean\n}\n\nexport function SettingsActionButton({\n classNames,\n actionLabel,\n disabled,\n isSubmitting,\n variant,\n onClick,\n ...props\n}: SettingsActionButtonProps) {\n if (!onClick) {\n const formState = useFormState()\n isSubmitting = formState.isSubmitting\n }\n\n return (\n \n {isSubmitting && }\n {actionLabel}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/settings-card-footer.json b/docs/public/r/settings-card-footer.json new file mode 100644 index 00000000..f278340c --- /dev/null +++ b/docs/public/r/settings-card-footer.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-card-footer", + "type": "registry:component", + "title": "Settings Card Footer", + "description": "", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-action-button.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-footer.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { CardDescription, CardFooter } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport { SettingsActionButton } from \"./settings-action-button\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SettingsCardFooterProps {\n className?: string\n classNames?: SettingsCardClassNames\n actionLabel?: ReactNode\n disabled?: boolean\n instructions?: ReactNode\n isPending?: boolean\n isSubmitting?: boolean\n optimistic?: boolean\n variant?: \"default\" | \"destructive\"\n action?: () => Promise | unknown\n}\n\nexport function SettingsCardFooter({\n className,\n classNames,\n actionLabel,\n disabled,\n instructions,\n isPending,\n isSubmitting,\n variant,\n action\n}: SettingsCardFooterProps) {\n return (\n \n {isPending ? (\n <>\n {instructions && (\n \n )}\n\n {actionLabel && (\n \n )}\n \n ) : (\n <>\n {instructions && (\n \n {instructions}\n \n )}\n\n {actionLabel && (\n \n )}\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/settings-card-header.json b/docs/public/r/settings-card-header.json new file mode 100644 index 00000000..bdf72e93 --- /dev/null +++ b/docs/public/r/settings-card-header.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-card-header", + "type": "registry:component", + "title": "Settings Card Header", + "description": "", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-header.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { CardDescription, CardHeader, CardTitle } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SettingsCardHeaderProps {\n className?: string\n classNames?: SettingsCardClassNames\n description?: ReactNode\n isPending?: boolean\n title: ReactNode\n}\n\nexport function SettingsCardHeader({\n className,\n classNames,\n description,\n isPending,\n title\n}: SettingsCardHeaderProps) {\n return (\n \n {isPending ? (\n <>\n \n\n {description && (\n \n )}\n \n ) : (\n <>\n \n {title}\n \n\n {description && (\n \n {description}\n \n )}\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/settings-card.json b/docs/public/r/settings-card.json new file mode 100644 index 00000000..8a935166 --- /dev/null +++ b/docs/public/r/settings-card.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-card", + "type": "registry:component", + "title": "Settings Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "card", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card.tsx", + "content": "\"use client\"\n\nimport type { ComponentProps, ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Card } from \"../../ui/card\"\nimport type { UserAvatarClassNames } from \"../../user-avatar\"\nimport { SettingsCardFooter } from \"./settings-card-footer\"\nimport { SettingsCardHeader } from \"./settings-card-header\"\n\nexport type SettingsCardClassNames = {\n base?: string\n avatar?: UserAvatarClassNames\n button?: string\n cell?: string\n checkbox?: string\n destructiveButton?: string\n content?: string\n description?: string\n dialog?: {\n content?: string\n footer?: string\n header?: string\n }\n error?: string\n footer?: string\n header?: string\n icon?: string\n input?: string\n instructions?: string\n label?: string\n primaryButton?: string\n secondaryButton?: string\n outlineButton?: string\n skeleton?: string\n title?: string\n}\n\nexport interface SettingsCardProps\n extends Omit, \"title\"> {\n children?: ReactNode\n className?: string\n classNames?: SettingsCardClassNames\n title?: ReactNode\n description?: ReactNode\n instructions?: ReactNode\n actionLabel?: ReactNode\n isSubmitting?: boolean\n disabled?: boolean\n isPending?: boolean\n optimistic?: boolean\n variant?: \"default\" | \"destructive\"\n localization?: AuthLocalization\n action?: () => Promise | unknown\n}\n\nexport function SettingsCard({\n children,\n className,\n classNames,\n title,\n description,\n instructions,\n actionLabel,\n disabled,\n isPending,\n isSubmitting,\n optimistic,\n variant,\n action,\n ...props\n}: SettingsCardProps) {\n return (\n \n \n\n {children}\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/settings-cell-skeleton.json b/docs/public/r/settings-cell-skeleton.json new file mode 100644 index 00000000..47c97a0c --- /dev/null +++ b/docs/public/r/settings-cell-skeleton.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-cell-skeleton", + "type": "registry:component", + "title": "Settings Cell Skeleton", + "description": "", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/skeletons/settings-cell-skeleton.tsx", + "content": "\"use client\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Card } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport function SettingsCellSkeleton({\n classNames\n}: {\n classNames?: SettingsCardClassNames\n}) {\n return (\n \n
\n \n\n
\n \n
\n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/sign-in-form.json b/docs/public/r/sign-in-form.json new file mode 100644 index 00000000..6c3c98dd --- /dev/null +++ b/docs/public/r/sign-in-form.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-in-form", + "type": "registry:component", + "title": "Sign In Form", + "description": "", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "form", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-in-form.tsx", + "content": "\"use client\"\n\nimport type { BetterFetchOption } from \"@better-fetch/fetch\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCaptcha } from \"../../../hooks/use-captcha\"\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport {\n cn,\n getLocalizedError,\n getPasswordSchema,\n isValidEmail\n} from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { Captcha } from \"../../captcha/captcha\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface SignInFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (isSubmitting: boolean) => void\n passwordValidation?: PasswordValidation\n}\n\nexport function SignInForm({\n className,\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting,\n passwordValidation\n}: SignInFormProps) {\n const isHydrated = useIsHydrated()\n const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({\n localization\n })\n\n const {\n authClient,\n basePath,\n credentials,\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast,\n Link\n } = useContext(AuthUIContext)\n\n const rememberMeEnabled = credentials?.rememberMe\n const usernameEnabled = credentials?.username\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const formSchema = z.object({\n email: usernameEnabled\n ? z.string().min(1, {\n message: `${localization.USERNAME} ${localization.IS_REQUIRED}`\n })\n : z\n .string()\n .min(1, {\n message: `${localization.EMAIL} ${localization.IS_REQUIRED}`\n })\n .email({\n message: `${localization.EMAIL} ${localization.IS_INVALID}`\n }),\n password: getPasswordSchema(passwordValidation, localization),\n rememberMe: z.boolean().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n email: \"\",\n password: \"\",\n rememberMe: !rememberMeEnabled\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n async function signIn({\n email,\n password,\n rememberMe\n }: z.infer) {\n try {\n let response: Record = {}\n\n if (usernameEnabled && !isValidEmail(email)) {\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-in/username\")\n }\n\n response = await authClient.signIn.username({\n username: email,\n password,\n rememberMe,\n fetchOptions\n })\n } else {\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-in/email\")\n }\n\n response = await authClient.signIn.email({\n email,\n password,\n rememberMe,\n fetchOptions\n })\n }\n\n if (response.twoFactorRedirect) {\n navigate(\n `${basePath}/${viewPaths.TWO_FACTOR}${window.location.search}`\n )\n } else {\n await onSuccess()\n }\n } catch (error) {\n form.resetField(\"password\")\n resetCaptcha()\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n (\n \n \n {usernameEnabled\n ? localization.USERNAME\n : localization.EMAIL}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n
\n \n {localization.PASSWORD}\n \n\n {credentials?.forgotPassword && (\n \n {localization.FORGOT_PASSWORD_LINK}\n \n )}\n
\n\n \n \n \n\n \n
\n )}\n />\n\n {rememberMeEnabled && (\n (\n \n \n \n \n\n \n {localization.REMEMBER_ME}\n \n \n )}\n />\n )}\n\n \n\n \n {isSubmitting ? (\n \n ) : (\n localization.SIGN_IN_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/sign-out.json b/docs/public/r/sign-out.json new file mode 100644 index 00000000..0e6a238b --- /dev/null +++ b/docs/public/r/sign-out.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-out", + "type": "registry:component", + "title": "Sign Out", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/sign-out.tsx", + "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function SignOut() {\n const signingOut = useRef(false)\n\n const { authClient, basePath, viewPaths } = useContext(AuthUIContext)\n const { onSuccess } = useOnSuccessTransition({\n redirectTo: `${basePath}/${viewPaths.SIGN_IN}`\n })\n\n useEffect(() => {\n if (signingOut.current) return\n signingOut.current = true\n\n authClient.signOut().finally(onSuccess)\n }, [authClient, onSuccess])\n\n return \n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/sign-up-form.json b/docs/public/r/sign-up-form.json new file mode 100644 index 00000000..5a97db3a --- /dev/null +++ b/docs/public/r/sign-up-form.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-up-form", + "type": "registry:component", + "title": "Sign Up Form", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "textarea", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-up-form.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { BetterFetchOption } from \"better-auth/react\"\nimport { Loader2, Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCaptcha } from \"../../../hooks/use-captcha\"\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../../lib/image-utils\"\nimport {\n cn,\n getLocalizedError,\n getPasswordSchema,\n getSearchParam\n} from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { Captcha } from \"../../captcha/captcha\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Textarea } from \"../../ui/textarea\"\nimport { UserAvatar } from \"../../user-avatar\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface SignUpFormProps {\n className?: string\n classNames?: AuthFormClassNames\n callbackURL?: string\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n passwordValidation?: PasswordValidation\n}\n\nexport function SignUpForm({\n className,\n classNames,\n callbackURL,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting,\n passwordValidation\n}: SignUpFormProps) {\n const isHydrated = useIsHydrated()\n const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({\n localization\n })\n\n const {\n additionalFields,\n authClient,\n basePath,\n baseURL,\n credentials,\n localization: contextLocalization,\n nameRequired,\n persistClient,\n redirectTo: contextRedirectTo,\n signUp: signUpOptions,\n viewPaths,\n navigate,\n toast,\n avatar\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const usernameEnabled = credentials?.username\n const contextPasswordValidation = credentials?.passwordValidation\n const signUpFields = signUpOptions?.fields\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n // Avatar upload state\n const fileInputRef = useRef(null)\n const [avatarImage, setAvatarImage] = useState(null)\n const [uploadingAvatar, setUploadingAvatar] = useState(false)\n\n const getRedirectTo = useCallback(\n () => redirectTo || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectTo, contextRedirectTo]\n )\n\n const getCallbackURL = useCallback(\n () =>\n `${baseURL}${\n callbackURL ||\n (persistClient\n ? `${basePath}/${viewPaths.CALLBACK}?redirectTo=${getRedirectTo()}`\n : getRedirectTo())\n }`,\n [\n callbackURL,\n persistClient,\n basePath,\n viewPaths,\n baseURL,\n getRedirectTo\n ]\n )\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n // Create the base schema for standard fields\n const schemaFields: Record = {\n email: z\n .string()\n .min(1, {\n message: `${localization.EMAIL} ${localization.IS_REQUIRED}`\n })\n .email({\n message: `${localization.EMAIL} ${localization.IS_INVALID}`\n }),\n password: getPasswordSchema(passwordValidation, localization)\n }\n\n // Add confirmPassword field if enabled\n if (confirmPasswordEnabled) {\n schemaFields.confirmPassword = getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n }\n\n // Add name field if required or included in signUpFields\n if (signUpFields?.includes(\"name\")) {\n schemaFields.name = nameRequired\n ? z.string().min(1, {\n message: `${localization.NAME} ${localization.IS_REQUIRED}`\n })\n : z.string().optional()\n }\n\n // Add username field if enabled\n if (usernameEnabled) {\n schemaFields.username = z.string().min(1, {\n message: `${localization.USERNAME} ${localization.IS_REQUIRED}`\n })\n }\n\n // Add image field if included in signUpFields\n if (signUpFields?.includes(\"image\") && avatar) {\n schemaFields.image = z.string().optional()\n }\n\n // Add additional fields from signUpFields\n if (signUpFields) {\n for (const field of signUpFields) {\n if (field === \"name\") continue // Already handled above\n if (field === \"image\") continue // Already handled above\n\n const additionalField = additionalFields?.[field]\n if (!additionalField) continue\n\n let fieldSchema: z.ZodTypeAny\n\n // Create the appropriate schema based on field type\n if (additionalField.type === \"number\") {\n fieldSchema = additionalField.required\n ? z.preprocess(\n (val) => (!val ? undefined : Number(val)),\n z.number({\n required_error: `${additionalField.label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n )\n : z.coerce\n .number({\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .optional()\n } else if (additionalField.type === \"boolean\") {\n fieldSchema = additionalField.required\n ? z.coerce\n .boolean({\n required_error: `${additionalField.label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .refine((val) => val === true, {\n message: `${additionalField.label} ${localization.IS_REQUIRED}`\n })\n : z.coerce\n .boolean({\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .optional()\n } else {\n fieldSchema = additionalField.required\n ? z\n .string()\n .min(\n 1,\n `${additionalField.label} ${localization.IS_REQUIRED}`\n )\n : z.string().optional()\n }\n\n schemaFields[field] = fieldSchema\n }\n }\n\n const formSchema = z.object(schemaFields).refine(\n (data) => {\n // Skip validation if confirmPassword is not enabled\n if (!confirmPasswordEnabled) return true\n return data.password === data.confirmPassword\n },\n {\n message: localization.PASSWORDS_DO_NOT_MATCH!,\n path: [\"confirmPassword\"]\n }\n )\n\n // Create default values for the form\n const defaultValues: Record = {\n email: \"\",\n password: \"\",\n ...(confirmPasswordEnabled && { confirmPassword: \"\" }),\n ...(signUpFields?.includes(\"name\") ? { name: \"\" } : {}),\n ...(usernameEnabled ? { username: \"\" } : {}),\n ...(signUpFields?.includes(\"image\") && avatar ? { image: \"\" } : {})\n }\n\n // Add default values for additional fields\n if (signUpFields) {\n for (const field of signUpFields) {\n if (field === \"name\") continue\n if (field === \"image\") continue\n const additionalField = additionalFields?.[field]\n if (!additionalField) continue\n\n defaultValues[field] =\n additionalField.type === \"boolean\" ? false : \"\"\n }\n }\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n const handleAvatarChange = async (file: File) => {\n if (!avatar) return\n\n setUploadingAvatar(true)\n\n try {\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n avatar.size,\n avatar.extension\n )\n\n let image: string | undefined | null\n\n if (avatar.upload) {\n image = await avatar.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (image) {\n setAvatarImage(image)\n form.setValue(\"image\", image)\n } else {\n setAvatarImage(null)\n form.setValue(\"image\", \"\")\n }\n } catch (error) {\n console.error(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setUploadingAvatar(false)\n }\n\n const handleDeleteAvatar = () => {\n setAvatarImage(null)\n form.setValue(\"image\", \"\")\n }\n\n const openFileDialog = () => fileInputRef.current?.click()\n\n async function signUp({\n email,\n password,\n name,\n username,\n confirmPassword,\n image,\n ...additionalFieldValues\n }: z.infer) {\n try {\n // Validate additional fields with custom validators if provided\n for (const [field, value] of Object.entries(\n additionalFieldValues\n )) {\n const additionalField = additionalFields?.[field]\n if (!additionalField?.validate) continue\n\n if (\n typeof value === \"string\" &&\n !(await additionalField.validate(value))\n ) {\n form.setError(field, {\n message: `${additionalField.label} ${localization.IS_INVALID}`\n })\n return\n }\n }\n\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-up/email\")\n }\n\n const data = await authClient.signUp.email({\n email,\n password,\n name: name || \"\",\n ...(username !== undefined && { username }),\n ...(image !== undefined && { image }),\n ...additionalFieldValues,\n callbackURL: getCallbackURL(),\n fetchOptions\n })\n\n if (\"token\" in data && data.token) {\n await onSuccess()\n } else {\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n toast({\n variant: \"success\",\n message: localization.SIGN_UP_EMAIL!\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.resetField(\"password\")\n form.resetField(\"confirmPassword\")\n resetCaptcha()\n }\n }\n\n return (\n
\n \n {signUpFields?.includes(\"image\") && avatar && (\n <>\n {\n const file = e.target.files?.item(0)\n if (file) handleAvatarChange(file)\n e.target.value = \"\"\n }}\n />\n\n (\n \n {localization.AVATAR}\n\n
\n \n \n \n \n \n \n\n \n e.preventDefault()\n }\n >\n \n \n {localization.UPLOAD_AVATAR}\n \n\n {avatarImage && (\n \n \n {\n localization.DELETE_AVATAR\n }\n \n )}\n \n \n\n \n {uploadingAvatar && (\n \n )}\n\n {localization.UPLOAD}\n \n
\n\n \n
\n )}\n />\n \n )}\n\n {signUpFields?.includes(\"name\") && (\n (\n \n \n {localization.NAME}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n {usernameEnabled && (\n (\n \n \n {localization.USERNAME}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n (\n \n \n {localization.EMAIL}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {localization.CONFIRM_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n {signUpFields\n ?.filter((field) => field !== \"name\" && field !== \"image\")\n .map((field) => {\n const additionalField = additionalFields?.[field]\n if (!additionalField) {\n console.error(`Additional field ${field} not found`)\n return null\n }\n\n return additionalField.type === \"boolean\" ? (\n (\n \n \n \n \n\n \n {additionalField.label}\n \n\n \n \n )}\n />\n ) : (\n (\n \n \n {additionalField.label}\n \n\n \n {additionalField.type ===\n \"number\" ? (\n \n ) : additionalField.multiline ? (\n \n ) : (\n \n )}\n \n\n \n \n )}\n />\n )\n })}\n\n \n\n \n {isSubmitting ? (\n \n ) : (\n localization.SIGN_UP_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/sign-up-options.json b/docs/public/r/sign-up-options.json new file mode 100644 index 00000000..82ea8b68 --- /dev/null +++ b/docs/public/r/sign-up-options.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-up-options", + "type": "registry:file", + "title": "Sign Up Options", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/sign-up-options.ts", + "content": "export type SignUpOptions = {\n /**\n * Array of fields to show in Sign Up form\n * @default [\"name\"]\n */\n fields?: string[]\n}\n", + "type": "registry:file", + "target": "types/sign-up-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/signed-in.json b/docs/public/r/signed-in.json new file mode 100644 index 00000000..793fdfcb --- /dev/null +++ b/docs/public/r/signed-in.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "signed-in", + "type": "registry:component", + "title": "Signed In", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/signed-in.tsx", + "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content for authenticated users only\n *\n * Renders its children only when a user is authenticated with a valid session.\n * If no session exists, nothing is rendered. Useful for displaying protected\n * content or UI elements that should only be visible to signed-in users.\n */\nexport function SignedIn({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { data } = useSession()\n\n return data ? children : null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/signed-out.json b/docs/public/r/signed-out.json new file mode 100644 index 00000000..84959925 --- /dev/null +++ b/docs/public/r/signed-out.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "signed-out", + "type": "registry:component", + "title": "Signed Out", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/signed-out.tsx", + "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content for unauthenticated users only\n *\n * Renders its children only when no user is authenticated and the authentication\n * state is not pending. If a session exists or is being loaded, nothing is rendered.\n * Useful for displaying sign-in prompts or content exclusive to guests.\n */\nexport function SignedOut({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { data, isPending } = useSession()\n\n return !data && !isPending ? children : null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/skeleton.json b/docs/public/r/skeleton.json new file mode 100644 index 00000000..282f5451 --- /dev/null +++ b/docs/public/r/skeleton.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "skeleton", + "type": "registry:ui", + "title": "Skeleton", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/skeleton.tsx", + "content": "import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Skeleton }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/social-options.json b/docs/public/r/social-options.json new file mode 100644 index 00000000..e4ee7009 --- /dev/null +++ b/docs/public/r/social-options.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "social-options", + "type": "registry:file", + "title": "Social Options", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json" + ], + "files": [ + { + "path": "src/types/social-options.ts", + "content": "import type { SocialProvider } from \"better-auth/social-providers\"\nimport type { AuthClient } from \"./auth-client\"\n\nexport type SocialOptions = {\n /**\n * Array of Social Providers to enable\n * @remarks `SocialProvider[]`\n */\n providers: SocialProvider[]\n /**\n * Custom social sign in function\n */\n signIn?: (\n params: Parameters[0]\n ) => Promise\n}\n", + "type": "registry:file", + "target": "types/social-options.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/social-providers.json b/docs/public/r/social-providers.json new file mode 100644 index 00000000..f3a5ba7a --- /dev/null +++ b/docs/public/r/social-providers.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "social-providers", + "type": "registry:lib", + "title": "Social Providers", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/provider-icons.json" + ], + "files": [ + { + "path": "src/lib/social-providers.ts", + "content": "import {\n AppleIcon,\n DiscordIcon,\n DropboxIcon,\n FacebookIcon,\n GitHubIcon,\n GitLabIcon,\n GoogleIcon,\n HuggingFaceIcon,\n KickIcon,\n LinearIcon,\n LinkedInIcon,\n MicrosoftIcon,\n NotionIcon,\n type ProviderIcon,\n RedditIcon,\n RobloxIcon,\n SlackIcon,\n SpotifyIcon,\n TikTokIcon,\n TwitchIcon,\n VKIcon,\n XIcon,\n ZoomIcon\n} from \"../components/provider-icons\"\n\nexport const socialProviders = [\n {\n provider: \"apple\",\n name: \"Apple\",\n icon: AppleIcon\n },\n {\n provider: \"discord\",\n name: \"Discord\",\n icon: DiscordIcon\n },\n {\n provider: \"dropbox\",\n name: \"Dropbox\",\n icon: DropboxIcon\n },\n {\n provider: \"facebook\",\n name: \"Facebook\",\n icon: FacebookIcon\n },\n {\n provider: \"github\",\n name: \"GitHub\",\n icon: GitHubIcon\n },\n {\n provider: \"gitlab\",\n name: \"GitLab\",\n icon: GitLabIcon\n },\n {\n provider: \"google\",\n name: \"Google\",\n icon: GoogleIcon\n },\n {\n provider: \"huggingface\",\n name: \"Hugging Face\",\n icon: HuggingFaceIcon\n },\n {\n provider: \"kick\",\n name: \"Kick\",\n icon: KickIcon\n },\n {\n provider: \"linear\",\n name: \"Linear\",\n icon: LinearIcon\n },\n {\n provider: \"linkedin\",\n name: \"LinkedIn\",\n icon: LinkedInIcon\n },\n {\n provider: \"microsoft\",\n name: \"Microsoft\",\n icon: MicrosoftIcon\n },\n {\n provider: \"notion\",\n name: \"Notion\",\n icon: NotionIcon\n },\n {\n provider: \"reddit\",\n name: \"Reddit\",\n icon: RedditIcon\n },\n {\n provider: \"roblox\",\n name: \"Roblox\",\n icon: RobloxIcon\n },\n {\n provider: \"slack\",\n name: \"Slack\",\n icon: SlackIcon\n },\n {\n provider: \"spotify\",\n name: \"Spotify\",\n icon: SpotifyIcon\n },\n {\n provider: \"tiktok\",\n name: \"TikTok\",\n icon: TikTokIcon\n },\n {\n provider: \"twitch\",\n name: \"Twitch\",\n icon: TwitchIcon\n },\n {\n provider: \"vk\",\n name: \"VK\",\n icon: VKIcon\n },\n {\n provider: \"twitter\",\n name: \"X\",\n icon: XIcon\n },\n {\n provider: \"zoom\",\n name: \"Zoom\",\n icon: ZoomIcon\n }\n] as const\n\nexport type Provider = {\n provider: string\n name: string\n icon?: ProviderIcon\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/stripe-localization.json b/docs/public/r/stripe-localization.json new file mode 100644 index 00000000..31f30566 --- /dev/null +++ b/docs/public/r/stripe-localization.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "stripe-localization", + "type": "registry:file", + "title": "Stripe Localization", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/stripe-localization.ts", + "content": "export const STRIPE_ERROR_CODES = {\n SUBSCRIPTION_NOT_FOUND: \"Subscription not found\",\n SUBSCRIPTION_PLAN_NOT_FOUND: \"Subscription plan not found\",\n ALREADY_SUBSCRIBED_PLAN: \"You're already subscribed to this plan\",\n UNABLE_TO_CREATE_CUSTOMER: \"Unable to create customer\",\n FAILED_TO_FETCH_PLANS: \"Failed to fetch plans\",\n EMAIL_VERIFICATION_REQUIRED:\n \"Email verification is required before you can subscribe to a plan\",\n SUBSCRIPTION_NOT_ACTIVE: \"Subscription is not active\",\n SUBSCRIPTION_NOT_SCHEDULED_FOR_CANCELLATION:\n \"Subscription is not scheduled for cancellation\"\n}\n", + "type": "registry:file", + "target": "localization/stripe-localization.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/tabs.json b/docs/public/r/tabs.json new file mode 100644 index 00000000..7b1455a2 --- /dev/null +++ b/docs/public/r/tabs.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tabs", + "type": "registry:ui", + "title": "Tabs", + "description": "", + "dependencies": [ + "@radix-ui/react-tabs" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/tabs.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/textarea.json b/docs/public/r/textarea.json new file mode 100644 index 00000000..b104e4bb --- /dev/null +++ b/docs/public/r/textarea.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "textarea", + "type": "registry:ui", + "title": "Textarea", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/textarea.tsx", + "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n \n )\n}\n\nexport { Textarea }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/two-factor-card.json b/docs/public/r/two-factor-card.json new file mode 100644 index 00000000..5d763015 --- /dev/null +++ b/docs/public/r/two-factor-card.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-card", + "type": "registry:component", + "title": "Two Factor Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-password-dialog.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { User } from \"../../../types/auth-client\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { TwoFactorPasswordDialog } from \"./two-factor-password-dialog\"\n\nexport interface TwoFactorCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function TwoFactorCard({\n className,\n classNames,\n localization\n}: TwoFactorCardProps) {\n const {\n localization: contextLocalization,\n hooks: { useSession }\n } = useContext(AuthUIContext)\n\n const [showPasswordDialog, setShowPasswordDialog] = useState(false)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData, isPending } = useSession()\n const isTwoFactorEnabled = (sessionData?.user as User)?.twoFactorEnabled\n\n return (\n
\n setShowPasswordDialog(true)}\n />\n\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/two-factor-error-codes.json b/docs/public/r/two-factor-error-codes.json new file mode 100644 index 00000000..f493ab8a --- /dev/null +++ b/docs/public/r/two-factor-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-error-codes", + "type": "registry:file", + "title": "Two Factor Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/two-factor-error-codes.ts", + "content": "export const TWO_FACTOR_ERROR_CODES = {\n OTP_NOT_ENABLED: \"OTP not enabled\",\n OTP_HAS_EXPIRED: \"OTP has expired\",\n TOTP_NOT_ENABLED: \"TOTP not enabled\",\n TWO_FACTOR_NOT_ENABLED: \"Two factor isn't enabled\",\n BACKUP_CODES_NOT_ENABLED: \"Backup codes aren't enabled\",\n INVALID_BACKUP_CODE: \"Invalid backup code\",\n INVALID_CODE: \"Invalid code\",\n TOO_MANY_ATTEMPTS_REQUEST_NEW_CODE:\n \"Too many attempts. Please request a new code.\",\n INVALID_TWO_FACTOR_COOKIE: \"Invalid two factor cookie\"\n}\n", + "type": "registry:file", + "target": "localization/two-factor-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/two-factor-form.json b/docs/public/r/two-factor-form.json new file mode 100644 index 00000000..f0316e78 --- /dev/null +++ b/docs/public/r/two-factor-form.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-form", + "type": "registry:component", + "title": "Two Factor Form", + "description": "", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "react-qr-code", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "checkbox", + "form", + "input-otp", + "label", + "http://localhost:3000/r/otp-input-group.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/two-factor-form.tsx", + "content": "\"use client\"\n\nimport type { BetterFetchError } from \"@better-fetch/fetch\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2, QrCodeIcon, SendIcon } from \"lucide-react\"\nimport { useContext, useEffect, useRef, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport QRCode from \"react-qr-code\"\nimport * as z from \"zod\"\n\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { User } from \"../../../types/auth-client\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { InputOTP } from \"../../ui/input-otp\"\nimport { Label } from \"../../ui/label\"\nimport type { AuthFormClassNames } from \"../auth-form\"\nimport { OTPInputGroup } from \"../otp-input-group\"\n\nexport interface TwoFactorFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization?: Partial\n otpSeparators?: 0 | 1 | 2\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n}\n\nexport function TwoFactorForm({\n className,\n classNames,\n isSubmitting,\n localization,\n otpSeparators = 0,\n redirectTo,\n setIsSubmitting\n}: TwoFactorFormProps) {\n const isHydrated = useIsHydrated()\n const totpURI = isHydrated ? getSearchParam(\"totpURI\") : null\n const initialSendRef = useRef(false)\n\n const {\n authClient,\n basePath,\n hooks: { useSession },\n localization: contextLocalization,\n twoFactor,\n viewPaths,\n toast,\n Link\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const { data: sessionData } = useSession()\n const isTwoFactorEnabled = (sessionData?.user as User)?.twoFactorEnabled\n\n const [method, setMethod] = useState<\"totp\" | \"otp\" | null>(\n twoFactor?.length === 1 ? twoFactor[0] : null\n )\n\n const [isSendingOtp, setIsSendingOtp] = useState(false)\n const [cooldownSeconds, setCooldownSeconds] = useState(0)\n\n const formSchema = z.object({\n code: z\n .string()\n .min(1, {\n message: `${localization.ONE_TIME_PASSWORD} ${localization.IS_REQUIRED}`\n })\n .min(6, {\n message: `${localization.ONE_TIME_PASSWORD} ${localization.IS_INVALID}`\n }),\n trustDevice: z.boolean().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n code: \"\"\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (\n method === \"otp\" &&\n cooldownSeconds <= 0 &&\n !initialSendRef.current\n ) {\n initialSendRef.current = true\n sendOtp()\n }\n }, [method])\n\n useEffect(() => {\n if (cooldownSeconds <= 0) return\n\n const timer = setTimeout(() => {\n setCooldownSeconds((prev) => prev - 1)\n }, 1000)\n return () => clearTimeout(timer)\n }, [cooldownSeconds])\n\n const sendOtp = async () => {\n if (isSendingOtp || cooldownSeconds > 0) return\n\n try {\n setIsSendingOtp(true)\n await authClient.twoFactor.sendOtp({\n fetchOptions: { throw: true }\n })\n setCooldownSeconds(60)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n if (\n (error as BetterFetchError).error.code ===\n \"INVALID_TWO_FACTOR_COOKIE\"\n ) {\n history.back()\n }\n }\n\n initialSendRef.current = false\n setIsSendingOtp(false)\n }\n\n async function verifyCode({\n code,\n trustDevice\n }: z.infer) {\n try {\n const verifyMethod =\n method === \"totp\"\n ? authClient.twoFactor.verifyTotp\n : authClient.twoFactor.verifyOtp\n\n await verifyMethod({\n code,\n trustDevice,\n fetchOptions: { throw: true }\n })\n\n await onSuccess()\n\n if (sessionData && !isTwoFactorEnabled) {\n toast({\n variant: \"success\",\n message: localization?.TWO_FACTOR_ENABLED\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n {twoFactor?.includes(\"totp\") &&\n totpURI &&\n method === \"totp\" && (\n
\n \n\n \n
\n )}\n\n {method !== null && (\n <>\n (\n \n
\n \n {localization.ONE_TIME_PASSWORD}\n \n\n \n {localization.FORGOT_AUTHENTICATOR}\n \n
\n\n \n {\n field.onChange(value)\n\n if (value.length === 6) {\n form.handleSubmit(\n verifyCode\n )()\n }\n }}\n containerClassName={\n classNames?.otpInputContainer\n }\n className={classNames?.otpInput}\n disabled={isSubmitting}\n >\n \n \n \n\n \n
\n )}\n />\n\n (\n \n \n \n \n\n \n {localization.TRUST_DEVICE}\n \n \n )}\n />\n \n )}\n\n
\n {method !== null && (\n \n {isSubmitting && (\n \n )}\n {localization.TWO_FACTOR_ACTION}\n \n )}\n\n {method === \"otp\" && twoFactor?.includes(\"otp\") && (\n 0 ||\n isSendingOtp ||\n isSubmitting\n }\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n >\n {isSendingOtp ? (\n \n ) : (\n \n )}\n\n {localization.RESEND_CODE}\n {cooldownSeconds > 0 && ` (${cooldownSeconds})`}\n \n )}\n\n {method !== \"otp\" && twoFactor?.includes(\"otp\") && (\n setMethod(\"otp\")}\n disabled={isSubmitting}\n >\n \n {localization.SEND_VERIFICATION_CODE}\n \n )}\n\n {method !== \"totp\" && twoFactor?.includes(\"totp\") && (\n setMethod(\"totp\")}\n disabled={isSubmitting}\n >\n \n {localization.CONTINUE_WITH_AUTHENTICATOR}\n \n )}\n
\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/two-factor-password-dialog.json b/docs/public/r/two-factor-password-dialog.json new file mode 100644 index 00000000..e9055bd7 --- /dev/null +++ b/docs/public/r/two-factor-password-dialog.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-password-dialog", + "type": "registry:component", + "title": "Two Factor Password Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/backup-codes-dialog.json", + "button", + "dialog", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-password-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { BackupCodesDialog } from \"./backup-codes-dialog\"\n\ninterface TwoFactorPasswordDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n isTwoFactorEnabled: boolean\n}\n\nexport function TwoFactorPasswordDialog({\n classNames,\n onOpenChange,\n isTwoFactorEnabled,\n ...props\n}: TwoFactorPasswordDialogProps) {\n const {\n localization,\n authClient,\n basePath,\n viewPaths,\n navigate,\n toast,\n twoFactor\n } = useContext(AuthUIContext)\n const [showBackupCodesDialog, setShowBackupCodesDialog] = useState(false)\n const [backupCodes, setBackupCodes] = useState([])\n const [totpURI, setTotpURI] = useState(null)\n\n const formSchema = z.object({\n password: z.string().min(1, { message: localization.PASSWORD_REQUIRED })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n password: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n async function enableTwoFactor({ password }: z.infer) {\n try {\n const response = await authClient.twoFactor.enable({\n password,\n fetchOptions: { throw: true }\n })\n\n onOpenChange?.(false)\n setBackupCodes(response.backupCodes)\n\n if (twoFactor?.includes(\"totp\")) {\n setTotpURI(response.totpURI)\n }\n\n setTimeout(() => {\n setShowBackupCodesDialog(true)\n }, 250)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n async function disableTwoFactor({ password }: z.infer) {\n try {\n await authClient.twoFactor.disable({\n password,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.TWO_FACTOR_DISABLED\n })\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n <>\n \n \n \n \n {localization.TWO_FACTOR}\n \n\n \n {isTwoFactorEnabled\n ? localization.TWO_FACTOR_DISABLE_INSTRUCTIONS\n : localization.TWO_FACTOR_ENABLE_INSTRUCTIONS}\n \n \n\n
\n \n (\n \n \n {localization.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.secondaryButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n {isTwoFactorEnabled\n ? localization.DISABLE_TWO_FACTOR\n : localization.ENABLE_TWO_FACTOR}\n \n \n \n \n \n
\n\n {\n setShowBackupCodesDialog(open)\n\n if (!open) {\n const url = `${basePath}/${viewPaths.TWO_FACTOR}`\n navigate(\n twoFactor?.includes(\"totp\") && totpURI\n ? `${url}?totpURI=${totpURI}`\n : url\n )\n }\n }}\n backupCodes={backupCodes}\n />\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/update-avatar-card.json b/docs/public/r/update-avatar-card.json new file mode 100644 index 00000000..2f64c293 --- /dev/null +++ b/docs/public/r/update-avatar-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-avatar-card", + "type": "registry:component", + "title": "Update Avatar Card", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-avatar-card.tsx", + "content": "\"use client\"\n\nimport { Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useRef, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport { UserAvatar } from \"../../user-avatar\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCardFooter } from \"../shared/settings-card-footer\"\nimport { SettingsCardHeader } from \"../shared/settings-card-header\"\n\nexport interface UpdateAvatarCardProps extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function UpdateAvatarCard({\n className,\n classNames,\n localization,\n ...props\n}: UpdateAvatarCardProps) {\n const {\n hooks: { useSession },\n mutators: { updateUser },\n localization: authLocalization,\n optimistic,\n avatar,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...authLocalization, ...localization }\n\n const { data: sessionData, isPending, refetch } = useSession()\n const fileInputRef = useRef(null)\n const [loading, setLoading] = useState(false)\n\n const handleAvatarChange = async (file: File) => {\n if (!sessionData || !avatar) return\n\n setLoading(true)\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n avatar.size,\n avatar.extension\n )\n\n let image: string | undefined | null\n\n if (avatar.upload) {\n image = await avatar.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (!image) {\n setLoading(false)\n return\n }\n\n if (optimistic && !avatar.upload) setLoading(false)\n\n try {\n await updateUser({ image })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const handleDeleteAvatar = async () => {\n if (!sessionData) return\n\n setLoading(true)\n\n try {\n // If a custom storage remover is provided, attempt to clean up the old asset first\n if (sessionData.user.image && avatar?.delete) {\n await avatar.delete(sessionData.user.image)\n }\n\n await updateUser({ image: null })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const openFileDialog = () => fileInputRef.current?.click()\n\n return (\n \n {\n const file = e.target.files?.item(0)\n if (file) handleAvatarChange(file)\n\n e.target.value = \"\"\n }}\n />\n\n
\n \n\n \n \n \n \n \n \n\n e.preventDefault()}\n >\n \n \n {localization.UPLOAD_AVATAR}\n \n {sessionData?.user.image && (\n \n \n {localization.DELETE_AVATAR}\n \n )}\n \n \n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/update-field-card.json b/docs/public/r/update-field-card.json new file mode 100644 index 00000000..790f069a --- /dev/null +++ b/docs/public/r/update-field-card.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-field-card", + "type": "registry:component", + "title": "Update Field Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "checkbox", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "textarea", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-field-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { type ReactNode, useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { FieldType } from \"../../../types/additional-fields\"\nimport { CardContent } from \"../../ui/card\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport { Textarea } from \"../../ui/textarea\"\nimport {\n SettingsCard,\n type SettingsCardClassNames\n} from \"../shared/settings-card\"\n\nexport interface UpdateFieldCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n description?: ReactNode\n instructions?: ReactNode\n localization?: Partial\n name: string\n placeholder?: string\n required?: boolean\n label?: ReactNode\n type?: FieldType\n multiline?: boolean\n value?: unknown\n validate?: (value: string) => boolean | Promise\n}\n\nexport function UpdateFieldCard({\n className,\n classNames,\n description,\n instructions,\n localization: localizationProp,\n name,\n placeholder,\n required,\n label,\n type,\n multiline,\n value,\n validate\n}: UpdateFieldCardProps) {\n const {\n hooks: { useSession },\n mutators: { updateUser },\n localization: contextLocalization,\n optimistic,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { isPending } = useSession()\n\n let fieldSchema = z.unknown() as z.ZodType\n\n // Create the appropriate schema based on type\n if (type === \"number\") {\n fieldSchema = required\n ? z.preprocess(\n (val) => (!val ? undefined : Number(val)),\n z.number({\n required_error: `${label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n )\n : z.coerce\n .number({\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n .optional()\n } else if (type === \"boolean\") {\n fieldSchema = required\n ? z.coerce\n .boolean({\n required_error: `${label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n .refine((val) => val === true, {\n message: `${label} ${localization.IS_REQUIRED}`\n })\n : z.coerce.boolean({\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n } else {\n fieldSchema = required\n ? z.string().min(1, `${label} ${localization.IS_REQUIRED}`)\n : z.string().optional()\n }\n\n const form = useForm({\n resolver: zodResolver(z.object({ [name]: fieldSchema })),\n values: { [name]: value || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateField = async (values: Record) => {\n await new Promise((resolve) => setTimeout(resolve))\n const newValue = values[name]\n\n if (value === newValue) {\n toast({\n variant: \"error\",\n message: `${label} ${localization.IS_THE_SAME}`\n })\n return\n }\n\n if (\n validate &&\n typeof newValue === \"string\" &&\n !(await validate(newValue))\n ) {\n form.setError(name, {\n message: `${label} ${localization.IS_INVALID}`\n })\n\n return\n }\n\n try {\n await updateUser({ [name]: newValue })\n\n toast({\n variant: \"success\",\n message: `${label} ${localization.UPDATED_SUCCESSFULLY}`\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {type === \"boolean\" ? (\n (\n \n \n \n \n\n \n {label}\n \n\n \n \n )}\n />\n ) : isPending ? (\n \n ) : (\n (\n \n \n {type === \"number\" ? (\n \n ) : multiline ? (\n \n ) : (\n \n )}\n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/update-member-role-dialog.json b/docs/public/r/update-member-role-dialog.json new file mode 100644 index 00000000..b3bb7b17 --- /dev/null +++ b/docs/public/r/update-member-role-dialog.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-member-role-dialog", + "type": "registry:component", + "title": "Update Member Role Dialog", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/update-member-role-dialog.tsx", + "content": "\"use client\"\n\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo, useState } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue\n} from \"../ui/select\"\nimport { MemberCell } from \"./member-cell\"\n\nexport interface UpdateMemberRoleDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n member: Member & { user?: Partial | null }\n}\n\nexport function UpdateMemberRoleDialog({\n member,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: UpdateMemberRoleDialogProps) {\n const {\n authClient,\n hooks: { useSession, useListMembers },\n localization: contextLocalization,\n organization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data, refetch } = useListMembers({\n query: { organizationId: member.organizationId }\n })\n\n const members = data?.members\n\n const { data: sessionData } = useSession()\n\n const [isUpdating, setIsUpdating] = useState(false)\n const [selectedRole, setSelectedRole] = useState(member.role)\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organization?.customRoles || [])]\n\n const currentUserRole = members?.find(\n (m) => m.user?.id === sessionData?.user.id\n )?.role\n\n const availableRoles = roles.filter((role) => {\n if (role.role === \"owner\") {\n return currentUserRole === \"owner\"\n }\n\n if (role.role === \"admin\") {\n return currentUserRole === \"owner\" || currentUserRole === \"admin\"\n }\n\n return true\n })\n\n const updateMemberRole = async () => {\n if (selectedRole === member.role) {\n toast({\n variant: \"error\",\n message: `${localization.ROLE} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n setIsUpdating(true)\n\n try {\n await authClient.organization.updateMemberRole({\n memberId: member.id,\n // @ts-ignore - role is a string but the type expects specific values\n role: selectedRole,\n organizationId: member.organizationId,\n fetchOptions: {\n throw: true\n }\n })\n\n toast({\n variant: \"success\",\n message: localization.MEMBER_ROLE_UPDATED\n })\n\n await refetch?.()\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsUpdating(false)\n }\n\n return (\n \n e.preventDefault()}\n >\n \n \n {localization.UPDATE_ROLE}\n \n\n \n {localization.UPDATE_ROLE_DESCRIPTION}\n \n \n\n
\n \n\n \n \n \n \n\n \n {availableRoles.map((role) => (\n \n {role.label}\n \n ))}\n \n \n
\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isUpdating}\n >\n {localization.CANCEL}\n \n\n \n {isUpdating && }\n\n {localization.UPDATE_ROLE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/update-name-card.json b/docs/public/r/update-name-card.json new file mode 100644 index 00000000..c084da9c --- /dev/null +++ b/docs/public/r/update-name-card.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-name-card", + "type": "registry:component", + "title": "Update Name Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-name-card.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { UpdateFieldCard } from \"./update-field-card\"\n\nexport function UpdateNameCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useSession },\n localization: contextLocalization,\n nameRequired\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n\n return (\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/update-username-card.json b/docs/public/r/update-username-card.json new file mode 100644 index 00000000..bc0c9216 --- /dev/null +++ b/docs/public/r/update-username-card.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-username-card", + "type": "registry:component", + "title": "Update Username Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-username-card.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { User } from \"../../../types/auth-client\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { UpdateFieldCard } from \"./update-field-card\"\n\nexport function UpdateUsernameCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useSession },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const value =\n (sessionData?.user as User)?.displayUsername ||\n (sessionData?.user as User)?.username\n\n return (\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-auth-data.json b/docs/public/r/use-auth-data.json new file mode 100644 index 00000000..acbe078b --- /dev/null +++ b/docs/public/r/use-auth-data.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-auth-data", + "type": "registry:hook", + "title": "Use Auth Data", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-data-cache.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/fetch-error.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-auth-data.ts", + "content": "import {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore\n} from \"react\"\n\nimport { authDataCache } from \"../lib/auth-data-cache\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getLocalizedError } from \"../lib/utils\"\nimport type { FetchError } from \"../types/fetch-error\"\n\nexport function useAuthData({\n queryFn,\n cacheKey,\n staleTime = 10000 // Default 10 seconds\n}: {\n queryFn: () => Promise<{ data: T | null; error?: FetchError | null }>\n cacheKey?: string\n staleTime?: number\n}) {\n const {\n hooks: { useSession },\n toast,\n localization\n } = useContext(AuthUIContext)\n const { data: sessionData, isPending: sessionPending } = useSession()\n\n // Generate a stable cache key based on the queryFn if not provided\n const queryFnRef = useRef(queryFn)\n queryFnRef.current = queryFn\n\n const stableCacheKey = cacheKey || queryFn.toString()\n\n // Subscribe to cache updates for this key\n const cacheEntry = useSyncExternalStore(\n useCallback(\n (callback) => authDataCache.subscribe(stableCacheKey, callback),\n [stableCacheKey]\n ),\n useCallback(\n () => authDataCache.get(stableCacheKey),\n [stableCacheKey]\n ),\n useCallback(\n () => authDataCache.get(stableCacheKey),\n [stableCacheKey]\n )\n )\n\n const initialized = useRef(false)\n const previousUserId = useRef(undefined)\n const [error, setError] = useState(null)\n\n const refetch = useCallback(async () => {\n // Check if there's already an in-flight request for this key\n const existingRequest = authDataCache.getInFlightRequest<{\n data: T | null\n error?: FetchError | null\n }>(stableCacheKey)\n if (existingRequest) {\n // Wait for the existing request to complete\n try {\n const result = await existingRequest\n if (result.error) {\n setError(result.error)\n } else {\n setError(null)\n }\n } catch (err) {\n setError(err as FetchError)\n }\n return\n }\n\n // Mark as refetching if we have cached data\n if (cacheEntry?.data !== undefined) {\n authDataCache.setRefetching(stableCacheKey, true)\n }\n\n // Create the fetch promise\n const fetchPromise = queryFnRef.current()\n\n // Store the promise as in-flight\n authDataCache.setInFlightRequest(stableCacheKey, fetchPromise)\n\n try {\n const { data, error } = await fetchPromise\n\n if (error) {\n setError(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n } else {\n setError(null)\n }\n\n // Update cache with new data\n authDataCache.set(stableCacheKey, data)\n } catch (err) {\n const error = err as FetchError\n setError(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n } finally {\n authDataCache.setRefetching(stableCacheKey, false)\n authDataCache.removeInFlightRequest(stableCacheKey)\n }\n }, [stableCacheKey, toast, localization, cacheEntry])\n\n useEffect(() => {\n const currentUserId = sessionData?.user?.id\n\n if (!sessionData) {\n // Clear cache when session is lost\n authDataCache.setRefetching(stableCacheKey, false)\n authDataCache.clear(stableCacheKey)\n initialized.current = false\n previousUserId.current = undefined\n return\n }\n\n // Check if user ID has changed\n const userIdChanged =\n previousUserId.current !== undefined &&\n previousUserId.current !== currentUserId\n\n // If user changed, clear cache to ensure isPending becomes true\n if (userIdChanged) {\n authDataCache.clear(stableCacheKey)\n }\n\n // If we have cached data, we're not pending anymore\n const hasCachedData = cacheEntry?.data !== undefined\n\n // Check if data is stale\n const isStale =\n !cacheEntry || Date.now() - cacheEntry.timestamp > staleTime\n\n if (\n !initialized.current ||\n !hasCachedData ||\n userIdChanged ||\n (hasCachedData && isStale)\n ) {\n // Only fetch if we don't have data or if the data is stale\n if (!hasCachedData || isStale) {\n initialized.current = true\n refetch()\n }\n }\n\n // Update the previous user ID\n previousUserId.current = currentUserId\n }, [\n sessionData,\n sessionData?.user?.id,\n stableCacheKey,\n refetch,\n cacheEntry,\n staleTime\n ])\n\n // Determine if we're in a pending state\n // We're only pending if:\n // 1. Session is still loading, OR\n // 2. We have no cached data and no error\n const isPending =\n sessionPending || (cacheEntry?.data === undefined && !error)\n\n return {\n data: cacheEntry?.data ?? null,\n isPending,\n isRefetching: cacheEntry?.isRefetching ?? false,\n error,\n refetch\n }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-authenticate.json b/docs/public/r/use-authenticate.json new file mode 100644 index 00000000..ec054d85 --- /dev/null +++ b/docs/public/r/use-authenticate.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-authenticate", + "type": "registry:hook", + "title": "Use Authenticate", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-authenticate.ts", + "content": "import { useContext, useEffect } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport type { AuthViewPath } from \"../server\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\n\ninterface AuthenticateOptions {\n authClient?: TAuthClient\n authView?: AuthViewPath\n enabled?: boolean\n}\n\nexport function useAuthenticate(\n options?: AuthenticateOptions\n) {\n type Session = TAuthClient[\"$Infer\"][\"Session\"][\"session\"]\n type User = TAuthClient[\"$Infer\"][\"Session\"][\"user\"]\n\n const { authView = \"SIGN_IN\", enabled = true } = options ?? {}\n\n const {\n hooks: { useSession },\n basePath,\n viewPaths,\n replace\n } = useContext(AuthUIContext)\n\n const { data, isPending, error, refetch } = useSession()\n const sessionData = data as\n | {\n session: Session\n user: User\n }\n | null\n | undefined\n\n useEffect(() => {\n if (!enabled || isPending || sessionData) return\n\n replace(\n `${basePath}/${viewPaths[authView]}?redirectTo=${window.location.href.replace(window.location.origin, \"\")}`\n )\n }, [\n isPending,\n sessionData,\n basePath,\n viewPaths,\n replace,\n authView,\n enabled\n ])\n\n return {\n data: sessionData,\n user: sessionData?.user,\n isPending,\n error,\n refetch\n }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-captcha.json b/docs/public/r/use-captcha.json new file mode 100644 index 00000000..50f16dab --- /dev/null +++ b/docs/public/r/use-captcha.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-captcha", + "type": "registry:hook", + "title": "Use Captcha", + "description": "", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile", + "@wojtekmaj/react-recaptcha-v3", + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-captcha.tsx", + "content": "import type HCaptcha from \"@hcaptcha/react-hcaptcha\"\nimport type { TurnstileInstance } from \"@marsidev/react-turnstile\"\nimport { useGoogleReCaptcha } from \"@wojtekmaj/react-recaptcha-v3\"\nimport { type RefObject, useContext, useRef } from \"react\"\nimport type ReCAPTCHA from \"react-google-recaptcha\"\n\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\n\n// Default captcha endpoints\nconst DEFAULT_CAPTCHA_ENDPOINTS = [\n \"/sign-up/email\",\n \"/sign-in/email\",\n \"/forget-password\"\n]\n\n// Sanitize action name for reCAPTCHA\n// Google reCAPTCHA only allows A-Za-z/_ in action names\nconst sanitizeActionName = (action: string): string => {\n // First remove leading slash if present\n let result = action.startsWith(\"/\") ? action.substring(1) : action\n\n // Convert both kebab-case and path separators to camelCase\n // Example: \"/sign-in/email\" becomes \"signInEmail\"\n result = result\n .replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/\\/([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/\\//g, \"\")\n .replace(/[^A-Za-z0-9_]/g, \"\")\n\n return result\n}\n\nexport function useCaptcha({\n localization\n}: {\n localization: Partial\n}) {\n const { captcha, localization: contextLocalization } =\n useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n const captchaRef = useRef(null)\n const { executeRecaptcha } = useGoogleReCaptcha()\n\n const executeCaptcha = async (action: string) => {\n if (!captcha) throw new Error(localization.MISSING_RESPONSE)\n\n // Sanitize the action name for reCAPTCHA\n let response: string | undefined | null\n\n switch (captcha.provider) {\n case \"google-recaptcha-v3\": {\n const sanitizedAction = sanitizeActionName(action)\n response = await executeRecaptcha?.(sanitizedAction)\n break\n }\n case \"google-recaptcha-v2-checkbox\": {\n const recaptchaRef = captchaRef as RefObject\n response = recaptchaRef.current.getValue()\n break\n }\n case \"google-recaptcha-v2-invisible\": {\n const recaptchaRef = captchaRef as RefObject\n response = await recaptchaRef.current.executeAsync()\n break\n }\n case \"cloudflare-turnstile\": {\n const turnstileRef = captchaRef as RefObject\n response = turnstileRef.current.getResponse()\n break\n }\n case \"hcaptcha\": {\n const hcaptchaRef = captchaRef as RefObject\n response = hcaptchaRef.current.getResponse()\n break\n }\n }\n\n if (!response) {\n throw new Error(localization.MISSING_RESPONSE)\n }\n\n return response\n }\n\n const getCaptchaHeaders = async (action: string) => {\n if (!captcha) return undefined\n\n // Use custom endpoints if provided, otherwise use defaults\n const endpoints = captcha.endpoints || DEFAULT_CAPTCHA_ENDPOINTS\n\n // Only execute captcha if the action is in the endpoints list\n if (endpoints.includes(action)) {\n return { \"x-captcha-response\": await executeCaptcha(action) }\n }\n\n return undefined\n }\n\n const resetCaptcha = () => {\n if (!captcha) return\n\n switch (captcha.provider) {\n case \"google-recaptcha-v3\": {\n // No widget to reset; token is generated per execute call\n break\n }\n case \"google-recaptcha-v2-checkbox\":\n case \"google-recaptcha-v2-invisible\": {\n const recaptchaRef = captchaRef as RefObject\n recaptchaRef.current?.reset?.()\n break\n }\n case \"cloudflare-turnstile\": {\n const turnstileRef = captchaRef as RefObject\n // Some versions expose reset on the instance\n // biome-ignore lint/suspicious/noExplicitAny: defensive\n ;(turnstileRef.current as any)?.reset?.()\n break\n }\n case \"hcaptcha\": {\n const hcaptchaRef = captchaRef as RefObject\n // HCaptcha uses resetCaptcha()\n hcaptchaRef.current?.resetCaptcha?.()\n break\n }\n }\n }\n\n return {\n captchaRef,\n getCaptchaHeaders,\n resetCaptcha\n }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-conditional-query.json b/docs/public/r/use-conditional-query.json new file mode 100644 index 00000000..9ea82306 --- /dev/null +++ b/docs/public/r/use-conditional-query.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-conditional-query", + "type": "registry:lib", + "title": "Use Conditional Query", + "description": "", + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-conditional-query.ts", + "content": "import type {\n FetchResult,\n Models,\n SchemaQuery,\n SubscriptionOptions,\n SubscriptionSignalPayload,\n TriplitClient\n} from \"@triplit/client\"\nimport type { WorkerClient } from \"@triplit/client/worker-client\"\nimport { createStateSubscription } from \"@triplit/react\"\nimport { useCallback, useMemo, useState, useSyncExternalStore } from \"react\"\n\nexport function useConditionalQuery<\n M extends Models,\n Q extends SchemaQuery\n>(\n client: TriplitClient | WorkerClient,\n query?: Q | false | null | \"\" | 0,\n options?: Partial & { disabled?: boolean }\n) {\n const stringifiedQuery =\n !options?.disabled && query && JSON.stringify(query)\n const localOnly = !!options?.localOnly\n const [remoteFulfilled, setRemoteFulfilled] = useState(false)\n\n const defaultValue: SubscriptionSignalPayload = {\n results: undefined,\n fetching: true,\n fetchingLocal: false,\n fetchingRemote: false,\n error: undefined\n }\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: prevent infinite re-renders\n const [subscribe, snapshot] = useMemo(\n () =>\n stringifiedQuery\n ? createStateSubscription(client, query, {\n ...options,\n onRemoteFulfilled: () => setRemoteFulfilled(true)\n })\n : [() => () => {}, () => defaultValue],\n [stringifiedQuery, localOnly]\n )\n\n const getServerSnapshot = useCallback(() => snapshot(), [snapshot])\n const { fetching, ...rest } = useSyncExternalStore(\n subscribe,\n snapshot,\n getServerSnapshot\n )\n return { fetching: fetching && !remoteFulfilled, ...rest }\n}\n\ntype useConditionalQueryOnePayload<\n M extends Models,\n Q extends SchemaQuery\n> = Omit, \"results\"> & {\n result: FetchResult\n}\n\nexport function useConditionalQueryOne<\n M extends Models,\n Q extends SchemaQuery\n>(\n client: TriplitClient | WorkerClient,\n query?: Q | false | null | \"\" | 0,\n options?: Partial & { disabled?: boolean }\n): useConditionalQueryOnePayload {\n const { fetching, fetchingLocal, fetchingRemote, results, error } =\n useConditionalQuery(\n client,\n query ? ({ ...query, limit: 1 } as Q) : query,\n options\n )\n\n const result = useMemo(() => {\n return results?.[0] ?? null\n }, [results])\n\n return { fetching, fetchingLocal, fetchingRemote, result, error }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-current-organization.json b/docs/public/r/use-current-organization.json new file mode 100644 index 00000000..bb8ae23d --- /dev/null +++ b/docs/public/r/use-current-organization.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-current-organization", + "type": "registry:hook", + "title": "Use Current Organization", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-current-organization.ts", + "content": "import type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\nexport function useCurrentOrganization({\n slug: slugProp\n}: {\n slug?: string\n} = {}) {\n const {\n organization: organizationOptions,\n hooks: { useActiveOrganization, useListOrganizations }\n } = useContext(AuthUIContext)\n\n const { pathMode, slug: contextSlug } = organizationOptions || {}\n\n let data: Organization | null | undefined\n let isPending: boolean | undefined\n let isRefetching: boolean | undefined\n\n let refetch: (() => void) | undefined\n\n const {\n data: organizations,\n isPending: organizationsPending,\n isRefetching: organizationsRefetching\n } = useListOrganizations()\n\n if (pathMode === \"slug\") {\n const slug = slugProp || contextSlug\n\n data = organizations?.find((organization) => organization.slug === slug)\n isPending = organizationsPending\n isRefetching = organizationsRefetching\n } else {\n const {\n data: activeOrganization,\n isPending: organizationPending,\n isRefetching: organizationRefetching,\n refetch: refetchOrganization\n } = useActiveOrganization()\n\n refetch = refetchOrganization\n\n data = activeOrganization\n isPending = organizationPending\n isRefetching = organizationRefetching\n }\n\n return useMemo(\n () => ({\n data,\n isPending,\n isRefetching,\n refetch\n }),\n [data, isPending, isRefetching, refetch]\n )\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-hydrated.json b/docs/public/r/use-hydrated.json new file mode 100644 index 00000000..7334e48c --- /dev/null +++ b/docs/public/r/use-hydrated.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-hydrated", + "type": "registry:hook", + "title": "Use Hydrated", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-hydrated.ts", + "content": "import { useSyncExternalStore } from \"react\"\n\nfunction subscribe() {\n return () => {}\n}\n\nexport function useIsHydrated() {\n return useSyncExternalStore(\n subscribe,\n () => true,\n () => false\n )\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-instant-options.json b/docs/public/r/use-instant-options.json new file mode 100644 index 00000000..8b3eaf10 --- /dev/null +++ b/docs/public/r/use-instant-options.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-instant-options", + "type": "registry:lib", + "title": "Use Instant Options", + "description": "", + "dependencies": [ + "@instantdb/react", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-instant-options.ts", + "content": "import type { InstantReactWebDatabase } from \"@instantdb/react\"\nimport type { User } from \"better-auth\"\nimport { useMemo } from \"react\"\n\nimport type { Session } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { AuthMutators } from \"../../types/auth-mutators\"\nimport type { Refetch } from \"../../types/refetch\"\nimport { getModelName } from \"./model-names\"\nimport { useListAccounts } from \"./use-list-accounts\"\nimport { useListSessions } from \"./use-list-sessions\"\nimport { useSession } from \"./use-session\"\n\nconst namespaces = [\"user\", \"session\", \"account\", \"passkey\"] as const\ntype Namespace = (typeof namespaces)[number]\n\ntype ModelNames = {\n [key in Namespace]: string\n}\n\nexport interface UseInstantOptionsProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n db: InstantReactWebDatabase\n modelNames?: Partial\n usePlural?: boolean\n sessionData?: { user: User; session: Session }\n refetch?: Refetch\n user?: { id: string } | null\n isPending: boolean\n}\n\nexport function useInstantOptions({\n db,\n usePlural = true,\n modelNames,\n sessionData,\n isPending,\n user\n}: UseInstantOptionsProps) {\n const userId = user?.id || sessionData?.user.id\n\n const hooks = useMemo(() => {\n return {\n useSession: () =>\n useSession({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListAccounts: () =>\n useListAccounts({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListSessions: () =>\n useListSessions({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n })\n } as AuthHooks\n }, [db, modelNames, usePlural, sessionData, isPending])\n\n const mutators = useMemo(() => {\n return {\n updateUser: async (data) => {\n if (!userId) {\n throw new Error(\"Unauthenticated\")\n }\n\n const modelName = getModelName({\n namespace: \"user\",\n modelNames,\n usePlural\n })\n\n db.transact([\n db.tx[modelName][userId].update({\n ...data,\n updatedAt: Date.now()\n })\n ])\n }\n } as AuthMutators\n }, [db, userId, modelNames, usePlural])\n\n return {\n hooks,\n mutators\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-lang.json b/docs/public/r/use-lang.json new file mode 100644 index 00000000..5422b5c4 --- /dev/null +++ b/docs/public/r/use-lang.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-lang", + "type": "registry:hook", + "title": "Use Lang", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-lang.ts", + "content": "import { useEffect, useState } from \"react\"\n\nexport function useLang() {\n const [lang, setLang] = useState()\n\n useEffect(() => {\n const checkLang = () => {\n const currentLang = document.documentElement.getAttribute(\"lang\")\n setLang(currentLang ?? undefined)\n }\n\n // Initial check\n checkLang()\n\n // Listen for changes to lang attribute on html tag\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.attributeName === \"lang\") {\n checkLang()\n }\n }\n })\n\n observer.observe(document.documentElement, { attributes: true })\n\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return { lang }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-list-accounts.json b/docs/public/r/use-list-accounts.json new file mode 100644 index 00000000..5f2a8800 --- /dev/null +++ b/docs/public/r/use-list-accounts.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-list-accounts", + "type": "registry:lib", + "title": "Use List Accounts", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-accounts.ts", + "content": "import { useMemo } from \"react\"\n\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQuery } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useListAccounts({\n triplit,\n modelNames,\n usePlural,\n isPending\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"account\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const { results, error, fetching } = useConditionalQuery(\n triplit,\n payload?.sub && triplit.query(modelName)\n )\n\n const accounts = useMemo(() => {\n return results?.map((account) => ({\n accountId: account.accountId as string,\n provider: account.providerId as string\n }))\n }, [results])\n\n return {\n data: accounts,\n isPending: isPending || fetching,\n error\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-list-sessions.json b/docs/public/r/use-list-sessions.json new file mode 100644 index 00000000..55b22ded --- /dev/null +++ b/docs/public/r/use-list-sessions.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-list-sessions", + "type": "registry:lib", + "title": "Use List Sessions", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-sessions.ts", + "content": "import type { Session } from \"better-auth\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQuery } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useListSessions({\n triplit,\n modelNames,\n usePlural,\n isPending\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"session\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const {\n results: sessions,\n error,\n fetching\n } = useConditionalQuery(triplit, payload?.sub && triplit.query(modelName))\n\n return {\n data: sessions as Session[] | undefined,\n isPending: isPending || fetching,\n error\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-session.json b/docs/public/r/use-session.json new file mode 100644 index 00000000..5b4c6202 --- /dev/null +++ b/docs/public/r/use-session.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-session", + "type": "registry:lib", + "title": "Use Session", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-session.ts", + "content": "import type { User } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQueryOne } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useSession({\n triplit,\n sessionData,\n isPending,\n refetch,\n usePlural,\n modelNames\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"user\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const { result: user, error } = useConditionalQueryOne(\n triplit,\n payload?.sub && triplit.query(modelName)\n )\n\n return {\n data: sessionData\n ? {\n session: sessionData.session,\n user: (sessionData?.user.id === user?.id\n ? user\n : sessionData.user) as User\n }\n : null,\n error,\n isPending: isPending,\n refetch: refetch || (() => {})\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-success-transition.json b/docs/public/r/use-success-transition.json new file mode 100644 index 00000000..e22e2c2f --- /dev/null +++ b/docs/public/r/use-success-transition.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-success-transition", + "type": "registry:hook", + "title": "Use Success Transition", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-success-transition.ts", + "content": "import {\n useCallback,\n useContext,\n useEffect,\n useState,\n useTransition\n} from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getSearchParam } from \"../lib/utils\"\n\nexport function useOnSuccessTransition({\n redirectTo: redirectToProp\n}: {\n redirectTo?: string\n}) {\n const { redirectTo: contextRedirectTo } = useContext(AuthUIContext)\n\n const getRedirectTo = useCallback(\n () =>\n redirectToProp || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectToProp, contextRedirectTo]\n )\n\n const [isPending, startTransition] = useTransition()\n const [success, setSuccess] = useState(false)\n\n const {\n navigate,\n hooks: { useSession },\n onSessionChange\n } = useContext(AuthUIContext)\n\n const { refetch: refetchSession } = useSession()\n\n useEffect(() => {\n if (!success || isPending) return\n\n startTransition(() => {\n navigate(getRedirectTo())\n })\n }, [success, isPending, navigate, getRedirectTo])\n\n const onSuccess = useCallback(async () => {\n await refetchSession?.()\n setSuccess(true)\n\n if (onSessionChange) startTransition(onSessionChange)\n }, [refetchSession, onSessionChange])\n\n return { onSuccess, isPending }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-tanstack-options.json b/docs/public/r/use-tanstack-options.json new file mode 100644 index 00000000..24c12d8e --- /dev/null +++ b/docs/public/r/use-tanstack-options.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-tanstack-options", + "type": "registry:lib", + "title": "Use Tanstack Options", + "description": "", + "dependencies": [ + "@daveyplate/better-auth-tanstack", + "@tanstack/react-query" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json" + ], + "files": [ + { + "path": "src/lib/tanstack/use-tanstack-options.ts", + "content": "import {\n AuthQueryContext,\n createAuthHooks\n} from \"@daveyplate/better-auth-tanstack\"\nimport { useIsRestoring, useQueryClient } from \"@tanstack/react-query\"\nimport { useCallback, useContext, useMemo } from \"react\"\n\nimport type { AnyAuthClient } from \"../../types/any-auth-client\"\nimport type { AuthClient } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { AuthMutators } from \"../../types/auth-mutators\"\n\nexport function useTanstackOptions({\n authClient\n}: {\n authClient: AnyAuthClient\n}) {\n const {\n useUnlinkAccount,\n useUpdateUser,\n useDeletePasskey,\n useRevokeSession,\n useRevokeDeviceSession,\n useSetActiveSession\n } = createAuthHooks(authClient)\n const queryClient = useQueryClient()\n\n const { mutateAsync: updateUserAsync } = useUpdateUser()\n const { mutateAsync: deletePasskeyAsync } = useDeletePasskey()\n const { mutateAsync: unlinkAccountAsync } = useUnlinkAccount()\n const { mutateAsync: revokeSessionAsync } = useRevokeSession()\n const { mutateAsync: revokeDeviceSessionAsync } = useRevokeDeviceSession()\n const { setActiveSessionAsync } = useSetActiveSession()\n const { sessionKey } = useContext(AuthQueryContext)\n\n const hooks = useMemo(\n () => ({\n ...(createAuthHooks(\n authClient as AuthClient\n ) as Partial),\n useIsRestoring\n }),\n [authClient]\n )\n\n const mutators = useMemo(\n () =>\n ({\n updateUser: async (params) => {\n const { error } = await updateUserAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n unlinkAccount: async (params) => {\n const { error } = await unlinkAccountAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n deletePasskey: async (params) => {\n const { error } = await deletePasskeyAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n revokeSession: async (params) => {\n const { error } = await revokeSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n setActiveSession: async (params) => {\n const { error } = await setActiveSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n revokeDeviceSession: async (params) => {\n const { error } = await revokeDeviceSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n }\n }) as AuthMutators,\n [\n updateUserAsync,\n deletePasskeyAsync,\n unlinkAccountAsync,\n revokeSessionAsync,\n revokeDeviceSessionAsync,\n setActiveSessionAsync\n ]\n )\n\n const onSessionChange = useCallback(async () => {\n await queryClient.refetchQueries({ queryKey: sessionKey })\n\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey !== sessionKey\n })\n }, [queryClient, sessionKey])\n\n return {\n hooks,\n mutators,\n onSessionChange,\n optimistic: true\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-theme.json b/docs/public/r/use-theme.json new file mode 100644 index 00000000..92064415 --- /dev/null +++ b/docs/public/r/use-theme.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-theme", + "type": "registry:hook", + "title": "Use Theme", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-theme.ts", + "content": "import { useEffect, useState } from \"react\"\n\nexport function useTheme() {\n const [theme, setTheme] = useState<\"light\" | \"dark\">(\"light\")\n\n useEffect(() => {\n const checkTheme = () => {\n const isDark =\n document.documentElement.classList.contains(\"dark\") ||\n document.documentElement\n .getAttribute(\"style\")\n ?.includes(\"color-scheme: dark\")\n setTheme(isDark ? \"dark\" : \"light\")\n }\n\n // Initial check\n checkTheme()\n\n // Listen for changes to html tag\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.attributeName === \"style\" ||\n mutation.attributeName === \"class\"\n ) {\n checkTheme()\n }\n }\n })\n\n observer.observe(document.documentElement, { attributes: true })\n\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return { theme }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-triplit-hooks.json b/docs/public/r/use-triplit-hooks.json new file mode 100644 index 00000000..89b08351 --- /dev/null +++ b/docs/public/r/use-triplit-hooks.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-triplit-hooks", + "type": "registry:lib", + "title": "Use Triplit Hooks", + "description": "", + "dependencies": [ + "@triplit/client", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-triplit-hooks.ts", + "content": "import type { TriplitClient } from \"@triplit/client\"\nimport type { User } from \"better-auth\"\nimport { useMemo } from \"react\"\n\nimport type { Session } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { Refetch } from \"../../types/refetch\"\nimport { useListAccounts } from \"./use-list-accounts\"\nimport { useListSessions } from \"./use-list-sessions\"\nimport { useSession } from \"./use-session\"\n\nconst namespaces = [\"user\", \"session\", \"account\", \"passkey\"] as const\ntype Namespace = (typeof namespaces)[number]\n\ntype ModelNames = {\n [key in Namespace]: string\n}\n\nexport interface UseTriplitOptionsProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n triplit: TriplitClient\n modelNames?: Partial\n usePlural?: boolean\n sessionData?: { user: User; session: Session } | null\n refetch?: Refetch\n isPending: boolean\n}\n\nexport function useTriplitHooks({\n triplit,\n usePlural = true,\n modelNames,\n sessionData,\n isPending\n}: UseTriplitOptionsProps) {\n const hooks = useMemo(() => {\n return {\n useSession: () =>\n useSession({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListAccounts: () =>\n useListAccounts({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListSessions: () =>\n useListSessions({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n })\n } as AuthHooks\n }, [triplit, modelNames, usePlural, sessionData, isPending])\n\n return {\n hooks\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/use-triplit-token.json b/docs/public/r/use-triplit-token.json new file mode 100644 index 00000000..a463ce9e --- /dev/null +++ b/docs/public/r/use-triplit-token.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-triplit-token", + "type": "registry:lib", + "title": "Use Triplit Token", + "description": "", + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-triplit-token.ts", + "content": "import type { TriplitClient } from \"@triplit/client\"\nimport { useConnectionStatus } from \"@triplit/react\"\nimport { useMemo } from \"react\"\n\nexport function useTriplitToken(triplit: TriplitClient) {\n const connectionStatus = useConnectionStatus(triplit)\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: update when connection status changes\n const payload = useMemo(\n () =>\n triplit.token\n ? (decodeJWT(triplit.token) as Record & {\n exp: number\n iat: number\n sub?: string\n email?: string\n name?: string\n })\n : undefined,\n [connectionStatus]\n )\n\n return { token: payload && triplit.token, payload }\n}\n\nfunction decodeJWT(token: string) {\n try {\n const base64Url = token.split(\".\")[1]\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\")\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((char) => {\n return `%${(`00${char.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(\"\")\n )\n\n return JSON.parse(jsonPayload)\n } catch (error) {\n console.error(\"Failed to decode JWT:\", error)\n return null\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/user-avatar.json b/docs/public/r/user-avatar.json new file mode 100644 index 00000000..fd4191f0 --- /dev/null +++ b/docs/public/r/user-avatar.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-avatar", + "type": "registry:component", + "title": "User Avatar", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "http://localhost:3000/r/gravatar-utils.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-avatar.tsx", + "content": "\"use client\"\n\nimport { UserRoundIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\n\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getGravatarUrl } from \"../lib/gravatar-utils\"\nimport { cn } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { Profile } from \"../types/profile\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\"\nimport { Skeleton } from \"./ui/skeleton\"\n\nexport interface UserAvatarClassNames {\n base?: string\n image?: string\n fallback?: string\n fallbackIcon?: string\n skeleton?: string\n}\n\nexport interface UserAvatarProps {\n classNames?: UserAvatarClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\" | null\n user?: Profile | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: Partial\n}\n\n/**\n * Displays a user avatar with image and fallback support\n *\n * Renders a user's avatar image when available, with appropriate fallbacks:\n * - Shows a skeleton when isPending is true\n * - Displays first two characters of user's name when no image is available\n * - Falls back to a generic user icon when neither image nor name is available\n */\nexport function UserAvatar({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization,\n ...props\n}: UserAvatarProps & ComponentProps) {\n const {\n localization: contextLocalization,\n gravatar,\n avatar\n } = useContext(AuthUIContext)\n\n const localization = { ...contextLocalization, ...propLocalization }\n\n const name =\n user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email\n const userImage = user?.image || user?.avatar || user?.avatarUrl\n\n // Calculate gravatar URL synchronously\n const gravatarUrl =\n gravatar && user?.email\n ? getGravatarUrl(\n user.email,\n gravatar === true ? undefined : gravatar\n )\n : null\n\n const src = gravatar ? gravatarUrl : userImage\n\n if (isPending) {\n return (\n \n )\n }\n\n return (\n \n {avatar?.Image ? (\n \n ) : (\n \n )}\n\n \n {firstTwoCharacters(name) || (\n \n )}\n \n \n )\n}\n\nconst firstTwoCharacters = (name?: string | null) => name?.slice(0, 2)\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/user-button.json b/docs/public/r/user-button.json new file mode 100644 index 00000000..44bab9da --- /dev/null +++ b/docs/public/r/user-button.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-button", + "type": "registry:component", + "title": "User Button", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dropdown-menu", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-button.tsx", + "content": "\"use client\"\nimport {\n ChevronsUpDown,\n LogInIcon,\n LogOutIcon,\n PlusCircleIcon,\n SettingsIcon,\n UserRoundPlus\n} from \"lucide-react\"\nimport {\n type ComponentProps,\n Fragment,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport { useIsHydrated } from \"../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\nimport type { User } from \"../types/auth-client\"\nimport { Button } from \"./ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"./ui/dropdown-menu\"\nimport { UserAvatar, type UserAvatarClassNames } from \"./user-avatar\"\nimport { UserView, type UserViewClassNames } from \"./user-view\"\n\nexport interface UserButtonClassNames {\n base?: string\n skeleton?: string\n trigger?: {\n base?: string\n avatar?: UserAvatarClassNames\n user?: UserViewClassNames\n skeleton?: string\n }\n content?: {\n base?: string\n user?: UserViewClassNames\n avatar?: UserAvatarClassNames\n menuItem?: string\n separator?: string\n }\n}\n\nexport interface UserButtonProps {\n className?: string\n classNames?: UserButtonClassNames\n align?: \"center\" | \"start\" | \"end\"\n additionalLinks?: {\n href: string\n icon?: ReactNode\n label: ReactNode\n signedIn?: boolean\n separator?: boolean\n }[]\n trigger?: ReactNode\n disableDefaultLinks?: boolean\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays an interactive user button with dropdown menu functionality\n *\n * Renders a user interface element that can be displayed as either an icon or full button:\n * - Shows a user avatar or placeholder when in icon mode\n * - Displays user name and email with dropdown indicator in full mode\n * - Provides dropdown menu with authentication options (sign in/out, settings, etc.)\n * - Supports multi-session functionality for switching between accounts\n * - Can be customized with additional links and styling options\n */\nexport function UserButton({\n className,\n classNames,\n align,\n trigger,\n additionalLinks,\n disableDefaultLinks,\n localization: propLocalization,\n size,\n ...props\n}: UserButtonProps & ComponentProps) {\n const {\n basePath,\n hooks: { useSession, useListDeviceSessions },\n mutators: { setActiveSession },\n localization: contextLocalization,\n multiSession,\n account: accountOptions,\n signUp,\n toast,\n viewPaths,\n onSessionChange,\n Link\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n let deviceSessions:\n | AnyAuthClient[\"$Infer\"][\"Session\"][]\n | undefined\n | null = null\n let deviceSessionsPending = false\n\n if (multiSession) {\n const { data, isPending } = useListDeviceSessions()\n deviceSessions = data\n deviceSessionsPending = isPending\n }\n\n const { data: sessionData, isPending: sessionPending } = useSession()\n const user = sessionData?.user\n const [activeSessionPending, setActiveSessionPending] = useState(false)\n\n const isHydrated = useIsHydrated()\n const isPending = sessionPending || activeSessionPending || !isHydrated\n\n const switchAccount = useCallback(\n async (sessionToken: string) => {\n setActiveSessionPending(true)\n\n try {\n await setActiveSession({ sessionToken })\n\n onSessionChange?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n setActiveSessionPending(false)\n }\n },\n [setActiveSession, onSessionChange, toast, localization]\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (!multiSession) return\n\n setActiveSessionPending(false)\n }, [sessionData, multiSession])\n\n const warningLogged = useRef(false)\n\n useEffect(() => {\n if (size || warningLogged.current) return\n\n console.warn(\n \"[Better Auth UI] The `size` prop of `UserButton` no longer defaults to `icon`. Please pass `size='icon'` to the `UserButton` component to get the same behaviour as before. This warning will be removed in a future release. It can be suppressed in the meantime by defining the `size` prop.\"\n )\n\n warningLogged.current = true\n }, [size])\n\n return (\n \n \n {trigger ||\n (size === \"icon\" ? (\n \n \n \n ) : (\n \n \n\n \n \n ))}\n \n\n e.preventDefault()}\n >\n
\n {(user && !(user as User).isAnonymous) || isPending ? (\n \n ) : (\n
\n {localization.ACCOUNT}\n
\n )}\n
\n\n \n\n {additionalLinks?.map(\n ({ href, icon, label, signedIn, separator }, index) =>\n (signedIn === undefined ||\n (signedIn && !!sessionData) ||\n (!signedIn && !sessionData)) && (\n \n \n \n {icon}\n {label}\n \n \n {separator && (\n \n )}\n \n )\n )}\n\n {!user || (user as User).isAnonymous ? (\n <>\n \n \n \n\n {localization.SIGN_IN}\n \n \n\n {signUp && (\n \n \n \n\n {localization.SIGN_UP}\n \n \n )}\n \n ) : (\n <>\n {!disableDefaultLinks && accountOptions && (\n \n \n \n\n {localization.SETTINGS}\n \n \n )}\n\n \n \n \n\n {localization.SIGN_OUT}\n \n \n \n )}\n\n {user && multiSession && (\n <>\n \n\n {!deviceSessions && deviceSessionsPending && (\n <>\n \n \n \n\n \n \n )}\n\n {deviceSessions\n ?.filter(\n (sessionData) =>\n sessionData.user.id !== user?.id\n )\n .map(({ session, user }) => (\n \n \n switchAccount(session.token)\n }\n >\n \n \n\n \n \n ))}\n\n \n \n \n\n {localization.ADD_ACCOUNT}\n \n \n \n )}\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/user-invitations-card.json b/docs/public/r/user-invitations-card.json new file mode 100644 index 00000000..b01ea9be --- /dev/null +++ b/docs/public/r/user-invitations-card.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-invitations-card", + "type": "registry:component", + "title": "User Invitations Card", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/user-invitations-card.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, EllipsisIcon, Loader2, XIcon } from \"lucide-react\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card, CardContent } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { UserAvatar } from \"../user-avatar\"\n\nexport function UserInvitationsCard({\n className,\n classNames,\n localization: localizationProp,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useListUserInvitations, useListOrganizations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: invitations, refetch: refetchInvitations } =\n useListUserInvitations()\n const { refetch: refetchOrganizations } = useListOrganizations()\n\n const handleRefresh = async () => {\n await refetchInvitations?.()\n await refetchOrganizations?.()\n }\n\n const pendingInvitations = invitations?.filter(\n (invitation) => invitation.status === \"pending\"\n )\n\n if (!pendingInvitations?.length) return null\n\n return (\n \n \n {pendingInvitations.map((invitation) => (\n \n ))}\n \n \n )\n}\n\nfunction UserInvitationRow({\n classNames,\n invitation,\n onChanged\n}: {\n classNames?: SettingsCardProps[\"classNames\"]\n invitation: {\n id: string\n email: string\n role: string\n status: string\n expiresAt: Date\n }\n onChanged?: () => unknown\n}) {\n const {\n authClient,\n organization: organizationOptions,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = contextLocalization\n\n const [isLoading, setIsLoading] = useState(false)\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organizationOptions?.customRoles || [])]\n const role = roles.find((r) => r.role === invitation.role)\n\n const handleAccept = async () => {\n setIsLoading(true)\n\n try {\n await authClient.organization.acceptInvitation({\n invitationId: invitation.id,\n fetchOptions: { throw: true }\n })\n\n await onChanged?.()\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_ACCEPTED\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n const handleReject = async () => {\n setIsLoading(true)\n\n try {\n await authClient.organization.rejectInvitation({\n invitationId: invitation.id,\n fetchOptions: { throw: true }\n })\n\n await onChanged?.()\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_REJECTED\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n return (\n \n
\n \n\n
\n \n {invitation.email}\n \n\n \n {localization.EXPIRES}{\" \"}\n {invitation.expiresAt.toLocaleDateString()}\n \n
\n
\n\n {role?.label}\n\n
\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n\n e.preventDefault()}\n >\n \n \n\n {localization.ACCEPT}\n \n\n \n \n\n {localization.REJECT}\n \n \n \n
\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/user-view.json b/docs/public/r/user-view.json new file mode 100644 index 00000000..6c432bd2 --- /dev/null +++ b/docs/public/r/user-view.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-view", + "type": "registry:component", + "title": "User View", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-view.tsx", + "content": "\"use client\"\n\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { cn } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { Profile } from \"../types/profile\"\nimport { Skeleton } from \"./ui/skeleton\"\nimport { UserAvatar, type UserAvatarClassNames } from \"./user-avatar\"\n\nexport interface UserViewClassNames {\n base?: string\n avatar?: UserAvatarClassNames\n content?: string\n title?: string\n subtitle?: string\n skeleton?: string\n}\n\nexport interface UserViewProps {\n className?: string\n classNames?: UserViewClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | null\n user?: Profile | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays user information with avatar and details in a compact view\n *\n * Renders a user's profile information with appropriate fallbacks:\n * - Shows avatar alongside user name and email when available\n * - Shows loading skeletons when isPending is true\n * - Falls back to generic \"User\" text when neither name nor email is available\n * - Supports customization through classNames prop\n */\nexport function UserView({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization\n}: UserViewProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n return (\n \n \n\n \n {isPending ? (\n <>\n \n {size !== \"sm\" && (\n \n )}\n \n ) : (\n <>\n \n {user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email ||\n localization?.USER}\n \n\n {!user?.isAnonymous &&\n size !== \"sm\" &&\n (user?.name || user?.username) && (\n \n {user?.email}\n \n )}\n \n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/username-error-codes.json b/docs/public/r/username-error-codes.json new file mode 100644 index 00000000..7a59c99c --- /dev/null +++ b/docs/public/r/username-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "username-error-codes", + "type": "registry:file", + "title": "Username Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/username-error-codes.ts", + "content": "export const USERNAME_ERROR_CODES = {\n INVALID_USERNAME_OR_PASSWORD: \"invalid username or password\",\n EMAIL_NOT_VERIFIED: \"email not verified\",\n UNEXPECTED_ERROR: \"unexpected error\",\n USERNAME_IS_ALREADY_TAKEN: \"username is already taken. please try another.\",\n USERNAME_TOO_SHORT: \"username is too short\",\n USERNAME_TOO_LONG: \"username is too long\",\n INVALID_USERNAME: \"username is invalid\"\n}\n", + "type": "registry:file", + "target": "localization/username-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/utils.json b/docs/public/r/utils.json new file mode 100644 index 00000000..0d42bca3 --- /dev/null +++ b/docs/public/r/utils.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "utils", + "type": "registry:lib", + "title": "Utils", + "description": "", + "dependencies": [ + "clsx", + "tailwind-merge", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/lib/utils.ts", + "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport * as z from \"zod\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { PasswordValidation } from \"../types/password-validation\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function isValidEmail(email: string) {\n const emailRegex: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n/**\n * Converts error codes from SNAKE_CASE to camelCase\n * Example: INVALID_TWO_FACTOR_COOKIE -> invalidTwoFactorCookie\n */\nexport function errorCodeToCamelCase(errorCode: string): string {\n return errorCode\n .toLowerCase()\n .replace(/_([a-z])/g, (_, char) => char.toUpperCase())\n}\n\n/**\n * Gets a localized error message from an error object\n */\nexport function getLocalizedError({\n error,\n localization\n}: {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n error: any\n localization?: Partial\n}) {\n if (typeof error === \"string\") {\n if (localization?.[error as keyof AuthLocalization])\n return localization[error as keyof AuthLocalization]\n }\n\n if (error?.error) {\n if (error.error.code) {\n const errorCode = error.error.code as keyof AuthLocalization\n if (localization?.[errorCode]) return localization[errorCode]\n }\n\n return (\n error.error.message ||\n error.error.code ||\n error.error.statusText ||\n localization?.REQUEST_FAILED\n )\n }\n\n return error?.message || localization?.REQUEST_FAILED || \"Request failed\"\n}\n\nexport function getSearchParam(paramName: string) {\n return typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(paramName)\n : null\n}\n\nexport function getViewByPath(viewPaths: T, path?: string) {\n for (const key in viewPaths) {\n if (viewPaths[key] === path) {\n return key\n }\n }\n}\n\nexport function getKeyByValue>(\n object: T,\n value?: T[keyof T]\n): keyof T | undefined {\n return (Object.keys(object) as Array).find(\n (key) => object[key] === value\n )\n}\n\nexport function getPasswordSchema(\n passwordValidation?: PasswordValidation,\n localization?: AuthLocalization\n) {\n let schema = z.string().min(1, {\n message: localization?.PASSWORD_REQUIRED\n })\n if (passwordValidation?.minLength) {\n schema = schema.min(passwordValidation.minLength, {\n message: localization?.PASSWORD_TOO_SHORT\n })\n }\n if (passwordValidation?.maxLength) {\n schema = schema.max(passwordValidation.maxLength, {\n message: localization?.PASSWORD_TOO_LONG\n })\n }\n if (passwordValidation?.regex) {\n schema = schema.regex(passwordValidation.regex, {\n message: localization?.INVALID_PASSWORD\n })\n }\n return schema\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/public/r/view-paths.json b/docs/public/r/view-paths.json new file mode 100644 index 00000000..26c4a0dc --- /dev/null +++ b/docs/public/r/view-paths.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "view-paths", + "type": "registry:lib", + "title": "View Paths", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/view-paths.ts", + "content": "export const authViewPaths = {\n /** @default \"callback\" */\n CALLBACK: \"callback\",\n /** @default \"email-otp\" */\n EMAIL_OTP: \"email-otp\",\n /** @default \"forgot-password\" */\n FORGOT_PASSWORD: \"forgot-password\",\n /** @default \"magic-link\" */\n MAGIC_LINK: \"magic-link\",\n /** @default \"recover-account\" */\n RECOVER_ACCOUNT: \"recover-account\",\n /** @default \"reset-password\" */\n RESET_PASSWORD: \"reset-password\",\n /** @default \"sign-in\" */\n SIGN_IN: \"sign-in\",\n /** @default \"sign-out\" */\n SIGN_OUT: \"sign-out\",\n /** @default \"sign-up\" */\n SIGN_UP: \"sign-up\",\n /** @default \"two-factor\" */\n TWO_FACTOR: \"two-factor\"\n}\n\nexport type AuthViewPaths = typeof authViewPaths\n\n// Account-scoped views (signed-in user)\nexport const accountViewPaths = {\n /** @default \"settings\" */\n SETTINGS: \"settings\",\n /** @default \"security\" */\n SECURITY: \"security\",\n /** @default \"api-keys\" */\n API_KEYS: \"api-keys\",\n /** @default \"organizations\" */\n ORGANIZATIONS: \"organizations\",\n /** @default \"accept-invitation\" */\n ACCEPT_INVITATION: \"accept-invitation\"\n}\n\nexport type AccountViewPaths = typeof accountViewPaths\n\n// Organization-scoped views\nexport const organizationViewPaths = {\n /** @default \"settings\" */\n SETTINGS: \"settings\",\n /** @default \"members\" */\n MEMBERS: \"members\",\n /** @default \"api-keys\" */\n API_KEYS: \"api-keys\"\n}\n\nexport type OrganizationViewPaths = typeof organizationViewPaths\nexport type AuthViewPath = keyof AuthViewPaths\nexport type AccountViewPath = keyof AccountViewPaths\nexport type OrganizationViewPath = keyof OrganizationViewPaths\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/docs/view-paths.ts b/docs/view-paths.ts new file mode 100644 index 00000000..6f32bb79 --- /dev/null +++ b/docs/view-paths.ts @@ -0,0 +1,55 @@ +export const authViewPaths = { + /** @default "callback" */ + CALLBACK: "callback", + /** @default "email-otp" */ + EMAIL_OTP: "email-otp", + /** @default "forgot-password" */ + FORGOT_PASSWORD: "forgot-password", + /** @default "magic-link" */ + MAGIC_LINK: "magic-link", + /** @default "recover-account" */ + RECOVER_ACCOUNT: "recover-account", + /** @default "reset-password" */ + RESET_PASSWORD: "reset-password", + /** @default "sign-in" */ + SIGN_IN: "sign-in", + /** @default "sign-out" */ + SIGN_OUT: "sign-out", + /** @default "sign-up" */ + SIGN_UP: "sign-up", + /** @default "two-factor" */ + TWO_FACTOR: "two-factor" +} + +export type AuthViewPaths = typeof authViewPaths + +// Account-scoped views (signed-in user) +export const accountViewPaths = { + /** @default "settings" */ + SETTINGS: "settings", + /** @default "security" */ + SECURITY: "security", + /** @default "api-keys" */ + API_KEYS: "api-keys", + /** @default "organizations" */ + ORGANIZATIONS: "organizations", + /** @default "accept-invitation" */ + ACCEPT_INVITATION: "accept-invitation" +} + +export type AccountViewPaths = typeof accountViewPaths + +// Organization-scoped views +export const organizationViewPaths = { + /** @default "settings" */ + SETTINGS: "settings", + /** @default "members" */ + MEMBERS: "members", + /** @default "api-keys" */ + API_KEYS: "api-keys" +} + +export type OrganizationViewPaths = typeof organizationViewPaths +export type AuthViewPath = keyof AuthViewPaths +export type AccountViewPath = keyof AccountViewPaths +export type OrganizationViewPath = keyof OrganizationViewPaths diff --git a/package.json b/package.json index 2a1f916b..05e89bed 100644 --- a/package.json +++ b/package.json @@ -1,160 +1,165 @@ { - "name": "@daveyplate/better-auth-ui", - "homepage": "https://better-auth-ui.com", - "version": "3.0.2", - "description": "Plug & play shadcn/ui components for better-auth", - "scripts": { - "build": "tsup --clean --dts && cp src/style.css dist/style.css", - "dev": "tsc-watch", - "prepublishOnly": "rm -rf dist && turbo build" + "name": "@daveyplate/better-auth-ui", + "homepage": "https://better-auth-ui.com", + "version": "3.0.2", + "description": "Plug & play shadcn/ui components for better-auth", + "scripts": { + "build": "tsup --clean --dts && cp src/style.css dist/style.css", + "dev": "tsc-watch", + "prepublishOnly": "rm -rf dist && turbo build", + "generate:registry": "node scripts/generate.mjs", + "registry:generate": "node scripts/generate.mjs", + "registry:build": "shadcn build" + }, + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + "./css": "./dist/style.css", + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } }, - "type": "module", - "main": "./dist/index.cjs", - "module": "./dist/index.js", - "exports": { - "./css": "./dist/style.css", - ".": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" - } - }, - "./server": { - "import": { - "types": "./dist/server.d.ts", - "default": "./dist/server.js" - }, - "require": { - "types": "./dist/server.d.cts", - "default": "./dist/server.cjs" - } - }, - "./tanstack": { - "import": { - "types": "./dist/tanstack.d.ts", - "default": "./dist/tanstack.js" - }, - "require": { - "types": "./dist/tanstack.d.cts", - "default": "./dist/tanstack.cjs" - } - }, - "./instantdb": { - "import": { - "types": "./dist/instantdb.d.ts", - "default": "./dist/instantdb.js" - }, - "require": { - "types": "./dist/instantdb.d.cts", - "default": "./dist/instantdb.cjs" - } - }, - "./triplit": { - "import": { - "types": "./dist/triplit.d.ts", - "default": "./dist/triplit.js" - }, - "require": { - "types": "./dist/triplit.d.cts", - "default": "./dist/triplit.cjs" - } - } + "./server": { + "import": { + "types": "./dist/server.d.ts", + "default": "./dist/server.js" + }, + "require": { + "types": "./dist/server.d.cts", + "default": "./dist/server.cjs" + } }, - "files": [ - "src", - "dist" - ], - "keywords": [ - "typescript", - "react", - "better-auth", - "shadcn", - "nextjs" - ], - "author": "daveycodez", - "license": "MIT", - "devDependencies": { - "@biomejs/biome": "2.1.3", - "@radix-ui/react-checkbox": "^1.3.2", - "@radix-ui/react-context": "^1.1.2", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-label": "^2.1.7", - "@radix-ui/react-primitive": "^2.1.3", - "@radix-ui/react-separator": "^1.1.7", - "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-use-callback-ref": "^1.1.1", - "@radix-ui/react-use-layout-effect": "^1.1.1", - "@tanstack/react-query": "^5.84.1", - "@types/node": "^24.2.0", - "@types/react": "^19.1.9", - "@types/react-dom": "^19.1.7", - "@types/react-google-recaptcha": "^2.1.9", - "better-auth": "^1.3.4", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "esbuild-plugin-preserve-directives": "^0.0.11", - "lucide-react": "^0.536.0", - "react-router": "^7.7.1", - "tailwind-merge": "^3.3.1", - "tailwindcss-animate": "^1.0.7", - "tsc-watch": "^7.1.1", - "tsup": "^8.5.0", - "tsx": "^4.20.3", - "turbo": "^2.5.5", - "typescript": "^5.9.2" + "./tanstack": { + "import": { + "types": "./dist/tanstack.d.ts", + "default": "./dist/tanstack.js" + }, + "require": { + "types": "./dist/tanstack.d.cts", + "default": "./dist/tanstack.cjs" + } }, - "peerDependencies": { - "@daveyplate/better-auth-tanstack": "^1.3.6", - "@hookform/resolvers": ">=5.0.0", - "@instantdb/react": ">=0.18.0", - "@marsidev/react-turnstile": ">=1.1.0", - "@radix-ui/react-avatar": ">=1.1.0", - "@radix-ui/react-checkbox": ">=1.1.0", - "@radix-ui/react-context": ">=1.1.0", - "@radix-ui/react-dialog": ">=1.1.0", - "@radix-ui/react-dropdown-menu": ">=2.1.0", - "@radix-ui/react-label": ">=2.1.0", - "@radix-ui/react-primitive": ">=2.0.0", - "@radix-ui/react-select": ">=2.2.0", - "@radix-ui/react-separator": ">=1.1.0", - "@radix-ui/react-slot": ">=1.1.0", - "@radix-ui/react-tabs": ">=1.1.0", - "@radix-ui/react-use-callback-ref": ">=1.1.0", - "@radix-ui/react-use-layout-effect": ">=1.1.0", - "@tanstack/react-query": ">=5.66.0", - "@triplit/client": ">=1.0.0", - "@triplit/react": ">=1.0.0", - "better-auth": "^1.3.4", - "class-variance-authority": ">=0.7.0", - "clsx": ">=2.1.0", - "input-otp": ">=1.4.0", - "lucide-react": ">=0.469.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0", - "react-hook-form": ">=7.55.0", - "sonner": ">=1.7.0", - "tailwind-merge": ">=2.6.0", - "tailwindcss": ">=3.0.0", - "zod": ">=3.24.0" + "./instantdb": { + "import": { + "types": "./dist/instantdb.d.ts", + "default": "./dist/instantdb.js" + }, + "require": { + "types": "./dist/instantdb.d.cts", + "default": "./dist/instantdb.cjs" + } }, - "dependencies": { - "@better-fetch/fetch": "^1.1.18", - "@hcaptcha/react-hcaptcha": "^1.12.0", - "@noble/hashes": "^1.8.0", - "@react-email/components": "^0.5.0", - "@wojtekmaj/react-recaptcha-v3": "^0.1.4", - "react-google-recaptcha": "^3.1.0", - "react-qr-code": "^2.0.18", - "ua-parser-js": "^2.0.4", - "vaul": "^1.1.2" - }, - "pnpm": { - "overrides": {} - }, - "packageManager": "pnpm@10.14.0" + "./triplit": { + "import": { + "types": "./dist/triplit.d.ts", + "default": "./dist/triplit.js" + }, + "require": { + "types": "./dist/triplit.d.cts", + "default": "./dist/triplit.cjs" + } + } + }, + "files": [ + "src", + "dist" + ], + "keywords": [ + "typescript", + "react", + "better-auth", + "shadcn", + "nextjs" + ], + "author": "daveycodez", + "license": "MIT", + "devDependencies": { + "@biomejs/biome": "2.1.3", + "@radix-ui/react-checkbox": "^1.3.2", + "@radix-ui/react-context": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-primitive": "^2.1.3", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.12", + "@radix-ui/react-use-callback-ref": "^1.1.1", + "@radix-ui/react-use-layout-effect": "^1.1.1", + "@tanstack/react-query": "^5.84.1", + "@types/node": "^24.2.0", + "@types/react": "^19.1.9", + "@types/react-dom": "^19.1.7", + "@types/react-google-recaptcha": "^2.1.9", + "better-auth": "^1.3.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "esbuild-plugin-preserve-directives": "^0.0.11", + "glob": "^11.0.3", + "lucide-react": "^0.536.0", + "react-router": "^7.7.1", + "tailwind-merge": "^3.3.1", + "tailwindcss-animate": "^1.0.7", + "tsc-watch": "^7.1.1", + "tsup": "^8.5.0", + "tsx": "^4.20.3", + "turbo": "^2.5.5", + "typescript": "^5.9.2" + }, + "peerDependencies": { + "@daveyplate/better-auth-tanstack": "^1.3.6", + "@hookform/resolvers": ">=5.0.0", + "@instantdb/react": ">=0.18.0", + "@marsidev/react-turnstile": ">=1.1.0", + "@radix-ui/react-avatar": ">=1.1.0", + "@radix-ui/react-checkbox": ">=1.1.0", + "@radix-ui/react-context": ">=1.1.0", + "@radix-ui/react-dialog": ">=1.1.0", + "@radix-ui/react-dropdown-menu": ">=2.1.0", + "@radix-ui/react-label": ">=2.1.0", + "@radix-ui/react-primitive": ">=2.0.0", + "@radix-ui/react-select": ">=2.2.0", + "@radix-ui/react-separator": ">=1.1.0", + "@radix-ui/react-slot": ">=1.1.0", + "@radix-ui/react-tabs": ">=1.1.0", + "@radix-ui/react-use-callback-ref": ">=1.1.0", + "@radix-ui/react-use-layout-effect": ">=1.1.0", + "@tanstack/react-query": ">=5.66.0", + "@triplit/client": ">=1.0.0", + "@triplit/react": ">=1.0.0", + "better-auth": "^1.3.4", + "class-variance-authority": ">=0.7.0", + "clsx": ">=2.1.0", + "input-otp": ">=1.4.0", + "lucide-react": ">=0.469.0", + "react": ">=18.0.0", + "react-dom": ">=18.0.0", + "react-hook-form": ">=7.55.0", + "sonner": ">=1.7.0", + "tailwind-merge": ">=2.6.0", + "tailwindcss": ">=3.0.0", + "zod": ">=3.24.0" + }, + "dependencies": { + "@better-fetch/fetch": "^1.1.18", + "@hcaptcha/react-hcaptcha": "^1.12.0", + "@noble/hashes": "^1.8.0", + "@react-email/components": "^0.5.0", + "@wojtekmaj/react-recaptcha-v3": "^0.1.4", + "react-google-recaptcha": "^3.1.0", + "react-qr-code": "^2.0.18", + "shadcn": "2.9.3-canary.0", + "ua-parser-js": "^2.0.4", + "vaul": "^1.1.2" + }, + "pnpm": { + "overrides": {} + }, + "packageManager": "pnpm@10.14.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab4ca824..0cf54772 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,9 @@ importers: react-qr-code: specifier: ^2.0.18 version: 2.0.18(react@19.1.0) + shadcn: + specifier: 2.9.3-canary.0 + version: 2.9.3-canary.0(@types/node@24.2.0)(typescript@5.9.2) sonner: specifier: '>=1.7.0' version: 2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -144,6 +147,9 @@ importers: esbuild-plugin-preserve-directives: specifier: ^0.0.11 version: 0.0.11(esbuild@0.25.8) + glob: + specifier: ^11.0.3 + version: 11.0.3 lucide-react: specifier: ^0.536.0 version: 0.536.0(react@19.1.0) @@ -174,10 +180,129 @@ importers: packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/ni@23.3.1': + resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} + hasBin: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.28.2': resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@better-auth/utils@0.2.5': resolution: {integrity: sha512-uI2+/8h/zVsH8RrYdG8eUErbuGBk16rZKQfz8CjxQOyCE6v7BqFYEbFwvOkvl1KbUdxhqOnXp78+uE5h8qVEgQ==} @@ -237,6 +362,15 @@ packages: cpu: [x64] os: [win32] + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@daveyplate/better-auth-tanstack@1.3.6': resolution: {integrity: sha512-GvIGdbjRMZCEfAffU7LeWpGpie4vSli8V9jmNFCQOziZZMEFbO4cd53HBFmAushC9oEYIyhSNZBgV2ADzW94Ww==} peerDependencies: @@ -434,6 +568,37 @@ packages: peerDependencies: react-hook-form: ^7.55.0 + '@inquirer/confirm@5.1.14': + resolution: {integrity: sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.15': + resolution: {integrity: sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@instantdb/core@0.19.7': resolution: {integrity: sha512-f4NOJliPS8BytQ9blU4Acu1sNvGqRwkddX5RyLxpHazpOBYvDru7RytsG7cviG5ytPpK1D0UnQdtNexKtaJBLw==} @@ -442,6 +607,14 @@ packages: peerDependencies: react: '>=16' + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -468,6 +641,14 @@ packages: react: ^17.0.2 || ^18.0.0 || ^19.0 react-dom: ^17.0.2 || ^18.0.0 || ^19.0 + '@modelcontextprotocol/sdk@1.17.3': + resolution: {integrity: sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==} + engines: {node: '>=18'} + + '@mswjs/interceptors@0.39.6': + resolution: {integrity: sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==} + engines: {node: '>=18'} + '@noble/ciphers@0.6.0': resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} @@ -475,6 +656,27 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@peculiar/asn1-android@2.4.0': resolution: {integrity: sha512-YFueREq97CLslZZBI8dKzis7jMfEHSLxM+nr0Zdx1POiXFLjqqwoY5s0F1UimdBiEw/iKlHey2m56MRDv7Jtyg==} @@ -1254,6 +1456,12 @@ packages: peerDependencies: react: '*' + '@ts-morph/common@0.19.0': + resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1282,6 +1490,12 @@ packages: '@types/react@19.1.9': resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@wojtekmaj/react-recaptcha-v3@0.1.4': resolution: {integrity: sha512-zszMOdgI+y1Dz3496pRFr3t68n9+OmX/puLQNnOBDC7WrjM+nOKGyjIMCTe+3J14KDvzcxETeiglyDMGl0Yh/Q==} peerDependencies: @@ -1292,11 +1506,26 @@ packages: '@types/react': optional: true + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1316,6 +1545,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} @@ -1328,12 +1560,19 @@ packages: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + better-auth@1.3.4: resolution: {integrity: sha512-JbZYam6Cs3Eu5CSoMK120zSshfaKvrCftSo/+v7524H1RvhryQ7UtMbzagBcXj0Digjj8hZtVkkR4tTZD/wK2g==} peerDependencies: @@ -1348,15 +1587,38 @@ packages: better-call@1.0.13: resolution: {integrity: sha512-auqdP9lnNOli9tKpZIiv0nEIwmmyaD/RotM3Mucql+Ef88etoZi/t7Ph5LjlmZt/hiSahhNTt6YVnx6++rziXA==} + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.2: + resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.18' + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1365,6 +1627,21 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001735: + resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} + + chalk@5.5.0: + resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1372,10 +1649,33 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1390,6 +1690,10 @@ packages: comlink@4.4.2: resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1401,6 +1705,25 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} @@ -1412,6 +1735,19 @@ packages: core-js@3.42.0: resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1419,6 +1755,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1432,6 +1772,9 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -1439,12 +1782,20 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + detect-europe-js@0.1.2: resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1468,6 +1819,12 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.202: + resolution: {integrity: sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg==} + elen@1.0.10: resolution: {integrity: sha512-ZL799/V/kzxYJ6Wlfktreq6qQWfGc3VkGUQJW5lZQ8/MhsQiKTAwERPfhEwIsV2movRGe2DfV7H2MjRw76Z7Wg==} @@ -1477,10 +1834,17 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1508,12 +1872,63 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + eventsource-parser@3.0.3: + resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==} + engines: {node: '>=20.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.4.6: resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: @@ -1522,6 +1937,18 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -1533,9 +1960,25 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1544,6 +1987,14 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1552,21 +2003,45 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1579,6 +2054,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -1589,19 +2067,90 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@6.2.1: + resolution: {integrity: sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==} + engines: {node: '>= 14'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + input-otp@1.4.2: resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} peerDependencies: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-standalone-pwa@0.1.1: resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -1612,6 +2161,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} @@ -1622,6 +2175,37 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + kysely@0.28.4: resolution: {integrity: sha512-pfQj8/Bo3KSzC1HIZB5MeeYRWcDmx1ZZv8H25LsyeygqXE+gfsbUAgPT1GSYZFctB1cdOVlv+OifuCls2mQSnw==} engines: {node: '>=20.0.0'} @@ -1643,6 +2227,10 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -1650,6 +2238,13 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lucide-react@0.536.0: resolution: {integrity: sha512-2PgvNa9v+qz4Jt/ni8vPLt4jwoFybXHuubQT8fv4iCW5TjDxkbZjNZZHa485ad73NSEn/jdsEtU57eE1g+ma8A==} peerDependencies: @@ -1675,32 +2270,97 @@ packages: peerDependencies: react: ^18.0 || ^19.0 + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.10.5: + resolution: {integrity: sha512-0EsQCrCI1HbhpBWd89DvmxY6plmvrM96b0sCIztnvcNHQbXn5vqwm1KlXslo6u4wN9LFGLC1WFjjgljcQhe40A==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + mutative@1.1.0: resolution: {integrity: sha512-2PJADREjOusk3iJkD3rXV2YjAxTuaLxdfqtqTEt6vcY07LtEBR1seHuBHXWEIuscqRDGvbauYPs+A4Rj/KTczQ==} engines: {node: '>=14.0'} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -1718,9 +2378,18 @@ packages: resolution: {integrity: sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==} engines: {node: ^18.0.0 || >=20.0.0} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + node-cleanup@2.1.2: resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -1730,24 +2399,95 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1760,6 +2500,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -1768,6 +2512,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -1802,14 +2550,25 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + ps-tree@1.2.0: resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} engines: {node: '>= 0.10'} hasBin: true + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1824,6 +2583,24 @@ packages: qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + react-async-script@1.2.0: resolution: {integrity: sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==} peerDependencies: @@ -1910,10 +2687,29 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1921,6 +2717,14 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rollup@4.46.2: resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1929,15 +2733,47 @@ packages: rou3@0.5.1: resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shadcn@2.9.3-canary.0: + resolution: {integrity: sha512-2oOusRSdNZoy8zzj6TlwWMlL6IhVZTcfPkqYXNLPAANj92J42zJ5G2QqIep/rKbrfRwFO8QRDq7evVdmYsC+1w==} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1946,10 +2782,32 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sonner@2.0.3: resolution: {integrity: sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==} peerDependencies: @@ -1963,6 +2821,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -1971,9 +2833,24 @@ packages: split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stream-combiner@0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -1986,6 +2863,13 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1994,6 +2878,14 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2024,6 +2916,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -2031,6 +2926,18 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -2044,6 +2951,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-morph@18.0.0: + resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==} + tsc-watch@7.1.1: resolution: {integrity: sha512-r6t37Dkk4vK44HwxOe+OzjpE/gDamZAwqXhtcAJD/hPVblcjJK45NxbK0HcDASXG0U4pEnCh640JZbeDVSC6yA==} engines: {node: '>=12.12.0'} @@ -2051,6 +2961,10 @@ packages: peerDependencies: typescript: '*' + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2112,6 +3026,18 @@ packages: resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==} hasBin: true + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -2138,6 +3064,30 @@ packages: undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -2163,10 +3113,17 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vaul@1.1.2: resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} peerDependencies: @@ -2176,6 +3133,13 @@ packages: warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} @@ -2196,6 +3160,10 @@ packages: engines: {node: '>= 8'} hasBin: true + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2204,6 +3172,33 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + zod@3.24.4: resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} @@ -2212,8 +3207,177 @@ packages: snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@antfu/ni@23.3.1': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.28.2': {} + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@better-auth/utils@0.2.5': dependencies: typescript: 5.9.2 @@ -2256,6 +3420,19 @@ snapshots: '@biomejs/cli-win32-x64@2.1.3': optional: true + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.2 + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + '@daveyplate/better-auth-tanstack@1.3.6(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.83.0(react@19.1.0))(better-auth@1.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@tanstack/query-core': 5.83.0 @@ -2375,16 +3552,48 @@ snapshots: '@standard-schema/utils': 0.3.0 react-hook-form: 7.56.4(react@19.1.0) - '@instantdb/core@0.19.7': + '@inquirer/confirm@5.1.14(@types/node@24.2.0)': dependencies: - mutative: 1.1.0 - uuid: 9.0.1 + '@inquirer/core': 10.1.15(@types/node@24.2.0) + '@inquirer/type': 3.0.8(@types/node@24.2.0) + optionalDependencies: + '@types/node': 24.2.0 + + '@inquirer/core@10.1.15(@types/node@24.2.0)': + dependencies: + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.2.0) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.2.0 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/type@3.0.8(@types/node@24.2.0)': + optionalDependencies: + '@types/node': 24.2.0 + + '@instantdb/core@0.19.7': + dependencies: + mutative: 1.1.0 + uuid: 9.0.1 '@instantdb/react@0.19.7(react@19.1.0)': dependencies: '@instantdb/core': 0.19.7 react: 19.1.0 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -2415,10 +3624,57 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + '@modelcontextprotocol/sdk@1.17.3': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.3 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.24.4 + zod-to-json-schema: 3.24.6(zod@3.24.4) + transitivePeerDependencies: + - supports-color + + '@mswjs/interceptors@0.39.6': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@noble/ciphers@0.6.0': {} '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + '@peculiar/asn1-android@2.4.0': dependencies: '@peculiar/asn1-schema': 2.4.0 @@ -3242,6 +4498,15 @@ snapshots: - lmdb - typescript + '@ts-morph/common@0.19.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 7.4.6 + mkdirp: 2.1.6 + path-browserify: 1.0.1 + + '@types/cookie@0.6.0': {} + '@types/estree@1.0.8': {} '@types/node-fetch@2.6.13': @@ -3275,6 +4540,10 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/statuses@2.0.6': {} + + '@types/tough-cookie@4.0.5': {} + '@wojtekmaj/react-recaptcha-v3@0.1.4(@types/react@19.1.9)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 @@ -3283,8 +4552,26 @@ snapshots: optionalDependencies: '@types/react': 19.1.9 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn@8.15.0: {} + agent-base@7.1.4: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -3297,6 +4584,8 @@ snapshots: any-promise@1.3.0: {} + argparse@2.0.1: {} + aria-hidden@1.2.4: dependencies: tslib: 2.8.1 @@ -3311,10 +4600,16 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + asynckit@0.4.0: {} balanced-match@1.0.2: {} + base64-js@1.5.1: {} + better-auth@1.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@better-auth/utils': 0.2.5 @@ -3340,15 +4635,53 @@ snapshots: set-cookie-parser: 2.7.1 uncrypto: 0.1.3 + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.2: + dependencies: + caniuse-lite: 1.0.30001735 + electron-to-chromium: 1.5.202 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.2) + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-require@5.1.0(esbuild@0.25.8): dependencies: esbuild: 0.25.8 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -3356,6 +4689,17 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001735: {} + + chalk@5.5.0: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -3364,8 +4708,26 @@ snapshots: dependencies: clsx: 2.1.1 + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + clsx@2.1.1: {} + code-block-writer@12.0.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3378,12 +4740,26 @@ snapshots: comlink@4.4.2: {} + commander@10.0.1: {} + commander@4.1.1: {} confbox@0.1.8: {} consola@3.4.2: {} + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + cookie@1.0.2: {} copy-anything@3.0.5: @@ -3392,6 +4768,20 @@ snapshots: core-js@3.42.0: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@8.3.6(typescript@5.9.2): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3400,20 +4790,30 @@ snapshots: csstype@3.1.3: {} + data-uri-to-buffer@4.0.1: {} + debug@4.4.1: dependencies: ms: 2.1.3 deepmerge@4.3.1: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + defu@6.1.4: {} delayed-stream@1.0.0: {} + depd@2.0.0: {} + detect-europe-js@0.1.2: {} detect-node-es@1.1.0: {} + diff@5.2.0: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -3442,14 +4842,24 @@ snapshots: eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + + electron-to-chromium@1.5.202: {} + elen@1.0.10: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + entities@4.5.0: {} + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3498,6 +4908,14 @@ snapshots: '@esbuild/win32-ia32': 0.25.8 '@esbuild/win32-x64': 0.25.8 + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + esprima@4.0.1: {} + + etag@1.8.1: {} + event-stream@3.3.4: dependencies: duplexer: 0.1.2 @@ -3508,12 +4926,102 @@ snapshots: stream-combiner: 0.0.4 through: 2.3.8 + eventsource-parser@3.0.3: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.3 + + execa@7.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.17 @@ -3533,13 +5041,31 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + from@0.1.7: {} + fs-extra@11.3.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + fsevents@2.3.3: optional: true function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3555,15 +5081,23 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@6.0.1: {} + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -3573,8 +5107,21 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + + graphql@16.11.0: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -3585,6 +5132,8 @@ snapshots: dependencies: function-bind: 1.1.2 + headers-polyfill@4.0.3: {} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -3604,15 +5153,71 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@6.2.1: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@4.3.1: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inherits@2.0.4: {} + input-otp@1.4.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@2.0.0: {} + + is-node-process@1.2.0: {} + + is-number@7.0.0: {} + + is-obj@3.0.0: {} + + is-promise@4.0.0: {} + + is-regexp@3.1.0: {} + is-standalone-pwa@0.1.1: {} + is-stream@3.0.0: {} + + is-unicode-supported@1.3.0: {} + is-what@4.1.16: {} isexe@2.0.0: {} @@ -3623,12 +5228,38 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jose@5.10.0: {} joycon@3.1.1: {} js-tokens@4.0.0: {} + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + kysely@0.28.4: {} leac@0.6.0: {} @@ -3641,12 +5272,23 @@ snapshots: lodash.sortby@4.7.0: {} + log-symbols@5.1.0: + dependencies: + chalk: 5.5.0 + is-unicode-supported: 1.3.0 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lucide-react@0.536.0(react@19.1.0): dependencies: react: 19.1.0 @@ -3666,18 +5308,53 @@ snapshots: marked: 7.0.4 react: 19.1.0 + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} + mkdirp@2.1.6: {} + mlly@1.7.4: dependencies: acorn: 8.15.0 @@ -3687,43 +5364,145 @@ snapshots: ms@2.1.3: {} + msw@2.10.5(@types/node@24.2.0)(typescript@5.9.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.14(@types/node@24.2.0) + '@mswjs/interceptors': 0.39.6 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.11.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.41.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@types/node' + mutative@1.1.0: {} + mute-stream@2.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: - optional: true + nanoid@3.3.11: {} nanoid@5.1.5: {} nanostores@0.11.4: {} + negotiator@1.0.0: {} + node-cleanup@2.1.2: {} + node-domexception@1.0.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-releases@2.0.19: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + ora@6.3.1: + dependencies: + chalk: 5.5.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.0 + wcwidth: 1.0.1 + + outvariant@1.4.3: {} + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parseley@0.12.1: dependencies: leac: 0.6.0 peberminta: 0.9.0 + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + path-key@3.1.1: {} + path-key@4.0.0: {} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.2.0: {} + + path-type@4.0.0: {} + pathe@2.0.3: {} pause-stream@0.0.11: @@ -3734,10 +5513,14 @@ snapshots: picocolors@1.1.1: {} + picomatch@2.3.1: {} + picomatch@4.0.3: {} pirates@4.0.7: {} + pkce-challenge@5.0.0: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -3756,22 +5539,35 @@ snapshots: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - optional: true prettier@3.6.2: {} prismjs@1.30.0: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + ps-tree@1.2.0: dependencies: event-stream: 3.3.4 + psl@1.15.0: + dependencies: + punycode: 2.3.1 + punycode@2.3.1: {} pvtsutils@1.3.6: @@ -3782,6 +5578,23 @@ snapshots: qr.js@0.0.0: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + react-async-script@1.2.0(react@19.1.0): dependencies: hoist-non-react-statics: 3.3.2 @@ -3879,12 +5692,39 @@ snapshots: react@19.1.0: {} + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + require-directory@2.1.1: {} + + requires-port@1.0.0: {} + + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.1.0: {} + rollup@4.46.2: dependencies: '@types/estree': 1.0.8 @@ -3913,22 +5753,133 @@ snapshots: rou3@0.5.1: {} + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + scheduler@0.26.0: {} selderee@0.11.0: dependencies: parseley: 0.12.1 + semver@6.3.1: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-cookie-parser@2.7.1: {} + setprototypeof@1.2.0: {} + + shadcn@2.9.3-canary.0(@types/node@24.2.0)(typescript@5.9.2): + dependencies: + '@antfu/ni': 23.3.1 + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + '@modelcontextprotocol/sdk': 1.17.3 + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.9.2) + deepmerge: 4.3.1 + diff: 5.2.0 + execa: 7.2.0 + fast-glob: 3.3.3 + fs-extra: 11.3.1 + https-proxy-agent: 6.2.1 + kleur: 4.1.5 + msw: 2.10.5(@types/node@24.2.0)(typescript@5.9.2) + node-fetch: 3.3.2 + ora: 6.3.1 + postcss: 8.4.31 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + ts-morph: 18.0.0 + tsconfig-paths: 4.2.0 + zod: 3.24.4 + zod-to-json-schema: 3.24.6(zod@3.24.4) + transitivePeerDependencies: + - '@types/node' + - supports-color + - typescript + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + sonner@2.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 @@ -3936,8 +5887,9 @@ snapshots: sorted-btree@1.8.1: {} - source-map-js@1.2.1: - optional: true + source-map-js@1.2.1: {} + + source-map@0.6.1: {} source-map@0.8.0-beta.0: dependencies: @@ -3947,10 +5899,20 @@ snapshots: dependencies: through: 2.3.8 + statuses@2.0.1: {} + + statuses@2.0.2: {} + + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + stream-combiner@0.0.4: dependencies: duplexer: 0.1.2 + strict-event-emitter@0.5.1: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -3965,6 +5927,16 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3973,6 +5945,10 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.12 @@ -4003,6 +5979,8 @@ snapshots: through@2.3.8: {} + tiny-invariant@1.3.3: {} + tinyexec@0.3.2: {} tinyglobby@0.2.14: @@ -4010,6 +5988,19 @@ snapshots: fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + tr46@0.0.3: {} tr46@1.0.1: @@ -4020,6 +6011,11 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-morph@18.0.0: + dependencies: + '@ts-morph/common': 0.19.0 + code-block-writer: 12.0.0 + tsc-watch@7.1.1(typescript@5.9.2): dependencies: cross-spawn: 7.0.6 @@ -4028,6 +6024,12 @@ snapshots: string-argv: 0.3.2 typescript: 5.9.2 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} tsup@8.5.0(postcss@8.4.31)(tsx@4.20.3)(typescript@5.9.2): @@ -4092,6 +6094,16 @@ snapshots: turbo-windows-64: 2.5.5 turbo-windows-arm64: 2.5.5 + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typescript@5.8.3: {} typescript@5.9.2: {} @@ -4114,6 +6126,27 @@ snapshots: undici-types@7.10.0: {} + universalify@0.2.0: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.25.2): + dependencies: + browserslist: 4.25.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + use-callback-ref@1.3.3(@types/react@19.1.8)(react@19.1.0): dependencies: react: 19.1.0 @@ -4148,8 +6181,12 @@ snapshots: dependencies: react: 19.1.0 + util-deprecate@1.0.2: {} + uuid@9.0.1: {} + vary@1.1.2: {} + vaul@1.1.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -4163,6 +6200,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-streams-polyfill@3.3.3: {} + web-worker@1.5.0: {} webidl-conversions@3.0.1: {} @@ -4184,6 +6227,12 @@ snapshots: dependencies: isexe: 2.0.0 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -4196,6 +6245,30 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yoctocolors-cjs@2.1.2: {} + + zod-to-json-schema@3.24.6(zod@3.24.4): + dependencies: + zod: 3.24.4 + zod@3.24.4: {} zod@4.0.15: {} diff --git a/registry.json b/registry.json new file mode 100644 index 00000000..64205275 --- /dev/null +++ b/registry.json @@ -0,0 +1,3567 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "local", + "homepage": "https://better-auth-ui.com", + "items": [ + { + "name": "accept-invitation-card", + "title": "Accept Invitation Card", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-authenticate.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/accept-invitation-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "account-cell", + "title": "Account Cell", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/account-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "account-options", + "title": "Account Options", + "description": "", + "type": "registry:file", + "target": "types/account-options.ts", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/view-paths.json"], + "files": [ + { + "path": "src/types/account-options.ts", + "type": "registry:file", + "target": "types/account-options.ts" + } + ] + }, + { + "name": "account-settings-cards", + "title": "Account Settings Cards", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/accounts-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-email-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-avatar-card.json", + "http://localhost:3000/r/update-field-card.json", + "http://localhost:3000/r/update-name-card.json", + "http://localhost:3000/r/update-username-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account-settings-cards.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "account-view", + "title": "Account View", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/account-settings-cards.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organizations-card.json", + "http://localhost:3000/r/security-settings-cards.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-invitations-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/account/account-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "accounts-card", + "title": "Accounts Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/account-cell.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/accounts-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "additional-fields", + "title": "Additional Fields", + "description": "", + "type": "registry:file", + "target": "types/additional-fields.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/additional-fields.ts", + "type": "registry:file", + "target": "types/additional-fields.ts" + } + ] + }, + { + "name": "admin-error-codes", + "title": "Admin Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/admin-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/admin-error-codes.ts", + "type": "registry:file", + "target": "localization/admin-error-codes.ts" + } + ] + }, + { + "name": "alert", + "title": "Alert", + "description": "", + "type": "registry:ui", + "dependencies": ["class-variance-authority"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/alert.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "anonymous-error-codes", + "title": "Anonymous Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/anonymous-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/anonymous-error-codes.ts", + "type": "registry:file", + "target": "localization/anonymous-error-codes.ts" + } + ] + }, + { + "name": "any-auth-client", + "title": "Any Auth Client", + "description": "", + "type": "registry:file", + "target": "types/any-auth-client.ts", + "dependencies": ["better-auth"], + "registryDependencies": [], + "files": [ + { + "path": "src/types/any-auth-client.ts", + "type": "registry:file", + "target": "types/any-auth-client.ts" + } + ] + }, + { + "name": "api-key", + "title": "Api Key", + "description": "", + "type": "registry:file", + "target": "types/api-key.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/api-key.ts", + "type": "registry:file", + "target": "types/api-key.ts" + } + ] + }, + { + "name": "api-key-cell", + "title": "Api Key Cell", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/api-key-delete-dialog.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "api-key-delete-dialog", + "title": "Api Key Delete Dialog", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-delete-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "api-key-display-dialog", + "title": "Api Key Display Dialog", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-display-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "api-key-error-codes", + "title": "Api Key Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/api-key-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/api-key-error-codes.ts", + "type": "registry:file", + "target": "localization/api-key-error-codes.ts" + } + ] + }, + { + "name": "api-keys-card", + "title": "Api Keys Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/api-key-cell.json", + "http://localhost:3000/r/api-key-display-dialog.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-api-key-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-keys-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-callback", + "title": "Auth Callback", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/auth-callback.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-client", + "title": "Auth Client", + "description": "", + "type": "registry:file", + "target": "types/auth-client.ts", + "dependencies": ["better-auth"], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-client.ts", + "type": "registry:file", + "target": "types/auth-client.ts" + } + ] + }, + { + "name": "auth-data-cache", + "title": "Auth Data Cache", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/auth-data-cache.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "auth-form", + "title": "Auth Form", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/email-otp-form.json", + "http://localhost:3000/r/forgot-password-form.json", + "http://localhost:3000/r/magic-link-form.json", + "http://localhost:3000/r/recover-account-form.json", + "http://localhost:3000/r/reset-password-form.json", + "http://localhost:3000/r/sign-in-form.json", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/sign-up-form.json", + "http://localhost:3000/r/two-factor-form.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-hooks", + "title": "Auth Hooks", + "description": "", + "type": "registry:file", + "target": "types/auth-hooks.ts", + "dependencies": ["@better-fetch/fetch", "better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/invitation.json", + "http://localhost:3000/r/refetch.json" + ], + "files": [ + { + "path": "src/types/auth-hooks.ts", + "type": "registry:file", + "target": "types/auth-hooks.ts" + } + ] + }, + { + "name": "auth-loading", + "title": "Auth Loading", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "files": [ + { + "path": "src/components/auth-loading.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-localization", + "title": "Auth Localization", + "description": "", + "type": "registry:file", + "target": "localization/auth-localization.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/admin-error-codes.json", + "http://localhost:3000/r/anonymous-error-codes.json", + "http://localhost:3000/r/api-key-error-codes.json", + "http://localhost:3000/r/base-error-codes.json", + "http://localhost:3000/r/captcha-error-codes.json", + "http://localhost:3000/r/email-otp-error-codes.json", + "http://localhost:3000/r/generic-oauth-error-codes.json", + "http://localhost:3000/r/haveibeenpwned-error-codes.json", + "http://localhost:3000/r/multi-session-error-codes.json", + "http://localhost:3000/r/organization-error-codes.json", + "http://localhost:3000/r/passkey-error-codes.json", + "http://localhost:3000/r/phone-number-error-codes.json", + "http://localhost:3000/r/stripe-localization.json", + "http://localhost:3000/r/two-factor-error-codes.json", + "http://localhost:3000/r/username-error-codes.json" + ], + "files": [ + { + "path": "src/localization/auth-localization.ts", + "type": "registry:file", + "target": "localization/auth-localization.ts" + } + ] + }, + { + "name": "auth-mutators", + "title": "Auth Mutators", + "description": "", + "type": "registry:file", + "target": "types/auth-mutators.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-mutators.ts", + "type": "registry:file", + "target": "types/auth-mutators.ts" + } + ] + }, + { + "name": "auth-ui-provider", + "title": "Auth Ui Provider", + "description": "", + "type": "registry:lib", + "dependencies": ["sonner"], + "registryDependencies": [ + "http://localhost:3000/r/account-options.json", + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/avatar-options.json", + "http://localhost:3000/r/captcha-options.json", + "http://localhost:3000/r/credentials-options.json", + "http://localhost:3000/r/delete-user-options.json", + "http://localhost:3000/r/generic-oauth-options.json", + "http://localhost:3000/r/gravatar-options.json", + "http://localhost:3000/r/link.json", + "http://localhost:3000/r/organization-options.json", + "http://localhost:3000/r/organization-refetcher.json", + "http://localhost:3000/r/recaptcha-v3.json", + "http://localhost:3000/r/render-toast.json", + "http://localhost:3000/r/sign-up-options.json", + "http://localhost:3000/r/social-options.json", + "http://localhost:3000/r/use-auth-data.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/lib/auth-ui-provider.tsx", + "type": "registry:lib" + } + ] + }, + { + "name": "auth-ui-provider-tanstack", + "title": "Auth Ui Provider Tanstack", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-tanstack-options.json" + ], + "files": [ + { + "path": "src/lib/tanstack/auth-ui-provider-tanstack.tsx", + "type": "registry:lib" + } + ] + }, + { + "name": "auth-view", + "title": "Auth View", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/email-otp-button.json", + "http://localhost:3000/r/magic-link-button.json", + "http://localhost:3000/r/one-tap.json", + "http://localhost:3000/r/passkey-button.json", + "http://localhost:3000/r/provider-button.json", + "separator", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "avatar", + "title": "Avatar", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-avatar"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/avatar.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "avatar-options", + "title": "Avatar Options", + "description": "", + "type": "registry:file", + "target": "types/avatar-options.ts", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/image.json"], + "files": [ + { + "path": "src/types/avatar-options.ts", + "type": "registry:file", + "target": "types/avatar-options.ts" + } + ] + }, + { + "name": "backup-codes-dialog", + "title": "Backup Codes Dialog", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/backup-codes-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "base-error-codes", + "title": "Base Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/base-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/base-error-codes.ts", + "type": "registry:file", + "target": "localization/base-error-codes.ts" + } + ] + }, + { + "name": "button", + "title": "Button", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-slot", "class-variance-authority"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/button.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "captcha", + "title": "Captcha", + "description": "", + "type": "registry:component", + "dependencies": ["@hcaptcha/react-hcaptcha", "@marsidev/react-turnstile"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/recaptcha-badge.json", + "http://localhost:3000/r/recaptcha-v2.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/captcha.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "captcha-error-codes", + "title": "Captcha Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/captcha-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/captcha-error-codes.ts", + "type": "registry:file", + "target": "localization/captcha-error-codes.ts" + } + ] + }, + { + "name": "captcha-options", + "title": "Captcha Options", + "description": "", + "type": "registry:file", + "target": "types/captcha-options.ts", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/captcha-provider.json"], + "files": [ + { + "path": "src/types/captcha-options.ts", + "type": "registry:file", + "target": "types/captcha-options.ts" + } + ] + }, + { + "name": "captcha-provider", + "title": "Captcha Provider", + "description": "", + "type": "registry:file", + "target": "types/captcha-provider.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/captcha-provider.ts", + "type": "registry:file", + "target": "types/captcha-provider.ts" + } + ] + }, + { + "name": "card", + "title": "Card", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/card.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "change-email-card", + "title": "Change Email Card", + "description": "", + "type": "registry:component", + "dependencies": ["@hookform/resolvers", "react-hook-form", "zod"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-email-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "change-password-card", + "title": "Change Password Card", + "description": "", + "type": "registry:component", + "dependencies": ["@hookform/resolvers", "react-hook-form", "zod"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/input-field-skeleton.json", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-password-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "checkbox", + "title": "Checkbox", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-checkbox", "lucide-react"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/checkbox.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "create-api-key-dialog", + "title": "Create Api Key Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/refetch.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/create-api-key-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "create-organization-dialog", + "title": "Create Organization Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/create-organization-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "credentials-options", + "title": "Credentials Options", + "description": "", + "type": "registry:file", + "target": "types/credentials-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/types/credentials-options.ts", + "type": "registry:file", + "target": "types/credentials-options.ts" + } + ] + }, + { + "name": "delete-account-card", + "title": "Delete Account Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-account-dialog.json", + "http://localhost:3000/r/settings-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-account-dialog", + "title": "Delete Account Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-organization-card", + "title": "Delete Organization Card", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-organization-dialog", + "title": "Delete Organization Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-user-options", + "title": "Delete User Options", + "description": "", + "type": "registry:file", + "target": "types/delete-user-options.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/delete-user-options.ts", + "type": "registry:file", + "target": "types/delete-user-options.ts" + } + ] + }, + { + "name": "dialog", + "title": "Dialog", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-dialog", "lucide-react"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/dialog.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "drawer", + "title": "Drawer", + "description": "", + "type": "registry:ui", + "dependencies": ["vaul"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/drawer.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "dropdown-menu", + "title": "Dropdown Menu", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-dropdown-menu", "lucide-react"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/dropdown-menu.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "email-otp-button", + "title": "Email Otp Button", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/email-otp-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "email-otp-error-codes", + "title": "Email Otp Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/email-otp-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/email-otp-error-codes.ts", + "type": "registry:file", + "target": "localization/email-otp-error-codes.ts" + } + ] + }, + { + "name": "email-otp-form", + "title": "Email Otp Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "input", + "input-otp", + "http://localhost:3000/r/otp-input-group.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/email-otp-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "email-template", + "title": "Email Template", + "description": "", + "type": "registry:component", + "dependencies": ["@react-email/components"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/email/email-template.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "fetch-error", + "title": "Fetch Error", + "description": "", + "type": "registry:file", + "target": "types/fetch-error.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/fetch-error.ts", + "type": "registry:file", + "target": "types/fetch-error.ts" + } + ] + }, + { + "name": "forgot-password-form", + "title": "Forgot Password Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "form", + "input", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/forgot-password-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "form", + "title": "Form", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-label", + "@radix-ui/react-slot", + "react-hook-form" + ], + "registryDependencies": ["label", "http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/form.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "form-error", + "title": "Form Error", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react", "react-hook-form"], + "registryDependencies": [ + "alert", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/form-error.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "generic-oauth-error-codes", + "title": "Generic Oauth Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/generic-oauth-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/generic-oauth-error-codes.ts", + "type": "registry:file", + "target": "localization/generic-oauth-error-codes.ts" + } + ] + }, + { + "name": "generic-oauth-options", + "title": "Generic Oauth Options", + "description": "", + "type": "registry:file", + "target": "types/generic-oauth-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/social-providers.json" + ], + "files": [ + { + "path": "src/types/generic-oauth-options.ts", + "type": "registry:file", + "target": "types/generic-oauth-options.ts" + } + ] + }, + { + "name": "gravatar-options", + "title": "Gravatar Options", + "description": "", + "type": "registry:file", + "target": "types/gravatar-options.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/gravatar-options.ts", + "type": "registry:file", + "target": "types/gravatar-options.ts" + } + ] + }, + { + "name": "gravatar-utils", + "title": "Gravatar Utils", + "description": "", + "type": "registry:lib", + "dependencies": ["@noble/hashes"], + "registryDependencies": ["http://localhost:3000/r/gravatar-options.json"], + "files": [ + { + "path": "src/lib/gravatar-utils.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "haveibeenpwned-error-codes", + "title": "Haveibeenpwned Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/haveibeenpwned-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/haveibeenpwned-error-codes.ts", + "type": "registry:file", + "target": "localization/haveibeenpwned-error-codes.ts" + } + ] + }, + { + "name": "image", + "title": "Image", + "description": "", + "type": "registry:file", + "target": "types/image.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/image.ts", + "type": "registry:file", + "target": "types/image.ts" + } + ] + }, + { + "name": "image-utils", + "title": "Image Utils", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/image-utils.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "input", + "title": "Input", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/input.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "input-field-skeleton", + "title": "Input Field Skeleton", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/skeletons/input-field-skeleton.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "input-otp", + "title": "Input Otp", + "description": "", + "type": "registry:ui", + "dependencies": ["input-otp", "lucide-react"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/input-otp.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "invitation", + "title": "Invitation", + "description": "", + "type": "registry:file", + "target": "types/invitation.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/invitation.ts", + "type": "registry:file", + "target": "types/invitation.ts" + } + ] + }, + { + "name": "invitation-cell", + "title": "Invitation Cell", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/invitation.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/invitation-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "invite-member-dialog", + "title": "Invite Member Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "form", + "input", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/invite-member-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "label", + "title": "Label", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-label"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/label.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "leave-organization-dialog", + "title": "Leave Organization Dialog", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/leave-organization-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "link", + "title": "Link", + "description": "", + "type": "registry:file", + "target": "types/link.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/link.ts", + "type": "registry:file", + "target": "types/link.ts" + } + ] + }, + { + "name": "magic-link-button", + "title": "Magic Link Button", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/magic-link-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "magic-link-form", + "title": "Magic Link Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "form", + "input", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/magic-link-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "member-cell", + "title": "Member Cell", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/leave-organization-dialog.json", + "http://localhost:3000/r/remove-member-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-member-role-dialog.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/member-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "model-names", + "title": "Model Names", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/instantdb/model-names.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "model-names", + "title": "Model Names", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/model-names.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "multi-session-error-codes", + "title": "Multi Session Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/multi-session-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/multi-session-error-codes.ts", + "type": "registry:file", + "target": "localization/multi-session-error-codes.ts" + } + ] + }, + { + "name": "one-tap", + "title": "One Tap", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/one-tap.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-cell", + "title": "Organization Cell", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/leave-organization-dialog.json", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-cell-view", + "title": "Organization Cell View", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/organization-logo.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-cell-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-error-codes", + "title": "Organization Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/organization-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/organization-error-codes.ts", + "type": "registry:file", + "target": "localization/organization-error-codes.ts" + } + ] + }, + { + "name": "organization-invitations-card", + "title": "Organization Invitations Card", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invitation-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-invitations-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-logo", + "title": "Organization Logo", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-logo-card", + "title": "Organization Logo Card", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-members-card", + "title": "Organization Members Card", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invite-member-dialog.json", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-members-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-name-card", + "title": "Organization Name Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-name-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-options", + "title": "Organization Options", + "description": "", + "type": "registry:file", + "target": "types/organization-options.ts", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/view-paths.json"], + "files": [ + { + "path": "src/types/organization-options.ts", + "type": "registry:file", + "target": "types/organization-options.ts" + } + ] + }, + { + "name": "organization-refetcher", + "title": "Organization Refetcher", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/lib/organization-refetcher.tsx", + "type": "registry:lib" + } + ] + }, + { + "name": "organization-settings-cards", + "title": "Organization Settings Cards", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-card.json", + "http://localhost:3000/r/organization-logo-card.json", + "http://localhost:3000/r/organization-name-card.json", + "http://localhost:3000/r/organization-slug-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-settings-cards.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-slug-card", + "title": "Organization Slug Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-slug-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-switcher", + "title": "Organization Switcher", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/create-organization-dialog.json", + "dropdown-menu", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-switcher.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-view", + "title": "Organization View", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/account-view.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organization-invitations-card.json", + "http://localhost:3000/r/organization-members-card.json", + "http://localhost:3000/r/organization-settings-cards.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organizations-card", + "title": "Organizations Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-organization-dialog.json", + "http://localhost:3000/r/organization-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organizations-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "otp-input-group", + "title": "Otp Input Group", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": ["input-otp"], + "files": [ + { + "path": "src/components/auth/otp-input-group.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "passkey-button", + "title": "Passkey Button", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/passkey-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "passkey-cell", + "title": "Passkey Cell", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkey-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "passkey-error-codes", + "title": "Passkey Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/passkey-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/passkey-error-codes.ts", + "type": "registry:file", + "target": "localization/passkey-error-codes.ts" + } + ] + }, + { + "name": "passkeys-card", + "title": "Passkeys Card", + "description": "", + "type": "registry:component", + "dependencies": ["react-hook-form"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/passkey-cell.json", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkeys-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "password-input", + "title": "Password Input", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "button", + "input", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/password-input.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "password-validation", + "title": "Password Validation", + "description": "", + "type": "registry:file", + "target": "types/password-validation.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/password-validation.ts", + "type": "registry:file", + "target": "types/password-validation.ts" + } + ] + }, + { + "name": "personal-account-view", + "title": "Personal Account View", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/personal-account-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "phone-number-error-codes", + "title": "Phone Number Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/phone-number-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/phone-number-error-codes.ts", + "type": "registry:file", + "target": "localization/phone-number-error-codes.ts" + } + ] + }, + { + "name": "profile", + "title": "Profile", + "description": "", + "type": "registry:file", + "target": "types/profile.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/profile.ts", + "type": "registry:file", + "target": "types/profile.ts" + } + ] + }, + { + "name": "provider-button", + "title": "Provider Button", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/provider-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "provider-cell", + "title": "Provider Cell", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/provider-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "provider-icons", + "title": "Provider Icons", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/components/provider-icons.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "providers-card", + "title": "Providers Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/provider-cell.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/providers-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recaptcha-badge", + "title": "Recaptcha Badge", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-badge.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recaptcha-v2", + "title": "Recaptcha V2", + "description": "", + "type": "registry:component", + "dependencies": ["react-google-recaptcha"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recaptcha-v3", + "title": "Recaptcha V3", + "description": "", + "type": "registry:component", + "dependencies": ["@wojtekmaj/react-recaptcha-v3"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recover-account-form", + "title": "Recover Account Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "input", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/recover-account-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "redirect-to-sign-in", + "title": "Redirect To Sign In", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/use-authenticate.json"], + "files": [ + { + "path": "src/components/redirect-to-sign-in.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "redirect-to-sign-up", + "title": "Redirect To Sign Up", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/use-authenticate.json"], + "files": [ + { + "path": "src/components/redirect-to-sign-up.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "refetch", + "title": "Refetch", + "description": "", + "type": "registry:file", + "target": "types/refetch.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/refetch.ts", + "type": "registry:file", + "target": "types/refetch.ts" + } + ] + }, + { + "name": "remove-member-dialog", + "title": "Remove Member Dialog", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/remove-member-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "render-toast", + "title": "Render Toast", + "description": "", + "type": "registry:file", + "target": "types/render-toast.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/render-toast.ts", + "type": "registry:file", + "target": "types/render-toast.ts" + } + ] + }, + { + "name": "reset-password-form", + "title": "Reset Password Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/reset-password-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "security-settings-cards", + "title": "Security Settings Cards", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-password-card.json", + "http://localhost:3000/r/delete-account-card.json", + "http://localhost:3000/r/passkeys-card.json", + "http://localhost:3000/r/providers-card.json", + "http://localhost:3000/r/sessions-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security-settings-cards.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "select", + "title": "Select", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-select", "lucide-react"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/select.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "separator", + "title": "Separator", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-separator"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/separator.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "session-cell", + "title": "Session Cell", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react", "ua-parser-js"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/session-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "session-freshness-dialog", + "title": "Session Freshness Dialog", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/session-freshness-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sessions-card", + "title": "Sessions Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/session-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/sessions-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-action-button", + "title": "Settings Action Button", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react", "react-hook-form"], + "registryDependencies": [ + "button", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-action-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-card", + "title": "Settings Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "card", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-card-footer", + "title": "Settings Card Footer", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-action-button.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-footer.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-card-header", + "title": "Settings Card Header", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-header.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-cell-skeleton", + "title": "Settings Cell Skeleton", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/skeletons/settings-cell-skeleton.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-in-form", + "title": "Sign In Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "form", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-in-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-out", + "title": "Sign Out", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/sign-out.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-up-form", + "title": "Sign Up Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "textarea", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-up-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-up-options", + "title": "Sign Up Options", + "description": "", + "type": "registry:file", + "target": "types/sign-up-options.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/sign-up-options.ts", + "type": "registry:file", + "target": "types/sign-up-options.ts" + } + ] + }, + { + "name": "signed-in", + "title": "Signed In", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "files": [ + { + "path": "src/components/signed-in.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "signed-out", + "title": "Signed Out", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "files": [ + { + "path": "src/components/signed-out.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "skeleton", + "title": "Skeleton", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/skeleton.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "social-options", + "title": "Social Options", + "description": "", + "type": "registry:file", + "target": "types/social-options.ts", + "dependencies": ["better-auth"], + "registryDependencies": ["http://localhost:3000/r/auth-client.json"], + "files": [ + { + "path": "src/types/social-options.ts", + "type": "registry:file", + "target": "types/social-options.ts" + } + ] + }, + { + "name": "social-providers", + "title": "Social Providers", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/provider-icons.json"], + "files": [ + { + "path": "src/lib/social-providers.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "stripe-localization", + "title": "Stripe Localization", + "description": "", + "type": "registry:file", + "target": "localization/stripe-localization.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/stripe-localization.ts", + "type": "registry:file", + "target": "localization/stripe-localization.ts" + } + ] + }, + { + "name": "tabs", + "title": "Tabs", + "description": "", + "type": "registry:ui", + "dependencies": ["@radix-ui/react-tabs"], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/tabs.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "textarea", + "title": "Textarea", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": ["http://localhost:3000/r/utils.json"], + "files": [ + { + "path": "src/components/ui/textarea.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "two-factor-card", + "title": "Two Factor Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-password-dialog.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "two-factor-error-codes", + "title": "Two Factor Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/two-factor-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/two-factor-error-codes.ts", + "type": "registry:file", + "target": "localization/two-factor-error-codes.ts" + } + ] + }, + { + "name": "two-factor-form", + "title": "Two Factor Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "react-qr-code", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "checkbox", + "form", + "input-otp", + "label", + "http://localhost:3000/r/otp-input-group.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/two-factor-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "two-factor-password-dialog", + "title": "Two Factor Password Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/backup-codes-dialog.json", + "button", + "dialog", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-password-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-avatar-card", + "title": "Update Avatar Card", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-avatar-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-field-card", + "title": "Update Field Card", + "description": "", + "type": "registry:component", + "dependencies": ["@hookform/resolvers", "react-hook-form", "zod"], + "registryDependencies": [ + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "checkbox", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "textarea", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-field-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-member-role-dialog", + "title": "Update Member Role Dialog", + "description": "", + "type": "registry:component", + "dependencies": ["better-auth", "lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/update-member-role-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-name-card", + "title": "Update Name Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-name-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-username-card", + "title": "Update Username Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-username-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "use-auth-data", + "title": "Use Auth Data", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-data-cache.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/fetch-error.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-auth-data.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-authenticate", + "title": "Use Authenticate", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-authenticate.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-captcha", + "title": "Use Captcha", + "description": "", + "type": "registry:hook", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile", + "@wojtekmaj/react-recaptcha-v3", + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-captcha.tsx", + "type": "registry:hook" + } + ] + }, + { + "name": "use-conditional-query", + "title": "Use Conditional Query", + "description": "", + "type": "registry:lib", + "dependencies": ["@triplit/client", "@triplit/react"], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-conditional-query.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-current-organization", + "title": "Use Current Organization", + "description": "", + "type": "registry:hook", + "dependencies": ["better-auth"], + "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "files": [ + { + "path": "src/hooks/use-current-organization.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-hydrated", + "title": "Use Hydrated", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-hydrated.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-instant-options", + "title": "Use Instant Options", + "description": "", + "type": "registry:lib", + "dependencies": ["@instantdb/react", "better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-instant-options.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-lang", + "title": "Use Lang", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-lang.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-list-accounts", + "title": "Use List Accounts", + "description": "", + "type": "registry:lib", + "dependencies": ["@better-fetch/fetch"], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-instant-options.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-list-accounts.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-list-accounts", + "title": "Use List Accounts", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-accounts.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-list-sessions", + "title": "Use List Sessions", + "description": "", + "type": "registry:lib", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-instant-options.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-list-sessions.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-list-sessions", + "title": "Use List Sessions", + "description": "", + "type": "registry:lib", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-sessions.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-session", + "title": "Use Session", + "description": "", + "type": "registry:lib", + "dependencies": ["better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-instant-options.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-session.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-session", + "title": "Use Session", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-session.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-success-transition", + "title": "Use Success Transition", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-success-transition.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-tanstack-options", + "title": "Use Tanstack Options", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@daveyplate/better-auth-tanstack", + "@tanstack/react-query" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json" + ], + "files": [ + { + "path": "src/lib/tanstack/use-tanstack-options.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-theme", + "title": "Use Theme", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-theme.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-triplit-hooks", + "title": "Use Triplit Hooks", + "description": "", + "type": "registry:lib", + "dependencies": ["@triplit/client", "better-auth"], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-triplit-hooks.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-triplit-token", + "title": "Use Triplit Token", + "description": "", + "type": "registry:lib", + "dependencies": ["@triplit/client", "@triplit/react"], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-triplit-token.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "user-avatar", + "title": "User Avatar", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "http://localhost:3000/r/gravatar-utils.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-avatar.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "user-button", + "title": "User Button", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dropdown-menu", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "user-invitations-card", + "title": "User Invitations Card", + "description": "", + "type": "registry:component", + "dependencies": ["lucide-react"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/user-invitations-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "user-view", + "title": "User View", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "username-error-codes", + "title": "Username Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/username-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/username-error-codes.ts", + "type": "registry:file", + "target": "localization/username-error-codes.ts" + } + ] + }, + { + "name": "utils", + "title": "Utils", + "description": "", + "type": "registry:lib", + "dependencies": ["clsx", "tailwind-merge", "zod"], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/lib/utils.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "view-paths", + "title": "View Paths", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/view-paths.ts", + "type": "registry:lib" + } + ] + } + ] +} diff --git a/registry/registry.json b/registry/registry.json new file mode 100644 index 00000000..78a75acd --- /dev/null +++ b/registry/registry.json @@ -0,0 +1,3814 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "local", + "items": [ + { + "name": "accept-invitation-card", + "title": "Accept Invitation Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-authenticate.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/accept-invitation-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "account-cell", + "title": "Account Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/account-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "account-options", + "title": "Account Options", + "description": "", + "type": "registry:file", + "target": "types/account-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/types/account-options.ts", + "type": "registry:file", + "target": "types/account-options.ts" + } + ] + }, + { + "name": "account-settings-cards", + "title": "Account Settings Cards", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/accounts-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-email-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-avatar-card.json", + "http://localhost:3000/r/update-field-card.json", + "http://localhost:3000/r/update-name-card.json", + "http://localhost:3000/r/update-username-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account-settings-cards.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "account-view", + "title": "Account View", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-settings-cards.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organizations-card.json", + "http://localhost:3000/r/security-settings-cards.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-invitations-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/account/account-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "accounts-card", + "title": "Accounts Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/account-cell.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/accounts-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "additional-fields", + "title": "Additional Fields", + "description": "", + "type": "registry:file", + "target": "types/additional-fields.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/additional-fields.ts", + "type": "registry:file", + "target": "types/additional-fields.ts" + } + ] + }, + { + "name": "admin-error-codes", + "title": "Admin Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/admin-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/admin-error-codes.ts", + "type": "registry:file", + "target": "localization/admin-error-codes.ts" + } + ] + }, + { + "name": "alert", + "title": "Alert", + "description": "", + "type": "registry:ui", + "dependencies": [ + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/alert.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "anonymous-error-codes", + "title": "Anonymous Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/anonymous-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/anonymous-error-codes.ts", + "type": "registry:file", + "target": "localization/anonymous-error-codes.ts" + } + ] + }, + { + "name": "any-auth-client", + "title": "Any Auth Client", + "description": "", + "type": "registry:file", + "target": "types/any-auth-client.ts", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/types/any-auth-client.ts", + "type": "registry:file", + "target": "types/any-auth-client.ts" + } + ] + }, + { + "name": "api-key", + "title": "Api Key", + "description": "", + "type": "registry:file", + "target": "types/api-key.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/api-key.ts", + "type": "registry:file", + "target": "types/api-key.ts" + } + ] + }, + { + "name": "api-key-cell", + "title": "Api Key Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/api-key-delete-dialog.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "api-key-delete-dialog", + "title": "Api Key Delete Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-delete-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "api-key-display-dialog", + "title": "Api Key Display Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-display-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "api-key-error-codes", + "title": "Api Key Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/api-key-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/api-key-error-codes.ts", + "type": "registry:file", + "target": "localization/api-key-error-codes.ts" + } + ] + }, + { + "name": "api-keys-card", + "title": "Api Keys Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/api-key-cell.json", + "http://localhost:3000/r/api-key-display-dialog.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-api-key-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-keys-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-callback", + "title": "Auth Callback", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/auth-callback.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-client", + "title": "Auth Client", + "description": "", + "type": "registry:file", + "target": "types/auth-client.ts", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-client.ts", + "type": "registry:file", + "target": "types/auth-client.ts" + } + ] + }, + { + "name": "auth-data-cache", + "title": "Auth Data Cache", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/auth-data-cache.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "auth-form", + "title": "Auth Form", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/email-otp-form.json", + "http://localhost:3000/r/forgot-password-form.json", + "http://localhost:3000/r/magic-link-form.json", + "http://localhost:3000/r/recover-account-form.json", + "http://localhost:3000/r/reset-password-form.json", + "http://localhost:3000/r/sign-in-form.json", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/sign-up-form.json", + "http://localhost:3000/r/two-factor-form.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-hooks", + "title": "Auth Hooks", + "description": "", + "type": "registry:file", + "target": "types/auth-hooks.ts", + "dependencies": [ + "@better-fetch/fetch", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/invitation.json", + "http://localhost:3000/r/refetch.json" + ], + "files": [ + { + "path": "src/types/auth-hooks.ts", + "type": "registry:file", + "target": "types/auth-hooks.ts" + } + ] + }, + { + "name": "auth-loading", + "title": "Auth Loading", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/auth-loading.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "auth-localization", + "title": "Auth Localization", + "description": "", + "type": "registry:file", + "target": "localization/auth-localization.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/admin-error-codes.json", + "http://localhost:3000/r/anonymous-error-codes.json", + "http://localhost:3000/r/api-key-error-codes.json", + "http://localhost:3000/r/base-error-codes.json", + "http://localhost:3000/r/captcha-error-codes.json", + "http://localhost:3000/r/email-otp-error-codes.json", + "http://localhost:3000/r/generic-oauth-error-codes.json", + "http://localhost:3000/r/haveibeenpwned-error-codes.json", + "http://localhost:3000/r/multi-session-error-codes.json", + "http://localhost:3000/r/organization-error-codes.json", + "http://localhost:3000/r/passkey-error-codes.json", + "http://localhost:3000/r/phone-number-error-codes.json", + "http://localhost:3000/r/stripe-localization.json", + "http://localhost:3000/r/two-factor-error-codes.json", + "http://localhost:3000/r/username-error-codes.json" + ], + "files": [ + { + "path": "src/localization/auth-localization.ts", + "type": "registry:file", + "target": "localization/auth-localization.ts" + } + ] + }, + { + "name": "auth-mutators", + "title": "Auth Mutators", + "description": "", + "type": "registry:file", + "target": "types/auth-mutators.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-mutators.ts", + "type": "registry:file", + "target": "types/auth-mutators.ts" + } + ] + }, + { + "name": "auth-ui-provider", + "title": "Auth Ui Provider", + "description": "", + "type": "registry:lib", + "dependencies": [ + "sonner" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-options.json", + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/avatar-options.json", + "http://localhost:3000/r/captcha-options.json", + "http://localhost:3000/r/credentials-options.json", + "http://localhost:3000/r/delete-user-options.json", + "http://localhost:3000/r/generic-oauth-options.json", + "http://localhost:3000/r/gravatar-options.json", + "http://localhost:3000/r/link.json", + "http://localhost:3000/r/organization-options.json", + "http://localhost:3000/r/organization-refetcher.json", + "http://localhost:3000/r/recaptcha-v3.json", + "http://localhost:3000/r/render-toast.json", + "http://localhost:3000/r/sign-up-options.json", + "http://localhost:3000/r/social-options.json", + "http://localhost:3000/r/use-auth-data.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/lib/auth-ui-provider.tsx", + "type": "registry:lib" + } + ] + }, + { + "name": "auth-ui-provider-tanstack", + "title": "Auth Ui Provider Tanstack", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-tanstack-options.json" + ], + "files": [ + { + "path": "src/lib/tanstack/auth-ui-provider-tanstack.tsx", + "type": "registry:lib" + } + ] + }, + { + "name": "auth-view", + "title": "Auth View", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/email-otp-button.json", + "http://localhost:3000/r/magic-link-button.json", + "http://localhost:3000/r/one-tap.json", + "http://localhost:3000/r/passkey-button.json", + "http://localhost:3000/r/provider-button.json", + "separator", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "avatar", + "title": "Avatar", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-avatar" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/avatar.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "avatar-options", + "title": "Avatar Options", + "description": "", + "type": "registry:file", + "target": "types/avatar-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/image.json" + ], + "files": [ + { + "path": "src/types/avatar-options.ts", + "type": "registry:file", + "target": "types/avatar-options.ts" + } + ] + }, + { + "name": "backup-codes-dialog", + "title": "Backup Codes Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/backup-codes-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "base-error-codes", + "title": "Base Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/base-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/base-error-codes.ts", + "type": "registry:file", + "target": "localization/base-error-codes.ts" + } + ] + }, + { + "name": "button", + "title": "Button", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-slot", + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/button.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "captcha", + "title": "Captcha", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/recaptcha-badge.json", + "http://localhost:3000/r/recaptcha-v2.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/captcha.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "captcha-error-codes", + "title": "Captcha Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/captcha-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/captcha-error-codes.ts", + "type": "registry:file", + "target": "localization/captcha-error-codes.ts" + } + ] + }, + { + "name": "captcha-options", + "title": "Captcha Options", + "description": "", + "type": "registry:file", + "target": "types/captcha-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/captcha-provider.json" + ], + "files": [ + { + "path": "src/types/captcha-options.ts", + "type": "registry:file", + "target": "types/captcha-options.ts" + } + ] + }, + { + "name": "captcha-provider", + "title": "Captcha Provider", + "description": "", + "type": "registry:file", + "target": "types/captcha-provider.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/captcha-provider.ts", + "type": "registry:file", + "target": "types/captcha-provider.ts" + } + ] + }, + { + "name": "card", + "title": "Card", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/card.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "change-email-card", + "title": "Change Email Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-email-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "change-password-card", + "title": "Change Password Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/input-field-skeleton.json", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-password-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "checkbox", + "title": "Checkbox", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-checkbox", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/checkbox.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "create-api-key-dialog", + "title": "Create Api Key Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/refetch.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/create-api-key-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "create-organization-dialog", + "title": "Create Organization Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/create-organization-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "credentials-options", + "title": "Credentials Options", + "description": "", + "type": "registry:file", + "target": "types/credentials-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/types/credentials-options.ts", + "type": "registry:file", + "target": "types/credentials-options.ts" + } + ] + }, + { + "name": "delete-account-card", + "title": "Delete Account Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-account-dialog.json", + "http://localhost:3000/r/settings-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-account-dialog", + "title": "Delete Account Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-organization-card", + "title": "Delete Organization Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-organization-dialog", + "title": "Delete Organization Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "delete-user-options", + "title": "Delete User Options", + "description": "", + "type": "registry:file", + "target": "types/delete-user-options.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/delete-user-options.ts", + "type": "registry:file", + "target": "types/delete-user-options.ts" + } + ] + }, + { + "name": "dialog", + "title": "Dialog", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-dialog", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/dialog.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "drawer", + "title": "Drawer", + "description": "", + "type": "registry:ui", + "dependencies": [ + "vaul" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/drawer.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "dropdown-menu", + "title": "Dropdown Menu", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-dropdown-menu", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/dropdown-menu.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "email-otp-button", + "title": "Email Otp Button", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/email-otp-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "email-otp-error-codes", + "title": "Email Otp Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/email-otp-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/email-otp-error-codes.ts", + "type": "registry:file", + "target": "localization/email-otp-error-codes.ts" + } + ] + }, + { + "name": "email-otp-form", + "title": "Email Otp Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "input", + "input-otp", + "http://localhost:3000/r/otp-input-group.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/email-otp-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "email-template", + "title": "Email Template", + "description": "", + "type": "registry:component", + "dependencies": [ + "@react-email/components" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/email/email-template.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "fetch-error", + "title": "Fetch Error", + "description": "", + "type": "registry:file", + "target": "types/fetch-error.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/fetch-error.ts", + "type": "registry:file", + "target": "types/fetch-error.ts" + } + ] + }, + { + "name": "forgot-password-form", + "title": "Forgot Password Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "form", + "input", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/forgot-password-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "form", + "title": "Form", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-label", + "@radix-ui/react-slot", + "react-hook-form" + ], + "registryDependencies": [ + "label", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/form.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "form-error", + "title": "Form Error", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react", + "react-hook-form" + ], + "registryDependencies": [ + "alert", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/form-error.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "generic-oauth-error-codes", + "title": "Generic Oauth Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/generic-oauth-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/generic-oauth-error-codes.ts", + "type": "registry:file", + "target": "localization/generic-oauth-error-codes.ts" + } + ] + }, + { + "name": "generic-oauth-options", + "title": "Generic Oauth Options", + "description": "", + "type": "registry:file", + "target": "types/generic-oauth-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/social-providers.json" + ], + "files": [ + { + "path": "src/types/generic-oauth-options.ts", + "type": "registry:file", + "target": "types/generic-oauth-options.ts" + } + ] + }, + { + "name": "gravatar-options", + "title": "Gravatar Options", + "description": "", + "type": "registry:file", + "target": "types/gravatar-options.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/gravatar-options.ts", + "type": "registry:file", + "target": "types/gravatar-options.ts" + } + ] + }, + { + "name": "gravatar-utils", + "title": "Gravatar Utils", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@noble/hashes" + ], + "registryDependencies": [ + "http://localhost:3000/r/gravatar-options.json" + ], + "files": [ + { + "path": "src/lib/gravatar-utils.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "haveibeenpwned-error-codes", + "title": "Haveibeenpwned Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/haveibeenpwned-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/haveibeenpwned-error-codes.ts", + "type": "registry:file", + "target": "localization/haveibeenpwned-error-codes.ts" + } + ] + }, + { + "name": "image", + "title": "Image", + "description": "", + "type": "registry:file", + "target": "types/image.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/image.ts", + "type": "registry:file", + "target": "types/image.ts" + } + ] + }, + { + "name": "image-utils", + "title": "Image Utils", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/image-utils.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "input", + "title": "Input", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/input.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "input-field-skeleton", + "title": "Input Field Skeleton", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/skeletons/input-field-skeleton.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "input-otp", + "title": "Input Otp", + "description": "", + "type": "registry:ui", + "dependencies": [ + "input-otp", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/input-otp.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "invitation", + "title": "Invitation", + "description": "", + "type": "registry:file", + "target": "types/invitation.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/invitation.ts", + "type": "registry:file", + "target": "types/invitation.ts" + } + ] + }, + { + "name": "invitation-cell", + "title": "Invitation Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/invitation.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/invitation-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "invite-member-dialog", + "title": "Invite Member Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "form", + "input", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/invite-member-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "label", + "title": "Label", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-label" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/label.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "leave-organization-dialog", + "title": "Leave Organization Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/leave-organization-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "link", + "title": "Link", + "description": "", + "type": "registry:file", + "target": "types/link.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/link.ts", + "type": "registry:file", + "target": "types/link.ts" + } + ] + }, + { + "name": "magic-link-button", + "title": "Magic Link Button", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/magic-link-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "magic-link-form", + "title": "Magic Link Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "form", + "input", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/magic-link-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "member-cell", + "title": "Member Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/leave-organization-dialog.json", + "http://localhost:3000/r/remove-member-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-member-role-dialog.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/member-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "model-names", + "title": "Model Names", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/instantdb/model-names.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "model-names", + "title": "Model Names", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/model-names.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "multi-session-error-codes", + "title": "Multi Session Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/multi-session-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/multi-session-error-codes.ts", + "type": "registry:file", + "target": "localization/multi-session-error-codes.ts" + } + ] + }, + { + "name": "one-tap", + "title": "One Tap", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/one-tap.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-cell", + "title": "Organization Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/leave-organization-dialog.json", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-cell-view", + "title": "Organization Cell View", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/organization-logo.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-cell-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-error-codes", + "title": "Organization Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/organization-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/organization-error-codes.ts", + "type": "registry:file", + "target": "localization/organization-error-codes.ts" + } + ] + }, + { + "name": "organization-invitations-card", + "title": "Organization Invitations Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invitation-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-invitations-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-logo", + "title": "Organization Logo", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-logo-card", + "title": "Organization Logo Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-members-card", + "title": "Organization Members Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invite-member-dialog.json", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-members-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-name-card", + "title": "Organization Name Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-name-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-options", + "title": "Organization Options", + "description": "", + "type": "registry:file", + "target": "types/organization-options.ts", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/types/organization-options.ts", + "type": "registry:file", + "target": "types/organization-options.ts" + } + ] + }, + { + "name": "organization-refetcher", + "title": "Organization Refetcher", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/lib/organization-refetcher.tsx", + "type": "registry:lib" + } + ] + }, + { + "name": "organization-settings-cards", + "title": "Organization Settings Cards", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-card.json", + "http://localhost:3000/r/organization-logo-card.json", + "http://localhost:3000/r/organization-name-card.json", + "http://localhost:3000/r/organization-slug-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-settings-cards.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-slug-card", + "title": "Organization Slug Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-slug-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-switcher", + "title": "Organization Switcher", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/create-organization-dialog.json", + "dropdown-menu", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-switcher.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organization-view", + "title": "Organization View", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-view.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organization-invitations-card.json", + "http://localhost:3000/r/organization-members-card.json", + "http://localhost:3000/r/organization-settings-cards.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "organizations-card", + "title": "Organizations Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-organization-dialog.json", + "http://localhost:3000/r/organization-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organizations-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "otp-input-group", + "title": "Otp Input Group", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "input-otp" + ], + "files": [ + { + "path": "src/components/auth/otp-input-group.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "passkey-button", + "title": "Passkey Button", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/passkey-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "passkey-cell", + "title": "Passkey Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkey-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "passkey-error-codes", + "title": "Passkey Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/passkey-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/passkey-error-codes.ts", + "type": "registry:file", + "target": "localization/passkey-error-codes.ts" + } + ] + }, + { + "name": "passkeys-card", + "title": "Passkeys Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "react-hook-form" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/passkey-cell.json", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkeys-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "password-input", + "title": "Password Input", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "button", + "input", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/password-input.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "password-validation", + "title": "Password Validation", + "description": "", + "type": "registry:file", + "target": "types/password-validation.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/password-validation.ts", + "type": "registry:file", + "target": "types/password-validation.ts" + } + ] + }, + { + "name": "personal-account-view", + "title": "Personal Account View", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/personal-account-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "phone-number-error-codes", + "title": "Phone Number Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/phone-number-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/phone-number-error-codes.ts", + "type": "registry:file", + "target": "localization/phone-number-error-codes.ts" + } + ] + }, + { + "name": "profile", + "title": "Profile", + "description": "", + "type": "registry:file", + "target": "types/profile.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/profile.ts", + "type": "registry:file", + "target": "types/profile.ts" + } + ] + }, + { + "name": "provider-button", + "title": "Provider Button", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/provider-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "provider-cell", + "title": "Provider Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/provider-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "provider-icons", + "title": "Provider Icons", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/components/provider-icons.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "providers-card", + "title": "Providers Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/provider-cell.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/providers-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recaptcha-badge", + "title": "Recaptcha Badge", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-badge.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recaptcha-v2", + "title": "Recaptcha V2", + "description": "", + "type": "registry:component", + "dependencies": [ + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recaptcha-v3", + "title": "Recaptcha V3", + "description": "", + "type": "registry:component", + "dependencies": [ + "@wojtekmaj/react-recaptcha-v3" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "recover-account-form", + "title": "Recover Account Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "input", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/recover-account-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "redirect-to-sign-in", + "title": "Redirect To Sign In", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], + "files": [ + { + "path": "src/components/redirect-to-sign-in.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "redirect-to-sign-up", + "title": "Redirect To Sign Up", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], + "files": [ + { + "path": "src/components/redirect-to-sign-up.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "refetch", + "title": "Refetch", + "description": "", + "type": "registry:file", + "target": "types/refetch.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/refetch.ts", + "type": "registry:file", + "target": "types/refetch.ts" + } + ] + }, + { + "name": "remove-member-dialog", + "title": "Remove Member Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/remove-member-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "render-toast", + "title": "Render Toast", + "description": "", + "type": "registry:file", + "target": "types/render-toast.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/render-toast.ts", + "type": "registry:file", + "target": "types/render-toast.ts" + } + ] + }, + { + "name": "reset-password-form", + "title": "Reset Password Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/reset-password-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "security-settings-cards", + "title": "Security Settings Cards", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-password-card.json", + "http://localhost:3000/r/delete-account-card.json", + "http://localhost:3000/r/passkeys-card.json", + "http://localhost:3000/r/providers-card.json", + "http://localhost:3000/r/sessions-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security-settings-cards.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "select", + "title": "Select", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-select", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/select.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "separator", + "title": "Separator", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-separator" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/separator.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "session-cell", + "title": "Session Cell", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react", + "ua-parser-js" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/session-cell.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "session-freshness-dialog", + "title": "Session Freshness Dialog", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/session-freshness-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sessions-card", + "title": "Sessions Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/session-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/sessions-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-action-button", + "title": "Settings Action Button", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react", + "react-hook-form" + ], + "registryDependencies": [ + "button", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-action-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-card", + "title": "Settings Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "card", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-card-footer", + "title": "Settings Card Footer", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-action-button.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-footer.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-card-header", + "title": "Settings Card Header", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-header.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "settings-cell-skeleton", + "title": "Settings Cell Skeleton", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/skeletons/settings-cell-skeleton.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-in-form", + "title": "Sign In Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "form", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-in-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-out", + "title": "Sign Out", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/sign-out.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-up-form", + "title": "Sign Up Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "textarea", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-up-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sign-up-options", + "title": "Sign Up Options", + "description": "", + "type": "registry:file", + "target": "types/sign-up-options.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/sign-up-options.ts", + "type": "registry:file", + "target": "types/sign-up-options.ts" + } + ] + }, + { + "name": "signed-in", + "title": "Signed In", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/signed-in.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "signed-out", + "title": "Signed Out", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/signed-out.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "skeleton", + "title": "Skeleton", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/skeleton.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "social-options", + "title": "Social Options", + "description": "", + "type": "registry:file", + "target": "types/social-options.ts", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json" + ], + "files": [ + { + "path": "src/types/social-options.ts", + "type": "registry:file", + "target": "types/social-options.ts" + } + ] + }, + { + "name": "social-providers", + "title": "Social Providers", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/provider-icons.json" + ], + "files": [ + { + "path": "src/lib/social-providers.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "stripe-localization", + "title": "Stripe Localization", + "description": "", + "type": "registry:file", + "target": "localization/stripe-localization.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/stripe-localization.ts", + "type": "registry:file", + "target": "localization/stripe-localization.ts" + } + ] + }, + { + "name": "tabs", + "title": "Tabs", + "description": "", + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-tabs" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/tabs.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "textarea", + "title": "Textarea", + "description": "", + "type": "registry:ui", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/textarea.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "two-factor-card", + "title": "Two Factor Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-password-dialog.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "two-factor-error-codes", + "title": "Two Factor Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/two-factor-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/two-factor-error-codes.ts", + "type": "registry:file", + "target": "localization/two-factor-error-codes.ts" + } + ] + }, + { + "name": "two-factor-form", + "title": "Two Factor Form", + "description": "", + "type": "registry:component", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "react-qr-code", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "checkbox", + "form", + "input-otp", + "label", + "http://localhost:3000/r/otp-input-group.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/two-factor-form.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "two-factor-password-dialog", + "title": "Two Factor Password Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/backup-codes-dialog.json", + "button", + "dialog", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-password-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-avatar-card", + "title": "Update Avatar Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-avatar-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-field-card", + "title": "Update Field Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "checkbox", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "textarea", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-field-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-member-role-dialog", + "title": "Update Member Role Dialog", + "description": "", + "type": "registry:component", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/update-member-role-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-name-card", + "title": "Update Name Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-name-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "update-username-card", + "title": "Update Username Card", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-username-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "use-auth-data", + "title": "Use Auth Data", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-data-cache.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/fetch-error.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-auth-data.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-authenticate", + "title": "Use Authenticate", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-authenticate.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-captcha", + "title": "Use Captcha", + "description": "", + "type": "registry:hook", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile", + "@wojtekmaj/react-recaptcha-v3", + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-captcha.tsx", + "type": "registry:hook" + } + ] + }, + { + "name": "use-conditional-query", + "title": "Use Conditional Query", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-conditional-query.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-current-organization", + "title": "Use Current Organization", + "description": "", + "type": "registry:hook", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-current-organization.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-hydrated", + "title": "Use Hydrated", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-hydrated.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-instant-options", + "title": "Use Instant Options", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@instantdb/react", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-instant-options.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-lang", + "title": "Use Lang", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-lang.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-list-accounts", + "title": "Use List Accounts", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@better-fetch/fetch" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-instant-options.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-list-accounts.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-list-accounts", + "title": "Use List Accounts", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-accounts.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-list-sessions", + "title": "Use List Sessions", + "description": "", + "type": "registry:lib", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-instant-options.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-list-sessions.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-list-sessions", + "title": "Use List Sessions", + "description": "", + "type": "registry:lib", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-sessions.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-session", + "title": "Use Session", + "description": "", + "type": "registry:lib", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-instant-options.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-session.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-session", + "title": "Use Session", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-session.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-success-transition", + "title": "Use Success Transition", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-success-transition.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-tanstack-options", + "title": "Use Tanstack Options", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@daveyplate/better-auth-tanstack", + "@tanstack/react-query" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json" + ], + "files": [ + { + "path": "src/lib/tanstack/use-tanstack-options.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-theme", + "title": "Use Theme", + "description": "", + "type": "registry:hook", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-theme.ts", + "type": "registry:hook" + } + ] + }, + { + "name": "use-triplit-hooks", + "title": "Use Triplit Hooks", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@triplit/client", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-triplit-hooks.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "use-triplit-token", + "title": "Use Triplit Token", + "description": "", + "type": "registry:lib", + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-triplit-token.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "user-avatar", + "title": "User Avatar", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "http://localhost:3000/r/gravatar-utils.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-avatar.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "user-button", + "title": "User Button", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dropdown-menu", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "user-invitations-card", + "title": "User Invitations Card", + "description": "", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/user-invitations-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "user-view", + "title": "User View", + "description": "", + "type": "registry:component", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-view.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "username-error-codes", + "title": "Username Error Codes", + "description": "", + "type": "registry:file", + "target": "localization/username-error-codes.ts", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/username-error-codes.ts", + "type": "registry:file", + "target": "localization/username-error-codes.ts" + } + ] + }, + { + "name": "utils", + "title": "Utils", + "description": "", + "type": "registry:lib", + "dependencies": [ + "clsx", + "tailwind-merge", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/lib/utils.ts", + "type": "registry:lib" + } + ] + }, + { + "name": "view-paths", + "title": "View Paths", + "description": "", + "type": "registry:lib", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/view-paths.ts", + "type": "registry:lib" + } + ] + } + ] +} diff --git a/scripts/generate.mjs b/scripts/generate.mjs new file mode 100644 index 00000000..bd40cad7 --- /dev/null +++ b/scripts/generate.mjs @@ -0,0 +1,540 @@ +#!/usr/bin/env node +/** + * Shadcn Registry Generator (Typed Classification + File Targets) + * + * CHANGE (target requirement): + * ANY item whose type === "registry:file" now ensures EVERY file entry inside + * item.files[] has a "target" property. + * + * For localization and types directories: + * src/localization/foo-bar.ts -> target: localization/foo-bar.ts + * src/types/any-auth-client.ts -> target: types/any-auth-client.ts + * + * For any other registry:file (fallback) we use the path relative to src/: + * src/something/else/file.ts -> target: something/else/file.ts + * + * PRIOR FEATURES: + * - Classification into registry:ui, registry:component, registry:hook, registry:lib, registry:file + * - External packages only in "dependencies" + * - Internal imports in "registryDependencies" (URL-prefixed unless basic primitives) + * - Optional hydration (--hydrate) + * - Optional per-item JSON (--split-items) + * + * Typical usage: + * node scripts/generate.mjs --hydrate --description --name-strategy=path + * + * Dry run: + * node scripts/generate.mjs --dry-run + */ + +import { promises as fs } from "fs"; +import path from "path"; + +// ---------------------- CLI ARG PARSING -------------------------------------- +const argv = Object.fromEntries( + process.argv.slice(2).map((arg) => { + const [k, ...rest] = arg.replace(/^--/, "").split("="); + return [k, rest.length ? rest.join("=") : true]; + }), +); + +// ---------------------- Configuration & Flags -------------------------------- +const PROJECT_ROOT = path.resolve(argv.root || process.cwd()); + +// Directories to scan (comma list). +const SCAN_DIRS = ( + argv["scan-dirs"] + ? String(argv["scan-dirs"]) + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : [ + "src/components", + "src/hooks", + "src/lib", + "src/localization", + "src/types", + ] +).map((d) => d.replace(/\/+$/, "")); + +const OUT_DIR = path.resolve(argv.out || path.join(PROJECT_ROOT, "registry")); +const PARSE_STRUCTURE = + argv["parse-structure"] && path.resolve(argv["parse-structure"]); +const INLINE_CONTENT = Boolean(argv.hydrate); +const DRY_RUN = Boolean(argv["dry-run"]); +const EXTENSIONS = ( + argv.extensions + ? String(argv.extensions) + .split(",") + .map((e) => e.trim()) + .filter(Boolean) + : [".tsx", ".ts"] +).map((e) => (e.startsWith(".") ? e : "." + e)); + +const INCLUDE_FILTERS = argv.include + ? String(argv.include) + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : []; +const EXCLUDE_FILTERS = argv.exclude + ? String(argv.exclude) + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : []; +const NAME_STRATEGY = argv["name-strategy"] === "path" ? "path" : "basename"; +const NAME_PREFIX = argv.prefix ? String(argv.prefix) : ""; +const ADD_DESCRIPTIONS = Boolean(argv.description); +const REGISTRY_NAME = argv["registry-name"] || "local"; +const REGISTRY_HOMEPAGE = argv["registry-homepage"] || ""; +const SPLIT_ITEMS = Boolean(argv["split-items"]); + +const DEP_IGNORES = argv["ignore-deps"] + ? String(argv["ignore-deps"]) + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : [ + "react", + "react-dom", + "next", + "next/navigation", + "next/router", + "next/link", + "next/image", + ]; + +const INTERNAL_ROOTS = argv["internal-roots"] + ? String(argv["internal-roots"]) + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : ["src/", "@/", "~/", "#/"]; + +let REG_DEP_BASE = + argv["registry-dependency-base-url"] || "http://localhost:3000/r/"; +if (!REG_DEP_BASE.endsWith("/")) REG_DEP_BASE += "/"; + +const DEFAULT_BASIC_COMPONENTS = [ + "alert", + "avatar", + "button", + "card", + "checkbox", + "dialog", + "drawer", + "dropdown-menu", + "form", + "input", + "input-otp", + "label", + "select", + "separator", + "skeleton", + "tabs", + "textarea", +]; +const BASIC_COMPONENTS = new Set( + (argv["basic-components"] + ? String(argv["basic-components"]) + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : DEFAULT_BASIC_COMPONENTS + ).map((s) => s.toLowerCase()), +); + +const SORT_ORDER = ["name", "path"].includes(argv.sort) ? argv.sort : "name"; + +// ------------------------- Helpers ------------------------------------------- +function toPosix(p) { + return p.replace(/\\/g, "/"); +} + +function slugify(str) { + return str + .replace(/\\/g, "/") + .replace(/\.[^.]+$/, "") + .replace(/[^a-zA-Z0-9/_-]+/g, "-") + .replace(/\/+/g, "/") + .replace(/^-+|-+$/g, "") + .toLowerCase() + .replace(/\/+/g, "/") + .replace(/^-+/, "") + .replace(/-+/g, "-"); +} + +function basenameNoExt(file) { + return path.basename(file).replace(/\.[^.]+$/, ""); +} + +function titleCaseFromName(name) { + return name + .split(/[-_/]/) + .filter(Boolean) + .map((w) => w.charAt(0).toUpperCase() + w.slice(1)) + .join(" "); +} + +function guessDescription(relPath, name) { + if (!ADD_DESCRIPTIONS) return ""; + const parts = relPath.split("/"); + const context = parts.slice(0, -1).join("/"); + return `Auto-generated registry entry for ${name} (source: ${relPath}${context ? ", context: " + context : ""}).`; +} + +function passesFilters(relPath) { + if ( + INCLUDE_FILTERS.length && + !INCLUDE_FILTERS.some((f) => relPath.includes(f)) + ) + return false; + if ( + EXCLUDE_FILTERS.length && + EXCLUDE_FILTERS.some((f) => relPath.includes(f)) + ) + return false; + return true; +} + +async function walk(dir, collector = []) { + let entries; + try { + entries = await fs.readdir(dir, { withFileTypes: true }); + } catch { + return collector; + } + for (const entry of entries) { + const abs = path.join(dir, entry.name); + if (entry.isDirectory()) { + await walk(abs, collector); + } else if (entry.isFile()) { + const ext = path.extname(entry.name); + if (EXTENSIONS.includes(ext)) { + const rel = toPosix(path.relative(PROJECT_ROOT, abs)); + if (passesFilters(rel)) collector.push({ abs, rel }); + } + } + } + return collector; +} + +async function parseStructureFile(file) { + const text = await fs.readFile(file, "utf8"); + const lines = text.split(/\r?\n/); + const matches = []; + for (const raw of lines) { + const line = raw.trim(); + if (!line) continue; + for (const ext of EXTENSIONS) { + if (line.endsWith(ext)) { + let rel = line.replace(/^\.\/+/, "").replace(/^[\-\*\d\.\)]+\s*/, ""); + if (!rel.startsWith("src/")) { + if ( + /(^components\/|^hooks\/|^lib\/|^localization\/|^types\/)/.test(rel) + ) + rel = `src/${rel}`; + else continue; + } + matches.push({ abs: path.join(PROJECT_ROOT, rel), rel }); + break; + } + } + } + return matches; +} + +async function resolveImport(fromFileRel, importSource) { + if (!importSource.startsWith(".")) return null; + const fromDirAbs = path.dirname(path.join(PROJECT_ROOT, fromFileRel)); + const base = path.normalize(path.join(fromDirAbs, importSource)); + const candidates = []; + candidates.push(base); + for (const ext of EXTENSIONS) candidates.push(base + ext); + for (const ext of EXTENSIONS) candidates.push(path.join(base, "index" + ext)); + + const seen = new Set(); + for (const abs of candidates) { + const norm = abs.toLowerCase(); + if (seen.has(norm)) continue; + seen.add(norm); + try { + const stat = await fs.stat(abs); + if (stat.isFile()) { + return toPosix(path.relative(PROJECT_ROOT, abs)); + } + } catch { + /* ignore */ + } + } + return null; +} + +function isExternalImport(source) { + if (source.startsWith(".") || source.startsWith("/")) return false; + if (INTERNAL_ROOTS.some((r) => source.startsWith(r))) return false; + return true; +} + +function normalizePackageName(spec) { + if (spec.startsWith("@")) { + const parts = spec.split("/"); + return parts.length > 2 ? parts.slice(0, 2).join("/") : spec; + } + return spec.split("/")[0]; +} + +async function readFileContent(abs) { + try { + return await fs.readFile(abs, "utf8"); + } catch { + return ""; + } +} + +// Import detection regex (heuristic) +const IMPORT_RE = + /\bimport\s+(?:[\s\S]*?)\s+from\s+['"]([^'"]+)['"]|import\(['"]([^'"]+)['"]\)|export\s+\*\s+from\s+['"]([^'"]+)['"]/g; + +// Classification function +function classify(rel) { + if (rel.startsWith("src/components/ui/")) return "registry:ui"; + if (rel.startsWith("src/components/")) return "registry:component"; + if (rel.startsWith("src/hooks/")) return "registry:hook"; + if (rel.startsWith("src/lib/")) return "registry:lib"; + if (rel.startsWith("src/localization/")) return "registry:file"; + if (rel.startsWith("src/types/")) return "registry:file"; + return "registry:file"; +} + +// Compute target for registry:file (required for ALL registry:file now) +function computeFileTarget(rel) { + if (rel.startsWith("src/localization/")) { + return `localization/${path.basename(rel)}`; + } + if (rel.startsWith("src/types/")) { + return `types/${path.basename(rel)}`; + } + // fallback: path relative to src/ + return rel.startsWith("src/") ? rel.slice(4) : rel; +} + +// ------------------------- Main ---------------------------------------------- +async function main() { + let fileEntries = []; + + if (PARSE_STRUCTURE) { + fileEntries = await parseStructureFile(PARSE_STRUCTURE); + } else { + for (const dir of SCAN_DIRS) { + const absDir = path.join(PROJECT_ROOT, dir); + fileEntries = fileEntries.concat(await walk(absDir)); + } + } + + // Deduplicate + const seen = new Set(); + fileEntries = fileEntries.filter((f) => { + if (seen.has(f.rel)) return false; + seen.add(f.rel); + return true; + }); + + const items = []; + for (const f of fileEntries) { + const rel = f.rel; + const base = basenameNoExt(rel); + const name = + NAME_STRATEGY === "basename" + ? NAME_PREFIX + slugify(base) + : NAME_PREFIX + + slugify(rel.replace(/\.[^.]+$/, "").replace(/^src\//, "")); + const title = titleCaseFromName(name.replace(NAME_PREFIX, "")); + const description = guessDescription(rel, name); + const content = await readFileContent(f.abs); + const type = classify(rel); + + const fileObj = { + path: rel, + type, + ...(INLINE_CONTENT ? { content } : {}), + }; + + if (type === "registry:file") { + fileObj.target = computeFileTarget(rel); + } + + // Optionally also add an item-level target ONLY for localization/types (legacy behavior) + const itemLevelTarget = + rel.startsWith("src/localization/") || rel.startsWith("src/types/") + ? computeFileTarget(rel) + : undefined; + + items.push({ + __path: rel, + __content: content, + name, + title, + description, + type, + ...(itemLevelTarget ? { target: itemLevelTarget } : {}), + dependencies: [], // external packages only + registryDependencies: [], // internal modules & components + files: [fileObj], + }); + } + + // Lookup maps + const pathToItem = new Map(); + for (const item of items) { + const full = item.__path; + pathToItem.set(full, item.name); + pathToItem.set(full.replace(/\.[^.]+$/, ""), item.name); + } + + // Dependency extraction + for (const item of items) { + const content = item.__content; + if (!content) { + delete item.__content; + delete item.__path; + continue; + } + + const externals = new Set(); + const registryDeps = new Set(); + + IMPORT_RE.lastIndex = 0; + let match; + while ((match = IMPORT_RE.exec(content)) !== null) { + const source = match[1] || match[2] || match[3]; + if (!source) continue; + + if (isExternalImport(source)) { + const pkg = normalizePackageName(source); + if (!DEP_IGNORES.includes(pkg)) externals.add(pkg); + } else { + if (source.startsWith(".")) { + const resolved = await resolveImport(item.__path, source); + if (resolved) { + const candidate = + pathToItem.get(resolved) || + pathToItem.get(resolved.replace(/\.[^.]+$/, "")); + if (candidate && candidate !== item.name) + registryDeps.add(candidate); + } + } else if (INTERNAL_ROOTS.some((r) => source.startsWith(r))) { + let normalized = source; + if (source.startsWith("@/")) normalized = "src/" + source.slice(2); + if (normalized.startsWith("src/")) { + const direct = normalized; + const noExt = direct.replace(/\.[^.]+$/, ""); + const candidate = pathToItem.get(direct) || pathToItem.get(noExt); + if (candidate && candidate !== item.name) + registryDeps.add(candidate); + } + } + } + } + + const transformedRegistryDeps = Array.from(registryDeps) + .sort() + .map((dep) => { + if (/^https?:\/\//.test(dep)) return dep; + return BASIC_COMPONENTS.has(dep.toLowerCase()) + ? dep + : `${REG_DEP_BASE}${dep}.json`; + }); + + item.dependencies = Array.from(externals).sort(); + item.registryDependencies = transformedRegistryDeps; + + delete item.__content; + delete item.__path; + } + + // Sorting + if (SORT_ORDER === "name") { + items.sort((a, b) => a.name.localeCompare(b.name)); + } else { + items.sort((a, b) => a.files[0].path.localeCompare(b.files[0].path)); + } + + const registry = { + $schema: "https://ui.shadcn.com/schema/registry.json", + name: REGISTRY_NAME, + ...(REGISTRY_HOMEPAGE ? { homepage: REGISTRY_HOMEPAGE } : {}), + items, + }; + + if (DRY_RUN) { + console.log("(dry-run) Summary:"); + console.log( + JSON.stringify( + { + name: registry.name, + homepage: registry.homepage, + scanDirs: SCAN_DIRS, + items: registry.items.length, + fileTypeTargetsSample: registry.items + .filter((i) => i.type === "registry:file") + .slice(0, 5) + .map((i) => ({ + name: i.name, + itemTarget: i.target, + fileTarget: i.files[0].target, + })), + sample: registry.items.slice(0, 6).map((i) => ({ + name: i.name, + type: i.type, + fileTarget: i.files[0].target, + deps: i.dependencies, + registryDeps: i.registryDependencies, + })), + }, + null, + 2, + ), + ); + return; + } + + await fs.mkdir(OUT_DIR, { recursive: true }); + + if (SPLIT_ITEMS) { + const ITEMS_DIR = path.join(OUT_DIR, "components"); + await fs.mkdir(ITEMS_DIR, { recursive: true }); + for (const item of items) { + await fs.writeFile( + path.join(ITEMS_DIR, `${item.name}.json`), + JSON.stringify(item, null, 2) + "\n", + "utf8", + ); + } + } + + const registryPath = path.join(OUT_DIR, "registry.json"); + await fs.writeFile( + registryPath, + JSON.stringify(registry, null, 2) + "\n", + "utf8", + ); + + console.log(`Registry generated: ${registryPath}`); + console.log(`Items: ${items.length}`); + console.log( + INLINE_CONTENT + ? "File contents embedded." + : "Run with --hydrate to embed file contents.", + ); + console.log("All registry:file entries have file-level targets."); + if (SPLIT_ITEMS) { + console.log("Per-item JSON files written to registry/components/*.json"); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); From 947d51f4c704bdaded25de740e297b0fb5e1aed2 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:06:15 -0400 Subject: [PATCH 02/10] husky commit hooks and update gen command --- .husky/pre-commit | 17 ++ package.json | 15 +- pnpm-lock.yaml | 10 + registry.json | 461 +++++++++++++++++++++++++++++++++++----------- 4 files changed, 392 insertions(+), 111 deletions(-) create mode 100644 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..9e2585af --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,17 @@ +# 1. Generate the registry +pnpm registry:generate + +# 2. Copy registry.json to root +pnpm copy-registry + +# 3. Build the registry +pnpm registry:build + +# 4. Delete docs/public/r +pnpm delete-docs-r + +# 5. Copy public/r to docs/public/r +pnpm copy-public-to-docs + +# 6. Run lint-staged +pnpm lint-staged diff --git a/package.json b/package.json index 05e89bed..780b088f 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,12 @@ "build": "tsup --clean --dts && cp src/style.css dist/style.css", "dev": "tsc-watch", "prepublishOnly": "rm -rf dist && turbo build", - "generate:registry": "node scripts/generate.mjs", - "registry:generate": "node scripts/generate.mjs", - "registry:build": "shadcn build" + "registry:generate": "node scripts/generate.mjs --registry-homepage=https://better-auth-ui.com", + "registry:build": "shadcn build", + "prepare": "husky", + "copy-registry": "cp registry/registry.json ./registry.json", + "delete-docs-r": "rm -rf docs/public/r", + "copy-public-to-docs": "cp -R ./public/r docs/public/r" }, "type": "module", "main": "./dist/index.cjs", @@ -102,6 +105,7 @@ "clsx": "^2.1.1", "esbuild-plugin-preserve-directives": "^0.0.11", "glob": "^11.0.3", + "husky": "^9.1.7", "lucide-react": "^0.536.0", "react-router": "^7.7.1", "tailwind-merge": "^3.3.1", @@ -159,7 +163,10 @@ "vaul": "^1.1.2" }, "pnpm": { - "overrides": {} + "overrides": {}, + "onlyBuiltDependencies": [ + "msw" + ] }, "packageManager": "pnpm@10.14.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cf54772..5700ecc0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,6 +150,9 @@ importers: glob: specifier: ^11.0.3 version: 11.0.3 + husky: + specifier: ^9.1.7 + version: 9.1.7 lucide-react: specifier: ^0.536.0 version: 0.536.0(react@19.1.0) @@ -2079,6 +2082,11 @@ packages: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -5170,6 +5178,8 @@ snapshots: human-signals@4.3.1: {} + husky@9.1.7: {} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 diff --git a/registry.json b/registry.json index 64205275..78a75acd 100644 --- a/registry.json +++ b/registry.json @@ -1,14 +1,15 @@ { "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "local", - "homepage": "https://better-auth-ui.com", "items": [ { "name": "accept-invitation-card", "title": "Accept Invitation Card", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -32,7 +33,10 @@ "title": "Account Cell", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -58,7 +62,9 @@ "type": "registry:file", "target": "types/account-options.ts", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/view-paths.json"], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], "files": [ { "path": "src/types/account-options.ts", @@ -97,7 +103,9 @@ "title": "Account View", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/account-settings-cards.json", "http://localhost:3000/r/api-keys-card.json", @@ -177,8 +185,12 @@ "title": "Alert", "description": "", "type": "registry:ui", - "dependencies": ["class-variance-authority"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/alert.tsx", @@ -208,7 +220,9 @@ "description": "", "type": "registry:file", "target": "types/any-auth-client.ts", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [], "files": [ { @@ -239,7 +253,9 @@ "title": "Api Key Cell", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/api-key.json", "http://localhost:3000/r/api-key-delete-dialog.json", @@ -264,7 +280,9 @@ "title": "Api Key Delete Dialog", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/api-key.json", "http://localhost:3000/r/auth-localization.json", @@ -289,7 +307,9 @@ "title": "Api Key Display Dialog", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -348,7 +368,9 @@ "title": "Auth Callback", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "http://localhost:3000/r/use-success-transition.json" @@ -366,7 +388,9 @@ "description": "", "type": "registry:file", "target": "types/auth-client.ts", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [], "files": [ { @@ -425,7 +449,10 @@ "description": "", "type": "registry:file", "target": "types/auth-hooks.ts", - "dependencies": ["@better-fetch/fetch", "better-auth"], + "dependencies": [ + "@better-fetch/fetch", + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/any-auth-client.json", "http://localhost:3000/r/api-key.json", @@ -447,7 +474,9 @@ "description": "", "type": "registry:component", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], "files": [ { "path": "src/components/auth-loading.tsx", @@ -508,7 +537,9 @@ "title": "Auth Ui Provider", "description": "", "type": "registry:lib", - "dependencies": ["sonner"], + "dependencies": [ + "sonner" + ], "registryDependencies": [ "http://localhost:3000/r/account-options.json", "http://localhost:3000/r/additional-fields.json", @@ -562,7 +593,9 @@ "title": "Auth View", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-callback.json", "http://localhost:3000/r/auth-form.json", @@ -594,8 +627,12 @@ "title": "Avatar", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-avatar"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-avatar" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/avatar.tsx", @@ -610,7 +647,9 @@ "type": "registry:file", "target": "types/avatar-options.ts", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/image.json"], + "registryDependencies": [ + "http://localhost:3000/r/image.json" + ], "files": [ { "path": "src/types/avatar-options.ts", @@ -624,7 +663,9 @@ "title": "Backup Codes Dialog", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "button", @@ -660,8 +701,13 @@ "title": "Button", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-slot", "class-variance-authority"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-slot", + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/button.tsx", @@ -674,7 +720,10 @@ "title": "Captcha", "description": "", "type": "registry:component", - "dependencies": ["@hcaptcha/react-hcaptcha", "@marsidev/react-turnstile"], + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -712,7 +761,9 @@ "type": "registry:file", "target": "types/captcha-options.ts", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/captcha-provider.json"], + "registryDependencies": [ + "http://localhost:3000/r/captcha-provider.json" + ], "files": [ { "path": "src/types/captcha-options.ts", @@ -743,7 +794,9 @@ "description": "", "type": "registry:ui", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/card.tsx", @@ -756,7 +809,11 @@ "title": "Change Email Card", "description": "", "type": "registry:component", - "dependencies": ["@hookform/resolvers", "react-hook-form", "zod"], + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "card", @@ -778,7 +835,11 @@ "title": "Change Password Card", "description": "", "type": "registry:component", - "dependencies": ["@hookform/resolvers", "react-hook-form", "zod"], + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -802,8 +863,13 @@ "title": "Checkbox", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-checkbox", "lucide-react"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-checkbox", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/checkbox.tsx", @@ -948,7 +1014,9 @@ "title": "Delete Organization Card", "description": "", "type": "registry:component", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "http://localhost:3000/r/delete-organization-dialog.json", @@ -1014,8 +1082,13 @@ "title": "Dialog", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-dialog", "lucide-react"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-dialog", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/dialog.tsx", @@ -1028,8 +1101,12 @@ "title": "Drawer", "description": "", "type": "registry:ui", - "dependencies": ["vaul"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "vaul" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/drawer.tsx", @@ -1042,8 +1119,13 @@ "title": "Dropdown Menu", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-dropdown-menu", "lucide-react"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-dropdown-menu", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/dropdown-menu.tsx", @@ -1056,7 +1138,9 @@ "title": "Email Otp Button", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1124,8 +1208,12 @@ "title": "Email Template", "description": "", "type": "registry:component", - "dependencies": ["@react-email/components"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@react-email/components" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/email/email-template.tsx", @@ -1190,7 +1278,10 @@ "@radix-ui/react-slot", "react-hook-form" ], - "registryDependencies": ["label", "http://localhost:3000/r/utils.json"], + "registryDependencies": [ + "label", + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/form.tsx", @@ -1203,7 +1294,10 @@ "title": "Form Error", "description": "", "type": "registry:component", - "dependencies": ["lucide-react", "react-hook-form"], + "dependencies": [ + "lucide-react", + "react-hook-form" + ], "registryDependencies": [ "alert", "http://localhost:3000/r/auth-form.json", @@ -1272,8 +1366,12 @@ "title": "Gravatar Utils", "description": "", "type": "registry:lib", - "dependencies": ["@noble/hashes"], - "registryDependencies": ["http://localhost:3000/r/gravatar-options.json"], + "dependencies": [ + "@noble/hashes" + ], + "registryDependencies": [ + "http://localhost:3000/r/gravatar-options.json" + ], "files": [ { "path": "src/lib/gravatar-utils.ts", @@ -1333,7 +1431,9 @@ "description": "", "type": "registry:ui", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/input.tsx", @@ -1364,8 +1464,13 @@ "title": "Input Otp", "description": "", "type": "registry:ui", - "dependencies": ["input-otp", "lucide-react"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "input-otp", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/input-otp.tsx", @@ -1394,7 +1499,10 @@ "title": "Invitation Cell", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1448,8 +1556,12 @@ "title": "Label", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-label"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-label" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/label.tsx", @@ -1462,7 +1574,10 @@ "title": "Leave Organization Dialog", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1501,7 +1616,9 @@ "title": "Magic Link Button", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1553,7 +1670,10 @@ "title": "Member Cell", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1642,7 +1762,10 @@ "title": "Organization Cell", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1666,7 +1789,9 @@ "title": "Organization Cell View", "description": "", "type": "registry:component", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1702,7 +1827,9 @@ "title": "Organization Invitations Card", "description": "", "type": "registry:component", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "card", @@ -1723,7 +1850,10 @@ "title": "Organization Logo", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1743,7 +1873,10 @@ "title": "Organization Logo Card", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -1770,7 +1903,9 @@ "title": "Organization Members Card", "description": "", "type": "registry:component", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "card", @@ -1822,7 +1957,9 @@ "type": "registry:file", "target": "types/organization-options.ts", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/view-paths.json"], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], "files": [ { "path": "src/types/organization-options.ts", @@ -1904,7 +2041,10 @@ "title": "Organization Switcher", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-client.json", "http://localhost:3000/r/auth-localization.json", @@ -1932,7 +2072,9 @@ "title": "Organization View", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/account-view.json", "http://localhost:3000/r/api-keys-card.json", @@ -1982,7 +2124,9 @@ "description": "", "type": "registry:component", "dependencies": [], - "registryDependencies": ["input-otp"], + "registryDependencies": [ + "input-otp" + ], "files": [ { "path": "src/components/auth/otp-input-group.tsx", @@ -1995,7 +2139,9 @@ "title": "Passkey Button", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2016,7 +2162,9 @@ "title": "Passkey Cell", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2054,7 +2202,9 @@ "title": "Passkeys Card", "description": "", "type": "registry:component", - "dependencies": ["react-hook-form"], + "dependencies": [ + "react-hook-form" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2077,7 +2227,9 @@ "title": "Password Input", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "button", "input", @@ -2163,7 +2315,9 @@ "title": "Provider Button", "description": "", "type": "registry:component", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2184,7 +2338,10 @@ "title": "Provider Cell", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2265,7 +2422,9 @@ "title": "Recaptcha V2", "description": "", "type": "registry:component", - "dependencies": ["react-google-recaptcha"], + "dependencies": [ + "react-google-recaptcha" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "http://localhost:3000/r/use-lang.json", @@ -2284,7 +2443,9 @@ "title": "Recaptcha V3", "description": "", "type": "registry:component", - "dependencies": ["@wojtekmaj/react-recaptcha-v3"], + "dependencies": [ + "@wojtekmaj/react-recaptcha-v3" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "http://localhost:3000/r/use-hydrated.json", @@ -2332,7 +2493,9 @@ "description": "", "type": "registry:component", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/use-authenticate.json"], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], "files": [ { "path": "src/components/redirect-to-sign-in.tsx", @@ -2346,7 +2509,9 @@ "description": "", "type": "registry:component", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/use-authenticate.json"], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], "files": [ { "path": "src/components/redirect-to-sign-up.tsx", @@ -2375,7 +2540,10 @@ "title": "Remove Member Dialog", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2466,8 +2634,13 @@ "title": "Select", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-select", "lucide-react"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-select", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/select.tsx", @@ -2480,8 +2653,12 @@ "title": "Separator", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-separator"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-separator" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/separator.tsx", @@ -2494,7 +2671,11 @@ "title": "Session Cell", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react", "ua-parser-js"], + "dependencies": [ + "better-auth", + "lucide-react", + "ua-parser-js" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -2559,7 +2740,10 @@ "title": "Settings Action Button", "description": "", "type": "registry:component", - "dependencies": ["lucide-react", "react-hook-form"], + "dependencies": [ + "lucide-react", + "react-hook-form" + ], "registryDependencies": [ "button", "http://localhost:3000/r/settings-card.json", @@ -2691,7 +2875,9 @@ "title": "Sign Out", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "http://localhost:3000/r/use-success-transition.json" @@ -2764,7 +2950,9 @@ "description": "", "type": "registry:component", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], "files": [ { "path": "src/components/signed-in.tsx", @@ -2778,7 +2966,9 @@ "description": "", "type": "registry:component", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], "files": [ { "path": "src/components/signed-out.tsx", @@ -2792,7 +2982,9 @@ "description": "", "type": "registry:ui", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/skeleton.tsx", @@ -2806,8 +2998,12 @@ "description": "", "type": "registry:file", "target": "types/social-options.ts", - "dependencies": ["better-auth"], - "registryDependencies": ["http://localhost:3000/r/auth-client.json"], + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json" + ], "files": [ { "path": "src/types/social-options.ts", @@ -2822,7 +3018,9 @@ "description": "", "type": "registry:lib", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/provider-icons.json"], + "registryDependencies": [ + "http://localhost:3000/r/provider-icons.json" + ], "files": [ { "path": "src/lib/social-providers.ts", @@ -2851,8 +3049,12 @@ "title": "Tabs", "description": "", "type": "registry:ui", - "dependencies": ["@radix-ui/react-tabs"], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "dependencies": [ + "@radix-ui/react-tabs" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/tabs.tsx", @@ -2866,7 +3068,9 @@ "description": "", "type": "registry:ui", "dependencies": [], - "registryDependencies": ["http://localhost:3000/r/utils.json"], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], "files": [ { "path": "src/components/ui/textarea.tsx", @@ -2978,7 +3182,9 @@ "title": "Update Avatar Card", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -3004,7 +3210,11 @@ "title": "Update Field Card", "description": "", "type": "registry:component", - "dependencies": ["@hookform/resolvers", "react-hook-form", "zod"], + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], "registryDependencies": [ "http://localhost:3000/r/additional-fields.json", "http://localhost:3000/r/auth-localization.json", @@ -3030,7 +3240,10 @@ "title": "Update Member Role Dialog", "description": "", "type": "registry:component", - "dependencies": ["better-auth", "lucide-react"], + "dependencies": [ + "better-auth", + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -3148,7 +3361,10 @@ "title": "Use Conditional Query", "description": "", "type": "registry:lib", - "dependencies": ["@triplit/client", "@triplit/react"], + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], "registryDependencies": [], "files": [ { @@ -3162,8 +3378,12 @@ "title": "Use Current Organization", "description": "", "type": "registry:hook", - "dependencies": ["better-auth"], - "registryDependencies": ["http://localhost:3000/r/auth-ui-provider.json"], + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], "files": [ { "path": "src/hooks/use-current-organization.ts", @@ -3190,7 +3410,10 @@ "title": "Use Instant Options", "description": "", "type": "registry:lib", - "dependencies": ["@instantdb/react", "better-auth"], + "dependencies": [ + "@instantdb/react", + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-client.json", "http://localhost:3000/r/auth-hooks.json", @@ -3227,7 +3450,9 @@ "title": "Use List Accounts", "description": "", "type": "registry:lib", - "dependencies": ["@better-fetch/fetch"], + "dependencies": [ + "@better-fetch/fetch" + ], "registryDependencies": [ "http://localhost:3000/r/auth-hooks.json", "http://localhost:3000/r/model-names.json", @@ -3265,7 +3490,9 @@ "title": "Use List Sessions", "description": "", "type": "registry:lib", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-hooks.json", "http://localhost:3000/r/model-names.json", @@ -3283,7 +3510,9 @@ "title": "Use List Sessions", "description": "", "type": "registry:lib", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-hooks.json", "http://localhost:3000/r/model-names.json", @@ -3303,7 +3532,9 @@ "title": "Use Session", "description": "", "type": "registry:lib", - "dependencies": ["better-auth"], + "dependencies": [ + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-client.json", "http://localhost:3000/r/auth-hooks.json", @@ -3396,7 +3627,10 @@ "title": "Use Triplit Hooks", "description": "", "type": "registry:lib", - "dependencies": ["@triplit/client", "better-auth"], + "dependencies": [ + "@triplit/client", + "better-auth" + ], "registryDependencies": [ "http://localhost:3000/r/auth-client.json", "http://localhost:3000/r/auth-hooks.json", @@ -3417,7 +3651,10 @@ "title": "Use Triplit Token", "description": "", "type": "registry:lib", - "dependencies": ["@triplit/client", "@triplit/react"], + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], "registryDependencies": [], "files": [ { @@ -3431,7 +3668,9 @@ "title": "User Avatar", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/auth-ui-provider.json", @@ -3453,7 +3692,9 @@ "title": "User Button", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/any-auth-client.json", "http://localhost:3000/r/auth-client.json", @@ -3478,7 +3719,9 @@ "title": "User Invitations Card", "description": "", "type": "registry:component", - "dependencies": ["lucide-react"], + "dependencies": [ + "lucide-react" + ], "registryDependencies": [ "http://localhost:3000/r/auth-ui-provider.json", "button", @@ -3537,7 +3780,11 @@ "title": "Utils", "description": "", "type": "registry:lib", - "dependencies": ["clsx", "tailwind-merge", "zod"], + "dependencies": [ + "clsx", + "tailwind-merge", + "zod" + ], "registryDependencies": [ "http://localhost:3000/r/auth-localization.json", "http://localhost:3000/r/password-validation.json" From 86b3c191fce6c58e3cd316dd0bf936eaae53e850 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:36:32 -0400 Subject: [PATCH 03/10] update docs --- .husky/pre-commit | 3 - docs/app/global.css | 130 ------------------ .../components/accept-invitation-card.mdx | 31 ++++- .../components/account-settings-cards.mdx | 27 +++- .../content/docs/components/accounts-card.mdx | 27 +++- .../content/docs/components/api-keys-card.mdx | 31 ++++- docs/content/docs/components/auth-loading.mdx | 27 +++- .../docs/components/auth-ui-provider.mdx | 27 +++- docs/content/docs/components/auth-view.mdx | 27 +++- .../docs/components/change-email-card.mdx | 27 +++- .../docs/components/change-password-card.mdx | 27 +++- .../docs/components/delete-account-card.mdx | 27 +++- .../docs/components/email-template.mdx | 27 +++- .../components/organization-members-card.mdx | 31 ++++- .../organization-settings-cards.mdx | 32 ++++- .../docs/components/organization-switcher.mdx | 36 ++++- .../content/docs/components/passkeys-card.mdx | 28 +++- .../docs/components/providers-card.mdx | 29 +++- .../docs/components/redirect-to-sign-in.mdx | 29 +++- .../docs/components/redirect-to-sign-up.mdx | 27 +++- .../components/security-settings-cards.mdx | 27 +++- .../content/docs/components/sessions-card.mdx | 27 +++- .../docs/components/settings-cards.mdx | 29 +++- docs/content/docs/components/signed-in.mdx | 27 +++- docs/content/docs/components/signed-out.mdx | 27 +++- .../docs/components/two-factor-card.mdx | 27 +++- .../docs/components/update-avatar-card.mdx | 25 ++++ .../docs/components/update-field-card.mdx | 35 ++++- .../docs/components/update-name-card.mdx | 27 +++- .../docs/components/update-username-card.mdx | 27 +++- .../docs/components/use-authenticate.mdx | 33 ++++- docs/content/docs/components/user-avatar.mdx | 27 +++- docs/content/docs/components/user-button.mdx | 29 +++- docs/content/docs/data/tanstack-query.mdx | 27 +++- .../docs/getting-started/installation.mdx | 16 ++- docs/package.json | 100 ++++++-------- docs/view-paths.ts | 55 -------- registry.json | 1 + registry/registry.json | 1 + 39 files changed, 910 insertions(+), 307 deletions(-) delete mode 100644 docs/view-paths.ts diff --git a/.husky/pre-commit b/.husky/pre-commit index 9e2585af..35db75dc 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -12,6 +12,3 @@ pnpm delete-docs-r # 5. Copy public/r to docs/public/r pnpm copy-public-to-docs - -# 6. Run lint-staged -pnpm lint-staged diff --git a/docs/app/global.css b/docs/app/global.css index 4b9d8b8a..20a564b9 100644 --- a/docs/app/global.css +++ b/docs/app/global.css @@ -1,11 +1,6 @@ @import "tailwindcss"; @import "fumadocs-ui/css/black.css"; @import "fumadocs-ui/css/preset.css"; -@import "tw-animate-css"; -/* ----break--- -*/ -@custom-variant dark (&:is(.dark *)); @source "../node_modules/fumadocs-ui/dist/**/*.js"; @@ -32,129 +27,4 @@ Make sure disabled buttons don't get the pointer cursor. .dark { --color-fd-ring: var(--color-orange-300); --color-fd-primary: var(--color-orange-300); - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.205 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.205 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); -} - -/* ----break--- -*/ - -@theme inline { - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); -} - -/* ----break--- -*/ - -:root { - --radius: 0.625rem; - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); -} - -/* ----break--- -*/ - -@layer base { - * { - @apply border-border outline-ring/50; - } - body { - @apply bg-background text-foreground; - } } diff --git a/docs/content/docs/components/accept-invitation-card.mdx b/docs/content/docs/components/accept-invitation-card.mdx index 2151bdfe..0eecd45e 100644 --- a/docs/content/docs/components/accept-invitation-card.mdx +++ b/docs/content/docs/components/accept-invitation-card.mdx @@ -4,6 +4,31 @@ title: The `` component handles the organization invitation acceptance flow. It displays invitation details and allows users to accept or reject organization invitations. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/accept-invitation-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/accept-invitation-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/accept-invitation-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/accept-invitation-card.json + ``` + + + ## Usage This component is typically used on a dedicated invitation acceptance page: @@ -58,7 +83,7 @@ export default function AcceptInvitationPage() { ### With Custom Class Names ```tsx - description: A collection of account management cards for user profile settings --- +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/account-settings-cards.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/account-settings-cards.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/account-settings-cards.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/account-settings-cards.json + ``` + + + ## Import ```tsx @@ -95,4 +120,4 @@ The component supports full localization through the `localization` prop: - [``](/docs/components/settings-cards) - Parent component with navigation - [``](/docs/components/update-avatar-card) - Individual avatar update card - [``](/docs/components/update-name-card) - Individual name update card -- [``](/docs/components/accounts-card) - Linked accounts management \ No newline at end of file +- [``](/docs/components/accounts-card) - Linked accounts management diff --git a/docs/content/docs/components/accounts-card.mdx b/docs/content/docs/components/accounts-card.mdx index 335aee7c..b6c81140 100644 --- a/docs/content/docs/components/accounts-card.mdx +++ b/docs/content/docs/components/accounts-card.mdx @@ -3,6 +3,31 @@ title: description: Displays and manages linked social accounts --- +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/accounts-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/accounts-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/accounts-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/accounts-card.json + ``` + + + ## Import ```tsx @@ -44,4 +69,4 @@ export function AccountSettings() { - Unlink existing social accounts - Shows provider icons and account information - Built-in loading states -- Prevents unlinking if it's the only authentication method \ No newline at end of file +- Prevents unlinking if it's the only authentication method diff --git a/docs/content/docs/components/api-keys-card.mdx b/docs/content/docs/components/api-keys-card.mdx index 2c650609..976cb114 100644 --- a/docs/content/docs/components/api-keys-card.mdx +++ b/docs/content/docs/components/api-keys-card.mdx @@ -4,6 +4,31 @@ title: The `` component provides a complete interface for managing API keys, including creating, viewing, and deleting API keys for programmatic access to your application. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/api-keys-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/api-keys-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/api-keys-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/api-keys-card.json + ``` + + + ## Usage ```tsx @@ -39,7 +64,7 @@ export function APIKeysSettingsPage() { ### With Custom Class Names ```tsx - The `` component renders its children only during an authentication session loading. This provides an easy way for you to insert loading states or skeleton loaders into your UI, enhancing user experience during data fetching. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/auth-loading.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/auth-loading.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/auth-loading.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/auth-loading.json + ``` + + + ## Usage Wrap loading placeholders or loader components with `` to conditionally render them whenever authentication session data is being fetched. @@ -82,4 +107,4 @@ export function YourCustomSkeleton() { } ``` -This example skeleton provides placeholder components resembling the size and shape of loaded content, greatly reducing UI flicker and enhancing user-perceived loading performance. \ No newline at end of file +This example skeleton provides placeholder components resembling the size and shape of loaded content, greatly reducing UI flicker and enhancing user-perceived loading performance. diff --git a/docs/content/docs/components/auth-ui-provider.mdx b/docs/content/docs/components/auth-ui-provider.mdx index 08c588d3..d03df8c9 100644 --- a/docs/content/docs/components/auth-ui-provider.mdx +++ b/docs/content/docs/components/auth-ui-provider.mdx @@ -4,6 +4,31 @@ title: The `` wraps your application with authentication context, providing essential hooks, settings, and methods required by authentication-related components and hooks throughout your app. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/auth-ui-provider.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/auth-ui-provider.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/auth-ui-provider.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/auth-ui-provider.json + ``` + + + ## Usage ```tsx title="providers.tsx" @@ -104,4 +129,4 @@ export default function RootLayout({ children }: { children: React.ReactNode }) ) } -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/auth-view.mdx b/docs/content/docs/components/auth-view.mdx index 93d967b1..3772f12b 100644 --- a/docs/content/docs/components/auth-view.mdx +++ b/docs/content/docs/components/auth-view.mdx @@ -4,6 +4,31 @@ title: The `` component provides an interactive and customizable authentication interface that seamlessly integrates with your authentication flow. It supports multiple authentication methods, including email/password, magic links, passkey (WebAuthn), and social providers. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/auth-view.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/auth-view.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/auth-view.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/auth-view.json + ``` + + + ## Reference The following props can be passed to `` for customization: @@ -57,4 +82,4 @@ You can thoroughly customize `` components using TailwindCSS utility footerLink: "text-destructive hover:text-foreground", }} /> -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/change-email-card.mdx b/docs/content/docs/components/change-email-card.mdx index c4e08fcb..b488ab2b 100644 --- a/docs/content/docs/components/change-email-card.mdx +++ b/docs/content/docs/components/change-email-card.mdx @@ -7,6 +7,31 @@ The `` component provides a simple and secure UI that allows Change Email Card Change Email Card +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/change-email-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/change-email-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/change-email-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/change-email-card.json + ``` + + + ## Usage Here's how to implement `` on your custom settings page: @@ -63,4 +88,4 @@ You can pass custom text via the `localization` prop: EMAIL_VERIFY_CHANGE: "Check your inbox for the verification link!" }} /> -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/change-password-card.mdx b/docs/content/docs/components/change-password-card.mdx index 3094c07c..fec0d643 100644 --- a/docs/content/docs/components/change-password-card.mdx +++ b/docs/content/docs/components/change-password-card.mdx @@ -7,6 +7,31 @@ The `` provides a secure and user-friendly interface for u Change Password Card Change Password Card +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/change-password-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/change-password-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/change-password-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/change-password-card.json + ``` + + + ## Usage Here's how you can include `` in your user account settings page: @@ -75,4 +100,4 @@ You can easily adjust the displayed texts via the localization prop: SET_PASSWORD_EMAIL_SENT: "Check your mailbox to set your new password!" }} /> -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/delete-account-card.mdx b/docs/content/docs/components/delete-account-card.mdx index 8a3f6ce0..a5fa3956 100644 --- a/docs/content/docs/components/delete-account-card.mdx +++ b/docs/content/docs/components/delete-account-card.mdx @@ -7,6 +7,31 @@ The `` component provides users a streamlined UI to delete Delete Account Card Delete Account Card +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/delete-account-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/delete-account-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/delete-account-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/delete-account-card.json + ``` + + + ## Usage Include the `` component on your user settings page: @@ -61,4 +86,4 @@ Adjust the text within the component for specific requirements or languages: DELETE_ACCOUNT_NOT_FRESH: "Sign out and back in to delete your account.", }} /> -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/email-template.mdx b/docs/content/docs/components/email-template.mdx index db0c7b66..5bce763b 100644 --- a/docs/content/docs/components/email-template.mdx +++ b/docs/content/docs/components/email-template.mdx @@ -7,6 +7,31 @@ The `` component lets you easily build responsive HTML emails w Email Template Email Template +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/email-template.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/email-template.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/email-template.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/email-template.json + ``` + + + ## Usage This example demonstrates implementing the email verification notification with the ``: @@ -62,4 +87,4 @@ This example demonstrates using the component specifically to send email verific The following props can be passed to the `` component: - \ No newline at end of file + diff --git a/docs/content/docs/components/organization-members-card.mdx b/docs/content/docs/components/organization-members-card.mdx index ead64020..038b0f75 100644 --- a/docs/content/docs/components/organization-members-card.mdx +++ b/docs/content/docs/components/organization-members-card.mdx @@ -4,6 +4,31 @@ title: The `` component provides a comprehensive interface for managing organization members, including inviting new members, updating roles, and removing members. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/organization-members-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/organization-members-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/organization-members-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/organization-members-card.json + ``` + + + ## Usage ```tsx @@ -39,7 +64,7 @@ export function OrganizationMembersPage() { ### With Custom Class Names ```tsx - The `` component provides a comprehensive set of cards for managing organization settings, including organization details, logo, and deletion options. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/organization-settings-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/organization-settings-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/organization-settings-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/organization-settings-card.json + ``` + + + + ## Usage ```tsx @@ -38,7 +64,7 @@ export function OrganizationSettingsPage() { ### With Custom Class Names ```tsx - The `` is a comprehensive component that provides organization and personal account switching functionality. It displays the currently active organization or personal account and allows users to switch between them, create new organizations, and manage their organization settings. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/organization-switcher.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/organization-switcher.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/organization-switcher.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/organization-switcher.json + ``` + + + + ## Usage ```tsx @@ -57,7 +83,7 @@ export function Header() { ```tsx import { Button } from '@/components/ui/button' - Switch Organization @@ -69,7 +95,7 @@ import { Button } from '@/components/ui/button' ### With onSetActive Callback ```tsx - { console.log('Switched to:', organizationId) }} @@ -79,7 +105,7 @@ import { Button } from '@/components/ui/button' ### With Custom Localization ```tsx - {children} -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/passkeys-card.mdx b/docs/content/docs/components/passkeys-card.mdx index bed89afc..c5164490 100644 --- a/docs/content/docs/components/passkeys-card.mdx +++ b/docs/content/docs/components/passkeys-card.mdx @@ -3,6 +3,32 @@ title: description: Displays and manages user's passkeys/WebAuthn credentials --- +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/passkeys-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/passkeys-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/passkeys-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/passkeys-card.json + ``` + + + + ## Import ```tsx @@ -42,4 +68,4 @@ export function SecuritySettings() { - Add new passkeys - Delete existing passkeys - Shows passkey creation date and device info -- Built-in loading states \ No newline at end of file +- Built-in loading states diff --git a/docs/content/docs/components/providers-card.mdx b/docs/content/docs/components/providers-card.mdx index 412855e1..e8fe106c 100644 --- a/docs/content/docs/components/providers-card.mdx +++ b/docs/content/docs/components/providers-card.mdx @@ -9,6 +9,31 @@ The `` component provides a simple interface for managing linke Providers Card Providers Card +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/providers-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/providers-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/providers-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/providers-card.json + ``` + + + ## Usage Here's how you can include `` on your user settings or account management page: @@ -72,7 +97,7 @@ You usually integrate the `` with other settings components. He ```tsx title="app/dashboard/settings/page.tsx" import { - ProvidersCard, + ProvidersCard, ChangeEmailCard, SettingsCards, } from "@daveyplate/better-auth-ui"; @@ -92,4 +117,4 @@ export default function SettingsPage() { } ``` -This complete implementation shows how you can use `` along with other available settings cards to build a comprehensive, managed user settings experience quickly. \ No newline at end of file +This complete implementation shows how you can use `` along with other available settings cards to build a comprehensive, managed user settings experience quickly. diff --git a/docs/content/docs/components/redirect-to-sign-in.mdx b/docs/content/docs/components/redirect-to-sign-in.mdx index 2be195c1..4af03594 100644 --- a/docs/content/docs/components/redirect-to-sign-in.mdx +++ b/docs/content/docs/components/redirect-to-sign-in.mdx @@ -6,6 +6,31 @@ The `` component automatically redirects unauthenticated use Useful for wrapping pages or routes that require users to be signed in. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/redirect-to-sign-in.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/redirect-to-sign-in.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/redirect-to-sign-in.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/redirect-to-sign-in.json + ``` + + + ## Usage ```tsx @@ -35,7 +60,7 @@ export default function PrivateRoute({ children }: { children: React.ReactNode } return ( <> - + {children} @@ -44,4 +69,4 @@ export default function PrivateRoute({ children }: { children: React.ReactNode } } ``` -In this example, we're ensuring that the user is redirected to the sign-in page if they are not logged in. \ No newline at end of file +In this example, we're ensuring that the user is redirected to the sign-in page if they are not logged in. diff --git a/docs/content/docs/components/redirect-to-sign-up.mdx b/docs/content/docs/components/redirect-to-sign-up.mdx index 4dea6421..72b48e3d 100644 --- a/docs/content/docs/components/redirect-to-sign-up.mdx +++ b/docs/content/docs/components/redirect-to-sign-up.mdx @@ -4,6 +4,31 @@ title: "" The `` component ensures users are redirected to the sign-up page if they are not authenticated. If the user is signed in, it does nothing. It's useful for protected pages in your application, specifically when you want unauthenticated users to immediately register instead of logging in. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/redirect-to-sign-up.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/redirect-to-sign-up.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/redirect-to-sign-up.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/redirect-to-sign-up.json + ``` + + + ## Usage ```tsx @@ -20,4 +45,4 @@ export default function ProtectedPage() { ) } -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/security-settings-cards.mdx b/docs/content/docs/components/security-settings-cards.mdx index 65f7519e..55cce6a8 100644 --- a/docs/content/docs/components/security-settings-cards.mdx +++ b/docs/content/docs/components/security-settings-cards.mdx @@ -3,6 +3,31 @@ title: description: A collection of security-related settings cards for user account protection --- +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/security-settings-cards.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/security-settings-cards.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/security-settings-cards.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/security-settings-cards.json + ``` + + + ## Import ```tsx @@ -110,4 +135,4 @@ This component handles sensitive security settings. It includes: - [``](/docs/components/change-password-card) - Individual password change card - [``](/docs/components/two-factor-card) - Two-factor authentication management - [``](/docs/components/sessions-card) - Active sessions management -- [``](/docs/components/delete-account-card) - Account deletion \ No newline at end of file +- [``](/docs/components/delete-account-card) - Account deletion diff --git a/docs/content/docs/components/sessions-card.mdx b/docs/content/docs/components/sessions-card.mdx index 3f4ea2da..820de37a 100644 --- a/docs/content/docs/components/sessions-card.mdx +++ b/docs/content/docs/components/sessions-card.mdx @@ -7,6 +7,31 @@ The `` component provides users with an intuitive interface for Sessions Card Sessions Card +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/sessions-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/sessions-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/sessions-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/sessions-card.json + ``` + + + ## Usage Include the `` component within your account settings page or security settings page: @@ -62,4 +87,4 @@ The text within `` can be customized through the `localization` /> ``` ---- \ No newline at end of file +--- diff --git a/docs/content/docs/components/settings-cards.mdx b/docs/content/docs/components/settings-cards.mdx index 283734c2..3246f658 100644 --- a/docs/content/docs/components/settings-cards.mdx +++ b/docs/content/docs/components/settings-cards.mdx @@ -9,11 +9,36 @@ This component automatically leverages all the features you have enabled via the Settings Cards Settings Cards +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/settings-cards.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/settings-cards.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/settings-cards.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/settings-cards.json + ``` + + + ## Default Settings Page Behavior By default, the built-in [``](/components/auth-view) component automatically displays `` when the `/auth/settings` route is accessed. If you prefer to handle user settings on a custom route or component, you can override this behavior using the `settings.url` prop. -## Overriding Built-in Settings URL +## Overriding Built-in Settings URL To use your own custom settings route and avoid using the default included settings card, you can specify the `settings.url` prop within your [``](/components/auth-ui-provider) configuration: @@ -93,7 +118,7 @@ Using Tailwind utility classes, you can fully customize all card states. Here's /> ``` -### All available settings included in SettingsCards: +### All available settings included in SettingsCards: - **Avatar** (optional, requires avatar upload configured in AuthUIProvider) - **Name** diff --git a/docs/content/docs/components/signed-in.mdx b/docs/content/docs/components/signed-in.mdx index 2341f8c4..71ae5743 100644 --- a/docs/content/docs/components/signed-in.mdx +++ b/docs/content/docs/components/signed-in.mdx @@ -6,6 +6,31 @@ The `` component conditionally renders its child components based on Use it to display content only visible to logged-in users. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/signed-in.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/signed-in.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/signed-in.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/signed-in.json + ``` + + + ## Usage Basic usage example: @@ -52,4 +77,4 @@ export default function Navbar() { } ``` -In this example, the [``](/components/user-button) component is displayed only if the user has an active session. Otherwise, visitors are prompted with a sign-in link. \ No newline at end of file +In this example, the [``](/components/user-button) component is displayed only if the user has an active session. Otherwise, visitors are prompted with a sign-in link. diff --git a/docs/content/docs/components/signed-out.mdx b/docs/content/docs/components/signed-out.mdx index 513d4a5d..c72a4498 100644 --- a/docs/content/docs/components/signed-out.mdx +++ b/docs/content/docs/components/signed-out.mdx @@ -6,6 +6,31 @@ The `` component conditionally renders its children only when the u Use this component to conditionally hide or show content based on the user's authentication status. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/signed-out.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/signed-out.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/signed-out.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/signed-out.json + ``` + + + ## Usage Wrap any content that should be displayed only to signed-out (unauthenticated) users within the `` component: @@ -54,4 +79,4 @@ export default function Navbar() { ) } -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/two-factor-card.mdx b/docs/content/docs/components/two-factor-card.mdx index b9ebed52..95cd7635 100644 --- a/docs/content/docs/components/two-factor-card.mdx +++ b/docs/content/docs/components/two-factor-card.mdx @@ -4,6 +4,31 @@ title: The `` provides a secure interface for managing two-factor authentication (2FA), allowing users to enable or disable 2FA with password confirmation. It handles the complete setup flow including QR code scanning and backup codes generation. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/two-factor-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/two-factor-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/two-factor-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/two-factor-card.json + ``` + + + ## Usage Here's how you can include `` in your settings page: @@ -37,4 +62,4 @@ Customize the component appearance using Tailwind CSS classes through the `class instructions: "text-muted-foreground" }} /> -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/update-avatar-card.mdx b/docs/content/docs/components/update-avatar-card.mdx index 8827214a..3d673acb 100644 --- a/docs/content/docs/components/update-avatar-card.mdx +++ b/docs/content/docs/components/update-avatar-card.mdx @@ -7,6 +7,31 @@ The `` component is a pre-built UI element for users to easi Update Avatar Card Update Avatar Card +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/update-avatar-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/update-avatar-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/update-avatar-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/update-avatar-card.json + ``` + + + ## Usage Here's how to include the `` component within your custom settings page. If you don't provide an `avatar.upload` function, the component will store the avatar image as a base64 string in database. diff --git a/docs/content/docs/components/update-field-card.mdx b/docs/content/docs/components/update-field-card.mdx index 805536fa..b020e103 100644 --- a/docs/content/docs/components/update-field-card.mdx +++ b/docs/content/docs/components/update-field-card.mdx @@ -3,6 +3,31 @@ title: description: Generic settings card for updating custom user fields --- +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/update-field-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/update-field-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/update-field-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/update-field-card.json + ``` + + + ## Import ```tsx @@ -12,7 +37,7 @@ import { UpdateFieldCard } from "@better-auth/ui-react/components" ## Usage ```tsx - description: Settings card for updating user's display name --- +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/update-name-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/update-name-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/update-name-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/update-name-card.json + ``` + + + ## Import ```tsx @@ -42,4 +67,4 @@ export function AccountSettings() { - Built-in form validation - Success/error feedback - Loading states during update -- Integrated with Better Auth session management \ No newline at end of file +- Integrated with Better Auth session management diff --git a/docs/content/docs/components/update-username-card.mdx b/docs/content/docs/components/update-username-card.mdx index d2bd08a4..b6236109 100644 --- a/docs/content/docs/components/update-username-card.mdx +++ b/docs/content/docs/components/update-username-card.mdx @@ -4,6 +4,31 @@ title: The `` component provides a simple, intuitive UI that enables users to update their account username within the authentication system. This component automatically integrates with the [`AuthUIProvider`](/components/auth-ui-provider) context, leveraging the username configuration set by your authentication framework. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/update-username-card.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/update-username-card.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/update-username-card.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/update-username-card.json + ``` + + + ## Usage Include the `` in your custom settings or profile page: @@ -42,4 +67,4 @@ The styles can be customized precisely with Tailwind classes via the `classNames input: "bg-background border-blue-500 placeholder:text-muted", }} /> -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/use-authenticate.mdx b/docs/content/docs/components/use-authenticate.mdx index 20d9610a..9aa4ccda 100644 --- a/docs/content/docs/components/use-authenticate.mdx +++ b/docs/content/docs/components/use-authenticate.mdx @@ -6,6 +6,31 @@ The `useAuthenticate()` hook automatically redirects unauthenticated users to th This is a hook alternative to the `` component, useful for redirecting users programmatically. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/use-authenticate.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/use-authenticate.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/use-authenticate.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/use-authenticate.json + ``` + + + ## Usage ```tsx @@ -14,7 +39,7 @@ import { useAuthenticate } from "@daveyplate/better-auth-ui" export default function ProtectedPage() { // Will redirect to sign-in if user is not authenticated useAuthenticate() - + return
Protected content visible only to authenticated users
} ``` @@ -43,7 +68,7 @@ export default function ProtectedSignUpPage() { useAuthenticate({ authView: "signUp", }) - + return
Protected content
} ``` @@ -60,7 +85,7 @@ export default function ConditionalProtectedPage({ isProtected }: { isProtected: useAuthenticate({ enabled: isProtected }) - + return
This content may or may not be protected
} -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/user-avatar.mdx b/docs/content/docs/components/user-avatar.mdx index d03993b9..c307b87b 100644 --- a/docs/content/docs/components/user-avatar.mdx +++ b/docs/content/docs/components/user-avatar.mdx @@ -10,6 +10,31 @@ The `` component renders a user's avatar image based on the provid Seto +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/user-avatar.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/user-avatar.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/user-avatar.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/user-avatar.json + ``` + + + ## Usage ```tsx @@ -56,4 +81,4 @@ export default function Example() { /> ) } -``` \ No newline at end of file +``` diff --git a/docs/content/docs/components/user-button.mdx b/docs/content/docs/components/user-button.mdx index 1dec71f3..677e77c0 100644 --- a/docs/content/docs/components/user-button.mdx +++ b/docs/content/docs/components/user-button.mdx @@ -2,12 +2,37 @@ title: --- -The `` component provides an easy-to-use dropdown menu button that displays user account information and session management actions. It includes an avatar, provides quick access to user settings, linked accounts, and session management actions. +The `` component provides an easy-to-use dropdown menu button that displays user account information and session management actions. It includes an avatar, provides quick access to user settings, linked accounts, and session management actions. Seto User Dropdown Dark User Dropdown Light +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/user-button.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/user-button.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/user-button.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/user-button.json + ``` + + + ## Usage ```tsx @@ -86,4 +111,4 @@ export default function Example() { /> ) } -``` \ No newline at end of file +``` diff --git a/docs/content/docs/data/tanstack-query.mdx b/docs/content/docs/data/tanstack-query.mdx index d72310a5..c54b3535 100644 --- a/docs/content/docs/data/tanstack-query.mdx +++ b/docs/content/docs/data/tanstack-query.mdx @@ -7,6 +7,31 @@ In order to use `@daveyplate/better-auth-ui` with the [`@daveyplate/better-auth- The main difference is the `persistClient` prop which is only required if you are using a [`persistQueryClient`](https://tanstack.com/query/latest/docs/framework/react/plugins/persistQueryClient) for offline Authentication. This prop will tell the authentication methods to use the `/auth/callback` path for all authentication methods that leave the site, which will clear your query cache for you automatically. +## Installation + + + + ```shell + npx shadcn@latest add https://better-auth-ui.com/r/auth-ui-provider-tanstack.json + ``` + + + ```shell + pnpx shadcn@latest add https://better-auth-ui.com/r/auth-ui-provider-tanstack.json + ``` + + + ```shell + yarn shadcn add https://better-auth-ui.com/r/auth-ui-provider-tanstack.json + ``` + + + ```shell + bunx shadcn@latest add https://better-auth-ui.com/r/auth-ui-provider-tanstack.json + ``` + + + ```tsx title="app/providers.tsx" "use client" @@ -35,4 +60,4 @@ export function Providers({ children }: { children: React.ReactNode }) { ) } -``` \ No newline at end of file +``` diff --git a/docs/content/docs/getting-started/installation.mdx b/docs/content/docs/getting-started/installation.mdx index 3065b9e5..7f7714d4 100644 --- a/docs/content/docs/getting-started/installation.mdx +++ b/docs/content/docs/getting-started/installation.mdx @@ -6,6 +6,8 @@ import { Step, Steps } from 'fumadocs-ui/components/steps'; Follow the steps below to install the `@daveyplate/better-auth-ui` library. +You can choose to install the library OR use the shadcn CLI to install individual components. If you choose to do that, do NOT follow these steps below, instead use the install commands on each component's page. + ## Install the Package @@ -58,12 +60,12 @@ Now that you've installed `@daveyplate/better-auth-ui`, follow one of the guides -

Manual

*/} - \ No newline at end of file + diff --git a/docs/package.json b/docs/package.json index 76cde97e..1d87146b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,60 +1,44 @@ { - "name": "fumadocs", - "version": "0.0.0", - "private": true, - "scripts": { - "build": "next build", - "dev": "next dev --turbo", - "start": "next start", - "postinstall": "fumadocs-mdx", - "check-types": "tsc --noEmit" - }, - "dependencies": { - "@better-fetch/fetch": "^1.1.18", - "@hookform/resolvers": "^5.2.1", - "@noble/hashes": "^1.8.0", - "@radix-ui/react-avatar": "^1.1.10", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.7", - "@radix-ui/react-slot": "^1.2.3", - "@wojtekmaj/react-recaptcha-v3": "^0.1.4", - "better-auth": "^1.3.6", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "fumadocs-core": "15.5.1", - "fumadocs-docgen": "^2.0.0", - "fumadocs-mdx": "11.6.7", - "fumadocs-typescript": "^4.0.5", - "fumadocs-ui": "15.5.1", - "geist": "^1.4.2", - "lucide-react": "^0.514.0", - "next": "15.3.3", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.62.0", - "remark": "^15.0.1", - "remark-gfm": "^4.0.1", - "remark-mdx": "^3.1.0", - "shiki": "^3.6.0", - "sonner": "^2.0.7", - "tailwind-merge": "^3.3.1", - "ts-morph": "^26.0.0", - "zod": "^4.0.17" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@tailwindcss/postcss": "^4.1.8", - "@types/mdx": "^2.0.13", - "@types/node": "24.0.0", - "@types/react": "^19.1.7", - "@types/react-dom": "^19.1.6", - "postcss": "^8.5.4", - "remark-code-import": "^1.2.0", - "tailwindcss": "^4.1.8", - "turbo": "^2.5.4", - "tw-animate-css": "^1.3.6", - "typescript": "^5.8.3" - }, - "packageManager": "pnpm@10.1.0" + "name": "fumadocs", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "next build", + "dev": "next dev --turbo", + "start": "next start", + "postinstall": "fumadocs-mdx", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "fumadocs-core": "15.5.1", + "fumadocs-docgen": "^2.0.0", + "fumadocs-mdx": "11.6.7", + "fumadocs-typescript": "^4.0.5", + "fumadocs-ui": "15.5.1", + "geist": "^1.4.2", + "lucide-react": "^0.514.0", + "next": "15.3.3", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-mdx": "^3.1.0", + "shiki": "^3.6.0", + "ts-morph": "^26.0.0" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@tailwindcss/postcss": "^4.1.8", + "@types/mdx": "^2.0.13", + "@types/node": "24.0.0", + "@types/react": "^19.1.7", + "@types/react-dom": "^19.1.6", + "postcss": "^8.5.4", + "remark-code-import": "^1.2.0", + "tailwindcss": "^4.1.8", + "turbo": "^2.5.4", + "tw-animate-css": "^1.3.6", + "typescript": "^5.8.3" + }, + "packageManager": "pnpm@10.1.0" } diff --git a/docs/view-paths.ts b/docs/view-paths.ts deleted file mode 100644 index 6f32bb79..00000000 --- a/docs/view-paths.ts +++ /dev/null @@ -1,55 +0,0 @@ -export const authViewPaths = { - /** @default "callback" */ - CALLBACK: "callback", - /** @default "email-otp" */ - EMAIL_OTP: "email-otp", - /** @default "forgot-password" */ - FORGOT_PASSWORD: "forgot-password", - /** @default "magic-link" */ - MAGIC_LINK: "magic-link", - /** @default "recover-account" */ - RECOVER_ACCOUNT: "recover-account", - /** @default "reset-password" */ - RESET_PASSWORD: "reset-password", - /** @default "sign-in" */ - SIGN_IN: "sign-in", - /** @default "sign-out" */ - SIGN_OUT: "sign-out", - /** @default "sign-up" */ - SIGN_UP: "sign-up", - /** @default "two-factor" */ - TWO_FACTOR: "two-factor" -} - -export type AuthViewPaths = typeof authViewPaths - -// Account-scoped views (signed-in user) -export const accountViewPaths = { - /** @default "settings" */ - SETTINGS: "settings", - /** @default "security" */ - SECURITY: "security", - /** @default "api-keys" */ - API_KEYS: "api-keys", - /** @default "organizations" */ - ORGANIZATIONS: "organizations", - /** @default "accept-invitation" */ - ACCEPT_INVITATION: "accept-invitation" -} - -export type AccountViewPaths = typeof accountViewPaths - -// Organization-scoped views -export const organizationViewPaths = { - /** @default "settings" */ - SETTINGS: "settings", - /** @default "members" */ - MEMBERS: "members", - /** @default "api-keys" */ - API_KEYS: "api-keys" -} - -export type OrganizationViewPaths = typeof organizationViewPaths -export type AuthViewPath = keyof AuthViewPaths -export type AccountViewPath = keyof AccountViewPaths -export type OrganizationViewPath = keyof OrganizationViewPaths diff --git a/registry.json b/registry.json index 78a75acd..606573de 100644 --- a/registry.json +++ b/registry.json @@ -1,6 +1,7 @@ { "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "local", + "homepage": "https://better-auth-ui.com", "items": [ { "name": "accept-invitation-card", diff --git a/registry/registry.json b/registry/registry.json index 78a75acd..606573de 100644 --- a/registry/registry.json +++ b/registry/registry.json @@ -1,6 +1,7 @@ { "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "local", + "homepage": "https://better-auth-ui.com", "items": [ { "name": "accept-invitation-card", From 44a82ed2f0b13e6bccb30ec772fa0b396849e40c Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:50:25 -0400 Subject: [PATCH 04/10] fix registry gen --- package.json | 2 +- public/r/accept-invitation-card.json | 28 ++++++++++++++ public/r/account-cell.json | 29 +++++++++++++++ public/r/account-options.json | 19 ++++++++++ public/r/account-settings-cards.json | 27 ++++++++++++++ public/r/account-view.json | 31 ++++++++++++++++ public/r/accounts-card.json | 23 ++++++++++++ public/r/additional-fields.json | 17 +++++++++ public/r/admin-error-codes.json | 17 +++++++++ public/r/alert.json | 20 ++++++++++ public/r/anonymous-error-codes.json | 17 +++++++++ public/r/any-auth-client.json | 19 ++++++++++ public/r/api-key-cell.json | 29 +++++++++++++++ public/r/api-key-delete-dialog.json | 29 +++++++++++++++ public/r/api-key-display-dialog.json | 25 +++++++++++++ public/r/api-key-error-codes.json | 17 +++++++++ public/r/api-key.json | 17 +++++++++ public/r/api-keys-card.json | 24 ++++++++++++ public/r/auth-callback.json | 21 +++++++++++ public/r/auth-client.json | 19 ++++++++++ public/r/auth-data-cache.json | 16 ++++++++ public/r/auth-form.json | 31 ++++++++++++++++ public/r/auth-hooks.json | 26 +++++++++++++ public/r/auth-loading.json | 18 +++++++++ public/r/auth-localization.json | 33 +++++++++++++++++ public/r/auth-mutators.json | 17 +++++++++ public/r/auth-ui-provider-tanstack.json | 19 ++++++++++ public/r/auth-ui-provider.json | 41 +++++++++++++++++++++ public/r/auth-view.json | 36 ++++++++++++++++++ public/r/avatar-options.json | 19 ++++++++++ public/r/avatar.json | 20 ++++++++++ public/r/backup-codes-dialog.json | 24 ++++++++++++ public/r/base-error-codes.json | 17 +++++++++ public/r/button.json | 21 +++++++++++ public/r/captcha-error-codes.json | 17 +++++++++ public/r/captcha-options.json | 19 ++++++++++ public/r/captcha-provider.json | 17 +++++++++ public/r/captcha.json | 25 +++++++++++++ public/r/card.json | 18 +++++++++ public/r/change-email-card.json | 28 ++++++++++++++ public/r/change-password-card.json | 30 +++++++++++++++ public/r/checkbox.json | 21 +++++++++++ public/r/create-api-key-dialog.json | 36 ++++++++++++++++++ public/r/create-organization-dialog.json | 33 +++++++++++++++++ public/r/credentials-options.json | 19 ++++++++++ public/r/delete-account-card.json | 21 +++++++++++ public/r/delete-account-dialog.json | 32 ++++++++++++++++ public/r/delete-organization-card.json | 23 ++++++++++++ public/r/delete-organization-dialog.json | 33 +++++++++++++++++ public/r/delete-user-options.json | 17 +++++++++ public/r/dialog.json | 21 +++++++++++ public/r/drawer.json | 20 ++++++++++ public/r/dropdown-menu.json | 21 +++++++++++ public/r/email-otp-button.json | 25 +++++++++++++ public/r/email-otp-error-codes.json | 17 +++++++++ public/r/email-otp-form.json | 33 +++++++++++++++++ public/r/email-template.json | 20 ++++++++++ public/r/fetch-error.json | 17 +++++++++ public/r/forgot-password-form.json | 33 +++++++++++++++++ public/r/form-error.json | 23 ++++++++++++ public/r/form.json | 23 ++++++++++++ public/r/generic-oauth-error-codes.json | 17 +++++++++ public/r/generic-oauth-options.json | 20 ++++++++++ public/r/gravatar-options.json | 17 +++++++++ public/r/gravatar-utils.json | 20 ++++++++++ public/r/haveibeenpwned-error-codes.json | 17 +++++++++ public/r/image-utils.json | 16 ++++++++ public/r/image.json | 17 +++++++++ public/r/input-field-skeleton.json | 20 ++++++++++ public/r/input-otp.json | 21 +++++++++++ public/r/input.json | 18 +++++++++ public/r/invitation-cell.json | 29 +++++++++++++++ public/r/invitation.json | 17 +++++++++ public/r/invite-member-dialog.json | 32 ++++++++++++++++ public/r/label.json | 20 ++++++++++ public/r/leave-organization-dialog.json | 28 ++++++++++++++ public/r/link.json | 17 +++++++++ public/r/magic-link-button.json | 25 +++++++++++++ public/r/magic-link-form.json | 33 +++++++++++++++++ public/r/member-cell.json | 31 ++++++++++++++++ public/r/model-names.json | 16 ++++++++ public/r/multi-session-error-codes.json | 17 +++++++++ public/r/one-tap.json | 21 +++++++++++ public/r/organization-cell-view.json | 24 ++++++++++++ public/r/organization-cell.json | 29 +++++++++++++++ public/r/organization-error-codes.json | 17 +++++++++ public/r/organization-invitations-card.json | 25 +++++++++++++ public/r/organization-logo-card.json | 32 ++++++++++++++++ public/r/organization-logo.json | 25 +++++++++++++ public/r/organization-members-card.json | 26 +++++++++++++ public/r/organization-name-card.json | 30 +++++++++++++++ public/r/organization-options.json | 19 ++++++++++ public/r/organization-refetcher.json | 19 ++++++++++ public/r/organization-settings-cards.json | 25 +++++++++++++ public/r/organization-slug-card.json | 30 +++++++++++++++ public/r/organization-switcher.json | 33 +++++++++++++++++ public/r/organization-view.json | 30 +++++++++++++++ public/r/organizations-card.json | 25 +++++++++++++ public/r/otp-input-group.json | 18 +++++++++ public/r/passkey-button.json | 25 +++++++++++++ public/r/passkey-cell.json | 26 +++++++++++++ public/r/passkey-error-codes.json | 17 +++++++++ public/r/passkeys-card.json | 27 ++++++++++++++ public/r/password-input.json | 22 +++++++++++ public/r/password-validation.json | 17 +++++++++ public/r/personal-account-view.json | 22 +++++++++++ public/r/phone-number-error-codes.json | 17 +++++++++ public/r/profile.json | 17 +++++++++ public/r/provider-button.json | 25 +++++++++++++ public/r/provider-cell.json | 29 +++++++++++++++ public/r/provider-icons.json | 16 ++++++++ public/r/providers-card.json | 26 +++++++++++++ public/r/recaptcha-badge.json | 21 +++++++++++ public/r/recaptcha-v2.json | 23 ++++++++++++ public/r/recaptcha-v3.json | 23 ++++++++++++ public/r/recover-account-form.json | 30 +++++++++++++++ public/r/redirect-to-sign-in.json | 18 +++++++++ public/r/redirect-to-sign-up.json | 18 +++++++++ public/r/refetch.json | 17 +++++++++ public/r/remove-member-dialog.json | 27 ++++++++++++++ public/r/render-toast.json | 17 +++++++++ public/r/reset-password-form.json | 30 +++++++++++++++ public/r/security-settings-cards.json | 27 ++++++++++++++ public/r/select.json | 21 +++++++++++ public/r/separator.json | 20 ++++++++++ public/r/session-cell.json | 28 ++++++++++++++ public/r/session-freshness-dialog.json | 23 ++++++++++++ public/r/sessions-card.json | 24 ++++++++++++ public/r/settings-action-button.json | 23 ++++++++++++ public/r/settings-card-footer.json | 22 +++++++++++ public/r/settings-card-header.json | 21 +++++++++++ public/r/settings-card.json | 23 ++++++++++++ public/r/settings-cell-skeleton.json | 21 +++++++++++ public/r/sign-in-form.json | 37 +++++++++++++++++++ public/r/sign-out.json | 21 +++++++++++ public/r/sign-up-form.json | 41 +++++++++++++++++++++ public/r/sign-up-options.json | 17 +++++++++ public/r/signed-in.json | 18 +++++++++ public/r/signed-out.json | 18 +++++++++ public/r/skeleton.json | 18 +++++++++ public/r/social-options.json | 21 +++++++++++ public/r/social-providers.json | 18 +++++++++ public/r/stripe-localization.json | 17 +++++++++ public/r/tabs.json | 20 ++++++++++ public/r/textarea.json | 18 +++++++++ public/r/two-factor-card.json | 22 +++++++++++ public/r/two-factor-error-codes.json | 17 +++++++++ public/r/two-factor-form.json | 37 +++++++++++++++++++ public/r/two-factor-password-dialog.json | 30 +++++++++++++++ public/r/update-avatar-card.json | 30 +++++++++++++++ public/r/update-field-card.json | 32 ++++++++++++++++ public/r/update-member-role-dialog.json | 28 ++++++++++++++ public/r/update-name-card.json | 20 ++++++++++ public/r/update-username-card.json | 21 +++++++++++ public/r/use-auth-data.json | 21 +++++++++++ public/r/use-authenticate.json | 19 ++++++++++ public/r/use-captcha.json | 24 ++++++++++++ public/r/use-conditional-query.json | 19 ++++++++++ public/r/use-current-organization.json | 20 ++++++++++ public/r/use-hydrated.json | 16 ++++++++ public/r/use-instant-options.json | 28 ++++++++++++++ public/r/use-lang.json | 16 ++++++++ public/r/use-list-accounts.json | 22 +++++++++++ public/r/use-list-sessions.json | 24 ++++++++++++ public/r/use-session.json | 23 ++++++++++++ public/r/use-success-transition.json | 19 ++++++++++ public/r/use-tanstack-options.json | 24 ++++++++++++ public/r/use-theme.json | 16 ++++++++ public/r/use-triplit-hooks.json | 26 +++++++++++++ public/r/use-triplit-token.json | 19 ++++++++++ public/r/user-avatar.json | 26 +++++++++++++ public/r/user-button.json | 29 +++++++++++++++ public/r/user-invitations-card.json | 26 +++++++++++++ public/r/user-view.json | 23 ++++++++++++ public/r/username-error-codes.json | 17 +++++++++ public/r/utils.json | 23 ++++++++++++ public/r/view-paths.json | 16 ++++++++ 177 files changed, 4045 insertions(+), 1 deletion(-) create mode 100644 public/r/accept-invitation-card.json create mode 100644 public/r/account-cell.json create mode 100644 public/r/account-options.json create mode 100644 public/r/account-settings-cards.json create mode 100644 public/r/account-view.json create mode 100644 public/r/accounts-card.json create mode 100644 public/r/additional-fields.json create mode 100644 public/r/admin-error-codes.json create mode 100644 public/r/alert.json create mode 100644 public/r/anonymous-error-codes.json create mode 100644 public/r/any-auth-client.json create mode 100644 public/r/api-key-cell.json create mode 100644 public/r/api-key-delete-dialog.json create mode 100644 public/r/api-key-display-dialog.json create mode 100644 public/r/api-key-error-codes.json create mode 100644 public/r/api-key.json create mode 100644 public/r/api-keys-card.json create mode 100644 public/r/auth-callback.json create mode 100644 public/r/auth-client.json create mode 100644 public/r/auth-data-cache.json create mode 100644 public/r/auth-form.json create mode 100644 public/r/auth-hooks.json create mode 100644 public/r/auth-loading.json create mode 100644 public/r/auth-localization.json create mode 100644 public/r/auth-mutators.json create mode 100644 public/r/auth-ui-provider-tanstack.json create mode 100644 public/r/auth-ui-provider.json create mode 100644 public/r/auth-view.json create mode 100644 public/r/avatar-options.json create mode 100644 public/r/avatar.json create mode 100644 public/r/backup-codes-dialog.json create mode 100644 public/r/base-error-codes.json create mode 100644 public/r/button.json create mode 100644 public/r/captcha-error-codes.json create mode 100644 public/r/captcha-options.json create mode 100644 public/r/captcha-provider.json create mode 100644 public/r/captcha.json create mode 100644 public/r/card.json create mode 100644 public/r/change-email-card.json create mode 100644 public/r/change-password-card.json create mode 100644 public/r/checkbox.json create mode 100644 public/r/create-api-key-dialog.json create mode 100644 public/r/create-organization-dialog.json create mode 100644 public/r/credentials-options.json create mode 100644 public/r/delete-account-card.json create mode 100644 public/r/delete-account-dialog.json create mode 100644 public/r/delete-organization-card.json create mode 100644 public/r/delete-organization-dialog.json create mode 100644 public/r/delete-user-options.json create mode 100644 public/r/dialog.json create mode 100644 public/r/drawer.json create mode 100644 public/r/dropdown-menu.json create mode 100644 public/r/email-otp-button.json create mode 100644 public/r/email-otp-error-codes.json create mode 100644 public/r/email-otp-form.json create mode 100644 public/r/email-template.json create mode 100644 public/r/fetch-error.json create mode 100644 public/r/forgot-password-form.json create mode 100644 public/r/form-error.json create mode 100644 public/r/form.json create mode 100644 public/r/generic-oauth-error-codes.json create mode 100644 public/r/generic-oauth-options.json create mode 100644 public/r/gravatar-options.json create mode 100644 public/r/gravatar-utils.json create mode 100644 public/r/haveibeenpwned-error-codes.json create mode 100644 public/r/image-utils.json create mode 100644 public/r/image.json create mode 100644 public/r/input-field-skeleton.json create mode 100644 public/r/input-otp.json create mode 100644 public/r/input.json create mode 100644 public/r/invitation-cell.json create mode 100644 public/r/invitation.json create mode 100644 public/r/invite-member-dialog.json create mode 100644 public/r/label.json create mode 100644 public/r/leave-organization-dialog.json create mode 100644 public/r/link.json create mode 100644 public/r/magic-link-button.json create mode 100644 public/r/magic-link-form.json create mode 100644 public/r/member-cell.json create mode 100644 public/r/model-names.json create mode 100644 public/r/multi-session-error-codes.json create mode 100644 public/r/one-tap.json create mode 100644 public/r/organization-cell-view.json create mode 100644 public/r/organization-cell.json create mode 100644 public/r/organization-error-codes.json create mode 100644 public/r/organization-invitations-card.json create mode 100644 public/r/organization-logo-card.json create mode 100644 public/r/organization-logo.json create mode 100644 public/r/organization-members-card.json create mode 100644 public/r/organization-name-card.json create mode 100644 public/r/organization-options.json create mode 100644 public/r/organization-refetcher.json create mode 100644 public/r/organization-settings-cards.json create mode 100644 public/r/organization-slug-card.json create mode 100644 public/r/organization-switcher.json create mode 100644 public/r/organization-view.json create mode 100644 public/r/organizations-card.json create mode 100644 public/r/otp-input-group.json create mode 100644 public/r/passkey-button.json create mode 100644 public/r/passkey-cell.json create mode 100644 public/r/passkey-error-codes.json create mode 100644 public/r/passkeys-card.json create mode 100644 public/r/password-input.json create mode 100644 public/r/password-validation.json create mode 100644 public/r/personal-account-view.json create mode 100644 public/r/phone-number-error-codes.json create mode 100644 public/r/profile.json create mode 100644 public/r/provider-button.json create mode 100644 public/r/provider-cell.json create mode 100644 public/r/provider-icons.json create mode 100644 public/r/providers-card.json create mode 100644 public/r/recaptcha-badge.json create mode 100644 public/r/recaptcha-v2.json create mode 100644 public/r/recaptcha-v3.json create mode 100644 public/r/recover-account-form.json create mode 100644 public/r/redirect-to-sign-in.json create mode 100644 public/r/redirect-to-sign-up.json create mode 100644 public/r/refetch.json create mode 100644 public/r/remove-member-dialog.json create mode 100644 public/r/render-toast.json create mode 100644 public/r/reset-password-form.json create mode 100644 public/r/security-settings-cards.json create mode 100644 public/r/select.json create mode 100644 public/r/separator.json create mode 100644 public/r/session-cell.json create mode 100644 public/r/session-freshness-dialog.json create mode 100644 public/r/sessions-card.json create mode 100644 public/r/settings-action-button.json create mode 100644 public/r/settings-card-footer.json create mode 100644 public/r/settings-card-header.json create mode 100644 public/r/settings-card.json create mode 100644 public/r/settings-cell-skeleton.json create mode 100644 public/r/sign-in-form.json create mode 100644 public/r/sign-out.json create mode 100644 public/r/sign-up-form.json create mode 100644 public/r/sign-up-options.json create mode 100644 public/r/signed-in.json create mode 100644 public/r/signed-out.json create mode 100644 public/r/skeleton.json create mode 100644 public/r/social-options.json create mode 100644 public/r/social-providers.json create mode 100644 public/r/stripe-localization.json create mode 100644 public/r/tabs.json create mode 100644 public/r/textarea.json create mode 100644 public/r/two-factor-card.json create mode 100644 public/r/two-factor-error-codes.json create mode 100644 public/r/two-factor-form.json create mode 100644 public/r/two-factor-password-dialog.json create mode 100644 public/r/update-avatar-card.json create mode 100644 public/r/update-field-card.json create mode 100644 public/r/update-member-role-dialog.json create mode 100644 public/r/update-name-card.json create mode 100644 public/r/update-username-card.json create mode 100644 public/r/use-auth-data.json create mode 100644 public/r/use-authenticate.json create mode 100644 public/r/use-captcha.json create mode 100644 public/r/use-conditional-query.json create mode 100644 public/r/use-current-organization.json create mode 100644 public/r/use-hydrated.json create mode 100644 public/r/use-instant-options.json create mode 100644 public/r/use-lang.json create mode 100644 public/r/use-list-accounts.json create mode 100644 public/r/use-list-sessions.json create mode 100644 public/r/use-session.json create mode 100644 public/r/use-success-transition.json create mode 100644 public/r/use-tanstack-options.json create mode 100644 public/r/use-theme.json create mode 100644 public/r/use-triplit-hooks.json create mode 100644 public/r/use-triplit-token.json create mode 100644 public/r/user-avatar.json create mode 100644 public/r/user-button.json create mode 100644 public/r/user-invitations-card.json create mode 100644 public/r/user-view.json create mode 100644 public/r/username-error-codes.json create mode 100644 public/r/utils.json create mode 100644 public/r/view-paths.json diff --git a/package.json b/package.json index 780b088f..e97eea50 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "tsup --clean --dts && cp src/style.css dist/style.css", "dev": "tsc-watch", "prepublishOnly": "rm -rf dist && turbo build", - "registry:generate": "node scripts/generate.mjs --registry-homepage=https://better-auth-ui.com", + "registry:generate": "node scripts/generate.mjs --registry-homepage=https://better-auth-ui.com --registry-dependency-base-url https://better-auth-ui.com/r/", "registry:build": "shadcn build", "prepare": "husky", "copy-registry": "cp registry/registry.json ./registry.json", diff --git a/public/r/accept-invitation-card.json b/public/r/accept-invitation-card.json new file mode 100644 index 00000000..6ef5610c --- /dev/null +++ b/public/r/accept-invitation-card.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "accept-invitation-card", + "type": "registry:component", + "title": "Accept Invitation Card", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-authenticate.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/accept-invitation-card.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, Loader2, XIcon } from \"lucide-react\"\nimport { useCallback, useContext, useEffect, useMemo, useState } from \"react\"\n\nimport { useAuthenticate } from \"../../hooks/use-authenticate\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle\n} from \"../ui/card\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface AcceptInvitationCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function AcceptInvitationCard({\n className,\n classNames,\n localization: localizationProp\n}: AcceptInvitationCardProps) {\n const {\n localization: contextLocalization,\n redirectTo,\n replace,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: sessionData } = useAuthenticate()\n const [invitationId, setInvitationId] = useState(null)\n\n useEffect(() => {\n const invitationIdParam = getSearchParam(\"invitationId\")\n\n if (!invitationIdParam) {\n toast({\n variant: \"error\",\n message: localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n return\n }\n\n setInvitationId(invitationIdParam)\n }, [localization.INVITATION_NOT_FOUND, toast, replace, redirectTo])\n\n if (!sessionData || !invitationId) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nfunction AcceptInvitationContent({\n className,\n classNames,\n localization: localizationProp,\n invitationId\n}: AcceptInvitationCardProps & { invitationId: string }) {\n const {\n authClient,\n hooks: { useInvitation },\n localization: contextLocalization,\n organization,\n redirectTo,\n replace,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [isRejecting, setIsRejecting] = useState(false)\n const [isAccepting, setIsAccepting] = useState(false)\n const isProcessing = isRejecting || isAccepting\n\n const { data: invitation, isPending } = useInvitation({\n query: {\n id: invitationId\n }\n })\n\n const getRedirectTo = useCallback(\n () => getSearchParam(\"redirectTo\") || redirectTo,\n [redirectTo]\n )\n\n useEffect(() => {\n if (isPending || !invitationId) return\n\n if (!invitation) {\n toast({\n variant: \"error\",\n message: localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n return\n }\n\n if (\n invitation.status !== \"pending\" ||\n new Date(invitation.expiresAt) < new Date()\n ) {\n toast({\n variant: \"error\",\n message:\n new Date(invitation.expiresAt) < new Date()\n ? localization.INVITATION_EXPIRED\n : localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n }\n }, [\n invitation,\n isPending,\n invitationId,\n localization,\n toast,\n replace,\n redirectTo\n ])\n\n const acceptInvitation = async () => {\n setIsAccepting(true)\n\n try {\n await authClient.organization.acceptInvitation({\n invitationId: invitationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message:\n localization.INVITATION_ACCEPTED || \"Invitation accepted\"\n })\n\n replace(getRedirectTo())\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsAccepting(false)\n }\n }\n\n const rejectInvitation = async () => {\n setIsRejecting(true)\n\n try {\n await authClient.organization.rejectInvitation({\n invitationId: invitationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_REJECTED\n })\n\n replace(redirectTo)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsRejecting(false)\n }\n }\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organization?.customRoles || [])]\n const roleLabel =\n roles.find((r) => r.role === invitation?.role)?.label ||\n invitation?.role\n\n if (!invitation)\n return (\n \n )\n\n return (\n \n \n \n {localization.ACCEPT_INVITATION}\n \n\n \n {localization.ACCEPT_INVITATION_DESCRIPTION}\n \n \n\n \n \n \n\n

\n {roleLabel}\n

\n
\n\n
\n \n {isRejecting ? (\n \n ) : (\n \n )}\n\n {localization.REJECT}\n \n\n \n {isAccepting ? (\n \n ) : (\n \n )}\n\n {localization.ACCEPT}\n \n
\n \n
\n )\n}\n\nconst AcceptInvitationSkeleton = ({\n className,\n classNames,\n localization\n}: AcceptInvitationCardProps) => {\n return (\n \n \n \n\n \n \n\n \n \n \n\n \n \n\n
\n \n\n \n
\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/account-cell.json b/public/r/account-cell.json new file mode 100644 index 00000000..8605496e --- /dev/null +++ b/public/r/account-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-cell", + "type": "registry:component", + "title": "Account Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/account-cell.tsx", + "content": "\"use client\"\n\nimport type { Session, User } from \"better-auth\"\nimport {\n EllipsisIcon,\n Loader2,\n LogOutIcon,\n RepeatIcon,\n UserX2Icon\n} from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport { UserView } from \"../../user-view\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface AccountCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n deviceSession: { user: User; session: Session }\n localization?: Partial\n refetch?: Refetch\n}\n\nexport function AccountCell({\n className,\n classNames,\n deviceSession,\n localization,\n refetch\n}: AccountCellProps) {\n const {\n basePath,\n localization: contextLocalization,\n hooks: { useSession },\n mutators: { revokeDeviceSession, setActiveSession },\n toast,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleRevoke = async () => {\n setIsLoading(true)\n\n try {\n await revokeDeviceSession({\n sessionToken: deviceSession.session.token\n })\n\n refetch?.()\n } catch (error) {\n setIsLoading(false)\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const handleSetActiveSession = async () => {\n setIsLoading(true)\n\n try {\n await setActiveSession({\n sessionToken: deviceSession.session.token\n })\n\n refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n const isCurrentSession =\n deviceSession.session.id === sessionData?.session.id\n\n return (\n \n \n\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n\n \n {!isCurrentSession && (\n \n \n\n {localization.SWITCH_ACCOUNT}\n \n )}\n\n {\n if (isCurrentSession) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n handleRevoke()\n }}\n variant=\"destructive\"\n >\n {isCurrentSession ? (\n \n ) : (\n \n )}\n\n {isCurrentSession\n ? localization.SIGN_OUT\n : localization.REVOKE}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/account-options.json b/public/r/account-options.json new file mode 100644 index 00000000..42449ff8 --- /dev/null +++ b/public/r/account-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-options", + "type": "registry:file", + "title": "Account Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/types/account-options.ts", + "content": "import type { AccountViewPaths } from \"../lib/view-paths\"\n\nexport type AccountOptions = {\n /**\n * Base path for account-scoped views\n * @default \"/account\"\n */\n basePath?: string\n /**\n * Array of fields to show in Account Settings\n * @default [\"image\", \"name\"]\n */\n fields: string[]\n /**\n * Customize account view paths\n */\n viewPaths?: Partial\n}\n\nexport type AccountOptionsContext = {\n /**\n * Base path for account-scoped views\n * @default \"/account\"\n */\n basePath: string\n /**\n * Array of fields to show in Account Settings\n * @default [\"image\", \"name\"]\n */\n fields: string[]\n /**\n * Customize account view paths\n */\n viewPaths: AccountViewPaths\n}\n", + "type": "registry:file", + "target": "types/account-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/account-settings-cards.json b/public/r/account-settings-cards.json new file mode 100644 index 00000000..6217528d --- /dev/null +++ b/public/r/account-settings-cards.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-settings-cards", + "type": "registry:component", + "title": "Account Settings Cards", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/accounts-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-email-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-avatar-card.json", + "http://localhost:3000/r/update-field-card.json", + "http://localhost:3000/r/update-name-card.json", + "http://localhost:3000/r/update-username-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account-settings-cards.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { AccountsCard } from \"./account/accounts-card\"\nimport { UpdateAvatarCard } from \"./account/update-avatar-card\"\nimport { UpdateFieldCard } from \"./account/update-field-card\"\nimport { UpdateNameCard } from \"./account/update-name-card\"\nimport { UpdateUsernameCard } from \"./account/update-username-card\"\nimport { ChangeEmailCard } from \"./security/change-email-card\"\nimport type { SettingsCardClassNames } from \"./shared/settings-card\"\n\nexport function AccountSettingsCards({\n className,\n classNames,\n localization\n}: {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n}) {\n const {\n additionalFields,\n avatar,\n changeEmail,\n credentials,\n hooks: { useSession },\n multiSession,\n account: accountOptions\n } = useContext(AuthUIContext)\n\n const { data: sessionData } = useSession()\n\n return (\n \n {accountOptions?.fields?.includes(\"image\") && avatar && (\n \n )}\n\n {credentials?.username && (\n \n )}\n\n {accountOptions?.fields?.includes(\"name\") && (\n \n )}\n\n {changeEmail && (\n \n )}\n\n {accountOptions?.fields?.map((field) => {\n if (field === \"image\") return null\n if (field === \"name\") return null\n const additionalField = additionalFields?.[field]\n if (!additionalField) return null\n\n const {\n label,\n description,\n instructions,\n placeholder,\n required,\n type,\n multiline,\n validate\n } = additionalField\n\n // @ts-ignore Custom fields are not typed\n const defaultValue = sessionData?.user[field] as unknown\n\n return (\n \n )\n })}\n\n {multiSession && (\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/account-view.json b/public/r/account-view.json new file mode 100644 index 00000000..cd79fad7 --- /dev/null +++ b/public/r/account-view.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "account-view", + "type": "registry:component", + "title": "Account View", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-settings-cards.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organizations-card.json", + "http://localhost:3000/r/security-settings-cards.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-invitations-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/account/account-view.tsx", + "content": "\"use client\"\n\nimport { MenuIcon } from \"lucide-react\"\nimport { useContext, useMemo } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { AccountViewPath } from \"../../server\"\nimport { OrganizationsCard } from \"../organization/organizations-card\"\nimport { UserInvitationsCard } from \"../organization/user-invitations-card\"\nimport { AccountSettingsCards } from \"../settings/account-settings-cards\"\nimport { ApiKeysCard } from \"../settings/api-key/api-keys-card\"\nimport { SecuritySettingsCards } from \"../settings/security-settings-cards\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger\n} from \"../ui/drawer\"\nimport { Label } from \"../ui/label\"\n\nexport interface AccountViewProps {\n className?: string\n classNames?: {\n base?: string\n cards?: string\n drawer?: { menuItem?: string }\n sidebar?: { base?: string; button?: string; buttonActive?: string }\n card?: SettingsCardClassNames\n }\n localization?: AuthLocalization\n pathname?: string\n view?: AccountViewPath\n hideNav?: boolean\n}\n\nexport function AccountView({\n className,\n classNames,\n localization: localizationProp,\n pathname,\n view: viewProp,\n hideNav\n}: AccountViewProps) {\n const {\n apiKey,\n localization: contextLocalization,\n organization,\n account: accountOptions,\n Link\n } = useContext(AuthUIContext)\n\n if (!accountOptions) {\n return null\n }\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const view =\n viewProp ||\n getViewByPath(accountOptions.viewPaths, pathname) ||\n \"SETTINGS\"\n\n const navItems: {\n view: AccountViewPath\n label: string\n }[] = [\n { view: \"SETTINGS\", label: localization.ACCOUNT },\n { view: \"SECURITY\", label: localization.SECURITY }\n ]\n\n if (apiKey) {\n navItems.push({\n view: \"API_KEYS\",\n label: localization.API_KEYS\n })\n }\n\n if (organization) {\n navItems.push({\n view: \"ORGANIZATIONS\",\n label: localization.ORGANIZATIONS\n })\n }\n\n return (\n \n {!hideNav && (\n
\n \n\n \n \n \n \n \n \n \n {localization.SETTINGS}\n \n \n
\n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n
\n
\n
\n )}\n\n {!hideNav && (\n
\n \n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n \n )}\n\n {view === \"SETTINGS\" && (\n \n )}\n\n {view === \"SECURITY\" && (\n \n )}\n\n {view === \"API_KEYS\" && (\n \n )}\n\n {view === \"ORGANIZATIONS\" && organization && (\n
\n \n\n \n
\n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/accounts-card.json b/public/r/accounts-card.json new file mode 100644 index 00000000..6bbe023b --- /dev/null +++ b/public/r/accounts-card.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "accounts-card", + "type": "registry:component", + "title": "Accounts Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/account-cell.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/accounts-card.tsx", + "content": "\"use client\"\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { AccountCell } from \"./account-cell\"\n\nexport interface AccountsCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function AccountsCard({\n className,\n classNames,\n localization\n}: AccountsCardProps) {\n const {\n basePath,\n hooks: { useListDeviceSessions, useSession },\n localization: contextLocalization,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: deviceSessions, isPending, refetch } = useListDeviceSessions()\n const { data: sessionData } = useSession()\n\n const otherDeviceSessions = (deviceSessions || []).filter(\n (ds) => ds.session.id !== sessionData?.session.id\n )\n\n return (\n navigate(`${basePath}/${viewPaths.SIGN_IN}`)}\n >\n {deviceSessions?.length && (\n \n {sessionData && (\n \n )}\n\n {otherDeviceSessions.map((deviceSession) => (\n \n ))}\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/additional-fields.json b/public/r/additional-fields.json new file mode 100644 index 00000000..88fd9e06 --- /dev/null +++ b/public/r/additional-fields.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "additional-fields", + "type": "registry:file", + "title": "Additional Fields", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/additional-fields.ts", + "content": "import type { ReactNode } from \"react\"\n\nexport type FieldType = \"string\" | \"number\" | \"boolean\"\n\nexport interface AdditionalField {\n description?: ReactNode\n instructions?: ReactNode\n label: ReactNode\n placeholder?: string\n required?: boolean\n type: FieldType\n /**\n * Render a multi-line textarea for string fields\n */\n multiline?: boolean\n validate?: (value: string) => Promise\n}\n\nexport interface AdditionalFields {\n [key: string]: AdditionalField\n}\n", + "type": "registry:file", + "target": "types/additional-fields.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/admin-error-codes.json b/public/r/admin-error-codes.json new file mode 100644 index 00000000..34a14b87 --- /dev/null +++ b/public/r/admin-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "admin-error-codes", + "type": "registry:file", + "title": "Admin Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/admin-error-codes.ts", + "content": "export const ADMIN_ERROR_CODES = {\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n USER_ALREADY_EXISTS: \"User already exists\",\n YOU_CANNOT_BAN_YOURSELF: \"You cannot ban yourself\",\n YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE:\n \"You are not allowed to change users role\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS: \"You are not allowed to create users\",\n YOU_ARE_NOT_ALLOWED_TO_LIST_USERS: \"You are not allowed to list users\",\n YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS:\n \"You are not allowed to list users sessions\",\n YOU_ARE_NOT_ALLOWED_TO_BAN_USERS: \"You are not allowed to ban users\",\n YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS:\n \"You are not allowed to impersonate users\",\n YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS:\n \"You are not allowed to revoke users sessions\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS: \"You are not allowed to delete users\",\n YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD:\n \"You are not allowed to set users password\",\n BANNED_USER: \"You have been banned from this application\"\n}\n", + "type": "registry:file", + "target": "localization/admin-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/alert.json b/public/r/alert.json new file mode 100644 index 00000000..8f0cff66 --- /dev/null +++ b/public/r/alert.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "alert", + "type": "registry:ui", + "title": "Alert", + "description": "", + "dependencies": [ + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/alert.tsx", + "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps) {\n return (\n \n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/anonymous-error-codes.json b/public/r/anonymous-error-codes.json new file mode 100644 index 00000000..2ad5d185 --- /dev/null +++ b/public/r/anonymous-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "anonymous-error-codes", + "type": "registry:file", + "title": "Anonymous Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/anonymous-error-codes.ts", + "content": "export const ANONYMOUS_ERROR_CODES = {\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n COULD_NOT_CREATE_SESSION: \"Could not create session\",\n ANONYMOUS_USERS_CANNOT_SIGN_IN_AGAIN_ANONYMOUSLY:\n \"Anonymous users cannot sign in again anonymously\"\n}\n", + "type": "registry:file", + "target": "localization/anonymous-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/any-auth-client.json b/public/r/any-auth-client.json new file mode 100644 index 00000000..ed67452a --- /dev/null +++ b/public/r/any-auth-client.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "any-auth-client", + "type": "registry:file", + "title": "Any Auth Client", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/types/any-auth-client.ts", + "content": "import type { createAuthClient } from \"better-auth/react\"\n\nexport type AnyAuthClient = Omit<\n ReturnType,\n \"signUp\" | \"getSession\"\n>\n", + "type": "registry:file", + "target": "types/any-auth-client.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/api-key-cell.json b/public/r/api-key-cell.json new file mode 100644 index 00000000..da2eab9b --- /dev/null +++ b/public/r/api-key-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-cell", + "type": "registry:component", + "title": "Api Key Cell", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/api-key-delete-dialog.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-cell.tsx", + "content": "\"use client\"\n\nimport { KeyRoundIcon } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { ApiKey } from \"../../../types/api-key\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { ApiKeyDeleteDialog } from \"./api-key-delete-dialog\"\n\nexport interface ApiKeyCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n apiKey: ApiKey\n localization?: Partial\n refetch?: Refetch\n}\n\nexport function ApiKeyCell({\n className,\n classNames,\n apiKey,\n localization,\n refetch\n}: ApiKeyCellProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n\n // Format expiration date or show \"Never expires\"\n const formatExpiration = () => {\n if (!apiKey.expiresAt) return localization.NEVER_EXPIRES\n\n const expiresDate = new Date(apiKey.expiresAt)\n return `${localization.EXPIRES} ${expiresDate.toLocaleDateString(\n lang ?? \"en\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\"\n }\n )}`\n }\n\n return (\n <>\n \n \n\n
\n
\n \n {apiKey.name}\n \n\n \n {apiKey.start}\n {\"******\"}\n \n
\n\n
\n {formatExpiration()}\n
\n
\n\n setShowDeleteDialog(true)}\n >\n {localization.DELETE}\n \n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/api-key-delete-dialog.json b/public/r/api-key-delete-dialog.json new file mode 100644 index 00000000..c80298b8 --- /dev/null +++ b/public/r/api-key-delete-dialog.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-delete-dialog", + "type": "registry:component", + "title": "Api Key Delete Dialog", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-delete-dialog.tsx", + "content": "\"use client\"\n\nimport { KeyRoundIcon, Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { ApiKey } from \"../../../types/api-key\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface ApiKeyDeleteDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n apiKey: ApiKey\n localization?: AuthLocalization\n refetch?: Refetch\n}\n\nexport function ApiKeyDeleteDialog({\n classNames,\n apiKey,\n localization,\n refetch,\n onOpenChange,\n ...props\n}: ApiKeyDeleteDialogProps) {\n const {\n localization: contextLocalization,\n mutators: { deleteApiKey },\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleDelete = async () => {\n setIsLoading(true)\n\n try {\n await deleteApiKey({ keyId: apiKey.id })\n await refetch?.()\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n // Format expiration date or show \"Never expires\"\n const formatExpiration = () => {\n if (!apiKey.expiresAt) return localization.NEVER_EXPIRES\n\n const expiresDate = new Date(apiKey.expiresAt)\n return `${localization.EXPIRES} ${expiresDate.toLocaleDateString(\n lang ?? \"en\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\"\n }\n )}`\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.DELETE} {localization.API_KEY}\n \n\n \n {localization.DELETE_API_KEY_CONFIRM}\n \n \n\n \n \n\n
\n
\n \n {apiKey.name}\n \n\n \n {apiKey.start}\n {\"******\"}\n \n
\n\n
\n {formatExpiration()}\n
\n
\n \n\n \n onOpenChange?.(false)}\n disabled={isLoading}\n className={cn(\n classNames?.button,\n classNames?.secondaryButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isLoading && }\n {localization.DELETE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/api-key-display-dialog.json b/public/r/api-key-display-dialog.json new file mode 100644 index 00000000..f0857a2b --- /dev/null +++ b/public/r/api-key-display-dialog.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-display-dialog", + "type": "registry:component", + "title": "Api Key Display Dialog", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-key-display-dialog.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface ApiKeyDisplayDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n apiKey: string\n}\n\nexport function ApiKeyDisplayDialog({\n classNames,\n apiKey,\n localization,\n onOpenChange,\n ...props\n}: ApiKeyDisplayDialogProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n localization = { ...contextLocalization, ...localization }\n\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n navigator.clipboard.writeText(apiKey)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.API_KEY_CREATED}\n \n\n \n {localization.CREATE_API_KEY_SUCCESS}\n \n \n\n
\n {apiKey}\n
\n\n \n \n {copied ? (\n <>\n \n {localization.COPIED_TO_CLIPBOARD}\n \n ) : (\n <>\n \n {localization.COPY_TO_CLIPBOARD}\n \n )}\n \n\n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.primaryButton\n )}\n >\n {localization.DONE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/api-key-error-codes.json b/public/r/api-key-error-codes.json new file mode 100644 index 00000000..09f95a5e --- /dev/null +++ b/public/r/api-key-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key-error-codes", + "type": "registry:file", + "title": "Api Key Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/api-key-error-codes.ts", + "content": "export const API_KEY_ERROR_CODES = {\n INVALID_METADATA_TYPE: \"metadata must be an object or undefined\",\n REFILL_AMOUNT_AND_INTERVAL_REQUIRED:\n \"refillAmount is required when refillInterval is provided\",\n REFILL_INTERVAL_AND_AMOUNT_REQUIRED:\n \"refillInterval is required when refillAmount is provided\",\n USER_BANNED: \"User is banned\",\n UNAUTHORIZED_SESSION: \"Unauthorized or invalid session\",\n KEY_NOT_FOUND: \"API Key not found\",\n KEY_DISABLED: \"API Key is disabled\",\n KEY_EXPIRED: \"API Key has expired\",\n USAGE_EXCEEDED: \"API Key has reached its usage limit\",\n KEY_NOT_RECOVERABLE: \"API Key is not recoverable\",\n EXPIRES_IN_IS_TOO_SMALL:\n \"The expiresIn is smaller than the predefined minimum value.\",\n EXPIRES_IN_IS_TOO_LARGE:\n \"The expiresIn is larger than the predefined maximum value.\",\n INVALID_REMAINING: \"The remaining count is either too large or too small.\",\n INVALID_PREFIX_LENGTH:\n \"The prefix length is either too large or too small.\",\n INVALID_NAME_LENGTH: \"The name length is either too large or too small.\",\n METADATA_DISABLED: \"Metadata is disabled.\",\n RATE_LIMIT_EXCEEDED: \"Rate limit exceeded.\",\n NO_VALUES_TO_UPDATE: \"No values to update.\",\n KEY_DISABLED_EXPIRATION: \"Custom key expiration values are disabled.\",\n INVALID_API_KEY: \"Invalid API key.\",\n INVALID_USER_ID_FROM_API_KEY: \"The user id from the API key is invalid.\",\n INVALID_API_KEY_GETTER_RETURN_TYPE:\n \"API Key getter returned an invalid key type. Expected string.\",\n SERVER_ONLY_PROPERTY:\n \"The property you're trying to set can only be set from the server auth instance only.\"\n}\n", + "type": "registry:file", + "target": "localization/api-key-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/api-key.json b/public/r/api-key.json new file mode 100644 index 00000000..fd0eecb8 --- /dev/null +++ b/public/r/api-key.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-key", + "type": "registry:file", + "title": "Api Key", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/api-key.ts", + "content": "export type ApiKey = {\n id: string\n name?: string | null\n start?: string | null\n expiresAt?: Date | null\n createdAt: Date\n updatedAt: Date\n metadata?: Record | null\n}\n", + "type": "registry:file", + "target": "types/api-key.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/api-keys-card.json b/public/r/api-keys-card.json new file mode 100644 index 00000000..15f03919 --- /dev/null +++ b/public/r/api-keys-card.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "api-keys-card", + "type": "registry:component", + "title": "Api Keys Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/api-key-cell.json", + "http://localhost:3000/r/api-key-display-dialog.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-api-key-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/api-keys-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useMemo, useState } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { ApiKeyCell } from \"./api-key-cell\"\nimport { ApiKeyDisplayDialog } from \"./api-key-display-dialog\"\nimport { CreateApiKeyDialog } from \"./create-api-key-dialog\"\n\nexport interface ApiKeysCardProps extends SettingsCardProps {\n organizationId?: string\n}\n\nexport function ApiKeysCard({\n className,\n classNames,\n localization,\n organizationId,\n ...props\n}: ApiKeysCardProps) {\n const {\n hooks: { useListApiKeys },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: apiKeys, isPending, refetch } = useListApiKeys()\n\n // Filter API keys by organizationId\n const filteredApiKeys = useMemo(() => {\n return apiKeys?.filter(\n (apiKey) => organizationId === apiKey.metadata?.organizationId\n )\n }, [apiKeys, organizationId])\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false)\n const [displayDialogOpen, setDisplayDialogOpen] = useState(false)\n const [createdApiKey, setCreatedApiKey] = useState(\"\")\n\n const handleCreateApiKey = (apiKey: string) => {\n setCreatedApiKey(apiKey)\n setDisplayDialogOpen(true)\n }\n\n return (\n <>\n setCreateDialogOpen(true)}\n {...props}\n >\n {filteredApiKeys && filteredApiKeys.length > 0 && (\n \n {filteredApiKeys?.map((apiKey) => (\n \n ))}\n \n )}\n \n\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-callback.json b/public/r/auth-callback.json new file mode 100644 index 00000000..182c4b2f --- /dev/null +++ b/public/r/auth-callback.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-callback", + "type": "registry:component", + "title": "Auth Callback", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/auth-callback.tsx", + "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function AuthCallback({ redirectTo }: { redirectTo?: string }) {\n const {\n hooks: { useIsRestoring },\n persistClient\n } = useContext(AuthUIContext)\n\n const isRestoring = useIsRestoring?.()\n const isRedirecting = useRef(false)\n\n const { onSuccess } = useOnSuccessTransition({ redirectTo })\n\n useEffect(() => {\n if (isRedirecting.current) return\n\n if (!persistClient) {\n isRedirecting.current = true\n onSuccess()\n return\n }\n\n if (isRestoring) return\n\n isRedirecting.current = true\n onSuccess()\n }, [isRestoring, persistClient, onSuccess])\n\n return \n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-client.json b/public/r/auth-client.json new file mode 100644 index 00000000..1d2ecc08 --- /dev/null +++ b/public/r/auth-client.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-client", + "type": "registry:file", + "title": "Auth Client", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-client.ts", + "content": "import {\n anonymousClient,\n apiKeyClient,\n emailOTPClient,\n genericOAuthClient,\n magicLinkClient,\n multiSessionClient,\n oneTapClient,\n organizationClient,\n passkeyClient,\n twoFactorClient,\n usernameClient\n} from \"better-auth/client/plugins\"\nimport { createAuthClient } from \"better-auth/react\"\n\nexport const authClient = createAuthClient({\n plugins: [\n apiKeyClient(),\n multiSessionClient(),\n passkeyClient(),\n oneTapClient({\n clientId: \"\"\n }),\n genericOAuthClient(),\n anonymousClient(),\n usernameClient(),\n magicLinkClient(),\n emailOTPClient(),\n twoFactorClient(),\n organizationClient()\n ]\n})\n\nexport type AuthClient = typeof authClient\n\nexport type Session = AuthClient[\"$Infer\"][\"Session\"][\"session\"]\nexport type User = AuthClient[\"$Infer\"][\"Session\"][\"user\"]\n", + "type": "registry:file", + "target": "types/auth-client.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-data-cache.json b/public/r/auth-data-cache.json new file mode 100644 index 00000000..73188ee4 --- /dev/null +++ b/public/r/auth-data-cache.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-data-cache", + "type": "registry:lib", + "title": "Auth Data Cache", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/auth-data-cache.ts", + "content": "type CacheEntry = {\n data: T | null\n timestamp: number\n isRefetching: boolean\n}\n\nclass AuthDataCache {\n private cache = new Map>()\n private listeners = new Map void>>()\n private inFlightRequests = new Map>()\n\n get(key: string): CacheEntry | undefined {\n return this.cache.get(key) as CacheEntry | undefined\n }\n\n set(key: string, data: T | null) {\n const entry: CacheEntry = {\n data,\n timestamp: Date.now(),\n isRefetching: false\n }\n this.cache.set(key, entry)\n this.notify(key)\n }\n\n setRefetching(key: string, isRefetching: boolean) {\n const entry = this.cache.get(key)\n if (entry) {\n entry.isRefetching = isRefetching\n this.notify(key)\n }\n }\n\n clear(key?: string) {\n if (key) {\n this.cache.delete(key)\n this.inFlightRequests.delete(key)\n this.notify(key)\n } else {\n this.cache.clear()\n this.inFlightRequests.clear()\n const keys = Array.from(this.listeners.keys())\n for (const key of keys) {\n this.notify(key)\n }\n }\n }\n\n getInFlightRequest(key: string): Promise | undefined {\n return this.inFlightRequests.get(key) as Promise | undefined\n }\n\n setInFlightRequest(key: string, promise: Promise) {\n this.inFlightRequests.set(key, promise)\n }\n\n removeInFlightRequest(key: string) {\n this.inFlightRequests.delete(key)\n }\n\n subscribe(key: string, callback: () => void) {\n if (!this.listeners.has(key)) {\n this.listeners.set(key, new Set())\n }\n this.listeners.get(key)!.add(callback)\n\n return () => {\n const callbacks = this.listeners.get(key)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.listeners.delete(key)\n }\n }\n }\n }\n\n private notify(key: string) {\n const callbacks = this.listeners.get(key)\n if (callbacks) {\n const callbackArray = Array.from(callbacks)\n for (const callback of callbackArray) {\n callback()\n }\n }\n }\n}\n\n// Global singleton instance\nexport const authDataCache = new AuthDataCache()\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-form.json b/public/r/auth-form.json new file mode 100644 index 00000000..50212291 --- /dev/null +++ b/public/r/auth-form.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-form", + "type": "registry:component", + "title": "Auth Form", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/email-otp-form.json", + "http://localhost:3000/r/forgot-password-form.json", + "http://localhost:3000/r/magic-link-form.json", + "http://localhost:3000/r/recover-account-form.json", + "http://localhost:3000/r/reset-password-form.json", + "http://localhost:3000/r/sign-in-form.json", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/sign-up-form.json", + "http://localhost:3000/r/two-factor-form.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-form.tsx", + "content": "\"use client\"\n\nimport { useContext, useEffect } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { getViewByPath } from \"../../lib/utils\"\nimport type { AuthViewPath } from \"../../lib/view-paths\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { AuthCallback } from \"./auth-callback\"\nimport { EmailOTPForm } from \"./forms/email-otp-form\"\nimport { ForgotPasswordForm } from \"./forms/forgot-password-form\"\nimport { MagicLinkForm } from \"./forms/magic-link-form\"\nimport { RecoverAccountForm } from \"./forms/recover-account-form\"\nimport { ResetPasswordForm } from \"./forms/reset-password-form\"\nimport { SignInForm } from \"./forms/sign-in-form\"\nimport { SignUpForm } from \"./forms/sign-up-form\"\nimport { TwoFactorForm } from \"./forms/two-factor-form\"\nimport { SignOut } from \"./sign-out\"\n\nexport type AuthFormClassNames = {\n base?: string\n button?: string\n checkbox?: string\n description?: string\n error?: string\n forgotPasswordLink?: string\n icon?: string\n input?: string\n label?: string\n otpInput?: string\n otpInputContainer?: string\n outlineButton?: string\n primaryButton?: string\n providerButton?: string\n qrCode?: string\n secondaryButton?: string\n}\n\nexport interface AuthFormProps {\n className?: string\n classNames?: AuthFormClassNames\n callbackURL?: string\n isSubmitting?: boolean\n localization?: Partial\n pathname?: string\n redirectTo?: string\n view?: AuthViewPath\n otpSeparators?: 0 | 1 | 2\n setIsSubmitting?: (isSubmitting: boolean) => void\n}\n\nexport function AuthForm({\n className,\n classNames,\n callbackURL,\n isSubmitting,\n localization,\n pathname,\n redirectTo,\n view,\n otpSeparators = 0,\n setIsSubmitting\n}: AuthFormProps) {\n const {\n basePath,\n credentials,\n localization: contextLocalization,\n magicLink,\n emailOTP,\n signUp,\n twoFactor: twoFactorEnabled,\n viewPaths,\n replace\n } = useContext(AuthUIContext)\n\n const signUpEnabled = !!signUp\n\n localization = { ...contextLocalization, ...localization }\n\n useEffect(() => {\n if (pathname && !getViewByPath(viewPaths, pathname)) {\n console.error(`Invalid auth view: ${pathname}`)\n replace(`${basePath}/${viewPaths.SIGN_IN}${window.location.search}`)\n }\n }, [pathname, viewPaths, basePath, replace])\n\n view =\n view ||\n (getViewByPath(viewPaths, pathname) as AuthViewPath) ||\n \"SIGN_IN\"\n\n // Redirect to appropriate view based on enabled features\n useEffect(() => {\n let isInvalidView = false\n\n if (\n view === \"MAGIC_LINK\" &&\n (!magicLink || (!credentials && !emailOTP))\n ) {\n isInvalidView = true\n }\n\n if (\n view === \"EMAIL_OTP\" &&\n (!emailOTP || (!credentials && !magicLink))\n ) {\n isInvalidView = true\n }\n\n if (view === \"SIGN_UP\" && !signUpEnabled) {\n isInvalidView = true\n }\n\n if (\n !credentials &&\n [\n \"SIGN_UP\",\n \"FORGOT_PASSWORD\",\n \"RESET_PASSWORD\",\n \"TWO_FACTOR\",\n \"RECOVER_ACCOUNT\"\n ].includes(view)\n ) {\n isInvalidView = true\n }\n\n if (\n [\"TWO_FACTOR\", \"RECOVER_ACCOUNT\"].includes(view) &&\n !twoFactorEnabled\n ) {\n isInvalidView = true\n }\n\n if (isInvalidView) {\n replace(`${basePath}/${viewPaths.SIGN_IN}${window.location.search}`)\n }\n }, [\n basePath,\n view,\n viewPaths,\n credentials,\n replace,\n emailOTP,\n signUpEnabled,\n magicLink,\n twoFactorEnabled\n ])\n\n if (view === \"SIGN_OUT\") return \n if (view === \"CALLBACK\") return \n\n if (view === \"SIGN_IN\") {\n return credentials ? (\n \n ) : magicLink ? (\n \n ) : emailOTP ? (\n \n ) : null\n }\n\n if (view === \"TWO_FACTOR\") {\n return (\n \n )\n }\n\n if (view === \"RECOVER_ACCOUNT\") {\n return (\n \n )\n }\n\n if (view === \"MAGIC_LINK\") {\n return (\n \n )\n }\n\n if (view === \"EMAIL_OTP\") {\n return (\n \n )\n }\n\n if (view === \"FORGOT_PASSWORD\") {\n return (\n \n )\n }\n\n if (view === \"RESET_PASSWORD\") {\n return (\n \n )\n }\n\n if (view === \"SIGN_UP\") {\n return (\n signUpEnabled && (\n \n )\n )\n }\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-hooks.json b/public/r/auth-hooks.json new file mode 100644 index 00000000..5c0ecf48 --- /dev/null +++ b/public/r/auth-hooks.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-hooks", + "type": "registry:file", + "title": "Auth Hooks", + "description": "", + "dependencies": [ + "@better-fetch/fetch", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/api-key.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/invitation.json", + "http://localhost:3000/r/refetch.json" + ], + "files": [ + { + "path": "src/types/auth-hooks.ts", + "content": "import type { BetterFetchError } from \"@better-fetch/fetch\"\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport type { AnyAuthClient } from \"./any-auth-client\"\nimport type { ApiKey } from \"./api-key\"\nimport type { AuthClient } from \"./auth-client\"\nimport type { Invitation } from \"./invitation\"\nimport type { Refetch } from \"./refetch\"\n\ntype AnyAuthSession = AnyAuthClient[\"$Infer\"][\"Session\"]\n\ntype AuthHook = {\n isPending: boolean\n data?: T | null\n error?: BetterFetchError | null\n refetch?: Refetch\n}\n\nexport type AuthHooks = {\n useSession: () => ReturnType\n useListAccounts: () => AuthHook<{ accountId: string; provider: string }[]>\n useAccountInfo: (\n params: Parameters[0]\n ) => AuthHook<{ user: User }>\n useListDeviceSessions: () => AuthHook\n useListSessions: () => AuthHook\n useListPasskeys: () => Partial>\n useListApiKeys: () => AuthHook\n useActiveOrganization: () => Partial<\n ReturnType\n >\n useListOrganizations: () => Partial<\n ReturnType\n >\n useHasPermission: (\n params: Parameters[0]\n ) => AuthHook<{\n error: null\n success: boolean\n }>\n useInvitation: (\n params: Parameters[0]\n ) => AuthHook<\n Invitation & {\n organizationName: string\n organizationSlug: string\n organizationLogo?: string\n }\n >\n useListInvitations: (\n params: Parameters[0]\n ) => AuthHook\n useListUserInvitations: () => AuthHook\n useListMembers: (\n params: Parameters[0]\n ) => AuthHook<{\n members: (Member & { user?: Partial | null })[]\n total: number\n }>\n useIsRestoring?: () => boolean\n}\n", + "type": "registry:file", + "target": "types/auth-hooks.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-loading.json b/public/r/auth-loading.json new file mode 100644 index 00000000..11bffd45 --- /dev/null +++ b/public/r/auth-loading.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-loading", + "type": "registry:component", + "title": "Auth Loading", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/auth-loading.tsx", + "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content during authentication loading state\n *\n * Renders its children only when the authentication state is being determined\n * (during the loading/pending phase). Once the authentication state is resolved,\n * nothing is rendered. Useful for displaying loading indicators or temporary\n * content while waiting for the authentication check to complete.\n */\nexport function AuthLoading({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { isPending } = useSession()\n\n return isPending ? children : null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-localization.json b/public/r/auth-localization.json new file mode 100644 index 00000000..747c23e1 --- /dev/null +++ b/public/r/auth-localization.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-localization", + "type": "registry:file", + "title": "Auth Localization", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/admin-error-codes.json", + "http://localhost:3000/r/anonymous-error-codes.json", + "http://localhost:3000/r/api-key-error-codes.json", + "http://localhost:3000/r/base-error-codes.json", + "http://localhost:3000/r/captcha-error-codes.json", + "http://localhost:3000/r/email-otp-error-codes.json", + "http://localhost:3000/r/generic-oauth-error-codes.json", + "http://localhost:3000/r/haveibeenpwned-error-codes.json", + "http://localhost:3000/r/multi-session-error-codes.json", + "http://localhost:3000/r/organization-error-codes.json", + "http://localhost:3000/r/passkey-error-codes.json", + "http://localhost:3000/r/phone-number-error-codes.json", + "http://localhost:3000/r/stripe-localization.json", + "http://localhost:3000/r/two-factor-error-codes.json", + "http://localhost:3000/r/username-error-codes.json" + ], + "files": [ + { + "path": "src/localization/auth-localization.ts", + "content": "import { ADMIN_ERROR_CODES } from \"./admin-error-codes\"\nimport { ANONYMOUS_ERROR_CODES } from \"./anonymous-error-codes\"\nimport { API_KEY_ERROR_CODES } from \"./api-key-error-codes\"\nimport { BASE_ERROR_CODES } from \"./base-error-codes\"\nimport { CAPTCHA_ERROR_CODES } from \"./captcha-error-codes\"\nimport { EMAIL_OTP_ERROR_CODES } from \"./email-otp-error-codes\"\nimport { GENERIC_OAUTH_ERROR_CODES } from \"./generic-oauth-error-codes\"\nimport { HAVEIBEENPWNED_ERROR_CODES } from \"./haveibeenpwned-error-codes\"\nimport { MULTI_SESSION_ERROR_CODES } from \"./multi-session-error-codes\"\nimport { ORGANIZATION_ERROR_CODES } from \"./organization-error-codes\"\nimport { PASSKEY_ERROR_CODES } from \"./passkey-error-codes\"\nimport { PHONE_NUMBER_ERROR_CODES } from \"./phone-number-error-codes\"\nimport { STRIPE_ERROR_CODES } from \"./stripe-localization\"\nimport { TWO_FACTOR_ERROR_CODES } from \"./two-factor-error-codes\"\nimport { USERNAME_ERROR_CODES } from \"./username-error-codes\"\n\nexport const authLocalization = {\n /** @default \"Account\" */\n ACCOUNT: \"Account\",\n\n /** @default \"Accounts\" */\n ACCOUNTS: \"Accounts\",\n\n /** @default \"Manage your currently signed in accounts.\" */\n ACCOUNTS_DESCRIPTION: \"Switch between your currently signed in accounts.\",\n\n /** @default \"Sign in to an additional account.\" */\n ACCOUNTS_INSTRUCTIONS: \"Sign in to an additional account.\",\n\n /** @default \"Add Account\" */\n ADD_ACCOUNT: \"Add Account\",\n\n /** @default \"Add Passkey\" */\n ADD_PASSKEY: \"Add Passkey\",\n\n /** @default \"Already have an account?\" */\n ALREADY_HAVE_AN_ACCOUNT: \"Already have an account?\",\n\n /** @default \"Avatar\" */\n AVATAR: \"Avatar\",\n\n /** @default \"Click on the avatar to upload a custom one from your files.\" */\n AVATAR_DESCRIPTION:\n \"Click on the avatar to upload a custom one from your files.\",\n\n /** @default \"An avatar is optional but strongly recommended.\" */\n AVATAR_INSTRUCTIONS: \"An avatar is optional but strongly recommended.\",\n\n /** @default \"Backup code is required\" */\n BACKUP_CODE_REQUIRED: \"Backup code is required\",\n\n /** @default \"Backup Codes\" */\n BACKUP_CODES: \"Backup Codes\",\n\n /** @default \"Save these backup codes in a secure place. You can use them to access your account if you lose your two-factor authentication method.\" */\n BACKUP_CODES_DESCRIPTION:\n \"Save these backup codes in a secure place. You can use them to access your account if you lose your two-factor authentication method.\",\n\n /** @default \"Backup Code.\" */\n BACKUP_CODE_PLACEHOLDER: \"Backup Code\",\n\n /** @default \"Backup Code\" */\n BACKUP_CODE: \"Backup Code\",\n\n /** @default \"Cancel\" */\n CANCEL: \"Cancel\",\n\n /** @default \"Change Password\" */\n CHANGE_PASSWORD: \"Change Password\",\n\n /** @default \"Enter your current password and a new password.\" */\n CHANGE_PASSWORD_DESCRIPTION:\n \"Enter your current password and a new password.\",\n\n /** @default \"Please use 8 characters at minimum.\" */\n CHANGE_PASSWORD_INSTRUCTIONS: \"Please use 8 characters at minimum.\",\n\n /** @default \"Your password has been changed.\" */\n CHANGE_PASSWORD_SUCCESS: \"Your password has been changed.\",\n\n /** @default \"Confirm Password\" */\n CONFIRM_PASSWORD: \"Confirm Password\",\n\n /** @default \"Confirm Password\" */\n CONFIRM_PASSWORD_PLACEHOLDER: \"Confirm Password\",\n\n /** @default \"Confirm password is required\" */\n CONFIRM_PASSWORD_REQUIRED: \"Confirm password is required\",\n\n /** @default \"Continue with Authenticator\" */\n CONTINUE_WITH_AUTHENTICATOR: \"Continue with Authenticator\",\n\n /** @default \"Copied to clipboard\" */\n COPIED_TO_CLIPBOARD: \"Copied to clipboard\",\n\n /** @default \"Copy to clipboard\" */\n COPY_TO_CLIPBOARD: \"Copy to clipboard\",\n\n /** @default \"Copy all codes\" */\n COPY_ALL_CODES: \"Copy all codes\",\n\n /** @default \"Continue\" */\n CONTINUE: \"Continue\",\n\n /** @default \"Current Password\" */\n CURRENT_PASSWORD: \"Current Password\",\n\n /** @default \"Current Password\" */\n CURRENT_PASSWORD_PLACEHOLDER: \"Current Password\",\n\n /** @default \"Current Session\" */\n CURRENT_SESSION: \"Current Session\",\n\n /** @default \"Delete\" */\n DELETE: \"Delete\",\n\n /** @default \"Delete Avatar\" */\n DELETE_AVATAR: \"Delete Avatar\",\n\n /** @default \"Delete Account\" */\n DELETE_ACCOUNT: \"Delete Account\",\n\n /** @default \"Permanently remove your account and all of its contents. This action is not reversible, so please continue with caution.\" */\n DELETE_ACCOUNT_DESCRIPTION:\n \"Permanently remove your account and all of its contents. This action is not reversible, so please continue with caution.\",\n\n /** @default \"Please confirm the deletion of your account. This action is not reversible, so please continue with caution.\" */\n DELETE_ACCOUNT_INSTRUCTIONS:\n \"Please confirm the deletion of your account. This action is not reversible, so please continue with caution.\",\n\n /** @default \"Please check your email to verify the deletion of your account.\" */\n DELETE_ACCOUNT_VERIFY:\n \"Please check your email to verify the deletion of your account.\",\n\n /** @default \"Your account has been deleted.\" */\n DELETE_ACCOUNT_SUCCESS: \"Your account has been deleted.\",\n\n /** @default \"Disable Two-Factor\" */\n DISABLE_TWO_FACTOR: \"Disable Two-Factor\",\n\n /** @default \"Choose a provider to login to your account\" */\n DISABLED_CREDENTIALS_DESCRIPTION:\n \"Choose a provider to login to your account\",\n\n /** @default \"Don't have an account?\" */\n DONT_HAVE_AN_ACCOUNT: \"Don't have an account?\",\n\n /** @default \"Done\" */\n DONE: \"Done\",\n\n /** @default \"Email\" */\n EMAIL: \"Email\",\n\n /** @default \"Enter the email address you want to use to log in.\" */\n EMAIL_DESCRIPTION: \"Enter the email address you want to use to log in.\",\n\n /** @default \"Please enter a valid email address.\" */\n EMAIL_INSTRUCTIONS: \"Please enter a valid email address.\",\n\n /** @default \"Email is the same\" */\n EMAIL_IS_THE_SAME: \"Email is the same\",\n\n /** @default \"m@example.com\" */\n EMAIL_PLACEHOLDER: \"m@example.com\",\n\n /** @default \"Email address is required\" */\n EMAIL_REQUIRED: \"Email address is required\",\n\n /** @default \"Please check your email to verify the change.\" */\n EMAIL_VERIFY_CHANGE: \"Please check your email to verify the change.\",\n\n /** @default \"Please check your email for the verification link.\" */\n EMAIL_VERIFICATION: \"Please check your email for the verification link.\",\n\n /** @default \"Enable Two-Factor\" */\n ENABLE_TWO_FACTOR: \"Enable Two-Factor\",\n\n /** @default \"is invalid\" */\n IS_INVALID: \"is invalid\",\n\n /** @default \"is required\" */\n IS_REQUIRED: \"is required\",\n\n /** @default \"is the same\" */\n IS_THE_SAME: \"is the same\",\n\n /** @default \"Forgot authenticator?\" */\n FORGOT_AUTHENTICATOR: \"Forgot authenticator?\",\n\n /** @default \"Forgot Password\" */\n FORGOT_PASSWORD: \"Forgot Password\",\n\n /** @default \"Send reset link\" */\n FORGOT_PASSWORD_ACTION: \"Send reset link\",\n\n /** @default \"Enter your email to reset your password\" */\n FORGOT_PASSWORD_DESCRIPTION: \"Enter your email to reset your password\",\n\n /** @default \"Check your email for the password reset link.\" */\n FORGOT_PASSWORD_EMAIL: \"Check your email for the password reset link.\",\n\n /** @default \"Forgot your password?\" */\n FORGOT_PASSWORD_LINK: \"Forgot your password?\",\n\n /** @default \"Link\" */\n LINK: \"Link\",\n\n /** @default \"Magic Link\" */\n MAGIC_LINK: \"Magic Link\",\n\n /** @default \"Send magic link\" */\n MAGIC_LINK_ACTION: \"Send magic link\",\n\n /** @default \"Enter your email to receive a magic link\" */\n MAGIC_LINK_DESCRIPTION: \"Enter your email to receive a magic link\",\n\n /** @default \"Check your email for the magic link\" */\n MAGIC_LINK_EMAIL: \"Check your email for the magic link\",\n\n /** @default \"Email Code\" */\n EMAIL_OTP: \"Email Code\",\n\n /** @default \"Send code\" */\n EMAIL_OTP_SEND_ACTION: \"Send code\",\n\n /** @default \"Verify code\" */\n EMAIL_OTP_VERIFY_ACTION: \"Verify code\",\n\n /** @default \"Enter your email to receive a code\" */\n EMAIL_OTP_DESCRIPTION: \"Enter your email to receive a code\",\n\n /** @default \"Please check your email for the verification code.\" */\n EMAIL_OTP_VERIFICATION_SENT:\n \"Please check your email for the verification code.\",\n\n /** @default \"Name\" */\n NAME: \"Name\",\n\n /** @default \"Please enter your full name, or a display name.\" */\n NAME_DESCRIPTION: \"Please enter your full name, or a display name.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n NAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Name\" */\n NAME_PLACEHOLDER: \"Name\",\n\n /** @default \"New Password\" */\n NEW_PASSWORD: \"New Password\",\n\n /** @default \"New Password\" */\n NEW_PASSWORD_PLACEHOLDER: \"New Password\",\n\n /** @default \"New password is required\" */\n NEW_PASSWORD_REQUIRED: \"New password is required\",\n\n /** @default \"One-Time Password\" */\n ONE_TIME_PASSWORD: \"One-Time Password\",\n\n /** @default \"Or continue with\" */\n OR_CONTINUE_WITH: \"Or continue with\",\n\n /** @default \"Passkey\" */\n PASSKEY: \"Passkey\",\n\n /** @default \"Passkeys\" */\n PASSKEYS: \"Passkeys\",\n\n /** @default \"Manage your passkeys for secure access.\" */\n PASSKEYS_DESCRIPTION: \"Manage your passkeys for secure access.\",\n\n /** @default \"Securely access your account without a password.\" */\n PASSKEYS_INSTRUCTIONS: \"Securely access your account without a password.\",\n\n /** @default \"Personal Account\" */\n PERSONAL_ACCOUNT: \"Personal Account\",\n\n /** @default \"API Keys\" */\n API_KEYS: \"API Keys\",\n\n /** @default \"Manage your API keys for secure access.\" */\n API_KEYS_DESCRIPTION: \"Manage your API keys for secure access.\",\n\n /** @default \"Generate API keys to access your account programmatically.\" */\n API_KEYS_INSTRUCTIONS:\n \"Generate API keys to access your account programmatically.\",\n\n /** @default \"Create API Key\" */\n CREATE_API_KEY: \"Create API Key\",\n\n /** @default \"Enter a unique name for your API key to differentiate it from other keys.\" */\n CREATE_API_KEY_DESCRIPTION:\n \"Enter a unique name for your API key to differentiate it from other keys.\",\n\n /** @default \"New API Key\" */\n API_KEY_NAME_PLACEHOLDER: \"New API Key\",\n\n /** @default \"API Key Created\" */\n API_KEY_CREATED: \"API Key Created\",\n\n /** @default \"Please copy your API key and store it in a safe place. For security reasons we cannot show it again.\" */\n CREATE_API_KEY_SUCCESS:\n \"Please copy your API key and store it in a safe place. For security reasons we cannot show it again.\",\n\n /** @default \"Never Expires\" */\n NEVER_EXPIRES: \"Never Expires\",\n\n /** @default \"Expires\" */\n EXPIRES: \"Expires\",\n\n /** @default \"No Expiration\" */\n NO_EXPIRATION: \"No Expiration\",\n\n /** @default \"Create Organization\" */\n CREATE_ORGANIZATION: \"Create Organization\",\n\n /** @default \"Organization\" */\n ORGANIZATION: \"Organization\",\n\n /** @default \"Name\" */\n ORGANIZATION_NAME: \"Name\",\n\n /** @default \"Acme Inc.\" */\n ORGANIZATION_NAME_PLACEHOLDER: \"Acme Inc.\",\n\n /** @default \"This is your organization's visible name.\" */\n ORGANIZATION_NAME_DESCRIPTION: \"This is your organization's visible name.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n ORGANIZATION_NAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Slug URL\" */\n ORGANIZATION_SLUG: \"Slug URL\",\n\n /** @default \"This is your organization's URL namespace.\" */\n ORGANIZATION_SLUG_DESCRIPTION: \"This is your organization's URL namespace.\",\n\n /** @default \"Please use 48 characters at maximum.\" */\n ORGANIZATION_SLUG_INSTRUCTIONS: \"Please use 48 characters at maximum.\",\n\n /** @default \"acme-inc\" */\n ORGANIZATION_SLUG_PLACEHOLDER: \"acme-inc\",\n\n /** @default \"Organization created successfully\" */\n CREATE_ORGANIZATION_SUCCESS: \"Organization created successfully\",\n\n /** @default \"Password\" */\n PASSWORD: \"Password\",\n\n /** @default \"Password\" */\n PASSWORD_PLACEHOLDER: \"Password\",\n\n /** @default \"Password is required\" */\n PASSWORD_REQUIRED: \"Password is required\",\n\n /** @default \"Passwords do not match\" */\n PASSWORDS_DO_NOT_MATCH: \"Passwords do not match\",\n\n /** @default \"Providers\" */\n PROVIDERS: \"Providers\",\n\n /** @default \"Connect your account with a third-party service.\" */\n PROVIDERS_DESCRIPTION: \"Connect your account with a third-party service.\",\n\n /** @default \"Recover Account\" */\n RECOVER_ACCOUNT: \"Recover Account\",\n\n /** @default \"Recover account\" */\n RECOVER_ACCOUNT_ACTION: \"Recover account\",\n\n /** @default \"Please enter a backup code to access your account\" */\n RECOVER_ACCOUNT_DESCRIPTION:\n \"Please enter a backup code to access your account\",\n\n /** @default \"Remember me\" */\n REMEMBER_ME: \"Remember me\",\n\n /** @default \"Resend code\" */\n RESEND_CODE: \"Resend code\",\n\n /** @default \"Resend verification email\" */\n RESEND_VERIFICATION_EMAIL: \"Resend Verification Email\",\n\n /** @default \"Reset Password\" */\n RESET_PASSWORD: \"Reset Password\",\n\n /** @default \"Save new password\" */\n RESET_PASSWORD_ACTION: \"Save new password\",\n\n /** @default \"Enter your new password below\" */\n RESET_PASSWORD_DESCRIPTION: \"Enter your new password below\",\n\n /** @default \"Password reset successfully\" */\n RESET_PASSWORD_SUCCESS: \"Password reset successfully\",\n\n /** @default \"Request failed\" */\n REQUEST_FAILED: \"Request failed\",\n\n /** @default \"Revoke\" */\n REVOKE: \"Revoke\",\n\n /** @default \"Delete API Key\" */\n DELETE_API_KEY: \"Delete API Key\",\n\n /** @default \"Are you sure you want to delete this API key?\" */\n DELETE_API_KEY_CONFIRM: \"Are you sure you want to delete this API key?\",\n\n /** @default \"API Key\" */\n API_KEY: \"API Key\",\n\n /** @default \"Sign In\" */\n SIGN_IN: \"Sign In\",\n\n /** @default \"Login\" */\n SIGN_IN_ACTION: \"Login\",\n\n /** @default \"Enter your email below to login to your account\" */\n SIGN_IN_DESCRIPTION: \"Enter your email below to login to your account\",\n\n /** @default \"Enter your username or email below to login to your account\" */\n SIGN_IN_USERNAME_DESCRIPTION:\n \"Enter your username or email to login to your account\",\n\n /** @default \"Sign in with\" */\n SIGN_IN_WITH: \"Sign in with\",\n\n /** @default \"Sign Out\" */\n SIGN_OUT: \"Sign Out\",\n\n /** @default \"Sign Up\" */\n SIGN_UP: \"Sign Up\",\n\n /** @default \"Create an account\" */\n SIGN_UP_ACTION: \"Create an account\",\n\n /** @default \"Enter your information to create an account\" */\n SIGN_UP_DESCRIPTION: \"Enter your information to create an account\",\n\n /** @default \"Check your email for the verification link.\" */\n SIGN_UP_EMAIL: \"Check your email for the verification link.\",\n\n /** @default \"Sessions\" */\n SESSIONS: \"Sessions\",\n\n /** @default \"Manage your active sessions and revoke access.\" */\n SESSIONS_DESCRIPTION: \"Manage your active sessions and revoke access.\",\n\n /** @default \"Set Password\" */\n SET_PASSWORD: \"Set Password\",\n\n /** @default \"Click the button below to receive an email to set up a password for your account.\" */\n SET_PASSWORD_DESCRIPTION:\n \"Click the button below to receive an email to set up a password for your account.\",\n\n /** @default \"Settings\" */\n SETTINGS: \"Settings\",\n\n /** @default \"Save\" */\n SAVE: \"Save\",\n\n /** @default \"Security\" */\n SECURITY: \"Security\",\n\n /** @default \"Switch Account\" */\n SWITCH_ACCOUNT: \"Switch Account\",\n\n /** @default \"Trust this device\" */\n TRUST_DEVICE: \"Trust this device\",\n\n /** @default \"Two-Factor\" */\n TWO_FACTOR: \"Two-Factor\",\n\n /** @default \"Verify code\" */\n TWO_FACTOR_ACTION: \"Verify code\",\n\n /** @default \"Please enter your one-time password to continue\" */\n TWO_FACTOR_DESCRIPTION: \"Please enter your one-time password to continue\",\n\n /** @default \"Add an extra layer of security to your account.\" */\n TWO_FACTOR_CARD_DESCRIPTION:\n \"Add an extra layer of security to your account.\",\n\n /** @default \"Please enter your password to disable 2FA.\" */\n TWO_FACTOR_DISABLE_INSTRUCTIONS:\n \"Please enter your password to disable 2FA.\",\n\n /** @default \"Please enter your password to enable 2FA\" */\n TWO_FACTOR_ENABLE_INSTRUCTIONS: \"Please enter your password to enable 2FA.\",\n\n /** @default \"Two-factor authentication has been enabled\" */\n TWO_FACTOR_ENABLED: \"Two-factor authentication has been enabled\",\n\n /** @default \"Two-Factor Authentication has been disabled\" */\n TWO_FACTOR_DISABLED: \"Two-Factor Authentication has been disabled\",\n\n /** @default \"Two-Factor Authentication\" */\n TWO_FACTOR_PROMPT: \"Two-Factor Authentication\",\n\n /** @default \"Scan the QR Code with your Authenticator\" */\n TWO_FACTOR_TOTP_LABEL: \"Scan the QR Code with your Authenticator\",\n\n /** @default \"Send verification code\" */\n SEND_VERIFICATION_CODE: \"Send verification code\",\n\n /** @default \"Unlink\" */\n UNLINK: \"Unlink\",\n\n /** @default \"Updated successfully\" */\n UPDATED_SUCCESSFULLY: \"updated successfully\",\n\n /** @default \"Username\" */\n USERNAME: \"Username\",\n\n /** @default \"Enter the username you want to use to log in.\" */\n USERNAME_DESCRIPTION: \"Enter the username you want to use to log in.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n USERNAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Username\" */\n USERNAME_PLACEHOLDER: \"Username\",\n\n /** @default \"Username or email\" */\n SIGN_IN_USERNAME_PLACEHOLDER: \"Username or email\",\n\n /** @default \"Verify Your Email\" */\n VERIFY_YOUR_EMAIL: \"Verify Your Email\",\n\n /** @default \"Please verify your email address. Check your inbox for the verification email. If you haven't received the email, click the button below to resend.\" */\n VERIFY_YOUR_EMAIL_DESCRIPTION:\n \"Please verify your email address. Check your inbox for the verification email. If you haven't received the email, click the button below to resend.\",\n\n /** @default \"Go back\" */\n GO_BACK: \"Go back\",\n\n /** @default \"Your session is not fresh. Please sign in again.\" */\n SESSION_NOT_FRESH: \"Your session is not fresh. Please sign in again.\",\n\n /** @default \"Upload Avatar\" */\n UPLOAD_AVATAR: \"Upload Avatar\",\n\n /** @default \"Logo\" */\n LOGO: \"Logo\",\n\n /** @default \"Click on the logo to upload a custom one from your files.\" */\n LOGO_DESCRIPTION:\n \"Click on the logo to upload a custom one from your files.\",\n\n /** @default \"A logo is optional but strongly recommended.\" */\n LOGO_INSTRUCTIONS: \"A logo is optional but strongly recommended.\",\n\n /** @default \"Upload\" */\n UPLOAD: \"Upload\",\n\n /** @default \"Upload Logo\" */\n UPLOAD_LOGO: \"Upload Logo\",\n\n /** @default \"Delete Logo\" */\n DELETE_LOGO: \"Delete Logo\",\n\n /** @default \"Privacy Policy\" */\n PRIVACY_POLICY: \"Privacy Policy\",\n\n /** @default \"Terms of Service\" */\n TERMS_OF_SERVICE: \"Terms of Service\",\n\n /** @default \"This site is protected by reCAPTCHA.\" */\n PROTECTED_BY_RECAPTCHA: \"This site is protected by reCAPTCHA.\",\n\n /** @default \"By continuing, you agree to the\" */\n BY_CONTINUING_YOU_AGREE: \"By continuing, you agree to the\",\n\n /** @default \"User\" */\n USER: \"User\",\n\n /** @default \"Organizations\" */\n ORGANIZATIONS: \"Organizations\",\n\n /** @default \"Manage your organizations and memberships.\" */\n ORGANIZATIONS_DESCRIPTION: \"Manage your organizations and memberships.\",\n\n /** @default \"Create an organization to collaborate with other users.\" */\n ORGANIZATIONS_INSTRUCTIONS:\n \"Create an organization to collaborate with other users.\",\n\n /** @default \"Leave Organization\" */\n LEAVE_ORGANIZATION: \"Leave Organization\",\n\n /** @default \"Are you sure you want to leave this organization?\" */\n LEAVE_ORGANIZATION_CONFIRM:\n \"Are you sure you want to leave this organization?\",\n\n /** @default \"You have successfully left the organization.\" */\n LEAVE_ORGANIZATION_SUCCESS: \"You have successfully left the organization.\",\n\n /** @default \"Manage Organization\" */\n MANAGE_ORGANIZATION: \"Manage Organization\",\n\n /** @default \"Remove Member\" */\n REMOVE_MEMBER: \"Remove Member\",\n\n /** @default \"Are you sure you want to remove this member from the organization?\" */\n REMOVE_MEMBER_CONFIRM:\n \"Are you sure you want to remove this member from the organization?\",\n\n /** @default \"Member removed successfully\" */\n REMOVE_MEMBER_SUCCESS: \"Member removed successfully\",\n\n /** @default \"Invite Member\" */\n INVITE_MEMBER: \"Invite Member\",\n\n /** @default \"Members\" */\n MEMBERS: \"Members\",\n\n /** @default \"Add or remove members and manage their roles.\" */\n MEMBERS_DESCRIPTION: \"Add or remove members and manage their roles.\",\n\n /** @default \"Invite new members to your organization.\" */\n MEMBERS_INSTRUCTIONS: \"Invite new members to your organization.\",\n\n /** @default \"Send an invitation to add a new member to your organization.\" */\n INVITE_MEMBER_DESCRIPTION:\n \"Send an invitation to add a new member to your organization.\",\n\n /** @default \"Role\" */\n ROLE: \"Role\",\n\n /** @default \"Select a role\" */\n SELECT_ROLE: \"Select a role\",\n\n /** @default \"Admin\" */\n ADMIN: \"Admin\",\n\n /** @default \"Member\" */\n MEMBER: \"Member\",\n\n /** @default \"Guest\" */\n GUEST: \"Guest\",\n\n /** @default \"Owner\" */\n OWNER: \"Owner\",\n\n /** @default \"Update the role for this member\" */\n UPDATE_ROLE_DESCRIPTION: \"Update the role for this member\",\n\n /** @default \"Update Role\" */\n UPDATE_ROLE: \"Update Role\",\n\n /** @default \"Member role updated successfully\" */\n MEMBER_ROLE_UPDATED: \"Member role updated successfully\",\n\n /** @default \"Send Invitation\" */\n SEND_INVITATION: \"Send Invitation\",\n\n /** @default \"Invitation sent successfully\" */\n SEND_INVITATION_SUCCESS: \"Invitation sent successfully\",\n\n /** @default \"Pending Invitations\" */\n PENDING_INVITATIONS: \"Pending Invitations\",\n\n /** @default \"Manage pending invitations to your organization.\" */\n PENDING_INVITATIONS_DESCRIPTION:\n \"Manage pending invitations to your organization.\",\n\n /** @default \"Invitations you've received from organizations.\" */\n PENDING_USER_INVITATIONS_DESCRIPTION:\n \"Invitations you've received from organizations.\",\n\n /** @default \"Cancel Invitation\" */\n CANCEL_INVITATION: \"Cancel Invitation\",\n\n /** @default \"Invitation cancelled successfully\" */\n INVITATION_CANCELLED: \"Invitation cancelled successfully\",\n\n /** @default \"Accept Invitation\" */\n ACCEPT_INVITATION: \"Accept Invitation\",\n\n /** @default \"You have been invited to join an organization.\" */\n ACCEPT_INVITATION_DESCRIPTION:\n \"You have been invited to join an organization.\",\n\n /** @default \"Invitation accepted successfully\" */\n INVITATION_ACCEPTED: \"Invitation accepted successfully\",\n\n /** @default \"Invitation rejected successfully\" */\n INVITATION_REJECTED: \"Invitation rejected successfully\",\n\n /** @default \"Accept\" */\n ACCEPT: \"Accept\",\n\n /** @default \"Reject\" */\n REJECT: \"Reject\",\n\n /** @default \"This invitation has expired\" */\n INVITATION_EXPIRED: \"This invitation has expired\",\n\n /** @default \"Delete Organization\" */\n DELETE_ORGANIZATION: \"Delete Organization\",\n\n /** @default \"Permanently remove your organization and all of its contents. This action is not reversible — please continue with caution.\" */\n DELETE_ORGANIZATION_DESCRIPTION:\n \"Permanently remove your organization and all of its contents. This action is not reversible — please continue with caution.\",\n\n /** @default \"Organization deleted successfully\" */\n DELETE_ORGANIZATION_SUCCESS: \"Organization deleted successfully\",\n\n /** @default \"Enter the organization slug to continue:\" */\n DELETE_ORGANIZATION_INSTRUCTIONS:\n \"Enter the organization slug to continue:\",\n\n /** @default \"Organization slug is required\" */\n SLUG_REQUIRED: \"Organization slug is required\",\n\n /** @default \"The slug does not match\" */\n SLUG_DOES_NOT_MATCH: \"The slug does not match\",\n ...BASE_ERROR_CODES,\n ...ADMIN_ERROR_CODES,\n ...ANONYMOUS_ERROR_CODES,\n ...API_KEY_ERROR_CODES,\n ...CAPTCHA_ERROR_CODES,\n ...EMAIL_OTP_ERROR_CODES,\n ...GENERIC_OAUTH_ERROR_CODES,\n ...HAVEIBEENPWNED_ERROR_CODES,\n ...MULTI_SESSION_ERROR_CODES,\n ...ORGANIZATION_ERROR_CODES,\n ...PASSKEY_ERROR_CODES,\n ...PHONE_NUMBER_ERROR_CODES,\n ...STRIPE_ERROR_CODES,\n ...TWO_FACTOR_ERROR_CODES,\n ...USERNAME_ERROR_CODES\n}\n\nexport type AuthLocalization = Partial\n", + "type": "registry:file", + "target": "localization/auth-localization.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-mutators.json b/public/r/auth-mutators.json new file mode 100644 index 00000000..0e5c6efa --- /dev/null +++ b/public/r/auth-mutators.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-mutators", + "type": "registry:file", + "title": "Auth Mutators", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/auth-mutators.ts", + "content": "type MutateFn> = (\n params: T\n) => Promise | Promise\n\nexport interface AuthMutators {\n deleteApiKey: MutateFn<{ keyId: string }>\n deletePasskey: MutateFn<{ id: string }>\n revokeDeviceSession: MutateFn<{ sessionToken: string }>\n revokeSession: MutateFn<{ token: string }>\n setActiveSession: MutateFn<{ sessionToken: string }>\n updateOrganization: MutateFn<{\n organizationId: string\n data: Record\n }>\n updateUser: MutateFn\n unlinkAccount: MutateFn<{ providerId: string; accountId?: string }>\n}\n", + "type": "registry:file", + "target": "types/auth-mutators.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-ui-provider-tanstack.json b/public/r/auth-ui-provider-tanstack.json new file mode 100644 index 00000000..a7b618bd --- /dev/null +++ b/public/r/auth-ui-provider-tanstack.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-ui-provider-tanstack", + "type": "registry:lib", + "title": "Auth Ui Provider Tanstack", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-tanstack-options.json" + ], + "files": [ + { + "path": "src/lib/tanstack/auth-ui-provider-tanstack.tsx", + "content": "import { useCallback, useMemo } from \"react\"\nimport {\n AuthUIProvider,\n type AuthUIProviderProps\n} from \"../../lib/auth-ui-provider\"\nimport { useTanstackOptions } from \"./use-tanstack-options\"\n\nexport function AuthUIProviderTanstack({\n children,\n authClient,\n hooks: hooksProp,\n mutators: mutatorsProp,\n onSessionChange: onSessionChangeProp,\n ...props\n}: AuthUIProviderProps) {\n const {\n hooks: contextHooks,\n mutators: contextMutators,\n onSessionChange,\n optimistic\n } = useTanstackOptions({ authClient })\n\n const hooks = useMemo(\n () => ({ ...contextHooks, ...hooksProp }),\n [contextHooks, hooksProp]\n )\n const mutators = useMemo(\n () => ({ ...contextMutators, ...mutatorsProp }),\n [contextMutators, mutatorsProp]\n )\n\n const onSessionChangeCallback = useCallback(async () => {\n await onSessionChange()\n await onSessionChangeProp?.()\n }, [onSessionChangeProp, onSessionChange])\n\n return (\n \n {children}\n
\n )\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-ui-provider.json b/public/r/auth-ui-provider.json new file mode 100644 index 00000000..ce0131ab --- /dev/null +++ b/public/r/auth-ui-provider.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-ui-provider", + "type": "registry:lib", + "title": "Auth Ui Provider", + "description": "", + "dependencies": [ + "sonner" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-options.json", + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/avatar-options.json", + "http://localhost:3000/r/captcha-options.json", + "http://localhost:3000/r/credentials-options.json", + "http://localhost:3000/r/delete-user-options.json", + "http://localhost:3000/r/generic-oauth-options.json", + "http://localhost:3000/r/gravatar-options.json", + "http://localhost:3000/r/link.json", + "http://localhost:3000/r/organization-options.json", + "http://localhost:3000/r/organization-refetcher.json", + "http://localhost:3000/r/recaptcha-v3.json", + "http://localhost:3000/r/render-toast.json", + "http://localhost:3000/r/sign-up-options.json", + "http://localhost:3000/r/social-options.json", + "http://localhost:3000/r/use-auth-data.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/lib/auth-ui-provider.tsx", + "content": "\"use client\"\n\nimport { createContext, type ReactNode, useMemo } from \"react\"\nimport { toast } from \"sonner\"\n\nimport { RecaptchaV3 } from \"../components/captcha/recaptcha-v3\"\nimport { useAuthData } from \"../hooks/use-auth-data\"\nimport {\n type AuthLocalization,\n authLocalization\n} from \"../localization/auth-localization\"\nimport type {\n AccountOptions,\n AccountOptionsContext\n} from \"../types/account-options\"\nimport type { AdditionalFields } from \"../types/additional-fields\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\nimport type { AuthClient } from \"../types/auth-client\"\nimport type { AuthHooks } from \"../types/auth-hooks\"\nimport type { AuthMutators } from \"../types/auth-mutators\"\nimport type { AvatarOptions } from \"../types/avatar-options\"\nimport type { CaptchaOptions } from \"../types/captcha-options\"\nimport type { CredentialsOptions } from \"../types/credentials-options\"\nimport type { DeleteUserOptions } from \"../types/delete-user-options\"\nimport type { GenericOAuthOptions } from \"../types/generic-oauth-options\"\nimport type { GravatarOptions } from \"../types/gravatar-options\"\nimport type { Link } from \"../types/link\"\nimport type {\n OrganizationOptions,\n OrganizationOptionsContext\n} from \"../types/organization-options\"\nimport type { RenderToast } from \"../types/render-toast\"\nimport type { SignUpOptions } from \"../types/sign-up-options\"\nimport type { SocialOptions } from \"../types/social-options\"\nimport { OrganizationRefetcher } from \"./organization-refetcher\"\nimport type { AuthViewPaths } from \"./view-paths\"\nimport {\n accountViewPaths,\n authViewPaths,\n organizationViewPaths\n} from \"./view-paths\"\n\nconst DefaultLink: Link = ({ href, className, children }) => (\n \n {children}\n \n)\n\nconst defaultNavigate = (href: string) => {\n window.location.href = href\n}\n\nconst defaultReplace = (href: string) => {\n window.location.replace(href)\n}\n\nconst defaultToast: RenderToast = ({ variant = \"default\", message }) => {\n if (variant === \"default\") {\n toast(message)\n } else {\n toast[variant](message)\n }\n}\n\nexport type AuthUIContextType = {\n authClient: AuthClient\n /**\n * Additional fields for users\n */\n additionalFields?: AdditionalFields\n /**\n * API Key plugin configuration\n */\n apiKey?:\n | {\n /**\n * Prefix for API Keys\n */\n prefix?: string\n /**\n * Metadata for API Keys\n */\n metadata?: Record\n }\n | boolean\n /**\n * Avatar configuration\n * @default undefined\n */\n avatar?: AvatarOptions\n /**\n * Base path for the auth views\n * @default \"/auth\"\n */\n basePath: string\n /**\n * Front end base URL for auth API callbacks\n */\n baseURL?: string\n /**\n * Captcha configuration\n */\n captcha?: CaptchaOptions\n credentials?: CredentialsOptions\n /**\n * Default redirect URL after authenticating\n * @default \"/\"\n */\n redirectTo: string\n /**\n * Enable or disable user change email support\n * @default true\n */\n changeEmail?: boolean\n /**\n * User Account deletion configuration\n * @default undefined\n */\n deleteUser?: DeleteUserOptions\n /**\n * Show Verify Email card for unverified emails\n */\n emailVerification?: boolean\n /**\n * Freshness age for Session data\n * @default 60 * 60 * 24\n */\n freshAge: number\n /**\n * Generic OAuth provider configuration\n */\n genericOAuth?: GenericOAuthOptions\n /**\n * Gravatar configuration\n */\n gravatar?: boolean | GravatarOptions\n hooks: AuthHooks\n localization: typeof authLocalization\n /**\n * Enable or disable Magic Link support\n * @default false\n */\n magicLink?: boolean\n /**\n * Enable or disable Email OTP support\n * @default false\n */\n emailOTP?: boolean\n /**\n * Enable or disable Multi Session support\n * @default false\n */\n multiSession?: boolean\n mutators: AuthMutators\n /**\n * Whether the name field should be required\n * @default true\n */\n nameRequired?: boolean\n /**\n * Enable or disable One Tap support\n * @default false\n */\n oneTap?: boolean\n /**\n * Perform some User updates optimistically\n * @default false\n */\n optimistic?: boolean\n /**\n * Organization configuration\n */\n organization?: OrganizationOptionsContext\n /**\n * Enable or disable Passkey support\n * @default false\n */\n passkey?: boolean\n /**\n * Forces better-auth-tanstack to refresh the Session on the auth callback page\n * @default false\n */\n persistClient?: boolean\n /**\n * Account configuration\n */\n account?: AccountOptionsContext\n /**\n * Sign Up configuration\n */\n signUp?: SignUpOptions\n /**\n * Social provider configuration\n */\n social?: SocialOptions\n toast: RenderToast\n /**\n * Enable or disable two-factor authentication support\n * @default undefined\n */\n twoFactor?: (\"otp\" | \"totp\")[]\n viewPaths: AuthViewPaths\n /**\n * Navigate to a new URL\n * @default window.location.href\n */\n navigate: (href: string) => void\n /**\n * Called whenever the Session changes\n */\n onSessionChange?: () => void | Promise\n /**\n * Replace the current URL\n * @default navigate\n */\n replace: (href: string) => void\n /**\n * Custom Link component for navigation\n * @default \n */\n Link: Link\n}\n\nexport type AuthUIProviderProps = {\n children: ReactNode\n /**\n * Better Auth client returned from createAuthClient\n * @default Required\n * @remarks `AuthClient`\n */\n authClient: AnyAuthClient\n /**\n * Enable account view & account configuration\n * @default { fields: [\"image\", \"name\"] }\n */\n account?: boolean | Partial\n /**\n * Avatar configuration\n * @default undefined\n */\n avatar?: boolean | Partial\n /**\n * User Account deletion configuration\n * @default undefined\n */\n deleteUser?: DeleteUserOptions | boolean\n /**\n * ADVANCED: Custom hooks for fetching auth data\n */\n hooks?: Partial\n /**\n * Customize the paths for the auth views\n * @default authViewPaths\n * @remarks `AuthViewPaths`\n */\n viewPaths?: Partial\n /**\n * Render custom Toasts\n * @default Sonner\n */\n toast?: RenderToast\n /**\n * Customize the Localization strings\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n /**\n * ADVANCED: Custom mutators for updating auth data\n */\n mutators?: Partial\n /**\n * Organization plugin configuration\n */\n organization?: OrganizationOptions | boolean\n /**\n * Enable or disable Credentials support\n * @default { forgotPassword: true }\n */\n credentials?: boolean | CredentialsOptions\n /**\n * Enable or disable Sign Up form\n * @default { fields: [\"name\"] }\n */\n signUp?: SignUpOptions | boolean\n} & Partial<\n Omit<\n AuthUIContextType,\n | \"authClient\"\n | \"viewPaths\"\n | \"localization\"\n | \"mutators\"\n | \"toast\"\n | \"hooks\"\n | \"avatar\"\n | \"account\"\n | \"deleteUser\"\n | \"credentials\"\n | \"signUp\"\n | \"organization\"\n >\n>\n\nexport const AuthUIContext = createContext(\n {} as unknown as AuthUIContextType\n)\n\nexport const AuthUIProvider = ({\n children,\n authClient: authClientProp,\n account: accountProp,\n avatar: avatarProp,\n deleteUser: deleteUserProp,\n social: socialProp,\n genericOAuth: genericOAuthProp,\n basePath = \"/auth\",\n baseURL = \"\",\n captcha,\n redirectTo = \"/\",\n credentials: credentialsProp,\n changeEmail = true,\n freshAge = 60 * 60 * 24,\n hooks: hooksProp,\n mutators: mutatorsProp,\n localization: localizationProp,\n nameRequired = true,\n organization: organizationProp,\n signUp: signUpProp = true,\n toast = defaultToast,\n viewPaths: viewPathsProp,\n navigate,\n replace,\n Link = DefaultLink,\n ...props\n}: AuthUIProviderProps) => {\n const authClient = authClientProp as AuthClient\n\n const avatar = useMemo(() => {\n if (!avatarProp) return\n\n if (avatarProp === true) {\n return {\n extension: \"png\",\n size: 128\n }\n }\n\n return {\n upload: avatarProp.upload,\n delete: avatarProp.delete,\n extension: avatarProp.extension || \"png\",\n size: avatarProp.size || (avatarProp.upload ? 256 : 128)\n }\n }, [avatarProp])\n\n const account = useMemo(() => {\n if (accountProp === false) return\n\n if (accountProp === true || accountProp === undefined) {\n return {\n basePath: \"/account\",\n fields: [\"image\", \"name\"],\n viewPaths: accountViewPaths\n }\n }\n\n // Remove trailing slash from basePath\n const basePath = accountProp.basePath?.endsWith(\"/\")\n ? accountProp.basePath.slice(0, -1)\n : accountProp.basePath\n\n return {\n basePath: basePath ?? \"/account\",\n fields: accountProp.fields || [\"image\", \"name\"],\n viewPaths: { ...accountViewPaths, ...accountProp.viewPaths }\n }\n }, [accountProp])\n\n const deleteUser = useMemo(() => {\n if (!deleteUserProp) return\n\n if (deleteUserProp === true) {\n return {}\n }\n\n return deleteUserProp\n }, [deleteUserProp])\n\n const social = useMemo(() => {\n if (!socialProp) return\n\n return socialProp\n }, [socialProp])\n\n const genericOAuth = useMemo(() => {\n if (!genericOAuthProp) return\n\n return genericOAuthProp\n }, [genericOAuthProp])\n\n const credentials = useMemo(() => {\n if (credentialsProp === false) return\n\n if (credentialsProp === true) {\n return {\n forgotPassword: true\n }\n }\n\n return {\n ...credentialsProp,\n forgotPassword: credentialsProp?.forgotPassword ?? true\n }\n }, [credentialsProp])\n\n const signUp = useMemo(() => {\n if (signUpProp === false) return\n\n if (signUpProp === true || signUpProp === undefined) {\n return {\n fields: [\"name\"]\n }\n }\n\n return {\n fields: signUpProp.fields || [\"name\"]\n }\n }, [signUpProp])\n\n const organization = useMemo(() => {\n if (!organizationProp) return\n\n if (organizationProp === true) {\n return {\n basePath: \"/organization\",\n viewPaths: organizationViewPaths,\n customRoles: []\n }\n }\n\n let logo: OrganizationOptionsContext[\"logo\"] | undefined\n\n if (organizationProp.logo === true) {\n logo = {\n extension: \"png\",\n size: 128\n }\n } else if (organizationProp.logo) {\n logo = {\n upload: organizationProp.logo.upload,\n delete: organizationProp.logo.delete,\n extension: organizationProp.logo.extension || \"png\",\n size:\n organizationProp.logo.size || organizationProp.logo.upload\n ? 256\n : 128\n }\n }\n\n // Remove trailing slash from basePath\n const basePath = organizationProp.basePath?.endsWith(\"/\")\n ? organizationProp.basePath.slice(0, -1)\n : organizationProp.basePath\n\n return {\n ...organizationProp,\n logo,\n basePath: basePath ?? \"/organization\",\n customRoles: organizationProp.customRoles || [],\n viewPaths: {\n ...organizationViewPaths,\n ...organizationProp.viewPaths\n }\n }\n }, [organizationProp])\n\n const defaultMutators = useMemo(() => {\n return {\n deleteApiKey: (params) =>\n authClient.apiKey.delete({\n ...params,\n fetchOptions: { throw: true }\n }),\n deletePasskey: (params) =>\n authClient.passkey.deletePasskey({\n ...params,\n fetchOptions: { throw: true }\n }),\n revokeDeviceSession: (params) =>\n authClient.multiSession.revoke({\n ...params,\n fetchOptions: { throw: true }\n }),\n revokeSession: (params) =>\n authClient.revokeSession({\n ...params,\n fetchOptions: { throw: true }\n }),\n setActiveSession: (params) =>\n authClient.multiSession.setActive({\n ...params,\n fetchOptions: { throw: true }\n }),\n updateOrganization: (params) =>\n authClient.organization.update({\n ...params,\n fetchOptions: { throw: true }\n }),\n updateUser: (params) =>\n authClient.updateUser({\n ...params,\n fetchOptions: { throw: true }\n }),\n unlinkAccount: (params) =>\n authClient.unlinkAccount({\n ...params,\n fetchOptions: { throw: true }\n })\n } as AuthMutators\n }, [authClient])\n\n const defaultHooks = useMemo(() => {\n return {\n useSession: authClient.useSession,\n useListAccounts: () =>\n useAuthData({\n queryFn: authClient.listAccounts,\n cacheKey: \"listAccounts\"\n }),\n useAccountInfo: (params) =>\n useAuthData({\n queryFn: () => authClient.accountInfo(params),\n cacheKey: `accountInfo:${JSON.stringify(params)}`\n }),\n useListDeviceSessions: () =>\n useAuthData({\n queryFn: authClient.multiSession.listDeviceSessions,\n cacheKey: \"listDeviceSessions\"\n }),\n useListSessions: () =>\n useAuthData({\n queryFn: authClient.listSessions,\n cacheKey: \"listSessions\"\n }),\n useListPasskeys: authClient.useListPasskeys,\n useListApiKeys: () =>\n useAuthData({\n queryFn: authClient.apiKey.list,\n cacheKey: \"listApiKeys\"\n }),\n useActiveOrganization: authClient.useActiveOrganization,\n useListOrganizations: authClient.useListOrganizations,\n useHasPermission: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\"/organization/has-permission\", {\n method: \"POST\",\n body: params\n }),\n cacheKey: `hasPermission:${JSON.stringify(params)}`\n }),\n useInvitation: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.organization.getInvitation(params),\n cacheKey: `invitation:${JSON.stringify(params)}`\n }),\n useListInvitations: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n `/organization/list-invitations?organizationId=${params?.query?.organizationId || \"\"}`\n ),\n cacheKey: `listInvitations:${JSON.stringify(params)}`\n }),\n useListUserInvitations: () =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n \"/organization/list-user-invitations\"\n ),\n cacheKey: `listUserInvitations`\n }),\n useListMembers: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n `/organization/list-members?organizationId=${params?.query?.organizationId || \"\"}`\n ),\n cacheKey: `listMembers:${JSON.stringify(params)}`\n })\n } as AuthHooks\n }, [authClient])\n\n const viewPaths = useMemo(() => {\n return { ...authViewPaths, ...viewPathsProp }\n }, [viewPathsProp])\n\n const localization = useMemo(() => {\n return { ...authLocalization, ...localizationProp }\n }, [localizationProp])\n\n const hooks = useMemo(() => {\n return { ...defaultHooks, ...hooksProp }\n }, [defaultHooks, hooksProp])\n\n const mutators = useMemo(() => {\n return { ...defaultMutators, ...mutatorsProp }\n }, [defaultMutators, mutatorsProp])\n\n // Remove trailing slash from baseURL\n baseURL = baseURL.endsWith(\"/\") ? baseURL.slice(0, -1) : baseURL\n\n // Remove trailing slash from basePath\n basePath = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath\n\n const { data: sessionData } = hooks.useSession()\n\n return (\n \n {sessionData && organization && }\n\n {captcha?.provider === \"google-recaptcha-v3\" ? (\n {children}\n ) : (\n children\n )}\n \n )\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/auth-view.json b/public/r/auth-view.json new file mode 100644 index 00000000..c22f99a9 --- /dev/null +++ b/public/r/auth-view.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "auth-view", + "type": "registry:component", + "title": "Auth View", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-callback.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/email-otp-button.json", + "http://localhost:3000/r/magic-link-button.json", + "http://localhost:3000/r/one-tap.json", + "http://localhost:3000/r/passkey-button.json", + "http://localhost:3000/r/provider-button.json", + "separator", + "http://localhost:3000/r/sign-out.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json", + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/components/auth/auth-view.tsx", + "content": "\"use client\"\n\nimport { ArrowLeftIcon } from \"lucide-react\"\nimport { type ReactNode, useContext, useEffect, useState } from \"react\"\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { socialProviders } from \"../../lib/social-providers\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { AuthViewPaths } from \"../../lib/view-paths\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle\n} from \"../ui/card\"\nimport { Separator } from \"../ui/separator\"\nimport { AuthCallback } from \"./auth-callback\"\nimport { AuthForm, type AuthFormClassNames } from \"./auth-form\"\nimport { EmailOTPButton } from \"./email-otp-button\"\nimport { MagicLinkButton } from \"./magic-link-button\"\nimport { OneTap } from \"./one-tap\"\nimport { PasskeyButton } from \"./passkey-button\"\nimport { ProviderButton } from \"./provider-button\"\nimport { SignOut } from \"./sign-out\"\n\nexport type AuthViewClassNames = {\n base?: string\n content?: string\n description?: string\n footer?: string\n footerLink?: string\n continueWith?: string\n form?: AuthFormClassNames\n header?: string\n separator?: string\n title?: string\n}\n\nexport interface AuthViewProps {\n className?: string\n classNames?: AuthViewClassNames\n callbackURL?: string\n cardHeader?: ReactNode\n localization?: AuthLocalization\n pathname?: string\n redirectTo?: string\n socialLayout?: \"auto\" | \"horizontal\" | \"grid\" | \"vertical\"\n view?: keyof AuthViewPaths\n otpSeparators?: 0 | 1 | 2\n}\n\nexport function AuthView({\n className,\n classNames,\n callbackURL,\n cardHeader,\n localization,\n pathname,\n redirectTo,\n socialLayout: socialLayoutProp = \"auto\",\n view: viewProp,\n otpSeparators = 0\n}: AuthViewProps) {\n const isHydrated = useIsHydrated()\n const {\n basePath,\n credentials,\n localization: contextLocalization,\n magicLink,\n emailOTP,\n oneTap,\n passkey,\n signUp,\n social,\n genericOAuth,\n viewPaths,\n Link\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n let socialLayout = socialLayoutProp\n if (socialLayout === \"auto\") {\n socialLayout = !credentials\n ? \"vertical\"\n : social?.providers && social.providers.length > 2\n ? \"horizontal\"\n : \"vertical\"\n }\n\n const path = pathname?.split(\"/\").pop()\n const view =\n viewProp ||\n (getViewByPath(\n viewPaths as unknown as Record,\n path\n ) as typeof viewProp) ||\n \"SIGN_IN\"\n\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n useEffect(() => {\n const handlePageHide = () => setIsSubmitting(false)\n window.addEventListener(\"pagehide\", handlePageHide)\n return () => {\n setIsSubmitting(false)\n window.removeEventListener(\"pagehide\", handlePageHide)\n }\n }, [])\n\n if (view === \"CALLBACK\") return \n if (view === \"SIGN_OUT\") return \n\n const description =\n !credentials && !magicLink && !emailOTP\n ? localization.DISABLED_CREDENTIALS_DESCRIPTION\n : localization[`${view}_DESCRIPTION` as keyof typeof localization]\n\n return (\n \n \n {cardHeader ? (\n cardHeader\n ) : (\n <>\n \n {localization[view as keyof typeof localization]}\n \n {description && (\n \n {description}\n \n )}\n \n )}\n \n\n \n {oneTap &&\n [\"SIGN_IN\", \"SIGN_UP\", \"MAGIC_LINK\", \"EMAIL_OTP\"].includes(\n view as string\n ) && (\n \n )}\n\n {(credentials || magicLink || emailOTP) && (\n
\n \n\n {magicLink &&\n ((credentials &&\n [\n \"FORGOT_PASSWORD\",\n \"SIGN_UP\",\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\"\n ].includes(view as string)) ||\n (emailOTP && view === \"EMAIL_OTP\")) && (\n \n )}\n\n {emailOTP &&\n ((credentials &&\n [\n \"FORGOT_PASSWORD\",\n \"SIGN_UP\",\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\"\n ].includes(view as string)) ||\n (magicLink &&\n [\"SIGN_IN\", \"MAGIC_LINK\"].includes(\n view as string\n ))) && (\n \n )}\n
\n )}\n\n {view !== \"RESET_PASSWORD\" &&\n (social?.providers?.length ||\n genericOAuth?.providers?.length ||\n (view === \"SIGN_IN\" && passkey)) && (\n <>\n {(credentials || magicLink || emailOTP) && (\n \n \n \n {localization.OR_CONTINUE_WITH}\n \n \n \n )}\n\n
\n {(social?.providers?.length ||\n genericOAuth?.providers?.length) && (\n \n {social?.providers?.map((provider) => {\n const socialProvider =\n socialProviders.find(\n (socialProvider) =>\n socialProvider.provider ===\n provider\n )\n if (!socialProvider) return null\n return (\n \n )\n })}\n {genericOAuth?.providers?.map(\n (provider) => (\n \n )\n )}\n
\n )}\n\n {passkey &&\n [\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\",\n \"RECOVER_ACCOUNT\",\n \"TWO_FACTOR\",\n \"FORGOT_PASSWORD\"\n ].includes(view as string) && (\n \n )}\n \n \n )}\n
\n\n {credentials && signUp && (\n \n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\" ? (\n localization.DONT_HAVE_AN_ACCOUNT\n ) : view === \"SIGN_UP\" ? (\n localization.ALREADY_HAVE_AN_ACCOUNT\n ) : (\n \n )}\n\n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\" ||\n view === \"SIGN_UP\" ? (\n \n \n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\"\n ? localization.SIGN_UP\n : localization.SIGN_IN}\n \n \n ) : (\n window.history.back()}\n >\n {localization.GO_BACK}\n \n )}\n \n )}\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/avatar-options.json b/public/r/avatar-options.json new file mode 100644 index 00000000..a24c2830 --- /dev/null +++ b/public/r/avatar-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "avatar-options", + "type": "registry:file", + "title": "Avatar Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/image.json" + ], + "files": [ + { + "path": "src/types/avatar-options.ts", + "content": "import type { Image } from \"./image\"\n\nexport type AvatarOptions = {\n /**\n * Upload an avatar image and return the URL string\n * @remarks `(file: File) => Promise`\n */\n upload?: (file: File) => Promise\n /**\n * Delete a previously uploaded avatar image from your storage/CDN\n * @remarks `(url: string) => Promise`\n */\n delete?: (url: string) => Promise\n /**\n * Avatar size for resizing\n * @default 128 (or 256 if upload is provided)\n */\n size: number\n /**\n * File extension for avatar uploads\n * @default \"png\"\n */\n extension: string\n /**\n * Custom Image component for rendering avatar images\n * @default AvatarImage from Radix UI\n */\n Image?: Image\n}\n", + "type": "registry:file", + "target": "types/avatar-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/avatar.json b/public/r/avatar.json new file mode 100644 index 00000000..312a6a9f --- /dev/null +++ b/public/r/avatar.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "avatar", + "type": "registry:ui", + "title": "Avatar", + "description": "", + "dependencies": [ + "@radix-ui/react-avatar" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/avatar.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/backup-codes-dialog.json b/public/r/backup-codes-dialog.json new file mode 100644 index 00000000..07ff49dd --- /dev/null +++ b/public/r/backup-codes-dialog.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "backup-codes-dialog", + "type": "registry:component", + "title": "Backup Codes Dialog", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/backup-codes-dialog.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface BackupCodesDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n backupCodes: string[]\n}\n\nexport function BackupCodesDialog({\n classNames,\n backupCodes,\n onOpenChange,\n ...props\n}: BackupCodesDialogProps) {\n const { localization } = useContext(AuthUIContext)\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n const codeText = backupCodes.join(\"\\n\")\n navigator.clipboard.writeText(codeText)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.BACKUP_CODES}\n \n\n \n {localization.BACKUP_CODES_DESCRIPTION}\n \n \n\n
\n {backupCodes.map((code, index) => (\n \n {code}\n
\n ))}\n \n\n \n \n {copied ? (\n <>\n \n {localization.COPIED_TO_CLIPBOARD}\n \n ) : (\n <>\n \n {localization.COPY_ALL_CODES}\n \n )}\n \n\n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.primaryButton\n )}\n >\n {localization.CONTINUE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/base-error-codes.json b/public/r/base-error-codes.json new file mode 100644 index 00000000..35ce5cea --- /dev/null +++ b/public/r/base-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "base-error-codes", + "type": "registry:file", + "title": "Base Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/base-error-codes.ts", + "content": "export const BASE_ERROR_CODES = {\n USER_NOT_FOUND: \"User not found\",\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n FAILED_TO_CREATE_SESSION: \"Failed to create session\",\n FAILED_TO_UPDATE_USER: \"Failed to update user\",\n FAILED_TO_GET_SESSION: \"Failed to get session\",\n INVALID_PASSWORD: \"Invalid password\",\n INVALID_EMAIL: \"Invalid email\",\n INVALID_EMAIL_OR_PASSWORD: \"Invalid email or password\",\n SOCIAL_ACCOUNT_ALREADY_LINKED: \"Social account already linked\",\n PROVIDER_NOT_FOUND: \"Provider not found\",\n INVALID_TOKEN: \"Invalid token\",\n ID_TOKEN_NOT_SUPPORTED: \"id_token not supported\",\n FAILED_TO_GET_USER_INFO: \"Failed to get user info\",\n USER_EMAIL_NOT_FOUND: \"User email not found\",\n EMAIL_NOT_VERIFIED: \"Email not verified\",\n PASSWORD_TOO_SHORT: \"Password too short\",\n PASSWORD_TOO_LONG: \"Password too long\",\n USER_ALREADY_EXISTS: \"User already exists\",\n EMAIL_CAN_NOT_BE_UPDATED: \"Email can not be updated\",\n CREDENTIAL_ACCOUNT_NOT_FOUND: \"Credential account not found\",\n SESSION_EXPIRED: \"Session expired. Re-authenticate to perform this action.\",\n FAILED_TO_UNLINK_LAST_ACCOUNT: \"You can't unlink your last account\",\n ACCOUNT_NOT_FOUND: \"Account not found\",\n USER_ALREADY_HAS_PASSWORD:\n \"User already has a password. Provide that to delete the account.\"\n}\n", + "type": "registry:file", + "target": "localization/base-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/button.json b/public/r/button.json new file mode 100644 index 00000000..9a3f3387 --- /dev/null +++ b/public/r/button.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "button", + "type": "registry:ui", + "title": "Button", + "description": "", + "dependencies": [ + "@radix-ui/react-slot", + "class-variance-authority" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/button.tsx", + "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n \n )\n}\n\nexport { Button, buttonVariants }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/captcha-error-codes.json b/public/r/captcha-error-codes.json new file mode 100644 index 00000000..bc53de8d --- /dev/null +++ b/public/r/captcha-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha-error-codes", + "type": "registry:file", + "title": "Captcha Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/captcha-error-codes.ts", + "content": "// These error codes are returned by the API\nconst EXTERNAL_ERROR_CODES = {\n VERIFICATION_FAILED: \"Captcha verification failed\",\n MISSING_RESPONSE: \"Missing CAPTCHA response\",\n UNKNOWN_ERROR: \"Something went wrong\"\n}\n\n// These error codes are only visible in the server logs\nconst INTERNAL_ERROR_CODES = {\n MISSING_SECRET_KEY: \"Missing secret key\",\n SERVICE_UNAVAILABLE: \"CAPTCHA service unavailable\"\n}\n\nexport const CAPTCHA_ERROR_CODES = {\n ...EXTERNAL_ERROR_CODES,\n ...INTERNAL_ERROR_CODES\n}\n", + "type": "registry:file", + "target": "localization/captcha-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/captcha-options.json b/public/r/captcha-options.json new file mode 100644 index 00000000..0fbc8690 --- /dev/null +++ b/public/r/captcha-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha-options", + "type": "registry:file", + "title": "Captcha Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/captcha-provider.json" + ], + "files": [ + { + "path": "src/types/captcha-options.ts", + "content": "import type { CaptchaProvider } from \"./captcha-provider\"\n\nexport type CaptchaOptions = {\n /**\n * Captcha site key\n */\n siteKey: string\n /**\n * Captcha provider type\n */\n provider: CaptchaProvider\n /**\n * Hide the captcha badge\n * @default false\n */\n hideBadge?: boolean\n /**\n * Use recaptcha.net domain instead of google.com\n * @default false\n */\n recaptchaNet?: boolean\n /**\n * Enable enterprise mode for Google reCAPTCHA\n * @default false\n */\n enterprise?: boolean\n /**\n * Overrides the default array of paths where captcha validation is enforced\n * @default [\"/sign-up/email\", \"/sign-in/email\", \"/forget-password\"]\n */\n endpoints?: string[]\n}\n", + "type": "registry:file", + "target": "types/captcha-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/captcha-provider.json b/public/r/captcha-provider.json new file mode 100644 index 00000000..76fe9715 --- /dev/null +++ b/public/r/captcha-provider.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha-provider", + "type": "registry:file", + "title": "Captcha Provider", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/captcha-provider.ts", + "content": "export type CaptchaProvider =\n | \"cloudflare-turnstile\"\n | \"google-recaptcha-v2-checkbox\"\n | \"google-recaptcha-v2-invisible\"\n | \"google-recaptcha-v3\"\n | \"hcaptcha\"\n", + "type": "registry:file", + "target": "types/captcha-provider.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/captcha.json b/public/r/captcha.json new file mode 100644 index 00000000..59e0746f --- /dev/null +++ b/public/r/captcha.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "captcha", + "type": "registry:component", + "title": "Captcha", + "description": "", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/recaptcha-badge.json", + "http://localhost:3000/r/recaptcha-v2.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/captcha.tsx", + "content": "import HCaptcha from \"@hcaptcha/react-hcaptcha\"\nimport { Turnstile } from \"@marsidev/react-turnstile\"\nimport { type RefObject, useContext } from \"react\"\n\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { RecaptchaBadge } from \"./recaptcha-badge\"\nimport { RecaptchaV2 } from \"./recaptcha-v2\"\n\n// Default captcha endpoints\nconst DEFAULT_CAPTCHA_ENDPOINTS = [\n \"/sign-up/email\",\n \"/sign-in/email\",\n \"/forget-password\"\n]\n\ninterface CaptchaProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n ref: RefObject\n localization: Partial\n action?: string // Optional action to check if it's in the endpoints list\n}\n\nexport function Captcha({ ref, localization, action }: CaptchaProps) {\n const { captcha } = useContext(AuthUIContext)\n if (!captcha) return null\n\n // If action is provided, check if it's in the list of captcha-enabled endpoints\n if (action) {\n const endpoints = captcha.endpoints || DEFAULT_CAPTCHA_ENDPOINTS\n if (!endpoints.includes(action)) {\n return null\n }\n }\n\n const { theme } = useTheme()\n\n const showRecaptchaV2 =\n captcha.provider === \"google-recaptcha-v2-checkbox\" ||\n captcha.provider === \"google-recaptcha-v2-invisible\"\n\n const showRecaptchaBadge =\n captcha.provider === \"google-recaptcha-v3\" ||\n captcha.provider === \"google-recaptcha-v2-invisible\"\n\n const showTurnstile = captcha.provider === \"cloudflare-turnstile\"\n\n const showHCaptcha = captcha.provider === \"hcaptcha\"\n\n return (\n <>\n {showRecaptchaV2 && }\n {showRecaptchaBadge && (\n \n )}\n {showTurnstile && (\n \n )}\n {showHCaptcha && (\n
\n \n
\n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/card.json b/public/r/card.json new file mode 100644 index 00000000..494673c8 --- /dev/null +++ b/public/r/card.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "card", + "type": "registry:ui", + "title": "Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/card.tsx", + "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/change-email-card.json b/public/r/change-email-card.json new file mode 100644 index 00000000..6bceca94 --- /dev/null +++ b/public/r/change-email-card.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "change-email-card", + "type": "registry:component", + "title": "Change Email Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-email-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport { CardContent } from \"../../ui/card\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\n\nexport function ChangeEmailCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n authClient,\n emailVerification,\n hooks: { useSession },\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData, isPending, refetch } = useSession()\n const [resendDisabled, setResendDisabled] = useState(false)\n\n const formSchema = z.object({\n email: z\n .string()\n .min(1, { message: localization.EMAIL_REQUIRED })\n .email({ message: localization.INVALID_EMAIL })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: {\n email: sessionData?.user.email || \"\"\n }\n })\n\n const resendForm = useForm()\n\n const { isSubmitting } = form.formState\n\n const changeEmail = async ({ email }: z.infer) => {\n if (email === sessionData?.user.email) {\n await new Promise((resolve) => setTimeout(resolve))\n toast({\n variant: \"error\",\n message: localization.EMAIL_IS_THE_SAME\n })\n return\n }\n\n try {\n await authClient.changeEmail({\n newEmail: email,\n callbackURL: window.location.pathname,\n fetchOptions: { throw: true }\n })\n\n if (sessionData?.user.emailVerified) {\n toast({\n variant: \"success\",\n message: localization.EMAIL_VERIFY_CHANGE!\n })\n } else {\n await refetch?.()\n toast({\n variant: \"success\",\n message: `${localization.EMAIL} ${localization.UPDATED_SUCCESSFULLY}`\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const resendVerification = async () => {\n if (!sessionData) return\n const email = sessionData.user.email\n\n setResendDisabled(true)\n\n try {\n await authClient.sendVerificationEmail({\n email,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.EMAIL_VERIFICATION!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n setResendDisabled(false)\n throw error\n }\n }\n\n return (\n <>\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n\n {emailVerification &&\n sessionData?.user &&\n !sessionData?.user.emailVerified && (\n
\n \n \n \n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/change-password-card.json b/public/r/change-password-card.json new file mode 100644 index 00000000..37e0f3ca --- /dev/null +++ b/public/r/change-password-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "change-password-card", + "type": "registry:component", + "title": "Change Password Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/input-field-skeleton.json", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/change-password-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getPasswordSchema } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { PasswordInput } from \"../../password-input\"\nimport { CardContent } from \"../../ui/card\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport {\n SettingsCard,\n type SettingsCardClassNames\n} from \"../shared/settings-card\"\nimport { InputFieldSkeleton } from \"../skeletons/input-field-skeleton\"\n\nexport interface ChangePasswordCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n isPending?: boolean\n localization?: AuthLocalization\n skipHook?: boolean\n passwordValidation?: PasswordValidation\n}\n\nexport function ChangePasswordCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook,\n passwordValidation\n}: ChangePasswordCardProps) {\n const {\n authClient,\n basePath,\n baseURL,\n credentials,\n hooks: { useSession, useListAccounts },\n localization: contextLocalization,\n viewPaths,\n toast\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const { data: sessionData } = useSession()\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n }\n\n const formSchema = z\n .object({\n currentPassword: getPasswordSchema(\n passwordValidation,\n localization\n ),\n newPassword: getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.NEW_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n }),\n confirmPassword: confirmPasswordEnabled\n ? getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n : z.string().optional()\n })\n .refine(\n (data) =>\n !confirmPasswordEnabled ||\n data.newPassword === data.confirmPassword,\n {\n message: localization.PASSWORDS_DO_NOT_MATCH,\n path: [\"confirmPassword\"]\n }\n )\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n currentPassword: \"\",\n newPassword: \"\",\n confirmPassword: \"\"\n }\n })\n\n const setPasswordForm = useForm()\n\n const { isSubmitting } = form.formState\n\n const setPassword = async () => {\n if (!sessionData) return\n const email = sessionData?.user.email\n\n try {\n await authClient.requestPasswordReset({\n email,\n redirectTo: `${baseURL}${basePath}/${viewPaths.RESET_PASSWORD}`,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.FORGOT_PASSWORD_EMAIL!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const changePassword = async ({\n currentPassword,\n newPassword\n }: z.infer) => {\n try {\n await authClient.changePassword({\n currentPassword,\n newPassword,\n revokeOtherSessions: true,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.CHANGE_PASSWORD_SUCCESS!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n form.reset()\n }\n\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n if (!isPending && !credentialsLinked) {\n return (\n
\n \n \n \n \n )\n }\n\n return (\n
\n \n \n \n {isPending || !accounts ? (\n <>\n \n \n\n {confirmPasswordEnabled && (\n \n )}\n \n ) : (\n <>\n (\n \n \n {localization.CURRENT_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.NEW_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {\n localization.CONFIRM_PASSWORD\n }\n \n\n \n \n \n\n \n \n )}\n />\n )}\n \n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/checkbox.json b/public/r/checkbox.json new file mode 100644 index 00000000..e58038e5 --- /dev/null +++ b/public/r/checkbox.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "checkbox", + "type": "registry:ui", + "title": "Checkbox", + "description": "", + "dependencies": [ + "@radix-ui/react-checkbox", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/checkbox.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n\nexport { Checkbox }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/create-api-key-dialog.json b/public/r/create-api-key-dialog.json new file mode 100644 index 00000000..38394ef7 --- /dev/null +++ b/public/r/create-api-key-dialog.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "create-api-key-dialog", + "type": "registry:component", + "title": "Create Api Key Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/refetch.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/api-key/create-api-key-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { OrganizationCellView } from \"../../organization/organization-cell-view\"\nimport { PersonalAccountView } from \"../../organization/personal-account-view\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue\n} from \"../../ui/select\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface CreateApiKeyDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n onSuccess: (key: string) => void\n refetch?: Refetch\n organizationId?: string\n}\n\nexport function CreateApiKeyDialog({\n classNames,\n localization,\n onSuccess,\n refetch,\n organizationId,\n onOpenChange,\n ...props\n}: CreateApiKeyDialogProps) {\n const {\n authClient,\n apiKey,\n hooks: { useListOrganizations, useSession },\n localization: contextLocalization,\n organization: contextOrganization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n\n let organizations: Organization[] | null | undefined\n if (contextOrganization) {\n const { data } = useListOrganizations()\n organizations = data\n }\n\n const { data: sessionData } = useSession()\n const user = sessionData?.user\n\n const showOrganizationSelect = contextOrganization?.apiKey\n\n const formSchema = z.object({\n name: z\n .string()\n .min(1, `${localization.NAME} ${localization.IS_REQUIRED}`),\n expiresInDays: z.string().optional(),\n organizationId: showOrganizationSelect\n ? z\n .string()\n .min(\n 1,\n `${localization.ORGANIZATION} ${localization.IS_REQUIRED}`\n )\n : z.string().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: {\n name: \"\",\n expiresInDays: \"none\",\n organizationId: organizationId ?? \"personal\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const onSubmit = async (values: z.infer) => {\n try {\n const expiresIn =\n values.expiresInDays && values.expiresInDays !== \"none\"\n ? Number.parseInt(values.expiresInDays) * 60 * 60 * 24\n : undefined\n\n const selectedOrgId =\n values.organizationId === \"personal\"\n ? undefined\n : values.organizationId\n\n const metadata = {\n ...(typeof apiKey === \"object\" ? apiKey.metadata : {}),\n ...(contextOrganization && selectedOrgId\n ? { organizationId: selectedOrgId }\n : {})\n }\n\n const result = await authClient.apiKey.create({\n name: values.name,\n expiresIn,\n prefix: typeof apiKey === \"object\" ? apiKey.prefix : undefined,\n metadata:\n Object.keys(metadata).length > 0 ? metadata : undefined,\n fetchOptions: { throw: true }\n })\n\n await refetch?.()\n onSuccess(result.key)\n onOpenChange?.(false)\n form.reset()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const rtf = new Intl.RelativeTimeFormat(lang ?? \"en\")\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.CREATE_API_KEY}\n \n\n \n {localization.CREATE_API_KEY_DESCRIPTION}\n \n \n\n
\n \n {showOrganizationSelect && (\n (\n \n \n {localization.ORGANIZATION}\n \n\n \n \n \n \n \n \n\n \n \n \n \n\n {organizations?.map((org) => (\n \n \n \n ))}\n \n \n\n \n \n )}\n />\n )}\n\n
\n (\n \n \n {localization.NAME}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.EXPIRES}\n \n\n \n \n \n \n \n \n\n \n \n {localization.NO_EXPIRATION}\n \n\n {[\n 1, 7, 30, 60, 90, 180, 365\n ].map((days) => (\n \n {days === 365\n ? rtf.format(\n 1,\n \"year\"\n )\n : rtf.format(\n days,\n \"day\"\n )}\n \n ))}\n \n \n\n \n \n )}\n />\n
\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isSubmitting}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization.CREATE_API_KEY}\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/create-organization-dialog.json b/public/r/create-organization-dialog.json new file mode 100644 index 00000000..31f5c1fd --- /dev/null +++ b/public/r/create-organization-dialog.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "create-organization-dialog", + "type": "registry:component", + "title": "Create Organization Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/create-organization-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2, Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport {\n type ComponentProps,\n useContext,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { OrganizationLogo } from \"./organization-logo\"\n\nexport interface CreateOrganizationDialogProps\n extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function CreateOrganizationDialog({\n className,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: CreateOrganizationDialogProps) {\n const {\n authClient,\n localization: contextLocalization,\n organization: organizationOptions,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [logo, setLogo] = useState(null)\n const [logoPending, setLogoPending] = useState(false)\n\n const fileInputRef = useRef(null)\n const openFileDialog = () => fileInputRef.current?.click()\n\n const formSchema = z.object({\n logo: z.string().optional(),\n name: z.string().min(1, {\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`\n }),\n slug: z\n .string()\n .min(1, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_REQUIRED}`\n })\n .regex(/^[a-z0-9-]+$/, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_INVALID}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n logo: \"\",\n name: \"\",\n slug: \"\"\n }\n })\n\n const isSubmitting = form.formState.isSubmitting\n\n const handleLogoChange = async (file: File) => {\n if (!organizationOptions?.logo) return\n\n setLogoPending(true)\n\n try {\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n organizationOptions.logo.size,\n organizationOptions.logo.extension\n )\n\n let image: string | undefined | null\n\n if (organizationOptions?.logo.upload) {\n image = await organizationOptions.logo.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n setLogo(image || null)\n form.setValue(\"logo\", image || \"\")\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLogoPending(false)\n }\n\n const deleteLogo = async () => {\n setLogoPending(true)\n\n const currentUrl = logo || undefined\n if (currentUrl && organizationOptions?.logo?.delete) {\n await organizationOptions.logo.delete(currentUrl)\n }\n\n setLogo(null)\n form.setValue(\"logo\", \"\")\n setLogoPending(false)\n }\n\n async function onSubmit({ name, slug, logo }: z.infer) {\n try {\n const organization = await authClient.organization.create({\n name,\n slug,\n logo,\n fetchOptions: { throw: true }\n })\n\n if (organizationOptions?.pathMode === \"slug\") {\n navigate(`${organizationOptions.basePath}/${organization.slug}`)\n return\n }\n\n await authClient.organization.setActive({\n organizationId: organization.id\n })\n\n onOpenChange?.(false)\n form.reset()\n setLogo(null)\n\n toast({\n variant: \"success\",\n message: localization.CREATE_ORGANIZATION_SUCCESS\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n \n \n \n \n {localization.CREATE_ORGANIZATION}\n \n\n \n {localization.ORGANIZATIONS_INSTRUCTIONS}\n \n \n\n
\n \n {organizationOptions?.logo && (\n (\n \n {\n const file =\n e.target.files?.item(0)\n if (file) handleLogoChange(file)\n e.target.value = \"\"\n }}\n />\n\n \n {localization.LOGO}\n \n\n
\n \n \n \n \n \n \n\n \n e.preventDefault()\n }\n >\n \n \n\n {\n localization.UPLOAD_LOGO\n }\n \n\n {logo && (\n \n \n\n {\n localization.DELETE_LOGO\n }\n \n )}\n \n \n\n \n {logoPending && (\n \n )}\n\n {localization.UPLOAD}\n \n
\n\n \n
\n )}\n />\n )}\n\n (\n \n \n {localization.ORGANIZATION_NAME}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.ORGANIZATION_SLUG}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization.CREATE_ORGANIZATION}\n \n \n \n \n
\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/credentials-options.json b/public/r/credentials-options.json new file mode 100644 index 00000000..97cb89d7 --- /dev/null +++ b/public/r/credentials-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "credentials-options", + "type": "registry:file", + "title": "Credentials Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/types/credentials-options.ts", + "content": "import type { PasswordValidation } from \"./password-validation\"\n\nexport type CredentialsOptions = {\n /**\n * Enable or disable the Confirm Password input\n * @default false\n */\n confirmPassword?: boolean\n\n /**\n * Enable or disable Forgot Password flow\n * @default true\n */\n forgotPassword?: boolean\n\n /**\n * Customize the password validation\n */\n passwordValidation?: PasswordValidation\n\n /**\n * Enable or disable Remember Me checkbox\n * @default false\n */\n rememberMe?: boolean\n\n /**\n * Enable or disable Username support\n * @default false\n */\n username?: boolean\n}\n", + "type": "registry:file", + "target": "types/credentials-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/delete-account-card.json b/public/r/delete-account-card.json new file mode 100644 index 00000000..2966299f --- /dev/null +++ b/public/r/delete-account-card.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-account-card", + "type": "registry:component", + "title": "Delete Account Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-account-dialog.json", + "http://localhost:3000/r/settings-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { DeleteAccountDialog } from \"./delete-account-dialog\"\n\nexport interface DeleteAccountCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n isPending?: boolean\n localization?: AuthLocalization\n skipHook?: boolean\n}\n\nexport function DeleteAccountCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook\n}: DeleteAccountCardProps) {\n const {\n hooks: { useListAccounts },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const [showDialog, setShowDialog] = useState(false)\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n }\n\n return (\n
\n setShowDialog(true)}\n />\n\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/delete-account-dialog.json b/public/r/delete-account-dialog.json new file mode 100644 index 00000000..1c1ebfb9 --- /dev/null +++ b/public/r/delete-account-dialog.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-account-dialog", + "type": "registry:component", + "title": "Delete Account Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/delete-account-dialog.tsx", + "content": "import { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { UserView } from \"../../user-view\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface DeleteAccountDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n localization?: AuthLocalization\n}\n\nexport function DeleteAccountDialog({\n classNames,\n accounts,\n localization,\n onOpenChange,\n ...props\n}: DeleteAccountDialogProps) {\n const {\n authClient,\n basePath,\n baseURL,\n deleteUser,\n freshAge,\n hooks: { useSession },\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const user = sessionData?.user\n\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n const formSchema = z.object({\n password: credentialsLinked\n ? z.string().min(1, { message: localization.PASSWORD_REQUIRED! })\n : z.string().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n password: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const deleteAccount = async ({ password }: z.infer) => {\n const params = {} as Record\n\n if (credentialsLinked) {\n params.password = password!\n } else if (!isFresh) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n if (deleteUser?.verification) {\n params.callbackURL = `${baseURL}${basePath}/${viewPaths.SIGN_OUT}`\n }\n\n try {\n await authClient.deleteUser({\n ...params,\n fetchOptions: {\n throw: true\n }\n })\n\n if (deleteUser?.verification) {\n toast({\n variant: \"success\",\n message: localization.DELETE_ACCOUNT_VERIFY!\n })\n } else {\n toast({\n variant: \"success\",\n message: localization.DELETE_ACCOUNT_SUCCESS!\n })\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n onOpenChange?.(false)\n }\n\n return (\n \n \n \n \n {localization?.DELETE_ACCOUNT}\n \n\n \n {isFresh\n ? localization?.DELETE_ACCOUNT_INSTRUCTIONS\n : localization?.SESSION_NOT_FRESH}\n \n \n\n \n \n \n\n
\n \n {credentialsLinked && (\n (\n \n \n {localization?.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n {isFresh\n ? localization?.DELETE_ACCOUNT\n : localization?.SIGN_OUT}\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/delete-organization-card.json b/public/r/delete-organization-card.json new file mode 100644 index 00000000..265f6d22 --- /dev/null +++ b/public/r/delete-organization-card.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-organization-card", + "type": "registry:component", + "title": "Delete Organization Card", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { DeleteOrganizationDialog } from \"./delete-organization-dialog\"\n\nexport function DeleteOrganizationCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization)\n return (\n \n )\n\n return (\n \n )\n}\n\nfunction DeleteOrganizationForm({\n className,\n classNames,\n localization: localizationProp,\n organization\n}: SettingsCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission }\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: hasPermission, isPending } = useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"delete\"]\n }\n })\n\n const [showDialog, setShowDialog] = useState(false)\n\n if (!hasPermission?.success) return null\n\n return (\n <>\n setShowDialog(true)}\n />\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/delete-organization-dialog.json b/public/r/delete-organization-dialog.json new file mode 100644 index 00000000..82c8af10 --- /dev/null +++ b/public/r/delete-organization-dialog.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-organization-dialog", + "type": "registry:component", + "title": "Delete Organization Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dialog", + "form", + "input", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/delete-organization-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface DeleteOrganizationDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n organization: Organization\n}\n\nexport function DeleteOrganizationDialog({\n classNames,\n localization: localizationProp,\n onOpenChange,\n organization,\n ...props\n}: DeleteOrganizationDialogProps) {\n const {\n authClient,\n account: accountOptions,\n hooks: { useListOrganizations },\n localization: contextLocalization,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganizations } = useListOrganizations()\n\n const formSchema = z.object({\n slug: z\n .string()\n .min(1, { message: localization.SLUG_REQUIRED! })\n .refine((val) => val === organization.slug, {\n message: localization.SLUG_DOES_NOT_MATCH!\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n slug: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const deleteOrganization = async () => {\n try {\n await authClient.organization.delete({\n organizationId: organization.id,\n fetchOptions: { throw: true }\n })\n\n await refetchOrganizations?.()\n\n toast({\n variant: \"success\",\n message: localization.DELETE_ORGANIZATION_SUCCESS!\n })\n\n navigate(\n `${accountOptions?.basePath}/${accountOptions?.viewPaths.ORGANIZATIONS}`\n )\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n \n \n \n \n {localization?.DELETE_ORGANIZATION}\n \n\n \n {localization?.DELETE_ORGANIZATION_DESCRIPTION}\n \n \n\n \n \n \n\n
\n \n (\n \n \n {\n localization?.DELETE_ORGANIZATION_INSTRUCTIONS\n }\n\n \n {organization.slug}\n \n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization?.DELETE_ORGANIZATION}\n \n \n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/delete-user-options.json b/public/r/delete-user-options.json new file mode 100644 index 00000000..e2a1e41c --- /dev/null +++ b/public/r/delete-user-options.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "delete-user-options", + "type": "registry:file", + "title": "Delete User Options", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/delete-user-options.ts", + "content": "export type DeleteUserOptions = {\n /**\n * Enable or disable email verification for account deletion\n * @default undefined\n */\n verification?: boolean\n}\n", + "type": "registry:file", + "target": "types/delete-user-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/dialog.json b/public/r/dialog.json new file mode 100644 index 00000000..94861251 --- /dev/null +++ b/public/r/dialog.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dialog", + "type": "registry:ui", + "title": "Dialog", + "description": "", + "dependencies": [ + "@radix-ui/react-dialog", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/dialog.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/drawer.json b/public/r/drawer.json new file mode 100644 index 00000000..9f958f48 --- /dev/null +++ b/public/r/drawer.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "drawer", + "type": "registry:ui", + "title": "Drawer", + "description": "", + "dependencies": [ + "vaul" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/drawer.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-cell.json b/public/r/organization-cell.json new file mode 100644 index 00000000..6ba436fa --- /dev/null +++ b/public/r/organization-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-cell", + "type": "registry:component", + "title": "Organization Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/leave-organization-dialog.json", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-cell.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { EllipsisIcon, Loader2, LogOutIcon, SettingsIcon } from \"lucide-react\"\nimport { useCallback, useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { LeaveOrganizationDialog } from \"./leave-organization-dialog\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface OrganizationCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n organization: Organization\n localization?: AuthLocalization\n}\n\nexport function OrganizationCell({\n className,\n classNames,\n organization,\n localization: localizationProp\n}: OrganizationCellProps) {\n const {\n authClient,\n localization: contextLocalization,\n organization: organizationOptions,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { pathMode } = organizationOptions || {}\n\n const [isLeaveDialogOpen, setIsLeaveDialogOpen] = useState(false)\n const [isManagingOrganization, setIsManagingOrganization] = useState(false)\n\n const handleManageOrganization = useCallback(async () => {\n setIsManagingOrganization(true)\n\n if (pathMode === \"slug\") {\n navigate(\n `${organizationOptions?.basePath}/${organization.slug}/${organizationOptions?.viewPaths.SETTINGS}`\n )\n\n return\n }\n\n try {\n await authClient.organization.setActive({\n organizationId: organization.id,\n fetchOptions: {\n throw: true\n }\n })\n\n navigate(\n `${organizationOptions?.basePath}/${organizationOptions?.viewPaths?.SETTINGS}`\n )\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsManagingOrganization(false)\n }\n }, [\n authClient,\n organization.id,\n organizationOptions?.basePath,\n organizationOptions?.viewPaths?.SETTINGS,\n organization.slug,\n pathMode,\n navigate,\n toast,\n localization\n ])\n\n return (\n <>\n \n \n\n \n \n \n {isManagingOrganization ? (\n \n ) : (\n \n )}\n \n \n\n \n \n \n\n {localization.MANAGE_ORGANIZATION}\n \n\n setIsLeaveDialogOpen(true)}\n variant=\"destructive\"\n >\n \n\n {localization.LEAVE_ORGANIZATION}\n \n \n \n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-error-codes.json b/public/r/organization-error-codes.json new file mode 100644 index 00000000..160c1c39 --- /dev/null +++ b/public/r/organization-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-error-codes", + "type": "registry:file", + "title": "Organization Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/organization-error-codes.ts", + "content": "export const ORGANIZATION_ERROR_CODES = {\n YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION:\n \"You are not allowed to create a new organization\",\n YOU_HAVE_REACHED_THE_MAXIMUM_NUMBER_OF_ORGANIZATIONS:\n \"You have reached the maximum number of organizations\",\n ORGANIZATION_ALREADY_EXISTS: \"Organization already exists\",\n ORGANIZATION_NOT_FOUND: \"Organization not found\",\n USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION:\n \"User is not a member of the organization\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_ORGANIZATION:\n \"You are not allowed to update this organization\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_ORGANIZATION:\n \"You are not allowed to delete this organization\",\n NO_ACTIVE_ORGANIZATION: \"No active organization\",\n USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION:\n \"User is already a member of this organization\",\n MEMBER_NOT_FOUND: \"Member not found\",\n ROLE_NOT_FOUND: \"Role not found\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_TEAM:\n \"You are not allowed to create a new team\",\n TEAM_ALREADY_EXISTS: \"Team already exists\",\n TEAM_NOT_FOUND: \"Team not found\",\n YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER:\n \"You cannot leave the organization as the only owner\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER:\n \"You are not allowed to delete this member\",\n YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION:\n \"You are not allowed to invite users to this organization\",\n USER_IS_ALREADY_INVITED_TO_THIS_ORGANIZATION:\n \"User is already invited to this organization\",\n INVITATION_NOT_FOUND: \"Invitation not found\",\n YOU_ARE_NOT_THE_RECIPIENT_OF_THE_INVITATION:\n \"You are not the recipient of the invitation\",\n YOU_ARE_NOT_ALLOWED_TO_CANCEL_THIS_INVITATION:\n \"You are not allowed to cancel this invitation\",\n INVITER_IS_NO_LONGER_A_MEMBER_OF_THE_ORGANIZATION:\n \"Inviter is no longer a member of the organization\",\n YOU_ARE_NOT_ALLOWED_TO_INVITE_USER_WITH_THIS_ROLE:\n \"you are not allowed to invite user with this role\",\n FAILED_TO_RETRIEVE_INVITATION: \"Failed to retrieve invitation\",\n YOU_HAVE_REACHED_THE_MAXIMUM_NUMBER_OF_TEAMS:\n \"You have reached the maximum number of teams\",\n UNABLE_TO_REMOVE_LAST_TEAM: \"Unable to remove last team\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER:\n \"You are not allowed to update this member\",\n ORGANIZATION_MEMBERSHIP_LIMIT_REACHED:\n \"Organization membership limit reached\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_TEAMS_IN_THIS_ORGANIZATION:\n \"You are not allowed to create teams in this organization\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_TEAMS_IN_THIS_ORGANIZATION:\n \"You are not allowed to delete teams in this organization\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_TEAM:\n \"You are not allowed to update this team\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_TEAM:\n \"You are not allowed to delete this team\",\n INVITATION_LIMIT_REACHED: \"Invitation limit reached\"\n}\n", + "type": "registry:file", + "target": "localization/organization-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-invitations-card.json b/public/r/organization-invitations-card.json new file mode 100644 index 00000000..884465c0 --- /dev/null +++ b/public/r/organization-invitations-card.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-invitations-card", + "type": "registry:component", + "title": "Organization Invitations Card", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invitation-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-invitations-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { InvitationCell } from \"./invitation-cell\"\n\nexport function OrganizationInvitationsCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) return null\n\n return (\n \n )\n}\n\nfunction OrganizationInvitationsContent({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: SettingsCardProps & { organization: Organization }) {\n const {\n hooks: { useListInvitations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: invitations } = useListInvitations({\n query: { organizationId: organization.id }\n })\n\n const pendingInvitations = invitations?.filter(\n (invitation) => invitation.status === \"pending\"\n )\n if (!pendingInvitations?.length) return null\n\n return (\n \n \n {pendingInvitations.map((invitation) => (\n \n ))}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-logo-card.json b/public/r/organization-logo-card.json new file mode 100644 index 00000000..88ea3f9a --- /dev/null +++ b/public/r/organization-logo-card.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-logo-card", + "type": "registry:component", + "title": "Organization Logo Card", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport {\n type ComponentProps,\n useContext,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { SettingsCardFooter } from \"../settings/shared/settings-card-footer\"\nimport { SettingsCardHeader } from \"../settings/shared/settings-card-header\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { OrganizationLogo } from \"./organization-logo\"\n\nexport interface OrganizationLogoCardProps extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n slug?: string\n}\n\nexport function OrganizationLogoCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: OrganizationLogoCardProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n
\n \n\n \n \n \n
\n\n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationLogoForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationLogoCardProps & { organization: Organization }) {\n const {\n hooks: { useHasPermission },\n localization: authLocalization,\n organization: organizationOptions,\n mutators: { updateOrganization },\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...authLocalization, ...localizationProp }),\n [authLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const { data: hasPermission, isPending: permissionPending } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const isPending = permissionPending\n\n const fileInputRef = useRef(null)\n const [loading, setLoading] = useState(false)\n\n const handleLogoChange = async (file: File) => {\n if (!organizationOptions?.logo || !hasPermission?.success) return\n\n setLoading(true)\n\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n organizationOptions.logo.size,\n organizationOptions.logo.extension\n )\n\n let image: string | undefined | null\n\n if (organizationOptions.logo.upload) {\n image = await organizationOptions.logo.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (!image) {\n setLoading(false)\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { logo: image }\n })\n\n await refetchOrganization?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const handleDeleteLogo = async () => {\n if (!hasPermission?.success) return\n\n setLoading(true)\n\n try {\n if (organization.logo) {\n await organizationOptions?.logo?.delete?.(organization.logo)\n }\n\n await updateOrganization({\n organizationId: organization.id,\n data: { logo: \"\" }\n })\n\n await refetchOrganization?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const openFileDialog = () => {\n fileInputRef.current?.click()\n }\n\n return (\n \n {\n const file = e.target.files?.item(0)\n if (file) handleLogoChange(file)\n\n e.target.value = \"\"\n }}\n />\n\n
\n \n\n \n \n \n \n \n \n\n e.preventDefault()}\n >\n \n \n\n {localization.UPLOAD_LOGO}\n \n\n {organization.logo && (\n \n \n\n {localization.DELETE_LOGO}\n \n )}\n \n \n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-logo.json b/public/r/organization-logo.json new file mode 100644 index 00000000..c6fcc074 --- /dev/null +++ b/public/r/organization-logo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-logo", + "type": "registry:component", + "title": "Organization Logo", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-logo.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { BuildingIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationLogoClassNames {\n base?: string\n image?: string\n fallback?: string\n fallbackIcon?: string\n skeleton?: string\n}\n\nexport interface OrganizationLogoProps {\n classNames?: OrganizationLogoClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\" | null\n organization?: Partial | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays an organization logo with image and fallback support\n *\n * Renders an organization's logo image when available, with appropriate fallbacks:\n * - Shows a skeleton when isPending is true\n * - Falls back to a building icon when no logo is available\n */\nexport function OrganizationLogo({\n className,\n classNames,\n isPending,\n size,\n organization,\n localization: propLocalization,\n ...props\n}: OrganizationLogoProps & ComponentProps) {\n const { localization: contextLocalization, avatar } =\n useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n const name = organization?.name\n const src = organization?.logo\n\n if (isPending) {\n return (\n \n )\n }\n\n return (\n \n {avatar?.Image ? (\n \n ) : (\n \n )}\n\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-members-card.json b/public/r/organization-members-card.json new file mode 100644 index 00000000..2fa79988 --- /dev/null +++ b/public/r/organization-members-card.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-members-card", + "type": "registry:component", + "title": "Organization Members Card", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/invite-member-dialog.json", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-members-card.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { InviteMemberDialog } from \"./invite-member-dialog\"\nimport { MemberCell } from \"./member-cell\"\n\nexport function OrganizationMembersCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationMembersContent({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: SettingsCardProps & { organization: Organization }) {\n const {\n hooks: { useHasPermission, useListMembers },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: hasPermissionInvite, isPending: isPendingInvite } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n invitation: [\"create\"]\n }\n })\n\n const {\n data: hasPermissionUpdateMember,\n isPending: isPendingUpdateMember\n } = useHasPermission({\n organizationId: organization.id,\n permission: {\n member: [\"update\"]\n }\n })\n\n const isPending = isPendingInvite || isPendingUpdateMember\n\n const { data } = useListMembers({\n query: { organizationId: organization.id }\n })\n\n const members = data?.members\n\n const [inviteDialogOpen, setInviteDialogOpen] = useState(false)\n\n return (\n <>\n setInviteDialogOpen(true)}\n isPending={isPending}\n disabled={!hasPermissionInvite?.success}\n {...props}\n >\n {!isPending && members && members.length > 0 && (\n \n {members\n .sort(\n (a, b) =>\n new Date(a.createdAt).getTime() -\n new Date(b.createdAt).getTime()\n )\n .map((member) => (\n \n ))}\n \n )}\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-name-card.json b/public/r/organization-name-card.json new file mode 100644 index 00000000..bc112dcf --- /dev/null +++ b/public/r/organization-name-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-name-card", + "type": "registry:component", + "title": "Organization Name Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-name-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport {\n SettingsCard,\n type SettingsCardProps\n} from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { Form, FormControl, FormField, FormItem, FormMessage } from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationNameCardProps extends SettingsCardProps {\n slug?: string\n}\n\nexport function OrganizationNameCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: OrganizationNameCardProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationNameForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationNameCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission },\n mutators: { updateOrganization },\n optimistic,\n toast\n } = useContext(AuthUIContext)\n\n const localization = { ...contextLocalization, ...localizationProp }\n\n const { data: hasPermission, isPending: permissionPending } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const isPending = permissionPending\n\n const formSchema = z.object({\n name: z.string().min(1, {\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: { name: organization.name || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateOrganizationName = async ({\n name\n }: z.infer) => {\n if (organization.name === name) {\n toast({\n variant: \"error\",\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { name }\n })\n\n await refetchOrganization?.()\n\n toast({\n variant: \"success\",\n message: `${localization.ORGANIZATION_NAME} ${localization.UPDATED_SUCCESSFULLY}`\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-options.json b/public/r/organization-options.json new file mode 100644 index 00000000..5e1cc229 --- /dev/null +++ b/public/r/organization-options.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-options", + "type": "registry:file", + "title": "Organization Options", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/view-paths.json" + ], + "files": [ + { + "path": "src/types/organization-options.ts", + "content": "export type OrganizationLogoOptions = {\n /**\n * Upload a logo image and return the URL string\n * @remarks `(file: File) => Promise`\n */\n upload?: (file: File) => Promise\n /**\n * Delete a previously uploaded logo image from your storage/CDN\n * @remarks `(url: string) => Promise`\n */\n delete?: (url: string) => Promise\n /**\n * Logo size for resizing\n * @default 256 if upload is provided, 128 otherwise\n */\n size: number\n /**\n * File extension for logo uploads\n * @default \"png\"\n */\n extension: string\n}\n\nimport type { OrganizationViewPaths } from \"../lib/view-paths\"\n\nexport type OrganizationOptions = {\n /**\n * Logo configuration\n * @default undefined\n */\n logo?: boolean | Partial\n /**\n * Custom roles to add to the built-in roles (owner, admin, member)\n * @default []\n */\n customRoles?: Array<{ role: string; label: string }>\n /**\n * Enable or disable API key support for organizations\n * @default false\n */\n apiKey?: boolean\n /**\n * Base path for organization-scoped views (supports slugged or static base)\n * When using slug paths, set this to the common prefix (e.g. \"/organization\")\n */\n basePath?: string\n /**\n * Organization path mode\n * - \"default\": use active-organization based routes\n * - \"slug\": use slug-based URLs where slug becomes the first path segment\n * e.g. \"/[slug]/members\" (or `${basePath}/[slug]/members` if basePath provided)\n * @default \"default\"\n */\n pathMode?: \"default\" | \"slug\"\n /**\n * The current organization slug\n */\n slug?: string\n /**\n * The path to redirect to when Personal Account is selected\n */\n personalPath?: string\n /**\n * Customize organization view paths\n */\n viewPaths?: Partial\n}\n\nexport type OrganizationOptionsContext = {\n /**\n * Logo configuration\n * @default undefined\n */\n logo?: OrganizationLogoOptions\n /**\n * Custom roles to add to the built-in roles (owner, admin, member)\n * @default []\n */\n customRoles: Array<{ role: string; label: string }>\n /**\n * Enable or disable API key support for organizations\n * @default false\n */\n apiKey?: boolean\n /**\n * Base path for organization-scoped views\n */\n basePath: string\n /**\n * Organization path mode\n * @default \"default\"\n */\n pathMode?: \"default\" | \"slug\"\n /**\n * The current organization slug\n */\n slug?: string\n /**\n * The path to redirect to when Personal Account is selected\n */\n personalPath?: string\n /**\n * Customize organization view paths\n */\n viewPaths: OrganizationViewPaths\n}\n", + "type": "registry:file", + "target": "types/organization-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-refetcher.json b/public/r/organization-refetcher.json new file mode 100644 index 00000000..6abfa7e4 --- /dev/null +++ b/public/r/organization-refetcher.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-refetcher", + "type": "registry:lib", + "title": "Organization Refetcher", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-current-organization.json" + ], + "files": [ + { + "path": "src/lib/organization-refetcher.tsx", + "content": "import { useContext, useEffect } from \"react\"\nimport { useCurrentOrganization } from \"../hooks/use-current-organization\"\nimport { AuthUIContext } from \"./auth-ui-provider\"\n\nexport const OrganizationRefetcher = () => {\n const {\n hooks: { useListOrganizations, useSession },\n organization: organizationOptions,\n navigate,\n redirectTo\n } = useContext(AuthUIContext)\n\n const { slug, pathMode, personalPath } = organizationOptions || {}\n\n const { data: sessionData } = useSession()\n\n const {\n data: organization,\n isPending: organizationPending,\n isRefetching: organizationRefetching,\n refetch: refetchOrganization\n } = useCurrentOrganization()\n\n const { refetch: refetchListOrganizations } = useListOrganizations()\n\n const { data: organizations } = useListOrganizations()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Refetch fix\n useEffect(() => {\n if (!sessionData?.user.id) return\n\n if (organization || organizations) {\n refetchOrganization?.()\n refetchListOrganizations?.()\n }\n }, [sessionData?.user.id])\n\n useEffect(() => {\n if (organizationRefetching || organizationPending) return\n\n if (slug && pathMode === \"slug\" && !organization) {\n navigate(personalPath || redirectTo)\n }\n }, [\n organization,\n organizationRefetching,\n organizationPending,\n slug,\n pathMode,\n personalPath,\n navigate,\n redirectTo\n ])\n\n return null\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-settings-cards.json b/public/r/organization-settings-cards.json new file mode 100644 index 00000000..28373edd --- /dev/null +++ b/public/r/organization-settings-cards.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-settings-cards", + "type": "registry:component", + "title": "Organization Settings Cards", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/delete-organization-card.json", + "http://localhost:3000/r/organization-logo-card.json", + "http://localhost:3000/r/organization-name-card.json", + "http://localhost:3000/r/organization-slug-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-settings-cards.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { DeleteOrganizationCard } from \"./delete-organization-card\"\nimport { OrganizationLogoCard } from \"./organization-logo-card\"\nimport { OrganizationNameCard } from \"./organization-name-card\"\nimport { OrganizationSlugCard } from \"./organization-slug-card\"\n\nexport type OrganizationSettingsCardsProps = {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n slug?: string\n}\n\nexport function OrganizationSettingsCards({\n className,\n classNames,\n localization,\n slug\n}: OrganizationSettingsCardsProps) {\n const { organization: organizationOptions } = useContext(AuthUIContext)\n\n return (\n \n {organizationOptions?.logo && (\n \n )}\n\n \n\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-slug-card.json b/public/r/organization-slug-card.json new file mode 100644 index 00000000..9d5664c3 --- /dev/null +++ b/public/r/organization-slug-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-slug-card", + "type": "registry:component", + "title": "Organization Slug Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-slug-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport {\n SettingsCard,\n type SettingsCardProps\n} from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { Form, FormControl, FormField, FormItem, FormMessage } from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationSlugCardProps extends SettingsCardProps {\n slug?: string\n}\n\nexport function OrganizationSlugCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: OrganizationSlugCardProps) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationSlugForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationSlugCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission },\n mutators: { updateOrganization },\n optimistic,\n toast,\n organization: organizationOptions,\n replace\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const { data: hasPermission, isPending } = useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const formSchema = z.object({\n slug: z\n .string()\n .min(1, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_REQUIRED}`\n })\n .regex(/^[a-z0-9-]+$/, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_INVALID}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: { slug: organization.slug || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateOrganizationSlug = async ({\n slug\n }: z.infer) => {\n if (organization.slug === slug) {\n toast({\n variant: \"error\",\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { slug }\n })\n\n await refetchOrganization?.()\n\n toast({\n variant: \"success\",\n message: `${localization.ORGANIZATION_SLUG} ${localization.UPDATED_SUCCESSFULLY}`\n })\n\n // If using slug-based paths, redirect to the new slug's settings route\n if (organizationOptions?.pathMode === \"slug\") {\n const basePath = organizationOptions.basePath\n const settingsPath = organizationOptions.viewPaths.SETTINGS\n replace(`${basePath}/${slug}/${settingsPath}`)\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-switcher.json b/public/r/organization-switcher.json new file mode 100644 index 00000000..1de2c5b9 --- /dev/null +++ b/public/r/organization-switcher.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-switcher", + "type": "registry:component", + "title": "Organization Switcher", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/create-organization-dialog.json", + "dropdown-menu", + "http://localhost:3000/r/organization-cell-view.json", + "http://localhost:3000/r/organization-logo.json", + "http://localhost:3000/r/personal-account-view.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-switcher.tsx", + "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport {\n ChevronsUpDown,\n LogInIcon,\n PlusCircleIcon,\n SettingsIcon\n} from \"lucide-react\"\nimport {\n type ComponentProps,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { User } from \"../../types/auth-client\"\nimport { Button } from \"../ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { UserAvatar, type UserAvatarClassNames } from \"../user-avatar\"\nimport type { UserViewClassNames } from \"../user-view\"\nimport { CreateOrganizationDialog } from \"./create-organization-dialog\"\nimport {\n OrganizationCellView,\n type OrganizationViewClassNames\n} from \"./organization-cell-view\"\nimport { OrganizationLogo } from \"./organization-logo\"\nimport { PersonalAccountView } from \"./personal-account-view\"\n\nexport interface OrganizationSwitcherClassNames {\n base?: string\n skeleton?: string\n trigger?: {\n base?: string\n avatar?: UserAvatarClassNames\n user?: UserViewClassNames\n organization?: OrganizationViewClassNames\n skeleton?: string\n }\n content?: {\n base?: string\n user?: UserViewClassNames\n organization?: OrganizationViewClassNames\n avatar?: UserAvatarClassNames\n menuItem?: string\n separator?: string\n }\n}\n\nexport interface OrganizationSwitcherProps\n extends Omit, \"trigger\"> {\n classNames?: OrganizationSwitcherClassNames\n align?: \"center\" | \"start\" | \"end\"\n trigger?: ReactNode\n localization?: AuthLocalization\n slug?: string\n onSetActive?: (organization: Organization | null) => void\n /**\n * Hide the personal organization option from the switcher.\n * When true, users can only switch between organizations and cannot access their personal account.\n * If no organization is active, the first available organization will be automatically selected.\n * @default false\n */\n hidePersonal?: boolean\n}\n\n/**\n * Displays an interactive user button with dropdown menu functionality\n *\n * Renders a user interface element that can be displayed as either an icon or full button:\n * - Shows a user avatar or placeholder when in icon mode\n * - Displays user name and email with dropdown indicator in full mode\n * - Provides dropdown menu with authentication options (sign in/out, settings, etc.)\n * - Supports multi-session functionality for switching between accounts\n * - Can be customized with additional links and styling options\n */\nexport function OrganizationSwitcher({\n className,\n classNames,\n align,\n trigger,\n localization: localizationProp,\n slug: slugProp,\n size,\n onSetActive,\n hidePersonal,\n ...props\n}: OrganizationSwitcherProps) {\n const {\n authClient,\n basePath,\n hooks: { useSession, useListOrganizations },\n localization: contextLocalization,\n account: accountOptions,\n organization: organizationOptions,\n redirectTo,\n navigate,\n toast,\n viewPaths,\n Link\n } = useContext(AuthUIContext)\n\n const {\n pathMode,\n slug: contextSlug,\n personalPath\n } = organizationOptions || {}\n\n const slug = slugProp || contextSlug\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [activeOrganizationPending, setActiveOrganizationPending] =\n useState(false)\n const [isCreateOrgDialogOpen, setIsCreateOrgDialogOpen] = useState(false)\n const [dropdownOpen, setDropdownOpen] = useState(false)\n\n const { data: sessionData, isPending: sessionPending } = useSession()\n const user = sessionData?.user\n\n const { data: organizations, isPending: organizationsPending } =\n useListOrganizations()\n\n const {\n data: activeOrganization,\n isPending: organizationPending,\n isRefetching: organizationRefetching\n } = useCurrentOrganization({ slug })\n\n const isPending =\n organizationsPending ||\n sessionPending ||\n activeOrganizationPending ||\n organizationPending\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (organizationRefetching) return\n\n setActiveOrganizationPending(false)\n }, [activeOrganization, organizationRefetching])\n\n const switchOrganization = useCallback(\n async (organization: Organization | null) => {\n // Prevent switching to personal account when hidePersonal is true\n if (hidePersonal && organization === null) {\n return\n }\n\n if (pathMode === \"slug\") {\n if (organization) {\n navigate(\n `${organizationOptions?.basePath}/${organization.slug}`\n )\n } else {\n navigate(personalPath ?? redirectTo)\n }\n\n return\n }\n\n setActiveOrganizationPending(true)\n\n try {\n onSetActive?.(organization)\n\n await authClient.organization.setActive({\n organizationId: organization?.id || null,\n fetchOptions: {\n throw: true\n }\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setActiveOrganizationPending(false)\n }\n },\n [\n authClient,\n toast,\n localization,\n onSetActive,\n hidePersonal,\n pathMode,\n personalPath,\n organizationOptions?.basePath,\n redirectTo,\n navigate\n ]\n )\n\n // Auto-select first organization when hidePersonal is true\n useEffect(() => {\n if (\n hidePersonal &&\n !activeOrganization &&\n !activeOrganizationPending &&\n organizations &&\n organizations.length > 0 &&\n !sessionPending &&\n !organizationPending &&\n !slug\n ) {\n switchOrganization(organizations[0])\n }\n }, [\n hidePersonal,\n activeOrganization,\n activeOrganizationPending,\n organizations,\n sessionPending,\n organizationPending,\n switchOrganization,\n slug\n ])\n\n return (\n <>\n \n \n {trigger ||\n (size === \"icon\" ? (\n \n {isPending ||\n activeOrganization ||\n !sessionData ||\n (user as User)?.isAnonymous ||\n hidePersonal ? (\n \n ) : (\n \n )}\n \n ) : (\n \n {isPending ||\n activeOrganization ||\n !sessionData ||\n (user as User)?.isAnonymous ||\n hidePersonal ? (\n \n ) : (\n \n )}\n\n \n \n ))}\n \n\n e.preventDefault()}\n >\n \n {(user && !(user as User).isAnonymous) || isPending ? (\n <>\n {activeOrganizationPending ||\n activeOrganization ||\n hidePersonal ? (\n \n ) : (\n \n )}\n\n {!isPending && (\n \n \n setDropdownOpen(false)\n }\n >\n \n \n \n )}\n \n ) : (\n
\n {localization.ORGANIZATION}\n
\n )}\n \n\n \n\n {activeOrganization && !hidePersonal && (\n switchOrganization(null)}\n >\n \n \n )}\n\n {organizations?.map(\n (organization) =>\n organization.id !== activeOrganization?.id && (\n \n switchOrganization(organization)\n }\n >\n \n \n )\n )}\n\n {organizations &&\n organizations.length > 0 &&\n (!hidePersonal || organizations.length > 1) && (\n \n )}\n\n {!isPending &&\n sessionData &&\n !(user as User).isAnonymous ? (\n setIsCreateOrgDialogOpen(true)}\n >\n \n {localization.CREATE_ORGANIZATION}\n \n ) : (\n \n \n \n {localization.SIGN_IN}\n \n \n )}\n \n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organization-view.json b/public/r/organization-view.json new file mode 100644 index 00000000..c908138e --- /dev/null +++ b/public/r/organization-view.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organization-view", + "type": "registry:component", + "title": "Organization View", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/account-view.json", + "http://localhost:3000/r/api-keys-card.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "drawer", + "label", + "http://localhost:3000/r/organization-invitations-card.json", + "http://localhost:3000/r/organization-members-card.json", + "http://localhost:3000/r/organization-settings-cards.json", + "http://localhost:3000/r/use-current-organization.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organization-view.tsx", + "content": "\"use client\"\n\nimport { MenuIcon } from \"lucide-react\"\nimport { useContext, useEffect, useMemo } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { OrganizationViewPath } from \"../../server\"\nimport type { AccountViewProps } from \"../account/account-view\"\nimport { ApiKeysCard } from \"../settings/api-key/api-keys-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger\n} from \"../ui/drawer\"\nimport { Label } from \"../ui/label\"\nimport { OrganizationInvitationsCard } from \"./organization-invitations-card\"\nimport { OrganizationMembersCard } from \"./organization-members-card\"\nimport { OrganizationSettingsCards } from \"./organization-settings-cards\"\n\nexport type OrganizationViewPageProps = Omit & {\n slug?: string\n view?: OrganizationViewPath\n}\n\nexport function OrganizationView({\n className,\n classNames,\n localization: localizationProp,\n pathname,\n view: viewProp,\n hideNav,\n slug: slugProp\n}: OrganizationViewPageProps) {\n const {\n organization: organizationOptions,\n localization: contextLocalization,\n account: accountOptions,\n Link,\n replace\n } = useContext(AuthUIContext)\n\n const { slug: contextSlug, viewPaths, apiKey } = organizationOptions || {}\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const view = viewProp || getViewByPath(viewPaths!, pathname) || \"SETTINGS\"\n\n const slug = slugProp || contextSlug\n\n const {\n data: organization,\n isPending: organizationPending,\n isRefetching: organizationRefetching\n } = useCurrentOrganization({ slug })\n\n const navItems: {\n view: OrganizationViewPath\n label: string\n }[] = [\n { view: \"SETTINGS\", label: localization.SETTINGS },\n { view: \"MEMBERS\", label: localization.MEMBERS }\n ]\n\n if (apiKey) {\n navItems.push({\n view: \"API_KEYS\",\n label: localization.API_KEYS\n })\n }\n\n useEffect(() => {\n if (organization || organizationPending || organizationRefetching)\n return\n\n replace(\n `${accountOptions?.basePath}/${accountOptions?.viewPaths?.ORGANIZATIONS}`\n )\n }, [\n organization,\n organizationPending,\n organizationRefetching,\n accountOptions?.basePath,\n accountOptions?.viewPaths?.ORGANIZATIONS,\n replace\n ])\n\n return (\n \n {!hideNav && (\n
\n \n\n \n \n \n \n\n \n \n \n {localization.ORGANIZATION}\n \n \n
\n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n
\n
\n
\n )}\n\n {!hideNav && (\n
\n \n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n \n )}\n\n {view === \"MEMBERS\" && (\n \n \n\n \n \n )}\n\n {view === \"API_KEYS\" && (\n \n )}\n\n {view === \"SETTINGS\" && (\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/organizations-card.json b/public/r/organizations-card.json new file mode 100644 index 00000000..b5e70067 --- /dev/null +++ b/public/r/organizations-card.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "organizations-card", + "type": "registry:component", + "title": "Organizations Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/create-organization-dialog.json", + "http://localhost:3000/r/organization-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/organizations-card.tsx", + "content": "\"use client\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../settings/skeletons/settings-cell-skeleton\"\nimport { CardContent } from \"../ui/card\"\nimport { CreateOrganizationDialog } from \"./create-organization-dialog\"\nimport { OrganizationCell } from \"./organization-cell\"\n\nexport function OrganizationsCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useListOrganizations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = useMemo(\n () => ({ ...contextLocalization, ...localization }),\n [contextLocalization, localization]\n )\n\n const isHydrated = useIsHydrated()\n const { data: organizations, isPending: organizationsPending } =\n useListOrganizations()\n\n const isPending = !isHydrated || organizationsPending\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false)\n\n return (\n <>\n setCreateDialogOpen(true)}\n isPending={isPending}\n {...props}\n >\n \n {isPending && }\n {organizations?.map((organization) => (\n \n ))}\n \n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/otp-input-group.json b/public/r/otp-input-group.json new file mode 100644 index 00000000..3ea726ae --- /dev/null +++ b/public/r/otp-input-group.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "otp-input-group", + "type": "registry:component", + "title": "Otp Input Group", + "description": "", + "dependencies": [], + "registryDependencies": [ + "input-otp" + ], + "files": [ + { + "path": "src/components/auth/otp-input-group.tsx", + "content": "\"use client\"\n\nimport { InputOTPGroup, InputOTPSeparator, InputOTPSlot } from \"../ui/input-otp\"\n\nexport function OTPInputGroup({\n otpSeparators = 0\n}: {\n otpSeparators?: 0 | 1 | 2\n}) {\n if (otpSeparators === 0) {\n return (\n \n \n \n \n \n \n \n \n )\n }\n\n if (otpSeparators === 1) {\n return (\n <>\n \n \n \n \n \n\n \n\n \n \n \n \n \n \n )\n }\n\n return (\n <>\n \n \n \n \n\n \n\n \n \n \n \n\n \n\n \n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/passkey-button.json b/public/r/passkey-button.json new file mode 100644 index 00000000..c63f76f6 --- /dev/null +++ b/public/r/passkey-button.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkey-button", + "type": "registry:component", + "title": "Passkey Button", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/passkey-button.tsx", + "content": "import { FingerprintIcon } from \"lucide-react\"\nimport { useContext } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport type { AuthViewClassNames } from \"./auth-view\"\n\ninterface PasskeyButtonProps {\n classNames?: AuthViewClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (isSubmitting: boolean) => void\n}\n\nexport function PasskeyButton({\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting\n}: PasskeyButtonProps) {\n const {\n authClient,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess } = useOnSuccessTransition({ redirectTo })\n\n const signInPassKey = async () => {\n setIsSubmitting?.(true)\n\n try {\n const response = await authClient.signIn.passkey({\n fetchOptions: { throw: true }\n })\n\n if (response?.error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({\n error: response.error,\n localization\n })\n })\n\n setIsSubmitting?.(false)\n } else {\n onSuccess()\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsSubmitting?.(false)\n }\n }\n\n return (\n \n \n {localization.SIGN_IN_WITH} {localization.PASSKEY}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/passkey-cell.json b/public/r/passkey-cell.json new file mode 100644 index 00000000..6d9d507b --- /dev/null +++ b/public/r/passkey-cell.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkey-cell", + "type": "registry:component", + "title": "Passkey Cell", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkey-cell.tsx", + "content": "\"use client\"\n\nimport { FingerprintIcon, Loader2 } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport { SessionFreshnessDialog } from \"../shared/session-freshness-dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface PasskeyCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n passkey: { id: string; createdAt: Date }\n}\n\nexport function PasskeyCell({\n className,\n classNames,\n localization,\n passkey\n}: PasskeyCellProps) {\n const {\n freshAge,\n hooks: { useSession, useListPasskeys },\n localization: contextLocalization,\n mutators: { deletePasskey },\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { refetch } = useListPasskeys()\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n\n const [showFreshnessDialog, setShowFreshnessDialog] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleDeletePasskey = async () => {\n // If session isn't fresh, show the freshness dialog\n if (!isFresh) {\n setShowFreshnessDialog(true)\n return\n }\n\n setIsLoading(true)\n\n try {\n await deletePasskey({ id: passkey.id })\n refetch?.()\n } catch (error) {\n setIsLoading(false)\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n <>\n \n\n \n
\n \n \n {new Date(passkey.createdAt).toLocaleString()}\n \n
\n\n \n {isLoading && }\n\n {localization.DELETE}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/passkey-error-codes.json b/public/r/passkey-error-codes.json new file mode 100644 index 00000000..318fed19 --- /dev/null +++ b/public/r/passkey-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkey-error-codes", + "type": "registry:file", + "title": "Passkey Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/passkey-error-codes.ts", + "content": "export const PASSKEY_ERROR_CODES = {\n CHALLENGE_NOT_FOUND: \"Challenge not found\",\n YOU_ARE_NOT_ALLOWED_TO_REGISTER_THIS_PASSKEY:\n \"You are not allowed to register this passkey\",\n FAILED_TO_VERIFY_REGISTRATION: \"Failed to verify registration\",\n PASSKEY_NOT_FOUND: \"Passkey not found\",\n AUTHENTICATION_FAILED: \"Authentication failed\",\n UNABLE_TO_CREATE_SESSION: \"Unable to create session\",\n FAILED_TO_UPDATE_PASSKEY: \"Failed to update passkey\"\n}\n", + "type": "registry:file", + "target": "localization/passkey-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/passkeys-card.json b/public/r/passkeys-card.json new file mode 100644 index 00000000..2f40c110 --- /dev/null +++ b/public/r/passkeys-card.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "passkeys-card", + "type": "registry:component", + "title": "Passkeys Card", + "description": "", + "dependencies": [ + "react-hook-form" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "form", + "http://localhost:3000/r/passkey-cell.json", + "http://localhost:3000/r/session-freshness-dialog.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/passkey/passkeys-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport { Form } from \"../../ui/form\"\nimport { SessionFreshnessDialog } from \"../shared/session-freshness-dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { PasskeyCell } from \"./passkey-cell\"\n\nexport interface PasskeysCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function PasskeysCard({\n className,\n classNames,\n localization\n}: PasskeysCardProps) {\n const {\n authClient,\n freshAge,\n hooks: { useListPasskeys, useSession },\n localization: authLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...authLocalization, ...localization }\n\n const { data: passkeys, isPending, refetch } = useListPasskeys()\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n\n const [showFreshnessDialog, setShowFreshnessDialog] = useState(false)\n\n const addPasskey = async () => {\n // If session isn't fresh, show the freshness dialog\n if (!isFresh) {\n setShowFreshnessDialog(true)\n return\n }\n\n try {\n await authClient.passkey.addPasskey({\n fetchOptions: { throw: true }\n })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const form = useForm()\n\n return (\n <>\n \n\n
\n \n \n {passkeys && passkeys.length > 0 && (\n \n {passkeys?.map((passkey) => (\n \n ))}\n \n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/password-input.json b/public/r/password-input.json new file mode 100644 index 00000000..49878dc0 --- /dev/null +++ b/public/r/password-input.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "password-input", + "type": "registry:component", + "title": "Password Input", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "button", + "input", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/password-input.tsx", + "content": "\"use client\"\n\nimport { EyeIcon, EyeOffIcon } from \"lucide-react\"\nimport { type ComponentProps, useState } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\n\nexport function PasswordInput({\n className,\n enableToggle,\n onChange,\n ...props\n}: ComponentProps & { enableToggle?: boolean }) {\n const [disabled, setDisabled] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n return (\n
\n {\n setDisabled(!event.target.value)\n onChange?.(event)\n }}\n />\n\n {enableToggle && (\n <>\n setIsVisible(!isVisible)}\n >\n {isVisible ? : }\n \n\n \n \n )}\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/password-validation.json b/public/r/password-validation.json new file mode 100644 index 00000000..636bea10 --- /dev/null +++ b/public/r/password-validation.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "password-validation", + "type": "registry:file", + "title": "Password Validation", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/password-validation.ts", + "content": "export type PasswordValidation = {\n /**\n * Maximum password length\n */\n maxLength?: number\n\n /**\n * Minimum password length\n */\n minLength?: number\n\n /**\n * Password validation regex\n */\n regex?: RegExp\n}\n", + "type": "registry:file", + "target": "types/password-validation.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/personal-account-view.json b/public/r/personal-account-view.json new file mode 100644 index 00000000..383f1e53 --- /dev/null +++ b/public/r/personal-account-view.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "personal-account-view", + "type": "registry:component", + "title": "Personal Account View", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/personal-account-view.tsx", + "content": "\"use client\"\n\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { UserAvatar } from \"../user-avatar\"\nimport type { UserViewProps } from \"../user-view\"\n\n/**\n * Displays user information with avatar and details in a compact view for personal accounts\n *\n * Renders a user's profile information with appropriate fallbacks:\n * - Shows avatar alongside user name and \"Personal Account\" subtitle when available\n * - Shows loading skeletons when isPending is true\n * - Falls back to generic \"User\" text when neither name nor email is available\n * - Always shows \"Personal Account\" as subtitle for default and lg sizes\n * - Supports customization through classNames prop\n */\nexport function PersonalAccountView({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization\n}: UserViewProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n return (\n \n \n\n \n {isPending ? (\n <>\n \n\n {size !== \"sm\" && (\n \n )}\n \n ) : (\n <>\n \n {user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email ||\n localization?.USER}\n \n\n {size !== \"sm\" && (\n \n {localization?.PERSONAL_ACCOUNT}\n \n )}\n \n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/phone-number-error-codes.json b/public/r/phone-number-error-codes.json new file mode 100644 index 00000000..3dce253e --- /dev/null +++ b/public/r/phone-number-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "phone-number-error-codes", + "type": "registry:file", + "title": "Phone Number Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/phone-number-error-codes.ts", + "content": "export const PHONE_NUMBER_ERROR_CODES = {\n INVALID_PHONE_NUMBER: \"Invalid phone number\",\n PHONE_NUMBER_EXIST: \"Phone number already exists\",\n INVALID_PHONE_NUMBER_OR_PASSWORD: \"Invalid phone number or password\",\n UNEXPECTED_ERROR: \"Unexpected error\",\n OTP_NOT_FOUND: \"OTP not found\",\n OTP_EXPIRED: \"OTP expired\",\n INVALID_OTP: \"Invalid OTP\",\n PHONE_NUMBER_NOT_VERIFIED: \"Phone number not verified\"\n}\n", + "type": "registry:file", + "target": "localization/phone-number-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/profile.json b/public/r/profile.json new file mode 100644 index 00000000..47c7828c --- /dev/null +++ b/public/r/profile.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "profile", + "type": "registry:file", + "title": "Profile", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/profile.ts", + "content": "export type Profile = {\n id?: string | number\n email?: string | null\n name?: string | null\n displayUsername?: string | null\n username?: string | null\n displayName?: string | null\n firstName?: string | null\n fullName?: string | null\n isAnonymous?: boolean | null\n emailVerified?: boolean | null\n image?: string | null\n avatar?: string | null\n avatarUrl?: string | null\n}\n", + "type": "registry:file", + "target": "types/profile.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/provider-button.json b/public/r/provider-button.json new file mode 100644 index 00000000..0de4abc1 --- /dev/null +++ b/public/r/provider-button.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "provider-button", + "type": "registry:component", + "title": "Provider Button", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/auth-view.json", + "button", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/provider-button.tsx", + "content": "import type { SocialProvider } from \"better-auth/social-providers\"\nimport { useCallback, useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { Provider } from \"../../lib/social-providers\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport type { AuthViewClassNames } from \"./auth-view\"\n\ninterface ProviderButtonProps {\n className?: string\n classNames?: AuthViewClassNames\n callbackURL?: string\n isSubmitting: boolean\n localization: Partial\n other?: boolean\n provider: Provider\n redirectTo?: string\n socialLayout: \"auto\" | \"horizontal\" | \"grid\" | \"vertical\"\n setIsSubmitting: (isSubmitting: boolean) => void\n}\n\nexport function ProviderButton({\n className,\n classNames,\n callbackURL: callbackURLProp,\n isSubmitting,\n localization,\n other,\n provider,\n redirectTo: redirectToProp,\n socialLayout,\n setIsSubmitting\n}: ProviderButtonProps) {\n const {\n authClient,\n basePath,\n baseURL,\n persistClient,\n redirectTo: contextRedirectTo,\n viewPaths,\n social,\n genericOAuth,\n toast\n } = useContext(AuthUIContext)\n\n const getRedirectTo = useCallback(\n () =>\n redirectToProp || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectToProp, contextRedirectTo]\n )\n\n const getCallbackURL = useCallback(\n () =>\n `${baseURL}${\n callbackURLProp ||\n (persistClient\n ? `${basePath}/${viewPaths.CALLBACK}?redirectTo=${getRedirectTo()}`\n : getRedirectTo())\n }`,\n [\n callbackURLProp,\n persistClient,\n basePath,\n viewPaths,\n baseURL,\n getRedirectTo\n ]\n )\n\n const doSignInSocial = async () => {\n setIsSubmitting(true)\n\n try {\n if (other) {\n const oauth2Params = {\n providerId: provider.provider,\n callbackURL: getCallbackURL(),\n fetchOptions: { throw: true }\n }\n\n if (genericOAuth?.signIn) {\n await genericOAuth.signIn(oauth2Params)\n\n setTimeout(() => {\n setIsSubmitting(false)\n }, 10000)\n } else {\n await authClient.signIn.oauth2(oauth2Params)\n }\n } else {\n const socialParams = {\n provider: provider.provider as SocialProvider,\n callbackURL: getCallbackURL(),\n fetchOptions: { throw: true }\n }\n\n if (social?.signIn) {\n await social.signIn(socialParams)\n\n setTimeout(() => {\n setIsSubmitting(false)\n }, 10000)\n } else {\n await authClient.signIn.social(socialParams)\n }\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsSubmitting(false)\n }\n }\n\n return (\n \n {provider.icon && (\n \n )}\n\n {socialLayout === \"grid\" && provider.name}\n {socialLayout === \"vertical\" &&\n `${localization.SIGN_IN_WITH} ${provider.name}`}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/provider-cell.json b/public/r/provider-cell.json new file mode 100644 index 00000000..9aa164d1 --- /dev/null +++ b/public/r/provider-cell.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "provider-cell", + "type": "registry:component", + "title": "Provider Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/provider-cell.tsx", + "content": "\"use client\"\n\nimport type { SocialProvider } from \"better-auth/social-providers\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { Provider } from \"../../../lib/social-providers\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface ProviderCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n account?: {\n accountId: string\n provider: string\n } | null\n isPending?: boolean\n localization?: Partial\n other?: boolean\n provider: Provider\n refetch?: Refetch\n}\n\nexport function ProviderCell({\n className,\n classNames,\n account,\n localization,\n other,\n provider,\n refetch\n}: ProviderCellProps) {\n const {\n authClient,\n basePath,\n baseURL,\n localization: contextLocalization,\n mutators: { unlinkAccount },\n viewPaths,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const [isLoading, setIsLoading] = useState(false)\n\n const handleLink = async () => {\n setIsLoading(true)\n const callbackURL = `${baseURL}${basePath}/${viewPaths.CALLBACK}?redirectTo=${window.location.pathname}`\n\n try {\n if (other) {\n await authClient.oauth2.link({\n providerId: provider.provider as SocialProvider,\n callbackURL,\n fetchOptions: { throw: true }\n })\n } else {\n await authClient.linkSocial({\n provider: provider.provider as SocialProvider,\n callbackURL,\n fetchOptions: { throw: true }\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsLoading(false)\n }\n }\n\n const handleUnlink = async () => {\n setIsLoading(true)\n\n try {\n await unlinkAccount({\n accountId: account?.accountId,\n providerId: provider.provider\n })\n\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n return (\n \n {provider.icon && (\n \n )}\n\n
\n
{provider.name}
\n\n {account && }\n
\n\n \n {isLoading && }\n {account ? localization.UNLINK : localization.LINK}\n \n \n )\n}\n\nfunction AccountInfo({ account }: { account: { accountId: string } }) {\n const {\n hooks: { useAccountInfo }\n } = useContext(AuthUIContext)\n\n const { data: accountInfo, isPending } = useAccountInfo({\n accountId: account.accountId\n })\n\n if (isPending) {\n return \n }\n\n if (!accountInfo) return null\n\n return (\n
\n {accountInfo?.user.email}\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/provider-icons.json b/public/r/provider-icons.json new file mode 100644 index 00000000..09ee8c6b --- /dev/null +++ b/public/r/provider-icons.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "provider-icons", + "type": "registry:component", + "title": "Provider Icons", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/components/provider-icons.tsx", + "content": "import type { ComponentType } from \"react\"\n\nexport interface ProviderIconProps {\n className?: string\n}\n\nexport type ProviderIcon = ComponentType\n\nexport const AppleIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const DiscordIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const DropboxIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const FacebookIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n \n)\n\nexport const GitHubIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const GitLabIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n \n \n \n \n \n)\n\nexport const GoogleIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n\n \n\n \n \n)\n\nexport const HuggingFaceIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const KickIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const LinearIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const LinkedInIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n)\n\nexport const MicrosoftIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n \n \n)\n\nexport const NotionIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const RedditIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n \n)\n\nexport const RobloxIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const SlackIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const SpotifyIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const TikTokIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n\n \n \n)\n\nexport const TwitchIcon: ProviderIcon = ({ className }) => (\n \n \n\n Asset 2\n\n \n \n\n \n \n \n\n \n \n \n \n \n \n)\n\nexport const VKIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const XIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const ZoomIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/providers-card.json b/public/r/providers-card.json new file mode 100644 index 00000000..03c26378 --- /dev/null +++ b/public/r/providers-card.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "providers-card", + "type": "registry:component", + "title": "Providers Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/provider-cell.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/social-providers.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/providers/providers-card.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { socialProviders } from \"../../../lib/social-providers\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../skeletons/settings-cell-skeleton\"\nimport { ProviderCell } from \"./provider-cell\"\n\nexport interface ProvidersCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { accountId: string; provider: string }[] | null\n isPending?: boolean\n localization?: Partial\n skipHook?: boolean\n refetch?: Refetch\n}\n\nexport function ProvidersCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook,\n refetch\n}: ProvidersCardProps) {\n const {\n hooks: { useListAccounts },\n localization: contextLocalization,\n social,\n genericOAuth\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n refetch = result.refetch\n }\n\n return (\n \n \n {isPending ? (\n social?.providers?.map((provider) => (\n \n ))\n ) : (\n <>\n {social?.providers?.map((provider) => {\n const socialProvider = socialProviders.find(\n (socialProvider) =>\n socialProvider.provider === provider\n )\n\n if (!socialProvider) return null\n\n return (\n acc.provider === provider\n )}\n provider={socialProvider}\n refetch={refetch}\n />\n )\n })}\n\n {genericOAuth?.providers?.map((provider) => (\n acc.provider === provider.provider\n )}\n provider={provider}\n refetch={refetch}\n other\n />\n ))}\n \n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/recaptcha-badge.json b/public/r/recaptcha-badge.json new file mode 100644 index 00000000..309f8bf8 --- /dev/null +++ b/public/r/recaptcha-badge.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recaptcha-badge", + "type": "registry:component", + "title": "Recaptcha Badge", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-badge.tsx", + "content": "import { useContext } from \"react\"\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\n\nexport interface RecaptchaBadgeProps {\n className?: string\n localization?: Partial\n}\n\nexport function RecaptchaBadge({\n className,\n localization: propLocalization\n}: RecaptchaBadgeProps) {\n const isHydrated = useIsHydrated()\n const { captcha, localization: contextLocalization } =\n useContext(AuthUIContext)\n const localization = { ...contextLocalization, ...propLocalization }\n\n if (!captcha) return null\n\n if (!captcha.hideBadge) {\n return isHydrated ? (\n \n ) : null\n }\n\n return (\n <>\n \n\n

\n {localization.PROTECTED_BY_RECAPTCHA}{\" \"}\n {localization.BY_CONTINUING_YOU_AGREE} Google{\" \"}\n \n {localization.PRIVACY_POLICY}\n {\" \"}\n &{\" \"}\n \n {localization.TERMS_OF_SERVICE}\n \n .\n

\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/recaptcha-v2.json b/public/r/recaptcha-v2.json new file mode 100644 index 00000000..cce6faa7 --- /dev/null +++ b/public/r/recaptcha-v2.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recaptcha-v2", + "type": "registry:component", + "title": "Recaptcha V2", + "description": "", + "dependencies": [ + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v2.tsx", + "content": "import { type RefObject, useContext, useEffect } from \"react\"\nimport ReCAPTCHA from \"react-google-recaptcha\"\nimport { useLang } from \"../../hooks/use-lang\"\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\n\nexport function RecaptchaV2({ ref }: { ref: RefObject }) {\n const { captcha } = useContext(AuthUIContext)\n const { theme } = useTheme()\n const { lang } = useLang()\n\n useEffect(() => {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n ;(window as any).recaptchaOptions = {\n useRecaptchaNet: captcha?.recaptchaNet,\n enterprise: captcha?.enterprise\n }\n }, [captcha])\n\n if (!captcha) return null\n\n return (\n <>\n \n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/recaptcha-v3.json b/public/r/recaptcha-v3.json new file mode 100644 index 00000000..d8829c4c --- /dev/null +++ b/public/r/recaptcha-v3.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recaptcha-v3", + "type": "registry:component", + "title": "Recaptcha V3", + "description": "", + "dependencies": [ + "@wojtekmaj/react-recaptcha-v3" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-lang.json", + "http://localhost:3000/r/use-theme.json" + ], + "files": [ + { + "path": "src/components/captcha/recaptcha-v3.tsx", + "content": "import {\n GoogleReCaptchaProvider,\n useGoogleReCaptcha\n} from \"@wojtekmaj/react-recaptcha-v3\"\nimport { type ReactNode, useContext, useEffect } from \"react\"\n\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { useLang } from \"../../hooks/use-lang\"\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function RecaptchaV3({ children }: { children: ReactNode }) {\n const isHydrated = useIsHydrated()\n const { captcha } = useContext(AuthUIContext)\n\n if (captcha?.provider !== \"google-recaptcha-v3\") return children\n\n return (\n \n {isHydrated && (\n \n )}\n\n \n\n {children}\n \n )\n}\n\nfunction RecaptchaV3Style() {\n const { executeRecaptcha } = useGoogleReCaptcha()\n const { theme } = useTheme()\n const { lang } = useLang()\n\n useEffect(() => {\n if (!executeRecaptcha) return\n\n const updateRecaptcha = async () => {\n // find iframe with title \"reCAPTCHA\"\n const iframe = document.querySelector(\n \"iframe[title='reCAPTCHA']\"\n ) as HTMLIFrameElement\n if (iframe) {\n const iframeSrcUrl = new URL(iframe.src)\n iframeSrcUrl.searchParams.set(\"theme\", theme)\n if (lang) iframeSrcUrl.searchParams.set(\"hl\", lang)\n iframe.src = iframeSrcUrl.toString()\n }\n }\n\n updateRecaptcha()\n }, [executeRecaptcha, theme, lang])\n\n return null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/recover-account-form.json b/public/r/recover-account-form.json new file mode 100644 index 00000000..81235d33 --- /dev/null +++ b/public/r/recover-account-form.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "recover-account-form", + "type": "registry:component", + "title": "Recover Account Form", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "input", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/recover-account-form.tsx", + "content": "\"use client\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface RecoverAccountFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n}\n\nexport function RecoverAccountForm({\n className,\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting\n}: RecoverAccountFormProps) {\n const {\n authClient,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const formSchema = z.object({\n code: z.string().min(1, { message: localization.BACKUP_CODE_REQUIRED })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n code: \"\"\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n async function verifyBackupCode({ code }: z.infer) {\n try {\n await authClient.twoFactor.verifyBackupCode({\n code,\n fetchOptions: { throw: true }\n })\n\n await onSuccess()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n (\n \n \n {localization.BACKUP_CODE}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n {isSubmitting ? (\n \n ) : (\n localization.RECOVER_ACCOUNT_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/redirect-to-sign-in.json b/public/r/redirect-to-sign-in.json new file mode 100644 index 00000000..8a17c12d --- /dev/null +++ b/public/r/redirect-to-sign-in.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "redirect-to-sign-in", + "type": "registry:component", + "title": "Redirect To Sign In", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], + "files": [ + { + "path": "src/components/redirect-to-sign-in.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { useAuthenticate } from \"../hooks/use-authenticate\"\n\n/**\n * Redirects the user to the sign-in page\n *\n * Renders nothing and automatically redirects the current user to the authentication\n * sign-in page. Useful for protecting routes that require authentication or\n * redirecting users to sign in from various parts of the application.\n */\nexport function RedirectToSignIn(): ReactNode {\n useAuthenticate({ authView: \"SIGN_IN\" })\n return null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/redirect-to-sign-up.json b/public/r/redirect-to-sign-up.json new file mode 100644 index 00000000..57856f9f --- /dev/null +++ b/public/r/redirect-to-sign-up.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "redirect-to-sign-up", + "type": "registry:component", + "title": "Redirect To Sign Up", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/use-authenticate.json" + ], + "files": [ + { + "path": "src/components/redirect-to-sign-up.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { useAuthenticate } from \"../hooks/use-authenticate\"\n\n/**\n * Redirects the user to the sign-up page\n *\n * Renders nothing and automatically redirects the current user to the authentication\n * sign-up page. Useful for directing new users to create an account or\n * for redirecting from marketing pages to the registration flow.\n */\nexport function RedirectToSignUp(): ReactNode {\n useAuthenticate({ authView: \"SIGN_UP\" })\n return null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/refetch.json b/public/r/refetch.json new file mode 100644 index 00000000..97c80c1f --- /dev/null +++ b/public/r/refetch.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "refetch", + "type": "registry:file", + "title": "Refetch", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/refetch.ts", + "content": "export type Refetch = () => Promise | unknown\n", + "type": "registry:file", + "target": "types/refetch.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/remove-member-dialog.json b/public/r/remove-member-dialog.json new file mode 100644 index 00000000..f5ea009f --- /dev/null +++ b/public/r/remove-member-dialog.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "remove-member-dialog", + "type": "registry:component", + "title": "Remove Member Dialog", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/remove-member-dialog.tsx", + "content": "\"use client\"\n\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport { MemberCell } from \"./member-cell\"\n\nexport interface RemoveMemberDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n member: Member & { user?: Partial | null }\n}\n\nexport function RemoveMemberDialog({\n member,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: RemoveMemberDialogProps) {\n const {\n authClient,\n hooks: { useListMembers },\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch } = useListMembers({\n query: { organizationId: member.organizationId }\n })\n\n const [isRemoving, setIsRemoving] = useState(false)\n\n const removeMember = async () => {\n setIsRemoving(true)\n\n try {\n await authClient.organization.removeMember({\n memberIdOrEmail: member.id,\n organizationId: member.organizationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.REMOVE_MEMBER_SUCCESS\n })\n\n await refetch?.()\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsRemoving(false)\n }\n\n return (\n \n e.preventDefault()}\n >\n \n \n {localization.REMOVE_MEMBER}\n \n\n \n {localization.REMOVE_MEMBER_CONFIRM}\n \n \n\n \n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isRemoving}\n >\n {localization.CANCEL}\n \n\n \n {isRemoving && }\n\n {localization.REMOVE_MEMBER}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/render-toast.json b/public/r/render-toast.json new file mode 100644 index 00000000..2076238c --- /dev/null +++ b/public/r/render-toast.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "render-toast", + "type": "registry:file", + "title": "Render Toast", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/render-toast.ts", + "content": "type ToastVariant = \"default\" | \"success\" | \"error\" | \"info\" | \"warning\"\n\nexport type RenderToast = ({\n variant,\n message\n}: {\n variant?: ToastVariant\n message?: string\n}) => void\n", + "type": "registry:file", + "target": "types/render-toast.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/reset-password-form.json b/public/r/reset-password-form.json new file mode 100644 index 00000000..a8a6b24a --- /dev/null +++ b/public/r/reset-password-form.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "reset-password-form", + "type": "registry:component", + "title": "Reset Password Form", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/reset-password-form.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getPasswordSchema } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface ResetPasswordFormProps {\n className?: string\n classNames?: AuthFormClassNames\n localization: Partial\n passwordValidation?: PasswordValidation\n}\n\nexport function ResetPasswordForm({\n className,\n classNames,\n localization,\n passwordValidation\n}: ResetPasswordFormProps) {\n const tokenChecked = useRef(false)\n\n const {\n authClient,\n basePath,\n credentials,\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const formSchema = z\n .object({\n newPassword: getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.NEW_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n }),\n confirmPassword: confirmPasswordEnabled\n ? getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n : z.string().optional()\n })\n .refine(\n (data) =>\n !confirmPasswordEnabled ||\n data.newPassword === data.confirmPassword,\n {\n message: localization.PASSWORDS_DO_NOT_MATCH,\n path: [\"confirmPassword\"]\n }\n )\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n newPassword: \"\",\n confirmPassword: \"\"\n }\n })\n\n const isSubmitting = form.formState.isSubmitting\n\n useEffect(() => {\n if (tokenChecked.current) return\n tokenChecked.current = true\n\n const searchParams = new URLSearchParams(window.location.search)\n const token = searchParams.get(\"token\")\n\n if (!token || token === \"INVALID_TOKEN\") {\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n toast({ variant: \"error\", message: localization.INVALID_TOKEN })\n }\n }, [basePath, navigate, toast, viewPaths, localization])\n\n async function resetPassword({ newPassword }: z.infer) {\n try {\n const searchParams = new URLSearchParams(window.location.search)\n const token = searchParams.get(\"token\") as string\n\n await authClient.resetPassword({\n newPassword,\n token,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.RESET_PASSWORD_SUCCESS\n })\n\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n (\n \n \n {localization.NEW_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {localization.CONFIRM_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n \n {isSubmitting ? (\n \n ) : (\n localization.RESET_PASSWORD_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/security-settings-cards.json b/public/r/security-settings-cards.json new file mode 100644 index 00000000..db45e62e --- /dev/null +++ b/public/r/security-settings-cards.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "security-settings-cards", + "type": "registry:component", + "title": "Security Settings Cards", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/change-password-card.json", + "http://localhost:3000/r/delete-account-card.json", + "http://localhost:3000/r/passkeys-card.json", + "http://localhost:3000/r/providers-card.json", + "http://localhost:3000/r/sessions-card.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security-settings-cards.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { DeleteAccountCard } from \"./account/delete-account-card\"\nimport { PasskeysCard } from \"./passkey/passkeys-card\"\nimport { ProvidersCard } from \"./providers/providers-card\"\nimport { ChangePasswordCard } from \"./security/change-password-card\"\nimport { SessionsCard } from \"./security/sessions-card\"\nimport type { SettingsCardClassNames } from \"./shared/settings-card\"\nimport { TwoFactorCard } from \"./two-factor/two-factor-card\"\n\nexport function SecuritySettingsCards({\n className,\n classNames,\n localization\n}: {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n}) {\n const {\n credentials,\n deleteUser,\n hooks,\n localization: contextLocalization,\n passkey,\n social,\n genericOAuth,\n twoFactor\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { useListAccounts } = hooks\n\n const {\n data: accounts,\n isPending: accountsPending,\n refetch: refetchAccounts\n } = useListAccounts()\n\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n return (\n \n {credentials && (\n \n )}\n\n {(social?.providers?.length || genericOAuth?.providers?.length) && (\n \n )}\n\n {twoFactor && credentialsLinked && (\n \n )}\n\n {passkey && (\n \n )}\n\n \n\n {deleteUser && (\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/select.json b/public/r/select.json new file mode 100644 index 00000000..968c7425 --- /dev/null +++ b/public/r/select.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "select", + "type": "registry:ui", + "title": "Select", + "description": "", + "dependencies": [ + "@radix-ui/react-select", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/select.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/separator.json b/public/r/separator.json new file mode 100644 index 00000000..10e8a44f --- /dev/null +++ b/public/r/separator.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "separator", + "type": "registry:ui", + "title": "Separator", + "description": "", + "dependencies": [ + "@radix-ui/react-separator" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/separator.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Separator }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/session-cell.json b/public/r/session-cell.json new file mode 100644 index 00000000..88752ec5 --- /dev/null +++ b/public/r/session-cell.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "session-cell", + "type": "registry:component", + "title": "Session Cell", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react", + "ua-parser-js" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/session-cell.tsx", + "content": "\"use client\"\n\nimport type { Session } from \"better-auth\"\nimport { LaptopIcon, Loader2, SmartphoneIcon } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\nimport { UAParser } from \"ua-parser-js\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface SessionCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n session: Session\n refetch?: Refetch\n}\n\nexport function SessionCell({\n className,\n classNames,\n localization,\n session,\n refetch\n}: SessionCellProps) {\n const {\n basePath,\n hooks: { useSession },\n localization: contextLocalization,\n mutators: { revokeSession },\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const isCurrentSession = session.id === sessionData?.session?.id\n\n const [isLoading, setIsLoading] = useState(false)\n\n const handleRevoke = async () => {\n setIsLoading(true)\n\n if (isCurrentSession) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n try {\n await revokeSession({ token: session.token })\n refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsLoading(false)\n }\n }\n\n const parser = UAParser(session.userAgent as string)\n const isMobile = parser.device.type === \"mobile\"\n\n return (\n \n {isMobile ? (\n \n ) : (\n \n )}\n\n
\n \n {isCurrentSession\n ? localization.CURRENT_SESSION\n : session?.ipAddress}\n \n\n \n {parser.os.name}, {parser.browser.name}\n \n
\n\n \n {isLoading && }\n {isCurrentSession ? localization.SIGN_OUT : localization.REVOKE}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/session-freshness-dialog.json b/public/r/session-freshness-dialog.json new file mode 100644 index 00000000..775dca3b --- /dev/null +++ b/public/r/session-freshness-dialog.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "session-freshness-dialog", + "type": "registry:component", + "title": "Session Freshness Dialog", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/session-freshness-dialog.tsx", + "content": "import { type ComponentProps, useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SessionFreshnessDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n title?: string\n description?: string\n}\n\nexport function SessionFreshnessDialog({\n classNames,\n localization,\n title,\n description,\n onOpenChange,\n ...props\n}: SessionFreshnessDialogProps) {\n const {\n basePath,\n localization: contextLocalization,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const handleSignOut = () => {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n onOpenChange?.(false)\n }\n\n return (\n \n \n \n \n {title ||\n localization?.SESSION_EXPIRED ||\n \"Session Expired\"}\n \n\n \n {description || localization?.SESSION_NOT_FRESH}\n \n \n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {localization?.SIGN_OUT}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/sessions-card.json b/public/r/sessions-card.json new file mode 100644 index 00000000..2ad6809b --- /dev/null +++ b/public/r/sessions-card.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sessions-card", + "type": "registry:component", + "title": "Sessions Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "http://localhost:3000/r/session-cell.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-cell-skeleton.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/security/sessions-card.tsx", + "content": "\"use client\"\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../skeletons/settings-cell-skeleton\"\nimport { SessionCell } from \"./session-cell\"\n\nexport interface SessionsCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function SessionsCard({\n className,\n classNames,\n localization\n}: SessionsCardProps) {\n const {\n hooks: { useListSessions },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessions, isPending, refetch } = useListSessions()\n\n return (\n \n \n {isPending ? (\n \n ) : (\n sessions?.map((session) => (\n \n ))\n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/settings-action-button.json b/public/r/settings-action-button.json new file mode 100644 index 00000000..9d7951f8 --- /dev/null +++ b/public/r/settings-action-button.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-action-button", + "type": "registry:component", + "title": "Settings Action Button", + "description": "", + "dependencies": [ + "lucide-react", + "react-hook-form" + ], + "registryDependencies": [ + "button", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-action-button.tsx", + "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport type { ComponentProps, ReactNode } from \"react\"\nimport { useFormState } from \"react-hook-form\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../ui/button\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\ninterface SettingsActionButtonProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n actionLabel: ReactNode\n disabled?: boolean\n isSubmitting?: boolean\n}\n\nexport function SettingsActionButton({\n classNames,\n actionLabel,\n disabled,\n isSubmitting,\n variant,\n onClick,\n ...props\n}: SettingsActionButtonProps) {\n if (!onClick) {\n const formState = useFormState()\n isSubmitting = formState.isSubmitting\n }\n\n return (\n \n {isSubmitting && }\n {actionLabel}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/settings-card-footer.json b/public/r/settings-card-footer.json new file mode 100644 index 00000000..f278340c --- /dev/null +++ b/public/r/settings-card-footer.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-card-footer", + "type": "registry:component", + "title": "Settings Card Footer", + "description": "", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-action-button.json", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-footer.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { CardDescription, CardFooter } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport { SettingsActionButton } from \"./settings-action-button\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SettingsCardFooterProps {\n className?: string\n classNames?: SettingsCardClassNames\n actionLabel?: ReactNode\n disabled?: boolean\n instructions?: ReactNode\n isPending?: boolean\n isSubmitting?: boolean\n optimistic?: boolean\n variant?: \"default\" | \"destructive\"\n action?: () => Promise | unknown\n}\n\nexport function SettingsCardFooter({\n className,\n classNames,\n actionLabel,\n disabled,\n instructions,\n isPending,\n isSubmitting,\n variant,\n action\n}: SettingsCardFooterProps) {\n return (\n \n {isPending ? (\n <>\n {instructions && (\n \n )}\n\n {actionLabel && (\n \n )}\n \n ) : (\n <>\n {instructions && (\n \n {instructions}\n \n )}\n\n {actionLabel && (\n \n )}\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/settings-card-header.json b/public/r/settings-card-header.json new file mode 100644 index 00000000..bdf72e93 --- /dev/null +++ b/public/r/settings-card-header.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-card-header", + "type": "registry:component", + "title": "Settings Card Header", + "description": "", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card-header.tsx", + "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { CardDescription, CardHeader, CardTitle } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SettingsCardHeaderProps {\n className?: string\n classNames?: SettingsCardClassNames\n description?: ReactNode\n isPending?: boolean\n title: ReactNode\n}\n\nexport function SettingsCardHeader({\n className,\n classNames,\n description,\n isPending,\n title\n}: SettingsCardHeaderProps) {\n return (\n \n {isPending ? (\n <>\n \n\n {description && (\n \n )}\n \n ) : (\n <>\n \n {title}\n \n\n {description && (\n \n {description}\n \n )}\n \n )}\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/settings-card.json b/public/r/settings-card.json new file mode 100644 index 00000000..8a935166 --- /dev/null +++ b/public/r/settings-card.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-card", + "type": "registry:component", + "title": "Settings Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "card", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/shared/settings-card.tsx", + "content": "\"use client\"\n\nimport type { ComponentProps, ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Card } from \"../../ui/card\"\nimport type { UserAvatarClassNames } from \"../../user-avatar\"\nimport { SettingsCardFooter } from \"./settings-card-footer\"\nimport { SettingsCardHeader } from \"./settings-card-header\"\n\nexport type SettingsCardClassNames = {\n base?: string\n avatar?: UserAvatarClassNames\n button?: string\n cell?: string\n checkbox?: string\n destructiveButton?: string\n content?: string\n description?: string\n dialog?: {\n content?: string\n footer?: string\n header?: string\n }\n error?: string\n footer?: string\n header?: string\n icon?: string\n input?: string\n instructions?: string\n label?: string\n primaryButton?: string\n secondaryButton?: string\n outlineButton?: string\n skeleton?: string\n title?: string\n}\n\nexport interface SettingsCardProps\n extends Omit, \"title\"> {\n children?: ReactNode\n className?: string\n classNames?: SettingsCardClassNames\n title?: ReactNode\n description?: ReactNode\n instructions?: ReactNode\n actionLabel?: ReactNode\n isSubmitting?: boolean\n disabled?: boolean\n isPending?: boolean\n optimistic?: boolean\n variant?: \"default\" | \"destructive\"\n localization?: AuthLocalization\n action?: () => Promise | unknown\n}\n\nexport function SettingsCard({\n children,\n className,\n classNames,\n title,\n description,\n instructions,\n actionLabel,\n disabled,\n isPending,\n isSubmitting,\n optimistic,\n variant,\n action,\n ...props\n}: SettingsCardProps) {\n return (\n \n \n\n {children}\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/settings-cell-skeleton.json b/public/r/settings-cell-skeleton.json new file mode 100644 index 00000000..47c97a0c --- /dev/null +++ b/public/r/settings-cell-skeleton.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "settings-cell-skeleton", + "type": "registry:component", + "title": "Settings Cell Skeleton", + "description": "", + "dependencies": [], + "registryDependencies": [ + "card", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/skeletons/settings-cell-skeleton.tsx", + "content": "\"use client\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Card } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport function SettingsCellSkeleton({\n classNames\n}: {\n classNames?: SettingsCardClassNames\n}) {\n return (\n \n
\n \n\n
\n \n
\n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/sign-in-form.json b/public/r/sign-in-form.json new file mode 100644 index 00000000..6c3c98dd --- /dev/null +++ b/public/r/sign-in-form.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-in-form", + "type": "registry:component", + "title": "Sign In Form", + "description": "", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "form", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-in-form.tsx", + "content": "\"use client\"\n\nimport type { BetterFetchOption } from \"@better-fetch/fetch\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCaptcha } from \"../../../hooks/use-captcha\"\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport {\n cn,\n getLocalizedError,\n getPasswordSchema,\n isValidEmail\n} from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { Captcha } from \"../../captcha/captcha\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface SignInFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (isSubmitting: boolean) => void\n passwordValidation?: PasswordValidation\n}\n\nexport function SignInForm({\n className,\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting,\n passwordValidation\n}: SignInFormProps) {\n const isHydrated = useIsHydrated()\n const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({\n localization\n })\n\n const {\n authClient,\n basePath,\n credentials,\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast,\n Link\n } = useContext(AuthUIContext)\n\n const rememberMeEnabled = credentials?.rememberMe\n const usernameEnabled = credentials?.username\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const formSchema = z.object({\n email: usernameEnabled\n ? z.string().min(1, {\n message: `${localization.USERNAME} ${localization.IS_REQUIRED}`\n })\n : z\n .string()\n .min(1, {\n message: `${localization.EMAIL} ${localization.IS_REQUIRED}`\n })\n .email({\n message: `${localization.EMAIL} ${localization.IS_INVALID}`\n }),\n password: getPasswordSchema(passwordValidation, localization),\n rememberMe: z.boolean().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n email: \"\",\n password: \"\",\n rememberMe: !rememberMeEnabled\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n async function signIn({\n email,\n password,\n rememberMe\n }: z.infer) {\n try {\n let response: Record = {}\n\n if (usernameEnabled && !isValidEmail(email)) {\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-in/username\")\n }\n\n response = await authClient.signIn.username({\n username: email,\n password,\n rememberMe,\n fetchOptions\n })\n } else {\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-in/email\")\n }\n\n response = await authClient.signIn.email({\n email,\n password,\n rememberMe,\n fetchOptions\n })\n }\n\n if (response.twoFactorRedirect) {\n navigate(\n `${basePath}/${viewPaths.TWO_FACTOR}${window.location.search}`\n )\n } else {\n await onSuccess()\n }\n } catch (error) {\n form.resetField(\"password\")\n resetCaptcha()\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n (\n \n \n {usernameEnabled\n ? localization.USERNAME\n : localization.EMAIL}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n
\n \n {localization.PASSWORD}\n \n\n {credentials?.forgotPassword && (\n \n {localization.FORGOT_PASSWORD_LINK}\n \n )}\n
\n\n \n \n \n\n \n
\n )}\n />\n\n {rememberMeEnabled && (\n (\n \n \n \n \n\n \n {localization.REMEMBER_ME}\n \n \n )}\n />\n )}\n\n \n\n \n {isSubmitting ? (\n \n ) : (\n localization.SIGN_IN_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/sign-out.json b/public/r/sign-out.json new file mode 100644 index 00000000..0e6a238b --- /dev/null +++ b/public/r/sign-out.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-out", + "type": "registry:component", + "title": "Sign Out", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/use-success-transition.json" + ], + "files": [ + { + "path": "src/components/auth/sign-out.tsx", + "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function SignOut() {\n const signingOut = useRef(false)\n\n const { authClient, basePath, viewPaths } = useContext(AuthUIContext)\n const { onSuccess } = useOnSuccessTransition({\n redirectTo: `${basePath}/${viewPaths.SIGN_IN}`\n })\n\n useEffect(() => {\n if (signingOut.current) return\n signingOut.current = true\n\n authClient.signOut().finally(onSuccess)\n }, [authClient, onSuccess])\n\n return \n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/sign-up-form.json b/public/r/sign-up-form.json new file mode 100644 index 00000000..5a97db3a --- /dev/null +++ b/public/r/sign-up-form.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-up-form", + "type": "registry:component", + "title": "Sign Up Form", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "better-auth", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "http://localhost:3000/r/captcha.json", + "checkbox", + "dropdown-menu", + "form", + "http://localhost:3000/r/image-utils.json", + "input", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/password-validation.json", + "textarea", + "http://localhost:3000/r/use-captcha.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/sign-up-form.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { BetterFetchOption } from \"better-auth/react\"\nimport { Loader2, Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCaptcha } from \"../../../hooks/use-captcha\"\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../../lib/image-utils\"\nimport {\n cn,\n getLocalizedError,\n getPasswordSchema,\n getSearchParam\n} from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { Captcha } from \"../../captcha/captcha\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Textarea } from \"../../ui/textarea\"\nimport { UserAvatar } from \"../../user-avatar\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface SignUpFormProps {\n className?: string\n classNames?: AuthFormClassNames\n callbackURL?: string\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n passwordValidation?: PasswordValidation\n}\n\nexport function SignUpForm({\n className,\n classNames,\n callbackURL,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting,\n passwordValidation\n}: SignUpFormProps) {\n const isHydrated = useIsHydrated()\n const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({\n localization\n })\n\n const {\n additionalFields,\n authClient,\n basePath,\n baseURL,\n credentials,\n localization: contextLocalization,\n nameRequired,\n persistClient,\n redirectTo: contextRedirectTo,\n signUp: signUpOptions,\n viewPaths,\n navigate,\n toast,\n avatar\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const usernameEnabled = credentials?.username\n const contextPasswordValidation = credentials?.passwordValidation\n const signUpFields = signUpOptions?.fields\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n // Avatar upload state\n const fileInputRef = useRef(null)\n const [avatarImage, setAvatarImage] = useState(null)\n const [uploadingAvatar, setUploadingAvatar] = useState(false)\n\n const getRedirectTo = useCallback(\n () => redirectTo || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectTo, contextRedirectTo]\n )\n\n const getCallbackURL = useCallback(\n () =>\n `${baseURL}${\n callbackURL ||\n (persistClient\n ? `${basePath}/${viewPaths.CALLBACK}?redirectTo=${getRedirectTo()}`\n : getRedirectTo())\n }`,\n [\n callbackURL,\n persistClient,\n basePath,\n viewPaths,\n baseURL,\n getRedirectTo\n ]\n )\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n // Create the base schema for standard fields\n const schemaFields: Record = {\n email: z\n .string()\n .min(1, {\n message: `${localization.EMAIL} ${localization.IS_REQUIRED}`\n })\n .email({\n message: `${localization.EMAIL} ${localization.IS_INVALID}`\n }),\n password: getPasswordSchema(passwordValidation, localization)\n }\n\n // Add confirmPassword field if enabled\n if (confirmPasswordEnabled) {\n schemaFields.confirmPassword = getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n }\n\n // Add name field if required or included in signUpFields\n if (signUpFields?.includes(\"name\")) {\n schemaFields.name = nameRequired\n ? z.string().min(1, {\n message: `${localization.NAME} ${localization.IS_REQUIRED}`\n })\n : z.string().optional()\n }\n\n // Add username field if enabled\n if (usernameEnabled) {\n schemaFields.username = z.string().min(1, {\n message: `${localization.USERNAME} ${localization.IS_REQUIRED}`\n })\n }\n\n // Add image field if included in signUpFields\n if (signUpFields?.includes(\"image\") && avatar) {\n schemaFields.image = z.string().optional()\n }\n\n // Add additional fields from signUpFields\n if (signUpFields) {\n for (const field of signUpFields) {\n if (field === \"name\") continue // Already handled above\n if (field === \"image\") continue // Already handled above\n\n const additionalField = additionalFields?.[field]\n if (!additionalField) continue\n\n let fieldSchema: z.ZodTypeAny\n\n // Create the appropriate schema based on field type\n if (additionalField.type === \"number\") {\n fieldSchema = additionalField.required\n ? z.preprocess(\n (val) => (!val ? undefined : Number(val)),\n z.number({\n required_error: `${additionalField.label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n )\n : z.coerce\n .number({\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .optional()\n } else if (additionalField.type === \"boolean\") {\n fieldSchema = additionalField.required\n ? z.coerce\n .boolean({\n required_error: `${additionalField.label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .refine((val) => val === true, {\n message: `${additionalField.label} ${localization.IS_REQUIRED}`\n })\n : z.coerce\n .boolean({\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .optional()\n } else {\n fieldSchema = additionalField.required\n ? z\n .string()\n .min(\n 1,\n `${additionalField.label} ${localization.IS_REQUIRED}`\n )\n : z.string().optional()\n }\n\n schemaFields[field] = fieldSchema\n }\n }\n\n const formSchema = z.object(schemaFields).refine(\n (data) => {\n // Skip validation if confirmPassword is not enabled\n if (!confirmPasswordEnabled) return true\n return data.password === data.confirmPassword\n },\n {\n message: localization.PASSWORDS_DO_NOT_MATCH!,\n path: [\"confirmPassword\"]\n }\n )\n\n // Create default values for the form\n const defaultValues: Record = {\n email: \"\",\n password: \"\",\n ...(confirmPasswordEnabled && { confirmPassword: \"\" }),\n ...(signUpFields?.includes(\"name\") ? { name: \"\" } : {}),\n ...(usernameEnabled ? { username: \"\" } : {}),\n ...(signUpFields?.includes(\"image\") && avatar ? { image: \"\" } : {})\n }\n\n // Add default values for additional fields\n if (signUpFields) {\n for (const field of signUpFields) {\n if (field === \"name\") continue\n if (field === \"image\") continue\n const additionalField = additionalFields?.[field]\n if (!additionalField) continue\n\n defaultValues[field] =\n additionalField.type === \"boolean\" ? false : \"\"\n }\n }\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n const handleAvatarChange = async (file: File) => {\n if (!avatar) return\n\n setUploadingAvatar(true)\n\n try {\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n avatar.size,\n avatar.extension\n )\n\n let image: string | undefined | null\n\n if (avatar.upload) {\n image = await avatar.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (image) {\n setAvatarImage(image)\n form.setValue(\"image\", image)\n } else {\n setAvatarImage(null)\n form.setValue(\"image\", \"\")\n }\n } catch (error) {\n console.error(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setUploadingAvatar(false)\n }\n\n const handleDeleteAvatar = () => {\n setAvatarImage(null)\n form.setValue(\"image\", \"\")\n }\n\n const openFileDialog = () => fileInputRef.current?.click()\n\n async function signUp({\n email,\n password,\n name,\n username,\n confirmPassword,\n image,\n ...additionalFieldValues\n }: z.infer) {\n try {\n // Validate additional fields with custom validators if provided\n for (const [field, value] of Object.entries(\n additionalFieldValues\n )) {\n const additionalField = additionalFields?.[field]\n if (!additionalField?.validate) continue\n\n if (\n typeof value === \"string\" &&\n !(await additionalField.validate(value))\n ) {\n form.setError(field, {\n message: `${additionalField.label} ${localization.IS_INVALID}`\n })\n return\n }\n }\n\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-up/email\")\n }\n\n const data = await authClient.signUp.email({\n email,\n password,\n name: name || \"\",\n ...(username !== undefined && { username }),\n ...(image !== undefined && { image }),\n ...additionalFieldValues,\n callbackURL: getCallbackURL(),\n fetchOptions\n })\n\n if (\"token\" in data && data.token) {\n await onSuccess()\n } else {\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n toast({\n variant: \"success\",\n message: localization.SIGN_UP_EMAIL!\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.resetField(\"password\")\n form.resetField(\"confirmPassword\")\n resetCaptcha()\n }\n }\n\n return (\n
\n \n {signUpFields?.includes(\"image\") && avatar && (\n <>\n {\n const file = e.target.files?.item(0)\n if (file) handleAvatarChange(file)\n e.target.value = \"\"\n }}\n />\n\n (\n \n {localization.AVATAR}\n\n
\n \n \n \n \n \n \n\n \n e.preventDefault()\n }\n >\n \n \n {localization.UPLOAD_AVATAR}\n \n\n {avatarImage && (\n \n \n {\n localization.DELETE_AVATAR\n }\n \n )}\n \n \n\n \n {uploadingAvatar && (\n \n )}\n\n {localization.UPLOAD}\n \n
\n\n \n
\n )}\n />\n \n )}\n\n {signUpFields?.includes(\"name\") && (\n (\n \n \n {localization.NAME}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n {usernameEnabled && (\n (\n \n \n {localization.USERNAME}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n (\n \n \n {localization.EMAIL}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {localization.CONFIRM_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n {signUpFields\n ?.filter((field) => field !== \"name\" && field !== \"image\")\n .map((field) => {\n const additionalField = additionalFields?.[field]\n if (!additionalField) {\n console.error(`Additional field ${field} not found`)\n return null\n }\n\n return additionalField.type === \"boolean\" ? (\n (\n \n \n \n \n\n \n {additionalField.label}\n \n\n \n \n )}\n />\n ) : (\n (\n \n \n {additionalField.label}\n \n\n \n {additionalField.type ===\n \"number\" ? (\n \n ) : additionalField.multiline ? (\n \n ) : (\n \n )}\n \n\n \n \n )}\n />\n )\n })}\n\n \n\n \n {isSubmitting ? (\n \n ) : (\n localization.SIGN_UP_ACTION\n )}\n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/sign-up-options.json b/public/r/sign-up-options.json new file mode 100644 index 00000000..82ea8b68 --- /dev/null +++ b/public/r/sign-up-options.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sign-up-options", + "type": "registry:file", + "title": "Sign Up Options", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/types/sign-up-options.ts", + "content": "export type SignUpOptions = {\n /**\n * Array of fields to show in Sign Up form\n * @default [\"name\"]\n */\n fields?: string[]\n}\n", + "type": "registry:file", + "target": "types/sign-up-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/signed-in.json b/public/r/signed-in.json new file mode 100644 index 00000000..793fdfcb --- /dev/null +++ b/public/r/signed-in.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "signed-in", + "type": "registry:component", + "title": "Signed In", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/signed-in.tsx", + "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content for authenticated users only\n *\n * Renders its children only when a user is authenticated with a valid session.\n * If no session exists, nothing is rendered. Useful for displaying protected\n * content or UI elements that should only be visible to signed-in users.\n */\nexport function SignedIn({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { data } = useSession()\n\n return data ? children : null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/signed-out.json b/public/r/signed-out.json new file mode 100644 index 00000000..84959925 --- /dev/null +++ b/public/r/signed-out.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "signed-out", + "type": "registry:component", + "title": "Signed Out", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/components/signed-out.tsx", + "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content for unauthenticated users only\n *\n * Renders its children only when no user is authenticated and the authentication\n * state is not pending. If a session exists or is being loaded, nothing is rendered.\n * Useful for displaying sign-in prompts or content exclusive to guests.\n */\nexport function SignedOut({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { data, isPending } = useSession()\n\n return !data && !isPending ? children : null\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/skeleton.json b/public/r/skeleton.json new file mode 100644 index 00000000..282f5451 --- /dev/null +++ b/public/r/skeleton.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "skeleton", + "type": "registry:ui", + "title": "Skeleton", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/skeleton.tsx", + "content": "import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Skeleton }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/social-options.json b/public/r/social-options.json new file mode 100644 index 00000000..e4ee7009 --- /dev/null +++ b/public/r/social-options.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "social-options", + "type": "registry:file", + "title": "Social Options", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json" + ], + "files": [ + { + "path": "src/types/social-options.ts", + "content": "import type { SocialProvider } from \"better-auth/social-providers\"\nimport type { AuthClient } from \"./auth-client\"\n\nexport type SocialOptions = {\n /**\n * Array of Social Providers to enable\n * @remarks `SocialProvider[]`\n */\n providers: SocialProvider[]\n /**\n * Custom social sign in function\n */\n signIn?: (\n params: Parameters[0]\n ) => Promise\n}\n", + "type": "registry:file", + "target": "types/social-options.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/social-providers.json b/public/r/social-providers.json new file mode 100644 index 00000000..f3a5ba7a --- /dev/null +++ b/public/r/social-providers.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "social-providers", + "type": "registry:lib", + "title": "Social Providers", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/provider-icons.json" + ], + "files": [ + { + "path": "src/lib/social-providers.ts", + "content": "import {\n AppleIcon,\n DiscordIcon,\n DropboxIcon,\n FacebookIcon,\n GitHubIcon,\n GitLabIcon,\n GoogleIcon,\n HuggingFaceIcon,\n KickIcon,\n LinearIcon,\n LinkedInIcon,\n MicrosoftIcon,\n NotionIcon,\n type ProviderIcon,\n RedditIcon,\n RobloxIcon,\n SlackIcon,\n SpotifyIcon,\n TikTokIcon,\n TwitchIcon,\n VKIcon,\n XIcon,\n ZoomIcon\n} from \"../components/provider-icons\"\n\nexport const socialProviders = [\n {\n provider: \"apple\",\n name: \"Apple\",\n icon: AppleIcon\n },\n {\n provider: \"discord\",\n name: \"Discord\",\n icon: DiscordIcon\n },\n {\n provider: \"dropbox\",\n name: \"Dropbox\",\n icon: DropboxIcon\n },\n {\n provider: \"facebook\",\n name: \"Facebook\",\n icon: FacebookIcon\n },\n {\n provider: \"github\",\n name: \"GitHub\",\n icon: GitHubIcon\n },\n {\n provider: \"gitlab\",\n name: \"GitLab\",\n icon: GitLabIcon\n },\n {\n provider: \"google\",\n name: \"Google\",\n icon: GoogleIcon\n },\n {\n provider: \"huggingface\",\n name: \"Hugging Face\",\n icon: HuggingFaceIcon\n },\n {\n provider: \"kick\",\n name: \"Kick\",\n icon: KickIcon\n },\n {\n provider: \"linear\",\n name: \"Linear\",\n icon: LinearIcon\n },\n {\n provider: \"linkedin\",\n name: \"LinkedIn\",\n icon: LinkedInIcon\n },\n {\n provider: \"microsoft\",\n name: \"Microsoft\",\n icon: MicrosoftIcon\n },\n {\n provider: \"notion\",\n name: \"Notion\",\n icon: NotionIcon\n },\n {\n provider: \"reddit\",\n name: \"Reddit\",\n icon: RedditIcon\n },\n {\n provider: \"roblox\",\n name: \"Roblox\",\n icon: RobloxIcon\n },\n {\n provider: \"slack\",\n name: \"Slack\",\n icon: SlackIcon\n },\n {\n provider: \"spotify\",\n name: \"Spotify\",\n icon: SpotifyIcon\n },\n {\n provider: \"tiktok\",\n name: \"TikTok\",\n icon: TikTokIcon\n },\n {\n provider: \"twitch\",\n name: \"Twitch\",\n icon: TwitchIcon\n },\n {\n provider: \"vk\",\n name: \"VK\",\n icon: VKIcon\n },\n {\n provider: \"twitter\",\n name: \"X\",\n icon: XIcon\n },\n {\n provider: \"zoom\",\n name: \"Zoom\",\n icon: ZoomIcon\n }\n] as const\n\nexport type Provider = {\n provider: string\n name: string\n icon?: ProviderIcon\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/stripe-localization.json b/public/r/stripe-localization.json new file mode 100644 index 00000000..31f30566 --- /dev/null +++ b/public/r/stripe-localization.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "stripe-localization", + "type": "registry:file", + "title": "Stripe Localization", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/stripe-localization.ts", + "content": "export const STRIPE_ERROR_CODES = {\n SUBSCRIPTION_NOT_FOUND: \"Subscription not found\",\n SUBSCRIPTION_PLAN_NOT_FOUND: \"Subscription plan not found\",\n ALREADY_SUBSCRIBED_PLAN: \"You're already subscribed to this plan\",\n UNABLE_TO_CREATE_CUSTOMER: \"Unable to create customer\",\n FAILED_TO_FETCH_PLANS: \"Failed to fetch plans\",\n EMAIL_VERIFICATION_REQUIRED:\n \"Email verification is required before you can subscribe to a plan\",\n SUBSCRIPTION_NOT_ACTIVE: \"Subscription is not active\",\n SUBSCRIPTION_NOT_SCHEDULED_FOR_CANCELLATION:\n \"Subscription is not scheduled for cancellation\"\n}\n", + "type": "registry:file", + "target": "localization/stripe-localization.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/tabs.json b/public/r/tabs.json new file mode 100644 index 00000000..7b1455a2 --- /dev/null +++ b/public/r/tabs.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tabs", + "type": "registry:ui", + "title": "Tabs", + "description": "", + "dependencies": [ + "@radix-ui/react-tabs" + ], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/tabs.tsx", + "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/textarea.json b/public/r/textarea.json new file mode 100644 index 00000000..b104e4bb --- /dev/null +++ b/public/r/textarea.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "textarea", + "type": "registry:ui", + "title": "Textarea", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/ui/textarea.tsx", + "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n \n )\n}\n\nexport { Textarea }\n", + "type": "registry:ui" + } + ] +} \ No newline at end of file diff --git a/public/r/two-factor-card.json b/public/r/two-factor-card.json new file mode 100644 index 00000000..5d763015 --- /dev/null +++ b/public/r/two-factor-card.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-card", + "type": "registry:component", + "title": "Two Factor Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/two-factor-password-dialog.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-card.tsx", + "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { User } from \"../../../types/auth-client\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { TwoFactorPasswordDialog } from \"./two-factor-password-dialog\"\n\nexport interface TwoFactorCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function TwoFactorCard({\n className,\n classNames,\n localization\n}: TwoFactorCardProps) {\n const {\n localization: contextLocalization,\n hooks: { useSession }\n } = useContext(AuthUIContext)\n\n const [showPasswordDialog, setShowPasswordDialog] = useState(false)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData, isPending } = useSession()\n const isTwoFactorEnabled = (sessionData?.user as User)?.twoFactorEnabled\n\n return (\n
\n setShowPasswordDialog(true)}\n />\n\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/two-factor-error-codes.json b/public/r/two-factor-error-codes.json new file mode 100644 index 00000000..f493ab8a --- /dev/null +++ b/public/r/two-factor-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-error-codes", + "type": "registry:file", + "title": "Two Factor Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/two-factor-error-codes.ts", + "content": "export const TWO_FACTOR_ERROR_CODES = {\n OTP_NOT_ENABLED: \"OTP not enabled\",\n OTP_HAS_EXPIRED: \"OTP has expired\",\n TOTP_NOT_ENABLED: \"TOTP not enabled\",\n TWO_FACTOR_NOT_ENABLED: \"Two factor isn't enabled\",\n BACKUP_CODES_NOT_ENABLED: \"Backup codes aren't enabled\",\n INVALID_BACKUP_CODE: \"Invalid backup code\",\n INVALID_CODE: \"Invalid code\",\n TOO_MANY_ATTEMPTS_REQUEST_NEW_CODE:\n \"Too many attempts. Please request a new code.\",\n INVALID_TWO_FACTOR_COOKIE: \"Invalid two factor cookie\"\n}\n", + "type": "registry:file", + "target": "localization/two-factor-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/two-factor-form.json b/public/r/two-factor-form.json new file mode 100644 index 00000000..f0316e78 --- /dev/null +++ b/public/r/two-factor-form.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-form", + "type": "registry:component", + "title": "Two Factor Form", + "description": "", + "dependencies": [ + "@better-fetch/fetch", + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "react-qr-code", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-form.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "checkbox", + "form", + "input-otp", + "label", + "http://localhost:3000/r/otp-input-group.json", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/use-success-transition.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/auth/forms/two-factor-form.tsx", + "content": "\"use client\"\n\nimport type { BetterFetchError } from \"@better-fetch/fetch\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2, QrCodeIcon, SendIcon } from \"lucide-react\"\nimport { useContext, useEffect, useRef, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport QRCode from \"react-qr-code\"\nimport * as z from \"zod\"\n\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { User } from \"../../../types/auth-client\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { InputOTP } from \"../../ui/input-otp\"\nimport { Label } from \"../../ui/label\"\nimport type { AuthFormClassNames } from \"../auth-form\"\nimport { OTPInputGroup } from \"../otp-input-group\"\n\nexport interface TwoFactorFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization?: Partial\n otpSeparators?: 0 | 1 | 2\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n}\n\nexport function TwoFactorForm({\n className,\n classNames,\n isSubmitting,\n localization,\n otpSeparators = 0,\n redirectTo,\n setIsSubmitting\n}: TwoFactorFormProps) {\n const isHydrated = useIsHydrated()\n const totpURI = isHydrated ? getSearchParam(\"totpURI\") : null\n const initialSendRef = useRef(false)\n\n const {\n authClient,\n basePath,\n hooks: { useSession },\n localization: contextLocalization,\n twoFactor,\n viewPaths,\n toast,\n Link\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const { data: sessionData } = useSession()\n const isTwoFactorEnabled = (sessionData?.user as User)?.twoFactorEnabled\n\n const [method, setMethod] = useState<\"totp\" | \"otp\" | null>(\n twoFactor?.length === 1 ? twoFactor[0] : null\n )\n\n const [isSendingOtp, setIsSendingOtp] = useState(false)\n const [cooldownSeconds, setCooldownSeconds] = useState(0)\n\n const formSchema = z.object({\n code: z\n .string()\n .min(1, {\n message: `${localization.ONE_TIME_PASSWORD} ${localization.IS_REQUIRED}`\n })\n .min(6, {\n message: `${localization.ONE_TIME_PASSWORD} ${localization.IS_INVALID}`\n }),\n trustDevice: z.boolean().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n code: \"\"\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (\n method === \"otp\" &&\n cooldownSeconds <= 0 &&\n !initialSendRef.current\n ) {\n initialSendRef.current = true\n sendOtp()\n }\n }, [method])\n\n useEffect(() => {\n if (cooldownSeconds <= 0) return\n\n const timer = setTimeout(() => {\n setCooldownSeconds((prev) => prev - 1)\n }, 1000)\n return () => clearTimeout(timer)\n }, [cooldownSeconds])\n\n const sendOtp = async () => {\n if (isSendingOtp || cooldownSeconds > 0) return\n\n try {\n setIsSendingOtp(true)\n await authClient.twoFactor.sendOtp({\n fetchOptions: { throw: true }\n })\n setCooldownSeconds(60)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n if (\n (error as BetterFetchError).error.code ===\n \"INVALID_TWO_FACTOR_COOKIE\"\n ) {\n history.back()\n }\n }\n\n initialSendRef.current = false\n setIsSendingOtp(false)\n }\n\n async function verifyCode({\n code,\n trustDevice\n }: z.infer) {\n try {\n const verifyMethod =\n method === \"totp\"\n ? authClient.twoFactor.verifyTotp\n : authClient.twoFactor.verifyOtp\n\n await verifyMethod({\n code,\n trustDevice,\n fetchOptions: { throw: true }\n })\n\n await onSuccess()\n\n if (sessionData && !isTwoFactorEnabled) {\n toast({\n variant: \"success\",\n message: localization?.TWO_FACTOR_ENABLED\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n {twoFactor?.includes(\"totp\") &&\n totpURI &&\n method === \"totp\" && (\n
\n \n\n \n
\n )}\n\n {method !== null && (\n <>\n (\n \n
\n \n {localization.ONE_TIME_PASSWORD}\n \n\n \n {localization.FORGOT_AUTHENTICATOR}\n \n
\n\n \n {\n field.onChange(value)\n\n if (value.length === 6) {\n form.handleSubmit(\n verifyCode\n )()\n }\n }}\n containerClassName={\n classNames?.otpInputContainer\n }\n className={classNames?.otpInput}\n disabled={isSubmitting}\n >\n \n \n \n\n \n
\n )}\n />\n\n (\n \n \n \n \n\n \n {localization.TRUST_DEVICE}\n \n \n )}\n />\n \n )}\n\n
\n {method !== null && (\n \n {isSubmitting && (\n \n )}\n {localization.TWO_FACTOR_ACTION}\n \n )}\n\n {method === \"otp\" && twoFactor?.includes(\"otp\") && (\n 0 ||\n isSendingOtp ||\n isSubmitting\n }\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n >\n {isSendingOtp ? (\n \n ) : (\n \n )}\n\n {localization.RESEND_CODE}\n {cooldownSeconds > 0 && ` (${cooldownSeconds})`}\n \n )}\n\n {method !== \"otp\" && twoFactor?.includes(\"otp\") && (\n setMethod(\"otp\")}\n disabled={isSubmitting}\n >\n \n {localization.SEND_VERIFICATION_CODE}\n \n )}\n\n {method !== \"totp\" && twoFactor?.includes(\"totp\") && (\n setMethod(\"totp\")}\n disabled={isSubmitting}\n >\n \n {localization.CONTINUE_WITH_AUTHENTICATOR}\n \n )}\n
\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/two-factor-password-dialog.json b/public/r/two-factor-password-dialog.json new file mode 100644 index 00000000..e9055bd7 --- /dev/null +++ b/public/r/two-factor-password-dialog.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "two-factor-password-dialog", + "type": "registry:component", + "title": "Two Factor Password Dialog", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "lucide-react", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/backup-codes-dialog.json", + "button", + "dialog", + "form", + "http://localhost:3000/r/password-input.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/two-factor/two-factor-password-dialog.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { BackupCodesDialog } from \"./backup-codes-dialog\"\n\ninterface TwoFactorPasswordDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n isTwoFactorEnabled: boolean\n}\n\nexport function TwoFactorPasswordDialog({\n classNames,\n onOpenChange,\n isTwoFactorEnabled,\n ...props\n}: TwoFactorPasswordDialogProps) {\n const {\n localization,\n authClient,\n basePath,\n viewPaths,\n navigate,\n toast,\n twoFactor\n } = useContext(AuthUIContext)\n const [showBackupCodesDialog, setShowBackupCodesDialog] = useState(false)\n const [backupCodes, setBackupCodes] = useState([])\n const [totpURI, setTotpURI] = useState(null)\n\n const formSchema = z.object({\n password: z.string().min(1, { message: localization.PASSWORD_REQUIRED })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n password: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n async function enableTwoFactor({ password }: z.infer) {\n try {\n const response = await authClient.twoFactor.enable({\n password,\n fetchOptions: { throw: true }\n })\n\n onOpenChange?.(false)\n setBackupCodes(response.backupCodes)\n\n if (twoFactor?.includes(\"totp\")) {\n setTotpURI(response.totpURI)\n }\n\n setTimeout(() => {\n setShowBackupCodesDialog(true)\n }, 250)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n async function disableTwoFactor({ password }: z.infer) {\n try {\n await authClient.twoFactor.disable({\n password,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.TWO_FACTOR_DISABLED\n })\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n <>\n \n \n \n \n {localization.TWO_FACTOR}\n \n\n \n {isTwoFactorEnabled\n ? localization.TWO_FACTOR_DISABLE_INSTRUCTIONS\n : localization.TWO_FACTOR_ENABLE_INSTRUCTIONS}\n \n \n\n
\n \n (\n \n \n {localization.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.secondaryButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n {isTwoFactorEnabled\n ? localization.DISABLE_TWO_FACTOR\n : localization.ENABLE_TWO_FACTOR}\n \n \n \n \n \n
\n\n {\n setShowBackupCodesDialog(open)\n\n if (!open) {\n const url = `${basePath}/${viewPaths.TWO_FACTOR}`\n navigate(\n twoFactor?.includes(\"totp\") && totpURI\n ? `${url}?totpURI=${totpURI}`\n : url\n )\n }\n }}\n backupCodes={backupCodes}\n />\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/update-avatar-card.json b/public/r/update-avatar-card.json new file mode 100644 index 00000000..2f64c293 --- /dev/null +++ b/public/r/update-avatar-card.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-avatar-card", + "type": "registry:component", + "title": "Update Avatar Card", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/image-utils.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/settings-card-footer.json", + "http://localhost:3000/r/settings-card-header.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-avatar-card.tsx", + "content": "\"use client\"\n\nimport { Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useRef, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport { UserAvatar } from \"../../user-avatar\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCardFooter } from \"../shared/settings-card-footer\"\nimport { SettingsCardHeader } from \"../shared/settings-card-header\"\n\nexport interface UpdateAvatarCardProps extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function UpdateAvatarCard({\n className,\n classNames,\n localization,\n ...props\n}: UpdateAvatarCardProps) {\n const {\n hooks: { useSession },\n mutators: { updateUser },\n localization: authLocalization,\n optimistic,\n avatar,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...authLocalization, ...localization }\n\n const { data: sessionData, isPending, refetch } = useSession()\n const fileInputRef = useRef(null)\n const [loading, setLoading] = useState(false)\n\n const handleAvatarChange = async (file: File) => {\n if (!sessionData || !avatar) return\n\n setLoading(true)\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n avatar.size,\n avatar.extension\n )\n\n let image: string | undefined | null\n\n if (avatar.upload) {\n image = await avatar.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (!image) {\n setLoading(false)\n return\n }\n\n if (optimistic && !avatar.upload) setLoading(false)\n\n try {\n await updateUser({ image })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const handleDeleteAvatar = async () => {\n if (!sessionData) return\n\n setLoading(true)\n\n try {\n // If a custom storage remover is provided, attempt to clean up the old asset first\n if (sessionData.user.image && avatar?.delete) {\n await avatar.delete(sessionData.user.image)\n }\n\n await updateUser({ image: null })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const openFileDialog = () => fileInputRef.current?.click()\n\n return (\n \n {\n const file = e.target.files?.item(0)\n if (file) handleAvatarChange(file)\n\n e.target.value = \"\"\n }}\n />\n\n
\n \n\n \n \n \n \n \n \n\n e.preventDefault()}\n >\n \n \n {localization.UPLOAD_AVATAR}\n \n {sessionData?.user.image && (\n \n \n {localization.DELETE_AVATAR}\n \n )}\n \n \n
\n\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/update-field-card.json b/public/r/update-field-card.json new file mode 100644 index 00000000..790f069a --- /dev/null +++ b/public/r/update-field-card.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-field-card", + "type": "registry:component", + "title": "Update Field Card", + "description": "", + "dependencies": [ + "@hookform/resolvers", + "react-hook-form", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/additional-fields.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "card", + "checkbox", + "form", + "input", + "http://localhost:3000/r/settings-card.json", + "skeleton", + "textarea", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-field-card.tsx", + "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { type ReactNode, useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { FieldType } from \"../../../types/additional-fields\"\nimport { CardContent } from \"../../ui/card\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport { Textarea } from \"../../ui/textarea\"\nimport {\n SettingsCard,\n type SettingsCardClassNames\n} from \"../shared/settings-card\"\n\nexport interface UpdateFieldCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n description?: ReactNode\n instructions?: ReactNode\n localization?: Partial\n name: string\n placeholder?: string\n required?: boolean\n label?: ReactNode\n type?: FieldType\n multiline?: boolean\n value?: unknown\n validate?: (value: string) => boolean | Promise\n}\n\nexport function UpdateFieldCard({\n className,\n classNames,\n description,\n instructions,\n localization: localizationProp,\n name,\n placeholder,\n required,\n label,\n type,\n multiline,\n value,\n validate\n}: UpdateFieldCardProps) {\n const {\n hooks: { useSession },\n mutators: { updateUser },\n localization: contextLocalization,\n optimistic,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { isPending } = useSession()\n\n let fieldSchema = z.unknown() as z.ZodType\n\n // Create the appropriate schema based on type\n if (type === \"number\") {\n fieldSchema = required\n ? z.preprocess(\n (val) => (!val ? undefined : Number(val)),\n z.number({\n required_error: `${label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n )\n : z.coerce\n .number({\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n .optional()\n } else if (type === \"boolean\") {\n fieldSchema = required\n ? z.coerce\n .boolean({\n required_error: `${label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n .refine((val) => val === true, {\n message: `${label} ${localization.IS_REQUIRED}`\n })\n : z.coerce.boolean({\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n } else {\n fieldSchema = required\n ? z.string().min(1, `${label} ${localization.IS_REQUIRED}`)\n : z.string().optional()\n }\n\n const form = useForm({\n resolver: zodResolver(z.object({ [name]: fieldSchema })),\n values: { [name]: value || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateField = async (values: Record) => {\n await new Promise((resolve) => setTimeout(resolve))\n const newValue = values[name]\n\n if (value === newValue) {\n toast({\n variant: \"error\",\n message: `${label} ${localization.IS_THE_SAME}`\n })\n return\n }\n\n if (\n validate &&\n typeof newValue === \"string\" &&\n !(await validate(newValue))\n ) {\n form.setError(name, {\n message: `${label} ${localization.IS_INVALID}`\n })\n\n return\n }\n\n try {\n await updateUser({ [name]: newValue })\n\n toast({\n variant: \"success\",\n message: `${label} ${localization.UPDATED_SUCCESSFULLY}`\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {type === \"boolean\" ? (\n (\n \n \n \n \n\n \n {label}\n \n\n \n \n )}\n />\n ) : isPending ? (\n \n ) : (\n (\n \n \n {type === \"number\" ? (\n \n ) : multiline ? (\n \n ) : (\n \n )}\n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/update-member-role-dialog.json b/public/r/update-member-role-dialog.json new file mode 100644 index 00000000..b3bb7b17 --- /dev/null +++ b/public/r/update-member-role-dialog.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-member-role-dialog", + "type": "registry:component", + "title": "Update Member Role Dialog", + "description": "", + "dependencies": [ + "better-auth", + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dialog", + "http://localhost:3000/r/member-cell.json", + "select", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/update-member-role-dialog.tsx", + "content": "\"use client\"\n\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo, useState } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue\n} from \"../ui/select\"\nimport { MemberCell } from \"./member-cell\"\n\nexport interface UpdateMemberRoleDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n member: Member & { user?: Partial | null }\n}\n\nexport function UpdateMemberRoleDialog({\n member,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: UpdateMemberRoleDialogProps) {\n const {\n authClient,\n hooks: { useSession, useListMembers },\n localization: contextLocalization,\n organization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data, refetch } = useListMembers({\n query: { organizationId: member.organizationId }\n })\n\n const members = data?.members\n\n const { data: sessionData } = useSession()\n\n const [isUpdating, setIsUpdating] = useState(false)\n const [selectedRole, setSelectedRole] = useState(member.role)\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organization?.customRoles || [])]\n\n const currentUserRole = members?.find(\n (m) => m.user?.id === sessionData?.user.id\n )?.role\n\n const availableRoles = roles.filter((role) => {\n if (role.role === \"owner\") {\n return currentUserRole === \"owner\"\n }\n\n if (role.role === \"admin\") {\n return currentUserRole === \"owner\" || currentUserRole === \"admin\"\n }\n\n return true\n })\n\n const updateMemberRole = async () => {\n if (selectedRole === member.role) {\n toast({\n variant: \"error\",\n message: `${localization.ROLE} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n setIsUpdating(true)\n\n try {\n await authClient.organization.updateMemberRole({\n memberId: member.id,\n // @ts-ignore - role is a string but the type expects specific values\n role: selectedRole,\n organizationId: member.organizationId,\n fetchOptions: {\n throw: true\n }\n })\n\n toast({\n variant: \"success\",\n message: localization.MEMBER_ROLE_UPDATED\n })\n\n await refetch?.()\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsUpdating(false)\n }\n\n return (\n \n e.preventDefault()}\n >\n \n \n {localization.UPDATE_ROLE}\n \n\n \n {localization.UPDATE_ROLE_DESCRIPTION}\n \n \n\n
\n \n\n \n \n \n \n\n \n {availableRoles.map((role) => (\n \n {role.label}\n \n ))}\n \n \n
\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isUpdating}\n >\n {localization.CANCEL}\n \n\n \n {isUpdating && }\n\n {localization.UPDATE_ROLE}\n \n \n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/update-name-card.json b/public/r/update-name-card.json new file mode 100644 index 00000000..c084da9c --- /dev/null +++ b/public/r/update-name-card.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-name-card", + "type": "registry:component", + "title": "Update Name Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-name-card.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { UpdateFieldCard } from \"./update-field-card\"\n\nexport function UpdateNameCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useSession },\n localization: contextLocalization,\n nameRequired\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n\n return (\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/update-username-card.json b/public/r/update-username-card.json new file mode 100644 index 00000000..bc0c9216 --- /dev/null +++ b/public/r/update-username-card.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "update-username-card", + "type": "registry:component", + "title": "Update Username Card", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/update-field-card.json" + ], + "files": [ + { + "path": "src/components/settings/account/update-username-card.tsx", + "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { User } from \"../../../types/auth-client\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { UpdateFieldCard } from \"./update-field-card\"\n\nexport function UpdateUsernameCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useSession },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const value =\n (sessionData?.user as User)?.displayUsername ||\n (sessionData?.user as User)?.username\n\n return (\n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/use-auth-data.json b/public/r/use-auth-data.json new file mode 100644 index 00000000..acbe078b --- /dev/null +++ b/public/r/use-auth-data.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-auth-data", + "type": "registry:hook", + "title": "Use Auth Data", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-data-cache.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/fetch-error.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-auth-data.ts", + "content": "import {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore\n} from \"react\"\n\nimport { authDataCache } from \"../lib/auth-data-cache\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getLocalizedError } from \"../lib/utils\"\nimport type { FetchError } from \"../types/fetch-error\"\n\nexport function useAuthData({\n queryFn,\n cacheKey,\n staleTime = 10000 // Default 10 seconds\n}: {\n queryFn: () => Promise<{ data: T | null; error?: FetchError | null }>\n cacheKey?: string\n staleTime?: number\n}) {\n const {\n hooks: { useSession },\n toast,\n localization\n } = useContext(AuthUIContext)\n const { data: sessionData, isPending: sessionPending } = useSession()\n\n // Generate a stable cache key based on the queryFn if not provided\n const queryFnRef = useRef(queryFn)\n queryFnRef.current = queryFn\n\n const stableCacheKey = cacheKey || queryFn.toString()\n\n // Subscribe to cache updates for this key\n const cacheEntry = useSyncExternalStore(\n useCallback(\n (callback) => authDataCache.subscribe(stableCacheKey, callback),\n [stableCacheKey]\n ),\n useCallback(\n () => authDataCache.get(stableCacheKey),\n [stableCacheKey]\n ),\n useCallback(\n () => authDataCache.get(stableCacheKey),\n [stableCacheKey]\n )\n )\n\n const initialized = useRef(false)\n const previousUserId = useRef(undefined)\n const [error, setError] = useState(null)\n\n const refetch = useCallback(async () => {\n // Check if there's already an in-flight request for this key\n const existingRequest = authDataCache.getInFlightRequest<{\n data: T | null\n error?: FetchError | null\n }>(stableCacheKey)\n if (existingRequest) {\n // Wait for the existing request to complete\n try {\n const result = await existingRequest\n if (result.error) {\n setError(result.error)\n } else {\n setError(null)\n }\n } catch (err) {\n setError(err as FetchError)\n }\n return\n }\n\n // Mark as refetching if we have cached data\n if (cacheEntry?.data !== undefined) {\n authDataCache.setRefetching(stableCacheKey, true)\n }\n\n // Create the fetch promise\n const fetchPromise = queryFnRef.current()\n\n // Store the promise as in-flight\n authDataCache.setInFlightRequest(stableCacheKey, fetchPromise)\n\n try {\n const { data, error } = await fetchPromise\n\n if (error) {\n setError(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n } else {\n setError(null)\n }\n\n // Update cache with new data\n authDataCache.set(stableCacheKey, data)\n } catch (err) {\n const error = err as FetchError\n setError(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n } finally {\n authDataCache.setRefetching(stableCacheKey, false)\n authDataCache.removeInFlightRequest(stableCacheKey)\n }\n }, [stableCacheKey, toast, localization, cacheEntry])\n\n useEffect(() => {\n const currentUserId = sessionData?.user?.id\n\n if (!sessionData) {\n // Clear cache when session is lost\n authDataCache.setRefetching(stableCacheKey, false)\n authDataCache.clear(stableCacheKey)\n initialized.current = false\n previousUserId.current = undefined\n return\n }\n\n // Check if user ID has changed\n const userIdChanged =\n previousUserId.current !== undefined &&\n previousUserId.current !== currentUserId\n\n // If user changed, clear cache to ensure isPending becomes true\n if (userIdChanged) {\n authDataCache.clear(stableCacheKey)\n }\n\n // If we have cached data, we're not pending anymore\n const hasCachedData = cacheEntry?.data !== undefined\n\n // Check if data is stale\n const isStale =\n !cacheEntry || Date.now() - cacheEntry.timestamp > staleTime\n\n if (\n !initialized.current ||\n !hasCachedData ||\n userIdChanged ||\n (hasCachedData && isStale)\n ) {\n // Only fetch if we don't have data or if the data is stale\n if (!hasCachedData || isStale) {\n initialized.current = true\n refetch()\n }\n }\n\n // Update the previous user ID\n previousUserId.current = currentUserId\n }, [\n sessionData,\n sessionData?.user?.id,\n stableCacheKey,\n refetch,\n cacheEntry,\n staleTime\n ])\n\n // Determine if we're in a pending state\n // We're only pending if:\n // 1. Session is still loading, OR\n // 2. We have no cached data and no error\n const isPending =\n sessionPending || (cacheEntry?.data === undefined && !error)\n\n return {\n data: cacheEntry?.data ?? null,\n isPending,\n isRefetching: cacheEntry?.isRefetching ?? false,\n error,\n refetch\n }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-authenticate.json b/public/r/use-authenticate.json new file mode 100644 index 00000000..ec054d85 --- /dev/null +++ b/public/r/use-authenticate.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-authenticate", + "type": "registry:hook", + "title": "Use Authenticate", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-authenticate.ts", + "content": "import { useContext, useEffect } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport type { AuthViewPath } from \"../server\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\n\ninterface AuthenticateOptions {\n authClient?: TAuthClient\n authView?: AuthViewPath\n enabled?: boolean\n}\n\nexport function useAuthenticate(\n options?: AuthenticateOptions\n) {\n type Session = TAuthClient[\"$Infer\"][\"Session\"][\"session\"]\n type User = TAuthClient[\"$Infer\"][\"Session\"][\"user\"]\n\n const { authView = \"SIGN_IN\", enabled = true } = options ?? {}\n\n const {\n hooks: { useSession },\n basePath,\n viewPaths,\n replace\n } = useContext(AuthUIContext)\n\n const { data, isPending, error, refetch } = useSession()\n const sessionData = data as\n | {\n session: Session\n user: User\n }\n | null\n | undefined\n\n useEffect(() => {\n if (!enabled || isPending || sessionData) return\n\n replace(\n `${basePath}/${viewPaths[authView]}?redirectTo=${window.location.href.replace(window.location.origin, \"\")}`\n )\n }, [\n isPending,\n sessionData,\n basePath,\n viewPaths,\n replace,\n authView,\n enabled\n ])\n\n return {\n data: sessionData,\n user: sessionData?.user,\n isPending,\n error,\n refetch\n }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-captcha.json b/public/r/use-captcha.json new file mode 100644 index 00000000..50f16dab --- /dev/null +++ b/public/r/use-captcha.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-captcha", + "type": "registry:hook", + "title": "Use Captcha", + "description": "", + "dependencies": [ + "@hcaptcha/react-hcaptcha", + "@marsidev/react-turnstile", + "@wojtekmaj/react-recaptcha-v3", + "react-google-recaptcha" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-captcha.tsx", + "content": "import type HCaptcha from \"@hcaptcha/react-hcaptcha\"\nimport type { TurnstileInstance } from \"@marsidev/react-turnstile\"\nimport { useGoogleReCaptcha } from \"@wojtekmaj/react-recaptcha-v3\"\nimport { type RefObject, useContext, useRef } from \"react\"\nimport type ReCAPTCHA from \"react-google-recaptcha\"\n\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\n\n// Default captcha endpoints\nconst DEFAULT_CAPTCHA_ENDPOINTS = [\n \"/sign-up/email\",\n \"/sign-in/email\",\n \"/forget-password\"\n]\n\n// Sanitize action name for reCAPTCHA\n// Google reCAPTCHA only allows A-Za-z/_ in action names\nconst sanitizeActionName = (action: string): string => {\n // First remove leading slash if present\n let result = action.startsWith(\"/\") ? action.substring(1) : action\n\n // Convert both kebab-case and path separators to camelCase\n // Example: \"/sign-in/email\" becomes \"signInEmail\"\n result = result\n .replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/\\/([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/\\//g, \"\")\n .replace(/[^A-Za-z0-9_]/g, \"\")\n\n return result\n}\n\nexport function useCaptcha({\n localization\n}: {\n localization: Partial\n}) {\n const { captcha, localization: contextLocalization } =\n useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n const captchaRef = useRef(null)\n const { executeRecaptcha } = useGoogleReCaptcha()\n\n const executeCaptcha = async (action: string) => {\n if (!captcha) throw new Error(localization.MISSING_RESPONSE)\n\n // Sanitize the action name for reCAPTCHA\n let response: string | undefined | null\n\n switch (captcha.provider) {\n case \"google-recaptcha-v3\": {\n const sanitizedAction = sanitizeActionName(action)\n response = await executeRecaptcha?.(sanitizedAction)\n break\n }\n case \"google-recaptcha-v2-checkbox\": {\n const recaptchaRef = captchaRef as RefObject\n response = recaptchaRef.current.getValue()\n break\n }\n case \"google-recaptcha-v2-invisible\": {\n const recaptchaRef = captchaRef as RefObject\n response = await recaptchaRef.current.executeAsync()\n break\n }\n case \"cloudflare-turnstile\": {\n const turnstileRef = captchaRef as RefObject\n response = turnstileRef.current.getResponse()\n break\n }\n case \"hcaptcha\": {\n const hcaptchaRef = captchaRef as RefObject\n response = hcaptchaRef.current.getResponse()\n break\n }\n }\n\n if (!response) {\n throw new Error(localization.MISSING_RESPONSE)\n }\n\n return response\n }\n\n const getCaptchaHeaders = async (action: string) => {\n if (!captcha) return undefined\n\n // Use custom endpoints if provided, otherwise use defaults\n const endpoints = captcha.endpoints || DEFAULT_CAPTCHA_ENDPOINTS\n\n // Only execute captcha if the action is in the endpoints list\n if (endpoints.includes(action)) {\n return { \"x-captcha-response\": await executeCaptcha(action) }\n }\n\n return undefined\n }\n\n const resetCaptcha = () => {\n if (!captcha) return\n\n switch (captcha.provider) {\n case \"google-recaptcha-v3\": {\n // No widget to reset; token is generated per execute call\n break\n }\n case \"google-recaptcha-v2-checkbox\":\n case \"google-recaptcha-v2-invisible\": {\n const recaptchaRef = captchaRef as RefObject\n recaptchaRef.current?.reset?.()\n break\n }\n case \"cloudflare-turnstile\": {\n const turnstileRef = captchaRef as RefObject\n // Some versions expose reset on the instance\n // biome-ignore lint/suspicious/noExplicitAny: defensive\n ;(turnstileRef.current as any)?.reset?.()\n break\n }\n case \"hcaptcha\": {\n const hcaptchaRef = captchaRef as RefObject\n // HCaptcha uses resetCaptcha()\n hcaptchaRef.current?.resetCaptcha?.()\n break\n }\n }\n }\n\n return {\n captchaRef,\n getCaptchaHeaders,\n resetCaptcha\n }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-conditional-query.json b/public/r/use-conditional-query.json new file mode 100644 index 00000000..9ea82306 --- /dev/null +++ b/public/r/use-conditional-query.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-conditional-query", + "type": "registry:lib", + "title": "Use Conditional Query", + "description": "", + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-conditional-query.ts", + "content": "import type {\n FetchResult,\n Models,\n SchemaQuery,\n SubscriptionOptions,\n SubscriptionSignalPayload,\n TriplitClient\n} from \"@triplit/client\"\nimport type { WorkerClient } from \"@triplit/client/worker-client\"\nimport { createStateSubscription } from \"@triplit/react\"\nimport { useCallback, useMemo, useState, useSyncExternalStore } from \"react\"\n\nexport function useConditionalQuery<\n M extends Models,\n Q extends SchemaQuery\n>(\n client: TriplitClient | WorkerClient,\n query?: Q | false | null | \"\" | 0,\n options?: Partial & { disabled?: boolean }\n) {\n const stringifiedQuery =\n !options?.disabled && query && JSON.stringify(query)\n const localOnly = !!options?.localOnly\n const [remoteFulfilled, setRemoteFulfilled] = useState(false)\n\n const defaultValue: SubscriptionSignalPayload = {\n results: undefined,\n fetching: true,\n fetchingLocal: false,\n fetchingRemote: false,\n error: undefined\n }\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: prevent infinite re-renders\n const [subscribe, snapshot] = useMemo(\n () =>\n stringifiedQuery\n ? createStateSubscription(client, query, {\n ...options,\n onRemoteFulfilled: () => setRemoteFulfilled(true)\n })\n : [() => () => {}, () => defaultValue],\n [stringifiedQuery, localOnly]\n )\n\n const getServerSnapshot = useCallback(() => snapshot(), [snapshot])\n const { fetching, ...rest } = useSyncExternalStore(\n subscribe,\n snapshot,\n getServerSnapshot\n )\n return { fetching: fetching && !remoteFulfilled, ...rest }\n}\n\ntype useConditionalQueryOnePayload<\n M extends Models,\n Q extends SchemaQuery\n> = Omit, \"results\"> & {\n result: FetchResult\n}\n\nexport function useConditionalQueryOne<\n M extends Models,\n Q extends SchemaQuery\n>(\n client: TriplitClient | WorkerClient,\n query?: Q | false | null | \"\" | 0,\n options?: Partial & { disabled?: boolean }\n): useConditionalQueryOnePayload {\n const { fetching, fetchingLocal, fetchingRemote, results, error } =\n useConditionalQuery(\n client,\n query ? ({ ...query, limit: 1 } as Q) : query,\n options\n )\n\n const result = useMemo(() => {\n return results?.[0] ?? null\n }, [results])\n\n return { fetching, fetchingLocal, fetchingRemote, result, error }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-current-organization.json b/public/r/use-current-organization.json new file mode 100644 index 00000000..bb8ae23d --- /dev/null +++ b/public/r/use-current-organization.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-current-organization", + "type": "registry:hook", + "title": "Use Current Organization", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json" + ], + "files": [ + { + "path": "src/hooks/use-current-organization.ts", + "content": "import type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\nexport function useCurrentOrganization({\n slug: slugProp\n}: {\n slug?: string\n} = {}) {\n const {\n organization: organizationOptions,\n hooks: { useActiveOrganization, useListOrganizations }\n } = useContext(AuthUIContext)\n\n const { pathMode, slug: contextSlug } = organizationOptions || {}\n\n let data: Organization | null | undefined\n let isPending: boolean | undefined\n let isRefetching: boolean | undefined\n\n let refetch: (() => void) | undefined\n\n const {\n data: organizations,\n isPending: organizationsPending,\n isRefetching: organizationsRefetching\n } = useListOrganizations()\n\n if (pathMode === \"slug\") {\n const slug = slugProp || contextSlug\n\n data = organizations?.find((organization) => organization.slug === slug)\n isPending = organizationsPending\n isRefetching = organizationsRefetching\n } else {\n const {\n data: activeOrganization,\n isPending: organizationPending,\n isRefetching: organizationRefetching,\n refetch: refetchOrganization\n } = useActiveOrganization()\n\n refetch = refetchOrganization\n\n data = activeOrganization\n isPending = organizationPending\n isRefetching = organizationRefetching\n }\n\n return useMemo(\n () => ({\n data,\n isPending,\n isRefetching,\n refetch\n }),\n [data, isPending, isRefetching, refetch]\n )\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-hydrated.json b/public/r/use-hydrated.json new file mode 100644 index 00000000..7334e48c --- /dev/null +++ b/public/r/use-hydrated.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-hydrated", + "type": "registry:hook", + "title": "Use Hydrated", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-hydrated.ts", + "content": "import { useSyncExternalStore } from \"react\"\n\nfunction subscribe() {\n return () => {}\n}\n\nexport function useIsHydrated() {\n return useSyncExternalStore(\n subscribe,\n () => true,\n () => false\n )\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-instant-options.json b/public/r/use-instant-options.json new file mode 100644 index 00000000..8b3eaf10 --- /dev/null +++ b/public/r/use-instant-options.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-instant-options", + "type": "registry:lib", + "title": "Use Instant Options", + "description": "", + "dependencies": [ + "@instantdb/react", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/instantdb/use-instant-options.ts", + "content": "import type { InstantReactWebDatabase } from \"@instantdb/react\"\nimport type { User } from \"better-auth\"\nimport { useMemo } from \"react\"\n\nimport type { Session } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { AuthMutators } from \"../../types/auth-mutators\"\nimport type { Refetch } from \"../../types/refetch\"\nimport { getModelName } from \"./model-names\"\nimport { useListAccounts } from \"./use-list-accounts\"\nimport { useListSessions } from \"./use-list-sessions\"\nimport { useSession } from \"./use-session\"\n\nconst namespaces = [\"user\", \"session\", \"account\", \"passkey\"] as const\ntype Namespace = (typeof namespaces)[number]\n\ntype ModelNames = {\n [key in Namespace]: string\n}\n\nexport interface UseInstantOptionsProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n db: InstantReactWebDatabase\n modelNames?: Partial\n usePlural?: boolean\n sessionData?: { user: User; session: Session }\n refetch?: Refetch\n user?: { id: string } | null\n isPending: boolean\n}\n\nexport function useInstantOptions({\n db,\n usePlural = true,\n modelNames,\n sessionData,\n isPending,\n user\n}: UseInstantOptionsProps) {\n const userId = user?.id || sessionData?.user.id\n\n const hooks = useMemo(() => {\n return {\n useSession: () =>\n useSession({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListAccounts: () =>\n useListAccounts({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListSessions: () =>\n useListSessions({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n })\n } as AuthHooks\n }, [db, modelNames, usePlural, sessionData, isPending])\n\n const mutators = useMemo(() => {\n return {\n updateUser: async (data) => {\n if (!userId) {\n throw new Error(\"Unauthenticated\")\n }\n\n const modelName = getModelName({\n namespace: \"user\",\n modelNames,\n usePlural\n })\n\n db.transact([\n db.tx[modelName][userId].update({\n ...data,\n updatedAt: Date.now()\n })\n ])\n }\n } as AuthMutators\n }, [db, userId, modelNames, usePlural])\n\n return {\n hooks,\n mutators\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-lang.json b/public/r/use-lang.json new file mode 100644 index 00000000..5422b5c4 --- /dev/null +++ b/public/r/use-lang.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-lang", + "type": "registry:hook", + "title": "Use Lang", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-lang.ts", + "content": "import { useEffect, useState } from \"react\"\n\nexport function useLang() {\n const [lang, setLang] = useState()\n\n useEffect(() => {\n const checkLang = () => {\n const currentLang = document.documentElement.getAttribute(\"lang\")\n setLang(currentLang ?? undefined)\n }\n\n // Initial check\n checkLang()\n\n // Listen for changes to lang attribute on html tag\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.attributeName === \"lang\") {\n checkLang()\n }\n }\n })\n\n observer.observe(document.documentElement, { attributes: true })\n\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return { lang }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-list-accounts.json b/public/r/use-list-accounts.json new file mode 100644 index 00000000..5f2a8800 --- /dev/null +++ b/public/r/use-list-accounts.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-list-accounts", + "type": "registry:lib", + "title": "Use List Accounts", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-accounts.ts", + "content": "import { useMemo } from \"react\"\n\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQuery } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useListAccounts({\n triplit,\n modelNames,\n usePlural,\n isPending\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"account\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const { results, error, fetching } = useConditionalQuery(\n triplit,\n payload?.sub && triplit.query(modelName)\n )\n\n const accounts = useMemo(() => {\n return results?.map((account) => ({\n accountId: account.accountId as string,\n provider: account.providerId as string\n }))\n }, [results])\n\n return {\n data: accounts,\n isPending: isPending || fetching,\n error\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-list-sessions.json b/public/r/use-list-sessions.json new file mode 100644 index 00000000..55b22ded --- /dev/null +++ b/public/r/use-list-sessions.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-list-sessions", + "type": "registry:lib", + "title": "Use List Sessions", + "description": "", + "dependencies": [ + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-list-sessions.ts", + "content": "import type { Session } from \"better-auth\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQuery } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useListSessions({\n triplit,\n modelNames,\n usePlural,\n isPending\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"session\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const {\n results: sessions,\n error,\n fetching\n } = useConditionalQuery(triplit, payload?.sub && triplit.query(modelName))\n\n return {\n data: sessions as Session[] | undefined,\n isPending: isPending || fetching,\n error\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-session.json b/public/r/use-session.json new file mode 100644 index 00000000..5b4c6202 --- /dev/null +++ b/public/r/use-session.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-session", + "type": "registry:lib", + "title": "Use Session", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/model-names.json", + "http://localhost:3000/r/use-conditional-query.json", + "http://localhost:3000/r/use-triplit-hooks.json", + "http://localhost:3000/r/use-triplit-token.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-session.ts", + "content": "import type { User } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQueryOne } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useSession({\n triplit,\n sessionData,\n isPending,\n refetch,\n usePlural,\n modelNames\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"user\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const { result: user, error } = useConditionalQueryOne(\n triplit,\n payload?.sub && triplit.query(modelName)\n )\n\n return {\n data: sessionData\n ? {\n session: sessionData.session,\n user: (sessionData?.user.id === user?.id\n ? user\n : sessionData.user) as User\n }\n : null,\n error,\n isPending: isPending,\n refetch: refetch || (() => {})\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-success-transition.json b/public/r/use-success-transition.json new file mode 100644 index 00000000..e22e2c2f --- /dev/null +++ b/public/r/use-success-transition.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-success-transition", + "type": "registry:hook", + "title": "Use Success Transition", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/hooks/use-success-transition.ts", + "content": "import {\n useCallback,\n useContext,\n useEffect,\n useState,\n useTransition\n} from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getSearchParam } from \"../lib/utils\"\n\nexport function useOnSuccessTransition({\n redirectTo: redirectToProp\n}: {\n redirectTo?: string\n}) {\n const { redirectTo: contextRedirectTo } = useContext(AuthUIContext)\n\n const getRedirectTo = useCallback(\n () =>\n redirectToProp || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectToProp, contextRedirectTo]\n )\n\n const [isPending, startTransition] = useTransition()\n const [success, setSuccess] = useState(false)\n\n const {\n navigate,\n hooks: { useSession },\n onSessionChange\n } = useContext(AuthUIContext)\n\n const { refetch: refetchSession } = useSession()\n\n useEffect(() => {\n if (!success || isPending) return\n\n startTransition(() => {\n navigate(getRedirectTo())\n })\n }, [success, isPending, navigate, getRedirectTo])\n\n const onSuccess = useCallback(async () => {\n await refetchSession?.()\n setSuccess(true)\n\n if (onSessionChange) startTransition(onSessionChange)\n }, [refetchSession, onSessionChange])\n\n return { onSuccess, isPending }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-tanstack-options.json b/public/r/use-tanstack-options.json new file mode 100644 index 00000000..24c12d8e --- /dev/null +++ b/public/r/use-tanstack-options.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-tanstack-options", + "type": "registry:lib", + "title": "Use Tanstack Options", + "description": "", + "dependencies": [ + "@daveyplate/better-auth-tanstack", + "@tanstack/react-query" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/auth-mutators.json" + ], + "files": [ + { + "path": "src/lib/tanstack/use-tanstack-options.ts", + "content": "import {\n AuthQueryContext,\n createAuthHooks\n} from \"@daveyplate/better-auth-tanstack\"\nimport { useIsRestoring, useQueryClient } from \"@tanstack/react-query\"\nimport { useCallback, useContext, useMemo } from \"react\"\n\nimport type { AnyAuthClient } from \"../../types/any-auth-client\"\nimport type { AuthClient } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { AuthMutators } from \"../../types/auth-mutators\"\n\nexport function useTanstackOptions({\n authClient\n}: {\n authClient: AnyAuthClient\n}) {\n const {\n useUnlinkAccount,\n useUpdateUser,\n useDeletePasskey,\n useRevokeSession,\n useRevokeDeviceSession,\n useSetActiveSession\n } = createAuthHooks(authClient)\n const queryClient = useQueryClient()\n\n const { mutateAsync: updateUserAsync } = useUpdateUser()\n const { mutateAsync: deletePasskeyAsync } = useDeletePasskey()\n const { mutateAsync: unlinkAccountAsync } = useUnlinkAccount()\n const { mutateAsync: revokeSessionAsync } = useRevokeSession()\n const { mutateAsync: revokeDeviceSessionAsync } = useRevokeDeviceSession()\n const { setActiveSessionAsync } = useSetActiveSession()\n const { sessionKey } = useContext(AuthQueryContext)\n\n const hooks = useMemo(\n () => ({\n ...(createAuthHooks(\n authClient as AuthClient\n ) as Partial),\n useIsRestoring\n }),\n [authClient]\n )\n\n const mutators = useMemo(\n () =>\n ({\n updateUser: async (params) => {\n const { error } = await updateUserAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n unlinkAccount: async (params) => {\n const { error } = await unlinkAccountAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n deletePasskey: async (params) => {\n const { error } = await deletePasskeyAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n revokeSession: async (params) => {\n const { error } = await revokeSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n setActiveSession: async (params) => {\n const { error } = await setActiveSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n revokeDeviceSession: async (params) => {\n const { error } = await revokeDeviceSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n }\n }) as AuthMutators,\n [\n updateUserAsync,\n deletePasskeyAsync,\n unlinkAccountAsync,\n revokeSessionAsync,\n revokeDeviceSessionAsync,\n setActiveSessionAsync\n ]\n )\n\n const onSessionChange = useCallback(async () => {\n await queryClient.refetchQueries({ queryKey: sessionKey })\n\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey !== sessionKey\n })\n }, [queryClient, sessionKey])\n\n return {\n hooks,\n mutators,\n onSessionChange,\n optimistic: true\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-theme.json b/public/r/use-theme.json new file mode 100644 index 00000000..92064415 --- /dev/null +++ b/public/r/use-theme.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-theme", + "type": "registry:hook", + "title": "Use Theme", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/hooks/use-theme.ts", + "content": "import { useEffect, useState } from \"react\"\n\nexport function useTheme() {\n const [theme, setTheme] = useState<\"light\" | \"dark\">(\"light\")\n\n useEffect(() => {\n const checkTheme = () => {\n const isDark =\n document.documentElement.classList.contains(\"dark\") ||\n document.documentElement\n .getAttribute(\"style\")\n ?.includes(\"color-scheme: dark\")\n setTheme(isDark ? \"dark\" : \"light\")\n }\n\n // Initial check\n checkTheme()\n\n // Listen for changes to html tag\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.attributeName === \"style\" ||\n mutation.attributeName === \"class\"\n ) {\n checkTheme()\n }\n }\n })\n\n observer.observe(document.documentElement, { attributes: true })\n\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return { theme }\n}\n", + "type": "registry:hook" + } + ] +} \ No newline at end of file diff --git a/public/r/use-triplit-hooks.json b/public/r/use-triplit-hooks.json new file mode 100644 index 00000000..89b08351 --- /dev/null +++ b/public/r/use-triplit-hooks.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-triplit-hooks", + "type": "registry:lib", + "title": "Use Triplit Hooks", + "description": "", + "dependencies": [ + "@triplit/client", + "better-auth" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-hooks.json", + "http://localhost:3000/r/refetch.json", + "http://localhost:3000/r/use-list-accounts.json", + "http://localhost:3000/r/use-list-sessions.json", + "http://localhost:3000/r/use-session.json" + ], + "files": [ + { + "path": "src/lib/triplit/use-triplit-hooks.ts", + "content": "import type { TriplitClient } from \"@triplit/client\"\nimport type { User } from \"better-auth\"\nimport { useMemo } from \"react\"\n\nimport type { Session } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { Refetch } from \"../../types/refetch\"\nimport { useListAccounts } from \"./use-list-accounts\"\nimport { useListSessions } from \"./use-list-sessions\"\nimport { useSession } from \"./use-session\"\n\nconst namespaces = [\"user\", \"session\", \"account\", \"passkey\"] as const\ntype Namespace = (typeof namespaces)[number]\n\ntype ModelNames = {\n [key in Namespace]: string\n}\n\nexport interface UseTriplitOptionsProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n triplit: TriplitClient\n modelNames?: Partial\n usePlural?: boolean\n sessionData?: { user: User; session: Session } | null\n refetch?: Refetch\n isPending: boolean\n}\n\nexport function useTriplitHooks({\n triplit,\n usePlural = true,\n modelNames,\n sessionData,\n isPending\n}: UseTriplitOptionsProps) {\n const hooks = useMemo(() => {\n return {\n useSession: () =>\n useSession({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListAccounts: () =>\n useListAccounts({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListSessions: () =>\n useListSessions({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n })\n } as AuthHooks\n }, [triplit, modelNames, usePlural, sessionData, isPending])\n\n return {\n hooks\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/use-triplit-token.json b/public/r/use-triplit-token.json new file mode 100644 index 00000000..a463ce9e --- /dev/null +++ b/public/r/use-triplit-token.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "use-triplit-token", + "type": "registry:lib", + "title": "Use Triplit Token", + "description": "", + "dependencies": [ + "@triplit/client", + "@triplit/react" + ], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/triplit/use-triplit-token.ts", + "content": "import type { TriplitClient } from \"@triplit/client\"\nimport { useConnectionStatus } from \"@triplit/react\"\nimport { useMemo } from \"react\"\n\nexport function useTriplitToken(triplit: TriplitClient) {\n const connectionStatus = useConnectionStatus(triplit)\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: update when connection status changes\n const payload = useMemo(\n () =>\n triplit.token\n ? (decodeJWT(triplit.token) as Record & {\n exp: number\n iat: number\n sub?: string\n email?: string\n name?: string\n })\n : undefined,\n [connectionStatus]\n )\n\n return { token: payload && triplit.token, payload }\n}\n\nfunction decodeJWT(token: string) {\n try {\n const base64Url = token.split(\".\")[1]\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\")\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((char) => {\n return `%${(`00${char.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(\"\")\n )\n\n return JSON.parse(jsonPayload)\n } catch (error) {\n console.error(\"Failed to decode JWT:\", error)\n return null\n }\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/user-avatar.json b/public/r/user-avatar.json new file mode 100644 index 00000000..fd4191f0 --- /dev/null +++ b/public/r/user-avatar.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-avatar", + "type": "registry:component", + "title": "User Avatar", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "avatar", + "http://localhost:3000/r/gravatar-utils.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-avatar.tsx", + "content": "\"use client\"\n\nimport { UserRoundIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\n\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getGravatarUrl } from \"../lib/gravatar-utils\"\nimport { cn } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { Profile } from \"../types/profile\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\"\nimport { Skeleton } from \"./ui/skeleton\"\n\nexport interface UserAvatarClassNames {\n base?: string\n image?: string\n fallback?: string\n fallbackIcon?: string\n skeleton?: string\n}\n\nexport interface UserAvatarProps {\n classNames?: UserAvatarClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\" | null\n user?: Profile | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: Partial\n}\n\n/**\n * Displays a user avatar with image and fallback support\n *\n * Renders a user's avatar image when available, with appropriate fallbacks:\n * - Shows a skeleton when isPending is true\n * - Displays first two characters of user's name when no image is available\n * - Falls back to a generic user icon when neither image nor name is available\n */\nexport function UserAvatar({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization,\n ...props\n}: UserAvatarProps & ComponentProps) {\n const {\n localization: contextLocalization,\n gravatar,\n avatar\n } = useContext(AuthUIContext)\n\n const localization = { ...contextLocalization, ...propLocalization }\n\n const name =\n user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email\n const userImage = user?.image || user?.avatar || user?.avatarUrl\n\n // Calculate gravatar URL synchronously\n const gravatarUrl =\n gravatar && user?.email\n ? getGravatarUrl(\n user.email,\n gravatar === true ? undefined : gravatar\n )\n : null\n\n const src = gravatar ? gravatarUrl : userImage\n\n if (isPending) {\n return (\n \n )\n }\n\n return (\n \n {avatar?.Image ? (\n \n ) : (\n \n )}\n\n \n {firstTwoCharacters(name) || (\n \n )}\n \n \n )\n}\n\nconst firstTwoCharacters = (name?: string | null) => name?.slice(0, 2)\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/user-button.json b/public/r/user-button.json new file mode 100644 index 00000000..44bab9da --- /dev/null +++ b/public/r/user-button.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-button", + "type": "registry:component", + "title": "User Button", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/any-auth-client.json", + "http://localhost:3000/r/auth-client.json", + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "dropdown-menu", + "http://localhost:3000/r/use-hydrated.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/user-view.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-button.tsx", + "content": "\"use client\"\nimport {\n ChevronsUpDown,\n LogInIcon,\n LogOutIcon,\n PlusCircleIcon,\n SettingsIcon,\n UserRoundPlus\n} from \"lucide-react\"\nimport {\n type ComponentProps,\n Fragment,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport { useIsHydrated } from \"../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\nimport type { User } from \"../types/auth-client\"\nimport { Button } from \"./ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"./ui/dropdown-menu\"\nimport { UserAvatar, type UserAvatarClassNames } from \"./user-avatar\"\nimport { UserView, type UserViewClassNames } from \"./user-view\"\n\nexport interface UserButtonClassNames {\n base?: string\n skeleton?: string\n trigger?: {\n base?: string\n avatar?: UserAvatarClassNames\n user?: UserViewClassNames\n skeleton?: string\n }\n content?: {\n base?: string\n user?: UserViewClassNames\n avatar?: UserAvatarClassNames\n menuItem?: string\n separator?: string\n }\n}\n\nexport interface UserButtonProps {\n className?: string\n classNames?: UserButtonClassNames\n align?: \"center\" | \"start\" | \"end\"\n additionalLinks?: {\n href: string\n icon?: ReactNode\n label: ReactNode\n signedIn?: boolean\n separator?: boolean\n }[]\n trigger?: ReactNode\n disableDefaultLinks?: boolean\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays an interactive user button with dropdown menu functionality\n *\n * Renders a user interface element that can be displayed as either an icon or full button:\n * - Shows a user avatar or placeholder when in icon mode\n * - Displays user name and email with dropdown indicator in full mode\n * - Provides dropdown menu with authentication options (sign in/out, settings, etc.)\n * - Supports multi-session functionality for switching between accounts\n * - Can be customized with additional links and styling options\n */\nexport function UserButton({\n className,\n classNames,\n align,\n trigger,\n additionalLinks,\n disableDefaultLinks,\n localization: propLocalization,\n size,\n ...props\n}: UserButtonProps & ComponentProps) {\n const {\n basePath,\n hooks: { useSession, useListDeviceSessions },\n mutators: { setActiveSession },\n localization: contextLocalization,\n multiSession,\n account: accountOptions,\n signUp,\n toast,\n viewPaths,\n onSessionChange,\n Link\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n let deviceSessions:\n | AnyAuthClient[\"$Infer\"][\"Session\"][]\n | undefined\n | null = null\n let deviceSessionsPending = false\n\n if (multiSession) {\n const { data, isPending } = useListDeviceSessions()\n deviceSessions = data\n deviceSessionsPending = isPending\n }\n\n const { data: sessionData, isPending: sessionPending } = useSession()\n const user = sessionData?.user\n const [activeSessionPending, setActiveSessionPending] = useState(false)\n\n const isHydrated = useIsHydrated()\n const isPending = sessionPending || activeSessionPending || !isHydrated\n\n const switchAccount = useCallback(\n async (sessionToken: string) => {\n setActiveSessionPending(true)\n\n try {\n await setActiveSession({ sessionToken })\n\n onSessionChange?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n setActiveSessionPending(false)\n }\n },\n [setActiveSession, onSessionChange, toast, localization]\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (!multiSession) return\n\n setActiveSessionPending(false)\n }, [sessionData, multiSession])\n\n const warningLogged = useRef(false)\n\n useEffect(() => {\n if (size || warningLogged.current) return\n\n console.warn(\n \"[Better Auth UI] The `size` prop of `UserButton` no longer defaults to `icon`. Please pass `size='icon'` to the `UserButton` component to get the same behaviour as before. This warning will be removed in a future release. It can be suppressed in the meantime by defining the `size` prop.\"\n )\n\n warningLogged.current = true\n }, [size])\n\n return (\n \n \n {trigger ||\n (size === \"icon\" ? (\n \n \n \n ) : (\n \n \n\n \n \n ))}\n \n\n e.preventDefault()}\n >\n
\n {(user && !(user as User).isAnonymous) || isPending ? (\n \n ) : (\n
\n {localization.ACCOUNT}\n
\n )}\n
\n\n \n\n {additionalLinks?.map(\n ({ href, icon, label, signedIn, separator }, index) =>\n (signedIn === undefined ||\n (signedIn && !!sessionData) ||\n (!signedIn && !sessionData)) && (\n \n \n \n {icon}\n {label}\n \n \n {separator && (\n \n )}\n \n )\n )}\n\n {!user || (user as User).isAnonymous ? (\n <>\n \n \n \n\n {localization.SIGN_IN}\n \n \n\n {signUp && (\n \n \n \n\n {localization.SIGN_UP}\n \n \n )}\n \n ) : (\n <>\n {!disableDefaultLinks && accountOptions && (\n \n \n \n\n {localization.SETTINGS}\n \n \n )}\n\n \n \n \n\n {localization.SIGN_OUT}\n \n \n \n )}\n\n {user && multiSession && (\n <>\n \n\n {!deviceSessions && deviceSessionsPending && (\n <>\n \n \n \n\n \n \n )}\n\n {deviceSessions\n ?.filter(\n (sessionData) =>\n sessionData.user.id !== user?.id\n )\n .map(({ session, user }) => (\n \n \n switchAccount(session.token)\n }\n >\n \n \n\n \n \n ))}\n\n \n \n \n\n {localization.ADD_ACCOUNT}\n \n \n \n )}\n \n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/user-invitations-card.json b/public/r/user-invitations-card.json new file mode 100644 index 00000000..b01ea9be --- /dev/null +++ b/public/r/user-invitations-card.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-invitations-card", + "type": "registry:component", + "title": "User Invitations Card", + "description": "", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-ui-provider.json", + "button", + "card", + "dropdown-menu", + "http://localhost:3000/r/settings-card.json", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/organization/user-invitations-card.tsx", + "content": "\"use client\"\n\nimport { CheckIcon, EllipsisIcon, Loader2, XIcon } from \"lucide-react\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card, CardContent } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { UserAvatar } from \"../user-avatar\"\n\nexport function UserInvitationsCard({\n className,\n classNames,\n localization: localizationProp,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useListUserInvitations, useListOrganizations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: invitations, refetch: refetchInvitations } =\n useListUserInvitations()\n const { refetch: refetchOrganizations } = useListOrganizations()\n\n const handleRefresh = async () => {\n await refetchInvitations?.()\n await refetchOrganizations?.()\n }\n\n const pendingInvitations = invitations?.filter(\n (invitation) => invitation.status === \"pending\"\n )\n\n if (!pendingInvitations?.length) return null\n\n return (\n \n \n {pendingInvitations.map((invitation) => (\n \n ))}\n \n \n )\n}\n\nfunction UserInvitationRow({\n classNames,\n invitation,\n onChanged\n}: {\n classNames?: SettingsCardProps[\"classNames\"]\n invitation: {\n id: string\n email: string\n role: string\n status: string\n expiresAt: Date\n }\n onChanged?: () => unknown\n}) {\n const {\n authClient,\n organization: organizationOptions,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = contextLocalization\n\n const [isLoading, setIsLoading] = useState(false)\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organizationOptions?.customRoles || [])]\n const role = roles.find((r) => r.role === invitation.role)\n\n const handleAccept = async () => {\n setIsLoading(true)\n\n try {\n await authClient.organization.acceptInvitation({\n invitationId: invitation.id,\n fetchOptions: { throw: true }\n })\n\n await onChanged?.()\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_ACCEPTED\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n const handleReject = async () => {\n setIsLoading(true)\n\n try {\n await authClient.organization.rejectInvitation({\n invitationId: invitation.id,\n fetchOptions: { throw: true }\n })\n\n await onChanged?.()\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_REJECTED\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n return (\n \n
\n \n\n
\n \n {invitation.email}\n \n\n \n {localization.EXPIRES}{\" \"}\n {invitation.expiresAt.toLocaleDateString()}\n \n
\n
\n\n {role?.label}\n\n
\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n\n e.preventDefault()}\n >\n \n \n\n {localization.ACCEPT}\n \n\n \n \n\n {localization.REJECT}\n \n \n \n
\n
\n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/user-view.json b/public/r/user-view.json new file mode 100644 index 00000000..6c432bd2 --- /dev/null +++ b/public/r/user-view.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "user-view", + "type": "registry:component", + "title": "User View", + "description": "", + "dependencies": [], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/auth-ui-provider.json", + "http://localhost:3000/r/profile.json", + "skeleton", + "http://localhost:3000/r/user-avatar.json", + "http://localhost:3000/r/utils.json" + ], + "files": [ + { + "path": "src/components/user-view.tsx", + "content": "\"use client\"\n\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { cn } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { Profile } from \"../types/profile\"\nimport { Skeleton } from \"./ui/skeleton\"\nimport { UserAvatar, type UserAvatarClassNames } from \"./user-avatar\"\n\nexport interface UserViewClassNames {\n base?: string\n avatar?: UserAvatarClassNames\n content?: string\n title?: string\n subtitle?: string\n skeleton?: string\n}\n\nexport interface UserViewProps {\n className?: string\n classNames?: UserViewClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | null\n user?: Profile | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays user information with avatar and details in a compact view\n *\n * Renders a user's profile information with appropriate fallbacks:\n * - Shows avatar alongside user name and email when available\n * - Shows loading skeletons when isPending is true\n * - Falls back to generic \"User\" text when neither name nor email is available\n * - Supports customization through classNames prop\n */\nexport function UserView({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization\n}: UserViewProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n return (\n \n \n\n \n {isPending ? (\n <>\n \n {size !== \"sm\" && (\n \n )}\n \n ) : (\n <>\n \n {user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email ||\n localization?.USER}\n \n\n {!user?.isAnonymous &&\n size !== \"sm\" &&\n (user?.name || user?.username) && (\n \n {user?.email}\n \n )}\n \n )}\n \n \n )\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/username-error-codes.json b/public/r/username-error-codes.json new file mode 100644 index 00000000..7a59c99c --- /dev/null +++ b/public/r/username-error-codes.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "username-error-codes", + "type": "registry:file", + "title": "Username Error Codes", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/localization/username-error-codes.ts", + "content": "export const USERNAME_ERROR_CODES = {\n INVALID_USERNAME_OR_PASSWORD: \"invalid username or password\",\n EMAIL_NOT_VERIFIED: \"email not verified\",\n UNEXPECTED_ERROR: \"unexpected error\",\n USERNAME_IS_ALREADY_TAKEN: \"username is already taken. please try another.\",\n USERNAME_TOO_SHORT: \"username is too short\",\n USERNAME_TOO_LONG: \"username is too long\",\n INVALID_USERNAME: \"username is invalid\"\n}\n", + "type": "registry:file", + "target": "localization/username-error-codes.ts" + } + ] +} \ No newline at end of file diff --git a/public/r/utils.json b/public/r/utils.json new file mode 100644 index 00000000..0d42bca3 --- /dev/null +++ b/public/r/utils.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "utils", + "type": "registry:lib", + "title": "Utils", + "description": "", + "dependencies": [ + "clsx", + "tailwind-merge", + "zod" + ], + "registryDependencies": [ + "http://localhost:3000/r/auth-localization.json", + "http://localhost:3000/r/password-validation.json" + ], + "files": [ + { + "path": "src/lib/utils.ts", + "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport * as z from \"zod\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { PasswordValidation } from \"../types/password-validation\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function isValidEmail(email: string) {\n const emailRegex: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n/**\n * Converts error codes from SNAKE_CASE to camelCase\n * Example: INVALID_TWO_FACTOR_COOKIE -> invalidTwoFactorCookie\n */\nexport function errorCodeToCamelCase(errorCode: string): string {\n return errorCode\n .toLowerCase()\n .replace(/_([a-z])/g, (_, char) => char.toUpperCase())\n}\n\n/**\n * Gets a localized error message from an error object\n */\nexport function getLocalizedError({\n error,\n localization\n}: {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n error: any\n localization?: Partial\n}) {\n if (typeof error === \"string\") {\n if (localization?.[error as keyof AuthLocalization])\n return localization[error as keyof AuthLocalization]\n }\n\n if (error?.error) {\n if (error.error.code) {\n const errorCode = error.error.code as keyof AuthLocalization\n if (localization?.[errorCode]) return localization[errorCode]\n }\n\n return (\n error.error.message ||\n error.error.code ||\n error.error.statusText ||\n localization?.REQUEST_FAILED\n )\n }\n\n return error?.message || localization?.REQUEST_FAILED || \"Request failed\"\n}\n\nexport function getSearchParam(paramName: string) {\n return typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(paramName)\n : null\n}\n\nexport function getViewByPath(viewPaths: T, path?: string) {\n for (const key in viewPaths) {\n if (viewPaths[key] === path) {\n return key\n }\n }\n}\n\nexport function getKeyByValue>(\n object: T,\n value?: T[keyof T]\n): keyof T | undefined {\n return (Object.keys(object) as Array).find(\n (key) => object[key] === value\n )\n}\n\nexport function getPasswordSchema(\n passwordValidation?: PasswordValidation,\n localization?: AuthLocalization\n) {\n let schema = z.string().min(1, {\n message: localization?.PASSWORD_REQUIRED\n })\n if (passwordValidation?.minLength) {\n schema = schema.min(passwordValidation.minLength, {\n message: localization?.PASSWORD_TOO_SHORT\n })\n }\n if (passwordValidation?.maxLength) {\n schema = schema.max(passwordValidation.maxLength, {\n message: localization?.PASSWORD_TOO_LONG\n })\n }\n if (passwordValidation?.regex) {\n schema = schema.regex(passwordValidation.regex, {\n message: localization?.INVALID_PASSWORD\n })\n }\n return schema\n}\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file diff --git a/public/r/view-paths.json b/public/r/view-paths.json new file mode 100644 index 00000000..26c4a0dc --- /dev/null +++ b/public/r/view-paths.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "view-paths", + "type": "registry:lib", + "title": "View Paths", + "description": "", + "dependencies": [], + "registryDependencies": [], + "files": [ + { + "path": "src/lib/view-paths.ts", + "content": "export const authViewPaths = {\n /** @default \"callback\" */\n CALLBACK: \"callback\",\n /** @default \"email-otp\" */\n EMAIL_OTP: \"email-otp\",\n /** @default \"forgot-password\" */\n FORGOT_PASSWORD: \"forgot-password\",\n /** @default \"magic-link\" */\n MAGIC_LINK: \"magic-link\",\n /** @default \"recover-account\" */\n RECOVER_ACCOUNT: \"recover-account\",\n /** @default \"reset-password\" */\n RESET_PASSWORD: \"reset-password\",\n /** @default \"sign-in\" */\n SIGN_IN: \"sign-in\",\n /** @default \"sign-out\" */\n SIGN_OUT: \"sign-out\",\n /** @default \"sign-up\" */\n SIGN_UP: \"sign-up\",\n /** @default \"two-factor\" */\n TWO_FACTOR: \"two-factor\"\n}\n\nexport type AuthViewPaths = typeof authViewPaths\n\n// Account-scoped views (signed-in user)\nexport const accountViewPaths = {\n /** @default \"settings\" */\n SETTINGS: \"settings\",\n /** @default \"security\" */\n SECURITY: \"security\",\n /** @default \"api-keys\" */\n API_KEYS: \"api-keys\",\n /** @default \"organizations\" */\n ORGANIZATIONS: \"organizations\",\n /** @default \"accept-invitation\" */\n ACCEPT_INVITATION: \"accept-invitation\"\n}\n\nexport type AccountViewPaths = typeof accountViewPaths\n\n// Organization-scoped views\nexport const organizationViewPaths = {\n /** @default \"settings\" */\n SETTINGS: \"settings\",\n /** @default \"members\" */\n MEMBERS: \"members\",\n /** @default \"api-keys\" */\n API_KEYS: \"api-keys\"\n}\n\nexport type OrganizationViewPaths = typeof organizationViewPaths\nexport type AuthViewPath = keyof AuthViewPaths\nexport type AccountViewPath = keyof AccountViewPaths\nexport type OrganizationViewPath = keyof OrganizationViewPaths\n", + "type": "registry:lib" + } + ] +} \ No newline at end of file From fa7b64577240506c7515b5a221178d5821a7db49 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:50:52 -0400 Subject: [PATCH 05/10] fix registry gen --- docs/public/r/accept-invitation-card.json | 12 +- docs/public/r/account-cell.json | 12 +- docs/public/r/account-options.json | 2 +- docs/public/r/account-settings-cards.json | 20 +- docs/public/r/account-view.json | 18 +- docs/public/r/accounts-card.json | 10 +- docs/public/r/alert.json | 2 +- docs/public/r/api-key-cell.json | 16 +- docs/public/r/api-key-delete-dialog.json | 14 +- docs/public/r/api-key-display-dialog.json | 8 +- docs/public/r/api-keys-card.json | 12 +- docs/public/r/auth-callback.json | 4 +- docs/public/r/auth-form.json | 28 +- docs/public/r/auth-hooks.json | 10 +- docs/public/r/auth-loading.json | 2 +- docs/public/r/auth-localization.json | 30 +- docs/public/r/auth-ui-provider-tanstack.json | 4 +- docs/public/r/auth-ui-provider.json | 44 +- docs/public/r/auth-view.json | 28 +- docs/public/r/avatar-options.json | 2 +- docs/public/r/avatar.json | 2 +- docs/public/r/backup-codes-dialog.json | 6 +- docs/public/r/button.json | 2 +- docs/public/r/captcha-options.json | 2 +- docs/public/r/captcha.json | 10 +- docs/public/r/card.json | 2 +- docs/public/r/change-email-card.json | 6 +- docs/public/r/change-password-card.json | 14 +- docs/public/r/checkbox.json | 2 +- docs/public/r/create-api-key-dialog.json | 16 +- docs/public/r/create-organization-dialog.json | 12 +- docs/public/r/credentials-options.json | 2 +- docs/public/r/delete-account-card.json | 8 +- docs/public/r/delete-account-dialog.json | 10 +- docs/public/r/delete-organization-card.json | 8 +- docs/public/r/delete-organization-dialog.json | 10 +- docs/public/r/dialog.json | 2 +- docs/public/r/drawer.json | 2 +- docs/public/r/dropdown-menu.json | 2 +- docs/public/r/email-otp-button.json | 10 +- docs/public/r/email-otp-form.json | 14 +- docs/public/r/email-template.json | 2 +- docs/public/r/forgot-password-form.json | 14 +- docs/public/r/form-error.json | 4 +- docs/public/r/form.json | 2 +- docs/public/r/generic-oauth-options.json | 4 +- docs/public/r/gravatar-utils.json | 2 +- docs/public/r/input-field-skeleton.json | 4 +- docs/public/r/input-otp.json | 2 +- docs/public/r/input.json | 2 +- docs/public/r/invitation-cell.json | 12 +- docs/public/r/invite-member-dialog.json | 8 +- docs/public/r/label.json | 2 +- docs/public/r/leave-organization-dialog.json | 10 +- docs/public/r/magic-link-button.json | 10 +- docs/public/r/magic-link-form.json | 14 +- docs/public/r/member-cell.json | 16 +- docs/public/r/one-tap.json | 8 +- docs/public/r/organization-cell-view.json | 8 +- docs/public/r/organization-cell.json | 12 +- .../r/organization-invitations-card.json | 10 +- docs/public/r/organization-logo-card.json | 18 +- docs/public/r/organization-logo.json | 6 +- docs/public/r/organization-members-card.json | 12 +- docs/public/r/organization-name-card.json | 8 +- docs/public/r/organization-options.json | 2 +- docs/public/r/organization-refetcher.json | 4 +- .../public/r/organization-settings-cards.json | 16 +- docs/public/r/organization-slug-card.json | 8 +- docs/public/r/organization-switcher.json | 22 +- docs/public/r/organization-view.json | 16 +- docs/public/r/organizations-card.json | 14 +- docs/public/r/passkey-button.json | 10 +- docs/public/r/passkey-cell.json | 10 +- docs/public/r/passkeys-card.json | 12 +- docs/public/r/password-input.json | 2 +- docs/public/r/personal-account-view.json | 8 +- docs/public/r/provider-button.json | 10 +- docs/public/r/provider-cell.json | 12 +- docs/public/r/providers-card.json | 16 +- docs/public/r/recaptcha-badge.json | 8 +- docs/public/r/recaptcha-v2.json | 8 +- docs/public/r/recaptcha-v3.json | 8 +- docs/public/r/recover-account-form.json | 10 +- docs/public/r/redirect-to-sign-in.json | 2 +- docs/public/r/redirect-to-sign-up.json | 2 +- docs/public/r/remove-member-dialog.json | 10 +- docs/public/r/reset-password-form.json | 12 +- docs/public/r/security-settings-cards.json | 20 +- docs/public/r/select.json | 2 +- docs/public/r/separator.json | 2 +- docs/public/r/session-cell.json | 10 +- docs/public/r/session-freshness-dialog.json | 8 +- docs/public/r/sessions-card.json | 12 +- docs/public/r/settings-action-button.json | 4 +- docs/public/r/settings-card-footer.json | 6 +- docs/public/r/settings-card-header.json | 4 +- docs/public/r/settings-card.json | 10 +- docs/public/r/settings-cell-skeleton.json | 4 +- docs/public/r/sign-in-form.json | 20 +- docs/public/r/sign-out.json | 4 +- docs/public/r/sign-up-form.json | 24 +- docs/public/r/signed-in.json | 2 +- docs/public/r/signed-out.json | 2 +- docs/public/r/skeleton.json | 2 +- docs/public/r/social-options.json | 2 +- docs/public/r/social-providers.json | 2 +- docs/public/r/tabs.json | 2 +- docs/public/r/textarea.json | 2 +- docs/public/r/two-factor-card.json | 10 +- docs/public/r/two-factor-form.json | 16 +- docs/public/r/two-factor-password-dialog.json | 10 +- docs/public/r/update-avatar-card.json | 16 +- docs/public/r/update-field-card.json | 10 +- docs/public/r/update-member-role-dialog.json | 10 +- docs/public/r/update-name-card.json | 6 +- docs/public/r/update-username-card.json | 8 +- docs/public/r/use-auth-data.json | 8 +- docs/public/r/use-authenticate.json | 4 +- docs/public/r/use-captcha.json | 4 +- docs/public/r/use-current-organization.json | 2 +- docs/public/r/use-instant-options.json | 16 +- docs/public/r/use-list-accounts.json | 10 +- docs/public/r/use-list-sessions.json | 10 +- docs/public/r/use-session.json | 12 +- docs/public/r/use-success-transition.json | 4 +- docs/public/r/use-tanstack-options.json | 8 +- docs/public/r/use-triplit-hooks.json | 12 +- docs/public/r/user-avatar.json | 10 +- docs/public/r/user-button.json | 16 +- docs/public/r/user-invitations-card.json | 8 +- docs/public/r/user-view.json | 10 +- docs/public/r/utils.json | 4 +- public/r/accept-invitation-card.json | 12 +- public/r/account-cell.json | 12 +- public/r/account-options.json | 2 +- public/r/account-settings-cards.json | 20 +- public/r/account-view.json | 18 +- public/r/accounts-card.json | 10 +- public/r/alert.json | 2 +- public/r/api-key-cell.json | 16 +- public/r/api-key-delete-dialog.json | 14 +- public/r/api-key-display-dialog.json | 8 +- public/r/api-keys-card.json | 12 +- public/r/auth-callback.json | 4 +- public/r/auth-form.json | 28 +- public/r/auth-hooks.json | 10 +- public/r/auth-loading.json | 2 +- public/r/auth-localization.json | 30 +- public/r/auth-ui-provider-tanstack.json | 4 +- public/r/auth-ui-provider.json | 44 +- public/r/auth-view.json | 28 +- public/r/avatar-options.json | 2 +- public/r/avatar.json | 2 +- public/r/backup-codes-dialog.json | 6 +- public/r/button.json | 2 +- public/r/captcha-options.json | 2 +- public/r/captcha.json | 10 +- public/r/card.json | 2 +- public/r/change-email-card.json | 6 +- public/r/change-password-card.json | 14 +- public/r/checkbox.json | 2 +- public/r/create-api-key-dialog.json | 16 +- public/r/create-organization-dialog.json | 12 +- public/r/credentials-options.json | 2 +- public/r/delete-account-card.json | 8 +- public/r/delete-account-dialog.json | 10 +- public/r/delete-organization-card.json | 8 +- public/r/delete-organization-dialog.json | 10 +- public/r/dialog.json | 2 +- public/r/drawer.json | 2 +- public/r/dropdown-menu.json | 2 +- public/r/email-otp-button.json | 10 +- public/r/email-otp-form.json | 14 +- public/r/email-template.json | 2 +- public/r/forgot-password-form.json | 14 +- public/r/form-error.json | 4 +- public/r/form.json | 2 +- public/r/generic-oauth-options.json | 4 +- public/r/gravatar-utils.json | 2 +- public/r/input-field-skeleton.json | 4 +- public/r/input-otp.json | 2 +- public/r/input.json | 2 +- public/r/invitation-cell.json | 12 +- public/r/invite-member-dialog.json | 8 +- public/r/label.json | 2 +- public/r/leave-organization-dialog.json | 10 +- public/r/magic-link-button.json | 10 +- public/r/magic-link-form.json | 14 +- public/r/member-cell.json | 16 +- public/r/one-tap.json | 8 +- public/r/organization-cell-view.json | 8 +- public/r/organization-cell.json | 12 +- public/r/organization-invitations-card.json | 10 +- public/r/organization-logo-card.json | 18 +- public/r/organization-logo.json | 6 +- public/r/organization-members-card.json | 12 +- public/r/organization-name-card.json | 8 +- public/r/organization-options.json | 2 +- public/r/organization-refetcher.json | 4 +- public/r/organization-settings-cards.json | 16 +- public/r/organization-slug-card.json | 8 +- public/r/organization-switcher.json | 22 +- public/r/organization-view.json | 16 +- public/r/organizations-card.json | 14 +- public/r/passkey-button.json | 10 +- public/r/passkey-cell.json | 10 +- public/r/passkeys-card.json | 12 +- public/r/password-input.json | 2 +- public/r/personal-account-view.json | 8 +- public/r/provider-button.json | 10 +- public/r/provider-cell.json | 12 +- public/r/providers-card.json | 16 +- public/r/recaptcha-badge.json | 8 +- public/r/recaptcha-v2.json | 8 +- public/r/recaptcha-v3.json | 8 +- public/r/recover-account-form.json | 10 +- public/r/redirect-to-sign-in.json | 2 +- public/r/redirect-to-sign-up.json | 2 +- public/r/remove-member-dialog.json | 10 +- public/r/reset-password-form.json | 12 +- public/r/security-settings-cards.json | 20 +- public/r/select.json | 2 +- public/r/separator.json | 2 +- public/r/session-cell.json | 10 +- public/r/session-freshness-dialog.json | 8 +- public/r/sessions-card.json | 12 +- public/r/settings-action-button.json | 4 +- public/r/settings-card-footer.json | 6 +- public/r/settings-card-header.json | 4 +- public/r/settings-card.json | 10 +- public/r/settings-cell-skeleton.json | 4 +- public/r/sign-in-form.json | 20 +- public/r/sign-out.json | 4 +- public/r/sign-up-form.json | 24 +- public/r/signed-in.json | 2 +- public/r/signed-out.json | 2 +- public/r/skeleton.json | 2 +- public/r/social-options.json | 2 +- public/r/social-providers.json | 2 +- public/r/tabs.json | 2 +- public/r/textarea.json | 2 +- public/r/two-factor-card.json | 10 +- public/r/two-factor-form.json | 16 +- public/r/two-factor-password-dialog.json | 10 +- public/r/update-avatar-card.json | 16 +- public/r/update-field-card.json | 10 +- public/r/update-member-role-dialog.json | 10 +- public/r/update-name-card.json | 6 +- public/r/update-username-card.json | 8 +- public/r/use-auth-data.json | 8 +- public/r/use-authenticate.json | 4 +- public/r/use-captcha.json | 4 +- public/r/use-current-organization.json | 2 +- public/r/use-instant-options.json | 16 +- public/r/use-list-accounts.json | 10 +- public/r/use-list-sessions.json | 10 +- public/r/use-session.json | 12 +- public/r/use-success-transition.json | 4 +- public/r/use-tanstack-options.json | 8 +- public/r/use-triplit-hooks.json | 12 +- public/r/user-avatar.json | 10 +- public/r/user-button.json | 16 +- public/r/user-invitations-card.json | 8 +- public/r/user-view.json | 10 +- public/r/utils.json | 4 +- registry.json | 1220 ++++++++--------- registry/registry.json | 1220 ++++++++--------- scripts/generate.mjs | 1 - 269 files changed, 2420 insertions(+), 2421 deletions(-) diff --git a/docs/public/r/accept-invitation-card.json b/docs/public/r/accept-invitation-card.json index 6ef5610c..f1a1b1a6 100644 --- a/docs/public/r/accept-invitation-card.json +++ b/docs/public/r/accept-invitation-card.json @@ -8,15 +8,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", + "true/organization-cell-view.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-authenticate.json", - "http://localhost:3000/r/utils.json" + "true/use-authenticate.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/account-cell.json b/docs/public/r/account-cell.json index 8605496e..f79c4e9c 100644 --- a/docs/public/r/account-cell.json +++ b/docs/public/r/account-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/account-options.json b/docs/public/r/account-options.json index 42449ff8..840f542b 100644 --- a/docs/public/r/account-options.json +++ b/docs/public/r/account-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/account-settings-cards.json b/docs/public/r/account-settings-cards.json index 6217528d..5949760f 100644 --- a/docs/public/r/account-settings-cards.json +++ b/docs/public/r/account-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/accounts-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-email-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-avatar-card.json", - "http://localhost:3000/r/update-field-card.json", - "http://localhost:3000/r/update-name-card.json", - "http://localhost:3000/r/update-username-card.json", - "http://localhost:3000/r/utils.json" + "true/accounts-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-email-card.json", + "true/settings-card.json", + "true/update-avatar-card.json", + "true/update-field-card.json", + "true/update-name-card.json", + "true/update-username-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/account-view.json b/docs/public/r/account-view.json index cd79fad7..34be62a1 100644 --- a/docs/public/r/account-view.json +++ b/docs/public/r/account-view.json @@ -8,18 +8,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-settings-cards.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-settings-cards.json", + "true/api-keys-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organizations-card.json", - "http://localhost:3000/r/security-settings-cards.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-invitations-card.json", - "http://localhost:3000/r/utils.json" + "true/organizations-card.json", + "true/security-settings-cards.json", + "true/settings-card.json", + "true/user-invitations-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/accounts-card.json b/docs/public/r/accounts-card.json index 6bbe023b..657d9c71 100644 --- a/docs/public/r/accounts-card.json +++ b/docs/public/r/accounts-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/account-cell.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-cell.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/alert.json b/docs/public/r/alert.json index 8f0cff66..c0ed0a51 100644 --- a/docs/public/r/alert.json +++ b/docs/public/r/alert.json @@ -8,7 +8,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/api-key-cell.json b/docs/public/r/api-key-cell.json index da2eab9b..de3084ff 100644 --- a/docs/public/r/api-key-cell.json +++ b/docs/public/r/api-key-cell.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/api-key-delete-dialog.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/api-key-delete-dialog.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/api-key-delete-dialog.json b/docs/public/r/api-key-delete-dialog.json index c80298b8..1dd02965 100644 --- a/docs/public/r/api-key-delete-dialog.json +++ b/docs/public/r/api-key-delete-dialog.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/api-key-display-dialog.json b/docs/public/r/api-key-display-dialog.json index f0857a2b..876bc9af 100644 --- a/docs/public/r/api-key-display-dialog.json +++ b/docs/public/r/api-key-display-dialog.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/api-keys-card.json b/docs/public/r/api-keys-card.json index 15f03919..0eafe807 100644 --- a/docs/public/r/api-keys-card.json +++ b/docs/public/r/api-keys-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/api-key-cell.json", - "http://localhost:3000/r/api-key-display-dialog.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key-cell.json", + "true/api-key-display-dialog.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-api-key-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/create-api-key-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/auth-callback.json b/docs/public/r/auth-callback.json index 182c4b2f..8a381914 100644 --- a/docs/public/r/auth-callback.json +++ b/docs/public/r/auth-callback.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { diff --git a/docs/public/r/auth-form.json b/docs/public/r/auth-form.json index 50212291..7a2e015f 100644 --- a/docs/public/r/auth-form.json +++ b/docs/public/r/auth-form.json @@ -6,20 +6,20 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/email-otp-form.json", - "http://localhost:3000/r/forgot-password-form.json", - "http://localhost:3000/r/magic-link-form.json", - "http://localhost:3000/r/recover-account-form.json", - "http://localhost:3000/r/reset-password-form.json", - "http://localhost:3000/r/sign-in-form.json", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/sign-up-form.json", - "http://localhost:3000/r/two-factor-form.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/auth-callback.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/email-otp-form.json", + "true/forgot-password-form.json", + "true/magic-link-form.json", + "true/recover-account-form.json", + "true/reset-password-form.json", + "true/sign-in-form.json", + "true/sign-out.json", + "true/sign-up-form.json", + "true/two-factor-form.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/auth-hooks.json b/docs/public/r/auth-hooks.json index 5c0ecf48..4918820b 100644 --- a/docs/public/r/auth-hooks.json +++ b/docs/public/r/auth-hooks.json @@ -9,11 +9,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/refetch.json" + "true/any-auth-client.json", + "true/api-key.json", + "true/auth-client.json", + "true/invitation.json", + "true/refetch.json" ], "files": [ { diff --git a/docs/public/r/auth-loading.json b/docs/public/r/auth-loading.json index 11bffd45..c06f4ceb 100644 --- a/docs/public/r/auth-loading.json +++ b/docs/public/r/auth-loading.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/auth-localization.json b/docs/public/r/auth-localization.json index 747c23e1..24fca6a9 100644 --- a/docs/public/r/auth-localization.json +++ b/docs/public/r/auth-localization.json @@ -6,21 +6,21 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/admin-error-codes.json", - "http://localhost:3000/r/anonymous-error-codes.json", - "http://localhost:3000/r/api-key-error-codes.json", - "http://localhost:3000/r/base-error-codes.json", - "http://localhost:3000/r/captcha-error-codes.json", - "http://localhost:3000/r/email-otp-error-codes.json", - "http://localhost:3000/r/generic-oauth-error-codes.json", - "http://localhost:3000/r/haveibeenpwned-error-codes.json", - "http://localhost:3000/r/multi-session-error-codes.json", - "http://localhost:3000/r/organization-error-codes.json", - "http://localhost:3000/r/passkey-error-codes.json", - "http://localhost:3000/r/phone-number-error-codes.json", - "http://localhost:3000/r/stripe-localization.json", - "http://localhost:3000/r/two-factor-error-codes.json", - "http://localhost:3000/r/username-error-codes.json" + "true/admin-error-codes.json", + "true/anonymous-error-codes.json", + "true/api-key-error-codes.json", + "true/base-error-codes.json", + "true/captcha-error-codes.json", + "true/email-otp-error-codes.json", + "true/generic-oauth-error-codes.json", + "true/haveibeenpwned-error-codes.json", + "true/multi-session-error-codes.json", + "true/organization-error-codes.json", + "true/passkey-error-codes.json", + "true/phone-number-error-codes.json", + "true/stripe-localization.json", + "true/two-factor-error-codes.json", + "true/username-error-codes.json" ], "files": [ { diff --git a/docs/public/r/auth-ui-provider-tanstack.json b/docs/public/r/auth-ui-provider-tanstack.json index a7b618bd..8e2b3312 100644 --- a/docs/public/r/auth-ui-provider-tanstack.json +++ b/docs/public/r/auth-ui-provider-tanstack.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-tanstack-options.json" + "true/auth-ui-provider.json", + "true/use-tanstack-options.json" ], "files": [ { diff --git a/docs/public/r/auth-ui-provider.json b/docs/public/r/auth-ui-provider.json index ce0131ab..5614a02f 100644 --- a/docs/public/r/auth-ui-provider.json +++ b/docs/public/r/auth-ui-provider.json @@ -8,28 +8,28 @@ "sonner" ], "registryDependencies": [ - "http://localhost:3000/r/account-options.json", - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/avatar-options.json", - "http://localhost:3000/r/captcha-options.json", - "http://localhost:3000/r/credentials-options.json", - "http://localhost:3000/r/delete-user-options.json", - "http://localhost:3000/r/generic-oauth-options.json", - "http://localhost:3000/r/gravatar-options.json", - "http://localhost:3000/r/link.json", - "http://localhost:3000/r/organization-options.json", - "http://localhost:3000/r/organization-refetcher.json", - "http://localhost:3000/r/recaptcha-v3.json", - "http://localhost:3000/r/render-toast.json", - "http://localhost:3000/r/sign-up-options.json", - "http://localhost:3000/r/social-options.json", - "http://localhost:3000/r/use-auth-data.json", - "http://localhost:3000/r/view-paths.json" + "true/account-options.json", + "true/additional-fields.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-localization.json", + "true/auth-mutators.json", + "true/avatar-options.json", + "true/captcha-options.json", + "true/credentials-options.json", + "true/delete-user-options.json", + "true/generic-oauth-options.json", + "true/gravatar-options.json", + "true/link.json", + "true/organization-options.json", + "true/organization-refetcher.json", + "true/recaptcha-v3.json", + "true/render-toast.json", + "true/sign-up-options.json", + "true/social-options.json", + "true/use-auth-data.json", + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/auth-view.json b/docs/public/r/auth-view.json index c22f99a9..13e82272 100644 --- a/docs/public/r/auth-view.json +++ b/docs/public/r/auth-view.json @@ -8,23 +8,23 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-callback.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/email-otp-button.json", - "http://localhost:3000/r/magic-link-button.json", - "http://localhost:3000/r/one-tap.json", - "http://localhost:3000/r/passkey-button.json", - "http://localhost:3000/r/provider-button.json", + "true/email-otp-button.json", + "true/magic-link-button.json", + "true/one-tap.json", + "true/passkey-button.json", + "true/provider-button.json", "separator", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/sign-out.json", + "true/social-providers.json", + "true/use-hydrated.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/avatar-options.json b/docs/public/r/avatar-options.json index a24c2830..1b82e061 100644 --- a/docs/public/r/avatar-options.json +++ b/docs/public/r/avatar-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/image.json" + "true/image.json" ], "files": [ { diff --git a/docs/public/r/avatar.json b/docs/public/r/avatar.json index 312a6a9f..897c6dd0 100644 --- a/docs/public/r/avatar.json +++ b/docs/public/r/avatar.json @@ -8,7 +8,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/backup-codes-dialog.json b/docs/public/r/backup-codes-dialog.json index 07ff49dd..5c8a51c0 100644 --- a/docs/public/r/backup-codes-dialog.json +++ b/docs/public/r/backup-codes-dialog.json @@ -8,11 +8,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/button.json b/docs/public/r/button.json index 9a3f3387..56563106 100644 --- a/docs/public/r/button.json +++ b/docs/public/r/button.json @@ -9,7 +9,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/captcha-options.json b/docs/public/r/captcha-options.json index 0fbc8690..46f380e3 100644 --- a/docs/public/r/captcha-options.json +++ b/docs/public/r/captcha-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/captcha-provider.json" + "true/captcha-provider.json" ], "files": [ { diff --git a/docs/public/r/captcha.json b/docs/public/r/captcha.json index 59e0746f..fecff15f 100644 --- a/docs/public/r/captcha.json +++ b/docs/public/r/captcha.json @@ -9,11 +9,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/recaptcha-badge.json", - "http://localhost:3000/r/recaptcha-v2.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/recaptcha-badge.json", + "true/recaptcha-v2.json", + "true/use-theme.json" ], "files": [ { diff --git a/docs/public/r/card.json b/docs/public/r/card.json index 494673c8..c187ea94 100644 --- a/docs/public/r/card.json +++ b/docs/public/r/card.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/change-email-card.json b/docs/public/r/change-email-card.json index 6bceca94..a7837fa2 100644 --- a/docs/public/r/change-email-card.json +++ b/docs/public/r/change-email-card.json @@ -10,13 +10,13 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/change-password-card.json b/docs/public/r/change-password-card.json index 37e0f3ca..d507f591 100644 --- a/docs/public/r/change-password-card.json +++ b/docs/public/r/change-password-card.json @@ -10,15 +10,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/input-field-skeleton.json", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/input-field-skeleton.json", + "true/password-input.json", + "true/password-validation.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/checkbox.json b/docs/public/r/checkbox.json index e58038e5..c761fd0f 100644 --- a/docs/public/r/checkbox.json +++ b/docs/public/r/checkbox.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/create-api-key-dialog.json b/docs/public/r/create-api-key-dialog.json index 38394ef7..bfab3c29 100644 --- a/docs/public/r/create-api-key-dialog.json +++ b/docs/public/r/create-api-key-dialog.json @@ -12,19 +12,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/refetch.json", + "true/organization-cell-view.json", + "true/personal-account-view.json", + "true/refetch.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/create-organization-dialog.json b/docs/public/r/create-organization-dialog.json index 31f5c1fd..d763e04e 100644 --- a/docs/public/r/create-organization-dialog.json +++ b/docs/public/r/create-organization-dialog.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-logo.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/credentials-options.json b/docs/public/r/credentials-options.json index 97cb89d7..6e7d8512 100644 --- a/docs/public/r/credentials-options.json +++ b/docs/public/r/credentials-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/password-validation.json" + "true/password-validation.json" ], "files": [ { diff --git a/docs/public/r/delete-account-card.json b/docs/public/r/delete-account-card.json index 2966299f..b59d0936 100644 --- a/docs/public/r/delete-account-card.json +++ b/docs/public/r/delete-account-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-account-dialog.json", - "http://localhost:3000/r/settings-card.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-account-dialog.json", + "true/settings-card.json" ], "files": [ { diff --git a/docs/public/r/delete-account-dialog.json b/docs/public/r/delete-account-dialog.json index 1c1ebfb9..1d9eafa9 100644 --- a/docs/public/r/delete-account-dialog.json +++ b/docs/public/r/delete-account-dialog.json @@ -11,16 +11,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/delete-organization-card.json b/docs/public/r/delete-organization-card.json index 265f6d22..192c60be 100644 --- a/docs/public/r/delete-organization-card.json +++ b/docs/public/r/delete-organization-card.json @@ -8,10 +8,10 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/delete-organization-dialog.json", + "true/settings-card.json", + "true/use-current-organization.json" ], "files": [ { diff --git a/docs/public/r/delete-organization-dialog.json b/docs/public/r/delete-organization-dialog.json index 82c8af10..860564b8 100644 --- a/docs/public/r/delete-organization-dialog.json +++ b/docs/public/r/delete-organization-dialog.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/dialog.json b/docs/public/r/dialog.json index 94861251..f80c5d41 100644 --- a/docs/public/r/dialog.json +++ b/docs/public/r/dialog.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/drawer.json b/docs/public/r/drawer.json index 9f958f48..43c130b1 100644 --- a/docs/public/r/drawer.json +++ b/docs/public/r/drawer.json @@ -8,7 +8,7 @@ "vaul" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/dropdown-menu.json b/docs/public/r/dropdown-menu.json index de98b776..1ccfb456 100644 --- a/docs/public/r/dropdown-menu.json +++ b/docs/public/r/dropdown-menu.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/email-otp-button.json b/docs/public/r/email-otp-button.json index 9b6f7ec1..154e3acf 100644 --- a/docs/public/r/email-otp-button.json +++ b/docs/public/r/email-otp-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/email-otp-form.json b/docs/public/r/email-otp-form.json index 61028c21..a9f74077 100644 --- a/docs/public/r/email-otp-form.json +++ b/docs/public/r/email-otp-form.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", "input-otp", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/email-template.json b/docs/public/r/email-template.json index 1a9814ad..d12bafba 100644 --- a/docs/public/r/email-template.json +++ b/docs/public/r/email-template.json @@ -8,7 +8,7 @@ "@react-email/components" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/forgot-password-form.json b/docs/public/r/forgot-password-form.json index 479d36f7..aeec275a 100644 --- a/docs/public/r/forgot-password-form.json +++ b/docs/public/r/forgot-password-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/form-error.json b/docs/public/r/form-error.json index abbd6892..9a51d5f3 100644 --- a/docs/public/r/form-error.json +++ b/docs/public/r/form-error.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "alert", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/utils.json" + "true/auth-form.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/form.json b/docs/public/r/form.json index 544ad4d1..2f8d1187 100644 --- a/docs/public/r/form.json +++ b/docs/public/r/form.json @@ -11,7 +11,7 @@ ], "registryDependencies": [ "label", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/generic-oauth-options.json b/docs/public/r/generic-oauth-options.json index 3b387764..e5b1c882 100644 --- a/docs/public/r/generic-oauth-options.json +++ b/docs/public/r/generic-oauth-options.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/social-providers.json" + "true/auth-client.json", + "true/social-providers.json" ], "files": [ { diff --git a/docs/public/r/gravatar-utils.json b/docs/public/r/gravatar-utils.json index 3fc43b4b..6ea5edf9 100644 --- a/docs/public/r/gravatar-utils.json +++ b/docs/public/r/gravatar-utils.json @@ -8,7 +8,7 @@ "@noble/hashes" ], "registryDependencies": [ - "http://localhost:3000/r/gravatar-options.json" + "true/gravatar-options.json" ], "files": [ { diff --git a/docs/public/r/input-field-skeleton.json b/docs/public/r/input-field-skeleton.json index 8335fb1b..749d5161 100644 --- a/docs/public/r/input-field-skeleton.json +++ b/docs/public/r/input-field-skeleton.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/input-otp.json b/docs/public/r/input-otp.json index 2123b2b0..f2a0ebc1 100644 --- a/docs/public/r/input-otp.json +++ b/docs/public/r/input-otp.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/input.json b/docs/public/r/input.json index 711aa112..fdc73352 100644 --- a/docs/public/r/input.json +++ b/docs/public/r/input.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/invitation-cell.json b/docs/public/r/invitation-cell.json index 23df0614..6a58ba32 100644 --- a/docs/public/r/invitation-cell.json +++ b/docs/public/r/invitation-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/invitation.json", + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/invite-member-dialog.json b/docs/public/r/invite-member-dialog.json index 1680b938..0c3463ed 100644 --- a/docs/public/r/invite-member-dialog.json +++ b/docs/public/r/invite-member-dialog.json @@ -12,15 +12,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/label.json b/docs/public/r/label.json index 03a6300a..9790a361 100644 --- a/docs/public/r/label.json +++ b/docs/public/r/label.json @@ -8,7 +8,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/leave-organization-dialog.json b/docs/public/r/leave-organization-dialog.json index 96f868cd..3538a95f 100644 --- a/docs/public/r/leave-organization-dialog.json +++ b/docs/public/r/leave-organization-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/magic-link-button.json b/docs/public/r/magic-link-button.json index 0aabbb0e..e612a281 100644 --- a/docs/public/r/magic-link-button.json +++ b/docs/public/r/magic-link-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/magic-link-form.json b/docs/public/r/magic-link-form.json index d8b4d2db..b06f9ae5 100644 --- a/docs/public/r/magic-link-form.json +++ b/docs/public/r/magic-link-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/member-cell.json b/docs/public/r/member-cell.json index 66274741..411dfbd0 100644 --- a/docs/public/r/member-cell.json +++ b/docs/public/r/member-cell.json @@ -9,17 +9,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/remove-member-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-member-role-dialog.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/remove-member-dialog.json", + "true/settings-card.json", + "true/update-member-role-dialog.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/one-tap.json b/docs/public/r/one-tap.json index cb3fef9d..cf0281ec 100644 --- a/docs/public/r/one-tap.json +++ b/docs/public/r/one-tap.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-cell-view.json b/docs/public/r/organization-cell-view.json index fd987966..0c2105af 100644 --- a/docs/public/r/organization-cell-view.json +++ b/docs/public/r/organization-cell-view.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/organization-logo.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/organization-logo.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-cell.json b/docs/public/r/organization-cell.json index 6ba436fa..f9856267 100644 --- a/docs/public/r/organization-cell.json +++ b/docs/public/r/organization-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-invitations-card.json b/docs/public/r/organization-invitations-card.json index 884465c0..5f0f6105 100644 --- a/docs/public/r/organization-invitations-card.json +++ b/docs/public/r/organization-invitations-card.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invitation-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invitation-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-logo-card.json b/docs/public/r/organization-logo-card.json index 88ea3f9a..d6f3d7c9 100644 --- a/docs/public/r/organization-logo-card.json +++ b/docs/public/r/organization-logo-card.json @@ -9,18 +9,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/organization-logo.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-logo.json b/docs/public/r/organization-logo.json index c6fcc074..e79ab104 100644 --- a/docs/public/r/organization-logo.json +++ b/docs/public/r/organization-logo.json @@ -9,11 +9,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-members-card.json b/docs/public/r/organization-members-card.json index 2fa79988..66b1dbc3 100644 --- a/docs/public/r/organization-members-card.json +++ b/docs/public/r/organization-members-card.json @@ -8,13 +8,13 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invite-member-dialog.json", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invite-member-dialog.json", + "true/member-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-name-card.json b/docs/public/r/organization-name-card.json index bc112dcf..95f77ea2 100644 --- a/docs/public/r/organization-name-card.json +++ b/docs/public/r/organization-name-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-options.json b/docs/public/r/organization-options.json index 5e1cc229..f2241171 100644 --- a/docs/public/r/organization-options.json +++ b/docs/public/r/organization-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { diff --git a/docs/public/r/organization-refetcher.json b/docs/public/r/organization-refetcher.json index 6abfa7e4..a7920e60 100644 --- a/docs/public/r/organization-refetcher.json +++ b/docs/public/r/organization-refetcher.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/use-current-organization.json" ], "files": [ { diff --git a/docs/public/r/organization-settings-cards.json b/docs/public/r/organization-settings-cards.json index 28373edd..251f183f 100644 --- a/docs/public/r/organization-settings-cards.json +++ b/docs/public/r/organization-settings-cards.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-card.json", - "http://localhost:3000/r/organization-logo-card.json", - "http://localhost:3000/r/organization-name-card.json", - "http://localhost:3000/r/organization-slug-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-organization-card.json", + "true/organization-logo-card.json", + "true/organization-name-card.json", + "true/organization-slug-card.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-slug-card.json b/docs/public/r/organization-slug-card.json index 9d5664c3..98a75610 100644 --- a/docs/public/r/organization-slug-card.json +++ b/docs/public/r/organization-slug-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-switcher.json b/docs/public/r/organization-switcher.json index 1de2c5b9..c2f7b2f1 100644 --- a/docs/public/r/organization-switcher.json +++ b/docs/public/r/organization-switcher.json @@ -9,19 +9,19 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/create-organization-dialog.json", + "true/create-organization-dialog.json", "dropdown-menu", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/organization-logo.json", + "true/personal-account-view.json", + "true/use-current-organization.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-view.json b/docs/public/r/organization-view.json index c908138e..bcb3fdbb 100644 --- a/docs/public/r/organization-view.json +++ b/docs/public/r/organization-view.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-view.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-view.json", + "true/api-keys-card.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organization-invitations-card.json", - "http://localhost:3000/r/organization-members-card.json", - "http://localhost:3000/r/organization-settings-cards.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/organization-invitations-card.json", + "true/organization-members-card.json", + "true/organization-settings-cards.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/organizations-card.json b/docs/public/r/organizations-card.json index b5e70067..03cae5ff 100644 --- a/docs/public/r/organizations-card.json +++ b/docs/public/r/organizations-card.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-organization-dialog.json", - "http://localhost:3000/r/organization-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/create-organization-dialog.json", + "true/organization-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/passkey-button.json b/docs/public/r/passkey-button.json index c63f76f6..f2c98704 100644 --- a/docs/public/r/passkey-button.json +++ b/docs/public/r/passkey-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/passkey-cell.json b/docs/public/r/passkey-cell.json index 6d9d507b..ad765eb8 100644 --- a/docs/public/r/passkey-cell.json +++ b/docs/public/r/passkey-cell.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/passkeys-card.json b/docs/public/r/passkeys-card.json index 2f40c110..48f2c229 100644 --- a/docs/public/r/passkeys-card.json +++ b/docs/public/r/passkeys-card.json @@ -8,14 +8,14 @@ "react-hook-form" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/passkey-cell.json", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/passkey-cell.json", + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/password-input.json b/docs/public/r/password-input.json index 49878dc0..37226e8d 100644 --- a/docs/public/r/password-input.json +++ b/docs/public/r/password-input.json @@ -10,7 +10,7 @@ "registryDependencies": [ "button", "input", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/personal-account-view.json b/docs/public/r/personal-account-view.json index 383f1e53..74ab72ce 100644 --- a/docs/public/r/personal-account-view.json +++ b/docs/public/r/personal-account-view.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/provider-button.json b/docs/public/r/provider-button.json index 0de4abc1..22b2d442 100644 --- a/docs/public/r/provider-button.json +++ b/docs/public/r/provider-button.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/provider-cell.json b/docs/public/r/provider-cell.json index 9aa164d1..584ce11c 100644 --- a/docs/public/r/provider-cell.json +++ b/docs/public/r/provider-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", + "true/refetch.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/providers-card.json b/docs/public/r/providers-card.json index 03c26378..da5dc9f6 100644 --- a/docs/public/r/providers-card.json +++ b/docs/public/r/providers-card.json @@ -6,15 +6,15 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/provider-cell.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/provider-cell.json", + "true/refetch.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/social-providers.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/recaptcha-badge.json b/docs/public/r/recaptcha-badge.json index 309f8bf8..b7f762f9 100644 --- a/docs/public/r/recaptcha-badge.json +++ b/docs/public/r/recaptcha-badge.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/recaptcha-v2.json b/docs/public/r/recaptcha-v2.json index cce6faa7..44b0cdf3 100644 --- a/docs/public/r/recaptcha-v2.json +++ b/docs/public/r/recaptcha-v2.json @@ -8,10 +8,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/use-lang.json", + "true/use-theme.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/recaptcha-v3.json b/docs/public/r/recaptcha-v3.json index d8829c4c..43493147 100644 --- a/docs/public/r/recaptcha-v3.json +++ b/docs/public/r/recaptcha-v3.json @@ -8,10 +8,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/use-lang.json", + "true/use-theme.json" ], "files": [ { diff --git a/docs/public/r/recover-account-form.json b/docs/public/r/recover-account-form.json index 81235d33..22aa8612 100644 --- a/docs/public/r/recover-account-form.json +++ b/docs/public/r/recover-account-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/redirect-to-sign-in.json b/docs/public/r/redirect-to-sign-in.json index 8a17c12d..17ef9529 100644 --- a/docs/public/r/redirect-to-sign-in.json +++ b/docs/public/r/redirect-to-sign-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { diff --git a/docs/public/r/redirect-to-sign-up.json b/docs/public/r/redirect-to-sign-up.json index 57856f9f..5fba214b 100644 --- a/docs/public/r/redirect-to-sign-up.json +++ b/docs/public/r/redirect-to-sign-up.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { diff --git a/docs/public/r/remove-member-dialog.json b/docs/public/r/remove-member-dialog.json index f5ea009f..f2aa22c7 100644 --- a/docs/public/r/remove-member-dialog.json +++ b/docs/public/r/remove-member-dialog.json @@ -9,13 +9,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/member-cell.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/reset-password-form.json b/docs/public/r/reset-password-form.json index a8a6b24a..01d7a4e6 100644 --- a/docs/public/r/reset-password-form.json +++ b/docs/public/r/reset-password-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/security-settings-cards.json b/docs/public/r/security-settings-cards.json index db45e62e..71a81e24 100644 --- a/docs/public/r/security-settings-cards.json +++ b/docs/public/r/security-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-password-card.json", - "http://localhost:3000/r/delete-account-card.json", - "http://localhost:3000/r/passkeys-card.json", - "http://localhost:3000/r/providers-card.json", - "http://localhost:3000/r/sessions-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-password-card.json", + "true/delete-account-card.json", + "true/passkeys-card.json", + "true/providers-card.json", + "true/sessions-card.json", + "true/settings-card.json", + "true/two-factor-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/select.json b/docs/public/r/select.json index 968c7425..290efa2b 100644 --- a/docs/public/r/select.json +++ b/docs/public/r/select.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/separator.json b/docs/public/r/separator.json index 10e8a44f..598ad6f2 100644 --- a/docs/public/r/separator.json +++ b/docs/public/r/separator.json @@ -8,7 +8,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/session-cell.json b/docs/public/r/session-cell.json index 88752ec5..26d8eaea 100644 --- a/docs/public/r/session-cell.json +++ b/docs/public/r/session-cell.json @@ -10,13 +10,13 @@ "ua-parser-js" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/session-freshness-dialog.json b/docs/public/r/session-freshness-dialog.json index 775dca3b..97ee5e29 100644 --- a/docs/public/r/session-freshness-dialog.json +++ b/docs/public/r/session-freshness-dialog.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/sessions-card.json b/docs/public/r/sessions-card.json index 2ad6809b..1bd49dc2 100644 --- a/docs/public/r/sessions-card.json +++ b/docs/public/r/sessions-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/session-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/utils.json" + "true/session-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-action-button.json b/docs/public/r/settings-action-button.json index 9d7951f8..263b48ce 100644 --- a/docs/public/r/settings-action-button.json +++ b/docs/public/r/settings-action-button.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "button", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-card-footer.json b/docs/public/r/settings-card-footer.json index f278340c..e766a13f 100644 --- a/docs/public/r/settings-card-footer.json +++ b/docs/public/r/settings-card-footer.json @@ -7,10 +7,10 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-action-button.json", - "http://localhost:3000/r/settings-card.json", + "true/settings-action-button.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-card-header.json b/docs/public/r/settings-card-header.json index bdf72e93..20d5479c 100644 --- a/docs/public/r/settings-card-header.json +++ b/docs/public/r/settings-card-header.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-card.json b/docs/public/r/settings-card.json index 8a935166..167fbb99 100644 --- a/docs/public/r/settings-card.json +++ b/docs/public/r/settings-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", + "true/auth-localization.json", "card", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-cell-skeleton.json b/docs/public/r/settings-cell-skeleton.json index 47c97a0c..61b06cfc 100644 --- a/docs/public/r/settings-cell-skeleton.json +++ b/docs/public/r/settings-cell-skeleton.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/sign-in-form.json b/docs/public/r/sign-in-form.json index 6c3c98dd..58842c53 100644 --- a/docs/public/r/sign-in-form.json +++ b/docs/public/r/sign-in-form.json @@ -12,20 +12,20 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "form", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/sign-out.json b/docs/public/r/sign-out.json index 0e6a238b..82e91a8a 100644 --- a/docs/public/r/sign-out.json +++ b/docs/public/r/sign-out.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { diff --git a/docs/public/r/sign-up-form.json b/docs/public/r/sign-up-form.json index 5a97db3a..bb5a195c 100644 --- a/docs/public/r/sign-up-form.json +++ b/docs/public/r/sign-up-form.json @@ -12,24 +12,24 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", + "true/password-input.json", + "true/password-validation.json", "textarea", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/signed-in.json b/docs/public/r/signed-in.json index 793fdfcb..ed5a2115 100644 --- a/docs/public/r/signed-in.json +++ b/docs/public/r/signed-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/signed-out.json b/docs/public/r/signed-out.json index 84959925..2ab39c8b 100644 --- a/docs/public/r/signed-out.json +++ b/docs/public/r/signed-out.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/skeleton.json b/docs/public/r/skeleton.json index 282f5451..715f391c 100644 --- a/docs/public/r/skeleton.json +++ b/docs/public/r/skeleton.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/social-options.json b/docs/public/r/social-options.json index e4ee7009..9e3bb258 100644 --- a/docs/public/r/social-options.json +++ b/docs/public/r/social-options.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json" + "true/auth-client.json" ], "files": [ { diff --git a/docs/public/r/social-providers.json b/docs/public/r/social-providers.json index f3a5ba7a..5ec87e5c 100644 --- a/docs/public/r/social-providers.json +++ b/docs/public/r/social-providers.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/provider-icons.json" + "true/provider-icons.json" ], "files": [ { diff --git a/docs/public/r/tabs.json b/docs/public/r/tabs.json index 7b1455a2..5f1c0f1c 100644 --- a/docs/public/r/tabs.json +++ b/docs/public/r/tabs.json @@ -8,7 +8,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/textarea.json b/docs/public/r/textarea.json index b104e4bb..d0d52244 100644 --- a/docs/public/r/textarea.json +++ b/docs/public/r/textarea.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/two-factor-card.json b/docs/public/r/two-factor-card.json index 5d763015..24a17a28 100644 --- a/docs/public/r/two-factor-card.json +++ b/docs/public/r/two-factor-card.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-password-dialog.json" + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/two-factor-password-dialog.json" ], "files": [ { diff --git a/docs/public/r/two-factor-form.json b/docs/public/r/two-factor-form.json index f0316e78..af27cad4 100644 --- a/docs/public/r/two-factor-form.json +++ b/docs/public/r/two-factor-form.json @@ -13,19 +13,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/two-factor-password-dialog.json b/docs/public/r/two-factor-password-dialog.json index e9055bd7..c6f0a80d 100644 --- a/docs/public/r/two-factor-password-dialog.json +++ b/docs/public/r/two-factor-password-dialog.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/backup-codes-dialog.json", + "true/auth-ui-provider.json", + "true/backup-codes-dialog.json", "button", "dialog", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/update-avatar-card.json b/docs/public/r/update-avatar-card.json index 2f64c293..e86ed14e 100644 --- a/docs/public/r/update-avatar-card.json +++ b/docs/public/r/update-avatar-card.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/update-field-card.json b/docs/public/r/update-field-card.json index 790f069a..1ffea02a 100644 --- a/docs/public/r/update-field-card.json +++ b/docs/public/r/update-field-card.json @@ -10,17 +10,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/additional-fields.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "checkbox", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", "textarea", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/update-member-role-dialog.json b/docs/public/r/update-member-role-dialog.json index b3bb7b17..95147eb0 100644 --- a/docs/public/r/update-member-role-dialog.json +++ b/docs/public/r/update-member-role-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", + "true/member-cell.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/update-name-card.json b/docs/public/r/update-name-card.json index c084da9c..16430deb 100644 --- a/docs/public/r/update-name-card.json +++ b/docs/public/r/update-name-card.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { diff --git a/docs/public/r/update-username-card.json b/docs/public/r/update-username-card.json index bc0c9216..a4122d33 100644 --- a/docs/public/r/update-username-card.json +++ b/docs/public/r/update-username-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-client.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { diff --git a/docs/public/r/use-auth-data.json b/docs/public/r/use-auth-data.json index acbe078b..e26121d6 100644 --- a/docs/public/r/use-auth-data.json +++ b/docs/public/r/use-auth-data.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-data-cache.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/fetch-error.json", - "http://localhost:3000/r/utils.json" + "true/auth-data-cache.json", + "true/auth-ui-provider.json", + "true/fetch-error.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/use-authenticate.json b/docs/public/r/use-authenticate.json index ec054d85..e3b3e4b0 100644 --- a/docs/public/r/use-authenticate.json +++ b/docs/public/r/use-authenticate.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/any-auth-client.json", + "true/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/use-captcha.json b/docs/public/r/use-captcha.json index 50f16dab..a56593dd 100644 --- a/docs/public/r/use-captcha.json +++ b/docs/public/r/use-captcha.json @@ -11,8 +11,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-localization.json", + "true/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/use-current-organization.json b/docs/public/r/use-current-organization.json index bb8ae23d..22f4df09 100644 --- a/docs/public/r/use-current-organization.json +++ b/docs/public/r/use-current-organization.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/use-instant-options.json b/docs/public/r/use-instant-options.json index 8b3eaf10..6dff1921 100644 --- a/docs/public/r/use-instant-options.json +++ b/docs/public/r/use-instant-options.json @@ -9,14 +9,14 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json", + "true/model-names.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { diff --git a/docs/public/r/use-list-accounts.json b/docs/public/r/use-list-accounts.json index 5f2a8800..106a1684 100644 --- a/docs/public/r/use-list-accounts.json +++ b/docs/public/r/use-list-accounts.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { diff --git a/docs/public/r/use-list-sessions.json b/docs/public/r/use-list-sessions.json index 55b22ded..3ef5f124 100644 --- a/docs/public/r/use-list-sessions.json +++ b/docs/public/r/use-list-sessions.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { diff --git a/docs/public/r/use-session.json b/docs/public/r/use-session.json index 5b4c6202..00da30bb 100644 --- a/docs/public/r/use-session.json +++ b/docs/public/r/use-session.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { diff --git a/docs/public/r/use-success-transition.json b/docs/public/r/use-success-transition.json index e22e2c2f..f258832a 100644 --- a/docs/public/r/use-success-transition.json +++ b/docs/public/r/use-success-transition.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/use-tanstack-options.json b/docs/public/r/use-tanstack-options.json index 24c12d8e..917b24e7 100644 --- a/docs/public/r/use-tanstack-options.json +++ b/docs/public/r/use-tanstack-options.json @@ -9,10 +9,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json" + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json" ], "files": [ { diff --git a/docs/public/r/use-triplit-hooks.json b/docs/public/r/use-triplit-hooks.json index 89b08351..22a2ea2e 100644 --- a/docs/public/r/use-triplit-hooks.json +++ b/docs/public/r/use-triplit-hooks.json @@ -9,12 +9,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { diff --git a/docs/public/r/user-avatar.json b/docs/public/r/user-avatar.json index fd4191f0..99ebdd0b 100644 --- a/docs/public/r/user-avatar.json +++ b/docs/public/r/user-avatar.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", - "http://localhost:3000/r/gravatar-utils.json", - "http://localhost:3000/r/profile.json", + "true/gravatar-utils.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/user-button.json b/docs/public/r/user-button.json index 44bab9da..5647f993 100644 --- a/docs/public/r/user-button.json +++ b/docs/public/r/user-button.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dropdown-menu", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/use-hydrated.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/user-invitations-card.json b/docs/public/r/user-invitations-card.json index b01ea9be..3c540954 100644 --- a/docs/public/r/user-invitations-card.json +++ b/docs/public/r/user-invitations-card.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/user-view.json b/docs/public/r/user-view.json index 6c432bd2..b550de00 100644 --- a/docs/public/r/user-view.json +++ b/docs/public/r/user-view.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/profile.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/docs/public/r/utils.json b/docs/public/r/utils.json index 0d42bca3..a19306a7 100644 --- a/docs/public/r/utils.json +++ b/docs/public/r/utils.json @@ -10,8 +10,8 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/password-validation.json" + "true/auth-localization.json", + "true/password-validation.json" ], "files": [ { diff --git a/public/r/accept-invitation-card.json b/public/r/accept-invitation-card.json index 6ef5610c..f1a1b1a6 100644 --- a/public/r/accept-invitation-card.json +++ b/public/r/accept-invitation-card.json @@ -8,15 +8,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", + "true/organization-cell-view.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-authenticate.json", - "http://localhost:3000/r/utils.json" + "true/use-authenticate.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/account-cell.json b/public/r/account-cell.json index 8605496e..f79c4e9c 100644 --- a/public/r/account-cell.json +++ b/public/r/account-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/account-options.json b/public/r/account-options.json index 42449ff8..840f542b 100644 --- a/public/r/account-options.json +++ b/public/r/account-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { diff --git a/public/r/account-settings-cards.json b/public/r/account-settings-cards.json index 6217528d..5949760f 100644 --- a/public/r/account-settings-cards.json +++ b/public/r/account-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/accounts-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-email-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-avatar-card.json", - "http://localhost:3000/r/update-field-card.json", - "http://localhost:3000/r/update-name-card.json", - "http://localhost:3000/r/update-username-card.json", - "http://localhost:3000/r/utils.json" + "true/accounts-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-email-card.json", + "true/settings-card.json", + "true/update-avatar-card.json", + "true/update-field-card.json", + "true/update-name-card.json", + "true/update-username-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/account-view.json b/public/r/account-view.json index cd79fad7..34be62a1 100644 --- a/public/r/account-view.json +++ b/public/r/account-view.json @@ -8,18 +8,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-settings-cards.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-settings-cards.json", + "true/api-keys-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organizations-card.json", - "http://localhost:3000/r/security-settings-cards.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-invitations-card.json", - "http://localhost:3000/r/utils.json" + "true/organizations-card.json", + "true/security-settings-cards.json", + "true/settings-card.json", + "true/user-invitations-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/accounts-card.json b/public/r/accounts-card.json index 6bbe023b..657d9c71 100644 --- a/public/r/accounts-card.json +++ b/public/r/accounts-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/account-cell.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-cell.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/alert.json b/public/r/alert.json index 8f0cff66..c0ed0a51 100644 --- a/public/r/alert.json +++ b/public/r/alert.json @@ -8,7 +8,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/api-key-cell.json b/public/r/api-key-cell.json index da2eab9b..de3084ff 100644 --- a/public/r/api-key-cell.json +++ b/public/r/api-key-cell.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/api-key-delete-dialog.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/api-key-delete-dialog.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/api-key-delete-dialog.json b/public/r/api-key-delete-dialog.json index c80298b8..1dd02965 100644 --- a/public/r/api-key-delete-dialog.json +++ b/public/r/api-key-delete-dialog.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/api-key-display-dialog.json b/public/r/api-key-display-dialog.json index f0857a2b..876bc9af 100644 --- a/public/r/api-key-display-dialog.json +++ b/public/r/api-key-display-dialog.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/api-keys-card.json b/public/r/api-keys-card.json index 15f03919..0eafe807 100644 --- a/public/r/api-keys-card.json +++ b/public/r/api-keys-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/api-key-cell.json", - "http://localhost:3000/r/api-key-display-dialog.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key-cell.json", + "true/api-key-display-dialog.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-api-key-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/create-api-key-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/auth-callback.json b/public/r/auth-callback.json index 182c4b2f..8a381914 100644 --- a/public/r/auth-callback.json +++ b/public/r/auth-callback.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { diff --git a/public/r/auth-form.json b/public/r/auth-form.json index 50212291..7a2e015f 100644 --- a/public/r/auth-form.json +++ b/public/r/auth-form.json @@ -6,20 +6,20 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/email-otp-form.json", - "http://localhost:3000/r/forgot-password-form.json", - "http://localhost:3000/r/magic-link-form.json", - "http://localhost:3000/r/recover-account-form.json", - "http://localhost:3000/r/reset-password-form.json", - "http://localhost:3000/r/sign-in-form.json", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/sign-up-form.json", - "http://localhost:3000/r/two-factor-form.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/auth-callback.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/email-otp-form.json", + "true/forgot-password-form.json", + "true/magic-link-form.json", + "true/recover-account-form.json", + "true/reset-password-form.json", + "true/sign-in-form.json", + "true/sign-out.json", + "true/sign-up-form.json", + "true/two-factor-form.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/public/r/auth-hooks.json b/public/r/auth-hooks.json index 5c0ecf48..4918820b 100644 --- a/public/r/auth-hooks.json +++ b/public/r/auth-hooks.json @@ -9,11 +9,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/refetch.json" + "true/any-auth-client.json", + "true/api-key.json", + "true/auth-client.json", + "true/invitation.json", + "true/refetch.json" ], "files": [ { diff --git a/public/r/auth-loading.json b/public/r/auth-loading.json index 11bffd45..c06f4ceb 100644 --- a/public/r/auth-loading.json +++ b/public/r/auth-loading.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/auth-localization.json b/public/r/auth-localization.json index 747c23e1..24fca6a9 100644 --- a/public/r/auth-localization.json +++ b/public/r/auth-localization.json @@ -6,21 +6,21 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/admin-error-codes.json", - "http://localhost:3000/r/anonymous-error-codes.json", - "http://localhost:3000/r/api-key-error-codes.json", - "http://localhost:3000/r/base-error-codes.json", - "http://localhost:3000/r/captcha-error-codes.json", - "http://localhost:3000/r/email-otp-error-codes.json", - "http://localhost:3000/r/generic-oauth-error-codes.json", - "http://localhost:3000/r/haveibeenpwned-error-codes.json", - "http://localhost:3000/r/multi-session-error-codes.json", - "http://localhost:3000/r/organization-error-codes.json", - "http://localhost:3000/r/passkey-error-codes.json", - "http://localhost:3000/r/phone-number-error-codes.json", - "http://localhost:3000/r/stripe-localization.json", - "http://localhost:3000/r/two-factor-error-codes.json", - "http://localhost:3000/r/username-error-codes.json" + "true/admin-error-codes.json", + "true/anonymous-error-codes.json", + "true/api-key-error-codes.json", + "true/base-error-codes.json", + "true/captcha-error-codes.json", + "true/email-otp-error-codes.json", + "true/generic-oauth-error-codes.json", + "true/haveibeenpwned-error-codes.json", + "true/multi-session-error-codes.json", + "true/organization-error-codes.json", + "true/passkey-error-codes.json", + "true/phone-number-error-codes.json", + "true/stripe-localization.json", + "true/two-factor-error-codes.json", + "true/username-error-codes.json" ], "files": [ { diff --git a/public/r/auth-ui-provider-tanstack.json b/public/r/auth-ui-provider-tanstack.json index a7b618bd..8e2b3312 100644 --- a/public/r/auth-ui-provider-tanstack.json +++ b/public/r/auth-ui-provider-tanstack.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-tanstack-options.json" + "true/auth-ui-provider.json", + "true/use-tanstack-options.json" ], "files": [ { diff --git a/public/r/auth-ui-provider.json b/public/r/auth-ui-provider.json index ce0131ab..5614a02f 100644 --- a/public/r/auth-ui-provider.json +++ b/public/r/auth-ui-provider.json @@ -8,28 +8,28 @@ "sonner" ], "registryDependencies": [ - "http://localhost:3000/r/account-options.json", - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/avatar-options.json", - "http://localhost:3000/r/captcha-options.json", - "http://localhost:3000/r/credentials-options.json", - "http://localhost:3000/r/delete-user-options.json", - "http://localhost:3000/r/generic-oauth-options.json", - "http://localhost:3000/r/gravatar-options.json", - "http://localhost:3000/r/link.json", - "http://localhost:3000/r/organization-options.json", - "http://localhost:3000/r/organization-refetcher.json", - "http://localhost:3000/r/recaptcha-v3.json", - "http://localhost:3000/r/render-toast.json", - "http://localhost:3000/r/sign-up-options.json", - "http://localhost:3000/r/social-options.json", - "http://localhost:3000/r/use-auth-data.json", - "http://localhost:3000/r/view-paths.json" + "true/account-options.json", + "true/additional-fields.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-localization.json", + "true/auth-mutators.json", + "true/avatar-options.json", + "true/captcha-options.json", + "true/credentials-options.json", + "true/delete-user-options.json", + "true/generic-oauth-options.json", + "true/gravatar-options.json", + "true/link.json", + "true/organization-options.json", + "true/organization-refetcher.json", + "true/recaptcha-v3.json", + "true/render-toast.json", + "true/sign-up-options.json", + "true/social-options.json", + "true/use-auth-data.json", + "true/view-paths.json" ], "files": [ { diff --git a/public/r/auth-view.json b/public/r/auth-view.json index c22f99a9..13e82272 100644 --- a/public/r/auth-view.json +++ b/public/r/auth-view.json @@ -8,23 +8,23 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-callback.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/email-otp-button.json", - "http://localhost:3000/r/magic-link-button.json", - "http://localhost:3000/r/one-tap.json", - "http://localhost:3000/r/passkey-button.json", - "http://localhost:3000/r/provider-button.json", + "true/email-otp-button.json", + "true/magic-link-button.json", + "true/one-tap.json", + "true/passkey-button.json", + "true/provider-button.json", "separator", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/sign-out.json", + "true/social-providers.json", + "true/use-hydrated.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/public/r/avatar-options.json b/public/r/avatar-options.json index a24c2830..1b82e061 100644 --- a/public/r/avatar-options.json +++ b/public/r/avatar-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/image.json" + "true/image.json" ], "files": [ { diff --git a/public/r/avatar.json b/public/r/avatar.json index 312a6a9f..897c6dd0 100644 --- a/public/r/avatar.json +++ b/public/r/avatar.json @@ -8,7 +8,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/backup-codes-dialog.json b/public/r/backup-codes-dialog.json index 07ff49dd..5c8a51c0 100644 --- a/public/r/backup-codes-dialog.json +++ b/public/r/backup-codes-dialog.json @@ -8,11 +8,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/button.json b/public/r/button.json index 9a3f3387..56563106 100644 --- a/public/r/button.json +++ b/public/r/button.json @@ -9,7 +9,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/captcha-options.json b/public/r/captcha-options.json index 0fbc8690..46f380e3 100644 --- a/public/r/captcha-options.json +++ b/public/r/captcha-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/captcha-provider.json" + "true/captcha-provider.json" ], "files": [ { diff --git a/public/r/captcha.json b/public/r/captcha.json index 59e0746f..fecff15f 100644 --- a/public/r/captcha.json +++ b/public/r/captcha.json @@ -9,11 +9,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/recaptcha-badge.json", - "http://localhost:3000/r/recaptcha-v2.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/recaptcha-badge.json", + "true/recaptcha-v2.json", + "true/use-theme.json" ], "files": [ { diff --git a/public/r/card.json b/public/r/card.json index 494673c8..c187ea94 100644 --- a/public/r/card.json +++ b/public/r/card.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/change-email-card.json b/public/r/change-email-card.json index 6bceca94..a7837fa2 100644 --- a/public/r/change-email-card.json +++ b/public/r/change-email-card.json @@ -10,13 +10,13 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/change-password-card.json b/public/r/change-password-card.json index 37e0f3ca..d507f591 100644 --- a/public/r/change-password-card.json +++ b/public/r/change-password-card.json @@ -10,15 +10,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/input-field-skeleton.json", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/input-field-skeleton.json", + "true/password-input.json", + "true/password-validation.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/checkbox.json b/public/r/checkbox.json index e58038e5..c761fd0f 100644 --- a/public/r/checkbox.json +++ b/public/r/checkbox.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/create-api-key-dialog.json b/public/r/create-api-key-dialog.json index 38394ef7..bfab3c29 100644 --- a/public/r/create-api-key-dialog.json +++ b/public/r/create-api-key-dialog.json @@ -12,19 +12,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/refetch.json", + "true/organization-cell-view.json", + "true/personal-account-view.json", + "true/refetch.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/create-organization-dialog.json b/public/r/create-organization-dialog.json index 31f5c1fd..d763e04e 100644 --- a/public/r/create-organization-dialog.json +++ b/public/r/create-organization-dialog.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-logo.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/credentials-options.json b/public/r/credentials-options.json index 97cb89d7..6e7d8512 100644 --- a/public/r/credentials-options.json +++ b/public/r/credentials-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/password-validation.json" + "true/password-validation.json" ], "files": [ { diff --git a/public/r/delete-account-card.json b/public/r/delete-account-card.json index 2966299f..b59d0936 100644 --- a/public/r/delete-account-card.json +++ b/public/r/delete-account-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-account-dialog.json", - "http://localhost:3000/r/settings-card.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-account-dialog.json", + "true/settings-card.json" ], "files": [ { diff --git a/public/r/delete-account-dialog.json b/public/r/delete-account-dialog.json index 1c1ebfb9..1d9eafa9 100644 --- a/public/r/delete-account-dialog.json +++ b/public/r/delete-account-dialog.json @@ -11,16 +11,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/delete-organization-card.json b/public/r/delete-organization-card.json index 265f6d22..192c60be 100644 --- a/public/r/delete-organization-card.json +++ b/public/r/delete-organization-card.json @@ -8,10 +8,10 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/delete-organization-dialog.json", + "true/settings-card.json", + "true/use-current-organization.json" ], "files": [ { diff --git a/public/r/delete-organization-dialog.json b/public/r/delete-organization-dialog.json index 82c8af10..860564b8 100644 --- a/public/r/delete-organization-dialog.json +++ b/public/r/delete-organization-dialog.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/dialog.json b/public/r/dialog.json index 94861251..f80c5d41 100644 --- a/public/r/dialog.json +++ b/public/r/dialog.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/drawer.json b/public/r/drawer.json index 9f958f48..43c130b1 100644 --- a/public/r/drawer.json +++ b/public/r/drawer.json @@ -8,7 +8,7 @@ "vaul" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/dropdown-menu.json b/public/r/dropdown-menu.json index de98b776..1ccfb456 100644 --- a/public/r/dropdown-menu.json +++ b/public/r/dropdown-menu.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/email-otp-button.json b/public/r/email-otp-button.json index 9b6f7ec1..154e3acf 100644 --- a/public/r/email-otp-button.json +++ b/public/r/email-otp-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/public/r/email-otp-form.json b/public/r/email-otp-form.json index 61028c21..a9f74077 100644 --- a/public/r/email-otp-form.json +++ b/public/r/email-otp-form.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", "input-otp", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/email-template.json b/public/r/email-template.json index 1a9814ad..d12bafba 100644 --- a/public/r/email-template.json +++ b/public/r/email-template.json @@ -8,7 +8,7 @@ "@react-email/components" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/forgot-password-form.json b/public/r/forgot-password-form.json index 479d36f7..aeec275a 100644 --- a/public/r/forgot-password-form.json +++ b/public/r/forgot-password-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/form-error.json b/public/r/form-error.json index abbd6892..9a51d5f3 100644 --- a/public/r/form-error.json +++ b/public/r/form-error.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "alert", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/utils.json" + "true/auth-form.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/form.json b/public/r/form.json index 544ad4d1..2f8d1187 100644 --- a/public/r/form.json +++ b/public/r/form.json @@ -11,7 +11,7 @@ ], "registryDependencies": [ "label", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/generic-oauth-options.json b/public/r/generic-oauth-options.json index 3b387764..e5b1c882 100644 --- a/public/r/generic-oauth-options.json +++ b/public/r/generic-oauth-options.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/social-providers.json" + "true/auth-client.json", + "true/social-providers.json" ], "files": [ { diff --git a/public/r/gravatar-utils.json b/public/r/gravatar-utils.json index 3fc43b4b..6ea5edf9 100644 --- a/public/r/gravatar-utils.json +++ b/public/r/gravatar-utils.json @@ -8,7 +8,7 @@ "@noble/hashes" ], "registryDependencies": [ - "http://localhost:3000/r/gravatar-options.json" + "true/gravatar-options.json" ], "files": [ { diff --git a/public/r/input-field-skeleton.json b/public/r/input-field-skeleton.json index 8335fb1b..749d5161 100644 --- a/public/r/input-field-skeleton.json +++ b/public/r/input-field-skeleton.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/input-otp.json b/public/r/input-otp.json index 2123b2b0..f2a0ebc1 100644 --- a/public/r/input-otp.json +++ b/public/r/input-otp.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/input.json b/public/r/input.json index 711aa112..fdc73352 100644 --- a/public/r/input.json +++ b/public/r/input.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/invitation-cell.json b/public/r/invitation-cell.json index 23df0614..6a58ba32 100644 --- a/public/r/invitation-cell.json +++ b/public/r/invitation-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/invitation.json", + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/invite-member-dialog.json b/public/r/invite-member-dialog.json index 1680b938..0c3463ed 100644 --- a/public/r/invite-member-dialog.json +++ b/public/r/invite-member-dialog.json @@ -12,15 +12,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/label.json b/public/r/label.json index 03a6300a..9790a361 100644 --- a/public/r/label.json +++ b/public/r/label.json @@ -8,7 +8,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/leave-organization-dialog.json b/public/r/leave-organization-dialog.json index 96f868cd..3538a95f 100644 --- a/public/r/leave-organization-dialog.json +++ b/public/r/leave-organization-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/magic-link-button.json b/public/r/magic-link-button.json index 0aabbb0e..e612a281 100644 --- a/public/r/magic-link-button.json +++ b/public/r/magic-link-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { diff --git a/public/r/magic-link-form.json b/public/r/magic-link-form.json index d8b4d2db..b06f9ae5 100644 --- a/public/r/magic-link-form.json +++ b/public/r/magic-link-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/member-cell.json b/public/r/member-cell.json index 66274741..411dfbd0 100644 --- a/public/r/member-cell.json +++ b/public/r/member-cell.json @@ -9,17 +9,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/remove-member-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-member-role-dialog.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/remove-member-dialog.json", + "true/settings-card.json", + "true/update-member-role-dialog.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/one-tap.json b/public/r/one-tap.json index cb3fef9d..cf0281ec 100644 --- a/public/r/one-tap.json +++ b/public/r/one-tap.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-cell-view.json b/public/r/organization-cell-view.json index fd987966..0c2105af 100644 --- a/public/r/organization-cell-view.json +++ b/public/r/organization-cell-view.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/organization-logo.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/organization-logo.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-cell.json b/public/r/organization-cell.json index 6ba436fa..f9856267 100644 --- a/public/r/organization-cell.json +++ b/public/r/organization-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-invitations-card.json b/public/r/organization-invitations-card.json index 884465c0..5f0f6105 100644 --- a/public/r/organization-invitations-card.json +++ b/public/r/organization-invitations-card.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invitation-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invitation-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-logo-card.json b/public/r/organization-logo-card.json index 88ea3f9a..d6f3d7c9 100644 --- a/public/r/organization-logo-card.json +++ b/public/r/organization-logo-card.json @@ -9,18 +9,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/organization-logo.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-logo.json b/public/r/organization-logo.json index c6fcc074..e79ab104 100644 --- a/public/r/organization-logo.json +++ b/public/r/organization-logo.json @@ -9,11 +9,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-members-card.json b/public/r/organization-members-card.json index 2fa79988..66b1dbc3 100644 --- a/public/r/organization-members-card.json +++ b/public/r/organization-members-card.json @@ -8,13 +8,13 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invite-member-dialog.json", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invite-member-dialog.json", + "true/member-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-name-card.json b/public/r/organization-name-card.json index bc112dcf..95f77ea2 100644 --- a/public/r/organization-name-card.json +++ b/public/r/organization-name-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-options.json b/public/r/organization-options.json index 5e1cc229..f2241171 100644 --- a/public/r/organization-options.json +++ b/public/r/organization-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { diff --git a/public/r/organization-refetcher.json b/public/r/organization-refetcher.json index 6abfa7e4..a7920e60 100644 --- a/public/r/organization-refetcher.json +++ b/public/r/organization-refetcher.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/use-current-organization.json" ], "files": [ { diff --git a/public/r/organization-settings-cards.json b/public/r/organization-settings-cards.json index 28373edd..251f183f 100644 --- a/public/r/organization-settings-cards.json +++ b/public/r/organization-settings-cards.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-card.json", - "http://localhost:3000/r/organization-logo-card.json", - "http://localhost:3000/r/organization-name-card.json", - "http://localhost:3000/r/organization-slug-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-organization-card.json", + "true/organization-logo-card.json", + "true/organization-name-card.json", + "true/organization-slug-card.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-slug-card.json b/public/r/organization-slug-card.json index 9d5664c3..98a75610 100644 --- a/public/r/organization-slug-card.json +++ b/public/r/organization-slug-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-switcher.json b/public/r/organization-switcher.json index 1de2c5b9..c2f7b2f1 100644 --- a/public/r/organization-switcher.json +++ b/public/r/organization-switcher.json @@ -9,19 +9,19 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/create-organization-dialog.json", + "true/create-organization-dialog.json", "dropdown-menu", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/organization-logo.json", + "true/personal-account-view.json", + "true/use-current-organization.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organization-view.json b/public/r/organization-view.json index c908138e..bcb3fdbb 100644 --- a/public/r/organization-view.json +++ b/public/r/organization-view.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-view.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-view.json", + "true/api-keys-card.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organization-invitations-card.json", - "http://localhost:3000/r/organization-members-card.json", - "http://localhost:3000/r/organization-settings-cards.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/organization-invitations-card.json", + "true/organization-members-card.json", + "true/organization-settings-cards.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/organizations-card.json b/public/r/organizations-card.json index b5e70067..03cae5ff 100644 --- a/public/r/organizations-card.json +++ b/public/r/organizations-card.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-organization-dialog.json", - "http://localhost:3000/r/organization-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/create-organization-dialog.json", + "true/organization-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/passkey-button.json b/public/r/passkey-button.json index c63f76f6..f2c98704 100644 --- a/public/r/passkey-button.json +++ b/public/r/passkey-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/passkey-cell.json b/public/r/passkey-cell.json index 6d9d507b..ad765eb8 100644 --- a/public/r/passkey-cell.json +++ b/public/r/passkey-cell.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/passkeys-card.json b/public/r/passkeys-card.json index 2f40c110..48f2c229 100644 --- a/public/r/passkeys-card.json +++ b/public/r/passkeys-card.json @@ -8,14 +8,14 @@ "react-hook-form" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/passkey-cell.json", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/passkey-cell.json", + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/password-input.json b/public/r/password-input.json index 49878dc0..37226e8d 100644 --- a/public/r/password-input.json +++ b/public/r/password-input.json @@ -10,7 +10,7 @@ "registryDependencies": [ "button", "input", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/personal-account-view.json b/public/r/personal-account-view.json index 383f1e53..74ab72ce 100644 --- a/public/r/personal-account-view.json +++ b/public/r/personal-account-view.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/provider-button.json b/public/r/provider-button.json index 0de4abc1..22b2d442 100644 --- a/public/r/provider-button.json +++ b/public/r/provider-button.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/provider-cell.json b/public/r/provider-cell.json index 9aa164d1..584ce11c 100644 --- a/public/r/provider-cell.json +++ b/public/r/provider-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", + "true/refetch.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/providers-card.json b/public/r/providers-card.json index 03c26378..da5dc9f6 100644 --- a/public/r/providers-card.json +++ b/public/r/providers-card.json @@ -6,15 +6,15 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/provider-cell.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/provider-cell.json", + "true/refetch.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/social-providers.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/recaptcha-badge.json b/public/r/recaptcha-badge.json index 309f8bf8..b7f762f9 100644 --- a/public/r/recaptcha-badge.json +++ b/public/r/recaptcha-badge.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/recaptcha-v2.json b/public/r/recaptcha-v2.json index cce6faa7..44b0cdf3 100644 --- a/public/r/recaptcha-v2.json +++ b/public/r/recaptcha-v2.json @@ -8,10 +8,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/use-lang.json", + "true/use-theme.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/recaptcha-v3.json b/public/r/recaptcha-v3.json index d8829c4c..43493147 100644 --- a/public/r/recaptcha-v3.json +++ b/public/r/recaptcha-v3.json @@ -8,10 +8,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/use-lang.json", + "true/use-theme.json" ], "files": [ { diff --git a/public/r/recover-account-form.json b/public/r/recover-account-form.json index 81235d33..22aa8612 100644 --- a/public/r/recover-account-form.json +++ b/public/r/recover-account-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/redirect-to-sign-in.json b/public/r/redirect-to-sign-in.json index 8a17c12d..17ef9529 100644 --- a/public/r/redirect-to-sign-in.json +++ b/public/r/redirect-to-sign-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { diff --git a/public/r/redirect-to-sign-up.json b/public/r/redirect-to-sign-up.json index 57856f9f..5fba214b 100644 --- a/public/r/redirect-to-sign-up.json +++ b/public/r/redirect-to-sign-up.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { diff --git a/public/r/remove-member-dialog.json b/public/r/remove-member-dialog.json index f5ea009f..f2aa22c7 100644 --- a/public/r/remove-member-dialog.json +++ b/public/r/remove-member-dialog.json @@ -9,13 +9,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/member-cell.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/reset-password-form.json b/public/r/reset-password-form.json index a8a6b24a..01d7a4e6 100644 --- a/public/r/reset-password-form.json +++ b/public/r/reset-password-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/security-settings-cards.json b/public/r/security-settings-cards.json index db45e62e..71a81e24 100644 --- a/public/r/security-settings-cards.json +++ b/public/r/security-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-password-card.json", - "http://localhost:3000/r/delete-account-card.json", - "http://localhost:3000/r/passkeys-card.json", - "http://localhost:3000/r/providers-card.json", - "http://localhost:3000/r/sessions-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-password-card.json", + "true/delete-account-card.json", + "true/passkeys-card.json", + "true/providers-card.json", + "true/sessions-card.json", + "true/settings-card.json", + "true/two-factor-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/select.json b/public/r/select.json index 968c7425..290efa2b 100644 --- a/public/r/select.json +++ b/public/r/select.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/separator.json b/public/r/separator.json index 10e8a44f..598ad6f2 100644 --- a/public/r/separator.json +++ b/public/r/separator.json @@ -8,7 +8,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/session-cell.json b/public/r/session-cell.json index 88752ec5..26d8eaea 100644 --- a/public/r/session-cell.json +++ b/public/r/session-cell.json @@ -10,13 +10,13 @@ "ua-parser-js" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/session-freshness-dialog.json b/public/r/session-freshness-dialog.json index 775dca3b..97ee5e29 100644 --- a/public/r/session-freshness-dialog.json +++ b/public/r/session-freshness-dialog.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/sessions-card.json b/public/r/sessions-card.json index 2ad6809b..1bd49dc2 100644 --- a/public/r/sessions-card.json +++ b/public/r/sessions-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/session-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/utils.json" + "true/session-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/settings-action-button.json b/public/r/settings-action-button.json index 9d7951f8..263b48ce 100644 --- a/public/r/settings-action-button.json +++ b/public/r/settings-action-button.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "button", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/settings-card-footer.json b/public/r/settings-card-footer.json index f278340c..e766a13f 100644 --- a/public/r/settings-card-footer.json +++ b/public/r/settings-card-footer.json @@ -7,10 +7,10 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-action-button.json", - "http://localhost:3000/r/settings-card.json", + "true/settings-action-button.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/settings-card-header.json b/public/r/settings-card-header.json index bdf72e93..20d5479c 100644 --- a/public/r/settings-card-header.json +++ b/public/r/settings-card-header.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/settings-card.json b/public/r/settings-card.json index 8a935166..167fbb99 100644 --- a/public/r/settings-card.json +++ b/public/r/settings-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", + "true/auth-localization.json", "card", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/settings-cell-skeleton.json b/public/r/settings-cell-skeleton.json index 47c97a0c..61b06cfc 100644 --- a/public/r/settings-cell-skeleton.json +++ b/public/r/settings-cell-skeleton.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/sign-in-form.json b/public/r/sign-in-form.json index 6c3c98dd..58842c53 100644 --- a/public/r/sign-in-form.json +++ b/public/r/sign-in-form.json @@ -12,20 +12,20 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "form", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/sign-out.json b/public/r/sign-out.json index 0e6a238b..82e91a8a 100644 --- a/public/r/sign-out.json +++ b/public/r/sign-out.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { diff --git a/public/r/sign-up-form.json b/public/r/sign-up-form.json index 5a97db3a..bb5a195c 100644 --- a/public/r/sign-up-form.json +++ b/public/r/sign-up-form.json @@ -12,24 +12,24 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", + "true/password-input.json", + "true/password-validation.json", "textarea", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/signed-in.json b/public/r/signed-in.json index 793fdfcb..ed5a2115 100644 --- a/public/r/signed-in.json +++ b/public/r/signed-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/signed-out.json b/public/r/signed-out.json index 84959925..2ab39c8b 100644 --- a/public/r/signed-out.json +++ b/public/r/signed-out.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/skeleton.json b/public/r/skeleton.json index 282f5451..715f391c 100644 --- a/public/r/skeleton.json +++ b/public/r/skeleton.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/social-options.json b/public/r/social-options.json index e4ee7009..9e3bb258 100644 --- a/public/r/social-options.json +++ b/public/r/social-options.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json" + "true/auth-client.json" ], "files": [ { diff --git a/public/r/social-providers.json b/public/r/social-providers.json index f3a5ba7a..5ec87e5c 100644 --- a/public/r/social-providers.json +++ b/public/r/social-providers.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/provider-icons.json" + "true/provider-icons.json" ], "files": [ { diff --git a/public/r/tabs.json b/public/r/tabs.json index 7b1455a2..5f1c0f1c 100644 --- a/public/r/tabs.json +++ b/public/r/tabs.json @@ -8,7 +8,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/textarea.json b/public/r/textarea.json index b104e4bb..d0d52244 100644 --- a/public/r/textarea.json +++ b/public/r/textarea.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/two-factor-card.json b/public/r/two-factor-card.json index 5d763015..24a17a28 100644 --- a/public/r/two-factor-card.json +++ b/public/r/two-factor-card.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-password-dialog.json" + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/two-factor-password-dialog.json" ], "files": [ { diff --git a/public/r/two-factor-form.json b/public/r/two-factor-form.json index f0316e78..af27cad4 100644 --- a/public/r/two-factor-form.json +++ b/public/r/two-factor-form.json @@ -13,19 +13,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/two-factor-password-dialog.json b/public/r/two-factor-password-dialog.json index e9055bd7..c6f0a80d 100644 --- a/public/r/two-factor-password-dialog.json +++ b/public/r/two-factor-password-dialog.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/backup-codes-dialog.json", + "true/auth-ui-provider.json", + "true/backup-codes-dialog.json", "button", "dialog", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/update-avatar-card.json b/public/r/update-avatar-card.json index 2f64c293..e86ed14e 100644 --- a/public/r/update-avatar-card.json +++ b/public/r/update-avatar-card.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/update-field-card.json b/public/r/update-field-card.json index 790f069a..1ffea02a 100644 --- a/public/r/update-field-card.json +++ b/public/r/update-field-card.json @@ -10,17 +10,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/additional-fields.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "checkbox", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", "textarea", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/update-member-role-dialog.json b/public/r/update-member-role-dialog.json index b3bb7b17..95147eb0 100644 --- a/public/r/update-member-role-dialog.json +++ b/public/r/update-member-role-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", + "true/member-cell.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/update-name-card.json b/public/r/update-name-card.json index c084da9c..16430deb 100644 --- a/public/r/update-name-card.json +++ b/public/r/update-name-card.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { diff --git a/public/r/update-username-card.json b/public/r/update-username-card.json index bc0c9216..a4122d33 100644 --- a/public/r/update-username-card.json +++ b/public/r/update-username-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-client.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { diff --git a/public/r/use-auth-data.json b/public/r/use-auth-data.json index acbe078b..e26121d6 100644 --- a/public/r/use-auth-data.json +++ b/public/r/use-auth-data.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-data-cache.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/fetch-error.json", - "http://localhost:3000/r/utils.json" + "true/auth-data-cache.json", + "true/auth-ui-provider.json", + "true/fetch-error.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/use-authenticate.json b/public/r/use-authenticate.json index ec054d85..e3b3e4b0 100644 --- a/public/r/use-authenticate.json +++ b/public/r/use-authenticate.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/any-auth-client.json", + "true/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/use-captcha.json b/public/r/use-captcha.json index 50f16dab..a56593dd 100644 --- a/public/r/use-captcha.json +++ b/public/r/use-captcha.json @@ -11,8 +11,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-localization.json", + "true/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/use-current-organization.json b/public/r/use-current-organization.json index bb8ae23d..22f4df09 100644 --- a/public/r/use-current-organization.json +++ b/public/r/use-current-organization.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/use-instant-options.json b/public/r/use-instant-options.json index 8b3eaf10..6dff1921 100644 --- a/public/r/use-instant-options.json +++ b/public/r/use-instant-options.json @@ -9,14 +9,14 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json", + "true/model-names.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { diff --git a/public/r/use-list-accounts.json b/public/r/use-list-accounts.json index 5f2a8800..106a1684 100644 --- a/public/r/use-list-accounts.json +++ b/public/r/use-list-accounts.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { diff --git a/public/r/use-list-sessions.json b/public/r/use-list-sessions.json index 55b22ded..3ef5f124 100644 --- a/public/r/use-list-sessions.json +++ b/public/r/use-list-sessions.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { diff --git a/public/r/use-session.json b/public/r/use-session.json index 5b4c6202..00da30bb 100644 --- a/public/r/use-session.json +++ b/public/r/use-session.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { diff --git a/public/r/use-success-transition.json b/public/r/use-success-transition.json index e22e2c2f..f258832a 100644 --- a/public/r/use-success-transition.json +++ b/public/r/use-success-transition.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/use-tanstack-options.json b/public/r/use-tanstack-options.json index 24c12d8e..917b24e7 100644 --- a/public/r/use-tanstack-options.json +++ b/public/r/use-tanstack-options.json @@ -9,10 +9,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json" + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json" ], "files": [ { diff --git a/public/r/use-triplit-hooks.json b/public/r/use-triplit-hooks.json index 89b08351..22a2ea2e 100644 --- a/public/r/use-triplit-hooks.json +++ b/public/r/use-triplit-hooks.json @@ -9,12 +9,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { diff --git a/public/r/user-avatar.json b/public/r/user-avatar.json index fd4191f0..99ebdd0b 100644 --- a/public/r/user-avatar.json +++ b/public/r/user-avatar.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", - "http://localhost:3000/r/gravatar-utils.json", - "http://localhost:3000/r/profile.json", + "true/gravatar-utils.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { diff --git a/public/r/user-button.json b/public/r/user-button.json index 44bab9da..5647f993 100644 --- a/public/r/user-button.json +++ b/public/r/user-button.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dropdown-menu", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/use-hydrated.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/user-invitations-card.json b/public/r/user-invitations-card.json index b01ea9be..3c540954 100644 --- a/public/r/user-invitations-card.json +++ b/public/r/user-invitations-card.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/user-view.json b/public/r/user-view.json index 6c432bd2..b550de00 100644 --- a/public/r/user-view.json +++ b/public/r/user-view.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/profile.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/utils.json" ], "files": [ { diff --git a/public/r/utils.json b/public/r/utils.json index 0d42bca3..a19306a7 100644 --- a/public/r/utils.json +++ b/public/r/utils.json @@ -10,8 +10,8 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/password-validation.json" + "true/auth-localization.json", + "true/password-validation.json" ], "files": [ { diff --git a/registry.json b/registry.json index 606573de..8e9904e1 100644 --- a/registry.json +++ b/registry.json @@ -12,15 +12,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", + "true/organization-cell-view.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-authenticate.json", - "http://localhost:3000/r/utils.json" + "true/use-authenticate.json", + "true/utils.json" ], "files": [ { @@ -39,15 +39,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -64,7 +64,7 @@ "target": "types/account-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { @@ -81,16 +81,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/accounts-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-email-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-avatar-card.json", - "http://localhost:3000/r/update-field-card.json", - "http://localhost:3000/r/update-name-card.json", - "http://localhost:3000/r/update-username-card.json", - "http://localhost:3000/r/utils.json" + "true/accounts-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-email-card.json", + "true/settings-card.json", + "true/update-avatar-card.json", + "true/update-field-card.json", + "true/update-name-card.json", + "true/update-username-card.json", + "true/utils.json" ], "files": [ { @@ -108,18 +108,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-settings-cards.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-settings-cards.json", + "true/api-keys-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organizations-card.json", - "http://localhost:3000/r/security-settings-cards.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-invitations-card.json", - "http://localhost:3000/r/utils.json" + "true/organizations-card.json", + "true/security-settings-cards.json", + "true/settings-card.json", + "true/user-invitations-card.json", + "true/utils.json" ], "files": [ { @@ -135,12 +135,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/account-cell.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-cell.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -190,7 +190,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -258,16 +258,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/api-key-delete-dialog.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/api-key-delete-dialog.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { @@ -285,16 +285,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { @@ -312,12 +312,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -349,13 +349,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/api-key-cell.json", - "http://localhost:3000/r/api-key-display-dialog.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key-cell.json", + "true/api-key-display-dialog.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-api-key-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/create-api-key-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -373,8 +373,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { @@ -422,20 +422,20 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/email-otp-form.json", - "http://localhost:3000/r/forgot-password-form.json", - "http://localhost:3000/r/magic-link-form.json", - "http://localhost:3000/r/recover-account-form.json", - "http://localhost:3000/r/reset-password-form.json", - "http://localhost:3000/r/sign-in-form.json", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/sign-up-form.json", - "http://localhost:3000/r/two-factor-form.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/auth-callback.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/email-otp-form.json", + "true/forgot-password-form.json", + "true/magic-link-form.json", + "true/recover-account-form.json", + "true/reset-password-form.json", + "true/sign-in-form.json", + "true/sign-out.json", + "true/sign-up-form.json", + "true/two-factor-form.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -455,11 +455,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/refetch.json" + "true/any-auth-client.json", + "true/api-key.json", + "true/auth-client.json", + "true/invitation.json", + "true/refetch.json" ], "files": [ { @@ -476,7 +476,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -493,21 +493,21 @@ "target": "localization/auth-localization.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/admin-error-codes.json", - "http://localhost:3000/r/anonymous-error-codes.json", - "http://localhost:3000/r/api-key-error-codes.json", - "http://localhost:3000/r/base-error-codes.json", - "http://localhost:3000/r/captcha-error-codes.json", - "http://localhost:3000/r/email-otp-error-codes.json", - "http://localhost:3000/r/generic-oauth-error-codes.json", - "http://localhost:3000/r/haveibeenpwned-error-codes.json", - "http://localhost:3000/r/multi-session-error-codes.json", - "http://localhost:3000/r/organization-error-codes.json", - "http://localhost:3000/r/passkey-error-codes.json", - "http://localhost:3000/r/phone-number-error-codes.json", - "http://localhost:3000/r/stripe-localization.json", - "http://localhost:3000/r/two-factor-error-codes.json", - "http://localhost:3000/r/username-error-codes.json" + "true/admin-error-codes.json", + "true/anonymous-error-codes.json", + "true/api-key-error-codes.json", + "true/base-error-codes.json", + "true/captcha-error-codes.json", + "true/email-otp-error-codes.json", + "true/generic-oauth-error-codes.json", + "true/haveibeenpwned-error-codes.json", + "true/multi-session-error-codes.json", + "true/organization-error-codes.json", + "true/passkey-error-codes.json", + "true/phone-number-error-codes.json", + "true/stripe-localization.json", + "true/two-factor-error-codes.json", + "true/username-error-codes.json" ], "files": [ { @@ -542,28 +542,28 @@ "sonner" ], "registryDependencies": [ - "http://localhost:3000/r/account-options.json", - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/avatar-options.json", - "http://localhost:3000/r/captcha-options.json", - "http://localhost:3000/r/credentials-options.json", - "http://localhost:3000/r/delete-user-options.json", - "http://localhost:3000/r/generic-oauth-options.json", - "http://localhost:3000/r/gravatar-options.json", - "http://localhost:3000/r/link.json", - "http://localhost:3000/r/organization-options.json", - "http://localhost:3000/r/organization-refetcher.json", - "http://localhost:3000/r/recaptcha-v3.json", - "http://localhost:3000/r/render-toast.json", - "http://localhost:3000/r/sign-up-options.json", - "http://localhost:3000/r/social-options.json", - "http://localhost:3000/r/use-auth-data.json", - "http://localhost:3000/r/view-paths.json" + "true/account-options.json", + "true/additional-fields.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-localization.json", + "true/auth-mutators.json", + "true/avatar-options.json", + "true/captcha-options.json", + "true/credentials-options.json", + "true/delete-user-options.json", + "true/generic-oauth-options.json", + "true/gravatar-options.json", + "true/link.json", + "true/organization-options.json", + "true/organization-refetcher.json", + "true/recaptcha-v3.json", + "true/render-toast.json", + "true/sign-up-options.json", + "true/social-options.json", + "true/use-auth-data.json", + "true/view-paths.json" ], "files": [ { @@ -579,8 +579,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-tanstack-options.json" + "true/auth-ui-provider.json", + "true/use-tanstack-options.json" ], "files": [ { @@ -598,23 +598,23 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-callback.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/email-otp-button.json", - "http://localhost:3000/r/magic-link-button.json", - "http://localhost:3000/r/one-tap.json", - "http://localhost:3000/r/passkey-button.json", - "http://localhost:3000/r/provider-button.json", + "true/email-otp-button.json", + "true/magic-link-button.json", + "true/one-tap.json", + "true/passkey-button.json", + "true/provider-button.json", "separator", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/sign-out.json", + "true/social-providers.json", + "true/use-hydrated.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -632,7 +632,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -649,7 +649,7 @@ "target": "types/avatar-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/image.json" + "true/image.json" ], "files": [ { @@ -668,11 +668,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -707,7 +707,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -726,11 +726,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/recaptcha-badge.json", - "http://localhost:3000/r/recaptcha-v2.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/recaptcha-badge.json", + "true/recaptcha-v2.json", + "true/use-theme.json" ], "files": [ { @@ -763,7 +763,7 @@ "target": "types/captcha-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/captcha-provider.json" + "true/captcha-provider.json" ], "files": [ { @@ -796,7 +796,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -816,13 +816,13 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -842,15 +842,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/input-field-skeleton.json", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/input-field-skeleton.json", + "true/password-input.json", + "true/password-validation.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -869,7 +869,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -891,19 +891,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/refetch.json", + "true/organization-cell-view.json", + "true/personal-account-view.json", + "true/refetch.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { @@ -924,17 +924,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-logo.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -951,7 +951,7 @@ "target": "types/credentials-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/password-validation.json" + "true/password-validation.json" ], "files": [ { @@ -968,10 +968,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-account-dialog.json", - "http://localhost:3000/r/settings-card.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-account-dialog.json", + "true/settings-card.json" ], "files": [ { @@ -992,16 +992,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -1019,10 +1019,10 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/delete-organization-dialog.json", + "true/settings-card.json", + "true/use-current-organization.json" ], "files": [ { @@ -1044,16 +1044,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1088,7 +1088,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1106,7 +1106,7 @@ "vaul" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1125,7 +1125,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1143,12 +1143,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -1185,17 +1185,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", "input-otp", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -1213,7 +1213,7 @@ "@react-email/components" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1251,16 +1251,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -1281,7 +1281,7 @@ ], "registryDependencies": [ "label", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1301,8 +1301,8 @@ ], "registryDependencies": [ "alert", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/utils.json" + "true/auth-form.json", + "true/utils.json" ], "files": [ { @@ -1335,8 +1335,8 @@ "target": "types/generic-oauth-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/social-providers.json" + "true/auth-client.json", + "true/social-providers.json" ], "files": [ { @@ -1371,7 +1371,7 @@ "@noble/hashes" ], "registryDependencies": [ - "http://localhost:3000/r/gravatar-options.json" + "true/gravatar-options.json" ], "files": [ { @@ -1433,7 +1433,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1449,9 +1449,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1470,7 +1470,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1505,15 +1505,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/invitation.json", + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -1535,15 +1535,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1561,7 +1561,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1580,14 +1580,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1621,12 +1621,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -1648,16 +1648,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -1676,17 +1676,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/remove-member-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-member-role-dialog.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/remove-member-dialog.json", + "true/settings-card.json", + "true/update-member-role-dialog.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -1746,10 +1746,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -1768,15 +1768,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1794,11 +1794,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/organization-logo.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/organization-logo.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1832,12 +1832,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invitation-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invitation-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1856,11 +1856,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1879,18 +1879,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/organization-logo.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1908,13 +1908,13 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invite-member-dialog.json", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invite-member-dialog.json", + "true/member-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1935,14 +1935,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1959,7 +1959,7 @@ "target": "types/organization-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { @@ -1976,8 +1976,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/use-current-organization.json" ], "files": [ { @@ -1993,14 +1993,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-card.json", - "http://localhost:3000/r/organization-logo-card.json", - "http://localhost:3000/r/organization-name-card.json", - "http://localhost:3000/r/organization-slug-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-organization-card.json", + "true/organization-logo-card.json", + "true/organization-name-card.json", + "true/organization-slug-card.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2021,14 +2021,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -2047,19 +2047,19 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/create-organization-dialog.json", + "true/create-organization-dialog.json", "dropdown-menu", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/organization-logo.json", + "true/personal-account-view.json", + "true/use-current-organization.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -2077,17 +2077,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-view.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-view.json", + "true/api-keys-card.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organization-invitations-card.json", - "http://localhost:3000/r/organization-members-card.json", - "http://localhost:3000/r/organization-settings-cards.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/organization-invitations-card.json", + "true/organization-members-card.json", + "true/organization-settings-cards.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -2103,14 +2103,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-organization-dialog.json", - "http://localhost:3000/r/organization-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/create-organization-dialog.json", + "true/organization-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -2144,12 +2144,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -2167,13 +2167,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2207,14 +2207,14 @@ "react-hook-form" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/passkey-cell.json", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/passkey-cell.json", + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2234,7 +2234,7 @@ "registryDependencies": [ "button", "input", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2266,11 +2266,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -2320,12 +2320,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { @@ -2344,15 +2344,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", + "true/refetch.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { @@ -2382,15 +2382,15 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/provider-cell.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/provider-cell.json", + "true/refetch.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/social-providers.json", + "true/utils.json" ], "files": [ { @@ -2406,10 +2406,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -2427,10 +2427,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/use-lang.json", + "true/use-theme.json", + "true/utils.json" ], "files": [ { @@ -2448,10 +2448,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/use-lang.json", + "true/use-theme.json" ], "files": [ { @@ -2472,14 +2472,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -2495,7 +2495,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { @@ -2511,7 +2511,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { @@ -2546,13 +2546,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/member-cell.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2589,14 +2589,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/utils.json" ], "files": [ { @@ -2612,16 +2612,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-password-card.json", - "http://localhost:3000/r/delete-account-card.json", - "http://localhost:3000/r/passkeys-card.json", - "http://localhost:3000/r/providers-card.json", - "http://localhost:3000/r/sessions-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-password-card.json", + "true/delete-account-card.json", + "true/passkeys-card.json", + "true/providers-card.json", + "true/sessions-card.json", + "true/settings-card.json", + "true/two-factor-card.json", + "true/utils.json" ], "files": [ { @@ -2640,7 +2640,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2658,7 +2658,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2678,13 +2678,13 @@ "ua-parser-js" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2700,12 +2700,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2721,13 +2721,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/session-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/utils.json" + "true/session-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/utils.json" ], "files": [ { @@ -2747,8 +2747,8 @@ ], "registryDependencies": [ "button", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2764,12 +2764,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", + "true/auth-localization.json", "card", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -2786,10 +2786,10 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-action-button.json", - "http://localhost:3000/r/settings-card.json", + "true/settings-action-button.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2806,9 +2806,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2825,9 +2825,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2849,20 +2849,20 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "form", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -2880,8 +2880,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { @@ -2903,24 +2903,24 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", + "true/password-input.json", + "true/password-validation.json", "textarea", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -2952,7 +2952,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -2968,7 +2968,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -2984,7 +2984,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3003,7 +3003,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json" + "true/auth-client.json" ], "files": [ { @@ -3020,7 +3020,7 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/provider-icons.json" + "true/provider-icons.json" ], "files": [ { @@ -3054,7 +3054,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3070,7 +3070,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3086,11 +3086,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-password-dialog.json" + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/two-factor-password-dialog.json" ], "files": [ { @@ -3129,19 +3129,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -3162,14 +3162,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/backup-codes-dialog.json", + "true/auth-ui-provider.json", + "true/backup-codes-dialog.json", "button", "dialog", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -3187,17 +3187,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -3217,17 +3217,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/additional-fields.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "checkbox", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", "textarea", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3246,14 +3246,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", + "true/member-cell.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -3269,9 +3269,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { @@ -3287,10 +3287,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-client.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { @@ -3306,10 +3306,10 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-data-cache.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/fetch-error.json", - "http://localhost:3000/r/utils.json" + "true/auth-data-cache.json", + "true/auth-ui-provider.json", + "true/fetch-error.json", + "true/utils.json" ], "files": [ { @@ -3325,8 +3325,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/any-auth-client.json", + "true/auth-ui-provider.json" ], "files": [ { @@ -3347,8 +3347,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-localization.json", + "true/auth-ui-provider.json" ], "files": [ { @@ -3383,7 +3383,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -3416,14 +3416,14 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json", + "true/model-names.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { @@ -3455,9 +3455,9 @@ "@better-fetch/fetch" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-instant-options.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-instant-options.json" ], "files": [ { @@ -3473,11 +3473,11 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { @@ -3495,9 +3495,9 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-instant-options.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-instant-options.json" ], "files": [ { @@ -3515,11 +3515,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { @@ -3537,10 +3537,10 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-instant-options.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/model-names.json", + "true/use-instant-options.json" ], "files": [ { @@ -3556,12 +3556,12 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { @@ -3577,8 +3577,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/utils.json" ], "files": [ { @@ -3597,10 +3597,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json" + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json" ], "files": [ { @@ -3633,12 +3633,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { @@ -3673,13 +3673,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", - "http://localhost:3000/r/gravatar-utils.json", - "http://localhost:3000/r/profile.json", + "true/gravatar-utils.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3697,16 +3697,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dropdown-menu", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/use-hydrated.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -3724,13 +3724,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -3746,12 +3746,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/profile.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -3787,8 +3787,8 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/password-validation.json" + "true/auth-localization.json", + "true/password-validation.json" ], "files": [ { diff --git a/registry/registry.json b/registry/registry.json index 606573de..8e9904e1 100644 --- a/registry/registry.json +++ b/registry/registry.json @@ -12,15 +12,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", + "true/organization-cell-view.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-authenticate.json", - "http://localhost:3000/r/utils.json" + "true/use-authenticate.json", + "true/utils.json" ], "files": [ { @@ -39,15 +39,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -64,7 +64,7 @@ "target": "types/account-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { @@ -81,16 +81,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/accounts-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-email-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-avatar-card.json", - "http://localhost:3000/r/update-field-card.json", - "http://localhost:3000/r/update-name-card.json", - "http://localhost:3000/r/update-username-card.json", - "http://localhost:3000/r/utils.json" + "true/accounts-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-email-card.json", + "true/settings-card.json", + "true/update-avatar-card.json", + "true/update-field-card.json", + "true/update-name-card.json", + "true/update-username-card.json", + "true/utils.json" ], "files": [ { @@ -108,18 +108,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-settings-cards.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-settings-cards.json", + "true/api-keys-card.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organizations-card.json", - "http://localhost:3000/r/security-settings-cards.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-invitations-card.json", - "http://localhost:3000/r/utils.json" + "true/organizations-card.json", + "true/security-settings-cards.json", + "true/settings-card.json", + "true/user-invitations-card.json", + "true/utils.json" ], "files": [ { @@ -135,12 +135,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/account-cell.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-cell.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -190,7 +190,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -258,16 +258,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/api-key-delete-dialog.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/api-key-delete-dialog.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { @@ -285,16 +285,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { @@ -312,12 +312,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -349,13 +349,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/api-key-cell.json", - "http://localhost:3000/r/api-key-display-dialog.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/api-key-cell.json", + "true/api-key-display-dialog.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-api-key-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/create-api-key-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -373,8 +373,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { @@ -422,20 +422,20 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/email-otp-form.json", - "http://localhost:3000/r/forgot-password-form.json", - "http://localhost:3000/r/magic-link-form.json", - "http://localhost:3000/r/recover-account-form.json", - "http://localhost:3000/r/reset-password-form.json", - "http://localhost:3000/r/sign-in-form.json", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/sign-up-form.json", - "http://localhost:3000/r/two-factor-form.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/auth-callback.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/email-otp-form.json", + "true/forgot-password-form.json", + "true/magic-link-form.json", + "true/recover-account-form.json", + "true/reset-password-form.json", + "true/sign-in-form.json", + "true/sign-out.json", + "true/sign-up-form.json", + "true/two-factor-form.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -455,11 +455,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/api-key.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/refetch.json" + "true/any-auth-client.json", + "true/api-key.json", + "true/auth-client.json", + "true/invitation.json", + "true/refetch.json" ], "files": [ { @@ -476,7 +476,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -493,21 +493,21 @@ "target": "localization/auth-localization.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/admin-error-codes.json", - "http://localhost:3000/r/anonymous-error-codes.json", - "http://localhost:3000/r/api-key-error-codes.json", - "http://localhost:3000/r/base-error-codes.json", - "http://localhost:3000/r/captcha-error-codes.json", - "http://localhost:3000/r/email-otp-error-codes.json", - "http://localhost:3000/r/generic-oauth-error-codes.json", - "http://localhost:3000/r/haveibeenpwned-error-codes.json", - "http://localhost:3000/r/multi-session-error-codes.json", - "http://localhost:3000/r/organization-error-codes.json", - "http://localhost:3000/r/passkey-error-codes.json", - "http://localhost:3000/r/phone-number-error-codes.json", - "http://localhost:3000/r/stripe-localization.json", - "http://localhost:3000/r/two-factor-error-codes.json", - "http://localhost:3000/r/username-error-codes.json" + "true/admin-error-codes.json", + "true/anonymous-error-codes.json", + "true/api-key-error-codes.json", + "true/base-error-codes.json", + "true/captcha-error-codes.json", + "true/email-otp-error-codes.json", + "true/generic-oauth-error-codes.json", + "true/haveibeenpwned-error-codes.json", + "true/multi-session-error-codes.json", + "true/organization-error-codes.json", + "true/passkey-error-codes.json", + "true/phone-number-error-codes.json", + "true/stripe-localization.json", + "true/two-factor-error-codes.json", + "true/username-error-codes.json" ], "files": [ { @@ -542,28 +542,28 @@ "sonner" ], "registryDependencies": [ - "http://localhost:3000/r/account-options.json", - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/avatar-options.json", - "http://localhost:3000/r/captcha-options.json", - "http://localhost:3000/r/credentials-options.json", - "http://localhost:3000/r/delete-user-options.json", - "http://localhost:3000/r/generic-oauth-options.json", - "http://localhost:3000/r/gravatar-options.json", - "http://localhost:3000/r/link.json", - "http://localhost:3000/r/organization-options.json", - "http://localhost:3000/r/organization-refetcher.json", - "http://localhost:3000/r/recaptcha-v3.json", - "http://localhost:3000/r/render-toast.json", - "http://localhost:3000/r/sign-up-options.json", - "http://localhost:3000/r/social-options.json", - "http://localhost:3000/r/use-auth-data.json", - "http://localhost:3000/r/view-paths.json" + "true/account-options.json", + "true/additional-fields.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-localization.json", + "true/auth-mutators.json", + "true/avatar-options.json", + "true/captcha-options.json", + "true/credentials-options.json", + "true/delete-user-options.json", + "true/generic-oauth-options.json", + "true/gravatar-options.json", + "true/link.json", + "true/organization-options.json", + "true/organization-refetcher.json", + "true/recaptcha-v3.json", + "true/render-toast.json", + "true/sign-up-options.json", + "true/social-options.json", + "true/use-auth-data.json", + "true/view-paths.json" ], "files": [ { @@ -579,8 +579,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-tanstack-options.json" + "true/auth-ui-provider.json", + "true/use-tanstack-options.json" ], "files": [ { @@ -598,23 +598,23 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-callback.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-callback.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/email-otp-button.json", - "http://localhost:3000/r/magic-link-button.json", - "http://localhost:3000/r/one-tap.json", - "http://localhost:3000/r/passkey-button.json", - "http://localhost:3000/r/provider-button.json", + "true/email-otp-button.json", + "true/magic-link-button.json", + "true/one-tap.json", + "true/passkey-button.json", + "true/provider-button.json", "separator", - "http://localhost:3000/r/sign-out.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/sign-out.json", + "true/social-providers.json", + "true/use-hydrated.json", + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -632,7 +632,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -649,7 +649,7 @@ "target": "types/avatar-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/image.json" + "true/image.json" ], "files": [ { @@ -668,11 +668,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -707,7 +707,7 @@ "class-variance-authority" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -726,11 +726,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/recaptcha-badge.json", - "http://localhost:3000/r/recaptcha-v2.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/recaptcha-badge.json", + "true/recaptcha-v2.json", + "true/use-theme.json" ], "files": [ { @@ -763,7 +763,7 @@ "target": "types/captcha-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/captcha-provider.json" + "true/captcha-provider.json" ], "files": [ { @@ -796,7 +796,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -816,13 +816,13 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -842,15 +842,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/input-field-skeleton.json", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/input-field-skeleton.json", + "true/password-input.json", + "true/password-validation.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -869,7 +869,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -891,19 +891,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/refetch.json", + "true/organization-cell-view.json", + "true/personal-account-view.json", + "true/refetch.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/use-lang.json", + "true/utils.json" ], "files": [ { @@ -924,17 +924,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-logo.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -951,7 +951,7 @@ "target": "types/credentials-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/password-validation.json" + "true/password-validation.json" ], "files": [ { @@ -968,10 +968,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-account-dialog.json", - "http://localhost:3000/r/settings-card.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-account-dialog.json", + "true/settings-card.json" ], "files": [ { @@ -992,16 +992,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -1019,10 +1019,10 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/delete-organization-dialog.json", + "true/settings-card.json", + "true/use-current-organization.json" ], "files": [ { @@ -1044,16 +1044,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1088,7 +1088,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1106,7 +1106,7 @@ "vaul" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1125,7 +1125,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1143,12 +1143,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -1185,17 +1185,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", "input-otp", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -1213,7 +1213,7 @@ "@react-email/components" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1251,16 +1251,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -1281,7 +1281,7 @@ ], "registryDependencies": [ "label", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1301,8 +1301,8 @@ ], "registryDependencies": [ "alert", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/utils.json" + "true/auth-form.json", + "true/utils.json" ], "files": [ { @@ -1335,8 +1335,8 @@ "target": "types/generic-oauth-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/social-providers.json" + "true/auth-client.json", + "true/social-providers.json" ], "files": [ { @@ -1371,7 +1371,7 @@ "@noble/hashes" ], "registryDependencies": [ - "http://localhost:3000/r/gravatar-options.json" + "true/gravatar-options.json" ], "files": [ { @@ -1433,7 +1433,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1449,9 +1449,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1470,7 +1470,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1505,15 +1505,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/invitation.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/invitation.json", + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -1535,15 +1535,15 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1561,7 +1561,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1580,14 +1580,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dialog", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1621,12 +1621,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/utils.json", - "http://localhost:3000/r/view-paths.json" + "true/utils.json", + "true/view-paths.json" ], "files": [ { @@ -1648,16 +1648,16 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "form", "input", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -1676,17 +1676,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/remove-member-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-member-role-dialog.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/remove-member-dialog.json", + "true/settings-card.json", + "true/update-member-role-dialog.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -1746,10 +1746,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -1768,15 +1768,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/leave-organization-dialog.json", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/leave-organization-dialog.json", + "true/organization-cell-view.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -1794,11 +1794,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/organization-logo.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/organization-logo.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1832,12 +1832,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invitation-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invitation-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1856,11 +1856,11 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -1879,18 +1879,18 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/organization-logo.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1908,13 +1908,13 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/invite-member-dialog.json", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/invite-member-dialog.json", + "true/member-cell.json", + "true/settings-card.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1935,14 +1935,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -1959,7 +1959,7 @@ "target": "types/organization-options.ts", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/view-paths.json" + "true/view-paths.json" ], "files": [ { @@ -1976,8 +1976,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-current-organization.json" + "true/auth-ui-provider.json", + "true/use-current-organization.json" ], "files": [ { @@ -1993,14 +1993,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/delete-organization-card.json", - "http://localhost:3000/r/organization-logo-card.json", - "http://localhost:3000/r/organization-name-card.json", - "http://localhost:3000/r/organization-slug-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/delete-organization-card.json", + "true/organization-logo-card.json", + "true/organization-name-card.json", + "true/organization-slug-card.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2021,14 +2021,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -2047,19 +2047,19 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/create-organization-dialog.json", + "true/create-organization-dialog.json", "dropdown-menu", - "http://localhost:3000/r/organization-cell-view.json", - "http://localhost:3000/r/organization-logo.json", - "http://localhost:3000/r/personal-account-view.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/organization-cell-view.json", + "true/organization-logo.json", + "true/personal-account-view.json", + "true/use-current-organization.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -2077,17 +2077,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/account-view.json", - "http://localhost:3000/r/api-keys-card.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/account-view.json", + "true/api-keys-card.json", + "true/auth-ui-provider.json", "button", "drawer", "label", - "http://localhost:3000/r/organization-invitations-card.json", - "http://localhost:3000/r/organization-members-card.json", - "http://localhost:3000/r/organization-settings-cards.json", - "http://localhost:3000/r/use-current-organization.json", - "http://localhost:3000/r/utils.json" + "true/organization-invitations-card.json", + "true/organization-members-card.json", + "true/organization-settings-cards.json", + "true/use-current-organization.json", + "true/utils.json" ], "files": [ { @@ -2103,14 +2103,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/create-organization-dialog.json", - "http://localhost:3000/r/organization-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/create-organization-dialog.json", + "true/organization-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -2144,12 +2144,12 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -2167,13 +2167,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2207,14 +2207,14 @@ "react-hook-form" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "form", - "http://localhost:3000/r/passkey-cell.json", - "http://localhost:3000/r/session-freshness-dialog.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/passkey-cell.json", + "true/session-freshness-dialog.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2234,7 +2234,7 @@ "registryDependencies": [ "button", "input", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2266,11 +2266,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -2320,12 +2320,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/auth-view.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/auth-view.json", "button", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { @@ -2344,15 +2344,15 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", + "true/refetch.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/social-providers.json", + "true/utils.json" ], "files": [ { @@ -2382,15 +2382,15 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/provider-cell.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/social-providers.json", - "http://localhost:3000/r/utils.json" + "true/provider-cell.json", + "true/refetch.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/social-providers.json", + "true/utils.json" ], "files": [ { @@ -2406,10 +2406,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/utils.json" ], "files": [ { @@ -2427,10 +2427,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/use-lang.json", + "true/use-theme.json", + "true/utils.json" ], "files": [ { @@ -2448,10 +2448,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-lang.json", - "http://localhost:3000/r/use-theme.json" + "true/auth-ui-provider.json", + "true/use-hydrated.json", + "true/use-lang.json", + "true/use-theme.json" ], "files": [ { @@ -2472,14 +2472,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", "input", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -2495,7 +2495,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { @@ -2511,7 +2511,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/use-authenticate.json" + "true/use-authenticate.json" ], "files": [ { @@ -2546,13 +2546,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/member-cell.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2589,14 +2589,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/utils.json" ], "files": [ { @@ -2612,16 +2612,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/change-password-card.json", - "http://localhost:3000/r/delete-account-card.json", - "http://localhost:3000/r/passkeys-card.json", - "http://localhost:3000/r/providers-card.json", - "http://localhost:3000/r/sessions-card.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-card.json", - "http://localhost:3000/r/utils.json" + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/change-password-card.json", + "true/delete-account-card.json", + "true/passkeys-card.json", + "true/providers-card.json", + "true/sessions-card.json", + "true/settings-card.json", + "true/two-factor-card.json", + "true/utils.json" ], "files": [ { @@ -2640,7 +2640,7 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2658,7 +2658,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2678,13 +2678,13 @@ "ua-parser-js" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/refetch.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2700,12 +2700,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2721,13 +2721,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", - "http://localhost:3000/r/session-cell.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-cell-skeleton.json", - "http://localhost:3000/r/utils.json" + "true/session-cell.json", + "true/settings-card.json", + "true/settings-cell-skeleton.json", + "true/utils.json" ], "files": [ { @@ -2747,8 +2747,8 @@ ], "registryDependencies": [ "button", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -2764,12 +2764,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", + "true/auth-localization.json", "card", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -2786,10 +2786,10 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-action-button.json", - "http://localhost:3000/r/settings-card.json", + "true/settings-action-button.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2806,9 +2806,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2825,9 +2825,9 @@ "dependencies": [], "registryDependencies": [ "card", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -2849,20 +2849,20 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "form", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/password-validation.json", + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -2880,8 +2880,8 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/use-success-transition.json" + "true/auth-ui-provider.json", + "true/use-success-transition.json" ], "files": [ { @@ -2903,24 +2903,24 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", - "http://localhost:3000/r/captcha.json", + "true/captcha.json", "checkbox", "dropdown-menu", "form", - "http://localhost:3000/r/image-utils.json", + "true/image-utils.json", "input", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/password-validation.json", + "true/password-input.json", + "true/password-validation.json", "textarea", - "http://localhost:3000/r/use-captcha.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/use-captcha.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -2952,7 +2952,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -2968,7 +2968,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -2984,7 +2984,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3003,7 +3003,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json" + "true/auth-client.json" ], "files": [ { @@ -3020,7 +3020,7 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/provider-icons.json" + "true/provider-icons.json" ], "files": [ { @@ -3054,7 +3054,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3070,7 +3070,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3086,11 +3086,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/two-factor-password-dialog.json" + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/two-factor-password-dialog.json" ], "files": [ { @@ -3129,19 +3129,19 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-form.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-client.json", + "true/auth-form.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "http://localhost:3000/r/otp-input-group.json", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/use-success-transition.json", - "http://localhost:3000/r/utils.json" + "true/otp-input-group.json", + "true/use-hydrated.json", + "true/use-success-transition.json", + "true/utils.json" ], "files": [ { @@ -3162,14 +3162,14 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/backup-codes-dialog.json", + "true/auth-ui-provider.json", + "true/backup-codes-dialog.json", "button", "dialog", "form", - "http://localhost:3000/r/password-input.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/password-input.json", + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -3187,17 +3187,17 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/image-utils.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/settings-card-footer.json", - "http://localhost:3000/r/settings-card-header.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/image-utils.json", + "true/settings-card.json", + "true/settings-card-footer.json", + "true/settings-card-header.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -3217,17 +3217,17 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/additional-fields.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/additional-fields.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "card", "checkbox", "form", "input", - "http://localhost:3000/r/settings-card.json", + "true/settings-card.json", "skeleton", "textarea", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3246,14 +3246,14 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dialog", - "http://localhost:3000/r/member-cell.json", + "true/member-cell.json", "select", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/utils.json" ], "files": [ { @@ -3269,9 +3269,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { @@ -3287,10 +3287,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/update-field-card.json" + "true/auth-client.json", + "true/auth-ui-provider.json", + "true/settings-card.json", + "true/update-field-card.json" ], "files": [ { @@ -3306,10 +3306,10 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-data-cache.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/fetch-error.json", - "http://localhost:3000/r/utils.json" + "true/auth-data-cache.json", + "true/auth-ui-provider.json", + "true/fetch-error.json", + "true/utils.json" ], "files": [ { @@ -3325,8 +3325,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/any-auth-client.json", + "true/auth-ui-provider.json" ], "files": [ { @@ -3347,8 +3347,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-localization.json", + "true/auth-ui-provider.json" ], "files": [ { @@ -3383,7 +3383,7 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json" + "true/auth-ui-provider.json" ], "files": [ { @@ -3416,14 +3416,14 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json", + "true/model-names.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { @@ -3455,9 +3455,9 @@ "@better-fetch/fetch" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-instant-options.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-instant-options.json" ], "files": [ { @@ -3473,11 +3473,11 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { @@ -3495,9 +3495,9 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-instant-options.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-instant-options.json" ], "files": [ { @@ -3515,11 +3515,11 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { @@ -3537,10 +3537,10 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-instant-options.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/model-names.json", + "true/use-instant-options.json" ], "files": [ { @@ -3556,12 +3556,12 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/model-names.json", - "http://localhost:3000/r/use-conditional-query.json", - "http://localhost:3000/r/use-triplit-hooks.json", - "http://localhost:3000/r/use-triplit-token.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/model-names.json", + "true/use-conditional-query.json", + "true/use-triplit-hooks.json", + "true/use-triplit-token.json" ], "files": [ { @@ -3577,8 +3577,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/utils.json" + "true/auth-ui-provider.json", + "true/utils.json" ], "files": [ { @@ -3597,10 +3597,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/auth-mutators.json" + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-hooks.json", + "true/auth-mutators.json" ], "files": [ { @@ -3633,12 +3633,12 @@ "better-auth" ], "registryDependencies": [ - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-hooks.json", - "http://localhost:3000/r/refetch.json", - "http://localhost:3000/r/use-list-accounts.json", - "http://localhost:3000/r/use-list-sessions.json", - "http://localhost:3000/r/use-session.json" + "true/auth-client.json", + "true/auth-hooks.json", + "true/refetch.json", + "true/use-list-accounts.json", + "true/use-list-sessions.json", + "true/use-session.json" ], "files": [ { @@ -3673,13 +3673,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "avatar", - "http://localhost:3000/r/gravatar-utils.json", - "http://localhost:3000/r/profile.json", + "true/gravatar-utils.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/utils.json" + "true/utils.json" ], "files": [ { @@ -3697,16 +3697,16 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/any-auth-client.json", - "http://localhost:3000/r/auth-client.json", - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", + "true/any-auth-client.json", + "true/auth-client.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", "button", "dropdown-menu", - "http://localhost:3000/r/use-hydrated.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/user-view.json", - "http://localhost:3000/r/utils.json" + "true/use-hydrated.json", + "true/user-avatar.json", + "true/user-view.json", + "true/utils.json" ], "files": [ { @@ -3724,13 +3724,13 @@ "lucide-react" ], "registryDependencies": [ - "http://localhost:3000/r/auth-ui-provider.json", + "true/auth-ui-provider.json", "button", "card", "dropdown-menu", - "http://localhost:3000/r/settings-card.json", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/settings-card.json", + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -3746,12 +3746,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/auth-ui-provider.json", - "http://localhost:3000/r/profile.json", + "true/auth-localization.json", + "true/auth-ui-provider.json", + "true/profile.json", "skeleton", - "http://localhost:3000/r/user-avatar.json", - "http://localhost:3000/r/utils.json" + "true/user-avatar.json", + "true/utils.json" ], "files": [ { @@ -3787,8 +3787,8 @@ "zod" ], "registryDependencies": [ - "http://localhost:3000/r/auth-localization.json", - "http://localhost:3000/r/password-validation.json" + "true/auth-localization.json", + "true/password-validation.json" ], "files": [ { diff --git a/scripts/generate.mjs b/scripts/generate.mjs index bd40cad7..1c2686db 100644 --- a/scripts/generate.mjs +++ b/scripts/generate.mjs @@ -114,7 +114,6 @@ const INTERNAL_ROOTS = argv["internal-roots"] let REG_DEP_BASE = argv["registry-dependency-base-url"] || "http://localhost:3000/r/"; -if (!REG_DEP_BASE.endsWith("/")) REG_DEP_BASE += "/"; const DEFAULT_BASIC_COMPONENTS = [ "alert", From 86a9664cffc9532978db45c41abae02ff4339467 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:51:28 -0400 Subject: [PATCH 06/10] fix reg gen --- docs/public/r/accept-invitation-card.json | 12 +- docs/public/r/account-cell.json | 12 +- docs/public/r/account-options.json | 2 +- docs/public/r/account-settings-cards.json | 20 +- docs/public/r/account-view.json | 18 +- docs/public/r/accounts-card.json | 10 +- docs/public/r/alert.json | 2 +- docs/public/r/api-key-cell.json | 16 +- docs/public/r/api-key-delete-dialog.json | 14 +- docs/public/r/api-key-display-dialog.json | 8 +- docs/public/r/api-keys-card.json | 12 +- docs/public/r/auth-callback.json | 4 +- docs/public/r/auth-form.json | 28 +- docs/public/r/auth-hooks.json | 10 +- docs/public/r/auth-loading.json | 2 +- docs/public/r/auth-localization.json | 30 +- docs/public/r/auth-ui-provider-tanstack.json | 4 +- docs/public/r/auth-ui-provider.json | 44 +- docs/public/r/auth-view.json | 28 +- docs/public/r/avatar-options.json | 2 +- docs/public/r/avatar.json | 2 +- docs/public/r/backup-codes-dialog.json | 6 +- docs/public/r/button.json | 2 +- docs/public/r/captcha-options.json | 2 +- docs/public/r/captcha.json | 10 +- docs/public/r/card.json | 2 +- docs/public/r/change-email-card.json | 6 +- docs/public/r/change-password-card.json | 14 +- docs/public/r/checkbox.json | 2 +- docs/public/r/create-api-key-dialog.json | 16 +- docs/public/r/create-organization-dialog.json | 12 +- docs/public/r/credentials-options.json | 2 +- docs/public/r/delete-account-card.json | 8 +- docs/public/r/delete-account-dialog.json | 10 +- docs/public/r/delete-organization-card.json | 8 +- docs/public/r/delete-organization-dialog.json | 10 +- docs/public/r/dialog.json | 2 +- docs/public/r/drawer.json | 2 +- docs/public/r/dropdown-menu.json | 2 +- docs/public/r/email-otp-button.json | 10 +- docs/public/r/email-otp-form.json | 14 +- docs/public/r/email-template.json | 2 +- docs/public/r/forgot-password-form.json | 14 +- docs/public/r/form-error.json | 4 +- docs/public/r/form.json | 2 +- docs/public/r/generic-oauth-options.json | 4 +- docs/public/r/gravatar-utils.json | 2 +- docs/public/r/input-field-skeleton.json | 4 +- docs/public/r/input-otp.json | 2 +- docs/public/r/input.json | 2 +- docs/public/r/invitation-cell.json | 12 +- docs/public/r/invite-member-dialog.json | 8 +- docs/public/r/label.json | 2 +- docs/public/r/leave-organization-dialog.json | 10 +- docs/public/r/magic-link-button.json | 10 +- docs/public/r/magic-link-form.json | 14 +- docs/public/r/member-cell.json | 16 +- docs/public/r/one-tap.json | 8 +- docs/public/r/organization-cell-view.json | 8 +- docs/public/r/organization-cell.json | 12 +- .../r/organization-invitations-card.json | 10 +- docs/public/r/organization-logo-card.json | 18 +- docs/public/r/organization-logo.json | 6 +- docs/public/r/organization-members-card.json | 12 +- docs/public/r/organization-name-card.json | 8 +- docs/public/r/organization-options.json | 2 +- docs/public/r/organization-refetcher.json | 4 +- .../public/r/organization-settings-cards.json | 16 +- docs/public/r/organization-slug-card.json | 8 +- docs/public/r/organization-switcher.json | 22 +- docs/public/r/organization-view.json | 16 +- docs/public/r/organizations-card.json | 14 +- docs/public/r/passkey-button.json | 10 +- docs/public/r/passkey-cell.json | 10 +- docs/public/r/passkeys-card.json | 12 +- docs/public/r/password-input.json | 2 +- docs/public/r/personal-account-view.json | 8 +- docs/public/r/provider-button.json | 10 +- docs/public/r/provider-cell.json | 12 +- docs/public/r/providers-card.json | 16 +- docs/public/r/recaptcha-badge.json | 8 +- docs/public/r/recaptcha-v2.json | 8 +- docs/public/r/recaptcha-v3.json | 8 +- docs/public/r/recover-account-form.json | 10 +- docs/public/r/redirect-to-sign-in.json | 2 +- docs/public/r/redirect-to-sign-up.json | 2 +- docs/public/r/remove-member-dialog.json | 10 +- docs/public/r/reset-password-form.json | 12 +- docs/public/r/security-settings-cards.json | 20 +- docs/public/r/select.json | 2 +- docs/public/r/separator.json | 2 +- docs/public/r/session-cell.json | 10 +- docs/public/r/session-freshness-dialog.json | 8 +- docs/public/r/sessions-card.json | 12 +- docs/public/r/settings-action-button.json | 4 +- docs/public/r/settings-card-footer.json | 6 +- docs/public/r/settings-card-header.json | 4 +- docs/public/r/settings-card.json | 10 +- docs/public/r/settings-cell-skeleton.json | 4 +- docs/public/r/sign-in-form.json | 20 +- docs/public/r/sign-out.json | 4 +- docs/public/r/sign-up-form.json | 24 +- docs/public/r/signed-in.json | 2 +- docs/public/r/signed-out.json | 2 +- docs/public/r/skeleton.json | 2 +- docs/public/r/social-options.json | 2 +- docs/public/r/social-providers.json | 2 +- docs/public/r/tabs.json | 2 +- docs/public/r/textarea.json | 2 +- docs/public/r/two-factor-card.json | 10 +- docs/public/r/two-factor-form.json | 16 +- docs/public/r/two-factor-password-dialog.json | 10 +- docs/public/r/update-avatar-card.json | 16 +- docs/public/r/update-field-card.json | 10 +- docs/public/r/update-member-role-dialog.json | 10 +- docs/public/r/update-name-card.json | 6 +- docs/public/r/update-username-card.json | 8 +- docs/public/r/use-auth-data.json | 8 +- docs/public/r/use-authenticate.json | 4 +- docs/public/r/use-captcha.json | 4 +- docs/public/r/use-current-organization.json | 2 +- docs/public/r/use-instant-options.json | 16 +- docs/public/r/use-list-accounts.json | 10 +- docs/public/r/use-list-sessions.json | 10 +- docs/public/r/use-session.json | 12 +- docs/public/r/use-success-transition.json | 4 +- docs/public/r/use-tanstack-options.json | 8 +- docs/public/r/use-triplit-hooks.json | 12 +- docs/public/r/user-avatar.json | 10 +- docs/public/r/user-button.json | 16 +- docs/public/r/user-invitations-card.json | 8 +- docs/public/r/user-view.json | 10 +- docs/public/r/utils.json | 4 +- package.json | 2 +- public/r/accept-invitation-card.json | 12 +- public/r/account-cell.json | 12 +- public/r/account-options.json | 2 +- public/r/account-settings-cards.json | 20 +- public/r/account-view.json | 18 +- public/r/accounts-card.json | 10 +- public/r/alert.json | 2 +- public/r/api-key-cell.json | 16 +- public/r/api-key-delete-dialog.json | 14 +- public/r/api-key-display-dialog.json | 8 +- public/r/api-keys-card.json | 12 +- public/r/auth-callback.json | 4 +- public/r/auth-form.json | 28 +- public/r/auth-hooks.json | 10 +- public/r/auth-loading.json | 2 +- public/r/auth-localization.json | 30 +- public/r/auth-ui-provider-tanstack.json | 4 +- public/r/auth-ui-provider.json | 44 +- public/r/auth-view.json | 28 +- public/r/avatar-options.json | 2 +- public/r/avatar.json | 2 +- public/r/backup-codes-dialog.json | 6 +- public/r/button.json | 2 +- public/r/captcha-options.json | 2 +- public/r/captcha.json | 10 +- public/r/card.json | 2 +- public/r/change-email-card.json | 6 +- public/r/change-password-card.json | 14 +- public/r/checkbox.json | 2 +- public/r/create-api-key-dialog.json | 16 +- public/r/create-organization-dialog.json | 12 +- public/r/credentials-options.json | 2 +- public/r/delete-account-card.json | 8 +- public/r/delete-account-dialog.json | 10 +- public/r/delete-organization-card.json | 8 +- public/r/delete-organization-dialog.json | 10 +- public/r/dialog.json | 2 +- public/r/drawer.json | 2 +- public/r/dropdown-menu.json | 2 +- public/r/email-otp-button.json | 10 +- public/r/email-otp-form.json | 14 +- public/r/email-template.json | 2 +- public/r/forgot-password-form.json | 14 +- public/r/form-error.json | 4 +- public/r/form.json | 2 +- public/r/generic-oauth-options.json | 4 +- public/r/gravatar-utils.json | 2 +- public/r/input-field-skeleton.json | 4 +- public/r/input-otp.json | 2 +- public/r/input.json | 2 +- public/r/invitation-cell.json | 12 +- public/r/invite-member-dialog.json | 8 +- public/r/label.json | 2 +- public/r/leave-organization-dialog.json | 10 +- public/r/magic-link-button.json | 10 +- public/r/magic-link-form.json | 14 +- public/r/member-cell.json | 16 +- public/r/one-tap.json | 8 +- public/r/organization-cell-view.json | 8 +- public/r/organization-cell.json | 12 +- public/r/organization-invitations-card.json | 10 +- public/r/organization-logo-card.json | 18 +- public/r/organization-logo.json | 6 +- public/r/organization-members-card.json | 12 +- public/r/organization-name-card.json | 8 +- public/r/organization-options.json | 2 +- public/r/organization-refetcher.json | 4 +- public/r/organization-settings-cards.json | 16 +- public/r/organization-slug-card.json | 8 +- public/r/organization-switcher.json | 22 +- public/r/organization-view.json | 16 +- public/r/organizations-card.json | 14 +- public/r/passkey-button.json | 10 +- public/r/passkey-cell.json | 10 +- public/r/passkeys-card.json | 12 +- public/r/password-input.json | 2 +- public/r/personal-account-view.json | 8 +- public/r/provider-button.json | 10 +- public/r/provider-cell.json | 12 +- public/r/providers-card.json | 16 +- public/r/recaptcha-badge.json | 8 +- public/r/recaptcha-v2.json | 8 +- public/r/recaptcha-v3.json | 8 +- public/r/recover-account-form.json | 10 +- public/r/redirect-to-sign-in.json | 2 +- public/r/redirect-to-sign-up.json | 2 +- public/r/remove-member-dialog.json | 10 +- public/r/reset-password-form.json | 12 +- public/r/security-settings-cards.json | 20 +- public/r/select.json | 2 +- public/r/separator.json | 2 +- public/r/session-cell.json | 10 +- public/r/session-freshness-dialog.json | 8 +- public/r/sessions-card.json | 12 +- public/r/settings-action-button.json | 4 +- public/r/settings-card-footer.json | 6 +- public/r/settings-card-header.json | 4 +- public/r/settings-card.json | 10 +- public/r/settings-cell-skeleton.json | 4 +- public/r/sign-in-form.json | 20 +- public/r/sign-out.json | 4 +- public/r/sign-up-form.json | 24 +- public/r/signed-in.json | 2 +- public/r/signed-out.json | 2 +- public/r/skeleton.json | 2 +- public/r/social-options.json | 2 +- public/r/social-providers.json | 2 +- public/r/tabs.json | 2 +- public/r/textarea.json | 2 +- public/r/two-factor-card.json | 10 +- public/r/two-factor-form.json | 16 +- public/r/two-factor-password-dialog.json | 10 +- public/r/update-avatar-card.json | 16 +- public/r/update-field-card.json | 10 +- public/r/update-member-role-dialog.json | 10 +- public/r/update-name-card.json | 6 +- public/r/update-username-card.json | 8 +- public/r/use-auth-data.json | 8 +- public/r/use-authenticate.json | 4 +- public/r/use-captcha.json | 4 +- public/r/use-current-organization.json | 2 +- public/r/use-instant-options.json | 16 +- public/r/use-list-accounts.json | 10 +- public/r/use-list-sessions.json | 10 +- public/r/use-session.json | 12 +- public/r/use-success-transition.json | 4 +- public/r/use-tanstack-options.json | 8 +- public/r/use-triplit-hooks.json | 12 +- public/r/user-avatar.json | 10 +- public/r/user-button.json | 16 +- public/r/user-invitations-card.json | 8 +- public/r/user-view.json | 10 +- public/r/utils.json | 4 +- registry.json | 1220 ++++++++--------- registry/registry.json | 1220 ++++++++--------- scripts/generate.mjs | 2 + 270 files changed, 2423 insertions(+), 2421 deletions(-) diff --git a/docs/public/r/accept-invitation-card.json b/docs/public/r/accept-invitation-card.json index f1a1b1a6..b6b159bc 100644 --- a/docs/public/r/accept-invitation-card.json +++ b/docs/public/r/accept-invitation-card.json @@ -8,15 +8,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/organization-cell-view.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-authenticate.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-authenticate.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/account-cell.json b/docs/public/r/account-cell.json index f79c4e9c..ae7770da 100644 --- a/docs/public/r/account-cell.json +++ b/docs/public/r/account-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/refetch.json", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/account-options.json b/docs/public/r/account-options.json index 840f542b..c192aa20 100644 --- a/docs/public/r/account-options.json +++ b/docs/public/r/account-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/account-settings-cards.json b/docs/public/r/account-settings-cards.json index 5949760f..948b4c0b 100644 --- a/docs/public/r/account-settings-cards.json +++ b/docs/public/r/account-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/accounts-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-email-card.json", - "true/settings-card.json", - "true/update-avatar-card.json", - "true/update-field-card.json", - "true/update-name-card.json", - "true/update-username-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/accounts-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-email-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-avatar-card.json", + "https://better-auth-ui.com/r/update-field-card.json", + "https://better-auth-ui.com/r/update-name-card.json", + "https://better-auth-ui.com/r/update-username-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/account-view.json b/docs/public/r/account-view.json index 34be62a1..bbb01b46 100644 --- a/docs/public/r/account-view.json +++ b/docs/public/r/account-view.json @@ -8,18 +8,18 @@ "lucide-react" ], "registryDependencies": [ - "true/account-settings-cards.json", - "true/api-keys-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-settings-cards.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organizations-card.json", - "true/security-settings-cards.json", - "true/settings-card.json", - "true/user-invitations-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organizations-card.json", + "https://better-auth-ui.com/r/security-settings-cards.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-invitations-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/accounts-card.json b/docs/public/r/accounts-card.json index 657d9c71..3990b25c 100644 --- a/docs/public/r/accounts-card.json +++ b/docs/public/r/accounts-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/account-cell.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-cell.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/alert.json b/docs/public/r/alert.json index c0ed0a51..e0f308f5 100644 --- a/docs/public/r/alert.json +++ b/docs/public/r/alert.json @@ -8,7 +8,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/api-key-cell.json b/docs/public/r/api-key-cell.json index de3084ff..c09c02f2 100644 --- a/docs/public/r/api-key-cell.json +++ b/docs/public/r/api-key-cell.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/api-key-delete-dialog.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/api-key-delete-dialog.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/api-key-delete-dialog.json b/docs/public/r/api-key-delete-dialog.json index 1dd02965..8c67717a 100644 --- a/docs/public/r/api-key-delete-dialog.json +++ b/docs/public/r/api-key-delete-dialog.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/api-key-display-dialog.json b/docs/public/r/api-key-display-dialog.json index 876bc9af..42fd11be 100644 --- a/docs/public/r/api-key-display-dialog.json +++ b/docs/public/r/api-key-display-dialog.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/api-keys-card.json b/docs/public/r/api-keys-card.json index 0eafe807..2ae5234d 100644 --- a/docs/public/r/api-keys-card.json +++ b/docs/public/r/api-keys-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/api-key-cell.json", - "true/api-key-display-dialog.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key-cell.json", + "https://better-auth-ui.com/r/api-key-display-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-api-key-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-api-key-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/auth-callback.json b/docs/public/r/auth-callback.json index 8a381914..7f838c6c 100644 --- a/docs/public/r/auth-callback.json +++ b/docs/public/r/auth-callback.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { diff --git a/docs/public/r/auth-form.json b/docs/public/r/auth-form.json index 7a2e015f..edcc5326 100644 --- a/docs/public/r/auth-form.json +++ b/docs/public/r/auth-form.json @@ -6,20 +6,20 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/email-otp-form.json", - "true/forgot-password-form.json", - "true/magic-link-form.json", - "true/recover-account-form.json", - "true/reset-password-form.json", - "true/sign-in-form.json", - "true/sign-out.json", - "true/sign-up-form.json", - "true/two-factor-form.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/email-otp-form.json", + "https://better-auth-ui.com/r/forgot-password-form.json", + "https://better-auth-ui.com/r/magic-link-form.json", + "https://better-auth-ui.com/r/recover-account-form.json", + "https://better-auth-ui.com/r/reset-password-form.json", + "https://better-auth-ui.com/r/sign-in-form.json", + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/sign-up-form.json", + "https://better-auth-ui.com/r/two-factor-form.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/auth-hooks.json b/docs/public/r/auth-hooks.json index 4918820b..03d15374 100644 --- a/docs/public/r/auth-hooks.json +++ b/docs/public/r/auth-hooks.json @@ -9,11 +9,11 @@ "better-auth" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/api-key.json", - "true/auth-client.json", - "true/invitation.json", - "true/refetch.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/refetch.json" ], "files": [ { diff --git a/docs/public/r/auth-loading.json b/docs/public/r/auth-loading.json index c06f4ceb..827c4416 100644 --- a/docs/public/r/auth-loading.json +++ b/docs/public/r/auth-loading.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/auth-localization.json b/docs/public/r/auth-localization.json index 24fca6a9..c55575e5 100644 --- a/docs/public/r/auth-localization.json +++ b/docs/public/r/auth-localization.json @@ -6,21 +6,21 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/admin-error-codes.json", - "true/anonymous-error-codes.json", - "true/api-key-error-codes.json", - "true/base-error-codes.json", - "true/captcha-error-codes.json", - "true/email-otp-error-codes.json", - "true/generic-oauth-error-codes.json", - "true/haveibeenpwned-error-codes.json", - "true/multi-session-error-codes.json", - "true/organization-error-codes.json", - "true/passkey-error-codes.json", - "true/phone-number-error-codes.json", - "true/stripe-localization.json", - "true/two-factor-error-codes.json", - "true/username-error-codes.json" + "https://better-auth-ui.com/r/admin-error-codes.json", + "https://better-auth-ui.com/r/anonymous-error-codes.json", + "https://better-auth-ui.com/r/api-key-error-codes.json", + "https://better-auth-ui.com/r/base-error-codes.json", + "https://better-auth-ui.com/r/captcha-error-codes.json", + "https://better-auth-ui.com/r/email-otp-error-codes.json", + "https://better-auth-ui.com/r/generic-oauth-error-codes.json", + "https://better-auth-ui.com/r/haveibeenpwned-error-codes.json", + "https://better-auth-ui.com/r/multi-session-error-codes.json", + "https://better-auth-ui.com/r/organization-error-codes.json", + "https://better-auth-ui.com/r/passkey-error-codes.json", + "https://better-auth-ui.com/r/phone-number-error-codes.json", + "https://better-auth-ui.com/r/stripe-localization.json", + "https://better-auth-ui.com/r/two-factor-error-codes.json", + "https://better-auth-ui.com/r/username-error-codes.json" ], "files": [ { diff --git a/docs/public/r/auth-ui-provider-tanstack.json b/docs/public/r/auth-ui-provider-tanstack.json index 8e2b3312..7bbf9e2a 100644 --- a/docs/public/r/auth-ui-provider-tanstack.json +++ b/docs/public/r/auth-ui-provider-tanstack.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-tanstack-options.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-tanstack-options.json" ], "files": [ { diff --git a/docs/public/r/auth-ui-provider.json b/docs/public/r/auth-ui-provider.json index 5614a02f..5a9fcac3 100644 --- a/docs/public/r/auth-ui-provider.json +++ b/docs/public/r/auth-ui-provider.json @@ -8,28 +8,28 @@ "sonner" ], "registryDependencies": [ - "true/account-options.json", - "true/additional-fields.json", - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-localization.json", - "true/auth-mutators.json", - "true/avatar-options.json", - "true/captcha-options.json", - "true/credentials-options.json", - "true/delete-user-options.json", - "true/generic-oauth-options.json", - "true/gravatar-options.json", - "true/link.json", - "true/organization-options.json", - "true/organization-refetcher.json", - "true/recaptcha-v3.json", - "true/render-toast.json", - "true/sign-up-options.json", - "true/social-options.json", - "true/use-auth-data.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/account-options.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/avatar-options.json", + "https://better-auth-ui.com/r/captcha-options.json", + "https://better-auth-ui.com/r/credentials-options.json", + "https://better-auth-ui.com/r/delete-user-options.json", + "https://better-auth-ui.com/r/generic-oauth-options.json", + "https://better-auth-ui.com/r/gravatar-options.json", + "https://better-auth-ui.com/r/link.json", + "https://better-auth-ui.com/r/organization-options.json", + "https://better-auth-ui.com/r/organization-refetcher.json", + "https://better-auth-ui.com/r/recaptcha-v3.json", + "https://better-auth-ui.com/r/render-toast.json", + "https://better-auth-ui.com/r/sign-up-options.json", + "https://better-auth-ui.com/r/social-options.json", + "https://better-auth-ui.com/r/use-auth-data.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/auth-view.json b/docs/public/r/auth-view.json index 13e82272..aa7e5856 100644 --- a/docs/public/r/auth-view.json +++ b/docs/public/r/auth-view.json @@ -8,23 +8,23 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/email-otp-button.json", - "true/magic-link-button.json", - "true/one-tap.json", - "true/passkey-button.json", - "true/provider-button.json", + "https://better-auth-ui.com/r/email-otp-button.json", + "https://better-auth-ui.com/r/magic-link-button.json", + "https://better-auth-ui.com/r/one-tap.json", + "https://better-auth-ui.com/r/passkey-button.json", + "https://better-auth-ui.com/r/provider-button.json", "separator", - "true/sign-out.json", - "true/social-providers.json", - "true/use-hydrated.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/avatar-options.json b/docs/public/r/avatar-options.json index 1b82e061..446dac7b 100644 --- a/docs/public/r/avatar-options.json +++ b/docs/public/r/avatar-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/image.json" + "https://better-auth-ui.com/r/image.json" ], "files": [ { diff --git a/docs/public/r/avatar.json b/docs/public/r/avatar.json index 897c6dd0..46717f72 100644 --- a/docs/public/r/avatar.json +++ b/docs/public/r/avatar.json @@ -8,7 +8,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/backup-codes-dialog.json b/docs/public/r/backup-codes-dialog.json index 5c8a51c0..5960537f 100644 --- a/docs/public/r/backup-codes-dialog.json +++ b/docs/public/r/backup-codes-dialog.json @@ -8,11 +8,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/button.json b/docs/public/r/button.json index 56563106..5a8cc22c 100644 --- a/docs/public/r/button.json +++ b/docs/public/r/button.json @@ -9,7 +9,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/captcha-options.json b/docs/public/r/captcha-options.json index 46f380e3..f40259d4 100644 --- a/docs/public/r/captcha-options.json +++ b/docs/public/r/captcha-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/captcha-provider.json" + "https://better-auth-ui.com/r/captcha-provider.json" ], "files": [ { diff --git a/docs/public/r/captcha.json b/docs/public/r/captcha.json index fecff15f..62e1d9ee 100644 --- a/docs/public/r/captcha.json +++ b/docs/public/r/captcha.json @@ -9,11 +9,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/recaptcha-badge.json", - "true/recaptcha-v2.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/recaptcha-badge.json", + "https://better-auth-ui.com/r/recaptcha-v2.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { diff --git a/docs/public/r/card.json b/docs/public/r/card.json index c187ea94..c741d6ab 100644 --- a/docs/public/r/card.json +++ b/docs/public/r/card.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/change-email-card.json b/docs/public/r/change-email-card.json index a7837fa2..7b9ccb92 100644 --- a/docs/public/r/change-email-card.json +++ b/docs/public/r/change-email-card.json @@ -10,13 +10,13 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/change-password-card.json b/docs/public/r/change-password-card.json index d507f591..3ef06459 100644 --- a/docs/public/r/change-password-card.json +++ b/docs/public/r/change-password-card.json @@ -10,15 +10,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/input-field-skeleton.json", - "true/password-input.json", - "true/password-validation.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/input-field-skeleton.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/checkbox.json b/docs/public/r/checkbox.json index c761fd0f..b77c2f06 100644 --- a/docs/public/r/checkbox.json +++ b/docs/public/r/checkbox.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/create-api-key-dialog.json b/docs/public/r/create-api-key-dialog.json index bfab3c29..0ed86b99 100644 --- a/docs/public/r/create-api-key-dialog.json +++ b/docs/public/r/create-api-key-dialog.json @@ -12,19 +12,19 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/personal-account-view.json", - "true/refetch.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/refetch.json", "select", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/create-organization-dialog.json b/docs/public/r/create-organization-dialog.json index d763e04e..3e2afa7d 100644 --- a/docs/public/r/create-organization-dialog.json +++ b/docs/public/r/create-organization-dialog.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/organization-logo.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/credentials-options.json b/docs/public/r/credentials-options.json index 6e7d8512..ed36b57e 100644 --- a/docs/public/r/credentials-options.json +++ b/docs/public/r/credentials-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/password-validation.json" + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { diff --git a/docs/public/r/delete-account-card.json b/docs/public/r/delete-account-card.json index b59d0936..c010ff7f 100644 --- a/docs/public/r/delete-account-card.json +++ b/docs/public/r/delete-account-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-account-dialog.json", - "true/settings-card.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-account-dialog.json", + "https://better-auth-ui.com/r/settings-card.json" ], "files": [ { diff --git a/docs/public/r/delete-account-dialog.json b/docs/public/r/delete-account-dialog.json index 1d9eafa9..dfcd512d 100644 --- a/docs/public/r/delete-account-dialog.json +++ b/docs/public/r/delete-account-dialog.json @@ -11,16 +11,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/delete-organization-card.json b/docs/public/r/delete-organization-card.json index 192c60be..40c042df 100644 --- a/docs/public/r/delete-organization-card.json +++ b/docs/public/r/delete-organization-card.json @@ -8,10 +8,10 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/delete-organization-dialog.json", - "true/settings-card.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { diff --git a/docs/public/r/delete-organization-dialog.json b/docs/public/r/delete-organization-dialog.json index 860564b8..edfeb92a 100644 --- a/docs/public/r/delete-organization-dialog.json +++ b/docs/public/r/delete-organization-dialog.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/dialog.json b/docs/public/r/dialog.json index f80c5d41..750f761e 100644 --- a/docs/public/r/dialog.json +++ b/docs/public/r/dialog.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/drawer.json b/docs/public/r/drawer.json index 43c130b1..7b7c908e 100644 --- a/docs/public/r/drawer.json +++ b/docs/public/r/drawer.json @@ -8,7 +8,7 @@ "vaul" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/dropdown-menu.json b/docs/public/r/dropdown-menu.json index 1ccfb456..40ada282 100644 --- a/docs/public/r/dropdown-menu.json +++ b/docs/public/r/dropdown-menu.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/email-otp-button.json b/docs/public/r/email-otp-button.json index 154e3acf..d5912557 100644 --- a/docs/public/r/email-otp-button.json +++ b/docs/public/r/email-otp-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/email-otp-form.json b/docs/public/r/email-otp-form.json index a9f74077..d6ae4110 100644 --- a/docs/public/r/email-otp-form.json +++ b/docs/public/r/email-otp-form.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", "input-otp", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/email-template.json b/docs/public/r/email-template.json index d12bafba..2bc2b5e5 100644 --- a/docs/public/r/email-template.json +++ b/docs/public/r/email-template.json @@ -8,7 +8,7 @@ "@react-email/components" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/forgot-password-form.json b/docs/public/r/forgot-password-form.json index aeec275a..784882ff 100644 --- a/docs/public/r/forgot-password-form.json +++ b/docs/public/r/forgot-password-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/form-error.json b/docs/public/r/form-error.json index 9a51d5f3..0c9c5a4b 100644 --- a/docs/public/r/form-error.json +++ b/docs/public/r/form-error.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "alert", - "true/auth-form.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/form.json b/docs/public/r/form.json index 2f8d1187..51fbc845 100644 --- a/docs/public/r/form.json +++ b/docs/public/r/form.json @@ -11,7 +11,7 @@ ], "registryDependencies": [ "label", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/generic-oauth-options.json b/docs/public/r/generic-oauth-options.json index e5b1c882..96b6e89c 100644 --- a/docs/public/r/generic-oauth-options.json +++ b/docs/public/r/generic-oauth-options.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/social-providers.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/social-providers.json" ], "files": [ { diff --git a/docs/public/r/gravatar-utils.json b/docs/public/r/gravatar-utils.json index 6ea5edf9..576d4b1f 100644 --- a/docs/public/r/gravatar-utils.json +++ b/docs/public/r/gravatar-utils.json @@ -8,7 +8,7 @@ "@noble/hashes" ], "registryDependencies": [ - "true/gravatar-options.json" + "https://better-auth-ui.com/r/gravatar-options.json" ], "files": [ { diff --git a/docs/public/r/input-field-skeleton.json b/docs/public/r/input-field-skeleton.json index 749d5161..5e08b456 100644 --- a/docs/public/r/input-field-skeleton.json +++ b/docs/public/r/input-field-skeleton.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/input-otp.json b/docs/public/r/input-otp.json index f2a0ebc1..69cfdb0a 100644 --- a/docs/public/r/input-otp.json +++ b/docs/public/r/input-otp.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/input.json b/docs/public/r/input.json index fdc73352..fb37067f 100644 --- a/docs/public/r/input.json +++ b/docs/public/r/input.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/invitation-cell.json b/docs/public/r/invitation-cell.json index 6a58ba32..ffb6f3fd 100644 --- a/docs/public/r/invitation-cell.json +++ b/docs/public/r/invitation-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/invitation.json", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/invite-member-dialog.json b/docs/public/r/invite-member-dialog.json index 0c3463ed..1c5abb7d 100644 --- a/docs/public/r/invite-member-dialog.json +++ b/docs/public/r/invite-member-dialog.json @@ -12,15 +12,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/label.json b/docs/public/r/label.json index 9790a361..c617599d 100644 --- a/docs/public/r/label.json +++ b/docs/public/r/label.json @@ -8,7 +8,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/leave-organization-dialog.json b/docs/public/r/leave-organization-dialog.json index 3538a95f..508607da 100644 --- a/docs/public/r/leave-organization-dialog.json +++ b/docs/public/r/leave-organization-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/magic-link-button.json b/docs/public/r/magic-link-button.json index e612a281..407708ab 100644 --- a/docs/public/r/magic-link-button.json +++ b/docs/public/r/magic-link-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/magic-link-form.json b/docs/public/r/magic-link-form.json index b06f9ae5..93ea6d4b 100644 --- a/docs/public/r/magic-link-form.json +++ b/docs/public/r/magic-link-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/member-cell.json b/docs/public/r/member-cell.json index 411dfbd0..7d256d6a 100644 --- a/docs/public/r/member-cell.json +++ b/docs/public/r/member-cell.json @@ -9,17 +9,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/remove-member-dialog.json", - "true/settings-card.json", - "true/update-member-role-dialog.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/remove-member-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-member-role-dialog.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/one-tap.json b/docs/public/r/one-tap.json index cf0281ec..94090ae8 100644 --- a/docs/public/r/one-tap.json +++ b/docs/public/r/one-tap.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-cell-view.json b/docs/public/r/organization-cell-view.json index 0c2105af..f851e2b5 100644 --- a/docs/public/r/organization-cell-view.json +++ b/docs/public/r/organization-cell-view.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/organization-logo.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/organization-logo.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-cell.json b/docs/public/r/organization-cell.json index f9856267..939e7f4a 100644 --- a/docs/public/r/organization-cell.json +++ b/docs/public/r/organization-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-invitations-card.json b/docs/public/r/organization-invitations-card.json index 5f0f6105..9e2e2006 100644 --- a/docs/public/r/organization-invitations-card.json +++ b/docs/public/r/organization-invitations-card.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invitation-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-logo-card.json b/docs/public/r/organization-logo-card.json index d6f3d7c9..d59e70ad 100644 --- a/docs/public/r/organization-logo-card.json +++ b/docs/public/r/organization-logo-card.json @@ -9,18 +9,18 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/organization-logo.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-logo.json b/docs/public/r/organization-logo.json index e79ab104..375a7294 100644 --- a/docs/public/r/organization-logo.json +++ b/docs/public/r/organization-logo.json @@ -9,11 +9,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-members-card.json b/docs/public/r/organization-members-card.json index 66b1dbc3..bae0eb20 100644 --- a/docs/public/r/organization-members-card.json +++ b/docs/public/r/organization-members-card.json @@ -8,13 +8,13 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invite-member-dialog.json", - "true/member-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invite-member-dialog.json", + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-name-card.json b/docs/public/r/organization-name-card.json index 95f77ea2..0ca5eeb7 100644 --- a/docs/public/r/organization-name-card.json +++ b/docs/public/r/organization-name-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-options.json b/docs/public/r/organization-options.json index f2241171..c60b4eb9 100644 --- a/docs/public/r/organization-options.json +++ b/docs/public/r/organization-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/docs/public/r/organization-refetcher.json b/docs/public/r/organization-refetcher.json index a7920e60..469cda25 100644 --- a/docs/public/r/organization-refetcher.json +++ b/docs/public/r/organization-refetcher.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { diff --git a/docs/public/r/organization-settings-cards.json b/docs/public/r/organization-settings-cards.json index 251f183f..4b13c723 100644 --- a/docs/public/r/organization-settings-cards.json +++ b/docs/public/r/organization-settings-cards.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-organization-card.json", - "true/organization-logo-card.json", - "true/organization-name-card.json", - "true/organization-slug-card.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-card.json", + "https://better-auth-ui.com/r/organization-logo-card.json", + "https://better-auth-ui.com/r/organization-name-card.json", + "https://better-auth-ui.com/r/organization-slug-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-slug-card.json b/docs/public/r/organization-slug-card.json index 98a75610..8cc950fd 100644 --- a/docs/public/r/organization-slug-card.json +++ b/docs/public/r/organization-slug-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-switcher.json b/docs/public/r/organization-switcher.json index c2f7b2f1..ebf4f4d3 100644 --- a/docs/public/r/organization-switcher.json +++ b/docs/public/r/organization-switcher.json @@ -9,19 +9,19 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/create-organization-dialog.json", + "https://better-auth-ui.com/r/create-organization-dialog.json", "dropdown-menu", - "true/organization-cell-view.json", - "true/organization-logo.json", - "true/personal-account-view.json", - "true/use-current-organization.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organization-view.json b/docs/public/r/organization-view.json index bcb3fdbb..b7f9d806 100644 --- a/docs/public/r/organization-view.json +++ b/docs/public/r/organization-view.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "true/account-view.json", - "true/api-keys-card.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-view.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organization-invitations-card.json", - "true/organization-members-card.json", - "true/organization-settings-cards.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-invitations-card.json", + "https://better-auth-ui.com/r/organization-members-card.json", + "https://better-auth-ui.com/r/organization-settings-cards.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/organizations-card.json b/docs/public/r/organizations-card.json index 03cae5ff..76e5e9db 100644 --- a/docs/public/r/organizations-card.json +++ b/docs/public/r/organizations-card.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-organization-dialog.json", - "true/organization-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/passkey-button.json b/docs/public/r/passkey-button.json index f2c98704..288d9f04 100644 --- a/docs/public/r/passkey-button.json +++ b/docs/public/r/passkey-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/passkey-cell.json b/docs/public/r/passkey-cell.json index ad765eb8..86aa4c70 100644 --- a/docs/public/r/passkey-cell.json +++ b/docs/public/r/passkey-cell.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/passkeys-card.json b/docs/public/r/passkeys-card.json index 48f2c229..1db869eb 100644 --- a/docs/public/r/passkeys-card.json +++ b/docs/public/r/passkeys-card.json @@ -8,14 +8,14 @@ "react-hook-form" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/passkey-cell.json", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/passkey-cell.json", + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/password-input.json b/docs/public/r/password-input.json index 37226e8d..2f5817d4 100644 --- a/docs/public/r/password-input.json +++ b/docs/public/r/password-input.json @@ -10,7 +10,7 @@ "registryDependencies": [ "button", "input", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/personal-account-view.json b/docs/public/r/personal-account-view.json index 74ab72ce..a486b698 100644 --- a/docs/public/r/personal-account-view.json +++ b/docs/public/r/personal-account-view.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "skeleton", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/provider-button.json b/docs/public/r/provider-button.json index 22b2d442..ec1e9f39 100644 --- a/docs/public/r/provider-button.json +++ b/docs/public/r/provider-button.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/provider-cell.json b/docs/public/r/provider-cell.json index 584ce11c..be8372c2 100644 --- a/docs/public/r/provider-cell.json +++ b/docs/public/r/provider-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/providers-card.json b/docs/public/r/providers-card.json index da5dc9f6..e8bffe61 100644 --- a/docs/public/r/providers-card.json +++ b/docs/public/r/providers-card.json @@ -6,15 +6,15 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/provider-cell.json", - "true/refetch.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/provider-cell.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/recaptcha-badge.json b/docs/public/r/recaptcha-badge.json index b7f762f9..494defb9 100644 --- a/docs/public/r/recaptcha-badge.json +++ b/docs/public/r/recaptcha-badge.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/recaptcha-v2.json b/docs/public/r/recaptcha-v2.json index 44b0cdf3..51f47ad4 100644 --- a/docs/public/r/recaptcha-v2.json +++ b/docs/public/r/recaptcha-v2.json @@ -8,10 +8,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-lang.json", - "true/use-theme.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/recaptcha-v3.json b/docs/public/r/recaptcha-v3.json index 43493147..f6202d54 100644 --- a/docs/public/r/recaptcha-v3.json +++ b/docs/public/r/recaptcha-v3.json @@ -8,10 +8,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/use-lang.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { diff --git a/docs/public/r/recover-account-form.json b/docs/public/r/recover-account-form.json index 22aa8612..aedee6d9 100644 --- a/docs/public/r/recover-account-form.json +++ b/docs/public/r/recover-account-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/redirect-to-sign-in.json b/docs/public/r/redirect-to-sign-in.json index 17ef9529..30ba11c9 100644 --- a/docs/public/r/redirect-to-sign-in.json +++ b/docs/public/r/redirect-to-sign-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { diff --git a/docs/public/r/redirect-to-sign-up.json b/docs/public/r/redirect-to-sign-up.json index 5fba214b..8cb01cd8 100644 --- a/docs/public/r/redirect-to-sign-up.json +++ b/docs/public/r/redirect-to-sign-up.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { diff --git a/docs/public/r/remove-member-dialog.json b/docs/public/r/remove-member-dialog.json index f2aa22c7..00631db9 100644 --- a/docs/public/r/remove-member-dialog.json +++ b/docs/public/r/remove-member-dialog.json @@ -9,13 +9,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/reset-password-form.json b/docs/public/r/reset-password-form.json index 01d7a4e6..0869b827 100644 --- a/docs/public/r/reset-password-form.json +++ b/docs/public/r/reset-password-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", - "true/password-input.json", - "true/password-validation.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/security-settings-cards.json b/docs/public/r/security-settings-cards.json index 71a81e24..34ba6ac0 100644 --- a/docs/public/r/security-settings-cards.json +++ b/docs/public/r/security-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-password-card.json", - "true/delete-account-card.json", - "true/passkeys-card.json", - "true/providers-card.json", - "true/sessions-card.json", - "true/settings-card.json", - "true/two-factor-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-password-card.json", + "https://better-auth-ui.com/r/delete-account-card.json", + "https://better-auth-ui.com/r/passkeys-card.json", + "https://better-auth-ui.com/r/providers-card.json", + "https://better-auth-ui.com/r/sessions-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/select.json b/docs/public/r/select.json index 290efa2b..0b40d4c8 100644 --- a/docs/public/r/select.json +++ b/docs/public/r/select.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/separator.json b/docs/public/r/separator.json index 598ad6f2..b3bee590 100644 --- a/docs/public/r/separator.json +++ b/docs/public/r/separator.json @@ -8,7 +8,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/session-cell.json b/docs/public/r/session-cell.json index 26d8eaea..832ea786 100644 --- a/docs/public/r/session-cell.json +++ b/docs/public/r/session-cell.json @@ -10,13 +10,13 @@ "ua-parser-js" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/session-freshness-dialog.json b/docs/public/r/session-freshness-dialog.json index 97ee5e29..e526ca2d 100644 --- a/docs/public/r/session-freshness-dialog.json +++ b/docs/public/r/session-freshness-dialog.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/sessions-card.json b/docs/public/r/sessions-card.json index 1bd49dc2..179cd498 100644 --- a/docs/public/r/sessions-card.json +++ b/docs/public/r/sessions-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/session-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-action-button.json b/docs/public/r/settings-action-button.json index 263b48ce..687fc7c7 100644 --- a/docs/public/r/settings-action-button.json +++ b/docs/public/r/settings-action-button.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "button", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-card-footer.json b/docs/public/r/settings-card-footer.json index e766a13f..49c13d48 100644 --- a/docs/public/r/settings-card-footer.json +++ b/docs/public/r/settings-card-footer.json @@ -7,10 +7,10 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-action-button.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-action-button.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-card-header.json b/docs/public/r/settings-card-header.json index 20d5479c..3c8bb739 100644 --- a/docs/public/r/settings-card-header.json +++ b/docs/public/r/settings-card-header.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-card.json b/docs/public/r/settings-card.json index 167fbb99..f6bbea12 100644 --- a/docs/public/r/settings-card.json +++ b/docs/public/r/settings-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", + "https://better-auth-ui.com/r/auth-localization.json", "card", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/settings-cell-skeleton.json b/docs/public/r/settings-cell-skeleton.json index 61b06cfc..4579304d 100644 --- a/docs/public/r/settings-cell-skeleton.json +++ b/docs/public/r/settings-cell-skeleton.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/sign-in-form.json b/docs/public/r/sign-in-form.json index 58842c53..59d90fe1 100644 --- a/docs/public/r/sign-in-form.json +++ b/docs/public/r/sign-in-form.json @@ -12,20 +12,20 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "form", "input", - "true/password-input.json", - "true/password-validation.json", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/sign-out.json b/docs/public/r/sign-out.json index 82e91a8a..863abfc1 100644 --- a/docs/public/r/sign-out.json +++ b/docs/public/r/sign-out.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { diff --git a/docs/public/r/sign-up-form.json b/docs/public/r/sign-up-form.json index bb5a195c..3679293a 100644 --- a/docs/public/r/sign-up-form.json +++ b/docs/public/r/sign-up-form.json @@ -12,24 +12,24 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/password-input.json", - "true/password-validation.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", "textarea", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/signed-in.json b/docs/public/r/signed-in.json index ed5a2115..3bce83ac 100644 --- a/docs/public/r/signed-in.json +++ b/docs/public/r/signed-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/signed-out.json b/docs/public/r/signed-out.json index 2ab39c8b..eda953c2 100644 --- a/docs/public/r/signed-out.json +++ b/docs/public/r/signed-out.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/skeleton.json b/docs/public/r/skeleton.json index 715f391c..aedb1718 100644 --- a/docs/public/r/skeleton.json +++ b/docs/public/r/skeleton.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/social-options.json b/docs/public/r/social-options.json index 9e3bb258..8d896b27 100644 --- a/docs/public/r/social-options.json +++ b/docs/public/r/social-options.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json" + "https://better-auth-ui.com/r/auth-client.json" ], "files": [ { diff --git a/docs/public/r/social-providers.json b/docs/public/r/social-providers.json index 5ec87e5c..3fdde706 100644 --- a/docs/public/r/social-providers.json +++ b/docs/public/r/social-providers.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/provider-icons.json" + "https://better-auth-ui.com/r/provider-icons.json" ], "files": [ { diff --git a/docs/public/r/tabs.json b/docs/public/r/tabs.json index 5f1c0f1c..3a069a92 100644 --- a/docs/public/r/tabs.json +++ b/docs/public/r/tabs.json @@ -8,7 +8,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/textarea.json b/docs/public/r/textarea.json index d0d52244..a761e577 100644 --- a/docs/public/r/textarea.json +++ b/docs/public/r/textarea.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/two-factor-card.json b/docs/public/r/two-factor-card.json index 24a17a28..b6df5835 100644 --- a/docs/public/r/two-factor-card.json +++ b/docs/public/r/two-factor-card.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/two-factor-password-dialog.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-password-dialog.json" ], "files": [ { diff --git a/docs/public/r/two-factor-form.json b/docs/public/r/two-factor-form.json index af27cad4..fe4cb3d7 100644 --- a/docs/public/r/two-factor-form.json +++ b/docs/public/r/two-factor-form.json @@ -13,19 +13,19 @@ "zod" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/two-factor-password-dialog.json b/docs/public/r/two-factor-password-dialog.json index c6f0a80d..225ba81d 100644 --- a/docs/public/r/two-factor-password-dialog.json +++ b/docs/public/r/two-factor-password-dialog.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/backup-codes-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/backup-codes-dialog.json", "button", "dialog", "form", - "true/password-input.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/update-avatar-card.json b/docs/public/r/update-avatar-card.json index e86ed14e..bab50928 100644 --- a/docs/public/r/update-avatar-card.json +++ b/docs/public/r/update-avatar-card.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/update-field-card.json b/docs/public/r/update-field-card.json index 1ffea02a..3984f500 100644 --- a/docs/public/r/update-field-card.json +++ b/docs/public/r/update-field-card.json @@ -10,17 +10,17 @@ "zod" ], "registryDependencies": [ - "true/additional-fields.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "checkbox", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", "textarea", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/update-member-role-dialog.json b/docs/public/r/update-member-role-dialog.json index 95147eb0..971494fe 100644 --- a/docs/public/r/update-member-role-dialog.json +++ b/docs/public/r/update-member-role-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", + "https://better-auth-ui.com/r/member-cell.json", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/update-name-card.json b/docs/public/r/update-name-card.json index 16430deb..c229030f 100644 --- a/docs/public/r/update-name-card.json +++ b/docs/public/r/update-name-card.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { diff --git a/docs/public/r/update-username-card.json b/docs/public/r/update-username-card.json index a4122d33..d3b0d23c 100644 --- a/docs/public/r/update-username-card.json +++ b/docs/public/r/update-username-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { diff --git a/docs/public/r/use-auth-data.json b/docs/public/r/use-auth-data.json index e26121d6..9ea8c1a2 100644 --- a/docs/public/r/use-auth-data.json +++ b/docs/public/r/use-auth-data.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-data-cache.json", - "true/auth-ui-provider.json", - "true/fetch-error.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-data-cache.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/fetch-error.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/use-authenticate.json b/docs/public/r/use-authenticate.json index e3b3e4b0..fa0ec396 100644 --- a/docs/public/r/use-authenticate.json +++ b/docs/public/r/use-authenticate.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/use-captcha.json b/docs/public/r/use-captcha.json index a56593dd..446aadfc 100644 --- a/docs/public/r/use-captcha.json +++ b/docs/public/r/use-captcha.json @@ -11,8 +11,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/use-current-organization.json b/docs/public/r/use-current-organization.json index 22f4df09..4515d7b0 100644 --- a/docs/public/r/use-current-organization.json +++ b/docs/public/r/use-current-organization.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/docs/public/r/use-instant-options.json b/docs/public/r/use-instant-options.json index 6dff1921..3b15203f 100644 --- a/docs/public/r/use-instant-options.json +++ b/docs/public/r/use-instant-options.json @@ -9,14 +9,14 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json", - "true/model-names.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { diff --git a/docs/public/r/use-list-accounts.json b/docs/public/r/use-list-accounts.json index 106a1684..c83f0784 100644 --- a/docs/public/r/use-list-accounts.json +++ b/docs/public/r/use-list-accounts.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { diff --git a/docs/public/r/use-list-sessions.json b/docs/public/r/use-list-sessions.json index 3ef5f124..ea925d6f 100644 --- a/docs/public/r/use-list-sessions.json +++ b/docs/public/r/use-list-sessions.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { diff --git a/docs/public/r/use-session.json b/docs/public/r/use-session.json index 00da30bb..88ba1ff3 100644 --- a/docs/public/r/use-session.json +++ b/docs/public/r/use-session.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { diff --git a/docs/public/r/use-success-transition.json b/docs/public/r/use-success-transition.json index f258832a..e04db631 100644 --- a/docs/public/r/use-success-transition.json +++ b/docs/public/r/use-success-transition.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/use-tanstack-options.json b/docs/public/r/use-tanstack-options.json index 917b24e7..a218cf03 100644 --- a/docs/public/r/use-tanstack-options.json +++ b/docs/public/r/use-tanstack-options.json @@ -9,10 +9,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json" ], "files": [ { diff --git a/docs/public/r/use-triplit-hooks.json b/docs/public/r/use-triplit-hooks.json index 22a2ea2e..1456da45 100644 --- a/docs/public/r/use-triplit-hooks.json +++ b/docs/public/r/use-triplit-hooks.json @@ -9,12 +9,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { diff --git a/docs/public/r/user-avatar.json b/docs/public/r/user-avatar.json index 99ebdd0b..eb6dfc96 100644 --- a/docs/public/r/user-avatar.json +++ b/docs/public/r/user-avatar.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", - "true/gravatar-utils.json", - "true/profile.json", + "https://better-auth-ui.com/r/gravatar-utils.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/user-button.json b/docs/public/r/user-button.json index 5647f993..8f5e1683 100644 --- a/docs/public/r/user-button.json +++ b/docs/public/r/user-button.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dropdown-menu", - "true/use-hydrated.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/user-invitations-card.json b/docs/public/r/user-invitations-card.json index 3c540954..1f1d7292 100644 --- a/docs/public/r/user-invitations-card.json +++ b/docs/public/r/user-invitations-card.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/user-view.json b/docs/public/r/user-view.json index b550de00..f6fdb128 100644 --- a/docs/public/r/user-view.json +++ b/docs/public/r/user-view.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/profile.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/docs/public/r/utils.json b/docs/public/r/utils.json index a19306a7..2fbe8d3e 100644 --- a/docs/public/r/utils.json +++ b/docs/public/r/utils.json @@ -10,8 +10,8 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/password-validation.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { diff --git a/package.json b/package.json index e97eea50..322d6963 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "tsup --clean --dts && cp src/style.css dist/style.css", "dev": "tsc-watch", "prepublishOnly": "rm -rf dist && turbo build", - "registry:generate": "node scripts/generate.mjs --registry-homepage=https://better-auth-ui.com --registry-dependency-base-url https://better-auth-ui.com/r/", + "registry:generate": "node scripts/generate.mjs --registry-homepage=https://better-auth-ui.com --registry-dependency-base-url=https://better-auth-ui.com/r/", "registry:build": "shadcn build", "prepare": "husky", "copy-registry": "cp registry/registry.json ./registry.json", diff --git a/public/r/accept-invitation-card.json b/public/r/accept-invitation-card.json index f1a1b1a6..b6b159bc 100644 --- a/public/r/accept-invitation-card.json +++ b/public/r/accept-invitation-card.json @@ -8,15 +8,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/organization-cell-view.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-authenticate.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-authenticate.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/account-cell.json b/public/r/account-cell.json index f79c4e9c..ae7770da 100644 --- a/public/r/account-cell.json +++ b/public/r/account-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/refetch.json", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/account-options.json b/public/r/account-options.json index 840f542b..c192aa20 100644 --- a/public/r/account-options.json +++ b/public/r/account-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/account-settings-cards.json b/public/r/account-settings-cards.json index 5949760f..948b4c0b 100644 --- a/public/r/account-settings-cards.json +++ b/public/r/account-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/accounts-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-email-card.json", - "true/settings-card.json", - "true/update-avatar-card.json", - "true/update-field-card.json", - "true/update-name-card.json", - "true/update-username-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/accounts-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-email-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-avatar-card.json", + "https://better-auth-ui.com/r/update-field-card.json", + "https://better-auth-ui.com/r/update-name-card.json", + "https://better-auth-ui.com/r/update-username-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/account-view.json b/public/r/account-view.json index 34be62a1..bbb01b46 100644 --- a/public/r/account-view.json +++ b/public/r/account-view.json @@ -8,18 +8,18 @@ "lucide-react" ], "registryDependencies": [ - "true/account-settings-cards.json", - "true/api-keys-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-settings-cards.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organizations-card.json", - "true/security-settings-cards.json", - "true/settings-card.json", - "true/user-invitations-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organizations-card.json", + "https://better-auth-ui.com/r/security-settings-cards.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-invitations-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/accounts-card.json b/public/r/accounts-card.json index 657d9c71..3990b25c 100644 --- a/public/r/accounts-card.json +++ b/public/r/accounts-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/account-cell.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-cell.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/alert.json b/public/r/alert.json index c0ed0a51..e0f308f5 100644 --- a/public/r/alert.json +++ b/public/r/alert.json @@ -8,7 +8,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/api-key-cell.json b/public/r/api-key-cell.json index de3084ff..c09c02f2 100644 --- a/public/r/api-key-cell.json +++ b/public/r/api-key-cell.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/api-key-delete-dialog.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/api-key-delete-dialog.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/api-key-delete-dialog.json b/public/r/api-key-delete-dialog.json index 1dd02965..8c67717a 100644 --- a/public/r/api-key-delete-dialog.json +++ b/public/r/api-key-delete-dialog.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/api-key-display-dialog.json b/public/r/api-key-display-dialog.json index 876bc9af..42fd11be 100644 --- a/public/r/api-key-display-dialog.json +++ b/public/r/api-key-display-dialog.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/api-keys-card.json b/public/r/api-keys-card.json index 0eafe807..2ae5234d 100644 --- a/public/r/api-keys-card.json +++ b/public/r/api-keys-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/api-key-cell.json", - "true/api-key-display-dialog.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key-cell.json", + "https://better-auth-ui.com/r/api-key-display-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-api-key-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-api-key-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/auth-callback.json b/public/r/auth-callback.json index 8a381914..7f838c6c 100644 --- a/public/r/auth-callback.json +++ b/public/r/auth-callback.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { diff --git a/public/r/auth-form.json b/public/r/auth-form.json index 7a2e015f..edcc5326 100644 --- a/public/r/auth-form.json +++ b/public/r/auth-form.json @@ -6,20 +6,20 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/email-otp-form.json", - "true/forgot-password-form.json", - "true/magic-link-form.json", - "true/recover-account-form.json", - "true/reset-password-form.json", - "true/sign-in-form.json", - "true/sign-out.json", - "true/sign-up-form.json", - "true/two-factor-form.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/email-otp-form.json", + "https://better-auth-ui.com/r/forgot-password-form.json", + "https://better-auth-ui.com/r/magic-link-form.json", + "https://better-auth-ui.com/r/recover-account-form.json", + "https://better-auth-ui.com/r/reset-password-form.json", + "https://better-auth-ui.com/r/sign-in-form.json", + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/sign-up-form.json", + "https://better-auth-ui.com/r/two-factor-form.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/auth-hooks.json b/public/r/auth-hooks.json index 4918820b..03d15374 100644 --- a/public/r/auth-hooks.json +++ b/public/r/auth-hooks.json @@ -9,11 +9,11 @@ "better-auth" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/api-key.json", - "true/auth-client.json", - "true/invitation.json", - "true/refetch.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/refetch.json" ], "files": [ { diff --git a/public/r/auth-loading.json b/public/r/auth-loading.json index c06f4ceb..827c4416 100644 --- a/public/r/auth-loading.json +++ b/public/r/auth-loading.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/auth-localization.json b/public/r/auth-localization.json index 24fca6a9..c55575e5 100644 --- a/public/r/auth-localization.json +++ b/public/r/auth-localization.json @@ -6,21 +6,21 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/admin-error-codes.json", - "true/anonymous-error-codes.json", - "true/api-key-error-codes.json", - "true/base-error-codes.json", - "true/captcha-error-codes.json", - "true/email-otp-error-codes.json", - "true/generic-oauth-error-codes.json", - "true/haveibeenpwned-error-codes.json", - "true/multi-session-error-codes.json", - "true/organization-error-codes.json", - "true/passkey-error-codes.json", - "true/phone-number-error-codes.json", - "true/stripe-localization.json", - "true/two-factor-error-codes.json", - "true/username-error-codes.json" + "https://better-auth-ui.com/r/admin-error-codes.json", + "https://better-auth-ui.com/r/anonymous-error-codes.json", + "https://better-auth-ui.com/r/api-key-error-codes.json", + "https://better-auth-ui.com/r/base-error-codes.json", + "https://better-auth-ui.com/r/captcha-error-codes.json", + "https://better-auth-ui.com/r/email-otp-error-codes.json", + "https://better-auth-ui.com/r/generic-oauth-error-codes.json", + "https://better-auth-ui.com/r/haveibeenpwned-error-codes.json", + "https://better-auth-ui.com/r/multi-session-error-codes.json", + "https://better-auth-ui.com/r/organization-error-codes.json", + "https://better-auth-ui.com/r/passkey-error-codes.json", + "https://better-auth-ui.com/r/phone-number-error-codes.json", + "https://better-auth-ui.com/r/stripe-localization.json", + "https://better-auth-ui.com/r/two-factor-error-codes.json", + "https://better-auth-ui.com/r/username-error-codes.json" ], "files": [ { diff --git a/public/r/auth-ui-provider-tanstack.json b/public/r/auth-ui-provider-tanstack.json index 8e2b3312..7bbf9e2a 100644 --- a/public/r/auth-ui-provider-tanstack.json +++ b/public/r/auth-ui-provider-tanstack.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-tanstack-options.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-tanstack-options.json" ], "files": [ { diff --git a/public/r/auth-ui-provider.json b/public/r/auth-ui-provider.json index 5614a02f..5a9fcac3 100644 --- a/public/r/auth-ui-provider.json +++ b/public/r/auth-ui-provider.json @@ -8,28 +8,28 @@ "sonner" ], "registryDependencies": [ - "true/account-options.json", - "true/additional-fields.json", - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-localization.json", - "true/auth-mutators.json", - "true/avatar-options.json", - "true/captcha-options.json", - "true/credentials-options.json", - "true/delete-user-options.json", - "true/generic-oauth-options.json", - "true/gravatar-options.json", - "true/link.json", - "true/organization-options.json", - "true/organization-refetcher.json", - "true/recaptcha-v3.json", - "true/render-toast.json", - "true/sign-up-options.json", - "true/social-options.json", - "true/use-auth-data.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/account-options.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/avatar-options.json", + "https://better-auth-ui.com/r/captcha-options.json", + "https://better-auth-ui.com/r/credentials-options.json", + "https://better-auth-ui.com/r/delete-user-options.json", + "https://better-auth-ui.com/r/generic-oauth-options.json", + "https://better-auth-ui.com/r/gravatar-options.json", + "https://better-auth-ui.com/r/link.json", + "https://better-auth-ui.com/r/organization-options.json", + "https://better-auth-ui.com/r/organization-refetcher.json", + "https://better-auth-ui.com/r/recaptcha-v3.json", + "https://better-auth-ui.com/r/render-toast.json", + "https://better-auth-ui.com/r/sign-up-options.json", + "https://better-auth-ui.com/r/social-options.json", + "https://better-auth-ui.com/r/use-auth-data.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/auth-view.json b/public/r/auth-view.json index 13e82272..aa7e5856 100644 --- a/public/r/auth-view.json +++ b/public/r/auth-view.json @@ -8,23 +8,23 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/email-otp-button.json", - "true/magic-link-button.json", - "true/one-tap.json", - "true/passkey-button.json", - "true/provider-button.json", + "https://better-auth-ui.com/r/email-otp-button.json", + "https://better-auth-ui.com/r/magic-link-button.json", + "https://better-auth-ui.com/r/one-tap.json", + "https://better-auth-ui.com/r/passkey-button.json", + "https://better-auth-ui.com/r/provider-button.json", "separator", - "true/sign-out.json", - "true/social-providers.json", - "true/use-hydrated.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/avatar-options.json b/public/r/avatar-options.json index 1b82e061..446dac7b 100644 --- a/public/r/avatar-options.json +++ b/public/r/avatar-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/image.json" + "https://better-auth-ui.com/r/image.json" ], "files": [ { diff --git a/public/r/avatar.json b/public/r/avatar.json index 897c6dd0..46717f72 100644 --- a/public/r/avatar.json +++ b/public/r/avatar.json @@ -8,7 +8,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/backup-codes-dialog.json b/public/r/backup-codes-dialog.json index 5c8a51c0..5960537f 100644 --- a/public/r/backup-codes-dialog.json +++ b/public/r/backup-codes-dialog.json @@ -8,11 +8,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/button.json b/public/r/button.json index 56563106..5a8cc22c 100644 --- a/public/r/button.json +++ b/public/r/button.json @@ -9,7 +9,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/captcha-options.json b/public/r/captcha-options.json index 46f380e3..f40259d4 100644 --- a/public/r/captcha-options.json +++ b/public/r/captcha-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/captcha-provider.json" + "https://better-auth-ui.com/r/captcha-provider.json" ], "files": [ { diff --git a/public/r/captcha.json b/public/r/captcha.json index fecff15f..62e1d9ee 100644 --- a/public/r/captcha.json +++ b/public/r/captcha.json @@ -9,11 +9,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/recaptcha-badge.json", - "true/recaptcha-v2.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/recaptcha-badge.json", + "https://better-auth-ui.com/r/recaptcha-v2.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { diff --git a/public/r/card.json b/public/r/card.json index c187ea94..c741d6ab 100644 --- a/public/r/card.json +++ b/public/r/card.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/change-email-card.json b/public/r/change-email-card.json index a7837fa2..7b9ccb92 100644 --- a/public/r/change-email-card.json +++ b/public/r/change-email-card.json @@ -10,13 +10,13 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/change-password-card.json b/public/r/change-password-card.json index d507f591..3ef06459 100644 --- a/public/r/change-password-card.json +++ b/public/r/change-password-card.json @@ -10,15 +10,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/input-field-skeleton.json", - "true/password-input.json", - "true/password-validation.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/input-field-skeleton.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/checkbox.json b/public/r/checkbox.json index c761fd0f..b77c2f06 100644 --- a/public/r/checkbox.json +++ b/public/r/checkbox.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/create-api-key-dialog.json b/public/r/create-api-key-dialog.json index bfab3c29..0ed86b99 100644 --- a/public/r/create-api-key-dialog.json +++ b/public/r/create-api-key-dialog.json @@ -12,19 +12,19 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/personal-account-view.json", - "true/refetch.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/refetch.json", "select", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/create-organization-dialog.json b/public/r/create-organization-dialog.json index d763e04e..3e2afa7d 100644 --- a/public/r/create-organization-dialog.json +++ b/public/r/create-organization-dialog.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/organization-logo.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/credentials-options.json b/public/r/credentials-options.json index 6e7d8512..ed36b57e 100644 --- a/public/r/credentials-options.json +++ b/public/r/credentials-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/password-validation.json" + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { diff --git a/public/r/delete-account-card.json b/public/r/delete-account-card.json index b59d0936..c010ff7f 100644 --- a/public/r/delete-account-card.json +++ b/public/r/delete-account-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-account-dialog.json", - "true/settings-card.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-account-dialog.json", + "https://better-auth-ui.com/r/settings-card.json" ], "files": [ { diff --git a/public/r/delete-account-dialog.json b/public/r/delete-account-dialog.json index 1d9eafa9..dfcd512d 100644 --- a/public/r/delete-account-dialog.json +++ b/public/r/delete-account-dialog.json @@ -11,16 +11,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/delete-organization-card.json b/public/r/delete-organization-card.json index 192c60be..40c042df 100644 --- a/public/r/delete-organization-card.json +++ b/public/r/delete-organization-card.json @@ -8,10 +8,10 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/delete-organization-dialog.json", - "true/settings-card.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { diff --git a/public/r/delete-organization-dialog.json b/public/r/delete-organization-dialog.json index 860564b8..edfeb92a 100644 --- a/public/r/delete-organization-dialog.json +++ b/public/r/delete-organization-dialog.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/dialog.json b/public/r/dialog.json index f80c5d41..750f761e 100644 --- a/public/r/dialog.json +++ b/public/r/dialog.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/drawer.json b/public/r/drawer.json index 43c130b1..7b7c908e 100644 --- a/public/r/drawer.json +++ b/public/r/drawer.json @@ -8,7 +8,7 @@ "vaul" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/dropdown-menu.json b/public/r/dropdown-menu.json index 1ccfb456..40ada282 100644 --- a/public/r/dropdown-menu.json +++ b/public/r/dropdown-menu.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/email-otp-button.json b/public/r/email-otp-button.json index 154e3acf..d5912557 100644 --- a/public/r/email-otp-button.json +++ b/public/r/email-otp-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/email-otp-form.json b/public/r/email-otp-form.json index a9f74077..d6ae4110 100644 --- a/public/r/email-otp-form.json +++ b/public/r/email-otp-form.json @@ -11,17 +11,17 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", "input-otp", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/email-template.json b/public/r/email-template.json index d12bafba..2bc2b5e5 100644 --- a/public/r/email-template.json +++ b/public/r/email-template.json @@ -8,7 +8,7 @@ "@react-email/components" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/forgot-password-form.json b/public/r/forgot-password-form.json index aeec275a..784882ff 100644 --- a/public/r/forgot-password-form.json +++ b/public/r/forgot-password-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/form-error.json b/public/r/form-error.json index 9a51d5f3..0c9c5a4b 100644 --- a/public/r/form-error.json +++ b/public/r/form-error.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "alert", - "true/auth-form.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/form.json b/public/r/form.json index 2f8d1187..51fbc845 100644 --- a/public/r/form.json +++ b/public/r/form.json @@ -11,7 +11,7 @@ ], "registryDependencies": [ "label", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/generic-oauth-options.json b/public/r/generic-oauth-options.json index e5b1c882..96b6e89c 100644 --- a/public/r/generic-oauth-options.json +++ b/public/r/generic-oauth-options.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/social-providers.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/social-providers.json" ], "files": [ { diff --git a/public/r/gravatar-utils.json b/public/r/gravatar-utils.json index 6ea5edf9..576d4b1f 100644 --- a/public/r/gravatar-utils.json +++ b/public/r/gravatar-utils.json @@ -8,7 +8,7 @@ "@noble/hashes" ], "registryDependencies": [ - "true/gravatar-options.json" + "https://better-auth-ui.com/r/gravatar-options.json" ], "files": [ { diff --git a/public/r/input-field-skeleton.json b/public/r/input-field-skeleton.json index 749d5161..5e08b456 100644 --- a/public/r/input-field-skeleton.json +++ b/public/r/input-field-skeleton.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/input-otp.json b/public/r/input-otp.json index f2a0ebc1..69cfdb0a 100644 --- a/public/r/input-otp.json +++ b/public/r/input-otp.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/input.json b/public/r/input.json index fdc73352..fb37067f 100644 --- a/public/r/input.json +++ b/public/r/input.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/invitation-cell.json b/public/r/invitation-cell.json index 6a58ba32..ffb6f3fd 100644 --- a/public/r/invitation-cell.json +++ b/public/r/invitation-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/invitation.json", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/invite-member-dialog.json b/public/r/invite-member-dialog.json index 0c3463ed..1c5abb7d 100644 --- a/public/r/invite-member-dialog.json +++ b/public/r/invite-member-dialog.json @@ -12,15 +12,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/label.json b/public/r/label.json index 9790a361..c617599d 100644 --- a/public/r/label.json +++ b/public/r/label.json @@ -8,7 +8,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/leave-organization-dialog.json b/public/r/leave-organization-dialog.json index 3538a95f..508607da 100644 --- a/public/r/leave-organization-dialog.json +++ b/public/r/leave-organization-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/magic-link-button.json b/public/r/magic-link-button.json index e612a281..407708ab 100644 --- a/public/r/magic-link-button.json +++ b/public/r/magic-link-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/magic-link-form.json b/public/r/magic-link-form.json index b06f9ae5..93ea6d4b 100644 --- a/public/r/magic-link-form.json +++ b/public/r/magic-link-form.json @@ -12,16 +12,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/member-cell.json b/public/r/member-cell.json index 411dfbd0..7d256d6a 100644 --- a/public/r/member-cell.json +++ b/public/r/member-cell.json @@ -9,17 +9,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/remove-member-dialog.json", - "true/settings-card.json", - "true/update-member-role-dialog.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/remove-member-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-member-role-dialog.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/one-tap.json b/public/r/one-tap.json index cf0281ec..94090ae8 100644 --- a/public/r/one-tap.json +++ b/public/r/one-tap.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-cell-view.json b/public/r/organization-cell-view.json index 0c2105af..f851e2b5 100644 --- a/public/r/organization-cell-view.json +++ b/public/r/organization-cell-view.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/organization-logo.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/organization-logo.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-cell.json b/public/r/organization-cell.json index f9856267..939e7f4a 100644 --- a/public/r/organization-cell.json +++ b/public/r/organization-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-invitations-card.json b/public/r/organization-invitations-card.json index 5f0f6105..9e2e2006 100644 --- a/public/r/organization-invitations-card.json +++ b/public/r/organization-invitations-card.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invitation-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-logo-card.json b/public/r/organization-logo-card.json index d6f3d7c9..d59e70ad 100644 --- a/public/r/organization-logo-card.json +++ b/public/r/organization-logo-card.json @@ -9,18 +9,18 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/organization-logo.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-logo.json b/public/r/organization-logo.json index e79ab104..375a7294 100644 --- a/public/r/organization-logo.json +++ b/public/r/organization-logo.json @@ -9,11 +9,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-members-card.json b/public/r/organization-members-card.json index 66b1dbc3..bae0eb20 100644 --- a/public/r/organization-members-card.json +++ b/public/r/organization-members-card.json @@ -8,13 +8,13 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invite-member-dialog.json", - "true/member-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invite-member-dialog.json", + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-name-card.json b/public/r/organization-name-card.json index 95f77ea2..0ca5eeb7 100644 --- a/public/r/organization-name-card.json +++ b/public/r/organization-name-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-options.json b/public/r/organization-options.json index f2241171..c60b4eb9 100644 --- a/public/r/organization-options.json +++ b/public/r/organization-options.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { diff --git a/public/r/organization-refetcher.json b/public/r/organization-refetcher.json index a7920e60..469cda25 100644 --- a/public/r/organization-refetcher.json +++ b/public/r/organization-refetcher.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { diff --git a/public/r/organization-settings-cards.json b/public/r/organization-settings-cards.json index 251f183f..4b13c723 100644 --- a/public/r/organization-settings-cards.json +++ b/public/r/organization-settings-cards.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-organization-card.json", - "true/organization-logo-card.json", - "true/organization-name-card.json", - "true/organization-slug-card.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-card.json", + "https://better-auth-ui.com/r/organization-logo-card.json", + "https://better-auth-ui.com/r/organization-name-card.json", + "https://better-auth-ui.com/r/organization-slug-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-slug-card.json b/public/r/organization-slug-card.json index 98a75610..8cc950fd 100644 --- a/public/r/organization-slug-card.json +++ b/public/r/organization-slug-card.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-switcher.json b/public/r/organization-switcher.json index c2f7b2f1..ebf4f4d3 100644 --- a/public/r/organization-switcher.json +++ b/public/r/organization-switcher.json @@ -9,19 +9,19 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/create-organization-dialog.json", + "https://better-auth-ui.com/r/create-organization-dialog.json", "dropdown-menu", - "true/organization-cell-view.json", - "true/organization-logo.json", - "true/personal-account-view.json", - "true/use-current-organization.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organization-view.json b/public/r/organization-view.json index bcb3fdbb..b7f9d806 100644 --- a/public/r/organization-view.json +++ b/public/r/organization-view.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "true/account-view.json", - "true/api-keys-card.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-view.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organization-invitations-card.json", - "true/organization-members-card.json", - "true/organization-settings-cards.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-invitations-card.json", + "https://better-auth-ui.com/r/organization-members-card.json", + "https://better-auth-ui.com/r/organization-settings-cards.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/organizations-card.json b/public/r/organizations-card.json index 03cae5ff..76e5e9db 100644 --- a/public/r/organizations-card.json +++ b/public/r/organizations-card.json @@ -6,14 +6,14 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-organization-dialog.json", - "true/organization-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/passkey-button.json b/public/r/passkey-button.json index f2c98704..288d9f04 100644 --- a/public/r/passkey-button.json +++ b/public/r/passkey-button.json @@ -8,12 +8,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/passkey-cell.json b/public/r/passkey-cell.json index ad765eb8..86aa4c70 100644 --- a/public/r/passkey-cell.json +++ b/public/r/passkey-cell.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/passkeys-card.json b/public/r/passkeys-card.json index 48f2c229..1db869eb 100644 --- a/public/r/passkeys-card.json +++ b/public/r/passkeys-card.json @@ -8,14 +8,14 @@ "react-hook-form" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/passkey-cell.json", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/passkey-cell.json", + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/password-input.json b/public/r/password-input.json index 37226e8d..2f5817d4 100644 --- a/public/r/password-input.json +++ b/public/r/password-input.json @@ -10,7 +10,7 @@ "registryDependencies": [ "button", "input", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/personal-account-view.json b/public/r/personal-account-view.json index 74ab72ce..a486b698 100644 --- a/public/r/personal-account-view.json +++ b/public/r/personal-account-view.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "skeleton", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/provider-button.json b/public/r/provider-button.json index 22b2d442..ec1e9f39 100644 --- a/public/r/provider-button.json +++ b/public/r/provider-button.json @@ -8,12 +8,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/provider-cell.json b/public/r/provider-cell.json index 584ce11c..be8372c2 100644 --- a/public/r/provider-cell.json +++ b/public/r/provider-cell.json @@ -9,15 +9,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/providers-card.json b/public/r/providers-card.json index da5dc9f6..e8bffe61 100644 --- a/public/r/providers-card.json +++ b/public/r/providers-card.json @@ -6,15 +6,15 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/provider-cell.json", - "true/refetch.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/provider-cell.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/recaptcha-badge.json b/public/r/recaptcha-badge.json index b7f762f9..494defb9 100644 --- a/public/r/recaptcha-badge.json +++ b/public/r/recaptcha-badge.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/recaptcha-v2.json b/public/r/recaptcha-v2.json index 44b0cdf3..51f47ad4 100644 --- a/public/r/recaptcha-v2.json +++ b/public/r/recaptcha-v2.json @@ -8,10 +8,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-lang.json", - "true/use-theme.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/recaptcha-v3.json b/public/r/recaptcha-v3.json index 43493147..f6202d54 100644 --- a/public/r/recaptcha-v3.json +++ b/public/r/recaptcha-v3.json @@ -8,10 +8,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/use-lang.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { diff --git a/public/r/recover-account-form.json b/public/r/recover-account-form.json index 22aa8612..aedee6d9 100644 --- a/public/r/recover-account-form.json +++ b/public/r/recover-account-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/redirect-to-sign-in.json b/public/r/redirect-to-sign-in.json index 17ef9529..30ba11c9 100644 --- a/public/r/redirect-to-sign-in.json +++ b/public/r/redirect-to-sign-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { diff --git a/public/r/redirect-to-sign-up.json b/public/r/redirect-to-sign-up.json index 5fba214b..8cb01cd8 100644 --- a/public/r/redirect-to-sign-up.json +++ b/public/r/redirect-to-sign-up.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { diff --git a/public/r/remove-member-dialog.json b/public/r/remove-member-dialog.json index f2aa22c7..00631db9 100644 --- a/public/r/remove-member-dialog.json +++ b/public/r/remove-member-dialog.json @@ -9,13 +9,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/reset-password-form.json b/public/r/reset-password-form.json index 01d7a4e6..0869b827 100644 --- a/public/r/reset-password-form.json +++ b/public/r/reset-password-form.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", - "true/password-input.json", - "true/password-validation.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/security-settings-cards.json b/public/r/security-settings-cards.json index 71a81e24..34ba6ac0 100644 --- a/public/r/security-settings-cards.json +++ b/public/r/security-settings-cards.json @@ -6,16 +6,16 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-password-card.json", - "true/delete-account-card.json", - "true/passkeys-card.json", - "true/providers-card.json", - "true/sessions-card.json", - "true/settings-card.json", - "true/two-factor-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-password-card.json", + "https://better-auth-ui.com/r/delete-account-card.json", + "https://better-auth-ui.com/r/passkeys-card.json", + "https://better-auth-ui.com/r/providers-card.json", + "https://better-auth-ui.com/r/sessions-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/select.json b/public/r/select.json index 290efa2b..0b40d4c8 100644 --- a/public/r/select.json +++ b/public/r/select.json @@ -9,7 +9,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/separator.json b/public/r/separator.json index 598ad6f2..b3bee590 100644 --- a/public/r/separator.json +++ b/public/r/separator.json @@ -8,7 +8,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/session-cell.json b/public/r/session-cell.json index 26d8eaea..832ea786 100644 --- a/public/r/session-cell.json +++ b/public/r/session-cell.json @@ -10,13 +10,13 @@ "ua-parser-js" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/session-freshness-dialog.json b/public/r/session-freshness-dialog.json index 97ee5e29..e526ca2d 100644 --- a/public/r/session-freshness-dialog.json +++ b/public/r/session-freshness-dialog.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/sessions-card.json b/public/r/sessions-card.json index 1bd49dc2..179cd498 100644 --- a/public/r/sessions-card.json +++ b/public/r/sessions-card.json @@ -6,13 +6,13 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/session-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/settings-action-button.json b/public/r/settings-action-button.json index 263b48ce..687fc7c7 100644 --- a/public/r/settings-action-button.json +++ b/public/r/settings-action-button.json @@ -10,8 +10,8 @@ ], "registryDependencies": [ "button", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/settings-card-footer.json b/public/r/settings-card-footer.json index e766a13f..49c13d48 100644 --- a/public/r/settings-card-footer.json +++ b/public/r/settings-card-footer.json @@ -7,10 +7,10 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-action-button.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-action-button.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/settings-card-header.json b/public/r/settings-card-header.json index 20d5479c..3c8bb739 100644 --- a/public/r/settings-card-header.json +++ b/public/r/settings-card-header.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/settings-card.json b/public/r/settings-card.json index 167fbb99..f6bbea12 100644 --- a/public/r/settings-card.json +++ b/public/r/settings-card.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", + "https://better-auth-ui.com/r/auth-localization.json", "card", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/settings-cell-skeleton.json b/public/r/settings-cell-skeleton.json index 61b06cfc..4579304d 100644 --- a/public/r/settings-cell-skeleton.json +++ b/public/r/settings-cell-skeleton.json @@ -7,9 +7,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/sign-in-form.json b/public/r/sign-in-form.json index 58842c53..59d90fe1 100644 --- a/public/r/sign-in-form.json +++ b/public/r/sign-in-form.json @@ -12,20 +12,20 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "form", "input", - "true/password-input.json", - "true/password-validation.json", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/sign-out.json b/public/r/sign-out.json index 82e91a8a..863abfc1 100644 --- a/public/r/sign-out.json +++ b/public/r/sign-out.json @@ -8,8 +8,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { diff --git a/public/r/sign-up-form.json b/public/r/sign-up-form.json index bb5a195c..3679293a 100644 --- a/public/r/sign-up-form.json +++ b/public/r/sign-up-form.json @@ -12,24 +12,24 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/password-input.json", - "true/password-validation.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", "textarea", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/signed-in.json b/public/r/signed-in.json index ed5a2115..3bce83ac 100644 --- a/public/r/signed-in.json +++ b/public/r/signed-in.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/signed-out.json b/public/r/signed-out.json index 2ab39c8b..eda953c2 100644 --- a/public/r/signed-out.json +++ b/public/r/signed-out.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/skeleton.json b/public/r/skeleton.json index 715f391c..aedb1718 100644 --- a/public/r/skeleton.json +++ b/public/r/skeleton.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/social-options.json b/public/r/social-options.json index 9e3bb258..8d896b27 100644 --- a/public/r/social-options.json +++ b/public/r/social-options.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json" + "https://better-auth-ui.com/r/auth-client.json" ], "files": [ { diff --git a/public/r/social-providers.json b/public/r/social-providers.json index 5ec87e5c..3fdde706 100644 --- a/public/r/social-providers.json +++ b/public/r/social-providers.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/provider-icons.json" + "https://better-auth-ui.com/r/provider-icons.json" ], "files": [ { diff --git a/public/r/tabs.json b/public/r/tabs.json index 5f1c0f1c..3a069a92 100644 --- a/public/r/tabs.json +++ b/public/r/tabs.json @@ -8,7 +8,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/textarea.json b/public/r/textarea.json index d0d52244..a761e577 100644 --- a/public/r/textarea.json +++ b/public/r/textarea.json @@ -6,7 +6,7 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/two-factor-card.json b/public/r/two-factor-card.json index 24a17a28..b6df5835 100644 --- a/public/r/two-factor-card.json +++ b/public/r/two-factor-card.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/two-factor-password-dialog.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-password-dialog.json" ], "files": [ { diff --git a/public/r/two-factor-form.json b/public/r/two-factor-form.json index af27cad4..fe4cb3d7 100644 --- a/public/r/two-factor-form.json +++ b/public/r/two-factor-form.json @@ -13,19 +13,19 @@ "zod" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/two-factor-password-dialog.json b/public/r/two-factor-password-dialog.json index c6f0a80d..225ba81d 100644 --- a/public/r/two-factor-password-dialog.json +++ b/public/r/two-factor-password-dialog.json @@ -11,14 +11,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/backup-codes-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/backup-codes-dialog.json", "button", "dialog", "form", - "true/password-input.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/update-avatar-card.json b/public/r/update-avatar-card.json index e86ed14e..bab50928 100644 --- a/public/r/update-avatar-card.json +++ b/public/r/update-avatar-card.json @@ -8,17 +8,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/update-field-card.json b/public/r/update-field-card.json index 1ffea02a..3984f500 100644 --- a/public/r/update-field-card.json +++ b/public/r/update-field-card.json @@ -10,17 +10,17 @@ "zod" ], "registryDependencies": [ - "true/additional-fields.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "checkbox", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", "textarea", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/update-member-role-dialog.json b/public/r/update-member-role-dialog.json index 95147eb0..971494fe 100644 --- a/public/r/update-member-role-dialog.json +++ b/public/r/update-member-role-dialog.json @@ -9,14 +9,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", + "https://better-auth-ui.com/r/member-cell.json", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/update-name-card.json b/public/r/update-name-card.json index 16430deb..c229030f 100644 --- a/public/r/update-name-card.json +++ b/public/r/update-name-card.json @@ -6,9 +6,9 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { diff --git a/public/r/update-username-card.json b/public/r/update-username-card.json index a4122d33..d3b0d23c 100644 --- a/public/r/update-username-card.json +++ b/public/r/update-username-card.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { diff --git a/public/r/use-auth-data.json b/public/r/use-auth-data.json index e26121d6..9ea8c1a2 100644 --- a/public/r/use-auth-data.json +++ b/public/r/use-auth-data.json @@ -6,10 +6,10 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-data-cache.json", - "true/auth-ui-provider.json", - "true/fetch-error.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-data-cache.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/fetch-error.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/use-authenticate.json b/public/r/use-authenticate.json index e3b3e4b0..fa0ec396 100644 --- a/public/r/use-authenticate.json +++ b/public/r/use-authenticate.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/use-captcha.json b/public/r/use-captcha.json index a56593dd..446aadfc 100644 --- a/public/r/use-captcha.json +++ b/public/r/use-captcha.json @@ -11,8 +11,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/use-current-organization.json b/public/r/use-current-organization.json index 22f4df09..4515d7b0 100644 --- a/public/r/use-current-organization.json +++ b/public/r/use-current-organization.json @@ -8,7 +8,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { diff --git a/public/r/use-instant-options.json b/public/r/use-instant-options.json index 6dff1921..3b15203f 100644 --- a/public/r/use-instant-options.json +++ b/public/r/use-instant-options.json @@ -9,14 +9,14 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json", - "true/model-names.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { diff --git a/public/r/use-list-accounts.json b/public/r/use-list-accounts.json index 106a1684..c83f0784 100644 --- a/public/r/use-list-accounts.json +++ b/public/r/use-list-accounts.json @@ -6,11 +6,11 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { diff --git a/public/r/use-list-sessions.json b/public/r/use-list-sessions.json index 3ef5f124..ea925d6f 100644 --- a/public/r/use-list-sessions.json +++ b/public/r/use-list-sessions.json @@ -8,11 +8,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { diff --git a/public/r/use-session.json b/public/r/use-session.json index 00da30bb..88ba1ff3 100644 --- a/public/r/use-session.json +++ b/public/r/use-session.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { diff --git a/public/r/use-success-transition.json b/public/r/use-success-transition.json index f258832a..e04db631 100644 --- a/public/r/use-success-transition.json +++ b/public/r/use-success-transition.json @@ -6,8 +6,8 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/use-tanstack-options.json b/public/r/use-tanstack-options.json index 917b24e7..a218cf03 100644 --- a/public/r/use-tanstack-options.json +++ b/public/r/use-tanstack-options.json @@ -9,10 +9,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json" ], "files": [ { diff --git a/public/r/use-triplit-hooks.json b/public/r/use-triplit-hooks.json index 22a2ea2e..1456da45 100644 --- a/public/r/use-triplit-hooks.json +++ b/public/r/use-triplit-hooks.json @@ -9,12 +9,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { diff --git a/public/r/user-avatar.json b/public/r/user-avatar.json index 99ebdd0b..eb6dfc96 100644 --- a/public/r/user-avatar.json +++ b/public/r/user-avatar.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", - "true/gravatar-utils.json", - "true/profile.json", + "https://better-auth-ui.com/r/gravatar-utils.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/user-button.json b/public/r/user-button.json index 5647f993..8f5e1683 100644 --- a/public/r/user-button.json +++ b/public/r/user-button.json @@ -8,16 +8,16 @@ "lucide-react" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dropdown-menu", - "true/use-hydrated.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/user-invitations-card.json b/public/r/user-invitations-card.json index 3c540954..1f1d7292 100644 --- a/public/r/user-invitations-card.json +++ b/public/r/user-invitations-card.json @@ -8,13 +8,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/user-view.json b/public/r/user-view.json index b550de00..f6fdb128 100644 --- a/public/r/user-view.json +++ b/public/r/user-view.json @@ -6,12 +6,12 @@ "description": "", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/profile.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { diff --git a/public/r/utils.json b/public/r/utils.json index a19306a7..2fbe8d3e 100644 --- a/public/r/utils.json +++ b/public/r/utils.json @@ -10,8 +10,8 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/password-validation.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { diff --git a/registry.json b/registry.json index 8e9904e1..cedce9f7 100644 --- a/registry.json +++ b/registry.json @@ -12,15 +12,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/organization-cell-view.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-authenticate.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-authenticate.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -39,15 +39,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/refetch.json", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -64,7 +64,7 @@ "target": "types/account-options.ts", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -81,16 +81,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/accounts-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-email-card.json", - "true/settings-card.json", - "true/update-avatar-card.json", - "true/update-field-card.json", - "true/update-name-card.json", - "true/update-username-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/accounts-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-email-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-avatar-card.json", + "https://better-auth-ui.com/r/update-field-card.json", + "https://better-auth-ui.com/r/update-name-card.json", + "https://better-auth-ui.com/r/update-username-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -108,18 +108,18 @@ "lucide-react" ], "registryDependencies": [ - "true/account-settings-cards.json", - "true/api-keys-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-settings-cards.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organizations-card.json", - "true/security-settings-cards.json", - "true/settings-card.json", - "true/user-invitations-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organizations-card.json", + "https://better-auth-ui.com/r/security-settings-cards.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-invitations-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -135,12 +135,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/account-cell.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-cell.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -190,7 +190,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -258,16 +258,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/api-key-delete-dialog.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/api-key-delete-dialog.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -285,16 +285,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -312,12 +312,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -349,13 +349,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/api-key-cell.json", - "true/api-key-display-dialog.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key-cell.json", + "https://better-auth-ui.com/r/api-key-display-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-api-key-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-api-key-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -373,8 +373,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { @@ -422,20 +422,20 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/email-otp-form.json", - "true/forgot-password-form.json", - "true/magic-link-form.json", - "true/recover-account-form.json", - "true/reset-password-form.json", - "true/sign-in-form.json", - "true/sign-out.json", - "true/sign-up-form.json", - "true/two-factor-form.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/email-otp-form.json", + "https://better-auth-ui.com/r/forgot-password-form.json", + "https://better-auth-ui.com/r/magic-link-form.json", + "https://better-auth-ui.com/r/recover-account-form.json", + "https://better-auth-ui.com/r/reset-password-form.json", + "https://better-auth-ui.com/r/sign-in-form.json", + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/sign-up-form.json", + "https://better-auth-ui.com/r/two-factor-form.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -455,11 +455,11 @@ "better-auth" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/api-key.json", - "true/auth-client.json", - "true/invitation.json", - "true/refetch.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/refetch.json" ], "files": [ { @@ -476,7 +476,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -493,21 +493,21 @@ "target": "localization/auth-localization.ts", "dependencies": [], "registryDependencies": [ - "true/admin-error-codes.json", - "true/anonymous-error-codes.json", - "true/api-key-error-codes.json", - "true/base-error-codes.json", - "true/captcha-error-codes.json", - "true/email-otp-error-codes.json", - "true/generic-oauth-error-codes.json", - "true/haveibeenpwned-error-codes.json", - "true/multi-session-error-codes.json", - "true/organization-error-codes.json", - "true/passkey-error-codes.json", - "true/phone-number-error-codes.json", - "true/stripe-localization.json", - "true/two-factor-error-codes.json", - "true/username-error-codes.json" + "https://better-auth-ui.com/r/admin-error-codes.json", + "https://better-auth-ui.com/r/anonymous-error-codes.json", + "https://better-auth-ui.com/r/api-key-error-codes.json", + "https://better-auth-ui.com/r/base-error-codes.json", + "https://better-auth-ui.com/r/captcha-error-codes.json", + "https://better-auth-ui.com/r/email-otp-error-codes.json", + "https://better-auth-ui.com/r/generic-oauth-error-codes.json", + "https://better-auth-ui.com/r/haveibeenpwned-error-codes.json", + "https://better-auth-ui.com/r/multi-session-error-codes.json", + "https://better-auth-ui.com/r/organization-error-codes.json", + "https://better-auth-ui.com/r/passkey-error-codes.json", + "https://better-auth-ui.com/r/phone-number-error-codes.json", + "https://better-auth-ui.com/r/stripe-localization.json", + "https://better-auth-ui.com/r/two-factor-error-codes.json", + "https://better-auth-ui.com/r/username-error-codes.json" ], "files": [ { @@ -542,28 +542,28 @@ "sonner" ], "registryDependencies": [ - "true/account-options.json", - "true/additional-fields.json", - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-localization.json", - "true/auth-mutators.json", - "true/avatar-options.json", - "true/captcha-options.json", - "true/credentials-options.json", - "true/delete-user-options.json", - "true/generic-oauth-options.json", - "true/gravatar-options.json", - "true/link.json", - "true/organization-options.json", - "true/organization-refetcher.json", - "true/recaptcha-v3.json", - "true/render-toast.json", - "true/sign-up-options.json", - "true/social-options.json", - "true/use-auth-data.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/account-options.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/avatar-options.json", + "https://better-auth-ui.com/r/captcha-options.json", + "https://better-auth-ui.com/r/credentials-options.json", + "https://better-auth-ui.com/r/delete-user-options.json", + "https://better-auth-ui.com/r/generic-oauth-options.json", + "https://better-auth-ui.com/r/gravatar-options.json", + "https://better-auth-ui.com/r/link.json", + "https://better-auth-ui.com/r/organization-options.json", + "https://better-auth-ui.com/r/organization-refetcher.json", + "https://better-auth-ui.com/r/recaptcha-v3.json", + "https://better-auth-ui.com/r/render-toast.json", + "https://better-auth-ui.com/r/sign-up-options.json", + "https://better-auth-ui.com/r/social-options.json", + "https://better-auth-ui.com/r/use-auth-data.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -579,8 +579,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-tanstack-options.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-tanstack-options.json" ], "files": [ { @@ -598,23 +598,23 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/email-otp-button.json", - "true/magic-link-button.json", - "true/one-tap.json", - "true/passkey-button.json", - "true/provider-button.json", + "https://better-auth-ui.com/r/email-otp-button.json", + "https://better-auth-ui.com/r/magic-link-button.json", + "https://better-auth-ui.com/r/one-tap.json", + "https://better-auth-ui.com/r/passkey-button.json", + "https://better-auth-ui.com/r/provider-button.json", "separator", - "true/sign-out.json", - "true/social-providers.json", - "true/use-hydrated.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -632,7 +632,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -649,7 +649,7 @@ "target": "types/avatar-options.ts", "dependencies": [], "registryDependencies": [ - "true/image.json" + "https://better-auth-ui.com/r/image.json" ], "files": [ { @@ -668,11 +668,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -707,7 +707,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -726,11 +726,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/recaptcha-badge.json", - "true/recaptcha-v2.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/recaptcha-badge.json", + "https://better-auth-ui.com/r/recaptcha-v2.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { @@ -763,7 +763,7 @@ "target": "types/captcha-options.ts", "dependencies": [], "registryDependencies": [ - "true/captcha-provider.json" + "https://better-auth-ui.com/r/captcha-provider.json" ], "files": [ { @@ -796,7 +796,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -816,13 +816,13 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -842,15 +842,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/input-field-skeleton.json", - "true/password-input.json", - "true/password-validation.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/input-field-skeleton.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -869,7 +869,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -891,19 +891,19 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/personal-account-view.json", - "true/refetch.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/refetch.json", "select", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -924,17 +924,17 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/organization-logo.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -951,7 +951,7 @@ "target": "types/credentials-options.ts", "dependencies": [], "registryDependencies": [ - "true/password-validation.json" + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { @@ -968,10 +968,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-account-dialog.json", - "true/settings-card.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-account-dialog.json", + "https://better-auth-ui.com/r/settings-card.json" ], "files": [ { @@ -992,16 +992,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1019,10 +1019,10 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/delete-organization-dialog.json", - "true/settings-card.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { @@ -1044,16 +1044,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1088,7 +1088,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1106,7 +1106,7 @@ "vaul" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1125,7 +1125,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1143,12 +1143,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -1185,17 +1185,17 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", "input-otp", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1213,7 +1213,7 @@ "@react-email/components" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1251,16 +1251,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1281,7 +1281,7 @@ ], "registryDependencies": [ "label", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1301,8 +1301,8 @@ ], "registryDependencies": [ "alert", - "true/auth-form.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1335,8 +1335,8 @@ "target": "types/generic-oauth-options.ts", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/social-providers.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/social-providers.json" ], "files": [ { @@ -1371,7 +1371,7 @@ "@noble/hashes" ], "registryDependencies": [ - "true/gravatar-options.json" + "https://better-auth-ui.com/r/gravatar-options.json" ], "files": [ { @@ -1433,7 +1433,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1449,9 +1449,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1470,7 +1470,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1505,15 +1505,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/invitation.json", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1535,15 +1535,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1561,7 +1561,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1580,14 +1580,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1621,12 +1621,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -1648,16 +1648,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1676,17 +1676,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/remove-member-dialog.json", - "true/settings-card.json", - "true/update-member-role-dialog.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/remove-member-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-member-role-dialog.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1746,10 +1746,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1768,15 +1768,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1794,11 +1794,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/organization-logo.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/organization-logo.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1832,12 +1832,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invitation-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1856,11 +1856,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1879,18 +1879,18 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/organization-logo.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1908,13 +1908,13 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invite-member-dialog.json", - "true/member-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invite-member-dialog.json", + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1935,14 +1935,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1959,7 +1959,7 @@ "target": "types/organization-options.ts", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -1976,8 +1976,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { @@ -1993,14 +1993,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-organization-card.json", - "true/organization-logo-card.json", - "true/organization-name-card.json", - "true/organization-slug-card.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-card.json", + "https://better-auth-ui.com/r/organization-logo-card.json", + "https://better-auth-ui.com/r/organization-name-card.json", + "https://better-auth-ui.com/r/organization-slug-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2021,14 +2021,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2047,19 +2047,19 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/create-organization-dialog.json", + "https://better-auth-ui.com/r/create-organization-dialog.json", "dropdown-menu", - "true/organization-cell-view.json", - "true/organization-logo.json", - "true/personal-account-view.json", - "true/use-current-organization.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2077,17 +2077,17 @@ "lucide-react" ], "registryDependencies": [ - "true/account-view.json", - "true/api-keys-card.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-view.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organization-invitations-card.json", - "true/organization-members-card.json", - "true/organization-settings-cards.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-invitations-card.json", + "https://better-auth-ui.com/r/organization-members-card.json", + "https://better-auth-ui.com/r/organization-settings-cards.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2103,14 +2103,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-organization-dialog.json", - "true/organization-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2144,12 +2144,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2167,13 +2167,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2207,14 +2207,14 @@ "react-hook-form" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/passkey-cell.json", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/passkey-cell.json", + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2234,7 +2234,7 @@ "registryDependencies": [ "button", "input", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2266,11 +2266,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "skeleton", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2320,12 +2320,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2344,15 +2344,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2382,15 +2382,15 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/provider-cell.json", - "true/refetch.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/provider-cell.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2406,10 +2406,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2427,10 +2427,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-lang.json", - "true/use-theme.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2448,10 +2448,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/use-lang.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { @@ -2472,14 +2472,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2495,7 +2495,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { @@ -2511,7 +2511,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { @@ -2546,13 +2546,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2589,14 +2589,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", - "true/password-input.json", - "true/password-validation.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2612,16 +2612,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-password-card.json", - "true/delete-account-card.json", - "true/passkeys-card.json", - "true/providers-card.json", - "true/sessions-card.json", - "true/settings-card.json", - "true/two-factor-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-password-card.json", + "https://better-auth-ui.com/r/delete-account-card.json", + "https://better-auth-ui.com/r/passkeys-card.json", + "https://better-auth-ui.com/r/providers-card.json", + "https://better-auth-ui.com/r/sessions-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2640,7 +2640,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2658,7 +2658,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2678,13 +2678,13 @@ "ua-parser-js" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2700,12 +2700,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2721,13 +2721,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/session-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2747,8 +2747,8 @@ ], "registryDependencies": [ "button", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2764,12 +2764,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", + "https://better-auth-ui.com/r/auth-localization.json", "card", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2786,10 +2786,10 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-action-button.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-action-button.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2806,9 +2806,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2825,9 +2825,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2849,20 +2849,20 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "form", "input", - "true/password-input.json", - "true/password-validation.json", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2880,8 +2880,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { @@ -2903,24 +2903,24 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/password-input.json", - "true/password-validation.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", "textarea", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2952,7 +2952,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -2968,7 +2968,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -2984,7 +2984,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3003,7 +3003,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json" + "https://better-auth-ui.com/r/auth-client.json" ], "files": [ { @@ -3020,7 +3020,7 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/provider-icons.json" + "https://better-auth-ui.com/r/provider-icons.json" ], "files": [ { @@ -3054,7 +3054,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3070,7 +3070,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3086,11 +3086,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/two-factor-password-dialog.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-password-dialog.json" ], "files": [ { @@ -3129,19 +3129,19 @@ "zod" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3162,14 +3162,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/backup-codes-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/backup-codes-dialog.json", "button", "dialog", "form", - "true/password-input.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3187,17 +3187,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3217,17 +3217,17 @@ "zod" ], "registryDependencies": [ - "true/additional-fields.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "checkbox", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", "textarea", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3246,14 +3246,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", + "https://better-auth-ui.com/r/member-cell.json", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3269,9 +3269,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { @@ -3287,10 +3287,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { @@ -3306,10 +3306,10 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "true/auth-data-cache.json", - "true/auth-ui-provider.json", - "true/fetch-error.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-data-cache.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/fetch-error.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3325,8 +3325,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -3347,8 +3347,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -3383,7 +3383,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -3416,14 +3416,14 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json", - "true/model-names.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { @@ -3455,9 +3455,9 @@ "@better-fetch/fetch" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-instant-options.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-instant-options.json" ], "files": [ { @@ -3473,11 +3473,11 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { @@ -3495,9 +3495,9 @@ "better-auth" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-instant-options.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-instant-options.json" ], "files": [ { @@ -3515,11 +3515,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { @@ -3537,10 +3537,10 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/model-names.json", - "true/use-instant-options.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-instant-options.json" ], "files": [ { @@ -3556,12 +3556,12 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { @@ -3577,8 +3577,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3597,10 +3597,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json" ], "files": [ { @@ -3633,12 +3633,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { @@ -3673,13 +3673,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", - "true/gravatar-utils.json", - "true/profile.json", + "https://better-auth-ui.com/r/gravatar-utils.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3697,16 +3697,16 @@ "lucide-react" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dropdown-menu", - "true/use-hydrated.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3724,13 +3724,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3746,12 +3746,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/profile.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3787,8 +3787,8 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/password-validation.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { diff --git a/registry/registry.json b/registry/registry.json index 8e9904e1..cedce9f7 100644 --- a/registry/registry.json +++ b/registry/registry.json @@ -12,15 +12,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/organization-cell-view.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-authenticate.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-authenticate.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -39,15 +39,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/refetch.json", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -64,7 +64,7 @@ "target": "types/account-options.ts", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -81,16 +81,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/accounts-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-email-card.json", - "true/settings-card.json", - "true/update-avatar-card.json", - "true/update-field-card.json", - "true/update-name-card.json", - "true/update-username-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/accounts-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-email-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-avatar-card.json", + "https://better-auth-ui.com/r/update-field-card.json", + "https://better-auth-ui.com/r/update-name-card.json", + "https://better-auth-ui.com/r/update-username-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -108,18 +108,18 @@ "lucide-react" ], "registryDependencies": [ - "true/account-settings-cards.json", - "true/api-keys-card.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-settings-cards.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organizations-card.json", - "true/security-settings-cards.json", - "true/settings-card.json", - "true/user-invitations-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organizations-card.json", + "https://better-auth-ui.com/r/security-settings-cards.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-invitations-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -135,12 +135,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/account-cell.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-cell.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -190,7 +190,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -258,16 +258,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/api-key-delete-dialog.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/api-key-delete-dialog.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -285,16 +285,16 @@ "lucide-react" ], "registryDependencies": [ - "true/api-key.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/refetch.json", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -312,12 +312,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -349,13 +349,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/api-key-cell.json", - "true/api-key-display-dialog.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/api-key-cell.json", + "https://better-auth-ui.com/r/api-key-display-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-api-key-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-api-key-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -373,8 +373,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { @@ -422,20 +422,20 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/email-otp-form.json", - "true/forgot-password-form.json", - "true/magic-link-form.json", - "true/recover-account-form.json", - "true/reset-password-form.json", - "true/sign-in-form.json", - "true/sign-out.json", - "true/sign-up-form.json", - "true/two-factor-form.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/email-otp-form.json", + "https://better-auth-ui.com/r/forgot-password-form.json", + "https://better-auth-ui.com/r/magic-link-form.json", + "https://better-auth-ui.com/r/recover-account-form.json", + "https://better-auth-ui.com/r/reset-password-form.json", + "https://better-auth-ui.com/r/sign-in-form.json", + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/sign-up-form.json", + "https://better-auth-ui.com/r/two-factor-form.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -455,11 +455,11 @@ "better-auth" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/api-key.json", - "true/auth-client.json", - "true/invitation.json", - "true/refetch.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/api-key.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/refetch.json" ], "files": [ { @@ -476,7 +476,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -493,21 +493,21 @@ "target": "localization/auth-localization.ts", "dependencies": [], "registryDependencies": [ - "true/admin-error-codes.json", - "true/anonymous-error-codes.json", - "true/api-key-error-codes.json", - "true/base-error-codes.json", - "true/captcha-error-codes.json", - "true/email-otp-error-codes.json", - "true/generic-oauth-error-codes.json", - "true/haveibeenpwned-error-codes.json", - "true/multi-session-error-codes.json", - "true/organization-error-codes.json", - "true/passkey-error-codes.json", - "true/phone-number-error-codes.json", - "true/stripe-localization.json", - "true/two-factor-error-codes.json", - "true/username-error-codes.json" + "https://better-auth-ui.com/r/admin-error-codes.json", + "https://better-auth-ui.com/r/anonymous-error-codes.json", + "https://better-auth-ui.com/r/api-key-error-codes.json", + "https://better-auth-ui.com/r/base-error-codes.json", + "https://better-auth-ui.com/r/captcha-error-codes.json", + "https://better-auth-ui.com/r/email-otp-error-codes.json", + "https://better-auth-ui.com/r/generic-oauth-error-codes.json", + "https://better-auth-ui.com/r/haveibeenpwned-error-codes.json", + "https://better-auth-ui.com/r/multi-session-error-codes.json", + "https://better-auth-ui.com/r/organization-error-codes.json", + "https://better-auth-ui.com/r/passkey-error-codes.json", + "https://better-auth-ui.com/r/phone-number-error-codes.json", + "https://better-auth-ui.com/r/stripe-localization.json", + "https://better-auth-ui.com/r/two-factor-error-codes.json", + "https://better-auth-ui.com/r/username-error-codes.json" ], "files": [ { @@ -542,28 +542,28 @@ "sonner" ], "registryDependencies": [ - "true/account-options.json", - "true/additional-fields.json", - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-localization.json", - "true/auth-mutators.json", - "true/avatar-options.json", - "true/captcha-options.json", - "true/credentials-options.json", - "true/delete-user-options.json", - "true/generic-oauth-options.json", - "true/gravatar-options.json", - "true/link.json", - "true/organization-options.json", - "true/organization-refetcher.json", - "true/recaptcha-v3.json", - "true/render-toast.json", - "true/sign-up-options.json", - "true/social-options.json", - "true/use-auth-data.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/account-options.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/avatar-options.json", + "https://better-auth-ui.com/r/captcha-options.json", + "https://better-auth-ui.com/r/credentials-options.json", + "https://better-auth-ui.com/r/delete-user-options.json", + "https://better-auth-ui.com/r/generic-oauth-options.json", + "https://better-auth-ui.com/r/gravatar-options.json", + "https://better-auth-ui.com/r/link.json", + "https://better-auth-ui.com/r/organization-options.json", + "https://better-auth-ui.com/r/organization-refetcher.json", + "https://better-auth-ui.com/r/recaptcha-v3.json", + "https://better-auth-ui.com/r/render-toast.json", + "https://better-auth-ui.com/r/sign-up-options.json", + "https://better-auth-ui.com/r/social-options.json", + "https://better-auth-ui.com/r/use-auth-data.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -579,8 +579,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-tanstack-options.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-tanstack-options.json" ], "files": [ { @@ -598,23 +598,23 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-callback.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-callback.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/email-otp-button.json", - "true/magic-link-button.json", - "true/one-tap.json", - "true/passkey-button.json", - "true/provider-button.json", + "https://better-auth-ui.com/r/email-otp-button.json", + "https://better-auth-ui.com/r/magic-link-button.json", + "https://better-auth-ui.com/r/one-tap.json", + "https://better-auth-ui.com/r/passkey-button.json", + "https://better-auth-ui.com/r/provider-button.json", "separator", - "true/sign-out.json", - "true/social-providers.json", - "true/use-hydrated.json", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/sign-out.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -632,7 +632,7 @@ "@radix-ui/react-avatar" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -649,7 +649,7 @@ "target": "types/avatar-options.ts", "dependencies": [], "registryDependencies": [ - "true/image.json" + "https://better-auth-ui.com/r/image.json" ], "files": [ { @@ -668,11 +668,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -707,7 +707,7 @@ "class-variance-authority" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -726,11 +726,11 @@ "@marsidev/react-turnstile" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/recaptcha-badge.json", - "true/recaptcha-v2.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/recaptcha-badge.json", + "https://better-auth-ui.com/r/recaptcha-v2.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { @@ -763,7 +763,7 @@ "target": "types/captcha-options.ts", "dependencies": [], "registryDependencies": [ - "true/captcha-provider.json" + "https://better-auth-ui.com/r/captcha-provider.json" ], "files": [ { @@ -796,7 +796,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -816,13 +816,13 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -842,15 +842,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/input-field-skeleton.json", - "true/password-input.json", - "true/password-validation.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/input-field-skeleton.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -869,7 +869,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -891,19 +891,19 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/personal-account-view.json", - "true/refetch.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/refetch.json", "select", - "true/settings-card.json", - "true/use-lang.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -924,17 +924,17 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/organization-logo.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -951,7 +951,7 @@ "target": "types/credentials-options.ts", "dependencies": [], "registryDependencies": [ - "true/password-validation.json" + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { @@ -968,10 +968,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-account-dialog.json", - "true/settings-card.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-account-dialog.json", + "https://better-auth-ui.com/r/settings-card.json" ], "files": [ { @@ -992,16 +992,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/settings-card.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1019,10 +1019,10 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/delete-organization-dialog.json", - "true/settings-card.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { @@ -1044,16 +1044,16 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", "form", "input", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1088,7 +1088,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1106,7 +1106,7 @@ "vaul" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1125,7 +1125,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1143,12 +1143,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -1185,17 +1185,17 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", "input-otp", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1213,7 +1213,7 @@ "@react-email/components" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1251,16 +1251,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1281,7 +1281,7 @@ ], "registryDependencies": [ "label", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1301,8 +1301,8 @@ ], "registryDependencies": [ "alert", - "true/auth-form.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1335,8 +1335,8 @@ "target": "types/generic-oauth-options.ts", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/social-providers.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/social-providers.json" ], "files": [ { @@ -1371,7 +1371,7 @@ "@noble/hashes" ], "registryDependencies": [ - "true/gravatar-options.json" + "https://better-auth-ui.com/r/gravatar-options.json" ], "files": [ { @@ -1433,7 +1433,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1449,9 +1449,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1470,7 +1470,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1505,15 +1505,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/invitation.json", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1535,15 +1535,15 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", "form", "input", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1561,7 +1561,7 @@ "@radix-ui/react-label" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1580,14 +1580,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dialog", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1621,12 +1621,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/utils.json", - "true/view-paths.json" + "https://better-auth-ui.com/r/utils.json", + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -1648,16 +1648,16 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "form", "input", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1676,17 +1676,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/remove-member-dialog.json", - "true/settings-card.json", - "true/update-member-role-dialog.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/remove-member-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-member-role-dialog.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1746,10 +1746,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1768,15 +1768,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/leave-organization-dialog.json", - "true/organization-cell-view.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/leave-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1794,11 +1794,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/organization-logo.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/organization-logo.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1832,12 +1832,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invitation-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invitation-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1856,11 +1856,11 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1879,18 +1879,18 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/organization-logo.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1908,13 +1908,13 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/invite-member-dialog.json", - "true/member-cell.json", - "true/settings-card.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/invite-member-dialog.json", + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1935,14 +1935,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -1959,7 +1959,7 @@ "target": "types/organization-options.ts", "dependencies": [], "registryDependencies": [ - "true/view-paths.json" + "https://better-auth-ui.com/r/view-paths.json" ], "files": [ { @@ -1976,8 +1976,8 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-current-organization.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-current-organization.json" ], "files": [ { @@ -1993,14 +1993,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/delete-organization-card.json", - "true/organization-logo-card.json", - "true/organization-name-card.json", - "true/organization-slug-card.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/delete-organization-card.json", + "https://better-auth-ui.com/r/organization-logo-card.json", + "https://better-auth-ui.com/r/organization-name-card.json", + "https://better-auth-ui.com/r/organization-slug-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2021,14 +2021,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2047,19 +2047,19 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/create-organization-dialog.json", + "https://better-auth-ui.com/r/create-organization-dialog.json", "dropdown-menu", - "true/organization-cell-view.json", - "true/organization-logo.json", - "true/personal-account-view.json", - "true/use-current-organization.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-cell-view.json", + "https://better-auth-ui.com/r/organization-logo.json", + "https://better-auth-ui.com/r/personal-account-view.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2077,17 +2077,17 @@ "lucide-react" ], "registryDependencies": [ - "true/account-view.json", - "true/api-keys-card.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/account-view.json", + "https://better-auth-ui.com/r/api-keys-card.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "drawer", "label", - "true/organization-invitations-card.json", - "true/organization-members-card.json", - "true/organization-settings-cards.json", - "true/use-current-organization.json", - "true/utils.json" + "https://better-auth-ui.com/r/organization-invitations-card.json", + "https://better-auth-ui.com/r/organization-members-card.json", + "https://better-auth-ui.com/r/organization-settings-cards.json", + "https://better-auth-ui.com/r/use-current-organization.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2103,14 +2103,14 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/create-organization-dialog.json", - "true/organization-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/create-organization-dialog.json", + "https://better-auth-ui.com/r/organization-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2144,12 +2144,12 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2167,13 +2167,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2207,14 +2207,14 @@ "react-hook-form" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "form", - "true/passkey-cell.json", - "true/session-freshness-dialog.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/passkey-cell.json", + "https://better-auth-ui.com/r/session-freshness-dialog.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2234,7 +2234,7 @@ "registryDependencies": [ "button", "input", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2266,11 +2266,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "skeleton", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2320,12 +2320,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/auth-view.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-view.json", "button", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2344,15 +2344,15 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2382,15 +2382,15 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/provider-cell.json", - "true/refetch.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/social-providers.json", - "true/utils.json" + "https://better-auth-ui.com/r/provider-cell.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/social-providers.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2406,10 +2406,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2427,10 +2427,10 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-lang.json", - "true/use-theme.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2448,10 +2448,10 @@ "@wojtekmaj/react-recaptcha-v3" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-hydrated.json", - "true/use-lang.json", - "true/use-theme.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-lang.json", + "https://better-auth-ui.com/r/use-theme.json" ], "files": [ { @@ -2472,14 +2472,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", "input", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2495,7 +2495,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { @@ -2511,7 +2511,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/use-authenticate.json" + "https://better-auth-ui.com/r/use-authenticate.json" ], "files": [ { @@ -2546,13 +2546,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/member-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2589,14 +2589,14 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "form", - "true/password-input.json", - "true/password-validation.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2612,16 +2612,16 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/change-password-card.json", - "true/delete-account-card.json", - "true/passkeys-card.json", - "true/providers-card.json", - "true/sessions-card.json", - "true/settings-card.json", - "true/two-factor-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/change-password-card.json", + "https://better-auth-ui.com/r/delete-account-card.json", + "https://better-auth-ui.com/r/passkeys-card.json", + "https://better-auth-ui.com/r/providers-card.json", + "https://better-auth-ui.com/r/sessions-card.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2640,7 +2640,7 @@ "lucide-react" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2658,7 +2658,7 @@ "@radix-ui/react-separator" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2678,13 +2678,13 @@ "ua-parser-js" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", - "true/refetch.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2700,12 +2700,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2721,13 +2721,13 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", - "true/session-cell.json", - "true/settings-card.json", - "true/settings-cell-skeleton.json", - "true/utils.json" + "https://better-auth-ui.com/r/session-cell.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-cell-skeleton.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2747,8 +2747,8 @@ ], "registryDependencies": [ "button", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2764,12 +2764,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", + "https://better-auth-ui.com/r/auth-localization.json", "card", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2786,10 +2786,10 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-action-button.json", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-action-button.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2806,9 +2806,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2825,9 +2825,9 @@ "dependencies": [], "registryDependencies": [ "card", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2849,20 +2849,20 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "form", "input", - "true/password-input.json", - "true/password-validation.json", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2880,8 +2880,8 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/use-success-transition.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/use-success-transition.json" ], "files": [ { @@ -2903,24 +2903,24 @@ "zod" ], "registryDependencies": [ - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", - "true/captcha.json", + "https://better-auth-ui.com/r/captcha.json", "checkbox", "dropdown-menu", "form", - "true/image-utils.json", + "https://better-auth-ui.com/r/image-utils.json", "input", - "true/password-input.json", - "true/password-validation.json", + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/password-validation.json", "textarea", - "true/use-captcha.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-captcha.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -2952,7 +2952,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -2968,7 +2968,7 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -2984,7 +2984,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3003,7 +3003,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json" + "https://better-auth-ui.com/r/auth-client.json" ], "files": [ { @@ -3020,7 +3020,7 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/provider-icons.json" + "https://better-auth-ui.com/r/provider-icons.json" ], "files": [ { @@ -3054,7 +3054,7 @@ "@radix-ui/react-tabs" ], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3070,7 +3070,7 @@ "type": "registry:ui", "dependencies": [], "registryDependencies": [ - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3086,11 +3086,11 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/two-factor-password-dialog.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/two-factor-password-dialog.json" ], "files": [ { @@ -3129,19 +3129,19 @@ "zod" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-form.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-form.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "checkbox", "form", "input-otp", "label", - "true/otp-input-group.json", - "true/use-hydrated.json", - "true/use-success-transition.json", - "true/utils.json" + "https://better-auth-ui.com/r/otp-input-group.json", + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/use-success-transition.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3162,14 +3162,14 @@ "zod" ], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/backup-codes-dialog.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/backup-codes-dialog.json", "button", "dialog", "form", - "true/password-input.json", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/password-input.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3187,17 +3187,17 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/image-utils.json", - "true/settings-card.json", - "true/settings-card-footer.json", - "true/settings-card-header.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/image-utils.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/settings-card-footer.json", + "https://better-auth-ui.com/r/settings-card-header.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3217,17 +3217,17 @@ "zod" ], "registryDependencies": [ - "true/additional-fields.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/additional-fields.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "card", "checkbox", "form", "input", - "true/settings-card.json", + "https://better-auth-ui.com/r/settings-card.json", "skeleton", "textarea", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3246,14 +3246,14 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dialog", - "true/member-cell.json", + "https://better-auth-ui.com/r/member-cell.json", "select", - "true/settings-card.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3269,9 +3269,9 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { @@ -3287,10 +3287,10 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-ui-provider.json", - "true/settings-card.json", - "true/update-field-card.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/update-field-card.json" ], "files": [ { @@ -3306,10 +3306,10 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "true/auth-data-cache.json", - "true/auth-ui-provider.json", - "true/fetch-error.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-data-cache.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/fetch-error.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3325,8 +3325,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -3347,8 +3347,8 @@ "react-google-recaptcha" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -3383,7 +3383,7 @@ "better-auth" ], "registryDependencies": [ - "true/auth-ui-provider.json" + "https://better-auth-ui.com/r/auth-ui-provider.json" ], "files": [ { @@ -3416,14 +3416,14 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json", - "true/model-names.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { @@ -3455,9 +3455,9 @@ "@better-fetch/fetch" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-instant-options.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-instant-options.json" ], "files": [ { @@ -3473,11 +3473,11 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { @@ -3495,9 +3495,9 @@ "better-auth" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-instant-options.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-instant-options.json" ], "files": [ { @@ -3515,11 +3515,11 @@ "better-auth" ], "registryDependencies": [ - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { @@ -3537,10 +3537,10 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/model-names.json", - "true/use-instant-options.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-instant-options.json" ], "files": [ { @@ -3556,12 +3556,12 @@ "type": "registry:lib", "dependencies": [], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/model-names.json", - "true/use-conditional-query.json", - "true/use-triplit-hooks.json", - "true/use-triplit-token.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/model-names.json", + "https://better-auth-ui.com/r/use-conditional-query.json", + "https://better-auth-ui.com/r/use-triplit-hooks.json", + "https://better-auth-ui.com/r/use-triplit-token.json" ], "files": [ { @@ -3577,8 +3577,8 @@ "type": "registry:hook", "dependencies": [], "registryDependencies": [ - "true/auth-ui-provider.json", - "true/utils.json" + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3597,10 +3597,10 @@ "@tanstack/react-query" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-hooks.json", - "true/auth-mutators.json" + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/auth-mutators.json" ], "files": [ { @@ -3633,12 +3633,12 @@ "better-auth" ], "registryDependencies": [ - "true/auth-client.json", - "true/auth-hooks.json", - "true/refetch.json", - "true/use-list-accounts.json", - "true/use-list-sessions.json", - "true/use-session.json" + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-hooks.json", + "https://better-auth-ui.com/r/refetch.json", + "https://better-auth-ui.com/r/use-list-accounts.json", + "https://better-auth-ui.com/r/use-list-sessions.json", + "https://better-auth-ui.com/r/use-session.json" ], "files": [ { @@ -3673,13 +3673,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "avatar", - "true/gravatar-utils.json", - "true/profile.json", + "https://better-auth-ui.com/r/gravatar-utils.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/utils.json" + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3697,16 +3697,16 @@ "lucide-react" ], "registryDependencies": [ - "true/any-auth-client.json", - "true/auth-client.json", - "true/auth-localization.json", - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/any-auth-client.json", + "https://better-auth-ui.com/r/auth-client.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "dropdown-menu", - "true/use-hydrated.json", - "true/user-avatar.json", - "true/user-view.json", - "true/utils.json" + "https://better-auth-ui.com/r/use-hydrated.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/user-view.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3724,13 +3724,13 @@ "lucide-react" ], "registryDependencies": [ - "true/auth-ui-provider.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", "button", "card", "dropdown-menu", - "true/settings-card.json", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/settings-card.json", + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3746,12 +3746,12 @@ "type": "registry:component", "dependencies": [], "registryDependencies": [ - "true/auth-localization.json", - "true/auth-ui-provider.json", - "true/profile.json", + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/auth-ui-provider.json", + "https://better-auth-ui.com/r/profile.json", "skeleton", - "true/user-avatar.json", - "true/utils.json" + "https://better-auth-ui.com/r/user-avatar.json", + "https://better-auth-ui.com/r/utils.json" ], "files": [ { @@ -3787,8 +3787,8 @@ "zod" ], "registryDependencies": [ - "true/auth-localization.json", - "true/password-validation.json" + "https://better-auth-ui.com/r/auth-localization.json", + "https://better-auth-ui.com/r/password-validation.json" ], "files": [ { diff --git a/scripts/generate.mjs b/scripts/generate.mjs index 1c2686db..dffc7b51 100644 --- a/scripts/generate.mjs +++ b/scripts/generate.mjs @@ -114,6 +114,8 @@ const INTERNAL_ROOTS = argv["internal-roots"] let REG_DEP_BASE = argv["registry-dependency-base-url"] || "http://localhost:3000/r/"; +REG_DEP_BASE = (REG_DEP_BASE ?? "").toString(); +if (REG_DEP_BASE && !REG_DEP_BASE.endsWith("/")) REG_DEP_BASE += "/"; const DEFAULT_BASIC_COMPONENTS = [ "alert", From af4324b3f46efcd0ca28701d3a3ba2481addba2b Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:52:33 -0400 Subject: [PATCH 07/10] prevent duplicate public folders --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e112f76f..b449d6d5 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,5 @@ dist # Webstorm project files .idea + +public/r From ef9297efcb00003002a40a49196a030817341316 Mon Sep 17 00:00:00 2001 From: Nathan <99501939+IncbomDev@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:53:00 -0400 Subject: [PATCH 08/10] Delete public/r directory --- public/r/accept-invitation-card.json | 28 -------------- public/r/account-cell.json | 29 --------------- public/r/account-options.json | 19 ---------- public/r/account-settings-cards.json | 27 -------------- public/r/account-view.json | 31 ---------------- public/r/accounts-card.json | 23 ------------ public/r/additional-fields.json | 17 --------- public/r/admin-error-codes.json | 17 --------- public/r/alert.json | 20 ---------- public/r/anonymous-error-codes.json | 17 --------- public/r/any-auth-client.json | 19 ---------- public/r/api-key-cell.json | 29 --------------- public/r/api-key-delete-dialog.json | 29 --------------- public/r/api-key-display-dialog.json | 25 ------------- public/r/api-key-error-codes.json | 17 --------- public/r/api-key.json | 17 --------- public/r/api-keys-card.json | 24 ------------ public/r/auth-callback.json | 21 ----------- public/r/auth-client.json | 19 ---------- public/r/auth-data-cache.json | 16 -------- public/r/auth-form.json | 31 ---------------- public/r/auth-hooks.json | 26 ------------- public/r/auth-loading.json | 18 --------- public/r/auth-localization.json | 33 ----------------- public/r/auth-mutators.json | 17 --------- public/r/auth-ui-provider-tanstack.json | 19 ---------- public/r/auth-ui-provider.json | 41 --------------------- public/r/auth-view.json | 36 ------------------ public/r/avatar-options.json | 19 ---------- public/r/avatar.json | 20 ---------- public/r/backup-codes-dialog.json | 24 ------------ public/r/base-error-codes.json | 17 --------- public/r/button.json | 21 ----------- public/r/captcha-error-codes.json | 17 --------- public/r/captcha-options.json | 19 ---------- public/r/captcha-provider.json | 17 --------- public/r/captcha.json | 25 ------------- public/r/card.json | 18 --------- public/r/change-email-card.json | 28 -------------- public/r/change-password-card.json | 30 --------------- public/r/checkbox.json | 21 ----------- public/r/create-api-key-dialog.json | 36 ------------------ public/r/create-organization-dialog.json | 33 ----------------- public/r/credentials-options.json | 19 ---------- public/r/delete-account-card.json | 21 ----------- public/r/delete-account-dialog.json | 32 ---------------- public/r/delete-organization-card.json | 23 ------------ public/r/delete-organization-dialog.json | 33 ----------------- public/r/delete-user-options.json | 17 --------- public/r/dialog.json | 21 ----------- public/r/drawer.json | 20 ---------- public/r/dropdown-menu.json | 21 ----------- public/r/email-otp-button.json | 25 ------------- public/r/email-otp-error-codes.json | 17 --------- public/r/email-otp-form.json | 33 ----------------- public/r/email-template.json | 20 ---------- public/r/fetch-error.json | 17 --------- public/r/forgot-password-form.json | 33 ----------------- public/r/form-error.json | 23 ------------ public/r/form.json | 23 ------------ public/r/generic-oauth-error-codes.json | 17 --------- public/r/generic-oauth-options.json | 20 ---------- public/r/gravatar-options.json | 17 --------- public/r/gravatar-utils.json | 20 ---------- public/r/haveibeenpwned-error-codes.json | 17 --------- public/r/image-utils.json | 16 -------- public/r/image.json | 17 --------- public/r/input-field-skeleton.json | 20 ---------- public/r/input-otp.json | 21 ----------- public/r/input.json | 18 --------- public/r/invitation-cell.json | 29 --------------- public/r/invitation.json | 17 --------- public/r/invite-member-dialog.json | 32 ---------------- public/r/label.json | 20 ---------- public/r/leave-organization-dialog.json | 28 -------------- public/r/link.json | 17 --------- public/r/magic-link-button.json | 25 ------------- public/r/magic-link-form.json | 33 ----------------- public/r/member-cell.json | 31 ---------------- public/r/model-names.json | 16 -------- public/r/multi-session-error-codes.json | 17 --------- public/r/one-tap.json | 21 ----------- public/r/organization-cell-view.json | 24 ------------ public/r/organization-cell.json | 29 --------------- public/r/organization-error-codes.json | 17 --------- public/r/organization-invitations-card.json | 25 ------------- public/r/organization-logo-card.json | 32 ---------------- public/r/organization-logo.json | 25 ------------- public/r/organization-members-card.json | 26 ------------- public/r/organization-name-card.json | 30 --------------- public/r/organization-options.json | 19 ---------- public/r/organization-refetcher.json | 19 ---------- public/r/organization-settings-cards.json | 25 ------------- public/r/organization-slug-card.json | 30 --------------- public/r/organization-switcher.json | 33 ----------------- public/r/organization-view.json | 30 --------------- public/r/organizations-card.json | 25 ------------- public/r/otp-input-group.json | 18 --------- public/r/passkey-button.json | 25 ------------- public/r/passkey-cell.json | 26 ------------- public/r/passkey-error-codes.json | 17 --------- public/r/passkeys-card.json | 27 -------------- public/r/password-input.json | 22 ----------- public/r/password-validation.json | 17 --------- public/r/personal-account-view.json | 22 ----------- public/r/phone-number-error-codes.json | 17 --------- public/r/profile.json | 17 --------- public/r/provider-button.json | 25 ------------- public/r/provider-cell.json | 29 --------------- public/r/provider-icons.json | 16 -------- public/r/providers-card.json | 26 ------------- public/r/recaptcha-badge.json | 21 ----------- public/r/recaptcha-v2.json | 23 ------------ public/r/recaptcha-v3.json | 23 ------------ public/r/recover-account-form.json | 30 --------------- public/r/redirect-to-sign-in.json | 18 --------- public/r/redirect-to-sign-up.json | 18 --------- public/r/refetch.json | 17 --------- public/r/remove-member-dialog.json | 27 -------------- public/r/render-toast.json | 17 --------- public/r/reset-password-form.json | 30 --------------- public/r/security-settings-cards.json | 27 -------------- public/r/select.json | 21 ----------- public/r/separator.json | 20 ---------- public/r/session-cell.json | 28 -------------- public/r/session-freshness-dialog.json | 23 ------------ public/r/sessions-card.json | 24 ------------ public/r/settings-action-button.json | 23 ------------ public/r/settings-card-footer.json | 22 ----------- public/r/settings-card-header.json | 21 ----------- public/r/settings-card.json | 23 ------------ public/r/settings-cell-skeleton.json | 21 ----------- public/r/sign-in-form.json | 37 ------------------- public/r/sign-out.json | 21 ----------- public/r/sign-up-form.json | 41 --------------------- public/r/sign-up-options.json | 17 --------- public/r/signed-in.json | 18 --------- public/r/signed-out.json | 18 --------- public/r/skeleton.json | 18 --------- public/r/social-options.json | 21 ----------- public/r/social-providers.json | 18 --------- public/r/stripe-localization.json | 17 --------- public/r/tabs.json | 20 ---------- public/r/textarea.json | 18 --------- public/r/two-factor-card.json | 22 ----------- public/r/two-factor-error-codes.json | 17 --------- public/r/two-factor-form.json | 37 ------------------- public/r/two-factor-password-dialog.json | 30 --------------- public/r/update-avatar-card.json | 30 --------------- public/r/update-field-card.json | 32 ---------------- public/r/update-member-role-dialog.json | 28 -------------- public/r/update-name-card.json | 20 ---------- public/r/update-username-card.json | 21 ----------- public/r/use-auth-data.json | 21 ----------- public/r/use-authenticate.json | 19 ---------- public/r/use-captcha.json | 24 ------------ public/r/use-conditional-query.json | 19 ---------- public/r/use-current-organization.json | 20 ---------- public/r/use-hydrated.json | 16 -------- public/r/use-instant-options.json | 28 -------------- public/r/use-lang.json | 16 -------- public/r/use-list-accounts.json | 22 ----------- public/r/use-list-sessions.json | 24 ------------ public/r/use-session.json | 23 ------------ public/r/use-success-transition.json | 19 ---------- public/r/use-tanstack-options.json | 24 ------------ public/r/use-theme.json | 16 -------- public/r/use-triplit-hooks.json | 26 ------------- public/r/use-triplit-token.json | 19 ---------- public/r/user-avatar.json | 26 ------------- public/r/user-button.json | 29 --------------- public/r/user-invitations-card.json | 26 ------------- public/r/user-view.json | 23 ------------ public/r/username-error-codes.json | 17 --------- public/r/utils.json | 23 ------------ public/r/view-paths.json | 16 -------- 176 files changed, 4044 deletions(-) delete mode 100644 public/r/accept-invitation-card.json delete mode 100644 public/r/account-cell.json delete mode 100644 public/r/account-options.json delete mode 100644 public/r/account-settings-cards.json delete mode 100644 public/r/account-view.json delete mode 100644 public/r/accounts-card.json delete mode 100644 public/r/additional-fields.json delete mode 100644 public/r/admin-error-codes.json delete mode 100644 public/r/alert.json delete mode 100644 public/r/anonymous-error-codes.json delete mode 100644 public/r/any-auth-client.json delete mode 100644 public/r/api-key-cell.json delete mode 100644 public/r/api-key-delete-dialog.json delete mode 100644 public/r/api-key-display-dialog.json delete mode 100644 public/r/api-key-error-codes.json delete mode 100644 public/r/api-key.json delete mode 100644 public/r/api-keys-card.json delete mode 100644 public/r/auth-callback.json delete mode 100644 public/r/auth-client.json delete mode 100644 public/r/auth-data-cache.json delete mode 100644 public/r/auth-form.json delete mode 100644 public/r/auth-hooks.json delete mode 100644 public/r/auth-loading.json delete mode 100644 public/r/auth-localization.json delete mode 100644 public/r/auth-mutators.json delete mode 100644 public/r/auth-ui-provider-tanstack.json delete mode 100644 public/r/auth-ui-provider.json delete mode 100644 public/r/auth-view.json delete mode 100644 public/r/avatar-options.json delete mode 100644 public/r/avatar.json delete mode 100644 public/r/backup-codes-dialog.json delete mode 100644 public/r/base-error-codes.json delete mode 100644 public/r/button.json delete mode 100644 public/r/captcha-error-codes.json delete mode 100644 public/r/captcha-options.json delete mode 100644 public/r/captcha-provider.json delete mode 100644 public/r/captcha.json delete mode 100644 public/r/card.json delete mode 100644 public/r/change-email-card.json delete mode 100644 public/r/change-password-card.json delete mode 100644 public/r/checkbox.json delete mode 100644 public/r/create-api-key-dialog.json delete mode 100644 public/r/create-organization-dialog.json delete mode 100644 public/r/credentials-options.json delete mode 100644 public/r/delete-account-card.json delete mode 100644 public/r/delete-account-dialog.json delete mode 100644 public/r/delete-organization-card.json delete mode 100644 public/r/delete-organization-dialog.json delete mode 100644 public/r/delete-user-options.json delete mode 100644 public/r/dialog.json delete mode 100644 public/r/drawer.json delete mode 100644 public/r/dropdown-menu.json delete mode 100644 public/r/email-otp-button.json delete mode 100644 public/r/email-otp-error-codes.json delete mode 100644 public/r/email-otp-form.json delete mode 100644 public/r/email-template.json delete mode 100644 public/r/fetch-error.json delete mode 100644 public/r/forgot-password-form.json delete mode 100644 public/r/form-error.json delete mode 100644 public/r/form.json delete mode 100644 public/r/generic-oauth-error-codes.json delete mode 100644 public/r/generic-oauth-options.json delete mode 100644 public/r/gravatar-options.json delete mode 100644 public/r/gravatar-utils.json delete mode 100644 public/r/haveibeenpwned-error-codes.json delete mode 100644 public/r/image-utils.json delete mode 100644 public/r/image.json delete mode 100644 public/r/input-field-skeleton.json delete mode 100644 public/r/input-otp.json delete mode 100644 public/r/input.json delete mode 100644 public/r/invitation-cell.json delete mode 100644 public/r/invitation.json delete mode 100644 public/r/invite-member-dialog.json delete mode 100644 public/r/label.json delete mode 100644 public/r/leave-organization-dialog.json delete mode 100644 public/r/link.json delete mode 100644 public/r/magic-link-button.json delete mode 100644 public/r/magic-link-form.json delete mode 100644 public/r/member-cell.json delete mode 100644 public/r/model-names.json delete mode 100644 public/r/multi-session-error-codes.json delete mode 100644 public/r/one-tap.json delete mode 100644 public/r/organization-cell-view.json delete mode 100644 public/r/organization-cell.json delete mode 100644 public/r/organization-error-codes.json delete mode 100644 public/r/organization-invitations-card.json delete mode 100644 public/r/organization-logo-card.json delete mode 100644 public/r/organization-logo.json delete mode 100644 public/r/organization-members-card.json delete mode 100644 public/r/organization-name-card.json delete mode 100644 public/r/organization-options.json delete mode 100644 public/r/organization-refetcher.json delete mode 100644 public/r/organization-settings-cards.json delete mode 100644 public/r/organization-slug-card.json delete mode 100644 public/r/organization-switcher.json delete mode 100644 public/r/organization-view.json delete mode 100644 public/r/organizations-card.json delete mode 100644 public/r/otp-input-group.json delete mode 100644 public/r/passkey-button.json delete mode 100644 public/r/passkey-cell.json delete mode 100644 public/r/passkey-error-codes.json delete mode 100644 public/r/passkeys-card.json delete mode 100644 public/r/password-input.json delete mode 100644 public/r/password-validation.json delete mode 100644 public/r/personal-account-view.json delete mode 100644 public/r/phone-number-error-codes.json delete mode 100644 public/r/profile.json delete mode 100644 public/r/provider-button.json delete mode 100644 public/r/provider-cell.json delete mode 100644 public/r/provider-icons.json delete mode 100644 public/r/providers-card.json delete mode 100644 public/r/recaptcha-badge.json delete mode 100644 public/r/recaptcha-v2.json delete mode 100644 public/r/recaptcha-v3.json delete mode 100644 public/r/recover-account-form.json delete mode 100644 public/r/redirect-to-sign-in.json delete mode 100644 public/r/redirect-to-sign-up.json delete mode 100644 public/r/refetch.json delete mode 100644 public/r/remove-member-dialog.json delete mode 100644 public/r/render-toast.json delete mode 100644 public/r/reset-password-form.json delete mode 100644 public/r/security-settings-cards.json delete mode 100644 public/r/select.json delete mode 100644 public/r/separator.json delete mode 100644 public/r/session-cell.json delete mode 100644 public/r/session-freshness-dialog.json delete mode 100644 public/r/sessions-card.json delete mode 100644 public/r/settings-action-button.json delete mode 100644 public/r/settings-card-footer.json delete mode 100644 public/r/settings-card-header.json delete mode 100644 public/r/settings-card.json delete mode 100644 public/r/settings-cell-skeleton.json delete mode 100644 public/r/sign-in-form.json delete mode 100644 public/r/sign-out.json delete mode 100644 public/r/sign-up-form.json delete mode 100644 public/r/sign-up-options.json delete mode 100644 public/r/signed-in.json delete mode 100644 public/r/signed-out.json delete mode 100644 public/r/skeleton.json delete mode 100644 public/r/social-options.json delete mode 100644 public/r/social-providers.json delete mode 100644 public/r/stripe-localization.json delete mode 100644 public/r/tabs.json delete mode 100644 public/r/textarea.json delete mode 100644 public/r/two-factor-card.json delete mode 100644 public/r/two-factor-error-codes.json delete mode 100644 public/r/two-factor-form.json delete mode 100644 public/r/two-factor-password-dialog.json delete mode 100644 public/r/update-avatar-card.json delete mode 100644 public/r/update-field-card.json delete mode 100644 public/r/update-member-role-dialog.json delete mode 100644 public/r/update-name-card.json delete mode 100644 public/r/update-username-card.json delete mode 100644 public/r/use-auth-data.json delete mode 100644 public/r/use-authenticate.json delete mode 100644 public/r/use-captcha.json delete mode 100644 public/r/use-conditional-query.json delete mode 100644 public/r/use-current-organization.json delete mode 100644 public/r/use-hydrated.json delete mode 100644 public/r/use-instant-options.json delete mode 100644 public/r/use-lang.json delete mode 100644 public/r/use-list-accounts.json delete mode 100644 public/r/use-list-sessions.json delete mode 100644 public/r/use-session.json delete mode 100644 public/r/use-success-transition.json delete mode 100644 public/r/use-tanstack-options.json delete mode 100644 public/r/use-theme.json delete mode 100644 public/r/use-triplit-hooks.json delete mode 100644 public/r/use-triplit-token.json delete mode 100644 public/r/user-avatar.json delete mode 100644 public/r/user-button.json delete mode 100644 public/r/user-invitations-card.json delete mode 100644 public/r/user-view.json delete mode 100644 public/r/username-error-codes.json delete mode 100644 public/r/utils.json delete mode 100644 public/r/view-paths.json diff --git a/public/r/accept-invitation-card.json b/public/r/accept-invitation-card.json deleted file mode 100644 index b6b159bc..00000000 --- a/public/r/accept-invitation-card.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "accept-invitation-card", - "type": "registry:component", - "title": "Accept Invitation Card", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/use-authenticate.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/accept-invitation-card.tsx", - "content": "\"use client\"\n\nimport { CheckIcon, Loader2, XIcon } from \"lucide-react\"\nimport { useCallback, useContext, useEffect, useMemo, useState } from \"react\"\n\nimport { useAuthenticate } from \"../../hooks/use-authenticate\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle\n} from \"../ui/card\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface AcceptInvitationCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function AcceptInvitationCard({\n className,\n classNames,\n localization: localizationProp\n}: AcceptInvitationCardProps) {\n const {\n localization: contextLocalization,\n redirectTo,\n replace,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: sessionData } = useAuthenticate()\n const [invitationId, setInvitationId] = useState(null)\n\n useEffect(() => {\n const invitationIdParam = getSearchParam(\"invitationId\")\n\n if (!invitationIdParam) {\n toast({\n variant: \"error\",\n message: localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n return\n }\n\n setInvitationId(invitationIdParam)\n }, [localization.INVITATION_NOT_FOUND, toast, replace, redirectTo])\n\n if (!sessionData || !invitationId) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nfunction AcceptInvitationContent({\n className,\n classNames,\n localization: localizationProp,\n invitationId\n}: AcceptInvitationCardProps & { invitationId: string }) {\n const {\n authClient,\n hooks: { useInvitation },\n localization: contextLocalization,\n organization,\n redirectTo,\n replace,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [isRejecting, setIsRejecting] = useState(false)\n const [isAccepting, setIsAccepting] = useState(false)\n const isProcessing = isRejecting || isAccepting\n\n const { data: invitation, isPending } = useInvitation({\n query: {\n id: invitationId\n }\n })\n\n const getRedirectTo = useCallback(\n () => getSearchParam(\"redirectTo\") || redirectTo,\n [redirectTo]\n )\n\n useEffect(() => {\n if (isPending || !invitationId) return\n\n if (!invitation) {\n toast({\n variant: \"error\",\n message: localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n return\n }\n\n if (\n invitation.status !== \"pending\" ||\n new Date(invitation.expiresAt) < new Date()\n ) {\n toast({\n variant: \"error\",\n message:\n new Date(invitation.expiresAt) < new Date()\n ? localization.INVITATION_EXPIRED\n : localization.INVITATION_NOT_FOUND\n })\n\n replace(redirectTo)\n }\n }, [\n invitation,\n isPending,\n invitationId,\n localization,\n toast,\n replace,\n redirectTo\n ])\n\n const acceptInvitation = async () => {\n setIsAccepting(true)\n\n try {\n await authClient.organization.acceptInvitation({\n invitationId: invitationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message:\n localization.INVITATION_ACCEPTED || \"Invitation accepted\"\n })\n\n replace(getRedirectTo())\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsAccepting(false)\n }\n }\n\n const rejectInvitation = async () => {\n setIsRejecting(true)\n\n try {\n await authClient.organization.rejectInvitation({\n invitationId: invitationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_REJECTED\n })\n\n replace(redirectTo)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsRejecting(false)\n }\n }\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organization?.customRoles || [])]\n const roleLabel =\n roles.find((r) => r.role === invitation?.role)?.label ||\n invitation?.role\n\n if (!invitation)\n return (\n \n )\n\n return (\n \n \n \n {localization.ACCEPT_INVITATION}\n \n\n \n {localization.ACCEPT_INVITATION_DESCRIPTION}\n \n \n\n \n \n \n\n

\n {roleLabel}\n

\n
\n\n
\n \n {isRejecting ? (\n \n ) : (\n \n )}\n\n {localization.REJECT}\n \n\n \n {isAccepting ? (\n \n ) : (\n \n )}\n\n {localization.ACCEPT}\n \n
\n \n
\n )\n}\n\nconst AcceptInvitationSkeleton = ({\n className,\n classNames,\n localization\n}: AcceptInvitationCardProps) => {\n return (\n \n \n \n\n \n \n\n \n \n \n\n \n \n\n
\n \n\n \n
\n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/account-cell.json b/public/r/account-cell.json deleted file mode 100644 index ae7770da..00000000 --- a/public/r/account-cell.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "account-cell", - "type": "registry:component", - "title": "Account Cell", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/account-cell.tsx", - "content": "\"use client\"\n\nimport type { Session, User } from \"better-auth\"\nimport {\n EllipsisIcon,\n Loader2,\n LogOutIcon,\n RepeatIcon,\n UserX2Icon\n} from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport { UserView } from \"../../user-view\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface AccountCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n deviceSession: { user: User; session: Session }\n localization?: Partial\n refetch?: Refetch\n}\n\nexport function AccountCell({\n className,\n classNames,\n deviceSession,\n localization,\n refetch\n}: AccountCellProps) {\n const {\n basePath,\n localization: contextLocalization,\n hooks: { useSession },\n mutators: { revokeDeviceSession, setActiveSession },\n toast,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleRevoke = async () => {\n setIsLoading(true)\n\n try {\n await revokeDeviceSession({\n sessionToken: deviceSession.session.token\n })\n\n refetch?.()\n } catch (error) {\n setIsLoading(false)\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const handleSetActiveSession = async () => {\n setIsLoading(true)\n\n try {\n await setActiveSession({\n sessionToken: deviceSession.session.token\n })\n\n refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n const isCurrentSession =\n deviceSession.session.id === sessionData?.session.id\n\n return (\n \n \n\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n\n \n {!isCurrentSession && (\n \n \n\n {localization.SWITCH_ACCOUNT}\n \n )}\n\n {\n if (isCurrentSession) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n handleRevoke()\n }}\n variant=\"destructive\"\n >\n {isCurrentSession ? (\n \n ) : (\n \n )}\n\n {isCurrentSession\n ? localization.SIGN_OUT\n : localization.REVOKE}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/account-options.json b/public/r/account-options.json deleted file mode 100644 index c192aa20..00000000 --- a/public/r/account-options.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "account-options", - "type": "registry:file", - "title": "Account Options", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/types/account-options.ts", - "content": "import type { AccountViewPaths } from \"../lib/view-paths\"\n\nexport type AccountOptions = {\n /**\n * Base path for account-scoped views\n * @default \"/account\"\n */\n basePath?: string\n /**\n * Array of fields to show in Account Settings\n * @default [\"image\", \"name\"]\n */\n fields: string[]\n /**\n * Customize account view paths\n */\n viewPaths?: Partial\n}\n\nexport type AccountOptionsContext = {\n /**\n * Base path for account-scoped views\n * @default \"/account\"\n */\n basePath: string\n /**\n * Array of fields to show in Account Settings\n * @default [\"image\", \"name\"]\n */\n fields: string[]\n /**\n * Customize account view paths\n */\n viewPaths: AccountViewPaths\n}\n", - "type": "registry:file", - "target": "types/account-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/account-settings-cards.json b/public/r/account-settings-cards.json deleted file mode 100644 index 948b4c0b..00000000 --- a/public/r/account-settings-cards.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "account-settings-cards", - "type": "registry:component", - "title": "Account Settings Cards", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/accounts-card.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/change-email-card.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-avatar-card.json", - "https://better-auth-ui.com/r/update-field-card.json", - "https://better-auth-ui.com/r/update-name-card.json", - "https://better-auth-ui.com/r/update-username-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account-settings-cards.tsx", - "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { AccountsCard } from \"./account/accounts-card\"\nimport { UpdateAvatarCard } from \"./account/update-avatar-card\"\nimport { UpdateFieldCard } from \"./account/update-field-card\"\nimport { UpdateNameCard } from \"./account/update-name-card\"\nimport { UpdateUsernameCard } from \"./account/update-username-card\"\nimport { ChangeEmailCard } from \"./security/change-email-card\"\nimport type { SettingsCardClassNames } from \"./shared/settings-card\"\n\nexport function AccountSettingsCards({\n className,\n classNames,\n localization\n}: {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n}) {\n const {\n additionalFields,\n avatar,\n changeEmail,\n credentials,\n hooks: { useSession },\n multiSession,\n account: accountOptions\n } = useContext(AuthUIContext)\n\n const { data: sessionData } = useSession()\n\n return (\n \n {accountOptions?.fields?.includes(\"image\") && avatar && (\n \n )}\n\n {credentials?.username && (\n \n )}\n\n {accountOptions?.fields?.includes(\"name\") && (\n \n )}\n\n {changeEmail && (\n \n )}\n\n {accountOptions?.fields?.map((field) => {\n if (field === \"image\") return null\n if (field === \"name\") return null\n const additionalField = additionalFields?.[field]\n if (!additionalField) return null\n\n const {\n label,\n description,\n instructions,\n placeholder,\n required,\n type,\n multiline,\n validate\n } = additionalField\n\n // @ts-ignore Custom fields are not typed\n const defaultValue = sessionData?.user[field] as unknown\n\n return (\n \n )\n })}\n\n {multiSession && (\n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/account-view.json b/public/r/account-view.json deleted file mode 100644 index bbb01b46..00000000 --- a/public/r/account-view.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "account-view", - "type": "registry:component", - "title": "Account View", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-settings-cards.json", - "https://better-auth-ui.com/r/api-keys-card.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "drawer", - "label", - "https://better-auth-ui.com/r/organizations-card.json", - "https://better-auth-ui.com/r/security-settings-cards.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-invitations-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/account/account-view.tsx", - "content": "\"use client\"\n\nimport { MenuIcon } from \"lucide-react\"\nimport { useContext, useMemo } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { AccountViewPath } from \"../../server\"\nimport { OrganizationsCard } from \"../organization/organizations-card\"\nimport { UserInvitationsCard } from \"../organization/user-invitations-card\"\nimport { AccountSettingsCards } from \"../settings/account-settings-cards\"\nimport { ApiKeysCard } from \"../settings/api-key/api-keys-card\"\nimport { SecuritySettingsCards } from \"../settings/security-settings-cards\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger\n} from \"../ui/drawer\"\nimport { Label } from \"../ui/label\"\n\nexport interface AccountViewProps {\n className?: string\n classNames?: {\n base?: string\n cards?: string\n drawer?: { menuItem?: string }\n sidebar?: { base?: string; button?: string; buttonActive?: string }\n card?: SettingsCardClassNames\n }\n localization?: AuthLocalization\n pathname?: string\n view?: AccountViewPath\n hideNav?: boolean\n}\n\nexport function AccountView({\n className,\n classNames,\n localization: localizationProp,\n pathname,\n view: viewProp,\n hideNav\n}: AccountViewProps) {\n const {\n apiKey,\n localization: contextLocalization,\n organization,\n account: accountOptions,\n Link\n } = useContext(AuthUIContext)\n\n if (!accountOptions) {\n return null\n }\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const view =\n viewProp ||\n getViewByPath(accountOptions.viewPaths, pathname) ||\n \"SETTINGS\"\n\n const navItems: {\n view: AccountViewPath\n label: string\n }[] = [\n { view: \"SETTINGS\", label: localization.ACCOUNT },\n { view: \"SECURITY\", label: localization.SECURITY }\n ]\n\n if (apiKey) {\n navItems.push({\n view: \"API_KEYS\",\n label: localization.API_KEYS\n })\n }\n\n if (organization) {\n navItems.push({\n view: \"ORGANIZATIONS\",\n label: localization.ORGANIZATIONS\n })\n }\n\n return (\n \n {!hideNav && (\n
\n \n\n \n \n \n \n \n \n \n {localization.SETTINGS}\n \n \n
\n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n
\n
\n
\n )}\n\n {!hideNav && (\n
\n \n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n \n )}\n\n {view === \"SETTINGS\" && (\n \n )}\n\n {view === \"SECURITY\" && (\n \n )}\n\n {view === \"API_KEYS\" && (\n \n )}\n\n {view === \"ORGANIZATIONS\" && organization && (\n
\n \n\n \n
\n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/accounts-card.json b/public/r/accounts-card.json deleted file mode 100644 index 3990b25c..00000000 --- a/public/r/accounts-card.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "accounts-card", - "type": "registry:component", - "title": "Accounts Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-cell.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/accounts-card.tsx", - "content": "\"use client\"\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { AccountCell } from \"./account-cell\"\n\nexport interface AccountsCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function AccountsCard({\n className,\n classNames,\n localization\n}: AccountsCardProps) {\n const {\n basePath,\n hooks: { useListDeviceSessions, useSession },\n localization: contextLocalization,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: deviceSessions, isPending, refetch } = useListDeviceSessions()\n const { data: sessionData } = useSession()\n\n const otherDeviceSessions = (deviceSessions || []).filter(\n (ds) => ds.session.id !== sessionData?.session.id\n )\n\n return (\n navigate(`${basePath}/${viewPaths.SIGN_IN}`)}\n >\n {deviceSessions?.length && (\n \n {sessionData && (\n \n )}\n\n {otherDeviceSessions.map((deviceSession) => (\n \n ))}\n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/additional-fields.json b/public/r/additional-fields.json deleted file mode 100644 index 88fd9e06..00000000 --- a/public/r/additional-fields.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "additional-fields", - "type": "registry:file", - "title": "Additional Fields", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/additional-fields.ts", - "content": "import type { ReactNode } from \"react\"\n\nexport type FieldType = \"string\" | \"number\" | \"boolean\"\n\nexport interface AdditionalField {\n description?: ReactNode\n instructions?: ReactNode\n label: ReactNode\n placeholder?: string\n required?: boolean\n type: FieldType\n /**\n * Render a multi-line textarea for string fields\n */\n multiline?: boolean\n validate?: (value: string) => Promise\n}\n\nexport interface AdditionalFields {\n [key: string]: AdditionalField\n}\n", - "type": "registry:file", - "target": "types/additional-fields.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/admin-error-codes.json b/public/r/admin-error-codes.json deleted file mode 100644 index 34a14b87..00000000 --- a/public/r/admin-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "admin-error-codes", - "type": "registry:file", - "title": "Admin Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/admin-error-codes.ts", - "content": "export const ADMIN_ERROR_CODES = {\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n USER_ALREADY_EXISTS: \"User already exists\",\n YOU_CANNOT_BAN_YOURSELF: \"You cannot ban yourself\",\n YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE:\n \"You are not allowed to change users role\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS: \"You are not allowed to create users\",\n YOU_ARE_NOT_ALLOWED_TO_LIST_USERS: \"You are not allowed to list users\",\n YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS:\n \"You are not allowed to list users sessions\",\n YOU_ARE_NOT_ALLOWED_TO_BAN_USERS: \"You are not allowed to ban users\",\n YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS:\n \"You are not allowed to impersonate users\",\n YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS:\n \"You are not allowed to revoke users sessions\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS: \"You are not allowed to delete users\",\n YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD:\n \"You are not allowed to set users password\",\n BANNED_USER: \"You have been banned from this application\"\n}\n", - "type": "registry:file", - "target": "localization/admin-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/alert.json b/public/r/alert.json deleted file mode 100644 index e0f308f5..00000000 --- a/public/r/alert.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "alert", - "type": "registry:ui", - "title": "Alert", - "description": "", - "dependencies": [ - "class-variance-authority" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/alert.tsx", - "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps) {\n return (\n \n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/anonymous-error-codes.json b/public/r/anonymous-error-codes.json deleted file mode 100644 index 2ad5d185..00000000 --- a/public/r/anonymous-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "anonymous-error-codes", - "type": "registry:file", - "title": "Anonymous Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/anonymous-error-codes.ts", - "content": "export const ANONYMOUS_ERROR_CODES = {\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n COULD_NOT_CREATE_SESSION: \"Could not create session\",\n ANONYMOUS_USERS_CANNOT_SIGN_IN_AGAIN_ANONYMOUSLY:\n \"Anonymous users cannot sign in again anonymously\"\n}\n", - "type": "registry:file", - "target": "localization/anonymous-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/any-auth-client.json b/public/r/any-auth-client.json deleted file mode 100644 index ed67452a..00000000 --- a/public/r/any-auth-client.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "any-auth-client", - "type": "registry:file", - "title": "Any Auth Client", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/types/any-auth-client.ts", - "content": "import type { createAuthClient } from \"better-auth/react\"\n\nexport type AnyAuthClient = Omit<\n ReturnType,\n \"signUp\" | \"getSession\"\n>\n", - "type": "registry:file", - "target": "types/any-auth-client.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/api-key-cell.json b/public/r/api-key-cell.json deleted file mode 100644 index c09c02f2..00000000 --- a/public/r/api-key-cell.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "api-key-cell", - "type": "registry:component", - "title": "Api Key Cell", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/api-key.json", - "https://better-auth-ui.com/r/api-key-delete-dialog.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-key-cell.tsx", - "content": "\"use client\"\n\nimport { KeyRoundIcon } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { ApiKey } from \"../../../types/api-key\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { ApiKeyDeleteDialog } from \"./api-key-delete-dialog\"\n\nexport interface ApiKeyCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n apiKey: ApiKey\n localization?: Partial\n refetch?: Refetch\n}\n\nexport function ApiKeyCell({\n className,\n classNames,\n apiKey,\n localization,\n refetch\n}: ApiKeyCellProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n\n const [showDeleteDialog, setShowDeleteDialog] = useState(false)\n\n // Format expiration date or show \"Never expires\"\n const formatExpiration = () => {\n if (!apiKey.expiresAt) return localization.NEVER_EXPIRES\n\n const expiresDate = new Date(apiKey.expiresAt)\n return `${localization.EXPIRES} ${expiresDate.toLocaleDateString(\n lang ?? \"en\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\"\n }\n )}`\n }\n\n return (\n <>\n \n \n\n
\n
\n \n {apiKey.name}\n \n\n \n {apiKey.start}\n {\"******\"}\n \n
\n\n
\n {formatExpiration()}\n
\n
\n\n setShowDeleteDialog(true)}\n >\n {localization.DELETE}\n \n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/api-key-delete-dialog.json b/public/r/api-key-delete-dialog.json deleted file mode 100644 index 8c67717a..00000000 --- a/public/r/api-key-delete-dialog.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "api-key-delete-dialog", - "type": "registry:component", - "title": "Api Key Delete Dialog", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/api-key.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-key-delete-dialog.tsx", - "content": "\"use client\"\n\nimport { KeyRoundIcon, Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { ApiKey } from \"../../../types/api-key\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface ApiKeyDeleteDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n apiKey: ApiKey\n localization?: AuthLocalization\n refetch?: Refetch\n}\n\nexport function ApiKeyDeleteDialog({\n classNames,\n apiKey,\n localization,\n refetch,\n onOpenChange,\n ...props\n}: ApiKeyDeleteDialogProps) {\n const {\n localization: contextLocalization,\n mutators: { deleteApiKey },\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleDelete = async () => {\n setIsLoading(true)\n\n try {\n await deleteApiKey({ keyId: apiKey.id })\n await refetch?.()\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n // Format expiration date or show \"Never expires\"\n const formatExpiration = () => {\n if (!apiKey.expiresAt) return localization.NEVER_EXPIRES\n\n const expiresDate = new Date(apiKey.expiresAt)\n return `${localization.EXPIRES} ${expiresDate.toLocaleDateString(\n lang ?? \"en\",\n {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\"\n }\n )}`\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.DELETE} {localization.API_KEY}\n \n\n \n {localization.DELETE_API_KEY_CONFIRM}\n \n \n\n \n \n\n
\n
\n \n {apiKey.name}\n \n\n \n {apiKey.start}\n {\"******\"}\n \n
\n\n
\n {formatExpiration()}\n
\n
\n \n\n \n onOpenChange?.(false)}\n disabled={isLoading}\n className={cn(\n classNames?.button,\n classNames?.secondaryButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isLoading && }\n {localization.DELETE}\n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/api-key-display-dialog.json b/public/r/api-key-display-dialog.json deleted file mode 100644 index 42fd11be..00000000 --- a/public/r/api-key-display-dialog.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "api-key-display-dialog", - "type": "registry:component", - "title": "Api Key Display Dialog", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-key-display-dialog.tsx", - "content": "\"use client\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface ApiKeyDisplayDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n apiKey: string\n}\n\nexport function ApiKeyDisplayDialog({\n classNames,\n apiKey,\n localization,\n onOpenChange,\n ...props\n}: ApiKeyDisplayDialogProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n localization = { ...contextLocalization, ...localization }\n\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n navigator.clipboard.writeText(apiKey)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.API_KEY_CREATED}\n \n\n \n {localization.CREATE_API_KEY_SUCCESS}\n \n \n\n
\n {apiKey}\n
\n\n \n \n {copied ? (\n <>\n \n {localization.COPIED_TO_CLIPBOARD}\n \n ) : (\n <>\n \n {localization.COPY_TO_CLIPBOARD}\n \n )}\n \n\n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.primaryButton\n )}\n >\n {localization.DONE}\n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/api-key-error-codes.json b/public/r/api-key-error-codes.json deleted file mode 100644 index 09f95a5e..00000000 --- a/public/r/api-key-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "api-key-error-codes", - "type": "registry:file", - "title": "Api Key Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/api-key-error-codes.ts", - "content": "export const API_KEY_ERROR_CODES = {\n INVALID_METADATA_TYPE: \"metadata must be an object or undefined\",\n REFILL_AMOUNT_AND_INTERVAL_REQUIRED:\n \"refillAmount is required when refillInterval is provided\",\n REFILL_INTERVAL_AND_AMOUNT_REQUIRED:\n \"refillInterval is required when refillAmount is provided\",\n USER_BANNED: \"User is banned\",\n UNAUTHORIZED_SESSION: \"Unauthorized or invalid session\",\n KEY_NOT_FOUND: \"API Key not found\",\n KEY_DISABLED: \"API Key is disabled\",\n KEY_EXPIRED: \"API Key has expired\",\n USAGE_EXCEEDED: \"API Key has reached its usage limit\",\n KEY_NOT_RECOVERABLE: \"API Key is not recoverable\",\n EXPIRES_IN_IS_TOO_SMALL:\n \"The expiresIn is smaller than the predefined minimum value.\",\n EXPIRES_IN_IS_TOO_LARGE:\n \"The expiresIn is larger than the predefined maximum value.\",\n INVALID_REMAINING: \"The remaining count is either too large or too small.\",\n INVALID_PREFIX_LENGTH:\n \"The prefix length is either too large or too small.\",\n INVALID_NAME_LENGTH: \"The name length is either too large or too small.\",\n METADATA_DISABLED: \"Metadata is disabled.\",\n RATE_LIMIT_EXCEEDED: \"Rate limit exceeded.\",\n NO_VALUES_TO_UPDATE: \"No values to update.\",\n KEY_DISABLED_EXPIRATION: \"Custom key expiration values are disabled.\",\n INVALID_API_KEY: \"Invalid API key.\",\n INVALID_USER_ID_FROM_API_KEY: \"The user id from the API key is invalid.\",\n INVALID_API_KEY_GETTER_RETURN_TYPE:\n \"API Key getter returned an invalid key type. Expected string.\",\n SERVER_ONLY_PROPERTY:\n \"The property you're trying to set can only be set from the server auth instance only.\"\n}\n", - "type": "registry:file", - "target": "localization/api-key-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/api-key.json b/public/r/api-key.json deleted file mode 100644 index fd0eecb8..00000000 --- a/public/r/api-key.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "api-key", - "type": "registry:file", - "title": "Api Key", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/api-key.ts", - "content": "export type ApiKey = {\n id: string\n name?: string | null\n start?: string | null\n expiresAt?: Date | null\n createdAt: Date\n updatedAt: Date\n metadata?: Record | null\n}\n", - "type": "registry:file", - "target": "types/api-key.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/api-keys-card.json b/public/r/api-keys-card.json deleted file mode 100644 index 2ae5234d..00000000 --- a/public/r/api-keys-card.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "api-keys-card", - "type": "registry:component", - "title": "Api Keys Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/api-key-cell.json", - "https://better-auth-ui.com/r/api-key-display-dialog.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/create-api-key-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-keys-card.tsx", - "content": "\"use client\"\n\nimport { useContext, useMemo, useState } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { ApiKeyCell } from \"./api-key-cell\"\nimport { ApiKeyDisplayDialog } from \"./api-key-display-dialog\"\nimport { CreateApiKeyDialog } from \"./create-api-key-dialog\"\n\nexport interface ApiKeysCardProps extends SettingsCardProps {\n organizationId?: string\n}\n\nexport function ApiKeysCard({\n className,\n classNames,\n localization,\n organizationId,\n ...props\n}: ApiKeysCardProps) {\n const {\n hooks: { useListApiKeys },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: apiKeys, isPending, refetch } = useListApiKeys()\n\n // Filter API keys by organizationId\n const filteredApiKeys = useMemo(() => {\n return apiKeys?.filter(\n (apiKey) => organizationId === apiKey.metadata?.organizationId\n )\n }, [apiKeys, organizationId])\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false)\n const [displayDialogOpen, setDisplayDialogOpen] = useState(false)\n const [createdApiKey, setCreatedApiKey] = useState(\"\")\n\n const handleCreateApiKey = (apiKey: string) => {\n setCreatedApiKey(apiKey)\n setDisplayDialogOpen(true)\n }\n\n return (\n <>\n setCreateDialogOpen(true)}\n {...props}\n >\n {filteredApiKeys && filteredApiKeys.length > 0 && (\n \n {filteredApiKeys?.map((apiKey) => (\n \n ))}\n \n )}\n \n\n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-callback.json b/public/r/auth-callback.json deleted file mode 100644 index 7f838c6c..00000000 --- a/public/r/auth-callback.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-callback", - "type": "registry:component", - "title": "Auth Callback", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-success-transition.json" - ], - "files": [ - { - "path": "src/components/auth/auth-callback.tsx", - "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function AuthCallback({ redirectTo }: { redirectTo?: string }) {\n const {\n hooks: { useIsRestoring },\n persistClient\n } = useContext(AuthUIContext)\n\n const isRestoring = useIsRestoring?.()\n const isRedirecting = useRef(false)\n\n const { onSuccess } = useOnSuccessTransition({ redirectTo })\n\n useEffect(() => {\n if (isRedirecting.current) return\n\n if (!persistClient) {\n isRedirecting.current = true\n onSuccess()\n return\n }\n\n if (isRestoring) return\n\n isRedirecting.current = true\n onSuccess()\n }, [isRestoring, persistClient, onSuccess])\n\n return \n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-client.json b/public/r/auth-client.json deleted file mode 100644 index 1d2ecc08..00000000 --- a/public/r/auth-client.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-client", - "type": "registry:file", - "title": "Auth Client", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/types/auth-client.ts", - "content": "import {\n anonymousClient,\n apiKeyClient,\n emailOTPClient,\n genericOAuthClient,\n magicLinkClient,\n multiSessionClient,\n oneTapClient,\n organizationClient,\n passkeyClient,\n twoFactorClient,\n usernameClient\n} from \"better-auth/client/plugins\"\nimport { createAuthClient } from \"better-auth/react\"\n\nexport const authClient = createAuthClient({\n plugins: [\n apiKeyClient(),\n multiSessionClient(),\n passkeyClient(),\n oneTapClient({\n clientId: \"\"\n }),\n genericOAuthClient(),\n anonymousClient(),\n usernameClient(),\n magicLinkClient(),\n emailOTPClient(),\n twoFactorClient(),\n organizationClient()\n ]\n})\n\nexport type AuthClient = typeof authClient\n\nexport type Session = AuthClient[\"$Infer\"][\"Session\"][\"session\"]\nexport type User = AuthClient[\"$Infer\"][\"Session\"][\"user\"]\n", - "type": "registry:file", - "target": "types/auth-client.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-data-cache.json b/public/r/auth-data-cache.json deleted file mode 100644 index 73188ee4..00000000 --- a/public/r/auth-data-cache.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-data-cache", - "type": "registry:lib", - "title": "Auth Data Cache", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/auth-data-cache.ts", - "content": "type CacheEntry = {\n data: T | null\n timestamp: number\n isRefetching: boolean\n}\n\nclass AuthDataCache {\n private cache = new Map>()\n private listeners = new Map void>>()\n private inFlightRequests = new Map>()\n\n get(key: string): CacheEntry | undefined {\n return this.cache.get(key) as CacheEntry | undefined\n }\n\n set(key: string, data: T | null) {\n const entry: CacheEntry = {\n data,\n timestamp: Date.now(),\n isRefetching: false\n }\n this.cache.set(key, entry)\n this.notify(key)\n }\n\n setRefetching(key: string, isRefetching: boolean) {\n const entry = this.cache.get(key)\n if (entry) {\n entry.isRefetching = isRefetching\n this.notify(key)\n }\n }\n\n clear(key?: string) {\n if (key) {\n this.cache.delete(key)\n this.inFlightRequests.delete(key)\n this.notify(key)\n } else {\n this.cache.clear()\n this.inFlightRequests.clear()\n const keys = Array.from(this.listeners.keys())\n for (const key of keys) {\n this.notify(key)\n }\n }\n }\n\n getInFlightRequest(key: string): Promise | undefined {\n return this.inFlightRequests.get(key) as Promise | undefined\n }\n\n setInFlightRequest(key: string, promise: Promise) {\n this.inFlightRequests.set(key, promise)\n }\n\n removeInFlightRequest(key: string) {\n this.inFlightRequests.delete(key)\n }\n\n subscribe(key: string, callback: () => void) {\n if (!this.listeners.has(key)) {\n this.listeners.set(key, new Set())\n }\n this.listeners.get(key)!.add(callback)\n\n return () => {\n const callbacks = this.listeners.get(key)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.listeners.delete(key)\n }\n }\n }\n }\n\n private notify(key: string) {\n const callbacks = this.listeners.get(key)\n if (callbacks) {\n const callbackArray = Array.from(callbacks)\n for (const callback of callbackArray) {\n callback()\n }\n }\n }\n}\n\n// Global singleton instance\nexport const authDataCache = new AuthDataCache()\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-form.json b/public/r/auth-form.json deleted file mode 100644 index edcc5326..00000000 --- a/public/r/auth-form.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-form", - "type": "registry:component", - "title": "Auth Form", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-callback.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/email-otp-form.json", - "https://better-auth-ui.com/r/forgot-password-form.json", - "https://better-auth-ui.com/r/magic-link-form.json", - "https://better-auth-ui.com/r/recover-account-form.json", - "https://better-auth-ui.com/r/reset-password-form.json", - "https://better-auth-ui.com/r/sign-in-form.json", - "https://better-auth-ui.com/r/sign-out.json", - "https://better-auth-ui.com/r/sign-up-form.json", - "https://better-auth-ui.com/r/two-factor-form.json", - "https://better-auth-ui.com/r/utils.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/components/auth/auth-form.tsx", - "content": "\"use client\"\n\nimport { useContext, useEffect } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { getViewByPath } from \"../../lib/utils\"\nimport type { AuthViewPath } from \"../../lib/view-paths\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { AuthCallback } from \"./auth-callback\"\nimport { EmailOTPForm } from \"./forms/email-otp-form\"\nimport { ForgotPasswordForm } from \"./forms/forgot-password-form\"\nimport { MagicLinkForm } from \"./forms/magic-link-form\"\nimport { RecoverAccountForm } from \"./forms/recover-account-form\"\nimport { ResetPasswordForm } from \"./forms/reset-password-form\"\nimport { SignInForm } from \"./forms/sign-in-form\"\nimport { SignUpForm } from \"./forms/sign-up-form\"\nimport { TwoFactorForm } from \"./forms/two-factor-form\"\nimport { SignOut } from \"./sign-out\"\n\nexport type AuthFormClassNames = {\n base?: string\n button?: string\n checkbox?: string\n description?: string\n error?: string\n forgotPasswordLink?: string\n icon?: string\n input?: string\n label?: string\n otpInput?: string\n otpInputContainer?: string\n outlineButton?: string\n primaryButton?: string\n providerButton?: string\n qrCode?: string\n secondaryButton?: string\n}\n\nexport interface AuthFormProps {\n className?: string\n classNames?: AuthFormClassNames\n callbackURL?: string\n isSubmitting?: boolean\n localization?: Partial\n pathname?: string\n redirectTo?: string\n view?: AuthViewPath\n otpSeparators?: 0 | 1 | 2\n setIsSubmitting?: (isSubmitting: boolean) => void\n}\n\nexport function AuthForm({\n className,\n classNames,\n callbackURL,\n isSubmitting,\n localization,\n pathname,\n redirectTo,\n view,\n otpSeparators = 0,\n setIsSubmitting\n}: AuthFormProps) {\n const {\n basePath,\n credentials,\n localization: contextLocalization,\n magicLink,\n emailOTP,\n signUp,\n twoFactor: twoFactorEnabled,\n viewPaths,\n replace\n } = useContext(AuthUIContext)\n\n const signUpEnabled = !!signUp\n\n localization = { ...contextLocalization, ...localization }\n\n useEffect(() => {\n if (pathname && !getViewByPath(viewPaths, pathname)) {\n console.error(`Invalid auth view: ${pathname}`)\n replace(`${basePath}/${viewPaths.SIGN_IN}${window.location.search}`)\n }\n }, [pathname, viewPaths, basePath, replace])\n\n view =\n view ||\n (getViewByPath(viewPaths, pathname) as AuthViewPath) ||\n \"SIGN_IN\"\n\n // Redirect to appropriate view based on enabled features\n useEffect(() => {\n let isInvalidView = false\n\n if (\n view === \"MAGIC_LINK\" &&\n (!magicLink || (!credentials && !emailOTP))\n ) {\n isInvalidView = true\n }\n\n if (\n view === \"EMAIL_OTP\" &&\n (!emailOTP || (!credentials && !magicLink))\n ) {\n isInvalidView = true\n }\n\n if (view === \"SIGN_UP\" && !signUpEnabled) {\n isInvalidView = true\n }\n\n if (\n !credentials &&\n [\n \"SIGN_UP\",\n \"FORGOT_PASSWORD\",\n \"RESET_PASSWORD\",\n \"TWO_FACTOR\",\n \"RECOVER_ACCOUNT\"\n ].includes(view)\n ) {\n isInvalidView = true\n }\n\n if (\n [\"TWO_FACTOR\", \"RECOVER_ACCOUNT\"].includes(view) &&\n !twoFactorEnabled\n ) {\n isInvalidView = true\n }\n\n if (isInvalidView) {\n replace(`${basePath}/${viewPaths.SIGN_IN}${window.location.search}`)\n }\n }, [\n basePath,\n view,\n viewPaths,\n credentials,\n replace,\n emailOTP,\n signUpEnabled,\n magicLink,\n twoFactorEnabled\n ])\n\n if (view === \"SIGN_OUT\") return \n if (view === \"CALLBACK\") return \n\n if (view === \"SIGN_IN\") {\n return credentials ? (\n \n ) : magicLink ? (\n \n ) : emailOTP ? (\n \n ) : null\n }\n\n if (view === \"TWO_FACTOR\") {\n return (\n \n )\n }\n\n if (view === \"RECOVER_ACCOUNT\") {\n return (\n \n )\n }\n\n if (view === \"MAGIC_LINK\") {\n return (\n \n )\n }\n\n if (view === \"EMAIL_OTP\") {\n return (\n \n )\n }\n\n if (view === \"FORGOT_PASSWORD\") {\n return (\n \n )\n }\n\n if (view === \"RESET_PASSWORD\") {\n return (\n \n )\n }\n\n if (view === \"SIGN_UP\") {\n return (\n signUpEnabled && (\n \n )\n )\n }\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-hooks.json b/public/r/auth-hooks.json deleted file mode 100644 index 03d15374..00000000 --- a/public/r/auth-hooks.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-hooks", - "type": "registry:file", - "title": "Auth Hooks", - "description": "", - "dependencies": [ - "@better-fetch/fetch", - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/api-key.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/invitation.json", - "https://better-auth-ui.com/r/refetch.json" - ], - "files": [ - { - "path": "src/types/auth-hooks.ts", - "content": "import type { BetterFetchError } from \"@better-fetch/fetch\"\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport type { AnyAuthClient } from \"./any-auth-client\"\nimport type { ApiKey } from \"./api-key\"\nimport type { AuthClient } from \"./auth-client\"\nimport type { Invitation } from \"./invitation\"\nimport type { Refetch } from \"./refetch\"\n\ntype AnyAuthSession = AnyAuthClient[\"$Infer\"][\"Session\"]\n\ntype AuthHook = {\n isPending: boolean\n data?: T | null\n error?: BetterFetchError | null\n refetch?: Refetch\n}\n\nexport type AuthHooks = {\n useSession: () => ReturnType\n useListAccounts: () => AuthHook<{ accountId: string; provider: string }[]>\n useAccountInfo: (\n params: Parameters[0]\n ) => AuthHook<{ user: User }>\n useListDeviceSessions: () => AuthHook\n useListSessions: () => AuthHook\n useListPasskeys: () => Partial>\n useListApiKeys: () => AuthHook\n useActiveOrganization: () => Partial<\n ReturnType\n >\n useListOrganizations: () => Partial<\n ReturnType\n >\n useHasPermission: (\n params: Parameters[0]\n ) => AuthHook<{\n error: null\n success: boolean\n }>\n useInvitation: (\n params: Parameters[0]\n ) => AuthHook<\n Invitation & {\n organizationName: string\n organizationSlug: string\n organizationLogo?: string\n }\n >\n useListInvitations: (\n params: Parameters[0]\n ) => AuthHook\n useListUserInvitations: () => AuthHook\n useListMembers: (\n params: Parameters[0]\n ) => AuthHook<{\n members: (Member & { user?: Partial | null })[]\n total: number\n }>\n useIsRestoring?: () => boolean\n}\n", - "type": "registry:file", - "target": "types/auth-hooks.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-loading.json b/public/r/auth-loading.json deleted file mode 100644 index 827c4416..00000000 --- a/public/r/auth-loading.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-loading", - "type": "registry:component", - "title": "Auth Loading", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/components/auth-loading.tsx", - "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content during authentication loading state\n *\n * Renders its children only when the authentication state is being determined\n * (during the loading/pending phase). Once the authentication state is resolved,\n * nothing is rendered. Useful for displaying loading indicators or temporary\n * content while waiting for the authentication check to complete.\n */\nexport function AuthLoading({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { isPending } = useSession()\n\n return isPending ? children : null\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-localization.json b/public/r/auth-localization.json deleted file mode 100644 index c55575e5..00000000 --- a/public/r/auth-localization.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-localization", - "type": "registry:file", - "title": "Auth Localization", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/admin-error-codes.json", - "https://better-auth-ui.com/r/anonymous-error-codes.json", - "https://better-auth-ui.com/r/api-key-error-codes.json", - "https://better-auth-ui.com/r/base-error-codes.json", - "https://better-auth-ui.com/r/captcha-error-codes.json", - "https://better-auth-ui.com/r/email-otp-error-codes.json", - "https://better-auth-ui.com/r/generic-oauth-error-codes.json", - "https://better-auth-ui.com/r/haveibeenpwned-error-codes.json", - "https://better-auth-ui.com/r/multi-session-error-codes.json", - "https://better-auth-ui.com/r/organization-error-codes.json", - "https://better-auth-ui.com/r/passkey-error-codes.json", - "https://better-auth-ui.com/r/phone-number-error-codes.json", - "https://better-auth-ui.com/r/stripe-localization.json", - "https://better-auth-ui.com/r/two-factor-error-codes.json", - "https://better-auth-ui.com/r/username-error-codes.json" - ], - "files": [ - { - "path": "src/localization/auth-localization.ts", - "content": "import { ADMIN_ERROR_CODES } from \"./admin-error-codes\"\nimport { ANONYMOUS_ERROR_CODES } from \"./anonymous-error-codes\"\nimport { API_KEY_ERROR_CODES } from \"./api-key-error-codes\"\nimport { BASE_ERROR_CODES } from \"./base-error-codes\"\nimport { CAPTCHA_ERROR_CODES } from \"./captcha-error-codes\"\nimport { EMAIL_OTP_ERROR_CODES } from \"./email-otp-error-codes\"\nimport { GENERIC_OAUTH_ERROR_CODES } from \"./generic-oauth-error-codes\"\nimport { HAVEIBEENPWNED_ERROR_CODES } from \"./haveibeenpwned-error-codes\"\nimport { MULTI_SESSION_ERROR_CODES } from \"./multi-session-error-codes\"\nimport { ORGANIZATION_ERROR_CODES } from \"./organization-error-codes\"\nimport { PASSKEY_ERROR_CODES } from \"./passkey-error-codes\"\nimport { PHONE_NUMBER_ERROR_CODES } from \"./phone-number-error-codes\"\nimport { STRIPE_ERROR_CODES } from \"./stripe-localization\"\nimport { TWO_FACTOR_ERROR_CODES } from \"./two-factor-error-codes\"\nimport { USERNAME_ERROR_CODES } from \"./username-error-codes\"\n\nexport const authLocalization = {\n /** @default \"Account\" */\n ACCOUNT: \"Account\",\n\n /** @default \"Accounts\" */\n ACCOUNTS: \"Accounts\",\n\n /** @default \"Manage your currently signed in accounts.\" */\n ACCOUNTS_DESCRIPTION: \"Switch between your currently signed in accounts.\",\n\n /** @default \"Sign in to an additional account.\" */\n ACCOUNTS_INSTRUCTIONS: \"Sign in to an additional account.\",\n\n /** @default \"Add Account\" */\n ADD_ACCOUNT: \"Add Account\",\n\n /** @default \"Add Passkey\" */\n ADD_PASSKEY: \"Add Passkey\",\n\n /** @default \"Already have an account?\" */\n ALREADY_HAVE_AN_ACCOUNT: \"Already have an account?\",\n\n /** @default \"Avatar\" */\n AVATAR: \"Avatar\",\n\n /** @default \"Click on the avatar to upload a custom one from your files.\" */\n AVATAR_DESCRIPTION:\n \"Click on the avatar to upload a custom one from your files.\",\n\n /** @default \"An avatar is optional but strongly recommended.\" */\n AVATAR_INSTRUCTIONS: \"An avatar is optional but strongly recommended.\",\n\n /** @default \"Backup code is required\" */\n BACKUP_CODE_REQUIRED: \"Backup code is required\",\n\n /** @default \"Backup Codes\" */\n BACKUP_CODES: \"Backup Codes\",\n\n /** @default \"Save these backup codes in a secure place. You can use them to access your account if you lose your two-factor authentication method.\" */\n BACKUP_CODES_DESCRIPTION:\n \"Save these backup codes in a secure place. You can use them to access your account if you lose your two-factor authentication method.\",\n\n /** @default \"Backup Code.\" */\n BACKUP_CODE_PLACEHOLDER: \"Backup Code\",\n\n /** @default \"Backup Code\" */\n BACKUP_CODE: \"Backup Code\",\n\n /** @default \"Cancel\" */\n CANCEL: \"Cancel\",\n\n /** @default \"Change Password\" */\n CHANGE_PASSWORD: \"Change Password\",\n\n /** @default \"Enter your current password and a new password.\" */\n CHANGE_PASSWORD_DESCRIPTION:\n \"Enter your current password and a new password.\",\n\n /** @default \"Please use 8 characters at minimum.\" */\n CHANGE_PASSWORD_INSTRUCTIONS: \"Please use 8 characters at minimum.\",\n\n /** @default \"Your password has been changed.\" */\n CHANGE_PASSWORD_SUCCESS: \"Your password has been changed.\",\n\n /** @default \"Confirm Password\" */\n CONFIRM_PASSWORD: \"Confirm Password\",\n\n /** @default \"Confirm Password\" */\n CONFIRM_PASSWORD_PLACEHOLDER: \"Confirm Password\",\n\n /** @default \"Confirm password is required\" */\n CONFIRM_PASSWORD_REQUIRED: \"Confirm password is required\",\n\n /** @default \"Continue with Authenticator\" */\n CONTINUE_WITH_AUTHENTICATOR: \"Continue with Authenticator\",\n\n /** @default \"Copied to clipboard\" */\n COPIED_TO_CLIPBOARD: \"Copied to clipboard\",\n\n /** @default \"Copy to clipboard\" */\n COPY_TO_CLIPBOARD: \"Copy to clipboard\",\n\n /** @default \"Copy all codes\" */\n COPY_ALL_CODES: \"Copy all codes\",\n\n /** @default \"Continue\" */\n CONTINUE: \"Continue\",\n\n /** @default \"Current Password\" */\n CURRENT_PASSWORD: \"Current Password\",\n\n /** @default \"Current Password\" */\n CURRENT_PASSWORD_PLACEHOLDER: \"Current Password\",\n\n /** @default \"Current Session\" */\n CURRENT_SESSION: \"Current Session\",\n\n /** @default \"Delete\" */\n DELETE: \"Delete\",\n\n /** @default \"Delete Avatar\" */\n DELETE_AVATAR: \"Delete Avatar\",\n\n /** @default \"Delete Account\" */\n DELETE_ACCOUNT: \"Delete Account\",\n\n /** @default \"Permanently remove your account and all of its contents. This action is not reversible, so please continue with caution.\" */\n DELETE_ACCOUNT_DESCRIPTION:\n \"Permanently remove your account and all of its contents. This action is not reversible, so please continue with caution.\",\n\n /** @default \"Please confirm the deletion of your account. This action is not reversible, so please continue with caution.\" */\n DELETE_ACCOUNT_INSTRUCTIONS:\n \"Please confirm the deletion of your account. This action is not reversible, so please continue with caution.\",\n\n /** @default \"Please check your email to verify the deletion of your account.\" */\n DELETE_ACCOUNT_VERIFY:\n \"Please check your email to verify the deletion of your account.\",\n\n /** @default \"Your account has been deleted.\" */\n DELETE_ACCOUNT_SUCCESS: \"Your account has been deleted.\",\n\n /** @default \"Disable Two-Factor\" */\n DISABLE_TWO_FACTOR: \"Disable Two-Factor\",\n\n /** @default \"Choose a provider to login to your account\" */\n DISABLED_CREDENTIALS_DESCRIPTION:\n \"Choose a provider to login to your account\",\n\n /** @default \"Don't have an account?\" */\n DONT_HAVE_AN_ACCOUNT: \"Don't have an account?\",\n\n /** @default \"Done\" */\n DONE: \"Done\",\n\n /** @default \"Email\" */\n EMAIL: \"Email\",\n\n /** @default \"Enter the email address you want to use to log in.\" */\n EMAIL_DESCRIPTION: \"Enter the email address you want to use to log in.\",\n\n /** @default \"Please enter a valid email address.\" */\n EMAIL_INSTRUCTIONS: \"Please enter a valid email address.\",\n\n /** @default \"Email is the same\" */\n EMAIL_IS_THE_SAME: \"Email is the same\",\n\n /** @default \"m@example.com\" */\n EMAIL_PLACEHOLDER: \"m@example.com\",\n\n /** @default \"Email address is required\" */\n EMAIL_REQUIRED: \"Email address is required\",\n\n /** @default \"Please check your email to verify the change.\" */\n EMAIL_VERIFY_CHANGE: \"Please check your email to verify the change.\",\n\n /** @default \"Please check your email for the verification link.\" */\n EMAIL_VERIFICATION: \"Please check your email for the verification link.\",\n\n /** @default \"Enable Two-Factor\" */\n ENABLE_TWO_FACTOR: \"Enable Two-Factor\",\n\n /** @default \"is invalid\" */\n IS_INVALID: \"is invalid\",\n\n /** @default \"is required\" */\n IS_REQUIRED: \"is required\",\n\n /** @default \"is the same\" */\n IS_THE_SAME: \"is the same\",\n\n /** @default \"Forgot authenticator?\" */\n FORGOT_AUTHENTICATOR: \"Forgot authenticator?\",\n\n /** @default \"Forgot Password\" */\n FORGOT_PASSWORD: \"Forgot Password\",\n\n /** @default \"Send reset link\" */\n FORGOT_PASSWORD_ACTION: \"Send reset link\",\n\n /** @default \"Enter your email to reset your password\" */\n FORGOT_PASSWORD_DESCRIPTION: \"Enter your email to reset your password\",\n\n /** @default \"Check your email for the password reset link.\" */\n FORGOT_PASSWORD_EMAIL: \"Check your email for the password reset link.\",\n\n /** @default \"Forgot your password?\" */\n FORGOT_PASSWORD_LINK: \"Forgot your password?\",\n\n /** @default \"Link\" */\n LINK: \"Link\",\n\n /** @default \"Magic Link\" */\n MAGIC_LINK: \"Magic Link\",\n\n /** @default \"Send magic link\" */\n MAGIC_LINK_ACTION: \"Send magic link\",\n\n /** @default \"Enter your email to receive a magic link\" */\n MAGIC_LINK_DESCRIPTION: \"Enter your email to receive a magic link\",\n\n /** @default \"Check your email for the magic link\" */\n MAGIC_LINK_EMAIL: \"Check your email for the magic link\",\n\n /** @default \"Email Code\" */\n EMAIL_OTP: \"Email Code\",\n\n /** @default \"Send code\" */\n EMAIL_OTP_SEND_ACTION: \"Send code\",\n\n /** @default \"Verify code\" */\n EMAIL_OTP_VERIFY_ACTION: \"Verify code\",\n\n /** @default \"Enter your email to receive a code\" */\n EMAIL_OTP_DESCRIPTION: \"Enter your email to receive a code\",\n\n /** @default \"Please check your email for the verification code.\" */\n EMAIL_OTP_VERIFICATION_SENT:\n \"Please check your email for the verification code.\",\n\n /** @default \"Name\" */\n NAME: \"Name\",\n\n /** @default \"Please enter your full name, or a display name.\" */\n NAME_DESCRIPTION: \"Please enter your full name, or a display name.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n NAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Name\" */\n NAME_PLACEHOLDER: \"Name\",\n\n /** @default \"New Password\" */\n NEW_PASSWORD: \"New Password\",\n\n /** @default \"New Password\" */\n NEW_PASSWORD_PLACEHOLDER: \"New Password\",\n\n /** @default \"New password is required\" */\n NEW_PASSWORD_REQUIRED: \"New password is required\",\n\n /** @default \"One-Time Password\" */\n ONE_TIME_PASSWORD: \"One-Time Password\",\n\n /** @default \"Or continue with\" */\n OR_CONTINUE_WITH: \"Or continue with\",\n\n /** @default \"Passkey\" */\n PASSKEY: \"Passkey\",\n\n /** @default \"Passkeys\" */\n PASSKEYS: \"Passkeys\",\n\n /** @default \"Manage your passkeys for secure access.\" */\n PASSKEYS_DESCRIPTION: \"Manage your passkeys for secure access.\",\n\n /** @default \"Securely access your account without a password.\" */\n PASSKEYS_INSTRUCTIONS: \"Securely access your account without a password.\",\n\n /** @default \"Personal Account\" */\n PERSONAL_ACCOUNT: \"Personal Account\",\n\n /** @default \"API Keys\" */\n API_KEYS: \"API Keys\",\n\n /** @default \"Manage your API keys for secure access.\" */\n API_KEYS_DESCRIPTION: \"Manage your API keys for secure access.\",\n\n /** @default \"Generate API keys to access your account programmatically.\" */\n API_KEYS_INSTRUCTIONS:\n \"Generate API keys to access your account programmatically.\",\n\n /** @default \"Create API Key\" */\n CREATE_API_KEY: \"Create API Key\",\n\n /** @default \"Enter a unique name for your API key to differentiate it from other keys.\" */\n CREATE_API_KEY_DESCRIPTION:\n \"Enter a unique name for your API key to differentiate it from other keys.\",\n\n /** @default \"New API Key\" */\n API_KEY_NAME_PLACEHOLDER: \"New API Key\",\n\n /** @default \"API Key Created\" */\n API_KEY_CREATED: \"API Key Created\",\n\n /** @default \"Please copy your API key and store it in a safe place. For security reasons we cannot show it again.\" */\n CREATE_API_KEY_SUCCESS:\n \"Please copy your API key and store it in a safe place. For security reasons we cannot show it again.\",\n\n /** @default \"Never Expires\" */\n NEVER_EXPIRES: \"Never Expires\",\n\n /** @default \"Expires\" */\n EXPIRES: \"Expires\",\n\n /** @default \"No Expiration\" */\n NO_EXPIRATION: \"No Expiration\",\n\n /** @default \"Create Organization\" */\n CREATE_ORGANIZATION: \"Create Organization\",\n\n /** @default \"Organization\" */\n ORGANIZATION: \"Organization\",\n\n /** @default \"Name\" */\n ORGANIZATION_NAME: \"Name\",\n\n /** @default \"Acme Inc.\" */\n ORGANIZATION_NAME_PLACEHOLDER: \"Acme Inc.\",\n\n /** @default \"This is your organization's visible name.\" */\n ORGANIZATION_NAME_DESCRIPTION: \"This is your organization's visible name.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n ORGANIZATION_NAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Slug URL\" */\n ORGANIZATION_SLUG: \"Slug URL\",\n\n /** @default \"This is your organization's URL namespace.\" */\n ORGANIZATION_SLUG_DESCRIPTION: \"This is your organization's URL namespace.\",\n\n /** @default \"Please use 48 characters at maximum.\" */\n ORGANIZATION_SLUG_INSTRUCTIONS: \"Please use 48 characters at maximum.\",\n\n /** @default \"acme-inc\" */\n ORGANIZATION_SLUG_PLACEHOLDER: \"acme-inc\",\n\n /** @default \"Organization created successfully\" */\n CREATE_ORGANIZATION_SUCCESS: \"Organization created successfully\",\n\n /** @default \"Password\" */\n PASSWORD: \"Password\",\n\n /** @default \"Password\" */\n PASSWORD_PLACEHOLDER: \"Password\",\n\n /** @default \"Password is required\" */\n PASSWORD_REQUIRED: \"Password is required\",\n\n /** @default \"Passwords do not match\" */\n PASSWORDS_DO_NOT_MATCH: \"Passwords do not match\",\n\n /** @default \"Providers\" */\n PROVIDERS: \"Providers\",\n\n /** @default \"Connect your account with a third-party service.\" */\n PROVIDERS_DESCRIPTION: \"Connect your account with a third-party service.\",\n\n /** @default \"Recover Account\" */\n RECOVER_ACCOUNT: \"Recover Account\",\n\n /** @default \"Recover account\" */\n RECOVER_ACCOUNT_ACTION: \"Recover account\",\n\n /** @default \"Please enter a backup code to access your account\" */\n RECOVER_ACCOUNT_DESCRIPTION:\n \"Please enter a backup code to access your account\",\n\n /** @default \"Remember me\" */\n REMEMBER_ME: \"Remember me\",\n\n /** @default \"Resend code\" */\n RESEND_CODE: \"Resend code\",\n\n /** @default \"Resend verification email\" */\n RESEND_VERIFICATION_EMAIL: \"Resend Verification Email\",\n\n /** @default \"Reset Password\" */\n RESET_PASSWORD: \"Reset Password\",\n\n /** @default \"Save new password\" */\n RESET_PASSWORD_ACTION: \"Save new password\",\n\n /** @default \"Enter your new password below\" */\n RESET_PASSWORD_DESCRIPTION: \"Enter your new password below\",\n\n /** @default \"Password reset successfully\" */\n RESET_PASSWORD_SUCCESS: \"Password reset successfully\",\n\n /** @default \"Request failed\" */\n REQUEST_FAILED: \"Request failed\",\n\n /** @default \"Revoke\" */\n REVOKE: \"Revoke\",\n\n /** @default \"Delete API Key\" */\n DELETE_API_KEY: \"Delete API Key\",\n\n /** @default \"Are you sure you want to delete this API key?\" */\n DELETE_API_KEY_CONFIRM: \"Are you sure you want to delete this API key?\",\n\n /** @default \"API Key\" */\n API_KEY: \"API Key\",\n\n /** @default \"Sign In\" */\n SIGN_IN: \"Sign In\",\n\n /** @default \"Login\" */\n SIGN_IN_ACTION: \"Login\",\n\n /** @default \"Enter your email below to login to your account\" */\n SIGN_IN_DESCRIPTION: \"Enter your email below to login to your account\",\n\n /** @default \"Enter your username or email below to login to your account\" */\n SIGN_IN_USERNAME_DESCRIPTION:\n \"Enter your username or email to login to your account\",\n\n /** @default \"Sign in with\" */\n SIGN_IN_WITH: \"Sign in with\",\n\n /** @default \"Sign Out\" */\n SIGN_OUT: \"Sign Out\",\n\n /** @default \"Sign Up\" */\n SIGN_UP: \"Sign Up\",\n\n /** @default \"Create an account\" */\n SIGN_UP_ACTION: \"Create an account\",\n\n /** @default \"Enter your information to create an account\" */\n SIGN_UP_DESCRIPTION: \"Enter your information to create an account\",\n\n /** @default \"Check your email for the verification link.\" */\n SIGN_UP_EMAIL: \"Check your email for the verification link.\",\n\n /** @default \"Sessions\" */\n SESSIONS: \"Sessions\",\n\n /** @default \"Manage your active sessions and revoke access.\" */\n SESSIONS_DESCRIPTION: \"Manage your active sessions and revoke access.\",\n\n /** @default \"Set Password\" */\n SET_PASSWORD: \"Set Password\",\n\n /** @default \"Click the button below to receive an email to set up a password for your account.\" */\n SET_PASSWORD_DESCRIPTION:\n \"Click the button below to receive an email to set up a password for your account.\",\n\n /** @default \"Settings\" */\n SETTINGS: \"Settings\",\n\n /** @default \"Save\" */\n SAVE: \"Save\",\n\n /** @default \"Security\" */\n SECURITY: \"Security\",\n\n /** @default \"Switch Account\" */\n SWITCH_ACCOUNT: \"Switch Account\",\n\n /** @default \"Trust this device\" */\n TRUST_DEVICE: \"Trust this device\",\n\n /** @default \"Two-Factor\" */\n TWO_FACTOR: \"Two-Factor\",\n\n /** @default \"Verify code\" */\n TWO_FACTOR_ACTION: \"Verify code\",\n\n /** @default \"Please enter your one-time password to continue\" */\n TWO_FACTOR_DESCRIPTION: \"Please enter your one-time password to continue\",\n\n /** @default \"Add an extra layer of security to your account.\" */\n TWO_FACTOR_CARD_DESCRIPTION:\n \"Add an extra layer of security to your account.\",\n\n /** @default \"Please enter your password to disable 2FA.\" */\n TWO_FACTOR_DISABLE_INSTRUCTIONS:\n \"Please enter your password to disable 2FA.\",\n\n /** @default \"Please enter your password to enable 2FA\" */\n TWO_FACTOR_ENABLE_INSTRUCTIONS: \"Please enter your password to enable 2FA.\",\n\n /** @default \"Two-factor authentication has been enabled\" */\n TWO_FACTOR_ENABLED: \"Two-factor authentication has been enabled\",\n\n /** @default \"Two-Factor Authentication has been disabled\" */\n TWO_FACTOR_DISABLED: \"Two-Factor Authentication has been disabled\",\n\n /** @default \"Two-Factor Authentication\" */\n TWO_FACTOR_PROMPT: \"Two-Factor Authentication\",\n\n /** @default \"Scan the QR Code with your Authenticator\" */\n TWO_FACTOR_TOTP_LABEL: \"Scan the QR Code with your Authenticator\",\n\n /** @default \"Send verification code\" */\n SEND_VERIFICATION_CODE: \"Send verification code\",\n\n /** @default \"Unlink\" */\n UNLINK: \"Unlink\",\n\n /** @default \"Updated successfully\" */\n UPDATED_SUCCESSFULLY: \"updated successfully\",\n\n /** @default \"Username\" */\n USERNAME: \"Username\",\n\n /** @default \"Enter the username you want to use to log in.\" */\n USERNAME_DESCRIPTION: \"Enter the username you want to use to log in.\",\n\n /** @default \"Please use 32 characters at maximum.\" */\n USERNAME_INSTRUCTIONS: \"Please use 32 characters at maximum.\",\n\n /** @default \"Username\" */\n USERNAME_PLACEHOLDER: \"Username\",\n\n /** @default \"Username or email\" */\n SIGN_IN_USERNAME_PLACEHOLDER: \"Username or email\",\n\n /** @default \"Verify Your Email\" */\n VERIFY_YOUR_EMAIL: \"Verify Your Email\",\n\n /** @default \"Please verify your email address. Check your inbox for the verification email. If you haven't received the email, click the button below to resend.\" */\n VERIFY_YOUR_EMAIL_DESCRIPTION:\n \"Please verify your email address. Check your inbox for the verification email. If you haven't received the email, click the button below to resend.\",\n\n /** @default \"Go back\" */\n GO_BACK: \"Go back\",\n\n /** @default \"Your session is not fresh. Please sign in again.\" */\n SESSION_NOT_FRESH: \"Your session is not fresh. Please sign in again.\",\n\n /** @default \"Upload Avatar\" */\n UPLOAD_AVATAR: \"Upload Avatar\",\n\n /** @default \"Logo\" */\n LOGO: \"Logo\",\n\n /** @default \"Click on the logo to upload a custom one from your files.\" */\n LOGO_DESCRIPTION:\n \"Click on the logo to upload a custom one from your files.\",\n\n /** @default \"A logo is optional but strongly recommended.\" */\n LOGO_INSTRUCTIONS: \"A logo is optional but strongly recommended.\",\n\n /** @default \"Upload\" */\n UPLOAD: \"Upload\",\n\n /** @default \"Upload Logo\" */\n UPLOAD_LOGO: \"Upload Logo\",\n\n /** @default \"Delete Logo\" */\n DELETE_LOGO: \"Delete Logo\",\n\n /** @default \"Privacy Policy\" */\n PRIVACY_POLICY: \"Privacy Policy\",\n\n /** @default \"Terms of Service\" */\n TERMS_OF_SERVICE: \"Terms of Service\",\n\n /** @default \"This site is protected by reCAPTCHA.\" */\n PROTECTED_BY_RECAPTCHA: \"This site is protected by reCAPTCHA.\",\n\n /** @default \"By continuing, you agree to the\" */\n BY_CONTINUING_YOU_AGREE: \"By continuing, you agree to the\",\n\n /** @default \"User\" */\n USER: \"User\",\n\n /** @default \"Organizations\" */\n ORGANIZATIONS: \"Organizations\",\n\n /** @default \"Manage your organizations and memberships.\" */\n ORGANIZATIONS_DESCRIPTION: \"Manage your organizations and memberships.\",\n\n /** @default \"Create an organization to collaborate with other users.\" */\n ORGANIZATIONS_INSTRUCTIONS:\n \"Create an organization to collaborate with other users.\",\n\n /** @default \"Leave Organization\" */\n LEAVE_ORGANIZATION: \"Leave Organization\",\n\n /** @default \"Are you sure you want to leave this organization?\" */\n LEAVE_ORGANIZATION_CONFIRM:\n \"Are you sure you want to leave this organization?\",\n\n /** @default \"You have successfully left the organization.\" */\n LEAVE_ORGANIZATION_SUCCESS: \"You have successfully left the organization.\",\n\n /** @default \"Manage Organization\" */\n MANAGE_ORGANIZATION: \"Manage Organization\",\n\n /** @default \"Remove Member\" */\n REMOVE_MEMBER: \"Remove Member\",\n\n /** @default \"Are you sure you want to remove this member from the organization?\" */\n REMOVE_MEMBER_CONFIRM:\n \"Are you sure you want to remove this member from the organization?\",\n\n /** @default \"Member removed successfully\" */\n REMOVE_MEMBER_SUCCESS: \"Member removed successfully\",\n\n /** @default \"Invite Member\" */\n INVITE_MEMBER: \"Invite Member\",\n\n /** @default \"Members\" */\n MEMBERS: \"Members\",\n\n /** @default \"Add or remove members and manage their roles.\" */\n MEMBERS_DESCRIPTION: \"Add or remove members and manage their roles.\",\n\n /** @default \"Invite new members to your organization.\" */\n MEMBERS_INSTRUCTIONS: \"Invite new members to your organization.\",\n\n /** @default \"Send an invitation to add a new member to your organization.\" */\n INVITE_MEMBER_DESCRIPTION:\n \"Send an invitation to add a new member to your organization.\",\n\n /** @default \"Role\" */\n ROLE: \"Role\",\n\n /** @default \"Select a role\" */\n SELECT_ROLE: \"Select a role\",\n\n /** @default \"Admin\" */\n ADMIN: \"Admin\",\n\n /** @default \"Member\" */\n MEMBER: \"Member\",\n\n /** @default \"Guest\" */\n GUEST: \"Guest\",\n\n /** @default \"Owner\" */\n OWNER: \"Owner\",\n\n /** @default \"Update the role for this member\" */\n UPDATE_ROLE_DESCRIPTION: \"Update the role for this member\",\n\n /** @default \"Update Role\" */\n UPDATE_ROLE: \"Update Role\",\n\n /** @default \"Member role updated successfully\" */\n MEMBER_ROLE_UPDATED: \"Member role updated successfully\",\n\n /** @default \"Send Invitation\" */\n SEND_INVITATION: \"Send Invitation\",\n\n /** @default \"Invitation sent successfully\" */\n SEND_INVITATION_SUCCESS: \"Invitation sent successfully\",\n\n /** @default \"Pending Invitations\" */\n PENDING_INVITATIONS: \"Pending Invitations\",\n\n /** @default \"Manage pending invitations to your organization.\" */\n PENDING_INVITATIONS_DESCRIPTION:\n \"Manage pending invitations to your organization.\",\n\n /** @default \"Invitations you've received from organizations.\" */\n PENDING_USER_INVITATIONS_DESCRIPTION:\n \"Invitations you've received from organizations.\",\n\n /** @default \"Cancel Invitation\" */\n CANCEL_INVITATION: \"Cancel Invitation\",\n\n /** @default \"Invitation cancelled successfully\" */\n INVITATION_CANCELLED: \"Invitation cancelled successfully\",\n\n /** @default \"Accept Invitation\" */\n ACCEPT_INVITATION: \"Accept Invitation\",\n\n /** @default \"You have been invited to join an organization.\" */\n ACCEPT_INVITATION_DESCRIPTION:\n \"You have been invited to join an organization.\",\n\n /** @default \"Invitation accepted successfully\" */\n INVITATION_ACCEPTED: \"Invitation accepted successfully\",\n\n /** @default \"Invitation rejected successfully\" */\n INVITATION_REJECTED: \"Invitation rejected successfully\",\n\n /** @default \"Accept\" */\n ACCEPT: \"Accept\",\n\n /** @default \"Reject\" */\n REJECT: \"Reject\",\n\n /** @default \"This invitation has expired\" */\n INVITATION_EXPIRED: \"This invitation has expired\",\n\n /** @default \"Delete Organization\" */\n DELETE_ORGANIZATION: \"Delete Organization\",\n\n /** @default \"Permanently remove your organization and all of its contents. This action is not reversible — please continue with caution.\" */\n DELETE_ORGANIZATION_DESCRIPTION:\n \"Permanently remove your organization and all of its contents. This action is not reversible — please continue with caution.\",\n\n /** @default \"Organization deleted successfully\" */\n DELETE_ORGANIZATION_SUCCESS: \"Organization deleted successfully\",\n\n /** @default \"Enter the organization slug to continue:\" */\n DELETE_ORGANIZATION_INSTRUCTIONS:\n \"Enter the organization slug to continue:\",\n\n /** @default \"Organization slug is required\" */\n SLUG_REQUIRED: \"Organization slug is required\",\n\n /** @default \"The slug does not match\" */\n SLUG_DOES_NOT_MATCH: \"The slug does not match\",\n ...BASE_ERROR_CODES,\n ...ADMIN_ERROR_CODES,\n ...ANONYMOUS_ERROR_CODES,\n ...API_KEY_ERROR_CODES,\n ...CAPTCHA_ERROR_CODES,\n ...EMAIL_OTP_ERROR_CODES,\n ...GENERIC_OAUTH_ERROR_CODES,\n ...HAVEIBEENPWNED_ERROR_CODES,\n ...MULTI_SESSION_ERROR_CODES,\n ...ORGANIZATION_ERROR_CODES,\n ...PASSKEY_ERROR_CODES,\n ...PHONE_NUMBER_ERROR_CODES,\n ...STRIPE_ERROR_CODES,\n ...TWO_FACTOR_ERROR_CODES,\n ...USERNAME_ERROR_CODES\n}\n\nexport type AuthLocalization = Partial\n", - "type": "registry:file", - "target": "localization/auth-localization.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-mutators.json b/public/r/auth-mutators.json deleted file mode 100644 index 0e5c6efa..00000000 --- a/public/r/auth-mutators.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-mutators", - "type": "registry:file", - "title": "Auth Mutators", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/auth-mutators.ts", - "content": "type MutateFn> = (\n params: T\n) => Promise | Promise\n\nexport interface AuthMutators {\n deleteApiKey: MutateFn<{ keyId: string }>\n deletePasskey: MutateFn<{ id: string }>\n revokeDeviceSession: MutateFn<{ sessionToken: string }>\n revokeSession: MutateFn<{ token: string }>\n setActiveSession: MutateFn<{ sessionToken: string }>\n updateOrganization: MutateFn<{\n organizationId: string\n data: Record\n }>\n updateUser: MutateFn\n unlinkAccount: MutateFn<{ providerId: string; accountId?: string }>\n}\n", - "type": "registry:file", - "target": "types/auth-mutators.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-ui-provider-tanstack.json b/public/r/auth-ui-provider-tanstack.json deleted file mode 100644 index 7bbf9e2a..00000000 --- a/public/r/auth-ui-provider-tanstack.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-ui-provider-tanstack", - "type": "registry:lib", - "title": "Auth Ui Provider Tanstack", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-tanstack-options.json" - ], - "files": [ - { - "path": "src/lib/tanstack/auth-ui-provider-tanstack.tsx", - "content": "import { useCallback, useMemo } from \"react\"\nimport {\n AuthUIProvider,\n type AuthUIProviderProps\n} from \"../../lib/auth-ui-provider\"\nimport { useTanstackOptions } from \"./use-tanstack-options\"\n\nexport function AuthUIProviderTanstack({\n children,\n authClient,\n hooks: hooksProp,\n mutators: mutatorsProp,\n onSessionChange: onSessionChangeProp,\n ...props\n}: AuthUIProviderProps) {\n const {\n hooks: contextHooks,\n mutators: contextMutators,\n onSessionChange,\n optimistic\n } = useTanstackOptions({ authClient })\n\n const hooks = useMemo(\n () => ({ ...contextHooks, ...hooksProp }),\n [contextHooks, hooksProp]\n )\n const mutators = useMemo(\n () => ({ ...contextMutators, ...mutatorsProp }),\n [contextMutators, mutatorsProp]\n )\n\n const onSessionChangeCallback = useCallback(async () => {\n await onSessionChange()\n await onSessionChangeProp?.()\n }, [onSessionChangeProp, onSessionChange])\n\n return (\n \n {children}\n
\n )\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-ui-provider.json b/public/r/auth-ui-provider.json deleted file mode 100644 index 5a9fcac3..00000000 --- a/public/r/auth-ui-provider.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-ui-provider", - "type": "registry:lib", - "title": "Auth Ui Provider", - "description": "", - "dependencies": [ - "sonner" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-options.json", - "https://better-auth-ui.com/r/additional-fields.json", - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-mutators.json", - "https://better-auth-ui.com/r/avatar-options.json", - "https://better-auth-ui.com/r/captcha-options.json", - "https://better-auth-ui.com/r/credentials-options.json", - "https://better-auth-ui.com/r/delete-user-options.json", - "https://better-auth-ui.com/r/generic-oauth-options.json", - "https://better-auth-ui.com/r/gravatar-options.json", - "https://better-auth-ui.com/r/link.json", - "https://better-auth-ui.com/r/organization-options.json", - "https://better-auth-ui.com/r/organization-refetcher.json", - "https://better-auth-ui.com/r/recaptcha-v3.json", - "https://better-auth-ui.com/r/render-toast.json", - "https://better-auth-ui.com/r/sign-up-options.json", - "https://better-auth-ui.com/r/social-options.json", - "https://better-auth-ui.com/r/use-auth-data.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/lib/auth-ui-provider.tsx", - "content": "\"use client\"\n\nimport { createContext, type ReactNode, useMemo } from \"react\"\nimport { toast } from \"sonner\"\n\nimport { RecaptchaV3 } from \"../components/captcha/recaptcha-v3\"\nimport { useAuthData } from \"../hooks/use-auth-data\"\nimport {\n type AuthLocalization,\n authLocalization\n} from \"../localization/auth-localization\"\nimport type {\n AccountOptions,\n AccountOptionsContext\n} from \"../types/account-options\"\nimport type { AdditionalFields } from \"../types/additional-fields\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\nimport type { AuthClient } from \"../types/auth-client\"\nimport type { AuthHooks } from \"../types/auth-hooks\"\nimport type { AuthMutators } from \"../types/auth-mutators\"\nimport type { AvatarOptions } from \"../types/avatar-options\"\nimport type { CaptchaOptions } from \"../types/captcha-options\"\nimport type { CredentialsOptions } from \"../types/credentials-options\"\nimport type { DeleteUserOptions } from \"../types/delete-user-options\"\nimport type { GenericOAuthOptions } from \"../types/generic-oauth-options\"\nimport type { GravatarOptions } from \"../types/gravatar-options\"\nimport type { Link } from \"../types/link\"\nimport type {\n OrganizationOptions,\n OrganizationOptionsContext\n} from \"../types/organization-options\"\nimport type { RenderToast } from \"../types/render-toast\"\nimport type { SignUpOptions } from \"../types/sign-up-options\"\nimport type { SocialOptions } from \"../types/social-options\"\nimport { OrganizationRefetcher } from \"./organization-refetcher\"\nimport type { AuthViewPaths } from \"./view-paths\"\nimport {\n accountViewPaths,\n authViewPaths,\n organizationViewPaths\n} from \"./view-paths\"\n\nconst DefaultLink: Link = ({ href, className, children }) => (\n \n {children}\n \n)\n\nconst defaultNavigate = (href: string) => {\n window.location.href = href\n}\n\nconst defaultReplace = (href: string) => {\n window.location.replace(href)\n}\n\nconst defaultToast: RenderToast = ({ variant = \"default\", message }) => {\n if (variant === \"default\") {\n toast(message)\n } else {\n toast[variant](message)\n }\n}\n\nexport type AuthUIContextType = {\n authClient: AuthClient\n /**\n * Additional fields for users\n */\n additionalFields?: AdditionalFields\n /**\n * API Key plugin configuration\n */\n apiKey?:\n | {\n /**\n * Prefix for API Keys\n */\n prefix?: string\n /**\n * Metadata for API Keys\n */\n metadata?: Record\n }\n | boolean\n /**\n * Avatar configuration\n * @default undefined\n */\n avatar?: AvatarOptions\n /**\n * Base path for the auth views\n * @default \"/auth\"\n */\n basePath: string\n /**\n * Front end base URL for auth API callbacks\n */\n baseURL?: string\n /**\n * Captcha configuration\n */\n captcha?: CaptchaOptions\n credentials?: CredentialsOptions\n /**\n * Default redirect URL after authenticating\n * @default \"/\"\n */\n redirectTo: string\n /**\n * Enable or disable user change email support\n * @default true\n */\n changeEmail?: boolean\n /**\n * User Account deletion configuration\n * @default undefined\n */\n deleteUser?: DeleteUserOptions\n /**\n * Show Verify Email card for unverified emails\n */\n emailVerification?: boolean\n /**\n * Freshness age for Session data\n * @default 60 * 60 * 24\n */\n freshAge: number\n /**\n * Generic OAuth provider configuration\n */\n genericOAuth?: GenericOAuthOptions\n /**\n * Gravatar configuration\n */\n gravatar?: boolean | GravatarOptions\n hooks: AuthHooks\n localization: typeof authLocalization\n /**\n * Enable or disable Magic Link support\n * @default false\n */\n magicLink?: boolean\n /**\n * Enable or disable Email OTP support\n * @default false\n */\n emailOTP?: boolean\n /**\n * Enable or disable Multi Session support\n * @default false\n */\n multiSession?: boolean\n mutators: AuthMutators\n /**\n * Whether the name field should be required\n * @default true\n */\n nameRequired?: boolean\n /**\n * Enable or disable One Tap support\n * @default false\n */\n oneTap?: boolean\n /**\n * Perform some User updates optimistically\n * @default false\n */\n optimistic?: boolean\n /**\n * Organization configuration\n */\n organization?: OrganizationOptionsContext\n /**\n * Enable or disable Passkey support\n * @default false\n */\n passkey?: boolean\n /**\n * Forces better-auth-tanstack to refresh the Session on the auth callback page\n * @default false\n */\n persistClient?: boolean\n /**\n * Account configuration\n */\n account?: AccountOptionsContext\n /**\n * Sign Up configuration\n */\n signUp?: SignUpOptions\n /**\n * Social provider configuration\n */\n social?: SocialOptions\n toast: RenderToast\n /**\n * Enable or disable two-factor authentication support\n * @default undefined\n */\n twoFactor?: (\"otp\" | \"totp\")[]\n viewPaths: AuthViewPaths\n /**\n * Navigate to a new URL\n * @default window.location.href\n */\n navigate: (href: string) => void\n /**\n * Called whenever the Session changes\n */\n onSessionChange?: () => void | Promise\n /**\n * Replace the current URL\n * @default navigate\n */\n replace: (href: string) => void\n /**\n * Custom Link component for navigation\n * @default \n */\n Link: Link\n}\n\nexport type AuthUIProviderProps = {\n children: ReactNode\n /**\n * Better Auth client returned from createAuthClient\n * @default Required\n * @remarks `AuthClient`\n */\n authClient: AnyAuthClient\n /**\n * Enable account view & account configuration\n * @default { fields: [\"image\", \"name\"] }\n */\n account?: boolean | Partial\n /**\n * Avatar configuration\n * @default undefined\n */\n avatar?: boolean | Partial\n /**\n * User Account deletion configuration\n * @default undefined\n */\n deleteUser?: DeleteUserOptions | boolean\n /**\n * ADVANCED: Custom hooks for fetching auth data\n */\n hooks?: Partial\n /**\n * Customize the paths for the auth views\n * @default authViewPaths\n * @remarks `AuthViewPaths`\n */\n viewPaths?: Partial\n /**\n * Render custom Toasts\n * @default Sonner\n */\n toast?: RenderToast\n /**\n * Customize the Localization strings\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n /**\n * ADVANCED: Custom mutators for updating auth data\n */\n mutators?: Partial\n /**\n * Organization plugin configuration\n */\n organization?: OrganizationOptions | boolean\n /**\n * Enable or disable Credentials support\n * @default { forgotPassword: true }\n */\n credentials?: boolean | CredentialsOptions\n /**\n * Enable or disable Sign Up form\n * @default { fields: [\"name\"] }\n */\n signUp?: SignUpOptions | boolean\n} & Partial<\n Omit<\n AuthUIContextType,\n | \"authClient\"\n | \"viewPaths\"\n | \"localization\"\n | \"mutators\"\n | \"toast\"\n | \"hooks\"\n | \"avatar\"\n | \"account\"\n | \"deleteUser\"\n | \"credentials\"\n | \"signUp\"\n | \"organization\"\n >\n>\n\nexport const AuthUIContext = createContext(\n {} as unknown as AuthUIContextType\n)\n\nexport const AuthUIProvider = ({\n children,\n authClient: authClientProp,\n account: accountProp,\n avatar: avatarProp,\n deleteUser: deleteUserProp,\n social: socialProp,\n genericOAuth: genericOAuthProp,\n basePath = \"/auth\",\n baseURL = \"\",\n captcha,\n redirectTo = \"/\",\n credentials: credentialsProp,\n changeEmail = true,\n freshAge = 60 * 60 * 24,\n hooks: hooksProp,\n mutators: mutatorsProp,\n localization: localizationProp,\n nameRequired = true,\n organization: organizationProp,\n signUp: signUpProp = true,\n toast = defaultToast,\n viewPaths: viewPathsProp,\n navigate,\n replace,\n Link = DefaultLink,\n ...props\n}: AuthUIProviderProps) => {\n const authClient = authClientProp as AuthClient\n\n const avatar = useMemo(() => {\n if (!avatarProp) return\n\n if (avatarProp === true) {\n return {\n extension: \"png\",\n size: 128\n }\n }\n\n return {\n upload: avatarProp.upload,\n delete: avatarProp.delete,\n extension: avatarProp.extension || \"png\",\n size: avatarProp.size || (avatarProp.upload ? 256 : 128)\n }\n }, [avatarProp])\n\n const account = useMemo(() => {\n if (accountProp === false) return\n\n if (accountProp === true || accountProp === undefined) {\n return {\n basePath: \"/account\",\n fields: [\"image\", \"name\"],\n viewPaths: accountViewPaths\n }\n }\n\n // Remove trailing slash from basePath\n const basePath = accountProp.basePath?.endsWith(\"/\")\n ? accountProp.basePath.slice(0, -1)\n : accountProp.basePath\n\n return {\n basePath: basePath ?? \"/account\",\n fields: accountProp.fields || [\"image\", \"name\"],\n viewPaths: { ...accountViewPaths, ...accountProp.viewPaths }\n }\n }, [accountProp])\n\n const deleteUser = useMemo(() => {\n if (!deleteUserProp) return\n\n if (deleteUserProp === true) {\n return {}\n }\n\n return deleteUserProp\n }, [deleteUserProp])\n\n const social = useMemo(() => {\n if (!socialProp) return\n\n return socialProp\n }, [socialProp])\n\n const genericOAuth = useMemo(() => {\n if (!genericOAuthProp) return\n\n return genericOAuthProp\n }, [genericOAuthProp])\n\n const credentials = useMemo(() => {\n if (credentialsProp === false) return\n\n if (credentialsProp === true) {\n return {\n forgotPassword: true\n }\n }\n\n return {\n ...credentialsProp,\n forgotPassword: credentialsProp?.forgotPassword ?? true\n }\n }, [credentialsProp])\n\n const signUp = useMemo(() => {\n if (signUpProp === false) return\n\n if (signUpProp === true || signUpProp === undefined) {\n return {\n fields: [\"name\"]\n }\n }\n\n return {\n fields: signUpProp.fields || [\"name\"]\n }\n }, [signUpProp])\n\n const organization = useMemo(() => {\n if (!organizationProp) return\n\n if (organizationProp === true) {\n return {\n basePath: \"/organization\",\n viewPaths: organizationViewPaths,\n customRoles: []\n }\n }\n\n let logo: OrganizationOptionsContext[\"logo\"] | undefined\n\n if (organizationProp.logo === true) {\n logo = {\n extension: \"png\",\n size: 128\n }\n } else if (organizationProp.logo) {\n logo = {\n upload: organizationProp.logo.upload,\n delete: organizationProp.logo.delete,\n extension: organizationProp.logo.extension || \"png\",\n size:\n organizationProp.logo.size || organizationProp.logo.upload\n ? 256\n : 128\n }\n }\n\n // Remove trailing slash from basePath\n const basePath = organizationProp.basePath?.endsWith(\"/\")\n ? organizationProp.basePath.slice(0, -1)\n : organizationProp.basePath\n\n return {\n ...organizationProp,\n logo,\n basePath: basePath ?? \"/organization\",\n customRoles: organizationProp.customRoles || [],\n viewPaths: {\n ...organizationViewPaths,\n ...organizationProp.viewPaths\n }\n }\n }, [organizationProp])\n\n const defaultMutators = useMemo(() => {\n return {\n deleteApiKey: (params) =>\n authClient.apiKey.delete({\n ...params,\n fetchOptions: { throw: true }\n }),\n deletePasskey: (params) =>\n authClient.passkey.deletePasskey({\n ...params,\n fetchOptions: { throw: true }\n }),\n revokeDeviceSession: (params) =>\n authClient.multiSession.revoke({\n ...params,\n fetchOptions: { throw: true }\n }),\n revokeSession: (params) =>\n authClient.revokeSession({\n ...params,\n fetchOptions: { throw: true }\n }),\n setActiveSession: (params) =>\n authClient.multiSession.setActive({\n ...params,\n fetchOptions: { throw: true }\n }),\n updateOrganization: (params) =>\n authClient.organization.update({\n ...params,\n fetchOptions: { throw: true }\n }),\n updateUser: (params) =>\n authClient.updateUser({\n ...params,\n fetchOptions: { throw: true }\n }),\n unlinkAccount: (params) =>\n authClient.unlinkAccount({\n ...params,\n fetchOptions: { throw: true }\n })\n } as AuthMutators\n }, [authClient])\n\n const defaultHooks = useMemo(() => {\n return {\n useSession: authClient.useSession,\n useListAccounts: () =>\n useAuthData({\n queryFn: authClient.listAccounts,\n cacheKey: \"listAccounts\"\n }),\n useAccountInfo: (params) =>\n useAuthData({\n queryFn: () => authClient.accountInfo(params),\n cacheKey: `accountInfo:${JSON.stringify(params)}`\n }),\n useListDeviceSessions: () =>\n useAuthData({\n queryFn: authClient.multiSession.listDeviceSessions,\n cacheKey: \"listDeviceSessions\"\n }),\n useListSessions: () =>\n useAuthData({\n queryFn: authClient.listSessions,\n cacheKey: \"listSessions\"\n }),\n useListPasskeys: authClient.useListPasskeys,\n useListApiKeys: () =>\n useAuthData({\n queryFn: authClient.apiKey.list,\n cacheKey: \"listApiKeys\"\n }),\n useActiveOrganization: authClient.useActiveOrganization,\n useListOrganizations: authClient.useListOrganizations,\n useHasPermission: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\"/organization/has-permission\", {\n method: \"POST\",\n body: params\n }),\n cacheKey: `hasPermission:${JSON.stringify(params)}`\n }),\n useInvitation: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.organization.getInvitation(params),\n cacheKey: `invitation:${JSON.stringify(params)}`\n }),\n useListInvitations: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n `/organization/list-invitations?organizationId=${params?.query?.organizationId || \"\"}`\n ),\n cacheKey: `listInvitations:${JSON.stringify(params)}`\n }),\n useListUserInvitations: () =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n \"/organization/list-user-invitations\"\n ),\n cacheKey: `listUserInvitations`\n }),\n useListMembers: (params) =>\n useAuthData({\n queryFn: () =>\n authClient.$fetch(\n `/organization/list-members?organizationId=${params?.query?.organizationId || \"\"}`\n ),\n cacheKey: `listMembers:${JSON.stringify(params)}`\n })\n } as AuthHooks\n }, [authClient])\n\n const viewPaths = useMemo(() => {\n return { ...authViewPaths, ...viewPathsProp }\n }, [viewPathsProp])\n\n const localization = useMemo(() => {\n return { ...authLocalization, ...localizationProp }\n }, [localizationProp])\n\n const hooks = useMemo(() => {\n return { ...defaultHooks, ...hooksProp }\n }, [defaultHooks, hooksProp])\n\n const mutators = useMemo(() => {\n return { ...defaultMutators, ...mutatorsProp }\n }, [defaultMutators, mutatorsProp])\n\n // Remove trailing slash from baseURL\n baseURL = baseURL.endsWith(\"/\") ? baseURL.slice(0, -1) : baseURL\n\n // Remove trailing slash from basePath\n basePath = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath\n\n const { data: sessionData } = hooks.useSession()\n\n return (\n \n {sessionData && organization && }\n\n {captcha?.provider === \"google-recaptcha-v3\" ? (\n {children}\n ) : (\n children\n )}\n \n )\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/auth-view.json b/public/r/auth-view.json deleted file mode 100644 index aa7e5856..00000000 --- a/public/r/auth-view.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "auth-view", - "type": "registry:component", - "title": "Auth View", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-callback.json", - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/email-otp-button.json", - "https://better-auth-ui.com/r/magic-link-button.json", - "https://better-auth-ui.com/r/one-tap.json", - "https://better-auth-ui.com/r/passkey-button.json", - "https://better-auth-ui.com/r/provider-button.json", - "separator", - "https://better-auth-ui.com/r/sign-out.json", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/components/auth/auth-view.tsx", - "content": "\"use client\"\n\nimport { ArrowLeftIcon } from \"lucide-react\"\nimport { type ReactNode, useContext, useEffect, useState } from \"react\"\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { socialProviders } from \"../../lib/social-providers\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { AuthViewPaths } from \"../../lib/view-paths\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle\n} from \"../ui/card\"\nimport { Separator } from \"../ui/separator\"\nimport { AuthCallback } from \"./auth-callback\"\nimport { AuthForm, type AuthFormClassNames } from \"./auth-form\"\nimport { EmailOTPButton } from \"./email-otp-button\"\nimport { MagicLinkButton } from \"./magic-link-button\"\nimport { OneTap } from \"./one-tap\"\nimport { PasskeyButton } from \"./passkey-button\"\nimport { ProviderButton } from \"./provider-button\"\nimport { SignOut } from \"./sign-out\"\n\nexport type AuthViewClassNames = {\n base?: string\n content?: string\n description?: string\n footer?: string\n footerLink?: string\n continueWith?: string\n form?: AuthFormClassNames\n header?: string\n separator?: string\n title?: string\n}\n\nexport interface AuthViewProps {\n className?: string\n classNames?: AuthViewClassNames\n callbackURL?: string\n cardHeader?: ReactNode\n localization?: AuthLocalization\n pathname?: string\n redirectTo?: string\n socialLayout?: \"auto\" | \"horizontal\" | \"grid\" | \"vertical\"\n view?: keyof AuthViewPaths\n otpSeparators?: 0 | 1 | 2\n}\n\nexport function AuthView({\n className,\n classNames,\n callbackURL,\n cardHeader,\n localization,\n pathname,\n redirectTo,\n socialLayout: socialLayoutProp = \"auto\",\n view: viewProp,\n otpSeparators = 0\n}: AuthViewProps) {\n const isHydrated = useIsHydrated()\n const {\n basePath,\n credentials,\n localization: contextLocalization,\n magicLink,\n emailOTP,\n oneTap,\n passkey,\n signUp,\n social,\n genericOAuth,\n viewPaths,\n Link\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n let socialLayout = socialLayoutProp\n if (socialLayout === \"auto\") {\n socialLayout = !credentials\n ? \"vertical\"\n : social?.providers && social.providers.length > 2\n ? \"horizontal\"\n : \"vertical\"\n }\n\n const path = pathname?.split(\"/\").pop()\n const view =\n viewProp ||\n (getViewByPath(\n viewPaths as unknown as Record,\n path\n ) as typeof viewProp) ||\n \"SIGN_IN\"\n\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n useEffect(() => {\n const handlePageHide = () => setIsSubmitting(false)\n window.addEventListener(\"pagehide\", handlePageHide)\n return () => {\n setIsSubmitting(false)\n window.removeEventListener(\"pagehide\", handlePageHide)\n }\n }, [])\n\n if (view === \"CALLBACK\") return \n if (view === \"SIGN_OUT\") return \n\n const description =\n !credentials && !magicLink && !emailOTP\n ? localization.DISABLED_CREDENTIALS_DESCRIPTION\n : localization[`${view}_DESCRIPTION` as keyof typeof localization]\n\n return (\n \n \n {cardHeader ? (\n cardHeader\n ) : (\n <>\n \n {localization[view as keyof typeof localization]}\n \n {description && (\n \n {description}\n \n )}\n \n )}\n \n\n \n {oneTap &&\n [\"SIGN_IN\", \"SIGN_UP\", \"MAGIC_LINK\", \"EMAIL_OTP\"].includes(\n view as string\n ) && (\n \n )}\n\n {(credentials || magicLink || emailOTP) && (\n
\n \n\n {magicLink &&\n ((credentials &&\n [\n \"FORGOT_PASSWORD\",\n \"SIGN_UP\",\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\"\n ].includes(view as string)) ||\n (emailOTP && view === \"EMAIL_OTP\")) && (\n \n )}\n\n {emailOTP &&\n ((credentials &&\n [\n \"FORGOT_PASSWORD\",\n \"SIGN_UP\",\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\"\n ].includes(view as string)) ||\n (magicLink &&\n [\"SIGN_IN\", \"MAGIC_LINK\"].includes(\n view as string\n ))) && (\n \n )}\n
\n )}\n\n {view !== \"RESET_PASSWORD\" &&\n (social?.providers?.length ||\n genericOAuth?.providers?.length ||\n (view === \"SIGN_IN\" && passkey)) && (\n <>\n {(credentials || magicLink || emailOTP) && (\n \n \n \n {localization.OR_CONTINUE_WITH}\n \n \n \n )}\n\n
\n {(social?.providers?.length ||\n genericOAuth?.providers?.length) && (\n \n {social?.providers?.map((provider) => {\n const socialProvider =\n socialProviders.find(\n (socialProvider) =>\n socialProvider.provider ===\n provider\n )\n if (!socialProvider) return null\n return (\n \n )\n })}\n {genericOAuth?.providers?.map(\n (provider) => (\n \n )\n )}\n
\n )}\n\n {passkey &&\n [\n \"SIGN_IN\",\n \"MAGIC_LINK\",\n \"EMAIL_OTP\",\n \"RECOVER_ACCOUNT\",\n \"TWO_FACTOR\",\n \"FORGOT_PASSWORD\"\n ].includes(view as string) && (\n \n )}\n \n \n )}\n
\n\n {credentials && signUp && (\n \n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\" ? (\n localization.DONT_HAVE_AN_ACCOUNT\n ) : view === \"SIGN_UP\" ? (\n localization.ALREADY_HAVE_AN_ACCOUNT\n ) : (\n \n )}\n\n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\" ||\n view === \"SIGN_UP\" ? (\n \n \n {view === \"SIGN_IN\" ||\n view === \"MAGIC_LINK\" ||\n view === \"EMAIL_OTP\"\n ? localization.SIGN_UP\n : localization.SIGN_IN}\n \n \n ) : (\n window.history.back()}\n >\n {localization.GO_BACK}\n \n )}\n \n )}\n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/avatar-options.json b/public/r/avatar-options.json deleted file mode 100644 index 446dac7b..00000000 --- a/public/r/avatar-options.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "avatar-options", - "type": "registry:file", - "title": "Avatar Options", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/image.json" - ], - "files": [ - { - "path": "src/types/avatar-options.ts", - "content": "import type { Image } from \"./image\"\n\nexport type AvatarOptions = {\n /**\n * Upload an avatar image and return the URL string\n * @remarks `(file: File) => Promise`\n */\n upload?: (file: File) => Promise\n /**\n * Delete a previously uploaded avatar image from your storage/CDN\n * @remarks `(url: string) => Promise`\n */\n delete?: (url: string) => Promise\n /**\n * Avatar size for resizing\n * @default 128 (or 256 if upload is provided)\n */\n size: number\n /**\n * File extension for avatar uploads\n * @default \"png\"\n */\n extension: string\n /**\n * Custom Image component for rendering avatar images\n * @default AvatarImage from Radix UI\n */\n Image?: Image\n}\n", - "type": "registry:file", - "target": "types/avatar-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/avatar.json b/public/r/avatar.json deleted file mode 100644 index 46717f72..00000000 --- a/public/r/avatar.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "avatar", - "type": "registry:ui", - "title": "Avatar", - "description": "", - "dependencies": [ - "@radix-ui/react-avatar" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/avatar.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/backup-codes-dialog.json b/public/r/backup-codes-dialog.json deleted file mode 100644 index 5960537f..00000000 --- a/public/r/backup-codes-dialog.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "backup-codes-dialog", - "type": "registry:component", - "title": "Backup Codes Dialog", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/two-factor/backup-codes-dialog.tsx", - "content": "\"use client\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface BackupCodesDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n backupCodes: string[]\n}\n\nexport function BackupCodesDialog({\n classNames,\n backupCodes,\n onOpenChange,\n ...props\n}: BackupCodesDialogProps) {\n const { localization } = useContext(AuthUIContext)\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n const codeText = backupCodes.join(\"\\n\")\n navigator.clipboard.writeText(codeText)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.BACKUP_CODES}\n \n\n \n {localization.BACKUP_CODES_DESCRIPTION}\n \n \n\n
\n {backupCodes.map((code, index) => (\n \n {code}\n
\n ))}\n \n\n \n \n {copied ? (\n <>\n \n {localization.COPIED_TO_CLIPBOARD}\n \n ) : (\n <>\n \n {localization.COPY_ALL_CODES}\n \n )}\n \n\n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.primaryButton\n )}\n >\n {localization.CONTINUE}\n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/base-error-codes.json b/public/r/base-error-codes.json deleted file mode 100644 index 35ce5cea..00000000 --- a/public/r/base-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "base-error-codes", - "type": "registry:file", - "title": "Base Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/base-error-codes.ts", - "content": "export const BASE_ERROR_CODES = {\n USER_NOT_FOUND: \"User not found\",\n FAILED_TO_CREATE_USER: \"Failed to create user\",\n FAILED_TO_CREATE_SESSION: \"Failed to create session\",\n FAILED_TO_UPDATE_USER: \"Failed to update user\",\n FAILED_TO_GET_SESSION: \"Failed to get session\",\n INVALID_PASSWORD: \"Invalid password\",\n INVALID_EMAIL: \"Invalid email\",\n INVALID_EMAIL_OR_PASSWORD: \"Invalid email or password\",\n SOCIAL_ACCOUNT_ALREADY_LINKED: \"Social account already linked\",\n PROVIDER_NOT_FOUND: \"Provider not found\",\n INVALID_TOKEN: \"Invalid token\",\n ID_TOKEN_NOT_SUPPORTED: \"id_token not supported\",\n FAILED_TO_GET_USER_INFO: \"Failed to get user info\",\n USER_EMAIL_NOT_FOUND: \"User email not found\",\n EMAIL_NOT_VERIFIED: \"Email not verified\",\n PASSWORD_TOO_SHORT: \"Password too short\",\n PASSWORD_TOO_LONG: \"Password too long\",\n USER_ALREADY_EXISTS: \"User already exists\",\n EMAIL_CAN_NOT_BE_UPDATED: \"Email can not be updated\",\n CREDENTIAL_ACCOUNT_NOT_FOUND: \"Credential account not found\",\n SESSION_EXPIRED: \"Session expired. Re-authenticate to perform this action.\",\n FAILED_TO_UNLINK_LAST_ACCOUNT: \"You can't unlink your last account\",\n ACCOUNT_NOT_FOUND: \"Account not found\",\n USER_ALREADY_HAS_PASSWORD:\n \"User already has a password. Provide that to delete the account.\"\n}\n", - "type": "registry:file", - "target": "localization/base-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/button.json b/public/r/button.json deleted file mode 100644 index 5a8cc22c..00000000 --- a/public/r/button.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "button", - "type": "registry:ui", - "title": "Button", - "description": "", - "dependencies": [ - "@radix-ui/react-slot", - "class-variance-authority" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/button.tsx", - "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n \n )\n}\n\nexport { Button, buttonVariants }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/captcha-error-codes.json b/public/r/captcha-error-codes.json deleted file mode 100644 index bc53de8d..00000000 --- a/public/r/captcha-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "captcha-error-codes", - "type": "registry:file", - "title": "Captcha Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/captcha-error-codes.ts", - "content": "// These error codes are returned by the API\nconst EXTERNAL_ERROR_CODES = {\n VERIFICATION_FAILED: \"Captcha verification failed\",\n MISSING_RESPONSE: \"Missing CAPTCHA response\",\n UNKNOWN_ERROR: \"Something went wrong\"\n}\n\n// These error codes are only visible in the server logs\nconst INTERNAL_ERROR_CODES = {\n MISSING_SECRET_KEY: \"Missing secret key\",\n SERVICE_UNAVAILABLE: \"CAPTCHA service unavailable\"\n}\n\nexport const CAPTCHA_ERROR_CODES = {\n ...EXTERNAL_ERROR_CODES,\n ...INTERNAL_ERROR_CODES\n}\n", - "type": "registry:file", - "target": "localization/captcha-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/captcha-options.json b/public/r/captcha-options.json deleted file mode 100644 index f40259d4..00000000 --- a/public/r/captcha-options.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "captcha-options", - "type": "registry:file", - "title": "Captcha Options", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/captcha-provider.json" - ], - "files": [ - { - "path": "src/types/captcha-options.ts", - "content": "import type { CaptchaProvider } from \"./captcha-provider\"\n\nexport type CaptchaOptions = {\n /**\n * Captcha site key\n */\n siteKey: string\n /**\n * Captcha provider type\n */\n provider: CaptchaProvider\n /**\n * Hide the captcha badge\n * @default false\n */\n hideBadge?: boolean\n /**\n * Use recaptcha.net domain instead of google.com\n * @default false\n */\n recaptchaNet?: boolean\n /**\n * Enable enterprise mode for Google reCAPTCHA\n * @default false\n */\n enterprise?: boolean\n /**\n * Overrides the default array of paths where captcha validation is enforced\n * @default [\"/sign-up/email\", \"/sign-in/email\", \"/forget-password\"]\n */\n endpoints?: string[]\n}\n", - "type": "registry:file", - "target": "types/captcha-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/captcha-provider.json b/public/r/captcha-provider.json deleted file mode 100644 index 76fe9715..00000000 --- a/public/r/captcha-provider.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "captcha-provider", - "type": "registry:file", - "title": "Captcha Provider", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/captcha-provider.ts", - "content": "export type CaptchaProvider =\n | \"cloudflare-turnstile\"\n | \"google-recaptcha-v2-checkbox\"\n | \"google-recaptcha-v2-invisible\"\n | \"google-recaptcha-v3\"\n | \"hcaptcha\"\n", - "type": "registry:file", - "target": "types/captcha-provider.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/captcha.json b/public/r/captcha.json deleted file mode 100644 index 62e1d9ee..00000000 --- a/public/r/captcha.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "captcha", - "type": "registry:component", - "title": "Captcha", - "description": "", - "dependencies": [ - "@hcaptcha/react-hcaptcha", - "@marsidev/react-turnstile" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/recaptcha-badge.json", - "https://better-auth-ui.com/r/recaptcha-v2.json", - "https://better-auth-ui.com/r/use-theme.json" - ], - "files": [ - { - "path": "src/components/captcha/captcha.tsx", - "content": "import HCaptcha from \"@hcaptcha/react-hcaptcha\"\nimport { Turnstile } from \"@marsidev/react-turnstile\"\nimport { type RefObject, useContext } from \"react\"\n\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { RecaptchaBadge } from \"./recaptcha-badge\"\nimport { RecaptchaV2 } from \"./recaptcha-v2\"\n\n// Default captcha endpoints\nconst DEFAULT_CAPTCHA_ENDPOINTS = [\n \"/sign-up/email\",\n \"/sign-in/email\",\n \"/forget-password\"\n]\n\ninterface CaptchaProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n ref: RefObject\n localization: Partial\n action?: string // Optional action to check if it's in the endpoints list\n}\n\nexport function Captcha({ ref, localization, action }: CaptchaProps) {\n const { captcha } = useContext(AuthUIContext)\n if (!captcha) return null\n\n // If action is provided, check if it's in the list of captcha-enabled endpoints\n if (action) {\n const endpoints = captcha.endpoints || DEFAULT_CAPTCHA_ENDPOINTS\n if (!endpoints.includes(action)) {\n return null\n }\n }\n\n const { theme } = useTheme()\n\n const showRecaptchaV2 =\n captcha.provider === \"google-recaptcha-v2-checkbox\" ||\n captcha.provider === \"google-recaptcha-v2-invisible\"\n\n const showRecaptchaBadge =\n captcha.provider === \"google-recaptcha-v3\" ||\n captcha.provider === \"google-recaptcha-v2-invisible\"\n\n const showTurnstile = captcha.provider === \"cloudflare-turnstile\"\n\n const showHCaptcha = captcha.provider === \"hcaptcha\"\n\n return (\n <>\n {showRecaptchaV2 && }\n {showRecaptchaBadge && (\n \n )}\n {showTurnstile && (\n \n )}\n {showHCaptcha && (\n
\n \n
\n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/card.json b/public/r/card.json deleted file mode 100644 index c741d6ab..00000000 --- a/public/r/card.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "card", - "type": "registry:ui", - "title": "Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/card.tsx", - "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/change-email-card.json b/public/r/change-email-card.json deleted file mode 100644 index 7b9ccb92..00000000 --- a/public/r/change-email-card.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "change-email-card", - "type": "registry:component", - "title": "Change Email Card", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/change-email-card.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport { CardContent } from \"../../ui/card\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\n\nexport function ChangeEmailCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n authClient,\n emailVerification,\n hooks: { useSession },\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData, isPending, refetch } = useSession()\n const [resendDisabled, setResendDisabled] = useState(false)\n\n const formSchema = z.object({\n email: z\n .string()\n .min(1, { message: localization.EMAIL_REQUIRED })\n .email({ message: localization.INVALID_EMAIL })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: {\n email: sessionData?.user.email || \"\"\n }\n })\n\n const resendForm = useForm()\n\n const { isSubmitting } = form.formState\n\n const changeEmail = async ({ email }: z.infer) => {\n if (email === sessionData?.user.email) {\n await new Promise((resolve) => setTimeout(resolve))\n toast({\n variant: \"error\",\n message: localization.EMAIL_IS_THE_SAME\n })\n return\n }\n\n try {\n await authClient.changeEmail({\n newEmail: email,\n callbackURL: window.location.pathname,\n fetchOptions: { throw: true }\n })\n\n if (sessionData?.user.emailVerified) {\n toast({\n variant: \"success\",\n message: localization.EMAIL_VERIFY_CHANGE!\n })\n } else {\n await refetch?.()\n toast({\n variant: \"success\",\n message: `${localization.EMAIL} ${localization.UPDATED_SUCCESSFULLY}`\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const resendVerification = async () => {\n if (!sessionData) return\n const email = sessionData.user.email\n\n setResendDisabled(true)\n\n try {\n await authClient.sendVerificationEmail({\n email,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.EMAIL_VERIFICATION!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n setResendDisabled(false)\n throw error\n }\n }\n\n return (\n <>\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n\n {emailVerification &&\n sessionData?.user &&\n !sessionData?.user.emailVerified && (\n
\n \n \n \n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/change-password-card.json b/public/r/change-password-card.json deleted file mode 100644 index 3ef06459..00000000 --- a/public/r/change-password-card.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "change-password-card", - "type": "registry:component", - "title": "Change Password Card", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "https://better-auth-ui.com/r/input-field-skeleton.json", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/change-password-card.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getPasswordSchema } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { PasswordInput } from \"../../password-input\"\nimport { CardContent } from \"../../ui/card\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport {\n SettingsCard,\n type SettingsCardClassNames\n} from \"../shared/settings-card\"\nimport { InputFieldSkeleton } from \"../skeletons/input-field-skeleton\"\n\nexport interface ChangePasswordCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n isPending?: boolean\n localization?: AuthLocalization\n skipHook?: boolean\n passwordValidation?: PasswordValidation\n}\n\nexport function ChangePasswordCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook,\n passwordValidation\n}: ChangePasswordCardProps) {\n const {\n authClient,\n basePath,\n baseURL,\n credentials,\n hooks: { useSession, useListAccounts },\n localization: contextLocalization,\n viewPaths,\n toast\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const { data: sessionData } = useSession()\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n }\n\n const formSchema = z\n .object({\n currentPassword: getPasswordSchema(\n passwordValidation,\n localization\n ),\n newPassword: getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.NEW_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n }),\n confirmPassword: confirmPasswordEnabled\n ? getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n : z.string().optional()\n })\n .refine(\n (data) =>\n !confirmPasswordEnabled ||\n data.newPassword === data.confirmPassword,\n {\n message: localization.PASSWORDS_DO_NOT_MATCH,\n path: [\"confirmPassword\"]\n }\n )\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n currentPassword: \"\",\n newPassword: \"\",\n confirmPassword: \"\"\n }\n })\n\n const setPasswordForm = useForm()\n\n const { isSubmitting } = form.formState\n\n const setPassword = async () => {\n if (!sessionData) return\n const email = sessionData?.user.email\n\n try {\n await authClient.requestPasswordReset({\n email,\n redirectTo: `${baseURL}${basePath}/${viewPaths.RESET_PASSWORD}`,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.FORGOT_PASSWORD_EMAIL!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const changePassword = async ({\n currentPassword,\n newPassword\n }: z.infer) => {\n try {\n await authClient.changePassword({\n currentPassword,\n newPassword,\n revokeOtherSessions: true,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.CHANGE_PASSWORD_SUCCESS!\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n form.reset()\n }\n\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n if (!isPending && !credentialsLinked) {\n return (\n
\n \n \n \n \n )\n }\n\n return (\n
\n \n \n \n {isPending || !accounts ? (\n <>\n \n \n\n {confirmPasswordEnabled && (\n \n )}\n \n ) : (\n <>\n (\n \n \n {localization.CURRENT_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.NEW_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {\n localization.CONFIRM_PASSWORD\n }\n \n\n \n \n \n\n \n \n )}\n />\n )}\n \n )}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/checkbox.json b/public/r/checkbox.json deleted file mode 100644 index b77c2f06..00000000 --- a/public/r/checkbox.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "checkbox", - "type": "registry:ui", - "title": "Checkbox", - "description": "", - "dependencies": [ - "@radix-ui/react-checkbox", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/checkbox.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n\nexport { Checkbox }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/create-api-key-dialog.json b/public/r/create-api-key-dialog.json deleted file mode 100644 index 0ed86b99..00000000 --- a/public/r/create-api-key-dialog.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "create-api-key-dialog", - "type": "registry:component", - "title": "Create Api Key Dialog", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "form", - "input", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/personal-account-view.json", - "https://better-auth-ui.com/r/refetch.json", - "select", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/create-api-key-dialog.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { useLang } from \"../../../hooks/use-lang\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { OrganizationCellView } from \"../../organization/organization-cell-view\"\nimport { PersonalAccountView } from \"../../organization/personal-account-view\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue\n} from \"../../ui/select\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\ninterface CreateApiKeyDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n onSuccess: (key: string) => void\n refetch?: Refetch\n organizationId?: string\n}\n\nexport function CreateApiKeyDialog({\n classNames,\n localization,\n onSuccess,\n refetch,\n organizationId,\n onOpenChange,\n ...props\n}: CreateApiKeyDialogProps) {\n const {\n authClient,\n apiKey,\n hooks: { useListOrganizations, useSession },\n localization: contextLocalization,\n organization: contextOrganization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { lang } = useLang()\n\n let organizations: Organization[] | null | undefined\n if (contextOrganization) {\n const { data } = useListOrganizations()\n organizations = data\n }\n\n const { data: sessionData } = useSession()\n const user = sessionData?.user\n\n const showOrganizationSelect = contextOrganization?.apiKey\n\n const formSchema = z.object({\n name: z\n .string()\n .min(1, `${localization.NAME} ${localization.IS_REQUIRED}`),\n expiresInDays: z.string().optional(),\n organizationId: showOrganizationSelect\n ? z\n .string()\n .min(\n 1,\n `${localization.ORGANIZATION} ${localization.IS_REQUIRED}`\n )\n : z.string().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: {\n name: \"\",\n expiresInDays: \"none\",\n organizationId: organizationId ?? \"personal\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const onSubmit = async (values: z.infer) => {\n try {\n const expiresIn =\n values.expiresInDays && values.expiresInDays !== \"none\"\n ? Number.parseInt(values.expiresInDays) * 60 * 60 * 24\n : undefined\n\n const selectedOrgId =\n values.organizationId === \"personal\"\n ? undefined\n : values.organizationId\n\n const metadata = {\n ...(typeof apiKey === \"object\" ? apiKey.metadata : {}),\n ...(contextOrganization && selectedOrgId\n ? { organizationId: selectedOrgId }\n : {})\n }\n\n const result = await authClient.apiKey.create({\n name: values.name,\n expiresIn,\n prefix: typeof apiKey === \"object\" ? apiKey.prefix : undefined,\n metadata:\n Object.keys(metadata).length > 0 ? metadata : undefined,\n fetchOptions: { throw: true }\n })\n\n await refetch?.()\n onSuccess(result.key)\n onOpenChange?.(false)\n form.reset()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const rtf = new Intl.RelativeTimeFormat(lang ?? \"en\")\n\n return (\n \n e.preventDefault()}\n className={classNames?.dialog?.content}\n >\n \n \n {localization.CREATE_API_KEY}\n \n\n \n {localization.CREATE_API_KEY_DESCRIPTION}\n \n \n\n
\n \n {showOrganizationSelect && (\n (\n \n \n {localization.ORGANIZATION}\n \n\n \n \n \n \n \n \n\n \n \n \n \n\n {organizations?.map((org) => (\n \n \n \n ))}\n \n \n\n \n \n )}\n />\n )}\n\n
\n (\n \n \n {localization.NAME}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.EXPIRES}\n \n\n \n \n \n \n \n \n\n \n \n {localization.NO_EXPIRATION}\n \n\n {[\n 1, 7, 30, 60, 90, 180, 365\n ].map((days) => (\n \n {days === 365\n ? rtf.format(\n 1,\n \"year\"\n )\n : rtf.format(\n days,\n \"day\"\n )}\n \n ))}\n \n \n\n \n \n )}\n />\n
\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isSubmitting}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization.CREATE_API_KEY}\n \n \n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/create-organization-dialog.json b/public/r/create-organization-dialog.json deleted file mode 100644 index 3e2afa7d..00000000 --- a/public/r/create-organization-dialog.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "create-organization-dialog", - "type": "registry:component", - "title": "Create Organization Dialog", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "dropdown-menu", - "form", - "https://better-auth-ui.com/r/image-utils.json", - "input", - "https://better-auth-ui.com/r/organization-logo.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/create-organization-dialog.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2, Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport {\n type ComponentProps,\n useContext,\n useMemo,\n useRef,\n useState\n} from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { OrganizationLogo } from \"./organization-logo\"\n\nexport interface CreateOrganizationDialogProps\n extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function CreateOrganizationDialog({\n className,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: CreateOrganizationDialogProps) {\n const {\n authClient,\n localization: contextLocalization,\n organization: organizationOptions,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [logo, setLogo] = useState(null)\n const [logoPending, setLogoPending] = useState(false)\n\n const fileInputRef = useRef(null)\n const openFileDialog = () => fileInputRef.current?.click()\n\n const formSchema = z.object({\n logo: z.string().optional(),\n name: z.string().min(1, {\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`\n }),\n slug: z\n .string()\n .min(1, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_REQUIRED}`\n })\n .regex(/^[a-z0-9-]+$/, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_INVALID}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n logo: \"\",\n name: \"\",\n slug: \"\"\n }\n })\n\n const isSubmitting = form.formState.isSubmitting\n\n const handleLogoChange = async (file: File) => {\n if (!organizationOptions?.logo) return\n\n setLogoPending(true)\n\n try {\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n organizationOptions.logo.size,\n organizationOptions.logo.extension\n )\n\n let image: string | undefined | null\n\n if (organizationOptions?.logo.upload) {\n image = await organizationOptions.logo.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n setLogo(image || null)\n form.setValue(\"logo\", image || \"\")\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLogoPending(false)\n }\n\n const deleteLogo = async () => {\n setLogoPending(true)\n\n const currentUrl = logo || undefined\n if (currentUrl && organizationOptions?.logo?.delete) {\n await organizationOptions.logo.delete(currentUrl)\n }\n\n setLogo(null)\n form.setValue(\"logo\", \"\")\n setLogoPending(false)\n }\n\n async function onSubmit({ name, slug, logo }: z.infer) {\n try {\n const organization = await authClient.organization.create({\n name,\n slug,\n logo,\n fetchOptions: { throw: true }\n })\n\n if (organizationOptions?.pathMode === \"slug\") {\n navigate(`${organizationOptions.basePath}/${organization.slug}`)\n return\n }\n\n await authClient.organization.setActive({\n organizationId: organization.id\n })\n\n onOpenChange?.(false)\n form.reset()\n setLogo(null)\n\n toast({\n variant: \"success\",\n message: localization.CREATE_ORGANIZATION_SUCCESS\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n \n \n \n \n {localization.CREATE_ORGANIZATION}\n \n\n \n {localization.ORGANIZATIONS_INSTRUCTIONS}\n \n \n\n
\n \n {organizationOptions?.logo && (\n (\n \n {\n const file =\n e.target.files?.item(0)\n if (file) handleLogoChange(file)\n e.target.value = \"\"\n }}\n />\n\n \n {localization.LOGO}\n \n\n
\n \n \n \n \n \n \n\n \n e.preventDefault()\n }\n >\n \n \n\n {\n localization.UPLOAD_LOGO\n }\n \n\n {logo && (\n \n \n\n {\n localization.DELETE_LOGO\n }\n \n )}\n \n \n\n \n {logoPending && (\n \n )}\n\n {localization.UPLOAD}\n \n
\n\n \n
\n )}\n />\n )}\n\n (\n \n \n {localization.ORGANIZATION_NAME}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.ORGANIZATION_SLUG}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization.CREATE_ORGANIZATION}\n \n \n \n \n
\n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/credentials-options.json b/public/r/credentials-options.json deleted file mode 100644 index ed36b57e..00000000 --- a/public/r/credentials-options.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "credentials-options", - "type": "registry:file", - "title": "Credentials Options", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/password-validation.json" - ], - "files": [ - { - "path": "src/types/credentials-options.ts", - "content": "import type { PasswordValidation } from \"./password-validation\"\n\nexport type CredentialsOptions = {\n /**\n * Enable or disable the Confirm Password input\n * @default false\n */\n confirmPassword?: boolean\n\n /**\n * Enable or disable Forgot Password flow\n * @default true\n */\n forgotPassword?: boolean\n\n /**\n * Customize the password validation\n */\n passwordValidation?: PasswordValidation\n\n /**\n * Enable or disable Remember Me checkbox\n * @default false\n */\n rememberMe?: boolean\n\n /**\n * Enable or disable Username support\n * @default false\n */\n username?: boolean\n}\n", - "type": "registry:file", - "target": "types/credentials-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/delete-account-card.json b/public/r/delete-account-card.json deleted file mode 100644 index c010ff7f..00000000 --- a/public/r/delete-account-card.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "delete-account-card", - "type": "registry:component", - "title": "Delete Account Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/delete-account-dialog.json", - "https://better-auth-ui.com/r/settings-card.json" - ], - "files": [ - { - "path": "src/components/settings/account/delete-account-card.tsx", - "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { DeleteAccountDialog } from \"./delete-account-dialog\"\n\nexport interface DeleteAccountCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n isPending?: boolean\n localization?: AuthLocalization\n skipHook?: boolean\n}\n\nexport function DeleteAccountCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook\n}: DeleteAccountCardProps) {\n const {\n hooks: { useListAccounts },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const [showDialog, setShowDialog] = useState(false)\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n }\n\n return (\n
\n setShowDialog(true)}\n />\n\n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/delete-account-dialog.json b/public/r/delete-account-dialog.json deleted file mode 100644 index dfcd512d..00000000 --- a/public/r/delete-account-dialog.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "delete-account-dialog", - "type": "registry:component", - "title": "Delete Account Dialog", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/delete-account-dialog.tsx", - "content": "import { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { UserView } from \"../../user-view\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface DeleteAccountDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n accounts?: { provider: string }[] | null\n localization?: AuthLocalization\n}\n\nexport function DeleteAccountDialog({\n classNames,\n accounts,\n localization,\n onOpenChange,\n ...props\n}: DeleteAccountDialogProps) {\n const {\n authClient,\n basePath,\n baseURL,\n deleteUser,\n freshAge,\n hooks: { useSession },\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const user = sessionData?.user\n\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n const formSchema = z.object({\n password: credentialsLinked\n ? z.string().min(1, { message: localization.PASSWORD_REQUIRED! })\n : z.string().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n password: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const deleteAccount = async ({ password }: z.infer) => {\n const params = {} as Record\n\n if (credentialsLinked) {\n params.password = password!\n } else if (!isFresh) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n if (deleteUser?.verification) {\n params.callbackURL = `${baseURL}${basePath}/${viewPaths.SIGN_OUT}`\n }\n\n try {\n await authClient.deleteUser({\n ...params,\n fetchOptions: {\n throw: true\n }\n })\n\n if (deleteUser?.verification) {\n toast({\n variant: \"success\",\n message: localization.DELETE_ACCOUNT_VERIFY!\n })\n } else {\n toast({\n variant: \"success\",\n message: localization.DELETE_ACCOUNT_SUCCESS!\n })\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n onOpenChange?.(false)\n }\n\n return (\n \n \n \n \n {localization?.DELETE_ACCOUNT}\n \n\n \n {isFresh\n ? localization?.DELETE_ACCOUNT_INSTRUCTIONS\n : localization?.SESSION_NOT_FRESH}\n \n \n\n \n \n \n\n
\n \n {credentialsLinked && (\n (\n \n \n {localization?.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n {isFresh\n ? localization?.DELETE_ACCOUNT\n : localization?.SIGN_OUT}\n \n \n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/delete-organization-card.json b/public/r/delete-organization-card.json deleted file mode 100644 index 40c042df..00000000 --- a/public/r/delete-organization-card.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "delete-organization-card", - "type": "registry:component", - "title": "Delete Organization Card", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/delete-organization-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-current-organization.json" - ], - "files": [ - { - "path": "src/components/organization/delete-organization-card.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { DeleteOrganizationDialog } from \"./delete-organization-dialog\"\n\nexport function DeleteOrganizationCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization)\n return (\n \n )\n\n return (\n \n )\n}\n\nfunction DeleteOrganizationForm({\n className,\n classNames,\n localization: localizationProp,\n organization\n}: SettingsCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission }\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: hasPermission, isPending } = useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"delete\"]\n }\n })\n\n const [showDialog, setShowDialog] = useState(false)\n\n if (!hasPermission?.success) return null\n\n return (\n <>\n setShowDialog(true)}\n />\n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/delete-organization-dialog.json b/public/r/delete-organization-dialog.json deleted file mode 100644 index edfeb92a..00000000 --- a/public/r/delete-organization-dialog.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "delete-organization-dialog", - "type": "registry:component", - "title": "Delete Organization Dialog", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "form", - "input", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/delete-organization-dialog.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface DeleteOrganizationDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n organization: Organization\n}\n\nexport function DeleteOrganizationDialog({\n classNames,\n localization: localizationProp,\n onOpenChange,\n organization,\n ...props\n}: DeleteOrganizationDialogProps) {\n const {\n authClient,\n account: accountOptions,\n hooks: { useListOrganizations },\n localization: contextLocalization,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganizations } = useListOrganizations()\n\n const formSchema = z.object({\n slug: z\n .string()\n .min(1, { message: localization.SLUG_REQUIRED! })\n .refine((val) => val === organization.slug, {\n message: localization.SLUG_DOES_NOT_MATCH!\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n slug: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n const deleteOrganization = async () => {\n try {\n await authClient.organization.delete({\n organizationId: organization.id,\n fetchOptions: { throw: true }\n })\n\n await refetchOrganizations?.()\n\n toast({\n variant: \"success\",\n message: localization.DELETE_ORGANIZATION_SUCCESS!\n })\n\n navigate(\n `${accountOptions?.basePath}/${accountOptions?.viewPaths.ORGANIZATIONS}`\n )\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n \n \n \n \n {localization?.DELETE_ORGANIZATION}\n \n\n \n {localization?.DELETE_ORGANIZATION_DESCRIPTION}\n \n \n\n \n \n \n\n
\n \n (\n \n \n {\n localization?.DELETE_ORGANIZATION_INSTRUCTIONS\n }\n\n \n {organization.slug}\n \n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n\n {localization?.DELETE_ORGANIZATION}\n \n \n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/delete-user-options.json b/public/r/delete-user-options.json deleted file mode 100644 index e2a1e41c..00000000 --- a/public/r/delete-user-options.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "delete-user-options", - "type": "registry:file", - "title": "Delete User Options", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/delete-user-options.ts", - "content": "export type DeleteUserOptions = {\n /**\n * Enable or disable email verification for account deletion\n * @default undefined\n */\n verification?: boolean\n}\n", - "type": "registry:file", - "target": "types/delete-user-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/dialog.json b/public/r/dialog.json deleted file mode 100644 index 750f761e..00000000 --- a/public/r/dialog.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "dialog", - "type": "registry:ui", - "title": "Dialog", - "description": "", - "dependencies": [ - "@radix-ui/react-dialog", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/dialog.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/drawer.json b/public/r/drawer.json deleted file mode 100644 index 7b7c908e..00000000 --- a/public/r/drawer.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "drawer", - "type": "registry:ui", - "title": "Drawer", - "description": "", - "dependencies": [ - "vaul" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/drawer.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-cell.json b/public/r/organization-cell.json deleted file mode 100644 index 939e7f4a..00000000 --- a/public/r/organization-cell.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-cell", - "type": "registry:component", - "title": "Organization Cell", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/leave-organization-dialog.json", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-cell.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { EllipsisIcon, Loader2, LogOutIcon, SettingsIcon } from \"lucide-react\"\nimport { useCallback, useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { LeaveOrganizationDialog } from \"./leave-organization-dialog\"\nimport { OrganizationCellView } from \"./organization-cell-view\"\n\nexport interface OrganizationCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n organization: Organization\n localization?: AuthLocalization\n}\n\nexport function OrganizationCell({\n className,\n classNames,\n organization,\n localization: localizationProp\n}: OrganizationCellProps) {\n const {\n authClient,\n localization: contextLocalization,\n organization: organizationOptions,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { pathMode } = organizationOptions || {}\n\n const [isLeaveDialogOpen, setIsLeaveDialogOpen] = useState(false)\n const [isManagingOrganization, setIsManagingOrganization] = useState(false)\n\n const handleManageOrganization = useCallback(async () => {\n setIsManagingOrganization(true)\n\n if (pathMode === \"slug\") {\n navigate(\n `${organizationOptions?.basePath}/${organization.slug}/${organizationOptions?.viewPaths.SETTINGS}`\n )\n\n return\n }\n\n try {\n await authClient.organization.setActive({\n organizationId: organization.id,\n fetchOptions: {\n throw: true\n }\n })\n\n navigate(\n `${organizationOptions?.basePath}/${organizationOptions?.viewPaths?.SETTINGS}`\n )\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsManagingOrganization(false)\n }\n }, [\n authClient,\n organization.id,\n organizationOptions?.basePath,\n organizationOptions?.viewPaths?.SETTINGS,\n organization.slug,\n pathMode,\n navigate,\n toast,\n localization\n ])\n\n return (\n <>\n \n \n\n \n \n \n {isManagingOrganization ? (\n \n ) : (\n \n )}\n \n \n\n \n \n \n\n {localization.MANAGE_ORGANIZATION}\n \n\n setIsLeaveDialogOpen(true)}\n variant=\"destructive\"\n >\n \n\n {localization.LEAVE_ORGANIZATION}\n \n \n \n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-error-codes.json b/public/r/organization-error-codes.json deleted file mode 100644 index 160c1c39..00000000 --- a/public/r/organization-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-error-codes", - "type": "registry:file", - "title": "Organization Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/organization-error-codes.ts", - "content": "export const ORGANIZATION_ERROR_CODES = {\n YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION:\n \"You are not allowed to create a new organization\",\n YOU_HAVE_REACHED_THE_MAXIMUM_NUMBER_OF_ORGANIZATIONS:\n \"You have reached the maximum number of organizations\",\n ORGANIZATION_ALREADY_EXISTS: \"Organization already exists\",\n ORGANIZATION_NOT_FOUND: \"Organization not found\",\n USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION:\n \"User is not a member of the organization\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_ORGANIZATION:\n \"You are not allowed to update this organization\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_ORGANIZATION:\n \"You are not allowed to delete this organization\",\n NO_ACTIVE_ORGANIZATION: \"No active organization\",\n USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION:\n \"User is already a member of this organization\",\n MEMBER_NOT_FOUND: \"Member not found\",\n ROLE_NOT_FOUND: \"Role not found\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_TEAM:\n \"You are not allowed to create a new team\",\n TEAM_ALREADY_EXISTS: \"Team already exists\",\n TEAM_NOT_FOUND: \"Team not found\",\n YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER:\n \"You cannot leave the organization as the only owner\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER:\n \"You are not allowed to delete this member\",\n YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION:\n \"You are not allowed to invite users to this organization\",\n USER_IS_ALREADY_INVITED_TO_THIS_ORGANIZATION:\n \"User is already invited to this organization\",\n INVITATION_NOT_FOUND: \"Invitation not found\",\n YOU_ARE_NOT_THE_RECIPIENT_OF_THE_INVITATION:\n \"You are not the recipient of the invitation\",\n YOU_ARE_NOT_ALLOWED_TO_CANCEL_THIS_INVITATION:\n \"You are not allowed to cancel this invitation\",\n INVITER_IS_NO_LONGER_A_MEMBER_OF_THE_ORGANIZATION:\n \"Inviter is no longer a member of the organization\",\n YOU_ARE_NOT_ALLOWED_TO_INVITE_USER_WITH_THIS_ROLE:\n \"you are not allowed to invite user with this role\",\n FAILED_TO_RETRIEVE_INVITATION: \"Failed to retrieve invitation\",\n YOU_HAVE_REACHED_THE_MAXIMUM_NUMBER_OF_TEAMS:\n \"You have reached the maximum number of teams\",\n UNABLE_TO_REMOVE_LAST_TEAM: \"Unable to remove last team\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER:\n \"You are not allowed to update this member\",\n ORGANIZATION_MEMBERSHIP_LIMIT_REACHED:\n \"Organization membership limit reached\",\n YOU_ARE_NOT_ALLOWED_TO_CREATE_TEAMS_IN_THIS_ORGANIZATION:\n \"You are not allowed to create teams in this organization\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_TEAMS_IN_THIS_ORGANIZATION:\n \"You are not allowed to delete teams in this organization\",\n YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_TEAM:\n \"You are not allowed to update this team\",\n YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_TEAM:\n \"You are not allowed to delete this team\",\n INVITATION_LIMIT_REACHED: \"Invitation limit reached\"\n}\n", - "type": "registry:file", - "target": "localization/organization-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-invitations-card.json b/public/r/organization-invitations-card.json deleted file mode 100644 index 9e2e2006..00000000 --- a/public/r/organization-invitations-card.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-invitations-card", - "type": "registry:component", - "title": "Organization Invitations Card", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/invitation-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-invitations-card.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { InvitationCell } from \"./invitation-cell\"\n\nexport function OrganizationInvitationsCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) return null\n\n return (\n \n )\n}\n\nfunction OrganizationInvitationsContent({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: SettingsCardProps & { organization: Organization }) {\n const {\n hooks: { useListInvitations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: invitations } = useListInvitations({\n query: { organizationId: organization.id }\n })\n\n const pendingInvitations = invitations?.filter(\n (invitation) => invitation.status === \"pending\"\n )\n if (!pendingInvitations?.length) return null\n\n return (\n \n \n {pendingInvitations.map((invitation) => (\n \n ))}\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-logo-card.json b/public/r/organization-logo-card.json deleted file mode 100644 index d59e70ad..00000000 --- a/public/r/organization-logo-card.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-logo-card", - "type": "registry:component", - "title": "Organization Logo Card", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/image-utils.json", - "https://better-auth-ui.com/r/organization-logo.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-card-footer.json", - "https://better-auth-ui.com/r/settings-card-header.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-logo-card.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport {\n type ComponentProps,\n useContext,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { SettingsCardFooter } from \"../settings/shared/settings-card-footer\"\nimport { SettingsCardHeader } from \"../settings/shared/settings-card-header\"\nimport { Button } from \"../ui/button\"\nimport { Card } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { OrganizationLogo } from \"./organization-logo\"\n\nexport interface OrganizationLogoCardProps extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n slug?: string\n}\n\nexport function OrganizationLogoCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: OrganizationLogoCardProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n
\n \n\n \n \n \n
\n\n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationLogoForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationLogoCardProps & { organization: Organization }) {\n const {\n hooks: { useHasPermission },\n localization: authLocalization,\n organization: organizationOptions,\n mutators: { updateOrganization },\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...authLocalization, ...localizationProp }),\n [authLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const { data: hasPermission, isPending: permissionPending } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const isPending = permissionPending\n\n const fileInputRef = useRef(null)\n const [loading, setLoading] = useState(false)\n\n const handleLogoChange = async (file: File) => {\n if (!organizationOptions?.logo || !hasPermission?.success) return\n\n setLoading(true)\n\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n organizationOptions.logo.size,\n organizationOptions.logo.extension\n )\n\n let image: string | undefined | null\n\n if (organizationOptions.logo.upload) {\n image = await organizationOptions.logo.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (!image) {\n setLoading(false)\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { logo: image }\n })\n\n await refetchOrganization?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const handleDeleteLogo = async () => {\n if (!hasPermission?.success) return\n\n setLoading(true)\n\n try {\n if (organization.logo) {\n await organizationOptions?.logo?.delete?.(organization.logo)\n }\n\n await updateOrganization({\n organizationId: organization.id,\n data: { logo: \"\" }\n })\n\n await refetchOrganization?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const openFileDialog = () => {\n fileInputRef.current?.click()\n }\n\n return (\n \n {\n const file = e.target.files?.item(0)\n if (file) handleLogoChange(file)\n\n e.target.value = \"\"\n }}\n />\n\n
\n \n\n \n \n \n \n \n \n\n e.preventDefault()}\n >\n \n \n\n {localization.UPLOAD_LOGO}\n \n\n {organization.logo && (\n \n \n\n {localization.DELETE_LOGO}\n \n )}\n \n \n
\n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-logo.json b/public/r/organization-logo.json deleted file mode 100644 index 375a7294..00000000 --- a/public/r/organization-logo.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-logo", - "type": "registry:component", - "title": "Organization Logo", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "avatar", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-logo.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { BuildingIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationLogoClassNames {\n base?: string\n image?: string\n fallback?: string\n fallbackIcon?: string\n skeleton?: string\n}\n\nexport interface OrganizationLogoProps {\n classNames?: OrganizationLogoClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\" | null\n organization?: Partial | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays an organization logo with image and fallback support\n *\n * Renders an organization's logo image when available, with appropriate fallbacks:\n * - Shows a skeleton when isPending is true\n * - Falls back to a building icon when no logo is available\n */\nexport function OrganizationLogo({\n className,\n classNames,\n isPending,\n size,\n organization,\n localization: propLocalization,\n ...props\n}: OrganizationLogoProps & ComponentProps) {\n const { localization: contextLocalization, avatar } =\n useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n const name = organization?.name\n const src = organization?.logo\n\n if (isPending) {\n return (\n \n )\n }\n\n return (\n \n {avatar?.Image ? (\n \n ) : (\n \n )}\n\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-members-card.json b/public/r/organization-members-card.json deleted file mode 100644 index bae0eb20..00000000 --- a/public/r/organization-members-card.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-members-card", - "type": "registry:component", - "title": "Organization Members Card", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/invite-member-dialog.json", - "https://better-auth-ui.com/r/member-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-members-card.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { InviteMemberDialog } from \"./invite-member-dialog\"\nimport { MemberCell } from \"./member-cell\"\n\nexport function OrganizationMembersCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: SettingsCardProps & { slug?: string }) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationMembersContent({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: SettingsCardProps & { organization: Organization }) {\n const {\n hooks: { useHasPermission, useListMembers },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: hasPermissionInvite, isPending: isPendingInvite } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n invitation: [\"create\"]\n }\n })\n\n const {\n data: hasPermissionUpdateMember,\n isPending: isPendingUpdateMember\n } = useHasPermission({\n organizationId: organization.id,\n permission: {\n member: [\"update\"]\n }\n })\n\n const isPending = isPendingInvite || isPendingUpdateMember\n\n const { data } = useListMembers({\n query: { organizationId: organization.id }\n })\n\n const members = data?.members\n\n const [inviteDialogOpen, setInviteDialogOpen] = useState(false)\n\n return (\n <>\n setInviteDialogOpen(true)}\n isPending={isPending}\n disabled={!hasPermissionInvite?.success}\n {...props}\n >\n {!isPending && members && members.length > 0 && (\n \n {members\n .sort(\n (a, b) =>\n new Date(a.createdAt).getTime() -\n new Date(b.createdAt).getTime()\n )\n .map((member) => (\n \n ))}\n \n )}\n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-name-card.json b/public/r/organization-name-card.json deleted file mode 100644 index 0ca5eeb7..00000000 --- a/public/r/organization-name-card.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-name-card", - "type": "registry:component", - "title": "Organization Name Card", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-name-card.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport {\n SettingsCard,\n type SettingsCardProps\n} from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { Form, FormControl, FormField, FormItem, FormMessage } from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationNameCardProps extends SettingsCardProps {\n slug?: string\n}\n\nexport function OrganizationNameCard({\n className,\n classNames,\n localization: localizationProp,\n slug,\n ...props\n}: OrganizationNameCardProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationNameForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationNameCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission },\n mutators: { updateOrganization },\n optimistic,\n toast\n } = useContext(AuthUIContext)\n\n const localization = { ...contextLocalization, ...localizationProp }\n\n const { data: hasPermission, isPending: permissionPending } =\n useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const isPending = permissionPending\n\n const formSchema = z.object({\n name: z.string().min(1, {\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_REQUIRED}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: { name: organization.name || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateOrganizationName = async ({\n name\n }: z.infer) => {\n if (organization.name === name) {\n toast({\n variant: \"error\",\n message: `${localization.ORGANIZATION_NAME} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { name }\n })\n\n await refetchOrganization?.()\n\n toast({\n variant: \"success\",\n message: `${localization.ORGANIZATION_NAME} ${localization.UPDATED_SUCCESSFULLY}`\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-options.json b/public/r/organization-options.json deleted file mode 100644 index c60b4eb9..00000000 --- a/public/r/organization-options.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-options", - "type": "registry:file", - "title": "Organization Options", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/types/organization-options.ts", - "content": "export type OrganizationLogoOptions = {\n /**\n * Upload a logo image and return the URL string\n * @remarks `(file: File) => Promise`\n */\n upload?: (file: File) => Promise\n /**\n * Delete a previously uploaded logo image from your storage/CDN\n * @remarks `(url: string) => Promise`\n */\n delete?: (url: string) => Promise\n /**\n * Logo size for resizing\n * @default 256 if upload is provided, 128 otherwise\n */\n size: number\n /**\n * File extension for logo uploads\n * @default \"png\"\n */\n extension: string\n}\n\nimport type { OrganizationViewPaths } from \"../lib/view-paths\"\n\nexport type OrganizationOptions = {\n /**\n * Logo configuration\n * @default undefined\n */\n logo?: boolean | Partial\n /**\n * Custom roles to add to the built-in roles (owner, admin, member)\n * @default []\n */\n customRoles?: Array<{ role: string; label: string }>\n /**\n * Enable or disable API key support for organizations\n * @default false\n */\n apiKey?: boolean\n /**\n * Base path for organization-scoped views (supports slugged or static base)\n * When using slug paths, set this to the common prefix (e.g. \"/organization\")\n */\n basePath?: string\n /**\n * Organization path mode\n * - \"default\": use active-organization based routes\n * - \"slug\": use slug-based URLs where slug becomes the first path segment\n * e.g. \"/[slug]/members\" (or `${basePath}/[slug]/members` if basePath provided)\n * @default \"default\"\n */\n pathMode?: \"default\" | \"slug\"\n /**\n * The current organization slug\n */\n slug?: string\n /**\n * The path to redirect to when Personal Account is selected\n */\n personalPath?: string\n /**\n * Customize organization view paths\n */\n viewPaths?: Partial\n}\n\nexport type OrganizationOptionsContext = {\n /**\n * Logo configuration\n * @default undefined\n */\n logo?: OrganizationLogoOptions\n /**\n * Custom roles to add to the built-in roles (owner, admin, member)\n * @default []\n */\n customRoles: Array<{ role: string; label: string }>\n /**\n * Enable or disable API key support for organizations\n * @default false\n */\n apiKey?: boolean\n /**\n * Base path for organization-scoped views\n */\n basePath: string\n /**\n * Organization path mode\n * @default \"default\"\n */\n pathMode?: \"default\" | \"slug\"\n /**\n * The current organization slug\n */\n slug?: string\n /**\n * The path to redirect to when Personal Account is selected\n */\n personalPath?: string\n /**\n * Customize organization view paths\n */\n viewPaths: OrganizationViewPaths\n}\n", - "type": "registry:file", - "target": "types/organization-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-refetcher.json b/public/r/organization-refetcher.json deleted file mode 100644 index 469cda25..00000000 --- a/public/r/organization-refetcher.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-refetcher", - "type": "registry:lib", - "title": "Organization Refetcher", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-current-organization.json" - ], - "files": [ - { - "path": "src/lib/organization-refetcher.tsx", - "content": "import { useContext, useEffect } from \"react\"\nimport { useCurrentOrganization } from \"../hooks/use-current-organization\"\nimport { AuthUIContext } from \"./auth-ui-provider\"\n\nexport const OrganizationRefetcher = () => {\n const {\n hooks: { useListOrganizations, useSession },\n organization: organizationOptions,\n navigate,\n redirectTo\n } = useContext(AuthUIContext)\n\n const { slug, pathMode, personalPath } = organizationOptions || {}\n\n const { data: sessionData } = useSession()\n\n const {\n data: organization,\n isPending: organizationPending,\n isRefetching: organizationRefetching,\n refetch: refetchOrganization\n } = useCurrentOrganization()\n\n const { refetch: refetchListOrganizations } = useListOrganizations()\n\n const { data: organizations } = useListOrganizations()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Refetch fix\n useEffect(() => {\n if (!sessionData?.user.id) return\n\n if (organization || organizations) {\n refetchOrganization?.()\n refetchListOrganizations?.()\n }\n }, [sessionData?.user.id])\n\n useEffect(() => {\n if (organizationRefetching || organizationPending) return\n\n if (slug && pathMode === \"slug\" && !organization) {\n navigate(personalPath || redirectTo)\n }\n }, [\n organization,\n organizationRefetching,\n organizationPending,\n slug,\n pathMode,\n personalPath,\n navigate,\n redirectTo\n ])\n\n return null\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-settings-cards.json b/public/r/organization-settings-cards.json deleted file mode 100644 index 4b13c723..00000000 --- a/public/r/organization-settings-cards.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-settings-cards", - "type": "registry:component", - "title": "Organization Settings Cards", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/delete-organization-card.json", - "https://better-auth-ui.com/r/organization-logo-card.json", - "https://better-auth-ui.com/r/organization-name-card.json", - "https://better-auth-ui.com/r/organization-slug-card.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-settings-cards.tsx", - "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { DeleteOrganizationCard } from \"./delete-organization-card\"\nimport { OrganizationLogoCard } from \"./organization-logo-card\"\nimport { OrganizationNameCard } from \"./organization-name-card\"\nimport { OrganizationSlugCard } from \"./organization-slug-card\"\n\nexport type OrganizationSettingsCardsProps = {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n slug?: string\n}\n\nexport function OrganizationSettingsCards({\n className,\n classNames,\n localization,\n slug\n}: OrganizationSettingsCardsProps) {\n const { organization: organizationOptions } = useContext(AuthUIContext)\n\n return (\n \n {organizationOptions?.logo && (\n \n )}\n\n \n\n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-slug-card.json b/public/r/organization-slug-card.json deleted file mode 100644 index 8cc950fd..00000000 --- a/public/r/organization-slug-card.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-slug-card", - "type": "registry:component", - "title": "Organization Slug Card", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-slug-card.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport {\n SettingsCard,\n type SettingsCardProps\n} from \"../settings/shared/settings-card\"\nimport { CardContent } from \"../ui/card\"\nimport { Form, FormControl, FormField, FormItem, FormMessage } from \"../ui/form\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\n\nexport interface OrganizationSlugCardProps extends SettingsCardProps {\n slug?: string\n}\n\nexport function OrganizationSlugCard({\n className,\n classNames,\n localization: localizationProp,\n slug: slugProp,\n ...props\n}: OrganizationSlugCardProps) {\n const {\n localization: contextLocalization,\n organization: organizationOptions\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const slug = slugProp || organizationOptions?.slug\n\n const { data: organization } = useCurrentOrganization({ slug })\n\n if (!organization) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n )\n}\n\nfunction OrganizationSlugForm({\n className,\n classNames,\n localization: localizationProp,\n organization,\n ...props\n}: OrganizationSlugCardProps & { organization: Organization }) {\n const {\n localization: contextLocalization,\n hooks: { useHasPermission },\n mutators: { updateOrganization },\n optimistic,\n toast,\n organization: organizationOptions,\n replace\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch: refetchOrganization } = useCurrentOrganization({\n slug: organization.slug\n })\n\n const { data: hasPermission, isPending } = useHasPermission({\n organizationId: organization.id,\n permissions: {\n organization: [\"update\"]\n }\n })\n\n const formSchema = z.object({\n slug: z\n .string()\n .min(1, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_REQUIRED}`\n })\n .regex(/^[a-z0-9-]+$/, {\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_INVALID}`\n })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n values: { slug: organization.slug || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateOrganizationSlug = async ({\n slug\n }: z.infer) => {\n if (organization.slug === slug) {\n toast({\n variant: \"error\",\n message: `${localization.ORGANIZATION_SLUG} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n try {\n await updateOrganization({\n organizationId: organization.id,\n data: { slug }\n })\n\n await refetchOrganization?.()\n\n toast({\n variant: \"success\",\n message: `${localization.ORGANIZATION_SLUG} ${localization.UPDATED_SUCCESSFULLY}`\n })\n\n // If using slug-based paths, redirect to the new slug's settings route\n if (organizationOptions?.pathMode === \"slug\") {\n const basePath = organizationOptions.basePath\n const settingsPath = organizationOptions.viewPaths.SETTINGS\n replace(`${basePath}/${slug}/${settingsPath}`)\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {isPending ? (\n \n ) : (\n (\n \n \n \n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-switcher.json b/public/r/organization-switcher.json deleted file mode 100644 index ebf4f4d3..00000000 --- a/public/r/organization-switcher.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-switcher", - "type": "registry:component", - "title": "Organization Switcher", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/create-organization-dialog.json", - "dropdown-menu", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/organization-logo.json", - "https://better-auth-ui.com/r/personal-account-view.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-switcher.tsx", - "content": "\"use client\"\n\nimport type { Organization } from \"better-auth/plugins/organization\"\nimport {\n ChevronsUpDown,\n LogInIcon,\n PlusCircleIcon,\n SettingsIcon\n} from \"lucide-react\"\nimport {\n type ComponentProps,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { User } from \"../../types/auth-client\"\nimport { Button } from \"../ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { UserAvatar, type UserAvatarClassNames } from \"../user-avatar\"\nimport type { UserViewClassNames } from \"../user-view\"\nimport { CreateOrganizationDialog } from \"./create-organization-dialog\"\nimport {\n OrganizationCellView,\n type OrganizationViewClassNames\n} from \"./organization-cell-view\"\nimport { OrganizationLogo } from \"./organization-logo\"\nimport { PersonalAccountView } from \"./personal-account-view\"\n\nexport interface OrganizationSwitcherClassNames {\n base?: string\n skeleton?: string\n trigger?: {\n base?: string\n avatar?: UserAvatarClassNames\n user?: UserViewClassNames\n organization?: OrganizationViewClassNames\n skeleton?: string\n }\n content?: {\n base?: string\n user?: UserViewClassNames\n organization?: OrganizationViewClassNames\n avatar?: UserAvatarClassNames\n menuItem?: string\n separator?: string\n }\n}\n\nexport interface OrganizationSwitcherProps\n extends Omit, \"trigger\"> {\n classNames?: OrganizationSwitcherClassNames\n align?: \"center\" | \"start\" | \"end\"\n trigger?: ReactNode\n localization?: AuthLocalization\n slug?: string\n onSetActive?: (organization: Organization | null) => void\n /**\n * Hide the personal organization option from the switcher.\n * When true, users can only switch between organizations and cannot access their personal account.\n * If no organization is active, the first available organization will be automatically selected.\n * @default false\n */\n hidePersonal?: boolean\n}\n\n/**\n * Displays an interactive user button with dropdown menu functionality\n *\n * Renders a user interface element that can be displayed as either an icon or full button:\n * - Shows a user avatar or placeholder when in icon mode\n * - Displays user name and email with dropdown indicator in full mode\n * - Provides dropdown menu with authentication options (sign in/out, settings, etc.)\n * - Supports multi-session functionality for switching between accounts\n * - Can be customized with additional links and styling options\n */\nexport function OrganizationSwitcher({\n className,\n classNames,\n align,\n trigger,\n localization: localizationProp,\n slug: slugProp,\n size,\n onSetActive,\n hidePersonal,\n ...props\n}: OrganizationSwitcherProps) {\n const {\n authClient,\n basePath,\n hooks: { useSession, useListOrganizations },\n localization: contextLocalization,\n account: accountOptions,\n organization: organizationOptions,\n redirectTo,\n navigate,\n toast,\n viewPaths,\n Link\n } = useContext(AuthUIContext)\n\n const {\n pathMode,\n slug: contextSlug,\n personalPath\n } = organizationOptions || {}\n\n const slug = slugProp || contextSlug\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const [activeOrganizationPending, setActiveOrganizationPending] =\n useState(false)\n const [isCreateOrgDialogOpen, setIsCreateOrgDialogOpen] = useState(false)\n const [dropdownOpen, setDropdownOpen] = useState(false)\n\n const { data: sessionData, isPending: sessionPending } = useSession()\n const user = sessionData?.user\n\n const { data: organizations, isPending: organizationsPending } =\n useListOrganizations()\n\n const {\n data: activeOrganization,\n isPending: organizationPending,\n isRefetching: organizationRefetching\n } = useCurrentOrganization({ slug })\n\n const isPending =\n organizationsPending ||\n sessionPending ||\n activeOrganizationPending ||\n organizationPending\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (organizationRefetching) return\n\n setActiveOrganizationPending(false)\n }, [activeOrganization, organizationRefetching])\n\n const switchOrganization = useCallback(\n async (organization: Organization | null) => {\n // Prevent switching to personal account when hidePersonal is true\n if (hidePersonal && organization === null) {\n return\n }\n\n if (pathMode === \"slug\") {\n if (organization) {\n navigate(\n `${organizationOptions?.basePath}/${organization.slug}`\n )\n } else {\n navigate(personalPath ?? redirectTo)\n }\n\n return\n }\n\n setActiveOrganizationPending(true)\n\n try {\n onSetActive?.(organization)\n\n await authClient.organization.setActive({\n organizationId: organization?.id || null,\n fetchOptions: {\n throw: true\n }\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setActiveOrganizationPending(false)\n }\n },\n [\n authClient,\n toast,\n localization,\n onSetActive,\n hidePersonal,\n pathMode,\n personalPath,\n organizationOptions?.basePath,\n redirectTo,\n navigate\n ]\n )\n\n // Auto-select first organization when hidePersonal is true\n useEffect(() => {\n if (\n hidePersonal &&\n !activeOrganization &&\n !activeOrganizationPending &&\n organizations &&\n organizations.length > 0 &&\n !sessionPending &&\n !organizationPending &&\n !slug\n ) {\n switchOrganization(organizations[0])\n }\n }, [\n hidePersonal,\n activeOrganization,\n activeOrganizationPending,\n organizations,\n sessionPending,\n organizationPending,\n switchOrganization,\n slug\n ])\n\n return (\n <>\n \n \n {trigger ||\n (size === \"icon\" ? (\n \n {isPending ||\n activeOrganization ||\n !sessionData ||\n (user as User)?.isAnonymous ||\n hidePersonal ? (\n \n ) : (\n \n )}\n \n ) : (\n \n {isPending ||\n activeOrganization ||\n !sessionData ||\n (user as User)?.isAnonymous ||\n hidePersonal ? (\n \n ) : (\n \n )}\n\n \n \n ))}\n \n\n e.preventDefault()}\n >\n \n {(user && !(user as User).isAnonymous) || isPending ? (\n <>\n {activeOrganizationPending ||\n activeOrganization ||\n hidePersonal ? (\n \n ) : (\n \n )}\n\n {!isPending && (\n \n \n setDropdownOpen(false)\n }\n >\n \n \n \n )}\n \n ) : (\n
\n {localization.ORGANIZATION}\n
\n )}\n \n\n \n\n {activeOrganization && !hidePersonal && (\n switchOrganization(null)}\n >\n \n \n )}\n\n {organizations?.map(\n (organization) =>\n organization.id !== activeOrganization?.id && (\n \n switchOrganization(organization)\n }\n >\n \n \n )\n )}\n\n {organizations &&\n organizations.length > 0 &&\n (!hidePersonal || organizations.length > 1) && (\n \n )}\n\n {!isPending &&\n sessionData &&\n !(user as User).isAnonymous ? (\n setIsCreateOrgDialogOpen(true)}\n >\n \n {localization.CREATE_ORGANIZATION}\n \n ) : (\n \n \n \n {localization.SIGN_IN}\n \n \n )}\n \n
\n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organization-view.json b/public/r/organization-view.json deleted file mode 100644 index b7f9d806..00000000 --- a/public/r/organization-view.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organization-view", - "type": "registry:component", - "title": "Organization View", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-view.json", - "https://better-auth-ui.com/r/api-keys-card.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "drawer", - "label", - "https://better-auth-ui.com/r/organization-invitations-card.json", - "https://better-auth-ui.com/r/organization-members-card.json", - "https://better-auth-ui.com/r/organization-settings-cards.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-view.tsx", - "content": "\"use client\"\n\nimport { MenuIcon } from \"lucide-react\"\nimport { useContext, useEffect, useMemo } from \"react\"\n\nimport { useCurrentOrganization } from \"../../hooks/use-current-organization\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getViewByPath } from \"../../lib/utils\"\nimport type { OrganizationViewPath } from \"../../server\"\nimport type { AccountViewProps } from \"../account/account-view\"\nimport { ApiKeysCard } from \"../settings/api-key/api-keys-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger\n} from \"../ui/drawer\"\nimport { Label } from \"../ui/label\"\nimport { OrganizationInvitationsCard } from \"./organization-invitations-card\"\nimport { OrganizationMembersCard } from \"./organization-members-card\"\nimport { OrganizationSettingsCards } from \"./organization-settings-cards\"\n\nexport type OrganizationViewPageProps = Omit & {\n slug?: string\n view?: OrganizationViewPath\n}\n\nexport function OrganizationView({\n className,\n classNames,\n localization: localizationProp,\n pathname,\n view: viewProp,\n hideNav,\n slug: slugProp\n}: OrganizationViewPageProps) {\n const {\n organization: organizationOptions,\n localization: contextLocalization,\n account: accountOptions,\n Link,\n replace\n } = useContext(AuthUIContext)\n\n const { slug: contextSlug, viewPaths, apiKey } = organizationOptions || {}\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const view = viewProp || getViewByPath(viewPaths!, pathname) || \"SETTINGS\"\n\n const slug = slugProp || contextSlug\n\n const {\n data: organization,\n isPending: organizationPending,\n isRefetching: organizationRefetching\n } = useCurrentOrganization({ slug })\n\n const navItems: {\n view: OrganizationViewPath\n label: string\n }[] = [\n { view: \"SETTINGS\", label: localization.SETTINGS },\n { view: \"MEMBERS\", label: localization.MEMBERS }\n ]\n\n if (apiKey) {\n navItems.push({\n view: \"API_KEYS\",\n label: localization.API_KEYS\n })\n }\n\n useEffect(() => {\n if (organization || organizationPending || organizationRefetching)\n return\n\n replace(\n `${accountOptions?.basePath}/${accountOptions?.viewPaths?.ORGANIZATIONS}`\n )\n }, [\n organization,\n organizationPending,\n organizationRefetching,\n accountOptions?.basePath,\n accountOptions?.viewPaths?.ORGANIZATIONS,\n replace\n ])\n\n return (\n \n {!hideNav && (\n
\n \n\n \n \n \n \n\n \n \n \n {localization.ORGANIZATION}\n \n \n
\n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n
\n
\n
\n )}\n\n {!hideNav && (\n
\n \n {navItems.map((item) => (\n \n \n {item.label}\n \n \n ))}\n
\n \n )}\n\n {view === \"MEMBERS\" && (\n \n \n\n \n \n )}\n\n {view === \"API_KEYS\" && (\n \n )}\n\n {view === \"SETTINGS\" && (\n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/organizations-card.json b/public/r/organizations-card.json deleted file mode 100644 index 76e5e9db..00000000 --- a/public/r/organizations-card.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "organizations-card", - "type": "registry:component", - "title": "Organizations Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/create-organization-dialog.json", - "https://better-auth-ui.com/r/organization-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-cell-skeleton.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organizations-card.tsx", - "content": "\"use client\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../settings/skeletons/settings-cell-skeleton\"\nimport { CardContent } from \"../ui/card\"\nimport { CreateOrganizationDialog } from \"./create-organization-dialog\"\nimport { OrganizationCell } from \"./organization-cell\"\n\nexport function OrganizationsCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useListOrganizations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = useMemo(\n () => ({ ...contextLocalization, ...localization }),\n [contextLocalization, localization]\n )\n\n const isHydrated = useIsHydrated()\n const { data: organizations, isPending: organizationsPending } =\n useListOrganizations()\n\n const isPending = !isHydrated || organizationsPending\n\n const [createDialogOpen, setCreateDialogOpen] = useState(false)\n\n return (\n <>\n setCreateDialogOpen(true)}\n isPending={isPending}\n {...props}\n >\n \n {isPending && }\n {organizations?.map((organization) => (\n \n ))}\n \n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/otp-input-group.json b/public/r/otp-input-group.json deleted file mode 100644 index 3ea726ae..00000000 --- a/public/r/otp-input-group.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "otp-input-group", - "type": "registry:component", - "title": "Otp Input Group", - "description": "", - "dependencies": [], - "registryDependencies": [ - "input-otp" - ], - "files": [ - { - "path": "src/components/auth/otp-input-group.tsx", - "content": "\"use client\"\n\nimport { InputOTPGroup, InputOTPSeparator, InputOTPSlot } from \"../ui/input-otp\"\n\nexport function OTPInputGroup({\n otpSeparators = 0\n}: {\n otpSeparators?: 0 | 1 | 2\n}) {\n if (otpSeparators === 0) {\n return (\n \n \n \n \n \n \n \n \n )\n }\n\n if (otpSeparators === 1) {\n return (\n <>\n \n \n \n \n \n\n \n\n \n \n \n \n \n \n )\n }\n\n return (\n <>\n \n \n \n \n\n \n\n \n \n \n \n\n \n\n \n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/passkey-button.json b/public/r/passkey-button.json deleted file mode 100644 index 288d9f04..00000000 --- a/public/r/passkey-button.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "passkey-button", - "type": "registry:component", - "title": "Passkey Button", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/auth-view.json", - "button", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/passkey-button.tsx", - "content": "import { FingerprintIcon } from \"lucide-react\"\nimport { useContext } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport type { AuthViewClassNames } from \"./auth-view\"\n\ninterface PasskeyButtonProps {\n classNames?: AuthViewClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (isSubmitting: boolean) => void\n}\n\nexport function PasskeyButton({\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting\n}: PasskeyButtonProps) {\n const {\n authClient,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess } = useOnSuccessTransition({ redirectTo })\n\n const signInPassKey = async () => {\n setIsSubmitting?.(true)\n\n try {\n const response = await authClient.signIn.passkey({\n fetchOptions: { throw: true }\n })\n\n if (response?.error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({\n error: response.error,\n localization\n })\n })\n\n setIsSubmitting?.(false)\n } else {\n onSuccess()\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsSubmitting?.(false)\n }\n }\n\n return (\n \n \n {localization.SIGN_IN_WITH} {localization.PASSKEY}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/passkey-cell.json b/public/r/passkey-cell.json deleted file mode 100644 index 86aa4c70..00000000 --- a/public/r/passkey-cell.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "passkey-cell", - "type": "registry:component", - "title": "Passkey Cell", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/session-freshness-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/passkey/passkey-cell.tsx", - "content": "\"use client\"\n\nimport { FingerprintIcon, Loader2 } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport { SessionFreshnessDialog } from \"../shared/session-freshness-dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface PasskeyCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n passkey: { id: string; createdAt: Date }\n}\n\nexport function PasskeyCell({\n className,\n classNames,\n localization,\n passkey\n}: PasskeyCellProps) {\n const {\n freshAge,\n hooks: { useSession, useListPasskeys },\n localization: contextLocalization,\n mutators: { deletePasskey },\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { refetch } = useListPasskeys()\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n\n const [showFreshnessDialog, setShowFreshnessDialog] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n\n const handleDeletePasskey = async () => {\n // If session isn't fresh, show the freshness dialog\n if (!isFresh) {\n setShowFreshnessDialog(true)\n return\n }\n\n setIsLoading(true)\n\n try {\n await deletePasskey({ id: passkey.id })\n refetch?.()\n } catch (error) {\n setIsLoading(false)\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n <>\n \n\n \n
\n \n \n {new Date(passkey.createdAt).toLocaleString()}\n \n
\n\n \n {isLoading && }\n\n {localization.DELETE}\n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/passkey-error-codes.json b/public/r/passkey-error-codes.json deleted file mode 100644 index 318fed19..00000000 --- a/public/r/passkey-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "passkey-error-codes", - "type": "registry:file", - "title": "Passkey Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/passkey-error-codes.ts", - "content": "export const PASSKEY_ERROR_CODES = {\n CHALLENGE_NOT_FOUND: \"Challenge not found\",\n YOU_ARE_NOT_ALLOWED_TO_REGISTER_THIS_PASSKEY:\n \"You are not allowed to register this passkey\",\n FAILED_TO_VERIFY_REGISTRATION: \"Failed to verify registration\",\n PASSKEY_NOT_FOUND: \"Passkey not found\",\n AUTHENTICATION_FAILED: \"Authentication failed\",\n UNABLE_TO_CREATE_SESSION: \"Unable to create session\",\n FAILED_TO_UPDATE_PASSKEY: \"Failed to update passkey\"\n}\n", - "type": "registry:file", - "target": "localization/passkey-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/passkeys-card.json b/public/r/passkeys-card.json deleted file mode 100644 index 1db869eb..00000000 --- a/public/r/passkeys-card.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "passkeys-card", - "type": "registry:component", - "title": "Passkeys Card", - "description": "", - "dependencies": [ - "react-hook-form" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "https://better-auth-ui.com/r/passkey-cell.json", - "https://better-auth-ui.com/r/session-freshness-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/passkey/passkeys-card.tsx", - "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport { Form } from \"../../ui/form\"\nimport { SessionFreshnessDialog } from \"../shared/session-freshness-dialog\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { PasskeyCell } from \"./passkey-cell\"\n\nexport interface PasskeysCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function PasskeysCard({\n className,\n classNames,\n localization\n}: PasskeysCardProps) {\n const {\n authClient,\n freshAge,\n hooks: { useListPasskeys, useSession },\n localization: authLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...authLocalization, ...localization }\n\n const { data: passkeys, isPending, refetch } = useListPasskeys()\n\n const { data: sessionData } = useSession()\n const session = sessionData?.session\n const isFresh = session\n ? Date.now() - new Date(session?.createdAt).getTime() < freshAge * 1000\n : false\n\n const [showFreshnessDialog, setShowFreshnessDialog] = useState(false)\n\n const addPasskey = async () => {\n // If session isn't fresh, show the freshness dialog\n if (!isFresh) {\n setShowFreshnessDialog(true)\n return\n }\n\n try {\n await authClient.passkey.addPasskey({\n fetchOptions: { throw: true }\n })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n const form = useForm()\n\n return (\n <>\n \n\n
\n \n \n {passkeys && passkeys.length > 0 && (\n \n {passkeys?.map((passkey) => (\n \n ))}\n \n )}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/password-input.json b/public/r/password-input.json deleted file mode 100644 index 2f5817d4..00000000 --- a/public/r/password-input.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "password-input", - "type": "registry:component", - "title": "Password Input", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "button", - "input", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/password-input.tsx", - "content": "\"use client\"\n\nimport { EyeIcon, EyeOffIcon } from \"lucide-react\"\nimport { type ComponentProps, useState } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./ui/button\"\nimport { Input } from \"./ui/input\"\n\nexport function PasswordInput({\n className,\n enableToggle,\n onChange,\n ...props\n}: ComponentProps & { enableToggle?: boolean }) {\n const [disabled, setDisabled] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n return (\n
\n {\n setDisabled(!event.target.value)\n onChange?.(event)\n }}\n />\n\n {enableToggle && (\n <>\n setIsVisible(!isVisible)}\n >\n {isVisible ? : }\n \n\n \n \n )}\n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/password-validation.json b/public/r/password-validation.json deleted file mode 100644 index 636bea10..00000000 --- a/public/r/password-validation.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "password-validation", - "type": "registry:file", - "title": "Password Validation", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/password-validation.ts", - "content": "export type PasswordValidation = {\n /**\n * Maximum password length\n */\n maxLength?: number\n\n /**\n * Minimum password length\n */\n minLength?: number\n\n /**\n * Password validation regex\n */\n regex?: RegExp\n}\n", - "type": "registry:file", - "target": "types/password-validation.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/personal-account-view.json b/public/r/personal-account-view.json deleted file mode 100644 index a486b698..00000000 --- a/public/r/personal-account-view.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "personal-account-view", - "type": "registry:component", - "title": "Personal Account View", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "skeleton", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/personal-account-view.tsx", - "content": "\"use client\"\n\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { UserAvatar } from \"../user-avatar\"\nimport type { UserViewProps } from \"../user-view\"\n\n/**\n * Displays user information with avatar and details in a compact view for personal accounts\n *\n * Renders a user's profile information with appropriate fallbacks:\n * - Shows avatar alongside user name and \"Personal Account\" subtitle when available\n * - Shows loading skeletons when isPending is true\n * - Falls back to generic \"User\" text when neither name nor email is available\n * - Always shows \"Personal Account\" as subtitle for default and lg sizes\n * - Supports customization through classNames prop\n */\nexport function PersonalAccountView({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization\n}: UserViewProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n return (\n \n \n\n \n {isPending ? (\n <>\n \n\n {size !== \"sm\" && (\n \n )}\n \n ) : (\n <>\n \n {user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email ||\n localization?.USER}\n \n\n {size !== \"sm\" && (\n \n {localization?.PERSONAL_ACCOUNT}\n \n )}\n \n )}\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/phone-number-error-codes.json b/public/r/phone-number-error-codes.json deleted file mode 100644 index 3dce253e..00000000 --- a/public/r/phone-number-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "phone-number-error-codes", - "type": "registry:file", - "title": "Phone Number Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/phone-number-error-codes.ts", - "content": "export const PHONE_NUMBER_ERROR_CODES = {\n INVALID_PHONE_NUMBER: \"Invalid phone number\",\n PHONE_NUMBER_EXIST: \"Phone number already exists\",\n INVALID_PHONE_NUMBER_OR_PASSWORD: \"Invalid phone number or password\",\n UNEXPECTED_ERROR: \"Unexpected error\",\n OTP_NOT_FOUND: \"OTP not found\",\n OTP_EXPIRED: \"OTP expired\",\n INVALID_OTP: \"Invalid OTP\",\n PHONE_NUMBER_NOT_VERIFIED: \"Phone number not verified\"\n}\n", - "type": "registry:file", - "target": "localization/phone-number-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/profile.json b/public/r/profile.json deleted file mode 100644 index 47c7828c..00000000 --- a/public/r/profile.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "profile", - "type": "registry:file", - "title": "Profile", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/profile.ts", - "content": "export type Profile = {\n id?: string | number\n email?: string | null\n name?: string | null\n displayUsername?: string | null\n username?: string | null\n displayName?: string | null\n firstName?: string | null\n fullName?: string | null\n isAnonymous?: boolean | null\n emailVerified?: boolean | null\n image?: string | null\n avatar?: string | null\n avatarUrl?: string | null\n}\n", - "type": "registry:file", - "target": "types/profile.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/provider-button.json b/public/r/provider-button.json deleted file mode 100644 index ec1e9f39..00000000 --- a/public/r/provider-button.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "provider-button", - "type": "registry:component", - "title": "Provider Button", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/auth-view.json", - "button", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/provider-button.tsx", - "content": "import type { SocialProvider } from \"better-auth/social-providers\"\nimport { useCallback, useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport type { Provider } from \"../../lib/social-providers\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { Button } from \"../ui/button\"\nimport type { AuthViewClassNames } from \"./auth-view\"\n\ninterface ProviderButtonProps {\n className?: string\n classNames?: AuthViewClassNames\n callbackURL?: string\n isSubmitting: boolean\n localization: Partial\n other?: boolean\n provider: Provider\n redirectTo?: string\n socialLayout: \"auto\" | \"horizontal\" | \"grid\" | \"vertical\"\n setIsSubmitting: (isSubmitting: boolean) => void\n}\n\nexport function ProviderButton({\n className,\n classNames,\n callbackURL: callbackURLProp,\n isSubmitting,\n localization,\n other,\n provider,\n redirectTo: redirectToProp,\n socialLayout,\n setIsSubmitting\n}: ProviderButtonProps) {\n const {\n authClient,\n basePath,\n baseURL,\n persistClient,\n redirectTo: contextRedirectTo,\n viewPaths,\n social,\n genericOAuth,\n toast\n } = useContext(AuthUIContext)\n\n const getRedirectTo = useCallback(\n () =>\n redirectToProp || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectToProp, contextRedirectTo]\n )\n\n const getCallbackURL = useCallback(\n () =>\n `${baseURL}${\n callbackURLProp ||\n (persistClient\n ? `${basePath}/${viewPaths.CALLBACK}?redirectTo=${getRedirectTo()}`\n : getRedirectTo())\n }`,\n [\n callbackURLProp,\n persistClient,\n basePath,\n viewPaths,\n baseURL,\n getRedirectTo\n ]\n )\n\n const doSignInSocial = async () => {\n setIsSubmitting(true)\n\n try {\n if (other) {\n const oauth2Params = {\n providerId: provider.provider,\n callbackURL: getCallbackURL(),\n fetchOptions: { throw: true }\n }\n\n if (genericOAuth?.signIn) {\n await genericOAuth.signIn(oauth2Params)\n\n setTimeout(() => {\n setIsSubmitting(false)\n }, 10000)\n } else {\n await authClient.signIn.oauth2(oauth2Params)\n }\n } else {\n const socialParams = {\n provider: provider.provider as SocialProvider,\n callbackURL: getCallbackURL(),\n fetchOptions: { throw: true }\n }\n\n if (social?.signIn) {\n await social.signIn(socialParams)\n\n setTimeout(() => {\n setIsSubmitting(false)\n }, 10000)\n } else {\n await authClient.signIn.social(socialParams)\n }\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsSubmitting(false)\n }\n }\n\n return (\n \n {provider.icon && (\n \n )}\n\n {socialLayout === \"grid\" && provider.name}\n {socialLayout === \"vertical\" &&\n `${localization.SIGN_IN_WITH} ${provider.name}`}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/provider-cell.json b/public/r/provider-cell.json deleted file mode 100644 index be8372c2..00000000 --- a/public/r/provider-cell.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "provider-cell", - "type": "registry:component", - "title": "Provider Cell", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/providers/provider-cell.tsx", - "content": "\"use client\"\n\nimport type { SocialProvider } from \"better-auth/social-providers\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { Provider } from \"../../../lib/social-providers\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface ProviderCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n account?: {\n accountId: string\n provider: string\n } | null\n isPending?: boolean\n localization?: Partial\n other?: boolean\n provider: Provider\n refetch?: Refetch\n}\n\nexport function ProviderCell({\n className,\n classNames,\n account,\n localization,\n other,\n provider,\n refetch\n}: ProviderCellProps) {\n const {\n authClient,\n basePath,\n baseURL,\n localization: contextLocalization,\n mutators: { unlinkAccount },\n viewPaths,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const [isLoading, setIsLoading] = useState(false)\n\n const handleLink = async () => {\n setIsLoading(true)\n const callbackURL = `${baseURL}${basePath}/${viewPaths.CALLBACK}?redirectTo=${window.location.pathname}`\n\n try {\n if (other) {\n await authClient.oauth2.link({\n providerId: provider.provider as SocialProvider,\n callbackURL,\n fetchOptions: { throw: true }\n })\n } else {\n await authClient.linkSocial({\n provider: provider.provider as SocialProvider,\n callbackURL,\n fetchOptions: { throw: true }\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsLoading(false)\n }\n }\n\n const handleUnlink = async () => {\n setIsLoading(true)\n\n try {\n await unlinkAccount({\n accountId: account?.accountId,\n providerId: provider.provider\n })\n\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n return (\n \n {provider.icon && (\n \n )}\n\n
\n
{provider.name}
\n\n {account && }\n
\n\n \n {isLoading && }\n {account ? localization.UNLINK : localization.LINK}\n \n \n )\n}\n\nfunction AccountInfo({ account }: { account: { accountId: string } }) {\n const {\n hooks: { useAccountInfo }\n } = useContext(AuthUIContext)\n\n const { data: accountInfo, isPending } = useAccountInfo({\n accountId: account.accountId\n })\n\n if (isPending) {\n return \n }\n\n if (!accountInfo) return null\n\n return (\n
\n {accountInfo?.user.email}\n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/provider-icons.json b/public/r/provider-icons.json deleted file mode 100644 index 09ee8c6b..00000000 --- a/public/r/provider-icons.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "provider-icons", - "type": "registry:component", - "title": "Provider Icons", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/components/provider-icons.tsx", - "content": "import type { ComponentType } from \"react\"\n\nexport interface ProviderIconProps {\n className?: string\n}\n\nexport type ProviderIcon = ComponentType\n\nexport const AppleIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const DiscordIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const DropboxIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const FacebookIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n \n)\n\nexport const GitHubIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const GitLabIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n \n \n \n \n \n)\n\nexport const GoogleIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n\n \n\n \n \n)\n\nexport const HuggingFaceIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const KickIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const LinearIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const LinkedInIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n)\n\nexport const MicrosoftIcon: ProviderIcon = ({ className }) => (\n \n \n \n \n \n \n)\n\nexport const NotionIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const RedditIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n \n)\n\nexport const RobloxIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const SlackIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const SpotifyIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const TikTokIcon: ProviderIcon = ({ className }) => (\n \n \n\n \n\n \n \n)\n\nexport const TwitchIcon: ProviderIcon = ({ className }) => (\n \n \n\n Asset 2\n\n \n \n\n \n \n \n\n \n \n \n \n \n \n)\n\nexport const VKIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const XIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n\nexport const ZoomIcon: ProviderIcon = ({ className }) => (\n \n \n \n)\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/providers-card.json b/public/r/providers-card.json deleted file mode 100644 index e8bffe61..00000000 --- a/public/r/providers-card.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "providers-card", - "type": "registry:component", - "title": "Providers Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/provider-cell.json", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-cell-skeleton.json", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/providers/providers-card.tsx", - "content": "\"use client\"\n\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { socialProviders } from \"../../../lib/social-providers\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../skeletons/settings-cell-skeleton\"\nimport { ProviderCell } from \"./provider-cell\"\n\nexport interface ProvidersCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n accounts?: { accountId: string; provider: string }[] | null\n isPending?: boolean\n localization?: Partial\n skipHook?: boolean\n refetch?: Refetch\n}\n\nexport function ProvidersCard({\n className,\n classNames,\n accounts,\n isPending,\n localization,\n skipHook,\n refetch\n}: ProvidersCardProps) {\n const {\n hooks: { useListAccounts },\n localization: contextLocalization,\n social,\n genericOAuth\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n if (!skipHook) {\n const result = useListAccounts()\n accounts = result.data\n isPending = result.isPending\n refetch = result.refetch\n }\n\n return (\n \n \n {isPending ? (\n social?.providers?.map((provider) => (\n \n ))\n ) : (\n <>\n {social?.providers?.map((provider) => {\n const socialProvider = socialProviders.find(\n (socialProvider) =>\n socialProvider.provider === provider\n )\n\n if (!socialProvider) return null\n\n return (\n acc.provider === provider\n )}\n provider={socialProvider}\n refetch={refetch}\n />\n )\n })}\n\n {genericOAuth?.providers?.map((provider) => (\n acc.provider === provider.provider\n )}\n provider={provider}\n refetch={refetch}\n other\n />\n ))}\n \n )}\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/recaptcha-badge.json b/public/r/recaptcha-badge.json deleted file mode 100644 index 494defb9..00000000 --- a/public/r/recaptcha-badge.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "recaptcha-badge", - "type": "registry:component", - "title": "Recaptcha Badge", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/captcha/recaptcha-badge.tsx", - "content": "import { useContext } from \"react\"\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\n\nexport interface RecaptchaBadgeProps {\n className?: string\n localization?: Partial\n}\n\nexport function RecaptchaBadge({\n className,\n localization: propLocalization\n}: RecaptchaBadgeProps) {\n const isHydrated = useIsHydrated()\n const { captcha, localization: contextLocalization } =\n useContext(AuthUIContext)\n const localization = { ...contextLocalization, ...propLocalization }\n\n if (!captcha) return null\n\n if (!captcha.hideBadge) {\n return isHydrated ? (\n \n ) : null\n }\n\n return (\n <>\n \n\n

\n {localization.PROTECTED_BY_RECAPTCHA}{\" \"}\n {localization.BY_CONTINUING_YOU_AGREE} Google{\" \"}\n \n {localization.PRIVACY_POLICY}\n {\" \"}\n &{\" \"}\n \n {localization.TERMS_OF_SERVICE}\n \n .\n

\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/recaptcha-v2.json b/public/r/recaptcha-v2.json deleted file mode 100644 index 51f47ad4..00000000 --- a/public/r/recaptcha-v2.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "recaptcha-v2", - "type": "registry:component", - "title": "Recaptcha V2", - "description": "", - "dependencies": [ - "react-google-recaptcha" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/use-theme.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/captcha/recaptcha-v2.tsx", - "content": "import { type RefObject, useContext, useEffect } from \"react\"\nimport ReCAPTCHA from \"react-google-recaptcha\"\nimport { useLang } from \"../../hooks/use-lang\"\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\n\nexport function RecaptchaV2({ ref }: { ref: RefObject }) {\n const { captcha } = useContext(AuthUIContext)\n const { theme } = useTheme()\n const { lang } = useLang()\n\n useEffect(() => {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n ;(window as any).recaptchaOptions = {\n useRecaptchaNet: captcha?.recaptchaNet,\n enterprise: captcha?.enterprise\n }\n }, [captcha])\n\n if (!captcha) return null\n\n return (\n <>\n \n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/recaptcha-v3.json b/public/r/recaptcha-v3.json deleted file mode 100644 index f6202d54..00000000 --- a/public/r/recaptcha-v3.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "recaptcha-v3", - "type": "registry:component", - "title": "Recaptcha V3", - "description": "", - "dependencies": [ - "@wojtekmaj/react-recaptcha-v3" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/use-theme.json" - ], - "files": [ - { - "path": "src/components/captcha/recaptcha-v3.tsx", - "content": "import {\n GoogleReCaptchaProvider,\n useGoogleReCaptcha\n} from \"@wojtekmaj/react-recaptcha-v3\"\nimport { type ReactNode, useContext, useEffect } from \"react\"\n\nimport { useIsHydrated } from \"../../hooks/use-hydrated\"\nimport { useLang } from \"../../hooks/use-lang\"\nimport { useTheme } from \"../../hooks/use-theme\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function RecaptchaV3({ children }: { children: ReactNode }) {\n const isHydrated = useIsHydrated()\n const { captcha } = useContext(AuthUIContext)\n\n if (captcha?.provider !== \"google-recaptcha-v3\") return children\n\n return (\n \n {isHydrated && (\n \n )}\n\n \n\n {children}\n \n )\n}\n\nfunction RecaptchaV3Style() {\n const { executeRecaptcha } = useGoogleReCaptcha()\n const { theme } = useTheme()\n const { lang } = useLang()\n\n useEffect(() => {\n if (!executeRecaptcha) return\n\n const updateRecaptcha = async () => {\n // find iframe with title \"reCAPTCHA\"\n const iframe = document.querySelector(\n \"iframe[title='reCAPTCHA']\"\n ) as HTMLIFrameElement\n if (iframe) {\n const iframeSrcUrl = new URL(iframe.src)\n iframeSrcUrl.searchParams.set(\"theme\", theme)\n if (lang) iframeSrcUrl.searchParams.set(\"hl\", lang)\n iframe.src = iframeSrcUrl.toString()\n }\n }\n\n updateRecaptcha()\n }, [executeRecaptcha, theme, lang])\n\n return null\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/recover-account-form.json b/public/r/recover-account-form.json deleted file mode 100644 index aedee6d9..00000000 --- a/public/r/recover-account-form.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "recover-account-form", - "type": "registry:component", - "title": "Recover Account Form", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "form", - "input", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/recover-account-form.tsx", - "content": "\"use client\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface RecoverAccountFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n}\n\nexport function RecoverAccountForm({\n className,\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting\n}: RecoverAccountFormProps) {\n const {\n authClient,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const formSchema = z.object({\n code: z.string().min(1, { message: localization.BACKUP_CODE_REQUIRED })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n code: \"\"\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n async function verifyBackupCode({ code }: z.infer) {\n try {\n await authClient.twoFactor.verifyBackupCode({\n code,\n fetchOptions: { throw: true }\n })\n\n await onSuccess()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n (\n \n \n {localization.BACKUP_CODE}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n {isSubmitting ? (\n \n ) : (\n localization.RECOVER_ACCOUNT_ACTION\n )}\n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/redirect-to-sign-in.json b/public/r/redirect-to-sign-in.json deleted file mode 100644 index 30ba11c9..00000000 --- a/public/r/redirect-to-sign-in.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "redirect-to-sign-in", - "type": "registry:component", - "title": "Redirect To Sign In", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/use-authenticate.json" - ], - "files": [ - { - "path": "src/components/redirect-to-sign-in.tsx", - "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { useAuthenticate } from \"../hooks/use-authenticate\"\n\n/**\n * Redirects the user to the sign-in page\n *\n * Renders nothing and automatically redirects the current user to the authentication\n * sign-in page. Useful for protecting routes that require authentication or\n * redirecting users to sign in from various parts of the application.\n */\nexport function RedirectToSignIn(): ReactNode {\n useAuthenticate({ authView: \"SIGN_IN\" })\n return null\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/redirect-to-sign-up.json b/public/r/redirect-to-sign-up.json deleted file mode 100644 index 8cb01cd8..00000000 --- a/public/r/redirect-to-sign-up.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "redirect-to-sign-up", - "type": "registry:component", - "title": "Redirect To Sign Up", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/use-authenticate.json" - ], - "files": [ - { - "path": "src/components/redirect-to-sign-up.tsx", - "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { useAuthenticate } from \"../hooks/use-authenticate\"\n\n/**\n * Redirects the user to the sign-up page\n *\n * Renders nothing and automatically redirects the current user to the authentication\n * sign-up page. Useful for directing new users to create an account or\n * for redirecting from marketing pages to the registration flow.\n */\nexport function RedirectToSignUp(): ReactNode {\n useAuthenticate({ authView: \"SIGN_UP\" })\n return null\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/refetch.json b/public/r/refetch.json deleted file mode 100644 index 97c80c1f..00000000 --- a/public/r/refetch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "refetch", - "type": "registry:file", - "title": "Refetch", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/refetch.ts", - "content": "export type Refetch = () => Promise | unknown\n", - "type": "registry:file", - "target": "types/refetch.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/remove-member-dialog.json b/public/r/remove-member-dialog.json deleted file mode 100644 index 00631db9..00000000 --- a/public/r/remove-member-dialog.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "remove-member-dialog", - "type": "registry:component", - "title": "Remove Member Dialog", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/member-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/remove-member-dialog.tsx", - "content": "\"use client\"\n\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport { MemberCell } from \"./member-cell\"\n\nexport interface RemoveMemberDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n member: Member & { user?: Partial | null }\n}\n\nexport function RemoveMemberDialog({\n member,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: RemoveMemberDialogProps) {\n const {\n authClient,\n hooks: { useListMembers },\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { refetch } = useListMembers({\n query: { organizationId: member.organizationId }\n })\n\n const [isRemoving, setIsRemoving] = useState(false)\n\n const removeMember = async () => {\n setIsRemoving(true)\n\n try {\n await authClient.organization.removeMember({\n memberIdOrEmail: member.id,\n organizationId: member.organizationId,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.REMOVE_MEMBER_SUCCESS\n })\n\n await refetch?.()\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsRemoving(false)\n }\n\n return (\n \n e.preventDefault()}\n >\n \n \n {localization.REMOVE_MEMBER}\n \n\n \n {localization.REMOVE_MEMBER_CONFIRM}\n \n \n\n \n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isRemoving}\n >\n {localization.CANCEL}\n \n\n \n {isRemoving && }\n\n {localization.REMOVE_MEMBER}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/render-toast.json b/public/r/render-toast.json deleted file mode 100644 index 2076238c..00000000 --- a/public/r/render-toast.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "render-toast", - "type": "registry:file", - "title": "Render Toast", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/render-toast.ts", - "content": "type ToastVariant = \"default\" | \"success\" | \"error\" | \"info\" | \"warning\"\n\nexport type RenderToast = ({\n variant,\n message\n}: {\n variant?: ToastVariant\n message?: string\n}) => void\n", - "type": "registry:file", - "target": "types/render-toast.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/reset-password-form.json b/public/r/reset-password-form.json deleted file mode 100644 index 0869b827..00000000 --- a/public/r/reset-password-form.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "reset-password-form", - "type": "registry:component", - "title": "Reset Password Form", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "form", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/reset-password-form.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getPasswordSchema } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface ResetPasswordFormProps {\n className?: string\n classNames?: AuthFormClassNames\n localization: Partial\n passwordValidation?: PasswordValidation\n}\n\nexport function ResetPasswordForm({\n className,\n classNames,\n localization,\n passwordValidation\n}: ResetPasswordFormProps) {\n const tokenChecked = useRef(false)\n\n const {\n authClient,\n basePath,\n credentials,\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const formSchema = z\n .object({\n newPassword: getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.NEW_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n }),\n confirmPassword: confirmPasswordEnabled\n ? getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n : z.string().optional()\n })\n .refine(\n (data) =>\n !confirmPasswordEnabled ||\n data.newPassword === data.confirmPassword,\n {\n message: localization.PASSWORDS_DO_NOT_MATCH,\n path: [\"confirmPassword\"]\n }\n )\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n newPassword: \"\",\n confirmPassword: \"\"\n }\n })\n\n const isSubmitting = form.formState.isSubmitting\n\n useEffect(() => {\n if (tokenChecked.current) return\n tokenChecked.current = true\n\n const searchParams = new URLSearchParams(window.location.search)\n const token = searchParams.get(\"token\")\n\n if (!token || token === \"INVALID_TOKEN\") {\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n toast({ variant: \"error\", message: localization.INVALID_TOKEN })\n }\n }, [basePath, navigate, toast, viewPaths, localization])\n\n async function resetPassword({ newPassword }: z.infer) {\n try {\n const searchParams = new URLSearchParams(window.location.search)\n const token = searchParams.get(\"token\") as string\n\n await authClient.resetPassword({\n newPassword,\n token,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.RESET_PASSWORD_SUCCESS\n })\n\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n (\n \n \n {localization.NEW_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {localization.CONFIRM_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n \n {isSubmitting ? (\n \n ) : (\n localization.RESET_PASSWORD_ACTION\n )}\n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/security-settings-cards.json b/public/r/security-settings-cards.json deleted file mode 100644 index 34ba6ac0..00000000 --- a/public/r/security-settings-cards.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "security-settings-cards", - "type": "registry:component", - "title": "Security Settings Cards", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/change-password-card.json", - "https://better-auth-ui.com/r/delete-account-card.json", - "https://better-auth-ui.com/r/passkeys-card.json", - "https://better-auth-ui.com/r/providers-card.json", - "https://better-auth-ui.com/r/sessions-card.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/two-factor-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security-settings-cards.tsx", - "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport { DeleteAccountCard } from \"./account/delete-account-card\"\nimport { PasskeysCard } from \"./passkey/passkeys-card\"\nimport { ProvidersCard } from \"./providers/providers-card\"\nimport { ChangePasswordCard } from \"./security/change-password-card\"\nimport { SessionsCard } from \"./security/sessions-card\"\nimport type { SettingsCardClassNames } from \"./shared/settings-card\"\nimport { TwoFactorCard } from \"./two-factor/two-factor-card\"\n\nexport function SecuritySettingsCards({\n className,\n classNames,\n localization\n}: {\n className?: string\n classNames?: {\n card?: SettingsCardClassNames\n cards?: string\n }\n localization?: Partial\n}) {\n const {\n credentials,\n deleteUser,\n hooks,\n localization: contextLocalization,\n passkey,\n social,\n genericOAuth,\n twoFactor\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { useListAccounts } = hooks\n\n const {\n data: accounts,\n isPending: accountsPending,\n refetch: refetchAccounts\n } = useListAccounts()\n\n const credentialsLinked = accounts?.some(\n (acc) => acc.provider === \"credential\"\n )\n\n return (\n \n {credentials && (\n \n )}\n\n {(social?.providers?.length || genericOAuth?.providers?.length) && (\n \n )}\n\n {twoFactor && credentialsLinked && (\n \n )}\n\n {passkey && (\n \n )}\n\n \n\n {deleteUser && (\n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/select.json b/public/r/select.json deleted file mode 100644 index 0b40d4c8..00000000 --- a/public/r/select.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "select", - "type": "registry:ui", - "title": "Select", - "description": "", - "dependencies": [ - "@radix-ui/react-select", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/select.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/separator.json b/public/r/separator.json deleted file mode 100644 index b3bee590..00000000 --- a/public/r/separator.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "separator", - "type": "registry:ui", - "title": "Separator", - "description": "", - "dependencies": [ - "@radix-ui/react-separator" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/separator.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Separator }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/session-cell.json b/public/r/session-cell.json deleted file mode 100644 index 832ea786..00000000 --- a/public/r/session-cell.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "session-cell", - "type": "registry:component", - "title": "Session Cell", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react", - "ua-parser-js" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/session-cell.tsx", - "content": "\"use client\"\n\nimport type { Session } from \"better-auth\"\nimport { LaptopIcon, Loader2, SmartphoneIcon } from \"lucide-react\"\nimport { useContext, useState } from \"react\"\nimport { UAParser } from \"ua-parser-js\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { Refetch } from \"../../../types/refetch\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport interface SessionCellProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n session: Session\n refetch?: Refetch\n}\n\nexport function SessionCell({\n className,\n classNames,\n localization,\n session,\n refetch\n}: SessionCellProps) {\n const {\n basePath,\n hooks: { useSession },\n localization: contextLocalization,\n mutators: { revokeSession },\n viewPaths,\n navigate,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const isCurrentSession = session.id === sessionData?.session?.id\n\n const [isLoading, setIsLoading] = useState(false)\n\n const handleRevoke = async () => {\n setIsLoading(true)\n\n if (isCurrentSession) {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n return\n }\n\n try {\n await revokeSession({ token: session.token })\n refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n setIsLoading(false)\n }\n }\n\n const parser = UAParser(session.userAgent as string)\n const isMobile = parser.device.type === \"mobile\"\n\n return (\n \n {isMobile ? (\n \n ) : (\n \n )}\n\n
\n \n {isCurrentSession\n ? localization.CURRENT_SESSION\n : session?.ipAddress}\n \n\n \n {parser.os.name}, {parser.browser.name}\n \n
\n\n \n {isLoading && }\n {isCurrentSession ? localization.SIGN_OUT : localization.REVOKE}\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/session-freshness-dialog.json b/public/r/session-freshness-dialog.json deleted file mode 100644 index e526ca2d..00000000 --- a/public/r/session-freshness-dialog.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "session-freshness-dialog", - "type": "registry:component", - "title": "Session Freshness Dialog", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/session-freshness-dialog.tsx", - "content": "import { type ComponentProps, useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SessionFreshnessDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n title?: string\n description?: string\n}\n\nexport function SessionFreshnessDialog({\n classNames,\n localization,\n title,\n description,\n onOpenChange,\n ...props\n}: SessionFreshnessDialogProps) {\n const {\n basePath,\n localization: contextLocalization,\n viewPaths,\n navigate\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const handleSignOut = () => {\n navigate(`${basePath}/${viewPaths.SIGN_OUT}`)\n onOpenChange?.(false)\n }\n\n return (\n \n \n \n \n {title ||\n localization?.SESSION_EXPIRED ||\n \"Session Expired\"}\n \n\n \n {description || localization?.SESSION_NOT_FRESH}\n \n \n\n \n onOpenChange?.(false)}\n >\n {localization.CANCEL}\n \n\n \n {localization?.SIGN_OUT}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/sessions-card.json b/public/r/sessions-card.json deleted file mode 100644 index 179cd498..00000000 --- a/public/r/sessions-card.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "sessions-card", - "type": "registry:component", - "title": "Sessions Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/session-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-cell-skeleton.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/sessions-card.tsx", - "content": "\"use client\"\nimport { useContext } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { CardContent } from \"../../ui/card\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { SettingsCellSkeleton } from \"../skeletons/settings-cell-skeleton\"\nimport { SessionCell } from \"./session-cell\"\n\nexport interface SessionsCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: Partial\n}\n\nexport function SessionsCard({\n className,\n classNames,\n localization\n}: SessionsCardProps) {\n const {\n hooks: { useListSessions },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessions, isPending, refetch } = useListSessions()\n\n return (\n \n \n {isPending ? (\n \n ) : (\n sessions?.map((session) => (\n \n ))\n )}\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/settings-action-button.json b/public/r/settings-action-button.json deleted file mode 100644 index 687fc7c7..00000000 --- a/public/r/settings-action-button.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "settings-action-button", - "type": "registry:component", - "title": "Settings Action Button", - "description": "", - "dependencies": [ - "lucide-react", - "react-hook-form" - ], - "registryDependencies": [ - "button", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-action-button.tsx", - "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport type { ComponentProps, ReactNode } from \"react\"\nimport { useFormState } from \"react-hook-form\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../ui/button\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\ninterface SettingsActionButtonProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n actionLabel: ReactNode\n disabled?: boolean\n isSubmitting?: boolean\n}\n\nexport function SettingsActionButton({\n classNames,\n actionLabel,\n disabled,\n isSubmitting,\n variant,\n onClick,\n ...props\n}: SettingsActionButtonProps) {\n if (!onClick) {\n const formState = useFormState()\n isSubmitting = formState.isSubmitting\n }\n\n return (\n \n {isSubmitting && }\n {actionLabel}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/settings-card-footer.json b/public/r/settings-card-footer.json deleted file mode 100644 index 49c13d48..00000000 --- a/public/r/settings-card-footer.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "settings-card-footer", - "type": "registry:component", - "title": "Settings Card Footer", - "description": "", - "dependencies": [], - "registryDependencies": [ - "card", - "https://better-auth-ui.com/r/settings-action-button.json", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-card-footer.tsx", - "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { CardDescription, CardFooter } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport { SettingsActionButton } from \"./settings-action-button\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SettingsCardFooterProps {\n className?: string\n classNames?: SettingsCardClassNames\n actionLabel?: ReactNode\n disabled?: boolean\n instructions?: ReactNode\n isPending?: boolean\n isSubmitting?: boolean\n optimistic?: boolean\n variant?: \"default\" | \"destructive\"\n action?: () => Promise | unknown\n}\n\nexport function SettingsCardFooter({\n className,\n classNames,\n actionLabel,\n disabled,\n instructions,\n isPending,\n isSubmitting,\n variant,\n action\n}: SettingsCardFooterProps) {\n return (\n \n {isPending ? (\n <>\n {instructions && (\n \n )}\n\n {actionLabel && (\n \n )}\n \n ) : (\n <>\n {instructions && (\n \n {instructions}\n \n )}\n\n {actionLabel && (\n \n )}\n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/settings-card-header.json b/public/r/settings-card-header.json deleted file mode 100644 index 3c8bb739..00000000 --- a/public/r/settings-card-header.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "settings-card-header", - "type": "registry:component", - "title": "Settings Card Header", - "description": "", - "dependencies": [], - "registryDependencies": [ - "card", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-card-header.tsx", - "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { CardDescription, CardHeader, CardTitle } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"./settings-card\"\n\nexport interface SettingsCardHeaderProps {\n className?: string\n classNames?: SettingsCardClassNames\n description?: ReactNode\n isPending?: boolean\n title: ReactNode\n}\n\nexport function SettingsCardHeader({\n className,\n classNames,\n description,\n isPending,\n title\n}: SettingsCardHeaderProps) {\n return (\n \n {isPending ? (\n <>\n \n\n {description && (\n \n )}\n \n ) : (\n <>\n \n {title}\n \n\n {description && (\n \n {description}\n \n )}\n \n )}\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/settings-card.json b/public/r/settings-card.json deleted file mode 100644 index f6bbea12..00000000 --- a/public/r/settings-card.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "settings-card", - "type": "registry:component", - "title": "Settings Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "card", - "https://better-auth-ui.com/r/settings-card-footer.json", - "https://better-auth-ui.com/r/settings-card-header.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-card.tsx", - "content": "\"use client\"\n\nimport type { ComponentProps, ReactNode } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Card } from \"../../ui/card\"\nimport type { UserAvatarClassNames } from \"../../user-avatar\"\nimport { SettingsCardFooter } from \"./settings-card-footer\"\nimport { SettingsCardHeader } from \"./settings-card-header\"\n\nexport type SettingsCardClassNames = {\n base?: string\n avatar?: UserAvatarClassNames\n button?: string\n cell?: string\n checkbox?: string\n destructiveButton?: string\n content?: string\n description?: string\n dialog?: {\n content?: string\n footer?: string\n header?: string\n }\n error?: string\n footer?: string\n header?: string\n icon?: string\n input?: string\n instructions?: string\n label?: string\n primaryButton?: string\n secondaryButton?: string\n outlineButton?: string\n skeleton?: string\n title?: string\n}\n\nexport interface SettingsCardProps\n extends Omit, \"title\"> {\n children?: ReactNode\n className?: string\n classNames?: SettingsCardClassNames\n title?: ReactNode\n description?: ReactNode\n instructions?: ReactNode\n actionLabel?: ReactNode\n isSubmitting?: boolean\n disabled?: boolean\n isPending?: boolean\n optimistic?: boolean\n variant?: \"default\" | \"destructive\"\n localization?: AuthLocalization\n action?: () => Promise | unknown\n}\n\nexport function SettingsCard({\n children,\n className,\n classNames,\n title,\n description,\n instructions,\n actionLabel,\n disabled,\n isPending,\n isSubmitting,\n optimistic,\n variant,\n action,\n ...props\n}: SettingsCardProps) {\n return (\n \n \n\n {children}\n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/settings-cell-skeleton.json b/public/r/settings-cell-skeleton.json deleted file mode 100644 index 4579304d..00000000 --- a/public/r/settings-cell-skeleton.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "settings-cell-skeleton", - "type": "registry:component", - "title": "Settings Cell Skeleton", - "description": "", - "dependencies": [], - "registryDependencies": [ - "card", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/skeletons/settings-cell-skeleton.tsx", - "content": "\"use client\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Card } from \"../../ui/card\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\n\nexport function SettingsCellSkeleton({\n classNames\n}: {\n classNames?: SettingsCardClassNames\n}) {\n return (\n \n
\n \n\n
\n \n
\n
\n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/sign-in-form.json b/public/r/sign-in-form.json deleted file mode 100644 index 59d90fe1..00000000 --- a/public/r/sign-in-form.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "sign-in-form", - "type": "registry:component", - "title": "Sign In Form", - "description": "", - "dependencies": [ - "@better-fetch/fetch", - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/captcha.json", - "checkbox", - "form", - "input", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "https://better-auth-ui.com/r/use-captcha.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/sign-in-form.tsx", - "content": "\"use client\"\n\nimport type { BetterFetchOption } from \"@better-fetch/fetch\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCaptcha } from \"../../../hooks/use-captcha\"\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport {\n cn,\n getLocalizedError,\n getPasswordSchema,\n isValidEmail\n} from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { Captcha } from \"../../captcha/captcha\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface SignInFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (isSubmitting: boolean) => void\n passwordValidation?: PasswordValidation\n}\n\nexport function SignInForm({\n className,\n classNames,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting,\n passwordValidation\n}: SignInFormProps) {\n const isHydrated = useIsHydrated()\n const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({\n localization\n })\n\n const {\n authClient,\n basePath,\n credentials,\n localization: contextLocalization,\n viewPaths,\n navigate,\n toast,\n Link\n } = useContext(AuthUIContext)\n\n const rememberMeEnabled = credentials?.rememberMe\n const usernameEnabled = credentials?.username\n const contextPasswordValidation = credentials?.passwordValidation\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const formSchema = z.object({\n email: usernameEnabled\n ? z.string().min(1, {\n message: `${localization.USERNAME} ${localization.IS_REQUIRED}`\n })\n : z\n .string()\n .min(1, {\n message: `${localization.EMAIL} ${localization.IS_REQUIRED}`\n })\n .email({\n message: `${localization.EMAIL} ${localization.IS_INVALID}`\n }),\n password: getPasswordSchema(passwordValidation, localization),\n rememberMe: z.boolean().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n email: \"\",\n password: \"\",\n rememberMe: !rememberMeEnabled\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n async function signIn({\n email,\n password,\n rememberMe\n }: z.infer) {\n try {\n let response: Record = {}\n\n if (usernameEnabled && !isValidEmail(email)) {\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-in/username\")\n }\n\n response = await authClient.signIn.username({\n username: email,\n password,\n rememberMe,\n fetchOptions\n })\n } else {\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-in/email\")\n }\n\n response = await authClient.signIn.email({\n email,\n password,\n rememberMe,\n fetchOptions\n })\n }\n\n if (response.twoFactorRedirect) {\n navigate(\n `${basePath}/${viewPaths.TWO_FACTOR}${window.location.search}`\n )\n } else {\n await onSuccess()\n }\n } catch (error) {\n form.resetField(\"password\")\n resetCaptcha()\n\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n (\n \n \n {usernameEnabled\n ? localization.USERNAME\n : localization.EMAIL}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n
\n \n {localization.PASSWORD}\n \n\n {credentials?.forgotPassword && (\n \n {localization.FORGOT_PASSWORD_LINK}\n \n )}\n
\n\n \n \n \n\n \n
\n )}\n />\n\n {rememberMeEnabled && (\n (\n \n \n \n \n\n \n {localization.REMEMBER_ME}\n \n \n )}\n />\n )}\n\n \n\n \n {isSubmitting ? (\n \n ) : (\n localization.SIGN_IN_ACTION\n )}\n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/sign-out.json b/public/r/sign-out.json deleted file mode 100644 index 863abfc1..00000000 --- a/public/r/sign-out.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "sign-out", - "type": "registry:component", - "title": "Sign Out", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-success-transition.json" - ], - "files": [ - { - "path": "src/components/auth/sign-out.tsx", - "content": "\"use client\"\n\nimport { Loader2 } from \"lucide-react\"\nimport { useContext, useEffect, useRef } from \"react\"\n\nimport { useOnSuccessTransition } from \"../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\n\nexport function SignOut() {\n const signingOut = useRef(false)\n\n const { authClient, basePath, viewPaths } = useContext(AuthUIContext)\n const { onSuccess } = useOnSuccessTransition({\n redirectTo: `${basePath}/${viewPaths.SIGN_IN}`\n })\n\n useEffect(() => {\n if (signingOut.current) return\n signingOut.current = true\n\n authClient.signOut().finally(onSuccess)\n }, [authClient, onSuccess])\n\n return \n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/sign-up-form.json b/public/r/sign-up-form.json deleted file mode 100644 index 3679293a..00000000 --- a/public/r/sign-up-form.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "sign-up-form", - "type": "registry:component", - "title": "Sign Up Form", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/captcha.json", - "checkbox", - "dropdown-menu", - "form", - "https://better-auth-ui.com/r/image-utils.json", - "input", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "textarea", - "https://better-auth-ui.com/r/use-captcha.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/sign-up-form.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport type { BetterFetchOption } from \"better-auth/react\"\nimport { Loader2, Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { useCaptcha } from \"../../../hooks/use-captcha\"\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../../lib/image-utils\"\nimport {\n cn,\n getLocalizedError,\n getPasswordSchema,\n getSearchParam\n} from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { PasswordValidation } from \"../../../types/password-validation\"\nimport { Captcha } from \"../../captcha/captcha\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Textarea } from \"../../ui/textarea\"\nimport { UserAvatar } from \"../../user-avatar\"\nimport type { AuthFormClassNames } from \"../auth-form\"\n\nexport interface SignUpFormProps {\n className?: string\n classNames?: AuthFormClassNames\n callbackURL?: string\n isSubmitting?: boolean\n localization: Partial\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n passwordValidation?: PasswordValidation\n}\n\nexport function SignUpForm({\n className,\n classNames,\n callbackURL,\n isSubmitting,\n localization,\n redirectTo,\n setIsSubmitting,\n passwordValidation\n}: SignUpFormProps) {\n const isHydrated = useIsHydrated()\n const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({\n localization\n })\n\n const {\n additionalFields,\n authClient,\n basePath,\n baseURL,\n credentials,\n localization: contextLocalization,\n nameRequired,\n persistClient,\n redirectTo: contextRedirectTo,\n signUp: signUpOptions,\n viewPaths,\n navigate,\n toast,\n avatar\n } = useContext(AuthUIContext)\n\n const confirmPasswordEnabled = credentials?.confirmPassword\n const usernameEnabled = credentials?.username\n const contextPasswordValidation = credentials?.passwordValidation\n const signUpFields = signUpOptions?.fields\n\n localization = { ...contextLocalization, ...localization }\n passwordValidation = { ...contextPasswordValidation, ...passwordValidation }\n\n // Avatar upload state\n const fileInputRef = useRef(null)\n const [avatarImage, setAvatarImage] = useState(null)\n const [uploadingAvatar, setUploadingAvatar] = useState(false)\n\n const getRedirectTo = useCallback(\n () => redirectTo || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectTo, contextRedirectTo]\n )\n\n const getCallbackURL = useCallback(\n () =>\n `${baseURL}${\n callbackURL ||\n (persistClient\n ? `${basePath}/${viewPaths.CALLBACK}?redirectTo=${getRedirectTo()}`\n : getRedirectTo())\n }`,\n [\n callbackURL,\n persistClient,\n basePath,\n viewPaths,\n baseURL,\n getRedirectTo\n ]\n )\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n // Create the base schema for standard fields\n const schemaFields: Record = {\n email: z\n .string()\n .min(1, {\n message: `${localization.EMAIL} ${localization.IS_REQUIRED}`\n })\n .email({\n message: `${localization.EMAIL} ${localization.IS_INVALID}`\n }),\n password: getPasswordSchema(passwordValidation, localization)\n }\n\n // Add confirmPassword field if enabled\n if (confirmPasswordEnabled) {\n schemaFields.confirmPassword = getPasswordSchema(passwordValidation, {\n PASSWORD_REQUIRED: localization.CONFIRM_PASSWORD_REQUIRED,\n PASSWORD_TOO_SHORT: localization.PASSWORD_TOO_SHORT,\n PASSWORD_TOO_LONG: localization.PASSWORD_TOO_LONG,\n INVALID_PASSWORD: localization.INVALID_PASSWORD\n })\n }\n\n // Add name field if required or included in signUpFields\n if (signUpFields?.includes(\"name\")) {\n schemaFields.name = nameRequired\n ? z.string().min(1, {\n message: `${localization.NAME} ${localization.IS_REQUIRED}`\n })\n : z.string().optional()\n }\n\n // Add username field if enabled\n if (usernameEnabled) {\n schemaFields.username = z.string().min(1, {\n message: `${localization.USERNAME} ${localization.IS_REQUIRED}`\n })\n }\n\n // Add image field if included in signUpFields\n if (signUpFields?.includes(\"image\") && avatar) {\n schemaFields.image = z.string().optional()\n }\n\n // Add additional fields from signUpFields\n if (signUpFields) {\n for (const field of signUpFields) {\n if (field === \"name\") continue // Already handled above\n if (field === \"image\") continue // Already handled above\n\n const additionalField = additionalFields?.[field]\n if (!additionalField) continue\n\n let fieldSchema: z.ZodTypeAny\n\n // Create the appropriate schema based on field type\n if (additionalField.type === \"number\") {\n fieldSchema = additionalField.required\n ? z.preprocess(\n (val) => (!val ? undefined : Number(val)),\n z.number({\n required_error: `${additionalField.label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n )\n : z.coerce\n .number({\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .optional()\n } else if (additionalField.type === \"boolean\") {\n fieldSchema = additionalField.required\n ? z.coerce\n .boolean({\n required_error: `${additionalField.label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .refine((val) => val === true, {\n message: `${additionalField.label} ${localization.IS_REQUIRED}`\n })\n : z.coerce\n .boolean({\n invalid_type_error: `${additionalField.label} ${localization.IS_INVALID}`\n })\n .optional()\n } else {\n fieldSchema = additionalField.required\n ? z\n .string()\n .min(\n 1,\n `${additionalField.label} ${localization.IS_REQUIRED}`\n )\n : z.string().optional()\n }\n\n schemaFields[field] = fieldSchema\n }\n }\n\n const formSchema = z.object(schemaFields).refine(\n (data) => {\n // Skip validation if confirmPassword is not enabled\n if (!confirmPasswordEnabled) return true\n return data.password === data.confirmPassword\n },\n {\n message: localization.PASSWORDS_DO_NOT_MATCH!,\n path: [\"confirmPassword\"]\n }\n )\n\n // Create default values for the form\n const defaultValues: Record = {\n email: \"\",\n password: \"\",\n ...(confirmPasswordEnabled && { confirmPassword: \"\" }),\n ...(signUpFields?.includes(\"name\") ? { name: \"\" } : {}),\n ...(usernameEnabled ? { username: \"\" } : {}),\n ...(signUpFields?.includes(\"image\") && avatar ? { image: \"\" } : {})\n }\n\n // Add default values for additional fields\n if (signUpFields) {\n for (const field of signUpFields) {\n if (field === \"name\") continue\n if (field === \"image\") continue\n const additionalField = additionalFields?.[field]\n if (!additionalField) continue\n\n defaultValues[field] =\n additionalField.type === \"boolean\" ? false : \"\"\n }\n }\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n const handleAvatarChange = async (file: File) => {\n if (!avatar) return\n\n setUploadingAvatar(true)\n\n try {\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n avatar.size,\n avatar.extension\n )\n\n let image: string | undefined | null\n\n if (avatar.upload) {\n image = await avatar.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (image) {\n setAvatarImage(image)\n form.setValue(\"image\", image)\n } else {\n setAvatarImage(null)\n form.setValue(\"image\", \"\")\n }\n } catch (error) {\n console.error(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setUploadingAvatar(false)\n }\n\n const handleDeleteAvatar = () => {\n setAvatarImage(null)\n form.setValue(\"image\", \"\")\n }\n\n const openFileDialog = () => fileInputRef.current?.click()\n\n async function signUp({\n email,\n password,\n name,\n username,\n confirmPassword,\n image,\n ...additionalFieldValues\n }: z.infer) {\n try {\n // Validate additional fields with custom validators if provided\n for (const [field, value] of Object.entries(\n additionalFieldValues\n )) {\n const additionalField = additionalFields?.[field]\n if (!additionalField?.validate) continue\n\n if (\n typeof value === \"string\" &&\n !(await additionalField.validate(value))\n ) {\n form.setError(field, {\n message: `${additionalField.label} ${localization.IS_INVALID}`\n })\n return\n }\n }\n\n const fetchOptions: BetterFetchOption = {\n throw: true,\n headers: await getCaptchaHeaders(\"/sign-up/email\")\n }\n\n const data = await authClient.signUp.email({\n email,\n password,\n name: name || \"\",\n ...(username !== undefined && { username }),\n ...(image !== undefined && { image }),\n ...additionalFieldValues,\n callbackURL: getCallbackURL(),\n fetchOptions\n })\n\n if (\"token\" in data && data.token) {\n await onSuccess()\n } else {\n navigate(\n `${basePath}/${viewPaths.SIGN_IN}${window.location.search}`\n )\n toast({\n variant: \"success\",\n message: localization.SIGN_UP_EMAIL!\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.resetField(\"password\")\n form.resetField(\"confirmPassword\")\n resetCaptcha()\n }\n }\n\n return (\n
\n \n {signUpFields?.includes(\"image\") && avatar && (\n <>\n {\n const file = e.target.files?.item(0)\n if (file) handleAvatarChange(file)\n e.target.value = \"\"\n }}\n />\n\n (\n \n {localization.AVATAR}\n\n
\n \n \n \n \n \n \n\n \n e.preventDefault()\n }\n >\n \n \n {localization.UPLOAD_AVATAR}\n \n\n {avatarImage && (\n \n \n {\n localization.DELETE_AVATAR\n }\n \n )}\n \n \n\n \n {uploadingAvatar && (\n \n )}\n\n {localization.UPLOAD}\n \n
\n\n \n
\n )}\n />\n \n )}\n\n {signUpFields?.includes(\"name\") && (\n (\n \n \n {localization.NAME}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n {usernameEnabled && (\n (\n \n \n {localization.USERNAME}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n (\n \n \n {localization.EMAIL}\n \n\n \n \n \n\n \n \n )}\n />\n\n (\n \n \n {localization.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n {confirmPasswordEnabled && (\n (\n \n \n {localization.CONFIRM_PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n )}\n\n {signUpFields\n ?.filter((field) => field !== \"name\" && field !== \"image\")\n .map((field) => {\n const additionalField = additionalFields?.[field]\n if (!additionalField) {\n console.error(`Additional field ${field} not found`)\n return null\n }\n\n return additionalField.type === \"boolean\" ? (\n (\n \n \n \n \n\n \n {additionalField.label}\n \n\n \n \n )}\n />\n ) : (\n (\n \n \n {additionalField.label}\n \n\n \n {additionalField.type ===\n \"number\" ? (\n \n ) : additionalField.multiline ? (\n \n ) : (\n \n )}\n \n\n \n \n )}\n />\n )\n })}\n\n \n\n \n {isSubmitting ? (\n \n ) : (\n localization.SIGN_UP_ACTION\n )}\n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/sign-up-options.json b/public/r/sign-up-options.json deleted file mode 100644 index 82ea8b68..00000000 --- a/public/r/sign-up-options.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "sign-up-options", - "type": "registry:file", - "title": "Sign Up Options", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/sign-up-options.ts", - "content": "export type SignUpOptions = {\n /**\n * Array of fields to show in Sign Up form\n * @default [\"name\"]\n */\n fields?: string[]\n}\n", - "type": "registry:file", - "target": "types/sign-up-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/signed-in.json b/public/r/signed-in.json deleted file mode 100644 index 3bce83ac..00000000 --- a/public/r/signed-in.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "signed-in", - "type": "registry:component", - "title": "Signed In", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/components/signed-in.tsx", - "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content for authenticated users only\n *\n * Renders its children only when a user is authenticated with a valid session.\n * If no session exists, nothing is rendered. Useful for displaying protected\n * content or UI elements that should only be visible to signed-in users.\n */\nexport function SignedIn({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { data } = useSession()\n\n return data ? children : null\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/signed-out.json b/public/r/signed-out.json deleted file mode 100644 index eda953c2..00000000 --- a/public/r/signed-out.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "signed-out", - "type": "registry:component", - "title": "Signed Out", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/components/signed-out.tsx", - "content": "\"use client\"\n\nimport { type ReactNode, useContext } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\n/**\n * Conditionally renders content for unauthenticated users only\n *\n * Renders its children only when no user is authenticated and the authentication\n * state is not pending. If a session exists or is being loaded, nothing is rendered.\n * Useful for displaying sign-in prompts or content exclusive to guests.\n */\nexport function SignedOut({ children }: { children: ReactNode }) {\n const {\n hooks: { useSession }\n } = useContext(AuthUIContext)\n const { data, isPending } = useSession()\n\n return !data && !isPending ? children : null\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/skeleton.json b/public/r/skeleton.json deleted file mode 100644 index aedb1718..00000000 --- a/public/r/skeleton.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "skeleton", - "type": "registry:ui", - "title": "Skeleton", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/skeleton.tsx", - "content": "import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n \n )\n}\n\nexport { Skeleton }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/social-options.json b/public/r/social-options.json deleted file mode 100644 index 8d896b27..00000000 --- a/public/r/social-options.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "social-options", - "type": "registry:file", - "title": "Social Options", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json" - ], - "files": [ - { - "path": "src/types/social-options.ts", - "content": "import type { SocialProvider } from \"better-auth/social-providers\"\nimport type { AuthClient } from \"./auth-client\"\n\nexport type SocialOptions = {\n /**\n * Array of Social Providers to enable\n * @remarks `SocialProvider[]`\n */\n providers: SocialProvider[]\n /**\n * Custom social sign in function\n */\n signIn?: (\n params: Parameters[0]\n ) => Promise\n}\n", - "type": "registry:file", - "target": "types/social-options.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/social-providers.json b/public/r/social-providers.json deleted file mode 100644 index 3fdde706..00000000 --- a/public/r/social-providers.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "social-providers", - "type": "registry:lib", - "title": "Social Providers", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/provider-icons.json" - ], - "files": [ - { - "path": "src/lib/social-providers.ts", - "content": "import {\n AppleIcon,\n DiscordIcon,\n DropboxIcon,\n FacebookIcon,\n GitHubIcon,\n GitLabIcon,\n GoogleIcon,\n HuggingFaceIcon,\n KickIcon,\n LinearIcon,\n LinkedInIcon,\n MicrosoftIcon,\n NotionIcon,\n type ProviderIcon,\n RedditIcon,\n RobloxIcon,\n SlackIcon,\n SpotifyIcon,\n TikTokIcon,\n TwitchIcon,\n VKIcon,\n XIcon,\n ZoomIcon\n} from \"../components/provider-icons\"\n\nexport const socialProviders = [\n {\n provider: \"apple\",\n name: \"Apple\",\n icon: AppleIcon\n },\n {\n provider: \"discord\",\n name: \"Discord\",\n icon: DiscordIcon\n },\n {\n provider: \"dropbox\",\n name: \"Dropbox\",\n icon: DropboxIcon\n },\n {\n provider: \"facebook\",\n name: \"Facebook\",\n icon: FacebookIcon\n },\n {\n provider: \"github\",\n name: \"GitHub\",\n icon: GitHubIcon\n },\n {\n provider: \"gitlab\",\n name: \"GitLab\",\n icon: GitLabIcon\n },\n {\n provider: \"google\",\n name: \"Google\",\n icon: GoogleIcon\n },\n {\n provider: \"huggingface\",\n name: \"Hugging Face\",\n icon: HuggingFaceIcon\n },\n {\n provider: \"kick\",\n name: \"Kick\",\n icon: KickIcon\n },\n {\n provider: \"linear\",\n name: \"Linear\",\n icon: LinearIcon\n },\n {\n provider: \"linkedin\",\n name: \"LinkedIn\",\n icon: LinkedInIcon\n },\n {\n provider: \"microsoft\",\n name: \"Microsoft\",\n icon: MicrosoftIcon\n },\n {\n provider: \"notion\",\n name: \"Notion\",\n icon: NotionIcon\n },\n {\n provider: \"reddit\",\n name: \"Reddit\",\n icon: RedditIcon\n },\n {\n provider: \"roblox\",\n name: \"Roblox\",\n icon: RobloxIcon\n },\n {\n provider: \"slack\",\n name: \"Slack\",\n icon: SlackIcon\n },\n {\n provider: \"spotify\",\n name: \"Spotify\",\n icon: SpotifyIcon\n },\n {\n provider: \"tiktok\",\n name: \"TikTok\",\n icon: TikTokIcon\n },\n {\n provider: \"twitch\",\n name: \"Twitch\",\n icon: TwitchIcon\n },\n {\n provider: \"vk\",\n name: \"VK\",\n icon: VKIcon\n },\n {\n provider: \"twitter\",\n name: \"X\",\n icon: XIcon\n },\n {\n provider: \"zoom\",\n name: \"Zoom\",\n icon: ZoomIcon\n }\n] as const\n\nexport type Provider = {\n provider: string\n name: string\n icon?: ProviderIcon\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/stripe-localization.json b/public/r/stripe-localization.json deleted file mode 100644 index 31f30566..00000000 --- a/public/r/stripe-localization.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "stripe-localization", - "type": "registry:file", - "title": "Stripe Localization", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/stripe-localization.ts", - "content": "export const STRIPE_ERROR_CODES = {\n SUBSCRIPTION_NOT_FOUND: \"Subscription not found\",\n SUBSCRIPTION_PLAN_NOT_FOUND: \"Subscription plan not found\",\n ALREADY_SUBSCRIBED_PLAN: \"You're already subscribed to this plan\",\n UNABLE_TO_CREATE_CUSTOMER: \"Unable to create customer\",\n FAILED_TO_FETCH_PLANS: \"Failed to fetch plans\",\n EMAIL_VERIFICATION_REQUIRED:\n \"Email verification is required before you can subscribe to a plan\",\n SUBSCRIPTION_NOT_ACTIVE: \"Subscription is not active\",\n SUBSCRIPTION_NOT_SCHEDULED_FOR_CANCELLATION:\n \"Subscription is not scheduled for cancellation\"\n}\n", - "type": "registry:file", - "target": "localization/stripe-localization.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/tabs.json b/public/r/tabs.json deleted file mode 100644 index 3a069a92..00000000 --- a/public/r/tabs.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "tabs", - "type": "registry:ui", - "title": "Tabs", - "description": "", - "dependencies": [ - "@radix-ui/react-tabs" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/tabs.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/textarea.json b/public/r/textarea.json deleted file mode 100644 index a761e577..00000000 --- a/public/r/textarea.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "textarea", - "type": "registry:ui", - "title": "Textarea", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/textarea.tsx", - "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n \n )\n}\n\nexport { Textarea }\n", - "type": "registry:ui" - } - ] -} \ No newline at end of file diff --git a/public/r/two-factor-card.json b/public/r/two-factor-card.json deleted file mode 100644 index b6df5835..00000000 --- a/public/r/two-factor-card.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "two-factor-card", - "type": "registry:component", - "title": "Two Factor Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/two-factor-password-dialog.json" - ], - "files": [ - { - "path": "src/components/settings/two-factor/two-factor-card.tsx", - "content": "\"use client\"\n\nimport { useContext, useState } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { User } from \"../../../types/auth-client\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCard } from \"../shared/settings-card\"\nimport { TwoFactorPasswordDialog } from \"./two-factor-password-dialog\"\n\nexport interface TwoFactorCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function TwoFactorCard({\n className,\n classNames,\n localization\n}: TwoFactorCardProps) {\n const {\n localization: contextLocalization,\n hooks: { useSession }\n } = useContext(AuthUIContext)\n\n const [showPasswordDialog, setShowPasswordDialog] = useState(false)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData, isPending } = useSession()\n const isTwoFactorEnabled = (sessionData?.user as User)?.twoFactorEnabled\n\n return (\n
\n setShowPasswordDialog(true)}\n />\n\n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/two-factor-error-codes.json b/public/r/two-factor-error-codes.json deleted file mode 100644 index f493ab8a..00000000 --- a/public/r/two-factor-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "two-factor-error-codes", - "type": "registry:file", - "title": "Two Factor Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/two-factor-error-codes.ts", - "content": "export const TWO_FACTOR_ERROR_CODES = {\n OTP_NOT_ENABLED: \"OTP not enabled\",\n OTP_HAS_EXPIRED: \"OTP has expired\",\n TOTP_NOT_ENABLED: \"TOTP not enabled\",\n TWO_FACTOR_NOT_ENABLED: \"Two factor isn't enabled\",\n BACKUP_CODES_NOT_ENABLED: \"Backup codes aren't enabled\",\n INVALID_BACKUP_CODE: \"Invalid backup code\",\n INVALID_CODE: \"Invalid code\",\n TOO_MANY_ATTEMPTS_REQUEST_NEW_CODE:\n \"Too many attempts. Please request a new code.\",\n INVALID_TWO_FACTOR_COOKIE: \"Invalid two factor cookie\"\n}\n", - "type": "registry:file", - "target": "localization/two-factor-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/two-factor-form.json b/public/r/two-factor-form.json deleted file mode 100644 index fe4cb3d7..00000000 --- a/public/r/two-factor-form.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "two-factor-form", - "type": "registry:component", - "title": "Two Factor Form", - "description": "", - "dependencies": [ - "@better-fetch/fetch", - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "react-qr-code", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "checkbox", - "form", - "input-otp", - "label", - "https://better-auth-ui.com/r/otp-input-group.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/two-factor-form.tsx", - "content": "\"use client\"\n\nimport type { BetterFetchError } from \"@better-fetch/fetch\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2, QrCodeIcon, SendIcon } from \"lucide-react\"\nimport { useContext, useEffect, useRef, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport QRCode from \"react-qr-code\"\nimport * as z from \"zod\"\n\nimport { useIsHydrated } from \"../../../hooks/use-hydrated\"\nimport { useOnSuccessTransition } from \"../../../hooks/use-success-transition\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError, getSearchParam } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { User } from \"../../../types/auth-client\"\nimport { Button } from \"../../ui/button\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { InputOTP } from \"../../ui/input-otp\"\nimport { Label } from \"../../ui/label\"\nimport type { AuthFormClassNames } from \"../auth-form\"\nimport { OTPInputGroup } from \"../otp-input-group\"\n\nexport interface TwoFactorFormProps {\n className?: string\n classNames?: AuthFormClassNames\n isSubmitting?: boolean\n localization?: Partial\n otpSeparators?: 0 | 1 | 2\n redirectTo?: string\n setIsSubmitting?: (value: boolean) => void\n}\n\nexport function TwoFactorForm({\n className,\n classNames,\n isSubmitting,\n localization,\n otpSeparators = 0,\n redirectTo,\n setIsSubmitting\n}: TwoFactorFormProps) {\n const isHydrated = useIsHydrated()\n const totpURI = isHydrated ? getSearchParam(\"totpURI\") : null\n const initialSendRef = useRef(false)\n\n const {\n authClient,\n basePath,\n hooks: { useSession },\n localization: contextLocalization,\n twoFactor,\n viewPaths,\n toast,\n Link\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { onSuccess, isPending: transitionPending } = useOnSuccessTransition({\n redirectTo\n })\n\n const { data: sessionData } = useSession()\n const isTwoFactorEnabled = (sessionData?.user as User)?.twoFactorEnabled\n\n const [method, setMethod] = useState<\"totp\" | \"otp\" | null>(\n twoFactor?.length === 1 ? twoFactor[0] : null\n )\n\n const [isSendingOtp, setIsSendingOtp] = useState(false)\n const [cooldownSeconds, setCooldownSeconds] = useState(0)\n\n const formSchema = z.object({\n code: z\n .string()\n .min(1, {\n message: `${localization.ONE_TIME_PASSWORD} ${localization.IS_REQUIRED}`\n })\n .min(6, {\n message: `${localization.ONE_TIME_PASSWORD} ${localization.IS_INVALID}`\n }),\n trustDevice: z.boolean().optional()\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n code: \"\"\n }\n })\n\n isSubmitting =\n isSubmitting || form.formState.isSubmitting || transitionPending\n\n useEffect(() => {\n setIsSubmitting?.(form.formState.isSubmitting || transitionPending)\n }, [form.formState.isSubmitting, transitionPending, setIsSubmitting])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (\n method === \"otp\" &&\n cooldownSeconds <= 0 &&\n !initialSendRef.current\n ) {\n initialSendRef.current = true\n sendOtp()\n }\n }, [method])\n\n useEffect(() => {\n if (cooldownSeconds <= 0) return\n\n const timer = setTimeout(() => {\n setCooldownSeconds((prev) => prev - 1)\n }, 1000)\n return () => clearTimeout(timer)\n }, [cooldownSeconds])\n\n const sendOtp = async () => {\n if (isSendingOtp || cooldownSeconds > 0) return\n\n try {\n setIsSendingOtp(true)\n await authClient.twoFactor.sendOtp({\n fetchOptions: { throw: true }\n })\n setCooldownSeconds(60)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n if (\n (error as BetterFetchError).error.code ===\n \"INVALID_TWO_FACTOR_COOKIE\"\n ) {\n history.back()\n }\n }\n\n initialSendRef.current = false\n setIsSendingOtp(false)\n }\n\n async function verifyCode({\n code,\n trustDevice\n }: z.infer) {\n try {\n const verifyMethod =\n method === \"totp\"\n ? authClient.twoFactor.verifyTotp\n : authClient.twoFactor.verifyOtp\n\n await verifyMethod({\n code,\n trustDevice,\n fetchOptions: { throw: true }\n })\n\n await onSuccess()\n\n if (sessionData && !isTwoFactorEnabled) {\n toast({\n variant: \"success\",\n message: localization?.TWO_FACTOR_ENABLED\n })\n }\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n\n form.reset()\n }\n }\n\n return (\n
\n \n {twoFactor?.includes(\"totp\") &&\n totpURI &&\n method === \"totp\" && (\n
\n \n\n \n
\n )}\n\n {method !== null && (\n <>\n (\n \n
\n \n {localization.ONE_TIME_PASSWORD}\n \n\n \n {localization.FORGOT_AUTHENTICATOR}\n \n
\n\n \n {\n field.onChange(value)\n\n if (value.length === 6) {\n form.handleSubmit(\n verifyCode\n )()\n }\n }}\n containerClassName={\n classNames?.otpInputContainer\n }\n className={classNames?.otpInput}\n disabled={isSubmitting}\n >\n \n \n \n\n \n
\n )}\n />\n\n (\n \n \n \n \n\n \n {localization.TRUST_DEVICE}\n \n \n )}\n />\n \n )}\n\n
\n {method !== null && (\n \n {isSubmitting && (\n \n )}\n {localization.TWO_FACTOR_ACTION}\n \n )}\n\n {method === \"otp\" && twoFactor?.includes(\"otp\") && (\n 0 ||\n isSendingOtp ||\n isSubmitting\n }\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n >\n {isSendingOtp ? (\n \n ) : (\n \n )}\n\n {localization.RESEND_CODE}\n {cooldownSeconds > 0 && ` (${cooldownSeconds})`}\n \n )}\n\n {method !== \"otp\" && twoFactor?.includes(\"otp\") && (\n setMethod(\"otp\")}\n disabled={isSubmitting}\n >\n \n {localization.SEND_VERIFICATION_CODE}\n \n )}\n\n {method !== \"totp\" && twoFactor?.includes(\"totp\") && (\n setMethod(\"totp\")}\n disabled={isSubmitting}\n >\n \n {localization.CONTINUE_WITH_AUTHENTICATOR}\n \n )}\n
\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/two-factor-password-dialog.json b/public/r/two-factor-password-dialog.json deleted file mode 100644 index 225ba81d..00000000 --- a/public/r/two-factor-password-dialog.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "two-factor-password-dialog", - "type": "registry:component", - "title": "Two Factor Password Dialog", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/backup-codes-dialog.json", - "button", - "dialog", - "form", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/two-factor/two-factor-password-dialog.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useState } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport { PasswordInput } from \"../../password-input\"\nimport { Button } from \"../../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../../ui/dialog\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { BackupCodesDialog } from \"./backup-codes-dialog\"\n\ninterface TwoFactorPasswordDialogProps extends ComponentProps {\n classNames?: SettingsCardClassNames\n isTwoFactorEnabled: boolean\n}\n\nexport function TwoFactorPasswordDialog({\n classNames,\n onOpenChange,\n isTwoFactorEnabled,\n ...props\n}: TwoFactorPasswordDialogProps) {\n const {\n localization,\n authClient,\n basePath,\n viewPaths,\n navigate,\n toast,\n twoFactor\n } = useContext(AuthUIContext)\n const [showBackupCodesDialog, setShowBackupCodesDialog] = useState(false)\n const [backupCodes, setBackupCodes] = useState([])\n const [totpURI, setTotpURI] = useState(null)\n\n const formSchema = z.object({\n password: z.string().min(1, { message: localization.PASSWORD_REQUIRED })\n })\n\n const form = useForm({\n resolver: zodResolver(formSchema),\n defaultValues: {\n password: \"\"\n }\n })\n\n const { isSubmitting } = form.formState\n\n async function enableTwoFactor({ password }: z.infer) {\n try {\n const response = await authClient.twoFactor.enable({\n password,\n fetchOptions: { throw: true }\n })\n\n onOpenChange?.(false)\n setBackupCodes(response.backupCodes)\n\n if (twoFactor?.includes(\"totp\")) {\n setTotpURI(response.totpURI)\n }\n\n setTimeout(() => {\n setShowBackupCodesDialog(true)\n }, 250)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n async function disableTwoFactor({ password }: z.infer) {\n try {\n await authClient.twoFactor.disable({\n password,\n fetchOptions: { throw: true }\n })\n\n toast({\n variant: \"success\",\n message: localization.TWO_FACTOR_DISABLED\n })\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n <>\n \n \n \n \n {localization.TWO_FACTOR}\n \n\n \n {isTwoFactorEnabled\n ? localization.TWO_FACTOR_DISABLE_INSTRUCTIONS\n : localization.TWO_FACTOR_ENABLE_INSTRUCTIONS}\n \n \n\n
\n \n (\n \n \n {localization.PASSWORD}\n \n\n \n \n \n\n \n \n )}\n />\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.secondaryButton\n )}\n >\n {localization.CANCEL}\n \n\n \n {isSubmitting && (\n \n )}\n {isTwoFactorEnabled\n ? localization.DISABLE_TWO_FACTOR\n : localization.ENABLE_TWO_FACTOR}\n \n \n \n \n \n
\n\n {\n setShowBackupCodesDialog(open)\n\n if (!open) {\n const url = `${basePath}/${viewPaths.TWO_FACTOR}`\n navigate(\n twoFactor?.includes(\"totp\") && totpURI\n ? `${url}?totpURI=${totpURI}`\n : url\n )\n }\n }}\n backupCodes={backupCodes}\n />\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/update-avatar-card.json b/public/r/update-avatar-card.json deleted file mode 100644 index bab50928..00000000 --- a/public/r/update-avatar-card.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "update-avatar-card", - "type": "registry:component", - "title": "Update Avatar Card", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/image-utils.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-card-footer.json", - "https://better-auth-ui.com/r/settings-card-header.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-avatar-card.tsx", - "content": "\"use client\"\n\nimport { Trash2Icon, UploadCloudIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext, useRef, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { fileToBase64, resizeAndCropImage } from \"../../../lib/image-utils\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport { Button } from \"../../ui/button\"\nimport { Card } from \"../../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../../ui/dropdown-menu\"\nimport { UserAvatar } from \"../../user-avatar\"\nimport type { SettingsCardClassNames } from \"../shared/settings-card\"\nimport { SettingsCardFooter } from \"../shared/settings-card-footer\"\nimport { SettingsCardHeader } from \"../shared/settings-card-header\"\n\nexport interface UpdateAvatarCardProps extends ComponentProps {\n className?: string\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n}\n\nexport function UpdateAvatarCard({\n className,\n classNames,\n localization,\n ...props\n}: UpdateAvatarCardProps) {\n const {\n hooks: { useSession },\n mutators: { updateUser },\n localization: authLocalization,\n optimistic,\n avatar,\n toast\n } = useContext(AuthUIContext)\n\n localization = { ...authLocalization, ...localization }\n\n const { data: sessionData, isPending, refetch } = useSession()\n const fileInputRef = useRef(null)\n const [loading, setLoading] = useState(false)\n\n const handleAvatarChange = async (file: File) => {\n if (!sessionData || !avatar) return\n\n setLoading(true)\n const resizedFile = await resizeAndCropImage(\n file,\n crypto.randomUUID(),\n avatar.size,\n avatar.extension\n )\n\n let image: string | undefined | null\n\n if (avatar.upload) {\n image = await avatar.upload(resizedFile)\n } else {\n image = await fileToBase64(resizedFile)\n }\n\n if (!image) {\n setLoading(false)\n return\n }\n\n if (optimistic && !avatar.upload) setLoading(false)\n\n try {\n await updateUser({ image })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const handleDeleteAvatar = async () => {\n if (!sessionData) return\n\n setLoading(true)\n\n try {\n // If a custom storage remover is provided, attempt to clean up the old asset first\n if (sessionData.user.image && avatar?.delete) {\n await avatar.delete(sessionData.user.image)\n }\n\n await updateUser({ image: null })\n await refetch?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setLoading(false)\n }\n\n const openFileDialog = () => fileInputRef.current?.click()\n\n return (\n \n {\n const file = e.target.files?.item(0)\n if (file) handleAvatarChange(file)\n\n e.target.value = \"\"\n }}\n />\n\n
\n \n\n \n \n \n \n \n \n\n e.preventDefault()}\n >\n \n \n {localization.UPLOAD_AVATAR}\n \n {sessionData?.user.image && (\n \n \n {localization.DELETE_AVATAR}\n \n )}\n \n \n
\n\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/update-field-card.json b/public/r/update-field-card.json deleted file mode 100644 index 3984f500..00000000 --- a/public/r/update-field-card.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "update-field-card", - "type": "registry:component", - "title": "Update Field Card", - "description": "", - "dependencies": [ - "@hookform/resolvers", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/additional-fields.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "checkbox", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "textarea", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-field-card.tsx", - "content": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { type ReactNode, useContext, useMemo } from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport * as z from \"zod\"\n\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../../lib/utils\"\nimport type { AuthLocalization } from \"../../../localization/auth-localization\"\nimport type { FieldType } from \"../../../types/additional-fields\"\nimport { CardContent } from \"../../ui/card\"\nimport { Checkbox } from \"../../ui/checkbox\"\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage\n} from \"../../ui/form\"\nimport { Input } from \"../../ui/input\"\nimport { Skeleton } from \"../../ui/skeleton\"\nimport { Textarea } from \"../../ui/textarea\"\nimport {\n SettingsCard,\n type SettingsCardClassNames\n} from \"../shared/settings-card\"\n\nexport interface UpdateFieldCardProps {\n className?: string\n classNames?: SettingsCardClassNames\n description?: ReactNode\n instructions?: ReactNode\n localization?: Partial\n name: string\n placeholder?: string\n required?: boolean\n label?: ReactNode\n type?: FieldType\n multiline?: boolean\n value?: unknown\n validate?: (value: string) => boolean | Promise\n}\n\nexport function UpdateFieldCard({\n className,\n classNames,\n description,\n instructions,\n localization: localizationProp,\n name,\n placeholder,\n required,\n label,\n type,\n multiline,\n value,\n validate\n}: UpdateFieldCardProps) {\n const {\n hooks: { useSession },\n mutators: { updateUser },\n localization: contextLocalization,\n optimistic,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { isPending } = useSession()\n\n let fieldSchema = z.unknown() as z.ZodType\n\n // Create the appropriate schema based on type\n if (type === \"number\") {\n fieldSchema = required\n ? z.preprocess(\n (val) => (!val ? undefined : Number(val)),\n z.number({\n required_error: `${label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n )\n : z.coerce\n .number({\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n .optional()\n } else if (type === \"boolean\") {\n fieldSchema = required\n ? z.coerce\n .boolean({\n required_error: `${label} ${localization.IS_REQUIRED}`,\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n .refine((val) => val === true, {\n message: `${label} ${localization.IS_REQUIRED}`\n })\n : z.coerce.boolean({\n invalid_type_error: `${label} ${localization.IS_INVALID}`\n })\n } else {\n fieldSchema = required\n ? z.string().min(1, `${label} ${localization.IS_REQUIRED}`)\n : z.string().optional()\n }\n\n const form = useForm({\n resolver: zodResolver(z.object({ [name]: fieldSchema })),\n values: { [name]: value || \"\" }\n })\n\n const { isSubmitting } = form.formState\n\n const updateField = async (values: Record) => {\n await new Promise((resolve) => setTimeout(resolve))\n const newValue = values[name]\n\n if (value === newValue) {\n toast({\n variant: \"error\",\n message: `${label} ${localization.IS_THE_SAME}`\n })\n return\n }\n\n if (\n validate &&\n typeof newValue === \"string\" &&\n !(await validate(newValue))\n ) {\n form.setError(name, {\n message: `${label} ${localization.IS_INVALID}`\n })\n\n return\n }\n\n try {\n await updateUser({ [name]: newValue })\n\n toast({\n variant: \"success\",\n message: `${label} ${localization.UPDATED_SUCCESSFULLY}`\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n }\n\n return (\n
\n \n \n \n {type === \"boolean\" ? (\n (\n \n \n \n \n\n \n {label}\n \n\n \n \n )}\n />\n ) : isPending ? (\n \n ) : (\n (\n \n \n {type === \"number\" ? (\n \n ) : multiline ? (\n \n ) : (\n \n )}\n \n\n \n \n )}\n />\n )}\n \n \n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/update-member-role-dialog.json b/public/r/update-member-role-dialog.json deleted file mode 100644 index 971494fe..00000000 --- a/public/r/update-member-role-dialog.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "update-member-role-dialog", - "type": "registry:component", - "title": "Update Member Role Dialog", - "description": "", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/member-cell.json", - "select", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/update-member-role-dialog.tsx", - "content": "\"use client\"\n\nimport type { User } from \"better-auth\"\nimport type { Member } from \"better-auth/plugins/organization\"\nimport { Loader2 } from \"lucide-react\"\nimport { type ComponentProps, useContext, useMemo, useState } from \"react\"\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { AuthLocalization } from \"../../localization/auth-localization\"\nimport type { SettingsCardClassNames } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle\n} from \"../ui/dialog\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue\n} from \"../ui/select\"\nimport { MemberCell } from \"./member-cell\"\n\nexport interface UpdateMemberRoleDialogProps\n extends ComponentProps {\n classNames?: SettingsCardClassNames\n localization?: AuthLocalization\n member: Member & { user?: Partial | null }\n}\n\nexport function UpdateMemberRoleDialog({\n member,\n classNames,\n localization: localizationProp,\n onOpenChange,\n ...props\n}: UpdateMemberRoleDialogProps) {\n const {\n authClient,\n hooks: { useSession, useListMembers },\n localization: contextLocalization,\n organization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data, refetch } = useListMembers({\n query: { organizationId: member.organizationId }\n })\n\n const members = data?.members\n\n const { data: sessionData } = useSession()\n\n const [isUpdating, setIsUpdating] = useState(false)\n const [selectedRole, setSelectedRole] = useState(member.role)\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organization?.customRoles || [])]\n\n const currentUserRole = members?.find(\n (m) => m.user?.id === sessionData?.user.id\n )?.role\n\n const availableRoles = roles.filter((role) => {\n if (role.role === \"owner\") {\n return currentUserRole === \"owner\"\n }\n\n if (role.role === \"admin\") {\n return currentUserRole === \"owner\" || currentUserRole === \"admin\"\n }\n\n return true\n })\n\n const updateMemberRole = async () => {\n if (selectedRole === member.role) {\n toast({\n variant: \"error\",\n message: `${localization.ROLE} ${localization.IS_THE_SAME}`\n })\n\n return\n }\n\n setIsUpdating(true)\n\n try {\n await authClient.organization.updateMemberRole({\n memberId: member.id,\n // @ts-ignore - role is a string but the type expects specific values\n role: selectedRole,\n organizationId: member.organizationId,\n fetchOptions: {\n throw: true\n }\n })\n\n toast({\n variant: \"success\",\n message: localization.MEMBER_ROLE_UPDATED\n })\n\n await refetch?.()\n\n onOpenChange?.(false)\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsUpdating(false)\n }\n\n return (\n \n e.preventDefault()}\n >\n \n \n {localization.UPDATE_ROLE}\n \n\n \n {localization.UPDATE_ROLE_DESCRIPTION}\n \n \n\n
\n \n\n \n \n \n \n\n \n {availableRoles.map((role) => (\n \n {role.label}\n \n ))}\n \n \n
\n\n \n onOpenChange?.(false)}\n className={cn(\n classNames?.button,\n classNames?.outlineButton\n )}\n disabled={isUpdating}\n >\n {localization.CANCEL}\n \n\n \n {isUpdating && }\n\n {localization.UPDATE_ROLE}\n \n \n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/update-name-card.json b/public/r/update-name-card.json deleted file mode 100644 index c229030f..00000000 --- a/public/r/update-name-card.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "update-name-card", - "type": "registry:component", - "title": "Update Name Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-field-card.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-name-card.tsx", - "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { UpdateFieldCard } from \"./update-field-card\"\n\nexport function UpdateNameCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useSession },\n localization: contextLocalization,\n nameRequired\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n\n return (\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/update-username-card.json b/public/r/update-username-card.json deleted file mode 100644 index d3b0d23c..00000000 --- a/public/r/update-username-card.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "update-username-card", - "type": "registry:component", - "title": "Update Username Card", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-field-card.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-username-card.tsx", - "content": "\"use client\"\n\nimport { useContext } from \"react\"\nimport { AuthUIContext } from \"../../../lib/auth-ui-provider\"\nimport type { User } from \"../../../types/auth-client\"\nimport type { SettingsCardProps } from \"../shared/settings-card\"\nimport { UpdateFieldCard } from \"./update-field-card\"\n\nexport function UpdateUsernameCard({\n className,\n classNames,\n localization,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useSession },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n const { data: sessionData } = useSession()\n const value =\n (sessionData?.user as User)?.displayUsername ||\n (sessionData?.user as User)?.username\n\n return (\n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/use-auth-data.json b/public/r/use-auth-data.json deleted file mode 100644 index 9ea8c1a2..00000000 --- a/public/r/use-auth-data.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-auth-data", - "type": "registry:hook", - "title": "Use Auth Data", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-data-cache.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/fetch-error.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/hooks/use-auth-data.ts", - "content": "import {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore\n} from \"react\"\n\nimport { authDataCache } from \"../lib/auth-data-cache\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getLocalizedError } from \"../lib/utils\"\nimport type { FetchError } from \"../types/fetch-error\"\n\nexport function useAuthData({\n queryFn,\n cacheKey,\n staleTime = 10000 // Default 10 seconds\n}: {\n queryFn: () => Promise<{ data: T | null; error?: FetchError | null }>\n cacheKey?: string\n staleTime?: number\n}) {\n const {\n hooks: { useSession },\n toast,\n localization\n } = useContext(AuthUIContext)\n const { data: sessionData, isPending: sessionPending } = useSession()\n\n // Generate a stable cache key based on the queryFn if not provided\n const queryFnRef = useRef(queryFn)\n queryFnRef.current = queryFn\n\n const stableCacheKey = cacheKey || queryFn.toString()\n\n // Subscribe to cache updates for this key\n const cacheEntry = useSyncExternalStore(\n useCallback(\n (callback) => authDataCache.subscribe(stableCacheKey, callback),\n [stableCacheKey]\n ),\n useCallback(\n () => authDataCache.get(stableCacheKey),\n [stableCacheKey]\n ),\n useCallback(\n () => authDataCache.get(stableCacheKey),\n [stableCacheKey]\n )\n )\n\n const initialized = useRef(false)\n const previousUserId = useRef(undefined)\n const [error, setError] = useState(null)\n\n const refetch = useCallback(async () => {\n // Check if there's already an in-flight request for this key\n const existingRequest = authDataCache.getInFlightRequest<{\n data: T | null\n error?: FetchError | null\n }>(stableCacheKey)\n if (existingRequest) {\n // Wait for the existing request to complete\n try {\n const result = await existingRequest\n if (result.error) {\n setError(result.error)\n } else {\n setError(null)\n }\n } catch (err) {\n setError(err as FetchError)\n }\n return\n }\n\n // Mark as refetching if we have cached data\n if (cacheEntry?.data !== undefined) {\n authDataCache.setRefetching(stableCacheKey, true)\n }\n\n // Create the fetch promise\n const fetchPromise = queryFnRef.current()\n\n // Store the promise as in-flight\n authDataCache.setInFlightRequest(stableCacheKey, fetchPromise)\n\n try {\n const { data, error } = await fetchPromise\n\n if (error) {\n setError(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n } else {\n setError(null)\n }\n\n // Update cache with new data\n authDataCache.set(stableCacheKey, data)\n } catch (err) {\n const error = err as FetchError\n setError(error)\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n } finally {\n authDataCache.setRefetching(stableCacheKey, false)\n authDataCache.removeInFlightRequest(stableCacheKey)\n }\n }, [stableCacheKey, toast, localization, cacheEntry])\n\n useEffect(() => {\n const currentUserId = sessionData?.user?.id\n\n if (!sessionData) {\n // Clear cache when session is lost\n authDataCache.setRefetching(stableCacheKey, false)\n authDataCache.clear(stableCacheKey)\n initialized.current = false\n previousUserId.current = undefined\n return\n }\n\n // Check if user ID has changed\n const userIdChanged =\n previousUserId.current !== undefined &&\n previousUserId.current !== currentUserId\n\n // If user changed, clear cache to ensure isPending becomes true\n if (userIdChanged) {\n authDataCache.clear(stableCacheKey)\n }\n\n // If we have cached data, we're not pending anymore\n const hasCachedData = cacheEntry?.data !== undefined\n\n // Check if data is stale\n const isStale =\n !cacheEntry || Date.now() - cacheEntry.timestamp > staleTime\n\n if (\n !initialized.current ||\n !hasCachedData ||\n userIdChanged ||\n (hasCachedData && isStale)\n ) {\n // Only fetch if we don't have data or if the data is stale\n if (!hasCachedData || isStale) {\n initialized.current = true\n refetch()\n }\n }\n\n // Update the previous user ID\n previousUserId.current = currentUserId\n }, [\n sessionData,\n sessionData?.user?.id,\n stableCacheKey,\n refetch,\n cacheEntry,\n staleTime\n ])\n\n // Determine if we're in a pending state\n // We're only pending if:\n // 1. Session is still loading, OR\n // 2. We have no cached data and no error\n const isPending =\n sessionPending || (cacheEntry?.data === undefined && !error)\n\n return {\n data: cacheEntry?.data ?? null,\n isPending,\n isRefetching: cacheEntry?.isRefetching ?? false,\n error,\n refetch\n }\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-authenticate.json b/public/r/use-authenticate.json deleted file mode 100644 index fa0ec396..00000000 --- a/public/r/use-authenticate.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-authenticate", - "type": "registry:hook", - "title": "Use Authenticate", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/hooks/use-authenticate.ts", - "content": "import { useContext, useEffect } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport type { AuthViewPath } from \"../server\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\n\ninterface AuthenticateOptions {\n authClient?: TAuthClient\n authView?: AuthViewPath\n enabled?: boolean\n}\n\nexport function useAuthenticate(\n options?: AuthenticateOptions\n) {\n type Session = TAuthClient[\"$Infer\"][\"Session\"][\"session\"]\n type User = TAuthClient[\"$Infer\"][\"Session\"][\"user\"]\n\n const { authView = \"SIGN_IN\", enabled = true } = options ?? {}\n\n const {\n hooks: { useSession },\n basePath,\n viewPaths,\n replace\n } = useContext(AuthUIContext)\n\n const { data, isPending, error, refetch } = useSession()\n const sessionData = data as\n | {\n session: Session\n user: User\n }\n | null\n | undefined\n\n useEffect(() => {\n if (!enabled || isPending || sessionData) return\n\n replace(\n `${basePath}/${viewPaths[authView]}?redirectTo=${window.location.href.replace(window.location.origin, \"\")}`\n )\n }, [\n isPending,\n sessionData,\n basePath,\n viewPaths,\n replace,\n authView,\n enabled\n ])\n\n return {\n data: sessionData,\n user: sessionData?.user,\n isPending,\n error,\n refetch\n }\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-captcha.json b/public/r/use-captcha.json deleted file mode 100644 index 446aadfc..00000000 --- a/public/r/use-captcha.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-captcha", - "type": "registry:hook", - "title": "Use Captcha", - "description": "", - "dependencies": [ - "@hcaptcha/react-hcaptcha", - "@marsidev/react-turnstile", - "@wojtekmaj/react-recaptcha-v3", - "react-google-recaptcha" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/hooks/use-captcha.tsx", - "content": "import type HCaptcha from \"@hcaptcha/react-hcaptcha\"\nimport type { TurnstileInstance } from \"@marsidev/react-turnstile\"\nimport { useGoogleReCaptcha } from \"@wojtekmaj/react-recaptcha-v3\"\nimport { type RefObject, useContext, useRef } from \"react\"\nimport type ReCAPTCHA from \"react-google-recaptcha\"\n\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\n\n// Default captcha endpoints\nconst DEFAULT_CAPTCHA_ENDPOINTS = [\n \"/sign-up/email\",\n \"/sign-in/email\",\n \"/forget-password\"\n]\n\n// Sanitize action name for reCAPTCHA\n// Google reCAPTCHA only allows A-Za-z/_ in action names\nconst sanitizeActionName = (action: string): string => {\n // First remove leading slash if present\n let result = action.startsWith(\"/\") ? action.substring(1) : action\n\n // Convert both kebab-case and path separators to camelCase\n // Example: \"/sign-in/email\" becomes \"signInEmail\"\n result = result\n .replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/\\/([a-z])/g, (_, letter) => letter.toUpperCase())\n .replace(/\\//g, \"\")\n .replace(/[^A-Za-z0-9_]/g, \"\")\n\n return result\n}\n\nexport function useCaptcha({\n localization\n}: {\n localization: Partial\n}) {\n const { captcha, localization: contextLocalization } =\n useContext(AuthUIContext)\n\n localization = { ...contextLocalization, ...localization }\n\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n const captchaRef = useRef(null)\n const { executeRecaptcha } = useGoogleReCaptcha()\n\n const executeCaptcha = async (action: string) => {\n if (!captcha) throw new Error(localization.MISSING_RESPONSE)\n\n // Sanitize the action name for reCAPTCHA\n let response: string | undefined | null\n\n switch (captcha.provider) {\n case \"google-recaptcha-v3\": {\n const sanitizedAction = sanitizeActionName(action)\n response = await executeRecaptcha?.(sanitizedAction)\n break\n }\n case \"google-recaptcha-v2-checkbox\": {\n const recaptchaRef = captchaRef as RefObject\n response = recaptchaRef.current.getValue()\n break\n }\n case \"google-recaptcha-v2-invisible\": {\n const recaptchaRef = captchaRef as RefObject\n response = await recaptchaRef.current.executeAsync()\n break\n }\n case \"cloudflare-turnstile\": {\n const turnstileRef = captchaRef as RefObject\n response = turnstileRef.current.getResponse()\n break\n }\n case \"hcaptcha\": {\n const hcaptchaRef = captchaRef as RefObject\n response = hcaptchaRef.current.getResponse()\n break\n }\n }\n\n if (!response) {\n throw new Error(localization.MISSING_RESPONSE)\n }\n\n return response\n }\n\n const getCaptchaHeaders = async (action: string) => {\n if (!captcha) return undefined\n\n // Use custom endpoints if provided, otherwise use defaults\n const endpoints = captcha.endpoints || DEFAULT_CAPTCHA_ENDPOINTS\n\n // Only execute captcha if the action is in the endpoints list\n if (endpoints.includes(action)) {\n return { \"x-captcha-response\": await executeCaptcha(action) }\n }\n\n return undefined\n }\n\n const resetCaptcha = () => {\n if (!captcha) return\n\n switch (captcha.provider) {\n case \"google-recaptcha-v3\": {\n // No widget to reset; token is generated per execute call\n break\n }\n case \"google-recaptcha-v2-checkbox\":\n case \"google-recaptcha-v2-invisible\": {\n const recaptchaRef = captchaRef as RefObject\n recaptchaRef.current?.reset?.()\n break\n }\n case \"cloudflare-turnstile\": {\n const turnstileRef = captchaRef as RefObject\n // Some versions expose reset on the instance\n // biome-ignore lint/suspicious/noExplicitAny: defensive\n ;(turnstileRef.current as any)?.reset?.()\n break\n }\n case \"hcaptcha\": {\n const hcaptchaRef = captchaRef as RefObject\n // HCaptcha uses resetCaptcha()\n hcaptchaRef.current?.resetCaptcha?.()\n break\n }\n }\n }\n\n return {\n captchaRef,\n getCaptchaHeaders,\n resetCaptcha\n }\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-conditional-query.json b/public/r/use-conditional-query.json deleted file mode 100644 index 9ea82306..00000000 --- a/public/r/use-conditional-query.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-conditional-query", - "type": "registry:lib", - "title": "Use Conditional Query", - "description": "", - "dependencies": [ - "@triplit/client", - "@triplit/react" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/triplit/use-conditional-query.ts", - "content": "import type {\n FetchResult,\n Models,\n SchemaQuery,\n SubscriptionOptions,\n SubscriptionSignalPayload,\n TriplitClient\n} from \"@triplit/client\"\nimport type { WorkerClient } from \"@triplit/client/worker-client\"\nimport { createStateSubscription } from \"@triplit/react\"\nimport { useCallback, useMemo, useState, useSyncExternalStore } from \"react\"\n\nexport function useConditionalQuery<\n M extends Models,\n Q extends SchemaQuery\n>(\n client: TriplitClient | WorkerClient,\n query?: Q | false | null | \"\" | 0,\n options?: Partial & { disabled?: boolean }\n) {\n const stringifiedQuery =\n !options?.disabled && query && JSON.stringify(query)\n const localOnly = !!options?.localOnly\n const [remoteFulfilled, setRemoteFulfilled] = useState(false)\n\n const defaultValue: SubscriptionSignalPayload = {\n results: undefined,\n fetching: true,\n fetchingLocal: false,\n fetchingRemote: false,\n error: undefined\n }\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: prevent infinite re-renders\n const [subscribe, snapshot] = useMemo(\n () =>\n stringifiedQuery\n ? createStateSubscription(client, query, {\n ...options,\n onRemoteFulfilled: () => setRemoteFulfilled(true)\n })\n : [() => () => {}, () => defaultValue],\n [stringifiedQuery, localOnly]\n )\n\n const getServerSnapshot = useCallback(() => snapshot(), [snapshot])\n const { fetching, ...rest } = useSyncExternalStore(\n subscribe,\n snapshot,\n getServerSnapshot\n )\n return { fetching: fetching && !remoteFulfilled, ...rest }\n}\n\ntype useConditionalQueryOnePayload<\n M extends Models,\n Q extends SchemaQuery\n> = Omit, \"results\"> & {\n result: FetchResult\n}\n\nexport function useConditionalQueryOne<\n M extends Models,\n Q extends SchemaQuery\n>(\n client: TriplitClient | WorkerClient,\n query?: Q | false | null | \"\" | 0,\n options?: Partial & { disabled?: boolean }\n): useConditionalQueryOnePayload {\n const { fetching, fetchingLocal, fetchingRemote, results, error } =\n useConditionalQuery(\n client,\n query ? ({ ...query, limit: 1 } as Q) : query,\n options\n )\n\n const result = useMemo(() => {\n return results?.[0] ?? null\n }, [results])\n\n return { fetching, fetchingLocal, fetchingRemote, result, error }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-current-organization.json b/public/r/use-current-organization.json deleted file mode 100644 index 4515d7b0..00000000 --- a/public/r/use-current-organization.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-current-organization", - "type": "registry:hook", - "title": "Use Current Organization", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/hooks/use-current-organization.ts", - "content": "import type { Organization } from \"better-auth/plugins/organization\"\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\n\nexport function useCurrentOrganization({\n slug: slugProp\n}: {\n slug?: string\n} = {}) {\n const {\n organization: organizationOptions,\n hooks: { useActiveOrganization, useListOrganizations }\n } = useContext(AuthUIContext)\n\n const { pathMode, slug: contextSlug } = organizationOptions || {}\n\n let data: Organization | null | undefined\n let isPending: boolean | undefined\n let isRefetching: boolean | undefined\n\n let refetch: (() => void) | undefined\n\n const {\n data: organizations,\n isPending: organizationsPending,\n isRefetching: organizationsRefetching\n } = useListOrganizations()\n\n if (pathMode === \"slug\") {\n const slug = slugProp || contextSlug\n\n data = organizations?.find((organization) => organization.slug === slug)\n isPending = organizationsPending\n isRefetching = organizationsRefetching\n } else {\n const {\n data: activeOrganization,\n isPending: organizationPending,\n isRefetching: organizationRefetching,\n refetch: refetchOrganization\n } = useActiveOrganization()\n\n refetch = refetchOrganization\n\n data = activeOrganization\n isPending = organizationPending\n isRefetching = organizationRefetching\n }\n\n return useMemo(\n () => ({\n data,\n isPending,\n isRefetching,\n refetch\n }),\n [data, isPending, isRefetching, refetch]\n )\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-hydrated.json b/public/r/use-hydrated.json deleted file mode 100644 index 7334e48c..00000000 --- a/public/r/use-hydrated.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-hydrated", - "type": "registry:hook", - "title": "Use Hydrated", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/hooks/use-hydrated.ts", - "content": "import { useSyncExternalStore } from \"react\"\n\nfunction subscribe() {\n return () => {}\n}\n\nexport function useIsHydrated() {\n return useSyncExternalStore(\n subscribe,\n () => true,\n () => false\n )\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-instant-options.json b/public/r/use-instant-options.json deleted file mode 100644 index 3b15203f..00000000 --- a/public/r/use-instant-options.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-instant-options", - "type": "registry:lib", - "title": "Use Instant Options", - "description": "", - "dependencies": [ - "@instantdb/react", - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/auth-mutators.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/use-list-accounts.json", - "https://better-auth-ui.com/r/use-list-sessions.json", - "https://better-auth-ui.com/r/use-session.json" - ], - "files": [ - { - "path": "src/lib/instantdb/use-instant-options.ts", - "content": "import type { InstantReactWebDatabase } from \"@instantdb/react\"\nimport type { User } from \"better-auth\"\nimport { useMemo } from \"react\"\n\nimport type { Session } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { AuthMutators } from \"../../types/auth-mutators\"\nimport type { Refetch } from \"../../types/refetch\"\nimport { getModelName } from \"./model-names\"\nimport { useListAccounts } from \"./use-list-accounts\"\nimport { useListSessions } from \"./use-list-sessions\"\nimport { useSession } from \"./use-session\"\n\nconst namespaces = [\"user\", \"session\", \"account\", \"passkey\"] as const\ntype Namespace = (typeof namespaces)[number]\n\ntype ModelNames = {\n [key in Namespace]: string\n}\n\nexport interface UseInstantOptionsProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n db: InstantReactWebDatabase\n modelNames?: Partial\n usePlural?: boolean\n sessionData?: { user: User; session: Session }\n refetch?: Refetch\n user?: { id: string } | null\n isPending: boolean\n}\n\nexport function useInstantOptions({\n db,\n usePlural = true,\n modelNames,\n sessionData,\n isPending,\n user\n}: UseInstantOptionsProps) {\n const userId = user?.id || sessionData?.user.id\n\n const hooks = useMemo(() => {\n return {\n useSession: () =>\n useSession({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListAccounts: () =>\n useListAccounts({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListSessions: () =>\n useListSessions({\n db,\n modelNames,\n usePlural,\n sessionData,\n isPending\n })\n } as AuthHooks\n }, [db, modelNames, usePlural, sessionData, isPending])\n\n const mutators = useMemo(() => {\n return {\n updateUser: async (data) => {\n if (!userId) {\n throw new Error(\"Unauthenticated\")\n }\n\n const modelName = getModelName({\n namespace: \"user\",\n modelNames,\n usePlural\n })\n\n db.transact([\n db.tx[modelName][userId].update({\n ...data,\n updatedAt: Date.now()\n })\n ])\n }\n } as AuthMutators\n }, [db, userId, modelNames, usePlural])\n\n return {\n hooks,\n mutators\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-lang.json b/public/r/use-lang.json deleted file mode 100644 index 5422b5c4..00000000 --- a/public/r/use-lang.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-lang", - "type": "registry:hook", - "title": "Use Lang", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/hooks/use-lang.ts", - "content": "import { useEffect, useState } from \"react\"\n\nexport function useLang() {\n const [lang, setLang] = useState()\n\n useEffect(() => {\n const checkLang = () => {\n const currentLang = document.documentElement.getAttribute(\"lang\")\n setLang(currentLang ?? undefined)\n }\n\n // Initial check\n checkLang()\n\n // Listen for changes to lang attribute on html tag\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.attributeName === \"lang\") {\n checkLang()\n }\n }\n })\n\n observer.observe(document.documentElement, { attributes: true })\n\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return { lang }\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-list-accounts.json b/public/r/use-list-accounts.json deleted file mode 100644 index c83f0784..00000000 --- a/public/r/use-list-accounts.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-list-accounts", - "type": "registry:lib", - "title": "Use List Accounts", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-conditional-query.json", - "https://better-auth-ui.com/r/use-triplit-hooks.json", - "https://better-auth-ui.com/r/use-triplit-token.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-list-accounts.ts", - "content": "import { useMemo } from \"react\"\n\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQuery } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useListAccounts({\n triplit,\n modelNames,\n usePlural,\n isPending\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"account\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const { results, error, fetching } = useConditionalQuery(\n triplit,\n payload?.sub && triplit.query(modelName)\n )\n\n const accounts = useMemo(() => {\n return results?.map((account) => ({\n accountId: account.accountId as string,\n provider: account.providerId as string\n }))\n }, [results])\n\n return {\n data: accounts,\n isPending: isPending || fetching,\n error\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-list-sessions.json b/public/r/use-list-sessions.json deleted file mode 100644 index ea925d6f..00000000 --- a/public/r/use-list-sessions.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-list-sessions", - "type": "registry:lib", - "title": "Use List Sessions", - "description": "", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-conditional-query.json", - "https://better-auth-ui.com/r/use-triplit-hooks.json", - "https://better-auth-ui.com/r/use-triplit-token.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-list-sessions.ts", - "content": "import type { Session } from \"better-auth\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQuery } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useListSessions({\n triplit,\n modelNames,\n usePlural,\n isPending\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"session\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const {\n results: sessions,\n error,\n fetching\n } = useConditionalQuery(triplit, payload?.sub && triplit.query(modelName))\n\n return {\n data: sessions as Session[] | undefined,\n isPending: isPending || fetching,\n error\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-session.json b/public/r/use-session.json deleted file mode 100644 index 88ba1ff3..00000000 --- a/public/r/use-session.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-session", - "type": "registry:lib", - "title": "Use Session", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-conditional-query.json", - "https://better-auth-ui.com/r/use-triplit-hooks.json", - "https://better-auth-ui.com/r/use-triplit-token.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-session.ts", - "content": "import type { User } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport { getModelName } from \"./model-names\"\nimport { useConditionalQueryOne } from \"./use-conditional-query\"\nimport type { UseTriplitOptionsProps } from \"./use-triplit-hooks\"\nimport { useTriplitToken } from \"./use-triplit-token\"\n\nexport function useSession({\n triplit,\n sessionData,\n isPending,\n refetch,\n usePlural,\n modelNames\n}: UseTriplitOptionsProps): ReturnType {\n const modelName = getModelName({\n namespace: \"user\",\n modelNames,\n usePlural\n })\n\n const { payload } = useTriplitToken(triplit)\n\n const { result: user, error } = useConditionalQueryOne(\n triplit,\n payload?.sub && triplit.query(modelName)\n )\n\n return {\n data: sessionData\n ? {\n session: sessionData.session,\n user: (sessionData?.user.id === user?.id\n ? user\n : sessionData.user) as User\n }\n : null,\n error,\n isPending: isPending,\n refetch: refetch || (() => {})\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-success-transition.json b/public/r/use-success-transition.json deleted file mode 100644 index e04db631..00000000 --- a/public/r/use-success-transition.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-success-transition", - "type": "registry:hook", - "title": "Use Success Transition", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/hooks/use-success-transition.ts", - "content": "import {\n useCallback,\n useContext,\n useEffect,\n useState,\n useTransition\n} from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getSearchParam } from \"../lib/utils\"\n\nexport function useOnSuccessTransition({\n redirectTo: redirectToProp\n}: {\n redirectTo?: string\n}) {\n const { redirectTo: contextRedirectTo } = useContext(AuthUIContext)\n\n const getRedirectTo = useCallback(\n () =>\n redirectToProp || getSearchParam(\"redirectTo\") || contextRedirectTo,\n [redirectToProp, contextRedirectTo]\n )\n\n const [isPending, startTransition] = useTransition()\n const [success, setSuccess] = useState(false)\n\n const {\n navigate,\n hooks: { useSession },\n onSessionChange\n } = useContext(AuthUIContext)\n\n const { refetch: refetchSession } = useSession()\n\n useEffect(() => {\n if (!success || isPending) return\n\n startTransition(() => {\n navigate(getRedirectTo())\n })\n }, [success, isPending, navigate, getRedirectTo])\n\n const onSuccess = useCallback(async () => {\n await refetchSession?.()\n setSuccess(true)\n\n if (onSessionChange) startTransition(onSessionChange)\n }, [refetchSession, onSessionChange])\n\n return { onSuccess, isPending }\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-tanstack-options.json b/public/r/use-tanstack-options.json deleted file mode 100644 index a218cf03..00000000 --- a/public/r/use-tanstack-options.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-tanstack-options", - "type": "registry:lib", - "title": "Use Tanstack Options", - "description": "", - "dependencies": [ - "@daveyplate/better-auth-tanstack", - "@tanstack/react-query" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/auth-mutators.json" - ], - "files": [ - { - "path": "src/lib/tanstack/use-tanstack-options.ts", - "content": "import {\n AuthQueryContext,\n createAuthHooks\n} from \"@daveyplate/better-auth-tanstack\"\nimport { useIsRestoring, useQueryClient } from \"@tanstack/react-query\"\nimport { useCallback, useContext, useMemo } from \"react\"\n\nimport type { AnyAuthClient } from \"../../types/any-auth-client\"\nimport type { AuthClient } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { AuthMutators } from \"../../types/auth-mutators\"\n\nexport function useTanstackOptions({\n authClient\n}: {\n authClient: AnyAuthClient\n}) {\n const {\n useUnlinkAccount,\n useUpdateUser,\n useDeletePasskey,\n useRevokeSession,\n useRevokeDeviceSession,\n useSetActiveSession\n } = createAuthHooks(authClient)\n const queryClient = useQueryClient()\n\n const { mutateAsync: updateUserAsync } = useUpdateUser()\n const { mutateAsync: deletePasskeyAsync } = useDeletePasskey()\n const { mutateAsync: unlinkAccountAsync } = useUnlinkAccount()\n const { mutateAsync: revokeSessionAsync } = useRevokeSession()\n const { mutateAsync: revokeDeviceSessionAsync } = useRevokeDeviceSession()\n const { setActiveSessionAsync } = useSetActiveSession()\n const { sessionKey } = useContext(AuthQueryContext)\n\n const hooks = useMemo(\n () => ({\n ...(createAuthHooks(\n authClient as AuthClient\n ) as Partial),\n useIsRestoring\n }),\n [authClient]\n )\n\n const mutators = useMemo(\n () =>\n ({\n updateUser: async (params) => {\n const { error } = await updateUserAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n unlinkAccount: async (params) => {\n const { error } = await unlinkAccountAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n deletePasskey: async (params) => {\n const { error } = await deletePasskeyAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n revokeSession: async (params) => {\n const { error } = await revokeSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n setActiveSession: async (params) => {\n const { error } = await setActiveSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n },\n revokeDeviceSession: async (params) => {\n const { error } = await revokeDeviceSessionAsync({\n ...params,\n fetchOptions: { throw: false }\n })\n if (error) throw error\n }\n }) as AuthMutators,\n [\n updateUserAsync,\n deletePasskeyAsync,\n unlinkAccountAsync,\n revokeSessionAsync,\n revokeDeviceSessionAsync,\n setActiveSessionAsync\n ]\n )\n\n const onSessionChange = useCallback(async () => {\n await queryClient.refetchQueries({ queryKey: sessionKey })\n\n queryClient.invalidateQueries({\n predicate: (query) => query.queryKey !== sessionKey\n })\n }, [queryClient, sessionKey])\n\n return {\n hooks,\n mutators,\n onSessionChange,\n optimistic: true\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-theme.json b/public/r/use-theme.json deleted file mode 100644 index 92064415..00000000 --- a/public/r/use-theme.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-theme", - "type": "registry:hook", - "title": "Use Theme", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/hooks/use-theme.ts", - "content": "import { useEffect, useState } from \"react\"\n\nexport function useTheme() {\n const [theme, setTheme] = useState<\"light\" | \"dark\">(\"light\")\n\n useEffect(() => {\n const checkTheme = () => {\n const isDark =\n document.documentElement.classList.contains(\"dark\") ||\n document.documentElement\n .getAttribute(\"style\")\n ?.includes(\"color-scheme: dark\")\n setTheme(isDark ? \"dark\" : \"light\")\n }\n\n // Initial check\n checkTheme()\n\n // Listen for changes to html tag\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.attributeName === \"style\" ||\n mutation.attributeName === \"class\"\n ) {\n checkTheme()\n }\n }\n })\n\n observer.observe(document.documentElement, { attributes: true })\n\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return { theme }\n}\n", - "type": "registry:hook" - } - ] -} \ No newline at end of file diff --git a/public/r/use-triplit-hooks.json b/public/r/use-triplit-hooks.json deleted file mode 100644 index 1456da45..00000000 --- a/public/r/use-triplit-hooks.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-triplit-hooks", - "type": "registry:lib", - "title": "Use Triplit Hooks", - "description": "", - "dependencies": [ - "@triplit/client", - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/use-list-accounts.json", - "https://better-auth-ui.com/r/use-list-sessions.json", - "https://better-auth-ui.com/r/use-session.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-triplit-hooks.ts", - "content": "import type { TriplitClient } from \"@triplit/client\"\nimport type { User } from \"better-auth\"\nimport { useMemo } from \"react\"\n\nimport type { Session } from \"../../types/auth-client\"\nimport type { AuthHooks } from \"../../types/auth-hooks\"\nimport type { Refetch } from \"../../types/refetch\"\nimport { useListAccounts } from \"./use-list-accounts\"\nimport { useListSessions } from \"./use-list-sessions\"\nimport { useSession } from \"./use-session\"\n\nconst namespaces = [\"user\", \"session\", \"account\", \"passkey\"] as const\ntype Namespace = (typeof namespaces)[number]\n\ntype ModelNames = {\n [key in Namespace]: string\n}\n\nexport interface UseTriplitOptionsProps {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n triplit: TriplitClient\n modelNames?: Partial\n usePlural?: boolean\n sessionData?: { user: User; session: Session } | null\n refetch?: Refetch\n isPending: boolean\n}\n\nexport function useTriplitHooks({\n triplit,\n usePlural = true,\n modelNames,\n sessionData,\n isPending\n}: UseTriplitOptionsProps) {\n const hooks = useMemo(() => {\n return {\n useSession: () =>\n useSession({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListAccounts: () =>\n useListAccounts({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n }),\n useListSessions: () =>\n useListSessions({\n triplit,\n modelNames,\n usePlural,\n sessionData,\n isPending\n })\n } as AuthHooks\n }, [triplit, modelNames, usePlural, sessionData, isPending])\n\n return {\n hooks\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/use-triplit-token.json b/public/r/use-triplit-token.json deleted file mode 100644 index a463ce9e..00000000 --- a/public/r/use-triplit-token.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "use-triplit-token", - "type": "registry:lib", - "title": "Use Triplit Token", - "description": "", - "dependencies": [ - "@triplit/client", - "@triplit/react" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/triplit/use-triplit-token.ts", - "content": "import type { TriplitClient } from \"@triplit/client\"\nimport { useConnectionStatus } from \"@triplit/react\"\nimport { useMemo } from \"react\"\n\nexport function useTriplitToken(triplit: TriplitClient) {\n const connectionStatus = useConnectionStatus(triplit)\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: update when connection status changes\n const payload = useMemo(\n () =>\n triplit.token\n ? (decodeJWT(triplit.token) as Record & {\n exp: number\n iat: number\n sub?: string\n email?: string\n name?: string\n })\n : undefined,\n [connectionStatus]\n )\n\n return { token: payload && triplit.token, payload }\n}\n\nfunction decodeJWT(token: string) {\n try {\n const base64Url = token.split(\".\")[1]\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\")\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((char) => {\n return `%${(`00${char.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(\"\")\n )\n\n return JSON.parse(jsonPayload)\n } catch (error) {\n console.error(\"Failed to decode JWT:\", error)\n return null\n }\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/user-avatar.json b/public/r/user-avatar.json deleted file mode 100644 index eb6dfc96..00000000 --- a/public/r/user-avatar.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "user-avatar", - "type": "registry:component", - "title": "User Avatar", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "avatar", - "https://better-auth-ui.com/r/gravatar-utils.json", - "https://better-auth-ui.com/r/profile.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/user-avatar.tsx", - "content": "\"use client\"\n\nimport { UserRoundIcon } from \"lucide-react\"\nimport { type ComponentProps, useContext } from \"react\"\n\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { getGravatarUrl } from \"../lib/gravatar-utils\"\nimport { cn } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { Profile } from \"../types/profile\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\"\nimport { Skeleton } from \"./ui/skeleton\"\n\nexport interface UserAvatarClassNames {\n base?: string\n image?: string\n fallback?: string\n fallbackIcon?: string\n skeleton?: string\n}\n\nexport interface UserAvatarProps {\n classNames?: UserAvatarClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | \"xl\" | null\n user?: Profile | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: Partial\n}\n\n/**\n * Displays a user avatar with image and fallback support\n *\n * Renders a user's avatar image when available, with appropriate fallbacks:\n * - Shows a skeleton when isPending is true\n * - Displays first two characters of user's name when no image is available\n * - Falls back to a generic user icon when neither image nor name is available\n */\nexport function UserAvatar({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization,\n ...props\n}: UserAvatarProps & ComponentProps) {\n const {\n localization: contextLocalization,\n gravatar,\n avatar\n } = useContext(AuthUIContext)\n\n const localization = { ...contextLocalization, ...propLocalization }\n\n const name =\n user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email\n const userImage = user?.image || user?.avatar || user?.avatarUrl\n\n // Calculate gravatar URL synchronously\n const gravatarUrl =\n gravatar && user?.email\n ? getGravatarUrl(\n user.email,\n gravatar === true ? undefined : gravatar\n )\n : null\n\n const src = gravatar ? gravatarUrl : userImage\n\n if (isPending) {\n return (\n \n )\n }\n\n return (\n \n {avatar?.Image ? (\n \n ) : (\n \n )}\n\n \n {firstTwoCharacters(name) || (\n \n )}\n \n \n )\n}\n\nconst firstTwoCharacters = (name?: string | null) => name?.slice(0, 2)\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/user-button.json b/public/r/user-button.json deleted file mode 100644 index 8f5e1683..00000000 --- a/public/r/user-button.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "user-button", - "type": "registry:component", - "title": "User Button", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dropdown-menu", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/user-button.tsx", - "content": "\"use client\"\nimport {\n ChevronsUpDown,\n LogInIcon,\n LogOutIcon,\n PlusCircleIcon,\n SettingsIcon,\n UserRoundPlus\n} from \"lucide-react\"\nimport {\n type ComponentProps,\n Fragment,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from \"react\"\n\nimport { useIsHydrated } from \"../hooks/use-hydrated\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { AnyAuthClient } from \"../types/any-auth-client\"\nimport type { User } from \"../types/auth-client\"\nimport { Button } from \"./ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"./ui/dropdown-menu\"\nimport { UserAvatar, type UserAvatarClassNames } from \"./user-avatar\"\nimport { UserView, type UserViewClassNames } from \"./user-view\"\n\nexport interface UserButtonClassNames {\n base?: string\n skeleton?: string\n trigger?: {\n base?: string\n avatar?: UserAvatarClassNames\n user?: UserViewClassNames\n skeleton?: string\n }\n content?: {\n base?: string\n user?: UserViewClassNames\n avatar?: UserAvatarClassNames\n menuItem?: string\n separator?: string\n }\n}\n\nexport interface UserButtonProps {\n className?: string\n classNames?: UserButtonClassNames\n align?: \"center\" | \"start\" | \"end\"\n additionalLinks?: {\n href: string\n icon?: ReactNode\n label: ReactNode\n signedIn?: boolean\n separator?: boolean\n }[]\n trigger?: ReactNode\n disableDefaultLinks?: boolean\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays an interactive user button with dropdown menu functionality\n *\n * Renders a user interface element that can be displayed as either an icon or full button:\n * - Shows a user avatar or placeholder when in icon mode\n * - Displays user name and email with dropdown indicator in full mode\n * - Provides dropdown menu with authentication options (sign in/out, settings, etc.)\n * - Supports multi-session functionality for switching between accounts\n * - Can be customized with additional links and styling options\n */\nexport function UserButton({\n className,\n classNames,\n align,\n trigger,\n additionalLinks,\n disableDefaultLinks,\n localization: propLocalization,\n size,\n ...props\n}: UserButtonProps & ComponentProps) {\n const {\n basePath,\n hooks: { useSession, useListDeviceSessions },\n mutators: { setActiveSession },\n localization: contextLocalization,\n multiSession,\n account: accountOptions,\n signUp,\n toast,\n viewPaths,\n onSessionChange,\n Link\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n let deviceSessions:\n | AnyAuthClient[\"$Infer\"][\"Session\"][]\n | undefined\n | null = null\n let deviceSessionsPending = false\n\n if (multiSession) {\n const { data, isPending } = useListDeviceSessions()\n deviceSessions = data\n deviceSessionsPending = isPending\n }\n\n const { data: sessionData, isPending: sessionPending } = useSession()\n const user = sessionData?.user\n const [activeSessionPending, setActiveSessionPending] = useState(false)\n\n const isHydrated = useIsHydrated()\n const isPending = sessionPending || activeSessionPending || !isHydrated\n\n const switchAccount = useCallback(\n async (sessionToken: string) => {\n setActiveSessionPending(true)\n\n try {\n await setActiveSession({ sessionToken })\n\n onSessionChange?.()\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n setActiveSessionPending(false)\n }\n },\n [setActiveSession, onSessionChange, toast, localization]\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: ignore\n useEffect(() => {\n if (!multiSession) return\n\n setActiveSessionPending(false)\n }, [sessionData, multiSession])\n\n const warningLogged = useRef(false)\n\n useEffect(() => {\n if (size || warningLogged.current) return\n\n console.warn(\n \"[Better Auth UI] The `size` prop of `UserButton` no longer defaults to `icon`. Please pass `size='icon'` to the `UserButton` component to get the same behaviour as before. This warning will be removed in a future release. It can be suppressed in the meantime by defining the `size` prop.\"\n )\n\n warningLogged.current = true\n }, [size])\n\n return (\n \n \n {trigger ||\n (size === \"icon\" ? (\n \n \n \n ) : (\n \n \n\n \n \n ))}\n \n\n e.preventDefault()}\n >\n
\n {(user && !(user as User).isAnonymous) || isPending ? (\n \n ) : (\n
\n {localization.ACCOUNT}\n
\n )}\n
\n\n \n\n {additionalLinks?.map(\n ({ href, icon, label, signedIn, separator }, index) =>\n (signedIn === undefined ||\n (signedIn && !!sessionData) ||\n (!signedIn && !sessionData)) && (\n \n \n \n {icon}\n {label}\n \n \n {separator && (\n \n )}\n \n )\n )}\n\n {!user || (user as User).isAnonymous ? (\n <>\n \n \n \n\n {localization.SIGN_IN}\n \n \n\n {signUp && (\n \n \n \n\n {localization.SIGN_UP}\n \n \n )}\n \n ) : (\n <>\n {!disableDefaultLinks && accountOptions && (\n \n \n \n\n {localization.SETTINGS}\n \n \n )}\n\n \n \n \n\n {localization.SIGN_OUT}\n \n \n \n )}\n\n {user && multiSession && (\n <>\n \n\n {!deviceSessions && deviceSessionsPending && (\n <>\n \n \n \n\n \n \n )}\n\n {deviceSessions\n ?.filter(\n (sessionData) =>\n sessionData.user.id !== user?.id\n )\n .map(({ session, user }) => (\n \n \n switchAccount(session.token)\n }\n >\n \n \n\n \n \n ))}\n\n \n \n \n\n {localization.ADD_ACCOUNT}\n \n \n \n )}\n \n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/user-invitations-card.json b/public/r/user-invitations-card.json deleted file mode 100644 index 1f1d7292..00000000 --- a/public/r/user-invitations-card.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "user-invitations-card", - "type": "registry:component", - "title": "User Invitations Card", - "description": "", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/user-invitations-card.tsx", - "content": "\"use client\"\n\nimport { CheckIcon, EllipsisIcon, Loader2, XIcon } from \"lucide-react\"\nimport { useContext, useMemo, useState } from \"react\"\n\nimport { AuthUIContext } from \"../../lib/auth-ui-provider\"\nimport { cn, getLocalizedError } from \"../../lib/utils\"\nimport type { SettingsCardProps } from \"../settings/shared/settings-card\"\nimport { SettingsCard } from \"../settings/shared/settings-card\"\nimport { Button } from \"../ui/button\"\nimport { Card, CardContent } from \"../ui/card\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger\n} from \"../ui/dropdown-menu\"\nimport { UserAvatar } from \"../user-avatar\"\n\nexport function UserInvitationsCard({\n className,\n classNames,\n localization: localizationProp,\n ...props\n}: SettingsCardProps) {\n const {\n hooks: { useListUserInvitations, useListOrganizations },\n localization: contextLocalization\n } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...localizationProp }),\n [contextLocalization, localizationProp]\n )\n\n const { data: invitations, refetch: refetchInvitations } =\n useListUserInvitations()\n const { refetch: refetchOrganizations } = useListOrganizations()\n\n const handleRefresh = async () => {\n await refetchInvitations?.()\n await refetchOrganizations?.()\n }\n\n const pendingInvitations = invitations?.filter(\n (invitation) => invitation.status === \"pending\"\n )\n\n if (!pendingInvitations?.length) return null\n\n return (\n \n \n {pendingInvitations.map((invitation) => (\n \n ))}\n \n \n )\n}\n\nfunction UserInvitationRow({\n classNames,\n invitation,\n onChanged\n}: {\n classNames?: SettingsCardProps[\"classNames\"]\n invitation: {\n id: string\n email: string\n role: string\n status: string\n expiresAt: Date\n }\n onChanged?: () => unknown\n}) {\n const {\n authClient,\n organization: organizationOptions,\n localization: contextLocalization,\n toast\n } = useContext(AuthUIContext)\n\n const localization = contextLocalization\n\n const [isLoading, setIsLoading] = useState(false)\n\n const builtInRoles = [\n { role: \"owner\", label: localization.OWNER },\n { role: \"admin\", label: localization.ADMIN },\n { role: \"member\", label: localization.MEMBER }\n ]\n\n const roles = [...builtInRoles, ...(organizationOptions?.customRoles || [])]\n const role = roles.find((r) => r.role === invitation.role)\n\n const handleAccept = async () => {\n setIsLoading(true)\n\n try {\n await authClient.organization.acceptInvitation({\n invitationId: invitation.id,\n fetchOptions: { throw: true }\n })\n\n await onChanged?.()\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_ACCEPTED\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n const handleReject = async () => {\n setIsLoading(true)\n\n try {\n await authClient.organization.rejectInvitation({\n invitationId: invitation.id,\n fetchOptions: { throw: true }\n })\n\n await onChanged?.()\n\n toast({\n variant: \"success\",\n message: localization.INVITATION_REJECTED\n })\n } catch (error) {\n toast({\n variant: \"error\",\n message: getLocalizedError({ error, localization })\n })\n }\n\n setIsLoading(false)\n }\n\n return (\n \n
\n \n\n
\n \n {invitation.email}\n \n\n \n {localization.EXPIRES}{\" \"}\n {invitation.expiresAt.toLocaleDateString()}\n \n
\n
\n\n {role?.label}\n\n
\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n\n e.preventDefault()}\n >\n \n \n\n {localization.ACCEPT}\n \n\n \n \n\n {localization.REJECT}\n \n \n \n
\n
\n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/user-view.json b/public/r/user-view.json deleted file mode 100644 index f6fdb128..00000000 --- a/public/r/user-view.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "user-view", - "type": "registry:component", - "title": "User View", - "description": "", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/profile.json", - "skeleton", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/user-view.tsx", - "content": "\"use client\"\n\nimport { useContext, useMemo } from \"react\"\nimport { AuthUIContext } from \"../lib/auth-ui-provider\"\nimport { cn } from \"../lib/utils\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { Profile } from \"../types/profile\"\nimport { Skeleton } from \"./ui/skeleton\"\nimport { UserAvatar, type UserAvatarClassNames } from \"./user-avatar\"\n\nexport interface UserViewClassNames {\n base?: string\n avatar?: UserAvatarClassNames\n content?: string\n title?: string\n subtitle?: string\n skeleton?: string\n}\n\nexport interface UserViewProps {\n className?: string\n classNames?: UserViewClassNames\n isPending?: boolean\n size?: \"sm\" | \"default\" | \"lg\" | null\n user?: Profile | null\n /**\n * @default authLocalization\n * @remarks `AuthLocalization`\n */\n localization?: AuthLocalization\n}\n\n/**\n * Displays user information with avatar and details in a compact view\n *\n * Renders a user's profile information with appropriate fallbacks:\n * - Shows avatar alongside user name and email when available\n * - Shows loading skeletons when isPending is true\n * - Falls back to generic \"User\" text when neither name nor email is available\n * - Supports customization through classNames prop\n */\nexport function UserView({\n className,\n classNames,\n isPending,\n size,\n user,\n localization: propLocalization\n}: UserViewProps) {\n const { localization: contextLocalization } = useContext(AuthUIContext)\n\n const localization = useMemo(\n () => ({ ...contextLocalization, ...propLocalization }),\n [contextLocalization, propLocalization]\n )\n\n return (\n \n \n\n \n {isPending ? (\n <>\n \n {size !== \"sm\" && (\n \n )}\n \n ) : (\n <>\n \n {user?.displayName ||\n user?.name ||\n user?.fullName ||\n user?.firstName ||\n user?.displayUsername ||\n user?.username ||\n user?.email ||\n localization?.USER}\n \n\n {!user?.isAnonymous &&\n size !== \"sm\" &&\n (user?.name || user?.username) && (\n \n {user?.email}\n \n )}\n \n )}\n \n \n )\n}\n", - "type": "registry:component" - } - ] -} \ No newline at end of file diff --git a/public/r/username-error-codes.json b/public/r/username-error-codes.json deleted file mode 100644 index 7a59c99c..00000000 --- a/public/r/username-error-codes.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "username-error-codes", - "type": "registry:file", - "title": "Username Error Codes", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/username-error-codes.ts", - "content": "export const USERNAME_ERROR_CODES = {\n INVALID_USERNAME_OR_PASSWORD: \"invalid username or password\",\n EMAIL_NOT_VERIFIED: \"email not verified\",\n UNEXPECTED_ERROR: \"unexpected error\",\n USERNAME_IS_ALREADY_TAKEN: \"username is already taken. please try another.\",\n USERNAME_TOO_SHORT: \"username is too short\",\n USERNAME_TOO_LONG: \"username is too long\",\n INVALID_USERNAME: \"username is invalid\"\n}\n", - "type": "registry:file", - "target": "localization/username-error-codes.ts" - } - ] -} \ No newline at end of file diff --git a/public/r/utils.json b/public/r/utils.json deleted file mode 100644 index 2fbe8d3e..00000000 --- a/public/r/utils.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "utils", - "type": "registry:lib", - "title": "Utils", - "description": "", - "dependencies": [ - "clsx", - "tailwind-merge", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/password-validation.json" - ], - "files": [ - { - "path": "src/lib/utils.ts", - "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport * as z from \"zod\"\nimport type { AuthLocalization } from \"../localization/auth-localization\"\nimport type { PasswordValidation } from \"../types/password-validation\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function isValidEmail(email: string) {\n const emailRegex: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n/**\n * Converts error codes from SNAKE_CASE to camelCase\n * Example: INVALID_TWO_FACTOR_COOKIE -> invalidTwoFactorCookie\n */\nexport function errorCodeToCamelCase(errorCode: string): string {\n return errorCode\n .toLowerCase()\n .replace(/_([a-z])/g, (_, char) => char.toUpperCase())\n}\n\n/**\n * Gets a localized error message from an error object\n */\nexport function getLocalizedError({\n error,\n localization\n}: {\n // biome-ignore lint/suspicious/noExplicitAny: ignore\n error: any\n localization?: Partial\n}) {\n if (typeof error === \"string\") {\n if (localization?.[error as keyof AuthLocalization])\n return localization[error as keyof AuthLocalization]\n }\n\n if (error?.error) {\n if (error.error.code) {\n const errorCode = error.error.code as keyof AuthLocalization\n if (localization?.[errorCode]) return localization[errorCode]\n }\n\n return (\n error.error.message ||\n error.error.code ||\n error.error.statusText ||\n localization?.REQUEST_FAILED\n )\n }\n\n return error?.message || localization?.REQUEST_FAILED || \"Request failed\"\n}\n\nexport function getSearchParam(paramName: string) {\n return typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(paramName)\n : null\n}\n\nexport function getViewByPath(viewPaths: T, path?: string) {\n for (const key in viewPaths) {\n if (viewPaths[key] === path) {\n return key\n }\n }\n}\n\nexport function getKeyByValue>(\n object: T,\n value?: T[keyof T]\n): keyof T | undefined {\n return (Object.keys(object) as Array).find(\n (key) => object[key] === value\n )\n}\n\nexport function getPasswordSchema(\n passwordValidation?: PasswordValidation,\n localization?: AuthLocalization\n) {\n let schema = z.string().min(1, {\n message: localization?.PASSWORD_REQUIRED\n })\n if (passwordValidation?.minLength) {\n schema = schema.min(passwordValidation.minLength, {\n message: localization?.PASSWORD_TOO_SHORT\n })\n }\n if (passwordValidation?.maxLength) {\n schema = schema.max(passwordValidation.maxLength, {\n message: localization?.PASSWORD_TOO_LONG\n })\n }\n if (passwordValidation?.regex) {\n schema = schema.regex(passwordValidation.regex, {\n message: localization?.INVALID_PASSWORD\n })\n }\n return schema\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/view-paths.json b/public/r/view-paths.json deleted file mode 100644 index 26c4a0dc..00000000 --- a/public/r/view-paths.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry-item.json", - "name": "view-paths", - "type": "registry:lib", - "title": "View Paths", - "description": "", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/view-paths.ts", - "content": "export const authViewPaths = {\n /** @default \"callback\" */\n CALLBACK: \"callback\",\n /** @default \"email-otp\" */\n EMAIL_OTP: \"email-otp\",\n /** @default \"forgot-password\" */\n FORGOT_PASSWORD: \"forgot-password\",\n /** @default \"magic-link\" */\n MAGIC_LINK: \"magic-link\",\n /** @default \"recover-account\" */\n RECOVER_ACCOUNT: \"recover-account\",\n /** @default \"reset-password\" */\n RESET_PASSWORD: \"reset-password\",\n /** @default \"sign-in\" */\n SIGN_IN: \"sign-in\",\n /** @default \"sign-out\" */\n SIGN_OUT: \"sign-out\",\n /** @default \"sign-up\" */\n SIGN_UP: \"sign-up\",\n /** @default \"two-factor\" */\n TWO_FACTOR: \"two-factor\"\n}\n\nexport type AuthViewPaths = typeof authViewPaths\n\n// Account-scoped views (signed-in user)\nexport const accountViewPaths = {\n /** @default \"settings\" */\n SETTINGS: \"settings\",\n /** @default \"security\" */\n SECURITY: \"security\",\n /** @default \"api-keys\" */\n API_KEYS: \"api-keys\",\n /** @default \"organizations\" */\n ORGANIZATIONS: \"organizations\",\n /** @default \"accept-invitation\" */\n ACCEPT_INVITATION: \"accept-invitation\"\n}\n\nexport type AccountViewPaths = typeof accountViewPaths\n\n// Organization-scoped views\nexport const organizationViewPaths = {\n /** @default \"settings\" */\n SETTINGS: \"settings\",\n /** @default \"members\" */\n MEMBERS: \"members\",\n /** @default \"api-keys\" */\n API_KEYS: \"api-keys\"\n}\n\nexport type OrganizationViewPaths = typeof organizationViewPaths\nexport type AuthViewPath = keyof AuthViewPaths\nexport type AccountViewPath = keyof AccountViewPaths\nexport type OrganizationViewPath = keyof OrganizationViewPaths\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file From 75c9cc1c0f9dc4bc930914c02c514fef87d1605e Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Aug 2025 11:54:09 -0400 Subject: [PATCH 09/10] prevent duplicate registry jsons --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b449d6d5..13c8bddc 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,4 @@ dist .idea public/r +registry/ From 497ae13515a215441100a74ec6c733c0b705a5a5 Mon Sep 17 00:00:00 2001 From: Nathan <99501939+IncbomDev@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:54:26 -0400 Subject: [PATCH 10/10] Delete registry directory --- registry/registry.json | 3815 ---------------------------------------- 1 file changed, 3815 deletions(-) delete mode 100644 registry/registry.json diff --git a/registry/registry.json b/registry/registry.json deleted file mode 100644 index cedce9f7..00000000 --- a/registry/registry.json +++ /dev/null @@ -1,3815 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema/registry.json", - "name": "local", - "homepage": "https://better-auth-ui.com", - "items": [ - { - "name": "accept-invitation-card", - "title": "Accept Invitation Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/use-authenticate.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/accept-invitation-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "account-cell", - "title": "Account Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/account-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "account-options", - "title": "Account Options", - "description": "", - "type": "registry:file", - "target": "types/account-options.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/types/account-options.ts", - "type": "registry:file", - "target": "types/account-options.ts" - } - ] - }, - { - "name": "account-settings-cards", - "title": "Account Settings Cards", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/accounts-card.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/change-email-card.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-avatar-card.json", - "https://better-auth-ui.com/r/update-field-card.json", - "https://better-auth-ui.com/r/update-name-card.json", - "https://better-auth-ui.com/r/update-username-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account-settings-cards.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "account-view", - "title": "Account View", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-settings-cards.json", - "https://better-auth-ui.com/r/api-keys-card.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "drawer", - "label", - "https://better-auth-ui.com/r/organizations-card.json", - "https://better-auth-ui.com/r/security-settings-cards.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-invitations-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/account/account-view.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "accounts-card", - "title": "Accounts Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-cell.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/accounts-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "additional-fields", - "title": "Additional Fields", - "description": "", - "type": "registry:file", - "target": "types/additional-fields.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/additional-fields.ts", - "type": "registry:file", - "target": "types/additional-fields.ts" - } - ] - }, - { - "name": "admin-error-codes", - "title": "Admin Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/admin-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/admin-error-codes.ts", - "type": "registry:file", - "target": "localization/admin-error-codes.ts" - } - ] - }, - { - "name": "alert", - "title": "Alert", - "description": "", - "type": "registry:ui", - "dependencies": [ - "class-variance-authority" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/alert.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "anonymous-error-codes", - "title": "Anonymous Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/anonymous-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/anonymous-error-codes.ts", - "type": "registry:file", - "target": "localization/anonymous-error-codes.ts" - } - ] - }, - { - "name": "any-auth-client", - "title": "Any Auth Client", - "description": "", - "type": "registry:file", - "target": "types/any-auth-client.ts", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/types/any-auth-client.ts", - "type": "registry:file", - "target": "types/any-auth-client.ts" - } - ] - }, - { - "name": "api-key", - "title": "Api Key", - "description": "", - "type": "registry:file", - "target": "types/api-key.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/api-key.ts", - "type": "registry:file", - "target": "types/api-key.ts" - } - ] - }, - { - "name": "api-key-cell", - "title": "Api Key Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/api-key.json", - "https://better-auth-ui.com/r/api-key-delete-dialog.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-key-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "api-key-delete-dialog", - "title": "Api Key Delete Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/api-key.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-key-delete-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "api-key-display-dialog", - "title": "Api Key Display Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-key-display-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "api-key-error-codes", - "title": "Api Key Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/api-key-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/api-key-error-codes.ts", - "type": "registry:file", - "target": "localization/api-key-error-codes.ts" - } - ] - }, - { - "name": "api-keys-card", - "title": "Api Keys Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/api-key-cell.json", - "https://better-auth-ui.com/r/api-key-display-dialog.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/create-api-key-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/api-keys-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "auth-callback", - "title": "Auth Callback", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-success-transition.json" - ], - "files": [ - { - "path": "src/components/auth/auth-callback.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "auth-client", - "title": "Auth Client", - "description": "", - "type": "registry:file", - "target": "types/auth-client.ts", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/types/auth-client.ts", - "type": "registry:file", - "target": "types/auth-client.ts" - } - ] - }, - { - "name": "auth-data-cache", - "title": "Auth Data Cache", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/auth-data-cache.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "auth-form", - "title": "Auth Form", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-callback.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/email-otp-form.json", - "https://better-auth-ui.com/r/forgot-password-form.json", - "https://better-auth-ui.com/r/magic-link-form.json", - "https://better-auth-ui.com/r/recover-account-form.json", - "https://better-auth-ui.com/r/reset-password-form.json", - "https://better-auth-ui.com/r/sign-in-form.json", - "https://better-auth-ui.com/r/sign-out.json", - "https://better-auth-ui.com/r/sign-up-form.json", - "https://better-auth-ui.com/r/two-factor-form.json", - "https://better-auth-ui.com/r/utils.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/components/auth/auth-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "auth-hooks", - "title": "Auth Hooks", - "description": "", - "type": "registry:file", - "target": "types/auth-hooks.ts", - "dependencies": [ - "@better-fetch/fetch", - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/api-key.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/invitation.json", - "https://better-auth-ui.com/r/refetch.json" - ], - "files": [ - { - "path": "src/types/auth-hooks.ts", - "type": "registry:file", - "target": "types/auth-hooks.ts" - } - ] - }, - { - "name": "auth-loading", - "title": "Auth Loading", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/components/auth-loading.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "auth-localization", - "title": "Auth Localization", - "description": "", - "type": "registry:file", - "target": "localization/auth-localization.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/admin-error-codes.json", - "https://better-auth-ui.com/r/anonymous-error-codes.json", - "https://better-auth-ui.com/r/api-key-error-codes.json", - "https://better-auth-ui.com/r/base-error-codes.json", - "https://better-auth-ui.com/r/captcha-error-codes.json", - "https://better-auth-ui.com/r/email-otp-error-codes.json", - "https://better-auth-ui.com/r/generic-oauth-error-codes.json", - "https://better-auth-ui.com/r/haveibeenpwned-error-codes.json", - "https://better-auth-ui.com/r/multi-session-error-codes.json", - "https://better-auth-ui.com/r/organization-error-codes.json", - "https://better-auth-ui.com/r/passkey-error-codes.json", - "https://better-auth-ui.com/r/phone-number-error-codes.json", - "https://better-auth-ui.com/r/stripe-localization.json", - "https://better-auth-ui.com/r/two-factor-error-codes.json", - "https://better-auth-ui.com/r/username-error-codes.json" - ], - "files": [ - { - "path": "src/localization/auth-localization.ts", - "type": "registry:file", - "target": "localization/auth-localization.ts" - } - ] - }, - { - "name": "auth-mutators", - "title": "Auth Mutators", - "description": "", - "type": "registry:file", - "target": "types/auth-mutators.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/auth-mutators.ts", - "type": "registry:file", - "target": "types/auth-mutators.ts" - } - ] - }, - { - "name": "auth-ui-provider", - "title": "Auth Ui Provider", - "description": "", - "type": "registry:lib", - "dependencies": [ - "sonner" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-options.json", - "https://better-auth-ui.com/r/additional-fields.json", - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-mutators.json", - "https://better-auth-ui.com/r/avatar-options.json", - "https://better-auth-ui.com/r/captcha-options.json", - "https://better-auth-ui.com/r/credentials-options.json", - "https://better-auth-ui.com/r/delete-user-options.json", - "https://better-auth-ui.com/r/generic-oauth-options.json", - "https://better-auth-ui.com/r/gravatar-options.json", - "https://better-auth-ui.com/r/link.json", - "https://better-auth-ui.com/r/organization-options.json", - "https://better-auth-ui.com/r/organization-refetcher.json", - "https://better-auth-ui.com/r/recaptcha-v3.json", - "https://better-auth-ui.com/r/render-toast.json", - "https://better-auth-ui.com/r/sign-up-options.json", - "https://better-auth-ui.com/r/social-options.json", - "https://better-auth-ui.com/r/use-auth-data.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/lib/auth-ui-provider.tsx", - "type": "registry:lib" - } - ] - }, - { - "name": "auth-ui-provider-tanstack", - "title": "Auth Ui Provider Tanstack", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-tanstack-options.json" - ], - "files": [ - { - "path": "src/lib/tanstack/auth-ui-provider-tanstack.tsx", - "type": "registry:lib" - } - ] - }, - { - "name": "auth-view", - "title": "Auth View", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-callback.json", - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/email-otp-button.json", - "https://better-auth-ui.com/r/magic-link-button.json", - "https://better-auth-ui.com/r/one-tap.json", - "https://better-auth-ui.com/r/passkey-button.json", - "https://better-auth-ui.com/r/provider-button.json", - "separator", - "https://better-auth-ui.com/r/sign-out.json", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/components/auth/auth-view.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "avatar", - "title": "Avatar", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-avatar" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/avatar.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "avatar-options", - "title": "Avatar Options", - "description": "", - "type": "registry:file", - "target": "types/avatar-options.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/image.json" - ], - "files": [ - { - "path": "src/types/avatar-options.ts", - "type": "registry:file", - "target": "types/avatar-options.ts" - } - ] - }, - { - "name": "backup-codes-dialog", - "title": "Backup Codes Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/two-factor/backup-codes-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "base-error-codes", - "title": "Base Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/base-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/base-error-codes.ts", - "type": "registry:file", - "target": "localization/base-error-codes.ts" - } - ] - }, - { - "name": "button", - "title": "Button", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-slot", - "class-variance-authority" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/button.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "captcha", - "title": "Captcha", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hcaptcha/react-hcaptcha", - "@marsidev/react-turnstile" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/recaptcha-badge.json", - "https://better-auth-ui.com/r/recaptcha-v2.json", - "https://better-auth-ui.com/r/use-theme.json" - ], - "files": [ - { - "path": "src/components/captcha/captcha.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "captcha-error-codes", - "title": "Captcha Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/captcha-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/captcha-error-codes.ts", - "type": "registry:file", - "target": "localization/captcha-error-codes.ts" - } - ] - }, - { - "name": "captcha-options", - "title": "Captcha Options", - "description": "", - "type": "registry:file", - "target": "types/captcha-options.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/captcha-provider.json" - ], - "files": [ - { - "path": "src/types/captcha-options.ts", - "type": "registry:file", - "target": "types/captcha-options.ts" - } - ] - }, - { - "name": "captcha-provider", - "title": "Captcha Provider", - "description": "", - "type": "registry:file", - "target": "types/captcha-provider.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/captcha-provider.ts", - "type": "registry:file", - "target": "types/captcha-provider.ts" - } - ] - }, - { - "name": "card", - "title": "Card", - "description": "", - "type": "registry:ui", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/card.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "change-email-card", - "title": "Change Email Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/change-email-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "change-password-card", - "title": "Change Password Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "https://better-auth-ui.com/r/input-field-skeleton.json", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/change-password-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "checkbox", - "title": "Checkbox", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-checkbox", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/checkbox.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "create-api-key-dialog", - "title": "Create Api Key Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "form", - "input", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/personal-account-view.json", - "https://better-auth-ui.com/r/refetch.json", - "select", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/api-key/create-api-key-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "create-organization-dialog", - "title": "Create Organization Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "dropdown-menu", - "form", - "https://better-auth-ui.com/r/image-utils.json", - "input", - "https://better-auth-ui.com/r/organization-logo.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/create-organization-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "credentials-options", - "title": "Credentials Options", - "description": "", - "type": "registry:file", - "target": "types/credentials-options.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/password-validation.json" - ], - "files": [ - { - "path": "src/types/credentials-options.ts", - "type": "registry:file", - "target": "types/credentials-options.ts" - } - ] - }, - { - "name": "delete-account-card", - "title": "Delete Account Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/delete-account-dialog.json", - "https://better-auth-ui.com/r/settings-card.json" - ], - "files": [ - { - "path": "src/components/settings/account/delete-account-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "delete-account-dialog", - "title": "Delete Account Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/delete-account-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "delete-organization-card", - "title": "Delete Organization Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/delete-organization-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-current-organization.json" - ], - "files": [ - { - "path": "src/components/organization/delete-organization-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "delete-organization-dialog", - "title": "Delete Organization Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "form", - "input", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/delete-organization-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "delete-user-options", - "title": "Delete User Options", - "description": "", - "type": "registry:file", - "target": "types/delete-user-options.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/delete-user-options.ts", - "type": "registry:file", - "target": "types/delete-user-options.ts" - } - ] - }, - { - "name": "dialog", - "title": "Dialog", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-dialog", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/dialog.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "drawer", - "title": "Drawer", - "description": "", - "type": "registry:ui", - "dependencies": [ - "vaul" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/drawer.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "dropdown-menu", - "title": "Dropdown Menu", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-dropdown-menu", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/dropdown-menu.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "email-otp-button", - "title": "Email Otp Button", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/auth-view.json", - "button", - "https://better-auth-ui.com/r/utils.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/components/auth/email-otp-button.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "email-otp-error-codes", - "title": "Email Otp Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/email-otp-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/email-otp-error-codes.ts", - "type": "registry:file", - "target": "localization/email-otp-error-codes.ts" - } - ] - }, - { - "name": "email-otp-form", - "title": "Email Otp Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "form", - "input", - "input-otp", - "https://better-auth-ui.com/r/otp-input-group.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/email-otp-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "email-template", - "title": "Email Template", - "description": "", - "type": "registry:component", - "dependencies": [ - "@react-email/components" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/email/email-template.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "fetch-error", - "title": "Fetch Error", - "description": "", - "type": "registry:file", - "target": "types/fetch-error.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/fetch-error.ts", - "type": "registry:file", - "target": "types/fetch-error.ts" - } - ] - }, - { - "name": "forgot-password-form", - "title": "Forgot Password Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/captcha.json", - "form", - "input", - "https://better-auth-ui.com/r/use-captcha.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/forgot-password-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "form", - "title": "Form", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-label", - "@radix-ui/react-slot", - "react-hook-form" - ], - "registryDependencies": [ - "label", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/form.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "form-error", - "title": "Form Error", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react", - "react-hook-form" - ], - "registryDependencies": [ - "alert", - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/form-error.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "generic-oauth-error-codes", - "title": "Generic Oauth Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/generic-oauth-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/generic-oauth-error-codes.ts", - "type": "registry:file", - "target": "localization/generic-oauth-error-codes.ts" - } - ] - }, - { - "name": "generic-oauth-options", - "title": "Generic Oauth Options", - "description": "", - "type": "registry:file", - "target": "types/generic-oauth-options.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/social-providers.json" - ], - "files": [ - { - "path": "src/types/generic-oauth-options.ts", - "type": "registry:file", - "target": "types/generic-oauth-options.ts" - } - ] - }, - { - "name": "gravatar-options", - "title": "Gravatar Options", - "description": "", - "type": "registry:file", - "target": "types/gravatar-options.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/gravatar-options.ts", - "type": "registry:file", - "target": "types/gravatar-options.ts" - } - ] - }, - { - "name": "gravatar-utils", - "title": "Gravatar Utils", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@noble/hashes" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/gravatar-options.json" - ], - "files": [ - { - "path": "src/lib/gravatar-utils.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "haveibeenpwned-error-codes", - "title": "Haveibeenpwned Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/haveibeenpwned-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/haveibeenpwned-error-codes.ts", - "type": "registry:file", - "target": "localization/haveibeenpwned-error-codes.ts" - } - ] - }, - { - "name": "image", - "title": "Image", - "description": "", - "type": "registry:file", - "target": "types/image.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/image.ts", - "type": "registry:file", - "target": "types/image.ts" - } - ] - }, - { - "name": "image-utils", - "title": "Image Utils", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/image-utils.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "input", - "title": "Input", - "description": "", - "type": "registry:ui", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/input.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "input-field-skeleton", - "title": "Input Field Skeleton", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/skeletons/input-field-skeleton.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "input-otp", - "title": "Input Otp", - "description": "", - "type": "registry:ui", - "dependencies": [ - "input-otp", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/input-otp.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "invitation", - "title": "Invitation", - "description": "", - "type": "registry:file", - "target": "types/invitation.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/invitation.ts", - "type": "registry:file", - "target": "types/invitation.ts" - } - ] - }, - { - "name": "invitation-cell", - "title": "Invitation Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/invitation.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/invitation-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "invite-member-dialog", - "title": "Invite Member Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "form", - "input", - "select", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/invite-member-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "label", - "title": "Label", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-label" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/label.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "leave-organization-dialog", - "title": "Leave Organization Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dialog", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/leave-organization-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "link", - "title": "Link", - "description": "", - "type": "registry:file", - "target": "types/link.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/link.ts", - "type": "registry:file", - "target": "types/link.ts" - } - ] - }, - { - "name": "magic-link-button", - "title": "Magic Link Button", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/auth-view.json", - "button", - "https://better-auth-ui.com/r/utils.json", - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/components/auth/magic-link-button.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "magic-link-form", - "title": "Magic Link Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/captcha.json", - "form", - "input", - "https://better-auth-ui.com/r/use-captcha.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/magic-link-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "member-cell", - "title": "Member Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/leave-organization-dialog.json", - "https://better-auth-ui.com/r/remove-member-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-member-role-dialog.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/member-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "model-names", - "title": "Model Names", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/instantdb/model-names.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "model-names", - "title": "Model Names", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/triplit/model-names.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "multi-session-error-codes", - "title": "Multi Session Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/multi-session-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/multi-session-error-codes.ts", - "type": "registry:file", - "target": "localization/multi-session-error-codes.ts" - } - ] - }, - { - "name": "one-tap", - "title": "One Tap", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/one-tap.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-cell", - "title": "Organization Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/leave-organization-dialog.json", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-cell-view", - "title": "Organization Cell View", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/organization-logo.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-cell-view.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-error-codes", - "title": "Organization Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/organization-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/organization-error-codes.ts", - "type": "registry:file", - "target": "localization/organization-error-codes.ts" - } - ] - }, - { - "name": "organization-invitations-card", - "title": "Organization Invitations Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/invitation-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-invitations-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-logo", - "title": "Organization Logo", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "avatar", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-logo.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-logo-card", - "title": "Organization Logo Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/image-utils.json", - "https://better-auth-ui.com/r/organization-logo.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-card-footer.json", - "https://better-auth-ui.com/r/settings-card-header.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-logo-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-members-card", - "title": "Organization Members Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/invite-member-dialog.json", - "https://better-auth-ui.com/r/member-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-members-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-name-card", - "title": "Organization Name Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-name-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-options", - "title": "Organization Options", - "description": "", - "type": "registry:file", - "target": "types/organization-options.ts", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/view-paths.json" - ], - "files": [ - { - "path": "src/types/organization-options.ts", - "type": "registry:file", - "target": "types/organization-options.ts" - } - ] - }, - { - "name": "organization-refetcher", - "title": "Organization Refetcher", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-current-organization.json" - ], - "files": [ - { - "path": "src/lib/organization-refetcher.tsx", - "type": "registry:lib" - } - ] - }, - { - "name": "organization-settings-cards", - "title": "Organization Settings Cards", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/delete-organization-card.json", - "https://better-auth-ui.com/r/organization-logo-card.json", - "https://better-auth-ui.com/r/organization-name-card.json", - "https://better-auth-ui.com/r/organization-slug-card.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-settings-cards.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-slug-card", - "title": "Organization Slug Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-slug-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-switcher", - "title": "Organization Switcher", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/create-organization-dialog.json", - "dropdown-menu", - "https://better-auth-ui.com/r/organization-cell-view.json", - "https://better-auth-ui.com/r/organization-logo.json", - "https://better-auth-ui.com/r/personal-account-view.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-switcher.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organization-view", - "title": "Organization View", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/account-view.json", - "https://better-auth-ui.com/r/api-keys-card.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "drawer", - "label", - "https://better-auth-ui.com/r/organization-invitations-card.json", - "https://better-auth-ui.com/r/organization-members-card.json", - "https://better-auth-ui.com/r/organization-settings-cards.json", - "https://better-auth-ui.com/r/use-current-organization.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organization-view.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "organizations-card", - "title": "Organizations Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/create-organization-dialog.json", - "https://better-auth-ui.com/r/organization-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-cell-skeleton.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/organizations-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "otp-input-group", - "title": "Otp Input Group", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "input-otp" - ], - "files": [ - { - "path": "src/components/auth/otp-input-group.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "passkey-button", - "title": "Passkey Button", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/auth-view.json", - "button", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/passkey-button.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "passkey-cell", - "title": "Passkey Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/session-freshness-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/passkey/passkey-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "passkey-error-codes", - "title": "Passkey Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/passkey-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/passkey-error-codes.ts", - "type": "registry:file", - "target": "localization/passkey-error-codes.ts" - } - ] - }, - { - "name": "passkeys-card", - "title": "Passkeys Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "react-hook-form" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "form", - "https://better-auth-ui.com/r/passkey-cell.json", - "https://better-auth-ui.com/r/session-freshness-dialog.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/passkey/passkeys-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "password-input", - "title": "Password Input", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "button", - "input", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/password-input.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "password-validation", - "title": "Password Validation", - "description": "", - "type": "registry:file", - "target": "types/password-validation.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/password-validation.ts", - "type": "registry:file", - "target": "types/password-validation.ts" - } - ] - }, - { - "name": "personal-account-view", - "title": "Personal Account View", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "skeleton", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/personal-account-view.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "phone-number-error-codes", - "title": "Phone Number Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/phone-number-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/phone-number-error-codes.ts", - "type": "registry:file", - "target": "localization/phone-number-error-codes.ts" - } - ] - }, - { - "name": "profile", - "title": "Profile", - "description": "", - "type": "registry:file", - "target": "types/profile.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/profile.ts", - "type": "registry:file", - "target": "types/profile.ts" - } - ] - }, - { - "name": "provider-button", - "title": "Provider Button", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/auth-view.json", - "button", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/provider-button.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "provider-cell", - "title": "Provider Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/providers/provider-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "provider-icons", - "title": "Provider Icons", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/components/provider-icons.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "providers-card", - "title": "Providers Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/provider-cell.json", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-cell-skeleton.json", - "https://better-auth-ui.com/r/social-providers.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/providers/providers-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "recaptcha-badge", - "title": "Recaptcha Badge", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/captcha/recaptcha-badge.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "recaptcha-v2", - "title": "Recaptcha V2", - "description": "", - "type": "registry:component", - "dependencies": [ - "react-google-recaptcha" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/use-theme.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/captcha/recaptcha-v2.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "recaptcha-v3", - "title": "Recaptcha V3", - "description": "", - "type": "registry:component", - "dependencies": [ - "@wojtekmaj/react-recaptcha-v3" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-lang.json", - "https://better-auth-ui.com/r/use-theme.json" - ], - "files": [ - { - "path": "src/components/captcha/recaptcha-v3.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "recover-account-form", - "title": "Recover Account Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "form", - "input", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/recover-account-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "redirect-to-sign-in", - "title": "Redirect To Sign In", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/use-authenticate.json" - ], - "files": [ - { - "path": "src/components/redirect-to-sign-in.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "redirect-to-sign-up", - "title": "Redirect To Sign Up", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/use-authenticate.json" - ], - "files": [ - { - "path": "src/components/redirect-to-sign-up.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "refetch", - "title": "Refetch", - "description": "", - "type": "registry:file", - "target": "types/refetch.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/refetch.ts", - "type": "registry:file", - "target": "types/refetch.ts" - } - ] - }, - { - "name": "remove-member-dialog", - "title": "Remove Member Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/member-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/remove-member-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "render-toast", - "title": "Render Toast", - "description": "", - "type": "registry:file", - "target": "types/render-toast.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/render-toast.ts", - "type": "registry:file", - "target": "types/render-toast.ts" - } - ] - }, - { - "name": "reset-password-form", - "title": "Reset Password Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "form", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/reset-password-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "security-settings-cards", - "title": "Security Settings Cards", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/change-password-card.json", - "https://better-auth-ui.com/r/delete-account-card.json", - "https://better-auth-ui.com/r/passkeys-card.json", - "https://better-auth-ui.com/r/providers-card.json", - "https://better-auth-ui.com/r/sessions-card.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/two-factor-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security-settings-cards.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "select", - "title": "Select", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-select", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/select.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "separator", - "title": "Separator", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-separator" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/separator.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "session-cell", - "title": "Session Cell", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react", - "ua-parser-js" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/session-cell.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "session-freshness-dialog", - "title": "Session Freshness Dialog", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/session-freshness-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "sessions-card", - "title": "Sessions Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "https://better-auth-ui.com/r/session-cell.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-cell-skeleton.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/security/sessions-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "settings-action-button", - "title": "Settings Action Button", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react", - "react-hook-form" - ], - "registryDependencies": [ - "button", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-action-button.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "settings-card", - "title": "Settings Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "card", - "https://better-auth-ui.com/r/settings-card-footer.json", - "https://better-auth-ui.com/r/settings-card-header.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "settings-card-footer", - "title": "Settings Card Footer", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "card", - "https://better-auth-ui.com/r/settings-action-button.json", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-card-footer.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "settings-card-header", - "title": "Settings Card Header", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "card", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/shared/settings-card-header.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "settings-cell-skeleton", - "title": "Settings Cell Skeleton", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "card", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/skeletons/settings-cell-skeleton.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "sign-in-form", - "title": "Sign In Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@better-fetch/fetch", - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/captcha.json", - "checkbox", - "form", - "input", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "https://better-auth-ui.com/r/use-captcha.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/sign-in-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "sign-out", - "title": "Sign Out", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/use-success-transition.json" - ], - "files": [ - { - "path": "src/components/auth/sign-out.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "sign-up-form", - "title": "Sign Up Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "better-auth", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "https://better-auth-ui.com/r/captcha.json", - "checkbox", - "dropdown-menu", - "form", - "https://better-auth-ui.com/r/image-utils.json", - "input", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/password-validation.json", - "textarea", - "https://better-auth-ui.com/r/use-captcha.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/sign-up-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "sign-up-options", - "title": "Sign Up Options", - "description": "", - "type": "registry:file", - "target": "types/sign-up-options.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/types/sign-up-options.ts", - "type": "registry:file", - "target": "types/sign-up-options.ts" - } - ] - }, - { - "name": "signed-in", - "title": "Signed In", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/components/signed-in.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "signed-out", - "title": "Signed Out", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/components/signed-out.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "skeleton", - "title": "Skeleton", - "description": "", - "type": "registry:ui", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/skeleton.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "social-options", - "title": "Social Options", - "description": "", - "type": "registry:file", - "target": "types/social-options.ts", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json" - ], - "files": [ - { - "path": "src/types/social-options.ts", - "type": "registry:file", - "target": "types/social-options.ts" - } - ] - }, - { - "name": "social-providers", - "title": "Social Providers", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/provider-icons.json" - ], - "files": [ - { - "path": "src/lib/social-providers.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "stripe-localization", - "title": "Stripe Localization", - "description": "", - "type": "registry:file", - "target": "localization/stripe-localization.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/stripe-localization.ts", - "type": "registry:file", - "target": "localization/stripe-localization.ts" - } - ] - }, - { - "name": "tabs", - "title": "Tabs", - "description": "", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-tabs" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/tabs.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "textarea", - "title": "Textarea", - "description": "", - "type": "registry:ui", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/ui/textarea.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "two-factor-card", - "title": "Two Factor Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/two-factor-password-dialog.json" - ], - "files": [ - { - "path": "src/components/settings/two-factor/two-factor-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "two-factor-error-codes", - "title": "Two Factor Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/two-factor-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/two-factor-error-codes.ts", - "type": "registry:file", - "target": "localization/two-factor-error-codes.ts" - } - ] - }, - { - "name": "two-factor-form", - "title": "Two Factor Form", - "description": "", - "type": "registry:component", - "dependencies": [ - "@better-fetch/fetch", - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "react-qr-code", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-form.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "checkbox", - "form", - "input-otp", - "label", - "https://better-auth-ui.com/r/otp-input-group.json", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/use-success-transition.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/auth/forms/two-factor-form.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "two-factor-password-dialog", - "title": "Two Factor Password Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "lucide-react", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/backup-codes-dialog.json", - "button", - "dialog", - "form", - "https://better-auth-ui.com/r/password-input.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/two-factor/two-factor-password-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "update-avatar-card", - "title": "Update Avatar Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/image-utils.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/settings-card-footer.json", - "https://better-auth-ui.com/r/settings-card-header.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-avatar-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "update-field-card", - "title": "Update Field Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "@hookform/resolvers", - "react-hook-form", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/additional-fields.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "card", - "checkbox", - "form", - "input", - "https://better-auth-ui.com/r/settings-card.json", - "skeleton", - "textarea", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-field-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "update-member-role-dialog", - "title": "Update Member Role Dialog", - "description": "", - "type": "registry:component", - "dependencies": [ - "better-auth", - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dialog", - "https://better-auth-ui.com/r/member-cell.json", - "select", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/update-member-role-dialog.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "update-name-card", - "title": "Update Name Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-field-card.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-name-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "update-username-card", - "title": "Update Username Card", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/update-field-card.json" - ], - "files": [ - { - "path": "src/components/settings/account/update-username-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "use-auth-data", - "title": "Use Auth Data", - "description": "", - "type": "registry:hook", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-data-cache.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/fetch-error.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/hooks/use-auth-data.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-authenticate", - "title": "Use Authenticate", - "description": "", - "type": "registry:hook", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/hooks/use-authenticate.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-captcha", - "title": "Use Captcha", - "description": "", - "type": "registry:hook", - "dependencies": [ - "@hcaptcha/react-hcaptcha", - "@marsidev/react-turnstile", - "@wojtekmaj/react-recaptcha-v3", - "react-google-recaptcha" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/hooks/use-captcha.tsx", - "type": "registry:hook" - } - ] - }, - { - "name": "use-conditional-query", - "title": "Use Conditional Query", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@triplit/client", - "@triplit/react" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/triplit/use-conditional-query.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-current-organization", - "title": "Use Current Organization", - "description": "", - "type": "registry:hook", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json" - ], - "files": [ - { - "path": "src/hooks/use-current-organization.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-hydrated", - "title": "Use Hydrated", - "description": "", - "type": "registry:hook", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/hooks/use-hydrated.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-instant-options", - "title": "Use Instant Options", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@instantdb/react", - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/auth-mutators.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/use-list-accounts.json", - "https://better-auth-ui.com/r/use-list-sessions.json", - "https://better-auth-ui.com/r/use-session.json" - ], - "files": [ - { - "path": "src/lib/instantdb/use-instant-options.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-lang", - "title": "Use Lang", - "description": "", - "type": "registry:hook", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/hooks/use-lang.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-list-accounts", - "title": "Use List Accounts", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@better-fetch/fetch" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-instant-options.json" - ], - "files": [ - { - "path": "src/lib/instantdb/use-list-accounts.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-list-accounts", - "title": "Use List Accounts", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-conditional-query.json", - "https://better-auth-ui.com/r/use-triplit-hooks.json", - "https://better-auth-ui.com/r/use-triplit-token.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-list-accounts.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-list-sessions", - "title": "Use List Sessions", - "description": "", - "type": "registry:lib", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-instant-options.json" - ], - "files": [ - { - "path": "src/lib/instantdb/use-list-sessions.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-list-sessions", - "title": "Use List Sessions", - "description": "", - "type": "registry:lib", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-conditional-query.json", - "https://better-auth-ui.com/r/use-triplit-hooks.json", - "https://better-auth-ui.com/r/use-triplit-token.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-list-sessions.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-session", - "title": "Use Session", - "description": "", - "type": "registry:lib", - "dependencies": [ - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-instant-options.json" - ], - "files": [ - { - "path": "src/lib/instantdb/use-session.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-session", - "title": "Use Session", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/model-names.json", - "https://better-auth-ui.com/r/use-conditional-query.json", - "https://better-auth-ui.com/r/use-triplit-hooks.json", - "https://better-auth-ui.com/r/use-triplit-token.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-session.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-success-transition", - "title": "Use Success Transition", - "description": "", - "type": "registry:hook", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/hooks/use-success-transition.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-tanstack-options", - "title": "Use Tanstack Options", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@daveyplate/better-auth-tanstack", - "@tanstack/react-query" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/auth-mutators.json" - ], - "files": [ - { - "path": "src/lib/tanstack/use-tanstack-options.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-theme", - "title": "Use Theme", - "description": "", - "type": "registry:hook", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/hooks/use-theme.ts", - "type": "registry:hook" - } - ] - }, - { - "name": "use-triplit-hooks", - "title": "Use Triplit Hooks", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@triplit/client", - "better-auth" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-hooks.json", - "https://better-auth-ui.com/r/refetch.json", - "https://better-auth-ui.com/r/use-list-accounts.json", - "https://better-auth-ui.com/r/use-list-sessions.json", - "https://better-auth-ui.com/r/use-session.json" - ], - "files": [ - { - "path": "src/lib/triplit/use-triplit-hooks.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "use-triplit-token", - "title": "Use Triplit Token", - "description": "", - "type": "registry:lib", - "dependencies": [ - "@triplit/client", - "@triplit/react" - ], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/triplit/use-triplit-token.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "user-avatar", - "title": "User Avatar", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "avatar", - "https://better-auth-ui.com/r/gravatar-utils.json", - "https://better-auth-ui.com/r/profile.json", - "skeleton", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/user-avatar.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "user-button", - "title": "User Button", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/any-auth-client.json", - "https://better-auth-ui.com/r/auth-client.json", - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "dropdown-menu", - "https://better-auth-ui.com/r/use-hydrated.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/user-view.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/user-button.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "user-invitations-card", - "title": "User Invitations Card", - "description": "", - "type": "registry:component", - "dependencies": [ - "lucide-react" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-ui-provider.json", - "button", - "card", - "dropdown-menu", - "https://better-auth-ui.com/r/settings-card.json", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/organization/user-invitations-card.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "user-view", - "title": "User View", - "description": "", - "type": "registry:component", - "dependencies": [], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/auth-ui-provider.json", - "https://better-auth-ui.com/r/profile.json", - "skeleton", - "https://better-auth-ui.com/r/user-avatar.json", - "https://better-auth-ui.com/r/utils.json" - ], - "files": [ - { - "path": "src/components/user-view.tsx", - "type": "registry:component" - } - ] - }, - { - "name": "username-error-codes", - "title": "Username Error Codes", - "description": "", - "type": "registry:file", - "target": "localization/username-error-codes.ts", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/localization/username-error-codes.ts", - "type": "registry:file", - "target": "localization/username-error-codes.ts" - } - ] - }, - { - "name": "utils", - "title": "Utils", - "description": "", - "type": "registry:lib", - "dependencies": [ - "clsx", - "tailwind-merge", - "zod" - ], - "registryDependencies": [ - "https://better-auth-ui.com/r/auth-localization.json", - "https://better-auth-ui.com/r/password-validation.json" - ], - "files": [ - { - "path": "src/lib/utils.ts", - "type": "registry:lib" - } - ] - }, - { - "name": "view-paths", - "title": "View Paths", - "description": "", - "type": "registry:lib", - "dependencies": [], - "registryDependencies": [], - "files": [ - { - "path": "src/lib/view-paths.ts", - "type": "registry:lib" - } - ] - } - ] -}