From 1830fa98d4865b80bab8b33cb4302f3d9b0e4881 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Mon, 10 Feb 2025 15:47:15 -0500 Subject: [PATCH 01/10] feat(react): Add appearance option to modal components --- .../react/src/components/SignInButton.tsx | 2 +- .../react/src/components/SignUpButton.tsx | 2 +- packages/react/src/types.ts | 21 ++++++++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/react/src/components/SignInButton.tsx b/packages/react/src/components/SignInButton.tsx index a18ba92e57c..76f5d1d74f1 100644 --- a/packages/react/src/components/SignInButton.tsx +++ b/packages/react/src/components/SignInButton.tsx @@ -31,7 +31,7 @@ export const SignInButton = withClerk( }; if (mode === 'modal') { - return clerk.openSignIn(opts); + return clerk.openSignIn({ ...opts, appearance: props.appearance }); } return clerk.redirectToSignIn({ ...opts, diff --git a/packages/react/src/components/SignUpButton.tsx b/packages/react/src/components/SignUpButton.tsx index 757439c24da..547ce4725a9 100644 --- a/packages/react/src/components/SignUpButton.tsx +++ b/packages/react/src/components/SignUpButton.tsx @@ -32,7 +32,7 @@ export const SignUpButton = withClerk( }; if (mode === 'modal') { - return clerk.openSignUp(opts); + return clerk.openSignUp({ ...opts, appearance: props.appearance }); } return clerk.redirectToSignUp({ diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index cab42fd9950..fdd2dd74f64 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -109,12 +109,20 @@ export type ClerkProp = | undefined | null; -type ButtonProps = { - mode?: 'redirect' | 'modal'; +type ButtonPropsModal = { + mode: 'modal'; + appearance: T['appearance']; + children?: React.ReactNode; +}; + +type ButtonPropsRedirect = { + mode?: 'redirect'; children?: React.ReactNode; }; -export type SignInButtonProps = ButtonProps & +type ButtonProps = ButtonPropsModal | ButtonPropsRedirect; + +export type SignInButtonProps = ButtonProps & Pick< SignInProps, | 'fallbackRedirectUrl' @@ -127,7 +135,7 @@ export type SignInButtonProps = ButtonProps & export type SignUpButtonProps = { unsafeMetadata?: SignUpUnsafeMetadata; -} & ButtonProps & +} & ButtonProps & Pick< SignUpProps, | 'fallbackRedirectUrl' @@ -137,7 +145,10 @@ export type SignUpButtonProps = { | 'initialValues' >; -export type SignInWithMetamaskButtonProps = ButtonProps & RedirectUrlProp; +export type SignInWithMetamaskButtonProps = { + mode?: 'redirect' | 'modal'; + children?: React.ReactNode; +} & RedirectUrlProp; export type RedirectToSignInProps = SignInRedirectOptions; export type RedirectToSignUpProps = SignUpRedirectOptions; From 2e34fd11dc5604b89c43c0526dac5db9634fcb20 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Mon, 10 Feb 2025 15:54:23 -0500 Subject: [PATCH 02/10] add changeset --- .changeset/yellow-bats-provide.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/yellow-bats-provide.md diff --git a/.changeset/yellow-bats-provide.md b/.changeset/yellow-bats-provide.md new file mode 100644 index 00000000000..03e11307c72 --- /dev/null +++ b/.changeset/yellow-bats-provide.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-react': patch +--- + +Add the ability to specify an appearance for modal component usages. From f7bf109cb74730663b7bd51398f468a5a412cee6 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Mon, 10 Feb 2025 16:22:57 -0500 Subject: [PATCH 03/10] appearance is optional --- packages/react/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index fdd2dd74f64..b8ee4d271f2 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -111,7 +111,7 @@ export type ClerkProp = type ButtonPropsModal = { mode: 'modal'; - appearance: T['appearance']; + appearance?: T['appearance']; children?: React.ReactNode; }; From e07cdbcd3143743833d432aa7cca37e16baf1bfc Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Mon, 10 Feb 2025 17:25:02 -0500 Subject: [PATCH 04/10] extract type to clerk/types --- packages/astro/src/react/SignInButton.tsx | 2 +- packages/astro/src/react/SignUpButton.tsx | 2 +- packages/astro/src/react/types.ts | 24 +++---------- packages/react/src/types.ts | 36 +++----------------- packages/types/src/clerk.ts | 34 ++++++++++++++++++ packages/vue/src/components/SignInButton.vue | 16 ++------- packages/vue/src/components/SignUpButton.vue | 13 ++----- 7 files changed, 49 insertions(+), 78 deletions(-) diff --git a/packages/astro/src/react/SignInButton.tsx b/packages/astro/src/react/SignInButton.tsx index d519108efc0..2e6e5e06b16 100644 --- a/packages/astro/src/react/SignInButton.tsx +++ b/packages/astro/src/react/SignInButton.tsx @@ -25,7 +25,7 @@ export const SignInButton = withClerk(({ clerk, children, ...props }: WithClerkP } if (mode === 'modal') { - return clerk.openSignIn(opts); + return clerk.openSignIn({ ...opts, appearance: props.appearance }); } return clerk.redirectToSignIn({ ...opts, diff --git a/packages/astro/src/react/SignUpButton.tsx b/packages/astro/src/react/SignUpButton.tsx index b37651e5609..1026e68951e 100644 --- a/packages/astro/src/react/SignUpButton.tsx +++ b/packages/astro/src/react/SignUpButton.tsx @@ -34,7 +34,7 @@ export const SignUpButton = withClerk(({ clerk, children, ...props }: WithClerkP } if (mode === 'modal') { - return clerk.openSignUp(opts); + return clerk.openSignUp({ ...opts, appearance: props.appearance }); } return clerk.redirectToSignUp({ diff --git a/packages/astro/src/react/types.ts b/packages/astro/src/react/types.ts index 3028beaaf5d..003faafb9bc 100644 --- a/packages/astro/src/react/types.ts +++ b/packages/astro/src/react/types.ts @@ -1,23 +1,9 @@ -import type { SignInProps, SignUpProps } from '@clerk/types'; +import type { SignInButtonProps as _SignInButtonProps, SignUpButtonProps as _SignUpButtonProps } from '@clerk/types'; -// TODO-SHARED: Duplicate from @clerk/clerk-react -type ButtonProps = { - mode?: 'redirect' | 'modal'; +export type SignInButtonProps = _SignInButtonProps & { children?: React.ReactNode; }; -// TODO-SHARED: Duplicate from @clerk/clerk-react -export type SignInButtonProps = ButtonProps & - Pick< - SignInProps, - 'fallbackRedirectUrl' | 'forceRedirectUrl' | 'signUpForceRedirectUrl' | 'signUpFallbackRedirectUrl' - >; - -// TODO-SHARED: Duplicate from @clerk/clerk-react -export type SignUpButtonProps = { - unsafeMetadata?: SignUpUnsafeMetadata; -} & ButtonProps & - Pick< - SignUpProps, - 'fallbackRedirectUrl' | 'forceRedirectUrl' | 'signInForceRedirectUrl' | 'signInFallbackRedirectUrl' - >; +export type SignUpButtonProps = _SignUpButtonProps & { + children?: React.ReactNode; +}; diff --git a/packages/react/src/types.ts b/packages/react/src/types.ts index b8ee4d271f2..318cd7ee6d5 100644 --- a/packages/react/src/types.ts +++ b/packages/react/src/types.ts @@ -7,9 +7,9 @@ import type { LoadedClerk, MultiDomainAndOrProxy, RedirectUrlProp, - SignInProps, + SignInButtonProps as _SignInButtonProps, SignInRedirectOptions, - SignUpProps, + SignUpButtonProps as _SignUpButtonProps, SignUpRedirectOptions, Without, } from '@clerk/types'; @@ -109,42 +109,14 @@ export type ClerkProp = | undefined | null; -type ButtonPropsModal = { - mode: 'modal'; - appearance?: T['appearance']; +export type SignInButtonProps = _SignInButtonProps & { children?: React.ReactNode; }; -type ButtonPropsRedirect = { - mode?: 'redirect'; +export type SignUpButtonProps = _SignUpButtonProps & { children?: React.ReactNode; }; -type ButtonProps = ButtonPropsModal | ButtonPropsRedirect; - -export type SignInButtonProps = ButtonProps & - Pick< - SignInProps, - | 'fallbackRedirectUrl' - | 'forceRedirectUrl' - | 'signUpForceRedirectUrl' - | 'signUpFallbackRedirectUrl' - | 'initialValues' - | 'withSignUp' - >; - -export type SignUpButtonProps = { - unsafeMetadata?: SignUpUnsafeMetadata; -} & ButtonProps & - Pick< - SignUpProps, - | 'fallbackRedirectUrl' - | 'forceRedirectUrl' - | 'signInForceRedirectUrl' - | 'signInFallbackRedirectUrl' - | 'initialValues' - >; - export type SignInWithMetamaskButtonProps = { mode?: 'redirect' | 'modal'; children?: React.ReactNode; diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 474a0a279e6..8a58fffe1d0 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -1388,6 +1388,40 @@ export interface HandleEmailLinkVerificationParams { onVerifiedOnOtherDevice?: () => void; } +type ButtonPropsModal = { + mode: 'modal'; + appearance?: T['appearance']; +}; + +type ButtonPropsRedirect = { + mode?: 'redirect'; +}; + +type ButtonProps = ButtonPropsModal | ButtonPropsRedirect; + +export type SignInButtonProps = ButtonProps & + Pick< + SignInProps, + | 'fallbackRedirectUrl' + | 'forceRedirectUrl' + | 'signUpForceRedirectUrl' + | 'signUpFallbackRedirectUrl' + | 'initialValues' + | 'withSignUp' + >; + +export type SignUpButtonProps = { + unsafeMetadata?: SignUpUnsafeMetadata; +} & ButtonProps & + Pick< + SignUpProps, + | 'fallbackRedirectUrl' + | 'forceRedirectUrl' + | 'signInForceRedirectUrl' + | 'signInFallbackRedirectUrl' + | 'initialValues' + >; + export type CreateOrganizationInvitationParams = { emailAddress: string; role: OrganizationCustomRoleKey; diff --git a/packages/vue/src/components/SignInButton.vue b/packages/vue/src/components/SignInButton.vue index 42aed6a6e4e..9b085f8c87c 100644 --- a/packages/vue/src/components/SignInButton.vue +++ b/packages/vue/src/components/SignInButton.vue @@ -1,21 +1,9 @@