Skip to content

Commit cd45a59

Browse files
committed
feat(core,console): add hide logto branding switch
1 parent 011c1f7 commit cd45a59

File tree

26 files changed

+107
-2
lines changed

26 files changed

+107
-2
lines changed

packages/console/src/pages/SignInExperience/PageContent/Branding/BrandingForm/index.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Controller, useFormContext } from 'react-hook-form';
55
import { useTranslation } from 'react-i18next';
66

77
import LogoAndFavicon from '@/components/ImageInputs/LogoAndFavicon';
8+
import { isCloud, isDevFeaturesEnabled } from '@/consts/env';
89
import Button from '@/ds-components/Button';
910
import Card from '@/ds-components/Card';
1011
import ColorPicker from '@/ds-components/ColorPicker';
@@ -49,6 +50,8 @@ function BrandingForm() {
4950
}
5051
}, [handleResetColor, isDarkModeEnabled, isDirty]);
5152

53+
const showHideLogtoBranding = isCloud && isDevFeaturesEnabled;
54+
5255
return (
5356
<Card>
5457
<FormSectionTitle title="branding.title" />
@@ -113,6 +116,14 @@ function BrandingForm() {
113116
/>
114117
</>
115118
)}
119+
{showHideLogtoBranding && (
120+
<FormField title="sign_in_exp.branding.hide_logto_branding">
121+
<Switch
122+
label={t('sign_in_exp.branding.hide_logto_branding_description')}
123+
{...register('hideLogtoBranding')}
124+
/>
125+
</FormField>
126+
)}
116127
</Card>
117128
);
118129
}

packages/core/src/__mocks__/sign-in-experience.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export const mockSignInExperience: SignInExperience = {
5454
branding: {
5555
logoUrl: 'http://logto.png',
5656
},
57+
hideLogtoBranding: false,
5758
termsOfUseUrl: mockTermsOfUseUrl,
5859
privacyPolicyUrl: mockPrivacyPolicyUrl,
5960
languageInfo: {

packages/core/src/routes/sign-in-experience/index.openapi.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
"languageInfo": {
2424
"description": "The language detection policy for the sign-in page."
2525
},
26+
"hideLogtoBranding": {
27+
"description": "Cloud only. Whether to hide the Logto branding on hosted sign-in pages."
28+
},
2629
"signIn": {
2730
"description": "Sign-in method settings."
2831
},
@@ -112,6 +115,9 @@
112115
"languageInfo": {
113116
"description": "Control the language detection policy for the sign-in page."
114117
},
118+
"hideLogtoBranding": {
119+
"description": "Cloud only. Whether to hide the Logto branding on hosted sign-in pages."
120+
},
115121
"signIn": {
116122
"description": "Sign-in method settings"
117123
},

packages/core/src/routes/sign-in-experience/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { conditional, type Optional, tryThat } from '@silverhand/essentials';
1111
import { literal, object, string, z } from 'zod';
1212

13+
import { EnvSet } from '#src/env-set/index.js';
1314
import {
1415
validateSignUp,
1516
validateSignIn,
@@ -90,7 +91,7 @@ export default function signInExperiencesRoutes<T extends ManagementApiRouter>(
9091
async (ctx, next) => {
9192
const {
9293
query: { removeUnusedDemoSocialConnector },
93-
body: { socialSignInConnectorTargets, emailBlocklistPolicy, ...rest },
94+
body: { socialSignInConnectorTargets, emailBlocklistPolicy, hideLogtoBranding, ...rest },
9495
} = ctx.guard;
9596
const {
9697
languageInfo,
@@ -189,6 +190,11 @@ export default function signInExperiencesRoutes<T extends ManagementApiRouter>(
189190

190191
const payload = {
191192
...rest,
193+
...conditional(
194+
EnvSet.values.isCloud &&
195+
EnvSet.values.isDevFeaturesEnabled &&
196+
hideLogtoBranding !== undefined && { hideLogtoBranding }
197+
),
192198
...conditional(
193199
filteredSocialSignInConnectorTargets && {
194200
socialSignInConnectorTargets: filteredSocialSignInConnectorTargets,

packages/experience/src/Layout/AppLayout/index.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import classNames from 'classnames';
2+
import { useContext } from 'react';
23
import { Outlet } from 'react-router-dom';
34

5+
import PageContext from '@/Providers/PageContextProvider/PageContext';
46
import LogtoSignature from '@/components/LogtoSignature';
57
import usePlatform from '@/hooks/use-platform';
68
import { layoutClassNames } from '@/utils/consts';
@@ -9,15 +11,19 @@ import CustomContent from './CustomContent';
911
import styles from './index.module.scss';
1012

1113
const AppLayout = () => {
14+
const { experienceSettings } = useContext(PageContext);
1215
const { isMobile } = usePlatform();
16+
const hideLogtoBranding = experienceSettings?.hideLogtoBranding === true;
1317

1418
return (
1519
<div className={styles.viewBox}>
1620
<div className={classNames(styles.container, layoutClassNames.pageContainer)}>
1721
{!isMobile && <CustomContent className={layoutClassNames.customContent} />}
1822
<main className={classNames(styles.main, layoutClassNames.mainContent)}>
1923
<Outlet />
20-
<LogtoSignature className={classNames(styles.signature, layoutClassNames.signature)} />
24+
{!hideLogtoBranding && (
25+
<LogtoSignature className={classNames(styles.signature, layoutClassNames.signature)} />
26+
)}
2127
</main>
2228
</div>
2329
</div>

packages/experience/src/__mocks__/logto.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export const mockSignInExperience: SignInExperience = {
121121
sentinelPolicy: {},
122122
emailBlocklistPolicy: {},
123123
forgotPasswordMethods: [],
124+
hideLogtoBranding: false,
124125
};
125126

126127
export const mockSignInExperienceSettings: SignInExperienceResponse = {
@@ -131,6 +132,7 @@ export const mockSignInExperienceSettings: SignInExperienceResponse = {
131132
termsOfUseUrl: mockSignInExperience.termsOfUseUrl,
132133
privacyPolicyUrl: mockSignInExperience.privacyPolicyUrl,
133134
languageInfo: mockSignInExperience.languageInfo,
135+
hideLogtoBranding: false,
134136
signIn: mockSignInExperience.signIn,
135137
signUp: {
136138
identifiers: [SignInIdentifier.Username],

packages/phrases/src/locales/ar/translation/admin-console/sign-in-exp/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ const sign_in_exp = {
4040
app_logo_and_favicon: 'شعار التطبيق ورمز الموقع',
4141
company_logo_and_favicon: 'شعار الشركة ورمز الموقع',
4242
organization_logo_and_favicon: 'شعار المنظمة ورمز الموقع',
43+
hide_logto_branding: 'Hide Logto branding',
44+
hide_logto_branding_description:
45+
'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
4346
},
4447
branding_uploads: {
4548
app_logo: {

packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ const sign_in_exp = {
4242
app_logo_and_favicon: 'App-Logo und Favicon',
4343
company_logo_and_favicon: 'Firmenlogo und Favicon',
4444
organization_logo_and_favicon: 'Organisationslogo und Favicon',
45+
hide_logto_branding: 'Hide Logto branding',
46+
hide_logto_branding_description:
47+
'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
4548
},
4649
branding_uploads: {
4750
app_logo: {

packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ const sign_in_exp = {
4242
app_logo_and_favicon: 'App logo and favicon',
4343
company_logo_and_favicon: 'Company logo and favicon',
4444
organization_logo_and_favicon: 'Organization logo and favicon',
45+
hide_logto_branding: 'Hide Logto branding',
46+
hide_logto_branding_description:
47+
'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
4548
},
4649
branding_uploads: {
4750
app_logo: {

packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ const sign_in_exp = {
4343
app_logo_and_favicon: 'Logotipo y favicon de la aplicación',
4444
company_logo_and_favicon: 'Logotipo y favicon de la empresa',
4545
organization_logo_and_favicon: 'Logotipo y favicon de la organización',
46+
hide_logto_branding: 'Hide Logto branding',
47+
hide_logto_branding_description:
48+
'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
4649
},
4750
branding_uploads: {
4851
app_logo: {

0 commit comments

Comments
 (0)