diff --git a/.changeset/lemon-ways-search.md b/.changeset/lemon-ways-search.md
new file mode 100644
index 00000000000..a845151cc84
--- /dev/null
+++ b/.changeset/lemon-ways-search.md
@@ -0,0 +1,2 @@
+---
+---
diff --git a/packages/ui/src/components/sign-up/steps/continue.tsx b/packages/ui/src/components/sign-up/steps/continue.tsx
index 4e54848b5f4..d5ace710b1d 100644
--- a/packages/ui/src/components/sign-up/steps/continue.tsx
+++ b/packages/ui/src/components/sign-up/steps/continue.tsx
@@ -9,15 +9,14 @@ import { PasswordField } from '~/common/password-field';
import { PhoneNumberField } from '~/common/phone-number-field';
import { UsernameField } from '~/common/username-field';
import { useAttributes } from '~/hooks/use-attributes';
+import { useDevModeWarning } from '~/hooks/use-dev-mode-warning';
import { useDisplayConfig } from '~/hooks/use-display-config';
-import { useEnvironment } from '~/hooks/use-environment';
import { useLocalizations } from '~/hooks/use-localizations';
import { Button } from '~/primitives/button';
import * as Card from '~/primitives/card';
import * as Icon from '~/primitives/icon';
export function SignUpContinue() {
- const { isDevelopmentOrStaging } = useEnvironment();
const { t } = useLocalizations();
const { enabled: firstNameEnabled, required: firstNameRequired } = useAttributes('first_name');
const { enabled: lastNameEnabled, required: lastNameRequired } = useAttributes('last_name');
@@ -25,8 +24,7 @@ export function SignUpContinue() {
const { enabled: phoneNumberEnabled, required: phoneNumberRequired } = useAttributes('phone_number');
const { enabled: passwordEnabled, required: passwordRequired } = useAttributes('password');
const { branded, applicationName, homeUrl, logoImageUrl } = useDisplayConfig();
-
- const isDev = isDevelopmentOrStaging();
+ const renderDevModeWarning = useDevModeWarning();
return (
@@ -111,7 +109,7 @@ export function SignUpContinue() {
);
}}
- {isDev ? Development mode : null}
+ {renderDevModeWarning ? Development mode : null}
diff --git a/packages/ui/src/components/sign-up/steps/start.tsx b/packages/ui/src/components/sign-up/steps/start.tsx
index 6606004e706..1ae8b95bd6b 100644
--- a/packages/ui/src/components/sign-up/steps/start.tsx
+++ b/packages/ui/src/components/sign-up/steps/start.tsx
@@ -12,6 +12,7 @@ import { PasswordField } from '~/common/password-field';
import { PhoneNumberField } from '~/common/phone-number-field';
import { UsernameField } from '~/common/username-field';
import { useAttributes } from '~/hooks/use-attributes';
+import { useDevModeWarning } from '~/hooks/use-dev-mode-warning';
import { useDisplayConfig } from '~/hooks/use-display-config';
import { useEnabledConnections } from '~/hooks/use-enabled-connections';
import { useEnvironment } from '~/hooks/use-environment';
@@ -24,7 +25,7 @@ import { Separator } from '~/primitives/separator';
export function SignUpStart() {
const clerk = useClerk();
const enabledConnections = useEnabledConnections();
- const { isDevelopmentOrStaging, userSettings } = useEnvironment();
+ const { userSettings } = useEnvironment();
const { t } = useLocalizations();
const { enabled: firstNameEnabled, required: firstNameRequired } = useAttributes('first_name');
const { enabled: lastNameEnabled, required: lastNameRequired } = useAttributes('last_name');
@@ -36,7 +37,8 @@ export function SignUpStart() {
const hasConnection = enabledConnections.length > 0;
const hasIdentifier = emailAddressEnabled || usernameEnabled || phoneNumberEnabled;
- const isDev = isDevelopmentOrStaging();
+ const renderDevModeWarning = useDevModeWarning();
+
return (
{isGlobalLoading => {
@@ -144,7 +146,7 @@ export function SignUpStart() {
}}
) : null}
- {isDev ? Development mode : null}
+ {renderDevModeWarning ? Development mode : null}
diff --git a/packages/ui/src/components/sign-up/steps/verifications.tsx b/packages/ui/src/components/sign-up/steps/verifications.tsx
index 9e197a7d5ac..634fedd10bb 100644
--- a/packages/ui/src/components/sign-up/steps/verifications.tsx
+++ b/packages/ui/src/components/sign-up/steps/verifications.tsx
@@ -5,8 +5,8 @@ import * as SignUp from '@clerk/elements/sign-up';
import { GlobalError } from '~/common/global-error';
import { OTPField } from '~/common/otp-field';
import { parsePhoneString } from '~/common/phone-number-field/utils';
+import { useDevModeWarning } from '~/hooks/use-dev-mode-warning';
import { useDisplayConfig } from '~/hooks/use-display-config';
-import { useEnvironment } from '~/hooks/use-environment';
import { useLocalizations } from '~/hooks/use-localizations';
import { Button } from '~/primitives/button';
import * as Card from '~/primitives/card';
@@ -43,11 +43,10 @@ function SignUpIdentifier({ emailAddress, phoneNumber }: Identifier) {
============================================ */
export function SignUpVerifications() {
- const { isDevelopmentOrStaging } = useEnvironment();
const { t } = useLocalizations();
const { branded, applicationName, homeUrl, logoImageUrl } = useDisplayConfig();
- const isDev = isDevelopmentOrStaging();
+ const renderDevModeNotice = useDevModeWarning();
return (
@@ -271,7 +270,7 @@ export function SignUpVerifications() {
- {isDev ? Development mode : null}
+ {renderDevModeNotice ? Development mode : null}
diff --git a/packages/ui/src/hooks/use-appearance.ts b/packages/ui/src/hooks/use-appearance.ts
new file mode 100644
index 00000000000..027ba9a1eb2
--- /dev/null
+++ b/packages/ui/src/hooks/use-appearance.ts
@@ -0,0 +1,8 @@
+import type { Appearance } from '@clerk/types';
+
+import { useOptions } from './use-options';
+
+export function useAppearance() {
+ const { appearance } = useOptions();
+ return (appearance as Appearance) || {};
+}
diff --git a/packages/ui/src/hooks/use-dev-mode-warning.ts b/packages/ui/src/hooks/use-dev-mode-warning.ts
new file mode 100644
index 00000000000..7f2328f8340
--- /dev/null
+++ b/packages/ui/src/hooks/use-dev-mode-warning.ts
@@ -0,0 +1,17 @@
+import { useMemo } from 'react';
+
+import { useAppearance } from './use-appearance';
+import { useEnvironment } from './use-environment';
+
+export function useDevModeWarning() {
+ const { displayConfig, isDevelopmentOrStaging } = useEnvironment();
+ const isDevelopment = isDevelopmentOrStaging();
+ const { layout } = useAppearance();
+ const unsafeDisabled = layout?.unsafe_disableDevelopmentModeWarnings || false;
+ const developmentUiDisabled = isDevelopment && unsafeDisabled;
+ const showDevModeWarning = useMemo(
+ () => !developmentUiDisabled && displayConfig.showDevModeWarning,
+ [developmentUiDisabled, displayConfig],
+ );
+ return showDevModeWarning;
+}