diff --git a/docs/auth0_universal-login.md b/docs/auth0_universal-login.md index 45468c0a3..55d5d66e5 100644 --- a/docs/auth0_universal-login.md +++ b/docs/auth0_universal-login.md @@ -5,13 +5,23 @@ has_children: true --- # auth0 universal-login -Manage a consistent, branded Universal Login experience that can handle all of your authentication flows. +Manage Universal Login branding and customization settings. + +� DEPRECATION WARNING: Advanced Customizations (ACUL) have moved! + +The 'auth0 ul customize --rendering-mode advanced' functionality will be +DEPRECATED on April 18, 2026. Please migrate to the new ACUL commands: + + ✅ auth0 acul config generate|get|set|list|docs + +Standard Universal Login customizations continue to work as before. ## Commands -- [auth0 universal-login customize](auth0_universal-login_customize.md) - Customize the Universal Login experience +- [auth0 universal-login customize](auth0_universal-login_customize.md) - ⚠️ Customize Universal Login (Advanced mode DEPRECATED) - [auth0 universal-login prompts](auth0_universal-login_prompts.md) - Manage custom text for prompts - [auth0 universal-login show](auth0_universal-login_show.md) - Display the custom branding settings for Universal Login +- [auth0 universal-login switch](auth0_universal-login_switch.md) - ⚠️ Switch rendering mode (DEPRECATED) - [auth0 universal-login templates](auth0_universal-login_templates.md) - Manage custom Universal Login templates - [auth0 universal-login update](auth0_universal-login_update.md) - Update the custom branding settings for Universal Login diff --git a/docs/auth0_universal-login_customize.md b/docs/auth0_universal-login_customize.md index 727ad77ed..7d738ccbc 100644 --- a/docs/auth0_universal-login_customize.md +++ b/docs/auth0_universal-login_customize.md @@ -5,7 +5,21 @@ has_toc: false --- # auth0 universal-login customize -Customize and preview changes to the Universal Login experience. This command will open a webpage within your browser where you can edit and preview your branding changes. For a comprehensive list of editable parameters and their values please visit the [Management API Documentation](https://auth0.com/docs/api/management/v2). + +Customize your Universal Login Experience. Note that this requires a custom domain to be configured for the tenant. + +* Standard mode is recommended for creating a consistent, branded experience for users. Choosing Standard mode will open a webpage +within your browser where you can edit and preview your branding changes.For a comprehensive list of editable parameters and their values, +please visit the [Management API Documentation](https://auth0.com/docs/api/management/v2) + +⚠️ DEPRECATION NOTICE: Advanced mode will be deprecated on 2026-04-30 + For future Advanced Customizations, use: auth0 acul config +* Advanced mode is recommended for full customization/granular control of the login experience and to integrate your own component design system. +Choosing Advanced mode will open the default terminal editor, with the rendering configs: + +![storybook](settings.json) + +Closing the terminal editor will save the settings to your tenant. ## Usage ``` @@ -20,6 +34,16 @@ auth0 universal-login customize [flags] ``` +## Flags + +``` + -f, --file string File to save the rendering configs to. + -p, --prompt string Name of the prompt to to switch or customize. + -r, --rendering-mode string standardMode is recommended for customizating consistent, branded experience for users. + Alternatively, advancedMode is recommended for full customization/granular control of the login experience and to integrate own component design system + + -s, --screen string Name of the screen to customize. +``` ## Inherited Flags @@ -34,9 +58,10 @@ auth0 universal-login customize [flags] ## Related Commands -- [auth0 universal-login customize](auth0_universal-login_customize.md) - Customize the Universal Login experience +- [auth0 universal-login customize](auth0_universal-login_customize.md) - ⚠️ Customize Universal Login (Advanced mode DEPRECATED) - [auth0 universal-login prompts](auth0_universal-login_prompts.md) - Manage custom text for prompts - [auth0 universal-login show](auth0_universal-login_show.md) - Display the custom branding settings for Universal Login +- [auth0 universal-login switch](auth0_universal-login_switch.md) - ⚠️ Switch rendering mode (DEPRECATED) - [auth0 universal-login templates](auth0_universal-login_templates.md) - Manage custom Universal Login templates - [auth0 universal-login update](auth0_universal-login_update.md) - Update the custom branding settings for Universal Login diff --git a/docs/auth0_universal-login_show.md b/docs/auth0_universal-login_show.md index d713dc2cb..e3361cb81 100644 --- a/docs/auth0_universal-login_show.md +++ b/docs/auth0_universal-login_show.md @@ -42,9 +42,10 @@ auth0 universal-login show [flags] ## Related Commands -- [auth0 universal-login customize](auth0_universal-login_customize.md) - Customize the Universal Login experience +- [auth0 universal-login customize](auth0_universal-login_customize.md) - ⚠️ Customize Universal Login (Advanced mode DEPRECATED) - [auth0 universal-login prompts](auth0_universal-login_prompts.md) - Manage custom text for prompts - [auth0 universal-login show](auth0_universal-login_show.md) - Display the custom branding settings for Universal Login +- [auth0 universal-login switch](auth0_universal-login_switch.md) - ⚠️ Switch rendering mode (DEPRECATED) - [auth0 universal-login templates](auth0_universal-login_templates.md) - Manage custom Universal Login templates - [auth0 universal-login update](auth0_universal-login_update.md) - Update the custom branding settings for Universal Login diff --git a/docs/auth0_universal-login_switch.md b/docs/auth0_universal-login_switch.md new file mode 100644 index 000000000..d3c93d888 --- /dev/null +++ b/docs/auth0_universal-login_switch.md @@ -0,0 +1,63 @@ +--- +layout: default +parent: auth0 universal-login +has_toc: false +--- +# auth0 universal-login switch + +Switch the rendering mode for Universal Login. Note that this requires a custom domain to be configured for the tenant. + +🚨 DEPRECATION WARNING: The 'auth0 ul switch' command will be DEPRECATED on April 30, 2026 + +✅ For Advanced Customizations, migrate to the new ACUL config commands: + • auth0 acul config generate + • auth0 acul config get + • auth0 acul config set + • auth0 acul config list + +## Usage +``` +auth0 universal-login switch [flags] +``` + +## Examples + +``` + auth0 universal-login switch + auth0 universal-login switch --prompt login-id --screen login-id --rendering-mode standard + auth0 ul switch --prompt login-id --screen login-id --rendering-mode advanced + auth0 ul switch -p login-id -s login-id -r standard +``` + + +## Flags + +``` + -p, --prompt string Name of the prompt to to switch or customize. + -r, --rendering-mode string standardMode is recommended for customizating consistent, branded experience for users. + Alternatively, advancedMode is recommended for full customization/granular control of the login experience and to integrate own component design system + + -s, --screen string Name of the screen to customize. +``` + + +## Inherited Flags + +``` + --debug Enable debug mode. + --no-color Disable colors. + --no-input Disable interactivity. + --tenant string Specific tenant to use. +``` + + +## Related Commands + +- [auth0 universal-login customize](auth0_universal-login_customize.md) - ⚠️ Customize Universal Login (Advanced mode DEPRECATED) +- [auth0 universal-login prompts](auth0_universal-login_prompts.md) - Manage custom text for prompts +- [auth0 universal-login show](auth0_universal-login_show.md) - Display the custom branding settings for Universal Login +- [auth0 universal-login switch](auth0_universal-login_switch.md) - ⚠️ Switch rendering mode (DEPRECATED) +- [auth0 universal-login templates](auth0_universal-login_templates.md) - Manage custom Universal Login templates +- [auth0 universal-login update](auth0_universal-login_update.md) - Update the custom branding settings for Universal Login + + diff --git a/docs/auth0_universal-login_update.md b/docs/auth0_universal-login_update.md index 9586bc5d7..3f0a25315 100644 --- a/docs/auth0_universal-login_update.md +++ b/docs/auth0_universal-login_update.md @@ -52,9 +52,10 @@ auth0 universal-login update [flags] ## Related Commands -- [auth0 universal-login customize](auth0_universal-login_customize.md) - Customize the Universal Login experience +- [auth0 universal-login customize](auth0_universal-login_customize.md) - ⚠️ Customize Universal Login (Advanced mode DEPRECATED) - [auth0 universal-login prompts](auth0_universal-login_prompts.md) - Manage custom text for prompts - [auth0 universal-login show](auth0_universal-login_show.md) - Display the custom branding settings for Universal Login +- [auth0 universal-login switch](auth0_universal-login_switch.md) - ⚠️ Switch rendering mode (DEPRECATED) - [auth0 universal-login templates](auth0_universal-login_templates.md) - Manage custom Universal Login templates - [auth0 universal-login update](auth0_universal-login_update.md) - Update the custom branding settings for Universal Login diff --git a/internal/cli/universal_login.go b/internal/cli/universal_login.go index 836430260..8cd3fc7bc 100644 --- a/internal/cli/universal_login.go +++ b/internal/cli/universal_login.go @@ -56,14 +56,23 @@ func universalLoginCmd(cli *cli) *cobra.Command { cmd := &cobra.Command{ Use: "universal-login", Short: "Manage the Universal Login experience", - Long: "Manage a consistent, branded Universal Login experience that can " + - "handle all of your authentication flows.", + Long: `Manage Universal Login branding and customization settings. + +� DEPRECATION WARNING: Advanced Customizations (ACUL) have moved! + +The 'auth0 ul customize --rendering-mode advanced' functionality will be +DEPRECATED on April 18, 2026. Please migrate to the new ACUL commands: + + ✅ auth0 acul config generate|get|set|list|docs + +Standard Universal Login customizations continue to work as before.`, Aliases: []string{"ul"}, } cmd.SetUsageTemplate(resourceUsageTemplate()) cmd.AddCommand(customizeUniversalLoginCmd(cli)) + cmd.AddCommand(switchUniversalLoginRendererModeCmd(cli)) cmd.AddCommand(showUniversalLoginCmd(cli)) cmd.AddCommand(updateUniversalLoginCmd(cli)) cmd.AddCommand(universalLoginTemplatesCmd(cli)) diff --git a/internal/cli/universal_login_customize.go b/internal/cli/universal_login_customize.go index 1107b10c4..d83f70677 100644 --- a/internal/cli/universal_login_customize.go +++ b/internal/cli/universal_login_customize.go @@ -19,8 +19,10 @@ import ( "github.com/spf13/cobra" "golang.org/x/sync/errgroup" + "github.com/auth0/auth0-cli/internal/ansi" "github.com/auth0/auth0-cli/internal/auth0" "github.com/auth0/auth0-cli/internal/display" + "github.com/auth0/auth0-cli/internal/utils" ) const ( @@ -35,6 +37,10 @@ const ( errorMessageType = "ERROR" successMessageType = "SUCCESS" standardMode = "standard" + advancedMode = "advanced" + + sunsetDate = "2026-04-30" // 6 months from GA. + warningPeriodDays = 30 // Show urgent warnings 30 days before sunset. ) var ( @@ -44,6 +50,28 @@ var ( ErrNoChangesDetected = fmt.Errorf("no changes detected") ) +var ( + renderingMode = Flag{ + Name: "Rendering Mode", + LongForm: "rendering-mode", + ShortForm: "r", + Help: fmt.Sprintf( + "%s\n%s\n", + "standardMode is recommended for customizating consistent, branded experience for users.", + "Alternatively, advancedMode is recommended for full customization/granular control of the login experience and to integrate own component design system", + ), + IsRequired: true, + } + + promptName = Flag{ + Name: "Prompt Name", + LongForm: "prompt", + ShortForm: "p", + Help: "Name of the prompt to to switch or customize.", + IsRequired: true, + } +) + var allowedPromptsWithPartials = []management.PromptType{ management.PromptSignup, management.PromptSignupID, @@ -54,6 +82,45 @@ var allowedPromptsWithPartials = []management.PromptType{ management.PromptLoginPasswordLess, } +var PromptScreenMap = map[string][]string{ + "signup-id": {"signup-id"}, + "signup-password": {"signup-password"}, + "login-id": {"login-id"}, + "login-password": {"login-password"}, + "login-passwordless": {"login-passwordless-email-code", "login-passwordless-sms-otp"}, + "phone-identifier-enrollment": {"phone-identifier-enrollment"}, + "phone-identifier-challenge": {"phone-identifier-challenge"}, + "email-identifier-challenge": {"email-identifier-challenge"}, + "passkeys": {"passkey-enrollment", "passkey-enrollment-local"}, + "captcha": {"interstitial-captcha"}, + "login": {"login"}, + "signup": {"signup"}, + "reset-password": {"reset-password-request", "reset-password-email", "reset-password", "reset-password-success", "reset-password-error", + "reset-password-mfa-email-challenge", "reset-password-mfa-otp-challenge", "reset-password-mfa-push-challenge-push", + "reset-password-mfa-sms-challenge", "reset-password-mfa-phone-challenge", "reset-password-mfa-voice-challenge", + "reset-password-mfa-recovery-code-challenge", "reset-password-mfa-webauthn-platform-challenge", "reset-password-mfa-webauthn-roaming-challenge"}, + "mfa": {"mfa-detect-browser-capabilities", "mfa-enroll-result", "mfa-begin-enroll-options", "mfa-login-options"}, + "mfa-email": {"mfa-email-challenge", "mfa-email-list"}, + "mfa-sms": {"mfa-country-codes", "mfa-sms-challenge", "mfa-sms-enrollment", "mfa-sms-list"}, + "mfa-push": {"mfa-push-challenge-push", "mfa-push-enrollment-qr", "mfa-push-list", "mfa-push-welcome"}, + "invitation": {"accept-invitation"}, + "organizations": {"organization-selection", "organization-picker"}, + "mfa-otp": {"mfa-otp-challenge", "mfa-otp-enrollment-code", "mfa-otp-enrollment-qr"}, + "device-flow": {"device-code-activation", "device-code-activation-allowed", "device-code-activation-denied", "device-code-confirmation"}, + "mfa-phone": {"mfa-phone-challenge", "mfa-phone-enrollment"}, + "mfa-voice": {"mfa-voice-challenge", "mfa-voice-enrollment"}, + "mfa-recovery-code": {"mfa-recovery-code-challenge", "mfa-recovery-code-enrollment", "mfa-recovery-code-challenge-new-code"}, + "common": {"redeem-ticket"}, + "email-verification": {"email-verification-result"}, + "login-email-verification": {"login-email-verification"}, + "logout": {"logout", "logout-aborted", "logout-complete"}, + "mfa-webauthn": {"mfa-webauthn-change-key-nickname", "mfa-webauthn-enrollment-success", "mfa-webauthn-error", "mfa-webauthn-platform-challenge", + "mfa-webauthn-platform-enrollment", "mfa-webauthn-roaming-challenge", "mfa-webauthn-roaming-enrollment", "mfa-webauthn-not-available-error"}, + "consent": {"consent"}, + "customized-consent": {"customized-consent"}, + "email-otp-challenge": {"email-otp-challenge"}, +} + type partialsData map[string]*management.PromptScreenPartials type ( @@ -179,15 +246,31 @@ func (m *webSocketMessage) UnmarshalJSON(b []byte) error { return nil } +type promptScreen struct { + filePath string + promptName string + screenName string +} + func customizeUniversalLoginCmd(cli *cli) *cobra.Command { + var ( + selectedRenderingMode string + input promptScreen + ) + cmd := &cobra.Command{ Use: "customize", Args: cobra.NoArgs, - Short: "Customize the Universal Login experience", - Long: "Customize and preview changes to the Universal Login experience. This command will open a webpage " + - "within your browser where you can edit and preview your branding changes. For a comprehensive list of " + - "editable parameters and their values please visit the " + - "[Management API Documentation](https://auth0.com/docs/api/management/v2).", + Short: "⚠️ Customize Universal Login (Advanced mode DEPRECATED)", + Long: "\nCustomize your Universal Login Experience. Note that this requires a custom domain to be configured for the tenant. \n\n" + + "* Standard mode is recommended for creating a consistent, branded experience for users. Choosing Standard mode will open a webpage\n" + + "within your browser where you can edit and preview your branding changes.For a comprehensive list of editable parameters and their values,\n" + + "please visit the [Management API Documentation](https://auth0.com/docs/api/management/v2)\n\n" + + "⚠️ DEPRECATION NOTICE: Advanced mode will be deprecated on " + sunsetDate + "\n" + + " For future Advanced Customizations, use: auth0 acul config \n" + + "* Advanced mode is recommended for full customization/granular control of the login experience and to integrate your own component design system. \n" + + "Choosing Advanced mode will open the default terminal editor, with the rendering configs:\n\n" + + "![storybook](settings.json)\n\nClosing the terminal editor will save the settings to your tenant.", Example: ` auth0 universal-login customize auth0 ul customize`, RunE: func(cmd *cobra.Command, args []string) error { @@ -201,16 +284,72 @@ func customizeUniversalLoginCmd(cli *cli) *cobra.Command { return err } - cli.renderer.Infof("Tip : Use `auth0 ul switch` to switch the rendering-modes between standard and advanced mode") + if selectedRenderingMode == "" { + cli.renderer.Infof("Please select a rendering mode to customize:") + if err := renderingMode.Select(cmd, &selectedRenderingMode, []string{advancedMode, standardMode}, nil); err != nil { + return err + } + } + + if selectedRenderingMode == advancedMode { + if err := displayDeprecationStatus(cli, true); err != nil { + return err + } + + // Add visual separation and brief pause to ensure users see the warning. + cli.renderer.Output(ansi.Bold("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")) + cli.renderer.Output("") + + if !cli.noInput { + time.Sleep(2 * time.Second) // Brief pause to let users read. + } + + err := fetchPromptScreenInfo(cmd, cli, &input, "customize") + if err != nil { + return err + } + + return advanceCustomize(cmd, cli, aculConfigInput{ + screenName: input.screenName, + filePath: input.filePath, + }) + } // RenderingMode as standard. return startWebSocketServer(ctx, cli.api, cli.renderer, cli.tenant) }, } + renderingMode.RegisterString(cmd, &selectedRenderingMode, "") + promptName.RegisterString(cmd, &input.promptName, "") + screenName.RegisterString(cmd, &input.screenName, "") + file.RegisterString(cmd, &input.filePath, "") + return cmd } +func fetchPromptScreenInfo(cmd *cobra.Command, cli *cli, input *promptScreen, action string) error { + if input.promptName == "" { + cli.renderer.Infof("Please select a prompt to %s its rendering mode:", action) + if err := promptName.Select(cmd, &input.promptName, utils.FetchKeys(PromptScreenMap), nil); err != nil { + return handleInputError(err) + } + } + + if input.screenName == "" { + if len(PromptScreenMap[input.promptName]) > 1 { + cli.renderer.Infof("Please select a screen to %s its rendering mode:", action) + if err := screenName.Select(cmd, &input.screenName, PromptScreenMap[input.promptName], nil); err != nil { + return handleInputError(err) + } + } else { + input.screenName = PromptScreenMap[input.promptName][0] + } + } + + return nil +} + func ensureNewUniversalLoginExperienceIsActive(ctx context.Context, api *auth0.API) error { authenticationProfile, err := api.Prompt.Read(ctx) if err != nil { @@ -227,6 +366,72 @@ func ensureNewUniversalLoginExperienceIsActive(ctx context.Context, api *auth0.A ) } +// displayDeprecationStatus displays timeline information. +// The `showCommands` flag controls whether to display helpful usage examples. +func displayDeprecationStatus(cli *cli, showCommands bool) error { + parsedSunset, _ := time.Parse("2006-01-02", sunsetDate) + now := time.Now() + daysUntil := int(parsedSunset.Sub(now).Hours() / 24) + formattedDate := ansi.Bold(ansi.Cyan(parsedSunset.Format("Jan 2, 2006"))) + + switch { + case daysUntil <= 0: + cli.renderer.Errorf("Advanced rendering mode was retired on %s", formattedDate) + cli.renderer.Errorf(" Use instead: %s", ansi.Green("auth0 acul config")) + if showCommands { + showNewConfigExamples(cli) + } + return fmt.Errorf("advanced rendering mode is no longer supported") + + case daysUntil <= warningPeriodDays: + cli.renderer.Output("") + cli.renderer.Output(ansi.Bold(ansi.Red("🚨 URGENT: DEPRECATION NOTICE 🚨"))) + cli.renderer.Warnf("%s will be retired soon (%d days left)", + ansi.Bold("Advanced rendering mode"), daysUntil) + cli.renderer.Warnf(" Switch to: %s", ansi.Bold(ansi.Cyan("auth0 acul config"))) + + if showCommands { + cli.renderer.Output("") + showNewConfigExamples(cli) + } + + cli.renderer.Warnf("⏳ Proceeding with advanced rendering mode (deprecated)") + + default: + cli.renderer.Output("") + cli.renderer.Output(ansi.Bold(ansi.Red("⚠️ DEPRECATION NOTICE ⚠️"))) + cli.renderer.Warnf("%s will be retired on %s (%d days remaining)", + ansi.Bold("Advanced rendering mode"), formattedDate, daysUntil) + cli.renderer.Warnf(" Try new commands: %s", ansi.Bold(ansi.Cyan("auth0 acul config"))) + if showCommands { + cli.renderer.Output("") + showNewConfigExamples(cli) + } + } + + cli.renderer.Output("") + cli.renderer.Warnf(" For help: %s", ansi.Bold(ansi.Cyan("auth0 acul config --help"))) + cli.renderer.Output("") + cli.renderer.Output(ansi.Bold(ansi.Yellow("⚠️ Please read the above deprecation notice carefully! ⚠️"))) + cli.renderer.Output("") + + return nil +} + +// showNewConfigExamples displays example commands for managing ACUL configurations. +func showNewConfigExamples(cli *cli) { + cli.renderer.Warnf(" %s - Create config files", ansi.Yellow("auth0 acul config generate ")) + cli.renderer.Warnf(" %s - Download current settings", ansi.Yellow("auth0 acul config get ")) + cli.renderer.Warnf(" %s - Upload customizations", ansi.Yellow("auth0 acul config set ")) + cli.renderer.Warnf(" %s - View available screens", ansi.Yellow("auth0 acul config list")) + cli.renderer.Output("") + cli.renderer.Warnf(" %s", ansi.Bold("Quick Start:")) + cli.renderer.Warnf(" 1. %s", ansi.Cyan("auth0 acul config generate login-id")) + cli.renderer.Warnf(" 2. Edit the generated JSON file as needed") + cli.renderer.Warnf(" 3. %s", ansi.Cyan("auth0 acul config set login-id --file login-id.json")) + cli.renderer.Output("") +} + func startWebSocketServer( ctx context.Context, api *auth0.API, @@ -822,3 +1027,71 @@ func saveUniversalLoginBrandingData(ctx context.Context, api *auth0.API, data *u return group.Wait() } + +func switchUniversalLoginRendererModeCmd(cli *cli) *cobra.Command { + var ( + selectedRenderingMode string + input promptScreen + ) + + cmd := &cobra.Command{ + Use: "switch", + Args: cobra.NoArgs, + Short: "⚠️ Switch rendering mode (DEPRECATED)", + Long: `Switch the rendering mode for Universal Login. Note that this requires a custom domain to be configured for the tenant. + +🚨 DEPRECATION WARNING: The 'auth0 ul switch' command will be DEPRECATED on April 30, 2026 + +✅ For Advanced Customizations, migrate to the new ACUL config commands: + • auth0 acul config generate + • auth0 acul config get + • auth0 acul config set + • auth0 acul config list`, + Example: ` auth0 universal-login switch + auth0 universal-login switch --prompt login-id --screen login-id --rendering-mode standard + auth0 ul switch --prompt login-id --screen login-id --rendering-mode advanced + auth0 ul switch -p login-id -s login-id -r standard`, + RunE: func(cmd *cobra.Command, args []string) error { + err := displayDeprecationStatus(cli, false) + if err != nil { + return err + } + + err = fetchPromptScreenInfo(cmd, cli, &input, "switch") + if err != nil { + return err + } + + if selectedRenderingMode == "" { + cli.renderer.Infof("Please select a rendering mode to switch:") + if err = renderingMode.Select(cmd, &selectedRenderingMode, []string{advancedMode, standardMode}, nil); err != nil { + return err + } + } + + if err = ansi.Waiting(func() error { + rendererMode := management.RenderingMode(selectedRenderingMode) + return cli.api.Prompt.UpdateRendering(cmd.Context(), management.PromptType(input.promptName), management.ScreenName(input.screenName), &management.PromptRendering{RenderingMode: &rendererMode}) + }); err != nil { + return fmt.Errorf("failed to switch the rendering mode for the prompt - %s, screen - %s : %w", ansi.Green(input.promptName), ansi.Green(input.screenName), err) + } + + cli.renderer.Infof( + "Successfully switched the rendering mode to %s for Prompt: %s and Screen: %s\n", + ansi.Green(selectedRenderingMode), + ansi.Green(input.promptName), + ansi.Green(input.screenName), + ) + + cli.renderer.Infof("Use `auth0 universal-login customize` to customize the Universal Login Experience\n") + + return nil + }, + } + + promptName.RegisterString(cmd, &input.promptName, "") + screenName.RegisterString(cmd, &input.screenName, "") + renderingMode.RegisterString(cmd, &selectedRenderingMode, "") + + return cmd +}