Repository: Automattic/Gravatar-SDK-Android
Pull request #628: Public API with new Quick Editor scopes
Author: login: AdamGrzybkowski
Labels: name: [Feature] Gravatar-Quickeditor
description: Gravatar Quick Editor module
Created: 2025-05-09T10:42:42Z | Merged: 2025-05-13T17:17:13Z

### Description

This PR introduced the new public API that will allow for Quick Editor's scope configuration. 

Here are our two rules that we want to follow:

1. The scopes are stated explicitly rather than as a combination of modes.
2. Adding a new scope in the future should NOT be a breaking change.

The above means we can't use Enums or Sealed classes for `QuickEditorScope` nor for the `QuickEditorPage`.
We must ensure that whenever we add a new scope in the future, it won't be a breaking change. 

**Scope**

Following the iOS implementation, we are introducing `QuickEditorScopeOption` class that will hold the config for each scope. The config can be configured via publicly available configurator classes (eg. `AvatarPickerConfiguration`) and internally kept as a sealed class for better type safety and ease of work. 

`QuickEditorScopeOption` creation will be limited to three static functions (with the constructor being private). Each function will take a corresponding configurator class. You can see an example of that in the `AvatarUpdateTab`.

```kotlin
QuickEditorScopeOption.avatarPicker(
    config = AvatarPickerConfiguration(
       contentLayout = AvatarPickerContentLayout.Horizontal,
    ),
)
```

This solution makes it easy to extend in the future, limits how it can be created for third parties, making it easy to follow with just the IDE suggestions. It's also compatible with our requirements, and adding new scopes won't break the compilation in the future. 

**Enum replacement**

For the direct backwards compatible enum replacement ,I've decided to use Kotlin `value classes`. 

```kotlin
public value class QuickEditorPage private constructor(
    public val value: String,
) {
    public companion object {
        public val AvatarPicker: QuickEditorPage = QuickEditorPage("avatar_picker")
        public val AboutEditor: QuickEditorPage = QuickEditorPage("about_editor")
    }
}
```

As you can see, I set the constructor to `private` so the only option to create `QuickEditorPage` is via its companion object helper properties. This way, only those specific types can be created. We could even extend this functionality and add some helper functions to list all available types, etc.

The above was used for `QuickEditorPage`, and `AboutInputField`.

**Misc**

The `avatarPickerContentLayout` now belongs to the scope config, but because we can't introduce breaking changes, we could only deprecate it in `GravatarQuickEditorParams`. We will keep it there and only use it if the scope config matches the default value. 

### Testing Steps

You can test the Quick Editor using the DemoApp. It is now using the `QuickEditorScope` and `QuickEditorPage`. The only thing that is not yet implemented is the `AboutInputField` - you can't configure it in the demo app yet. I will add it separately. 

The important part of this PR is to review the API rather than QE functionality. 



Diff:
diff --git a/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt b/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt
index 5916cd9c9..21bba64cc 100644
--- a/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt
+++ b/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt
@@ -2,6 +2,7 @@ package com.gravatar.demoapp.ui
 
 import android.content.Intent
 import android.widget.Toast
+import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.foundation.ScrollState
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Arrangement
@@ -46,11 +47,15 @@ import com.gravatar.demoapp.ui.activity.QuickEditorTestActivity
 import com.gravatar.demoapp.ui.components.GravatarEmailInput
 import com.gravatar.demoapp.ui.components.GravatarPasswordInput
 import com.gravatar.quickeditor.GravatarQuickEditor
+import com.gravatar.quickeditor.ui.editor.AboutEditorConfiguration
+import com.gravatar.quickeditor.ui.editor.AboutInputField
 import com.gravatar.quickeditor.ui.editor.AuthenticationMethod
+import com.gravatar.quickeditor.ui.editor.AvatarPickerAndAboutEditorConfiguration
+import com.gravatar.quickeditor.ui.editor.AvatarPickerConfiguration
 import com.gravatar.quickeditor.ui.editor.AvatarPickerContentLayout
 import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorParams
 import com.gravatar.quickeditor.ui.editor.GravatarUiMode
-import com.gravatar.quickeditor.ui.editor.QuickEditorScope
+import com.gravatar.quickeditor.ui.editor.QuickEditorScopeOption
 import com.gravatar.quickeditor.ui.editor.bottomsheet.GravatarQuickEditorBottomSheet
 import com.gravatar.quickeditor.ui.oauth.OAuthParams
 import com.gravatar.types.Email
@@ -79,8 +84,13 @@ fun AvatarUpdateTab(modifier: Modifier = Modifier) {
     var pickerUiMode: GravatarUiMode by rememberSaveable {
         mutableStateOf(GravatarUiMode.SYSTEM)
     }
+
     var editorScope: QuickEditorScope by rememberSaveable {
-        mutableStateOf(QuickEditorScope.AVATAR)
+        mutableStateOf(QuickEditorScope.Avatar)
+    }
+
+    var editorInitialPage: AvatarPickerAndAboutEditorConfiguration.Page by rememberSaveable {
+        mutableStateOf(AvatarPickerAndAboutEditorConfiguration.Page.AvatarPicker)
     }
 
     val keyboardController = LocalSoftwareKeyboardController.current
@@ -119,9 +129,9 @@ fun AvatarUpdateTab(modifier: Modifier = Modifier) {
                 modifier = Modifier.fillMaxWidth(),
                 horizontalArrangement = Arrangement.SpaceBetween,
             ) {
-                ContentLayoutDropdown(
-                    selectedContentLayout = pickerContentLayout,
-                    onContentLayoutSelected = { pickerContentLayout = it },
+                ScopeDropdown(
+                    scope = editorScope,
+                    onScopeSelected = { editorScope = it },
                     modifier = Modifier.weight(1f),
                 )
                 UiModeDropdown(
@@ -130,11 +140,22 @@ fun AvatarUpdateTab(modifier: Modifier = Modifier) {
                     modifier = Modifier.weight(1f),
                 )
             }
-            ScopeDropdown(
-                scope = editorScope,
-                onScopeSelected = { editorScope = it },
-                modifier = Modifier.fillMaxWidth(),
-            )
+            AnimatedVisibility(
+                visible = editorScope == QuickEditorScope.Avatar || editorScope == QuickEditorScope.AvatarAndAbout,
+            ) {
+                ContentLayoutDropdown(
+                    selectedContentLayout = pickerContentLayout,
+                    onContentLayoutSelected = { pickerContentLayout = it },
+                    modifier = Modifier.fillMaxWidth(),
+                )
+            }
+            AnimatedVisibility(editorScope == QuickEditorScope.AvatarAndAbout) {
+                InitialPageDropdown(
+                    page = editorInitialPage,
+                    onPageSelected = { editorInitialPage = it },
+                    modifier = Modifier.fillMaxWidth(),
+                )
+            }
             Button(
                 onClick = {
                     keyboardController?.hide()
@@ -197,9 +218,28 @@ fun AvatarUpdateTab(modifier: Modifier = Modifier) {
             GravatarQuickEditorBottomSheet(
                 gravatarQuickEditorParams = GravatarQuickEditorParams {
                     email = Email(userEmail)
-                    avatarPickerContentLayout = pickerContentLayout
                     uiMode = pickerUiMode
-                    scope = editorScope
+                    scopeConfig = when (editorScope) {
+                        QuickEditorScope.Avatar -> QuickEditorScopeOption.avatarPicker(
+                            config = AvatarPickerConfiguration(
+                                contentLayout = pickerContentLayout,
+                            ),
+                        )
+
+                        QuickEditorScope.About -> QuickEditorScopeOption.aboutEditor(
+                            config = AboutEditorConfiguration(
+                                fields = AboutInputField.all,
+                            ),
+                        )
+
+                        QuickEditorScope.AvatarAndAbout -> QuickEditorScopeOption.avatarAndAbout(
+                            config = AvatarPickerAndAboutEditorConfiguration(
+                                contentLayout = pickerContentLayout,
+                                initialPage = editorInitialPage,
+                                fields = AboutInputField.all,
+                            ),
+                        )
+                    }
                 },
                 authenticationMethod = authenticationMethod,
                 onAvatarSelected = remember {
@@ -243,6 +283,7 @@ private fun ContentLayoutDropdown(
             label = { Text("Content Layout") },
             trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
             modifier = Modifier
+                .fillMaxWidth()
                 .menuAnchor(),
         )
         ExposedDropdownMenu(
@@ -286,6 +327,7 @@ private fun UiModeDropdown(
             label = { Text("UI mode") },
             trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
             modifier = Modifier
+                .fillMaxWidth()
                 .menuAnchor(),
         )
         ExposedDropdownMenu(
@@ -312,9 +354,9 @@ private fun ScopeDropdown(
 ) {
     var expanded by remember { mutableStateOf(false) }
     val uiModeOptions = listOf(
-        QuickEditorScope.AVATAR,
-        QuickEditorScope.ABOUT,
-        QuickEditorScope.AVATAR_AND_ABOUT,
+        QuickEditorScope.Avatar,
+        QuickEditorScope.About,
+        QuickEditorScope.AvatarAndAbout,
     )
 
     ExposedDropdownMenuBox(
@@ -324,7 +366,7 @@ private fun ScopeDropdown(
     ) {
         TextField(
             readOnly = true,
-            value = scope.toString(),
+            value = scope.name,
             onValueChange = { },
             label = { Text("Editor scope") },
             trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
@@ -338,7 +380,7 @@ private fun ScopeDropdown(
             modifier = Modifier.exposedDropdownSize(),
         ) {
             uiModeOptions.forEach { selectionOption ->
-                DropdownMenuItem(text = { Text(text = selectionOption.toString()) }, onClick = {
+                DropdownMenuItem(text = { Text(text = selectionOption.name) }, onClick = {
                     onScopeSelected(selectionOption)
                     expanded = false
                 })
@@ -347,6 +389,49 @@ private fun ScopeDropdown(
     }
 }
 
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun InitialPageDropdown(
+    page: AvatarPickerAndAboutEditorConfiguration.Page,
+    onPageSelected: (AvatarPickerAndAboutEditorConfiguration.Page) -> Unit,
+    modifier: Modifier = Modifier,
+) {
+    var expanded by remember { mutableStateOf(false) }
+    val uiModeOptions = listOf(
+        AvatarPickerAndAboutEditorConfiguration.Page.AvatarPicker,
+        AvatarPickerAndAboutEditorConfiguration.Page.AboutEditor,
+    )
+
+    ExposedDropdownMenuBox(
+        expanded = expanded,
+        onExpandedChange = { expanded = it },
+        modifier = modifier,
+    ) {
+        TextField(
+            readOnly = true,
+            value = page.value.uppercase(),
+            onValueChange = { },
+            label = { Text("Initial editor page") },
+            trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
+            modifier = Modifier
+                .fillMaxWidth()
+                .menuAnchor(),
+        )
+        ExposedDropdownMenu(
+            expanded = expanded,
+            onDismissRequest = { expanded = false },
+            modifier = Modifier.exposedDropdownSize(),
+        ) {
+            uiModeOptions.forEach { selectionOption ->
+                DropdownMenuItem(text = { Text(text = selectionOption.value.uppercase()) }, onClick = {
+                    onPageSelected(selectionOption)
+                    expanded = false
+                })
+            }
+        }
+    }
+}
+
 private val AvatarPickerContentLayoutSaver: Saver<AvatarPickerContentLayout, String> = run {
     val horizontalKey = "horizontal"
     val verticalKey = "vertical"
@@ -366,6 +451,12 @@ private val AvatarPickerContentLayoutSaver: Saver<AvatarPickerContentLayout, Str
     )
 }
 
+private enum class QuickEditorScope {
+    Avatar,
+    About,
+    AvatarAndAbout,
+}
+
 @Preview
 @Composable
 private fun AvatarUpdateTabPreview() = AvatarUpdateTab()
diff --git a/gravatar-quickeditor/api/gravatar-quickeditor.api b/gravatar-quickeditor/api/gravatar-quickeditor.api
index 04436dd20..57f805922 100644
--- a/gravatar-quickeditor/api/gravatar-quickeditor.api
+++ b/gravatar-quickeditor/api/gravatar-quickeditor.api
@@ -309,6 +309,77 @@ public final class com/gravatar/quickeditor/ui/components/ComposableSingletons$V
 	public final fun getLambda-4$gravatar_quickeditor_release ()Lkotlin/jvm/functions/Function2;
 }
 
+public final class com/gravatar/quickeditor/ui/editor/AboutEditorConfiguration : android/os/Parcelable {
+	public static final field $stable I
+	public static final field CREATOR Landroid/os/Parcelable$Creator;
+	public fun <init> (Ljava/util/Set;)V
+	public fun describeContents ()I
+	public fun equals (Ljava/lang/Object;)Z
+	public final fun getFields ()Ljava/util/Set;
+	public fun hashCode ()I
+	public fun toString ()Ljava/lang/String;
+	public fun writeToParcel (Landroid/os/Parcel;I)V
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AboutEditorConfiguration$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AboutInputField : android/os/Parcelable {
+	public static final field CREATOR Landroid/os/Parcelable$Creator;
+	public static final field Companion Lcom/gravatar/quickeditor/ui/editor/AboutInputField$Companion;
+	public static final synthetic fun box-impl (Ljava/lang/String;)Lcom/gravatar/quickeditor/ui/editor/AboutInputField;
+	public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String;
+	public fun describeContents ()I
+	public static fun describeContents-impl (Ljava/lang/String;)I
+	public fun equals (Ljava/lang/Object;)Z
+	public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z
+	public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z
+	public static final fun getAboutMe-K9h-Scs ()Ljava/lang/String;
+	public static final fun getAll ()Ljava/util/Set;
+	public static final fun getCompany-K9h-Scs ()Ljava/lang/String;
+	public static final fun getDisplayName-K9h-Scs ()Ljava/lang/String;
+	public static final fun getJobTitle-K9h-Scs ()Ljava/lang/String;
+	public static final fun getLocation-K9h-Scs ()Ljava/lang/String;
+	public static final fun getPersonal ()Ljava/util/Set;
+	public static final fun getProfessional ()Ljava/util/Set;
+	public static final fun getPronouns-K9h-Scs ()Ljava/lang/String;
+	public static final fun getPronunciation-K9h-Scs ()Ljava/lang/String;
+	public final fun getValue ()Ljava/lang/String;
+	public fun hashCode ()I
+	public static fun hashCode-impl (Ljava/lang/String;)I
+	public fun toString ()Ljava/lang/String;
+	public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String;
+	public final synthetic fun unbox-impl ()Ljava/lang/String;
+	public fun writeToParcel (Landroid/os/Parcel;I)V
+	public static fun writeToParcel-impl (Ljava/lang/String;Landroid/os/Parcel;I)V
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AboutInputField$Companion {
+	public final fun getAboutMe-K9h-Scs ()Ljava/lang/String;
+	public final fun getAll ()Ljava/util/Set;
+	public final fun getCompany-K9h-Scs ()Ljava/lang/String;
+	public final fun getDisplayName-K9h-Scs ()Ljava/lang/String;
+	public final fun getJobTitle-K9h-Scs ()Ljava/lang/String;
+	public final fun getLocation-K9h-Scs ()Ljava/lang/String;
+	public final fun getPersonal ()Ljava/util/Set;
+	public final fun getProfessional ()Ljava/util/Set;
+	public final fun getPronouns-K9h-Scs ()Ljava/lang/String;
+	public final fun getPronunciation-K9h-Scs ()Ljava/lang/String;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AboutInputField$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun createFromParcel-y6aZfdM (Landroid/os/Parcel;)Ljava/lang/String;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/AboutInputField;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
 public abstract class com/gravatar/quickeditor/ui/editor/AuthenticationMethod : android/os/Parcelable {
 	public static final field $stable I
 }
@@ -353,6 +424,82 @@ public final class com/gravatar/quickeditor/ui/editor/AuthenticationMethod$OAuth
 	public synthetic fun newArray (I)[Ljava/lang/Object;
 }
 
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration : android/os/Parcelable {
+	public static final field $stable I
+	public static final field CREATOR Landroid/os/Parcelable$Creator;
+	public synthetic fun <init> (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;Ljava/util/Set;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
+	public fun describeContents ()I
+	public fun equals (Ljava/lang/Object;)Z
+	public final fun getContentLayout ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;
+	public final fun getFields ()Ljava/util/Set;
+	public final fun getInitialPage-Fs-4V8w ()Ljava/lang/String;
+	public fun hashCode ()I
+	public fun toString ()Ljava/lang/String;
+	public fun writeToParcel (Landroid/os/Parcel;I)V
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Page : android/os/Parcelable {
+	public static final field CREATOR Landroid/os/Parcelable$Creator;
+	public static final field Companion Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Page$Companion;
+	public static final synthetic fun box-impl (Ljava/lang/String;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Page;
+	public fun describeContents ()I
+	public static fun describeContents-impl (Ljava/lang/String;)I
+	public fun equals (Ljava/lang/Object;)Z
+	public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z
+	public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z
+	public static final fun getAboutEditor-Fs-4V8w ()Ljava/lang/String;
+	public static final fun getAvatarPicker-Fs-4V8w ()Ljava/lang/String;
+	public final fun getValue ()Ljava/lang/String;
+	public fun hashCode ()I
+	public static fun hashCode-impl (Ljava/lang/String;)I
+	public fun toString ()Ljava/lang/String;
+	public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String;
+	public final synthetic fun unbox-impl ()Ljava/lang/String;
+	public fun writeToParcel (Landroid/os/Parcel;I)V
+	public static fun writeToParcel-impl (Ljava/lang/String;Landroid/os/Parcel;I)V
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Page$Companion {
+	public final fun getAboutEditor-Fs-4V8w ()Ljava/lang/String;
+	public final fun getAvatarPicker-Fs-4V8w ()Ljava/lang/String;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Page$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun createFromParcel-I4eW8w8 (Landroid/os/Parcel;)Ljava/lang/String;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration$Page;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration : android/os/Parcelable {
+	public static final field $stable I
+	public static final field CREATOR Landroid/os/Parcelable$Creator;
+	public fun <init> (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)V
+	public fun describeContents ()I
+	public fun equals (Ljava/lang/Object;)Z
+	public final fun getContentLayout ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;
+	public fun hashCode ()I
+	public fun toString ()Ljava/lang/String;
+	public fun writeToParcel (Landroid/os/Parcel;I)V
+}
+
+public final class com/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
 public abstract class com/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout : android/os/Parcelable {
 	public static final field $stable I
 }
@@ -433,12 +580,12 @@ public final class com/gravatar/quickeditor/ui/editor/GravatarQuickEditorDismiss
 public final class com/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams : android/os/Parcelable {
 	public static final field $stable I
 	public static final field CREATOR Landroid/os/Parcelable$Creator;
-	public synthetic fun <init> (Lcom/gravatar/types/Email;Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
+	public synthetic fun <init> (Lcom/gravatar/types/Email;Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
 	public fun describeContents ()I
 	public fun equals (Ljava/lang/Object;)Z
 	public final fun getAvatarPickerContentLayout ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;
 	public final fun getEmail ()Lcom/gravatar/types/Email;
-	public final fun getScope ()Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
+	public final fun getScopeOption ()Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
 	public final fun getUiMode ()Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
@@ -451,14 +598,14 @@ public final class com/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams$
 	public final fun build ()Lcom/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams;
 	public final fun getAvatarPickerContentLayout ()Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;
 	public final fun getEmail ()Lcom/gravatar/types/Email;
-	public final fun getScope ()Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
+	public final fun getScopeConfig ()Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
 	public final fun getUiMode ()Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;
 	public final fun setAvatarPickerContentLayout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)Lcom/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams$Builder;
 	public final synthetic fun setAvatarPickerContentLayout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerContentLayout;)V
 	public final fun setEmail (Lcom/gravatar/types/Email;)Lcom/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams$Builder;
 	public final synthetic fun setEmail (Lcom/gravatar/types/Email;)V
-	public final fun setScope (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;)Lcom/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams$Builder;
-	public final synthetic fun setScope (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;)V
+	public final fun setScopeConfig (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;)Lcom/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams$Builder;
+	public final synthetic fun setScopeConfig (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;)V
 	public final fun setUiMode (Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;)Lcom/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams$Builder;
 	public final synthetic fun setUiMode (Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;)V
 }
@@ -484,13 +631,60 @@ public final class com/gravatar/quickeditor/ui/editor/GravatarUiMode : java/lang
 	public static fun values ()[Lcom/gravatar/quickeditor/ui/editor/GravatarUiMode;
 }
 
-public final class com/gravatar/quickeditor/ui/editor/QuickEditorScope : java/lang/Enum {
-	public static final field ABOUT Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
-	public static final field AVATAR Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
-	public static final field AVATAR_AND_ABOUT Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
-	public static fun getEntries ()Lkotlin/enums/EnumEntries;
-	public static fun valueOf (Ljava/lang/String;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
-	public static fun values ()[Lcom/gravatar/quickeditor/ui/editor/QuickEditorScope;
+public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption : android/os/Parcelable {
+	public static final field $stable I
+	public static final field CREATOR Landroid/os/Parcelable$Creator;
+	public static final field Companion Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;
+	public synthetic fun <init> (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
+	public static final fun aboutEditor (Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public static final fun avatarAndAbout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public static final fun avatarPicker (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public fun describeContents ()I
+	public fun equals (Ljava/lang/Object;)Z
+	public fun hashCode ()I
+	public fun toString ()Ljava/lang/String;
+	public fun writeToParcel (Landroid/os/Parcel;I)V
+}
+
+public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion {
+	public final fun aboutEditor (Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public static synthetic fun aboutEditor$default (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;Lcom/gravatar/quickeditor/ui/editor/AboutEditorConfiguration;ILjava/lang/Object;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public final fun avatarAndAbout (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public static synthetic fun avatarAndAbout$default (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;Lcom/gravatar/quickeditor/ui/editor/AvatarPickerAndAboutEditorConfiguration;ILjava/lang/Object;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public final fun avatarPicker (Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public static synthetic fun avatarPicker$default (Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Companion;Lcom/gravatar/quickeditor/ui/editor/AvatarPickerConfiguration;ILjava/lang/Object;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AboutEditor$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AboutEditor;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AboutEditor;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AvatarPicker$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AvatarPicker;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AvatarPicker;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
+}
+
+public final class com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AvatarPickerAndAboutEditor$Creator : android/os/Parcelable$Creator {
+	public fun <init> ()V
+	public final fun createFromParcel (Landroid/os/Parcel;)Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AvatarPickerAndAboutEditor;
+	public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
+	public final fun newArray (I)[Lcom/gravatar/quickeditor/ui/editor/QuickEditorScopeOption$Scope$AvatarPickerAndAboutEditor;
+	public synthetic fun newArray (I)[Ljava/lang/Object;
 }
 
 public final class com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheetKt {
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt
index ca7ba2251..28de5a620 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt
@@ -429,7 +429,7 @@ internal class AvatarPickerViewModelFactory(
         return AvatarPickerViewModel(
             handleExpiredSession = handleExpiredSession,
             email = gravatarQuickEditorParams.email,
-            avatarPickerContentLayout = gravatarQuickEditorParams.avatarPickerContentLayout,
+            avatarPickerContentLayout = gravatarQuickEditorParams.scopeOption.avatarPickerContentLayout,
             avatarRepository = QuickEditorContainer.getInstance().avatarRepository,
             imageDownloader = QuickEditorContainer.getInstance().imageDownloader,
             fileUtils = QuickEditorContainer.getInstance().fileUtils,
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/AboutInputField.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/AboutInputField.kt
new file mode 100644
index 000000000..ff48cbe49
--- /dev/null
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/AboutInputField.kt
@@ -0,0 +1,94 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+/**
+ * Represents a set of fields that can be shown in the "About" section of the QuickEditor.
+ *
+ * @property value The value of the about input field.
+ */
+@JvmInline
+@Parcelize
+public value class AboutInputField(
+    public val value: String,
+) : Parcelable {
+    public companion object {
+        /**
+         * The user’s display name.
+         */
+        @JvmStatic
+        public val DisplayName: AboutInputField = AboutInputField("display_name")
+
+        /**
+         * A short biography or description about the user.
+         */
+        @JvmStatic
+        public val AboutMe: AboutInputField = AboutInputField("about_me")
+
+        /**
+         * A phonetic pronunciation of the user’s name.
+         */
+        @JvmStatic
+        public val Pronunciation: AboutInputField = AboutInputField("pronunciation")
+
+        /**
+         * The pronouns the user identifies with (e.g., she/her, they/them).
+         */
+        @JvmStatic
+        public val Pronouns: AboutInputField = AboutInputField("pronouns")
+
+        /**
+         * The user's geographic location.
+         */
+        @JvmStatic
+        public val Location: AboutInputField = AboutInputField("location")
+
+        /**
+         * The user's current job title or role.
+         */
+        @JvmStatic
+        public val JobTitle: AboutInputField = AboutInputField("job_title")
+
+        /**
+         * The company or organization the user is affiliated with.
+         */
+        @JvmStatic
+        public val Company: AboutInputField = AboutInputField("company")
+
+        /**
+         * A convenience set representing all possible about info fields.
+         */
+        @JvmStatic
+        public val all: Set<AboutInputField> = setOf(
+            DisplayName,
+            AboutMe,
+            Pronunciation,
+            Pronouns,
+            Location,
+            JobTitle,
+            Company,
+        )
+
+        /**
+         * A subset of fields that are personal.
+         */
+        @JvmStatic
+        public val personal: Set<AboutInputField> = setOf(
+            DisplayName,
+            AboutMe,
+            Pronunciation,
+            Pronouns,
+            Location,
+        )
+
+        /**
+         * A subset of fields that are professional or work-related.
+         */
+        @JvmStatic
+        public val professional: Set<AboutInputField> = setOf(
+            JobTitle,
+            Company,
+        )
+    }
+}
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams.kt
index 0e6709a51..13483b964 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorParams.kt
@@ -11,30 +11,30 @@ import java.util.Objects
  * @property email The email of the user
  * @property avatarPickerContentLayout The layout direction used in the Avatar Picker.
  * @property uiMode The UI mode to be used in the Quick Editor.
- * @property scope The scope of the Quick Editor.
+ * @property scopeOption The scope option for the Quick Editor.
  */
 @Parcelize
 public class GravatarQuickEditorParams private constructor(
     public val email: Email,
     public val avatarPickerContentLayout: AvatarPickerContentLayout,
     public val uiMode: GravatarUiMode = GravatarUiMode.SYSTEM,
-    public val scope: QuickEditorScope = QuickEditorScope.AVATAR,
+    public val scopeOption: QuickEditorScopeOption = QuickEditorScopeOption.default,
 ) : Parcelable {
     override fun toString(): String = "GravatarQuickEditorParams(" +
         "email='$email', " +
         "avatarPickerContentLayout=$avatarPickerContentLayout, " +
         "uiMode=$uiMode, " +
-        "scope=$scope" +
+        "scopeOption=$scopeOption" +
         ")"
 
-    override fun hashCode(): Int = Objects.hash(email, avatarPickerContentLayout, uiMode, scope)
+    override fun hashCode(): Int = Objects.hash(email, avatarPickerContentLayout, uiMode, scopeOption)
 
     override fun equals(other: Any?): Boolean {
         return other is GravatarQuickEditorParams &&
             email == other.email &&
             avatarPickerContentLayout == other.avatarPickerContentLayout &&
             uiMode == other.uiMode &&
-            scope == other.scope
+            scopeOption == other.scopeOption
     }
 
     /**
@@ -50,6 +50,7 @@ public class GravatarQuickEditorParams private constructor(
         /**
          * The content layout direction used in the Avatar Picker
          */
+        @Deprecated(message = "AvatarPickerContentLayout was moved to ScopeConfig")
         @set:JvmSynthetic // Hide 'void' setter from Java
         public var avatarPickerContentLayout: AvatarPickerContentLayout = AvatarPickerContentLayout.Horizontal
 
@@ -60,14 +61,18 @@ public class GravatarQuickEditorParams private constructor(
         public var uiMode: GravatarUiMode = GravatarUiMode.SYSTEM
 
         /**
-         * The scope of the Quick Editor
+         * The scope option for the Quick Editor
          */
         @set:JvmSynthetic // Hide 'void' setter from Java
-        public var scope: QuickEditorScope = QuickEditorScope.AVATAR
+        public var scopeConfig: QuickEditorScopeOption = QuickEditorScopeOption.default
 
         /**
          * Sets the content layout direction used in the Avatar Picker
          */
+        @Deprecated(
+            message = "AvatarPickerContentLayout was moved to ScopeConfig",
+            replaceWith = ReplaceWith("setScopeConfig(scopeConfig)"),
+        )
         public fun setAvatarPickerContentLayout(avatarPickerContentLayout: AvatarPickerContentLayout): Builder =
             apply { this.avatarPickerContentLayout = avatarPickerContentLayout }
 
@@ -84,7 +89,8 @@ public class GravatarQuickEditorParams private constructor(
         /**
          * Sets the scope of the Quick Editor
          */
-        public fun setScope(scope: QuickEditorScope): Builder = apply { this.scope = scope }
+        public fun setScopeConfig(scopeConfig: QuickEditorScopeOption): Builder =
+            apply { this.scopeConfig = scopeConfig }
 
         /**
          * Builds the GravatarQuickEditorParams object
@@ -93,8 +99,27 @@ public class GravatarQuickEditorParams private constructor(
             email!!,
             avatarPickerContentLayout,
             uiMode,
-            scope,
+            scopeConfig.withContentLayout(avatarPickerContentLayout),
         )
+
+        private fun QuickEditorScopeOption.withContentLayout(
+            deprecatedAvatarPickerContentLayout: AvatarPickerContentLayout,
+        ): QuickEditorScopeOption {
+            // AvatarPickerContentLayout.Vertical means non-default value was set so we should make sure to use it
+            // for backwards compatibility
+            return if (this == QuickEditorScopeOption.default) {
+                val contentLayout = if (deprecatedAvatarPickerContentLayout == AvatarPickerContentLayout.Vertical) {
+                    deprecatedAvatarPickerContentLayout
+                } else {
+                    avatarPickerContentLayout
+                }
+                QuickEditorScopeOption.avatarPicker(
+                    AvatarPickerConfiguration(contentLayout = contentLayout),
+                )
+            } else {
+                this
+            }
+        }
     }
 }
 
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditor.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditor.kt
index 88d798b5a..592f25270 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditor.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditor.kt
@@ -46,8 +46,8 @@ internal fun QuickEditor(
         uiState = uiState,
         onDoneClicked = {
             when (uiState.page) {
-                QuickEditorPage.AVATAR_PICKER -> onDoneClicked()
-                QuickEditorPage.ABOUT_EDITOR -> aboutEditorViewModel.onEvent(AboutEditorEvent.OnDoneClicked)
+                QuickEditorPage.AvatarPicker -> onDoneClicked()
+                QuickEditorPage.AboutEditor -> aboutEditorViewModel.onEvent(AboutEditorEvent.OnDoneClicked)
             }
         },
         onEditAvatarClicked = { viewModel.onEvent(QuickEditorEvent.OnEditAvatarClicked) },
@@ -61,7 +61,7 @@ internal fun QuickEditor(
             },
         ) { state ->
             when (state) {
-                QuickEditorPage.AVATAR_PICKER -> {
+                QuickEditorPage.AvatarPicker -> {
                     AvatarPicker(
                         gravatarQuickEditorParams = gravatarQuickEditorParams,
                         handleExpiredSession = handleExpiredSession,
@@ -77,7 +77,7 @@ internal fun QuickEditor(
                     )
                 }
 
-                QuickEditorPage.ABOUT_EDITOR -> {
+                QuickEditorPage.AboutEditor -> {
                     AboutEditor(
                         quickEditorParams = gravatarQuickEditorParams,
                         onProfileUpdated = {
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt
new file mode 100644
index 000000000..043bb7fe3
--- /dev/null
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt
@@ -0,0 +1,6 @@
+package com.gravatar.quickeditor.ui.editor
+
+internal enum class QuickEditorPage {
+    AvatarPicker,
+    AboutEditor,
+}
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScope.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScope.kt
deleted file mode 100644
index 883fd2b16..000000000
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScope.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.gravatar.quickeditor.ui.editor
-
-import org.jetbrains.annotations.ApiStatus.Experimental
-
-/**
- * The scope of the Quick Editor.
- *
- * WARNING: Not a final API. This API will change in the future.
- */
-@Experimental
-public enum class QuickEditorScope {
-    AVATAR,
-    ABOUT,
-    AVATAR_AND_ABOUT,
-}
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeConfiguration.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeConfiguration.kt
new file mode 100644
index 000000000..f07a717be
--- /dev/null
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeConfiguration.kt
@@ -0,0 +1,112 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import java.util.Objects
+
+/**
+ * Configuration which will be applied to the avatar picker.
+ *
+ * @property contentLayout The layout direction of the Avatar picker in the Quick Editor.
+ */
+@Parcelize
+public class AvatarPickerConfiguration(
+    public val contentLayout: AvatarPickerContentLayout,
+) : Parcelable {
+    override fun toString(): String = "AvatarPickerConfiguration(contentLayout=$contentLayout)"
+
+    override fun hashCode(): Int = Objects.hash(contentLayout)
+
+    override fun equals(other: Any?): Boolean = other is AvatarPickerConfiguration &&
+        contentLayout == other.contentLayout
+
+    internal companion object {
+        val default = AvatarPickerConfiguration(
+            contentLayout = AvatarPickerContentLayout.Horizontal,
+        )
+    }
+}
+
+/**
+ * Configuration which will be applied to the about editor.
+ *
+ * @property fields The input fields to be shown in the about editor.
+ */
+@Parcelize
+public class AboutEditorConfiguration(
+    public val fields: Set<AboutInputField>,
+) : Parcelable {
+    override fun toString(): String = "AboutEditorConfiguration(fields=$fields)"
+
+    override fun hashCode(): Int = Objects.hash(fields)
+
+    override fun equals(other: Any?): Boolean = other is AboutEditorConfiguration &&
+        fields == other.fields
+
+    internal companion object {
+        val default = AboutEditorConfiguration(
+            fields = AboutInputField.all,
+        )
+    }
+}
+
+/**
+ * Configuration which will be applied to the avatar picker and about editor.
+ *
+ * @property contentLayout The layout direction of the Avatar picker in the Quick Editor.
+ * @property fields The input fields to be shown in the about editor.
+ * @property initialPage The initial page to be shown in the Quick Editor.
+ */
+@Parcelize
+public class AvatarPickerAndAboutEditorConfiguration(
+    public val contentLayout: AvatarPickerContentLayout,
+    public val fields: Set<AboutInputField>,
+    public val initialPage: Page,
+) : Parcelable {
+    override fun toString(): String = "AvatarPickerAndAboutEditorConfiguration(" +
+        "contentLayout=$contentLayout, " +
+        "fields=$fields, " +
+        "initialPage=$initialPage" +
+        ")"
+
+    override fun hashCode(): Int = Objects.hash(contentLayout, fields, initialPage)
+
+    override fun equals(other: Any?): Boolean = other is AvatarPickerAndAboutEditorConfiguration &&
+        contentLayout == other.contentLayout &&
+        fields == other.fields &&
+        initialPage == other.initialPage
+
+    /**
+     * The page of the AvatarPickerAndAboutEditor scope.
+     * The page corresponds to the part of your Gravatar profile that will be shown.
+     *
+     * @property value The value of the page.
+     */
+    @Parcelize
+    @JvmInline
+    public value class Page private constructor(
+        public val value: String,
+    ) : Parcelable {
+        public companion object {
+            /**
+             * Avatar Picker page.
+             */
+            @JvmStatic
+            public val AvatarPicker: Page = Page("avatar_picker")
+
+            /**
+             * About Editor page.
+             */
+            @JvmStatic
+            public val AboutEditor: Page = Page("about_editor")
+        }
+    }
+
+    internal companion object {
+        val default = AvatarPickerAndAboutEditorConfiguration(
+            contentLayout = AvatarPickerContentLayout.Horizontal,
+            fields = AboutInputField.all,
+            initialPage = Page.AvatarPicker,
+        )
+    }
+}
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption.kt
new file mode 100644
index 000000000..cee586420
--- /dev/null
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorScopeOption.kt
@@ -0,0 +1,93 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import java.util.Objects
+
+/**
+ * Represents a profile editing scope with configuration options for each scope.
+ *
+ * @property scope The scope of the Quick Editor
+ */
+@Parcelize
+public class QuickEditorScopeOption private constructor(
+    internal val scope: Scope,
+) : Parcelable {
+    internal sealed class Scope : Parcelable {
+        @Parcelize
+        data class AvatarPicker(val config: AvatarPickerConfiguration) : Scope()
+
+        @Parcelize
+        data class AboutEditor(val config: AboutEditorConfiguration) : Scope()
+
+        @Parcelize
+        data class AvatarPickerAndAboutEditor(val config: AvatarPickerAndAboutEditorConfiguration) : Scope()
+    }
+
+    override fun toString(): String = "ScopeConfig(scope=$scope)"
+
+    override fun hashCode(): Int = Objects.hash(scope)
+
+    override fun equals(other: Any?): Boolean {
+        return other is QuickEditorScopeOption &&
+            scope == other.scope
+    }
+
+    internal val avatarPickerContentLayout: AvatarPickerContentLayout
+        get() = when (scope) {
+            is Scope.AvatarPicker -> scope.config.contentLayout
+            is Scope.AvatarPickerAndAboutEditor -> scope.config.contentLayout
+            is Scope.AboutEditor -> AvatarPickerContentLayout.Horizontal
+        }
+
+    public companion object {
+        internal val default = QuickEditorScopeOption(
+            scope = Scope.AvatarPicker(AvatarPickerConfiguration.default),
+        )
+
+        /**
+         * Creates a `QuickEditorScopeOption` configured for the avatar picker scope.
+         *
+         * @param config The configuration for the Avatar Picker
+         * @return A configured instance of `QuickEditorScopeOption` for the avatar picker scope
+         */
+        @JvmStatic
+        public fun avatarPicker(
+            config: AvatarPickerConfiguration = AvatarPickerConfiguration.default,
+        ): QuickEditorScopeOption {
+            return QuickEditorScopeOption(
+                scope = Scope.AvatarPicker(config),
+            )
+        }
+
+        /**
+         * Creates a `QuickEditorScopeOption` configured for the about editor scope.
+         *
+         * @param config The configuration for the About Editor
+         * @return A configured instance of `QuickEditorScopeOption` for the about editor scope
+         */
+        @JvmStatic
+        public fun aboutEditor(
+            config: AboutEditorConfiguration = AboutEditorConfiguration.default,
+        ): QuickEditorScopeOption {
+            return QuickEditorScopeOption(
+                scope = Scope.AboutEditor(config),
+            )
+        }
+
+        /**
+         * Creates a `QuickEditorScopeOption` configured for the avatar and about editor scope.
+         *
+         * @param config The configuration for the Avatar and About Editor
+         * @return A configured instance of `QuickEditorScopeOption` for the avatar and about editor scope
+         */
+        @JvmStatic
+        public fun avatarAndAbout(
+            config: AvatarPickerAndAboutEditorConfiguration = AvatarPickerAndAboutEditorConfiguration.default,
+        ): QuickEditorScopeOption {
+            return QuickEditorScopeOption(
+                scope = Scope.AvatarPickerAndAboutEditor(config),
+            )
+        }
+    }
+}
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorUiState.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorUiState.kt
index 31358b86f..adb60fefb 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorUiState.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorUiState.kt
@@ -11,11 +11,6 @@ internal data class QuickEditorUiState(
     val profile: ComponentState<Profile>? = null,
     val avatarCacheBuster: Long? = null,
 ) {
-    val editAvatarButtonVisible: Boolean = pageNavigationEnabled && page == QuickEditorPage.ABOUT_EDITOR
-    val editAboutButtonVisible: Boolean = pageNavigationEnabled && page == QuickEditorPage.AVATAR_PICKER
-}
-
-internal enum class QuickEditorPage {
-    AVATAR_PICKER,
-    ABOUT_EDITOR,
+    val editAvatarButtonVisible: Boolean = pageNavigationEnabled && page == QuickEditorPage.AboutEditor
+    val editAboutButtonVisible: Boolean = pageNavigationEnabled && page == QuickEditorPage.AvatarPicker
 }
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModel.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModel.kt
index b55abe4b2..20912b8a6 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModel.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModel.kt
@@ -6,6 +6,9 @@ import androidx.lifecycle.viewModelScope
 import androidx.lifecycle.viewmodel.CreationExtras
 import com.gravatar.quickeditor.QuickEditorContainer
 import com.gravatar.quickeditor.data.repository.ProfileRepository
+import com.gravatar.quickeditor.ui.editor.AvatarPickerAndAboutEditorConfiguration.Page.Companion.AboutEditor
+import com.gravatar.quickeditor.ui.editor.AvatarPickerAndAboutEditorConfiguration.Page.Companion.AvatarPicker
+import com.gravatar.quickeditor.ui.editor.QuickEditorScopeOption.Scope
 import com.gravatar.quickeditor.ui.time.Clock
 import com.gravatar.quickeditor.ui.time.SystemClock
 import com.gravatar.services.GravatarResult
@@ -49,8 +52,8 @@ internal class QuickEditorViewModel(
                 currentState.copy(profile = ComponentState.Loaded(event.profile))
             }
 
-            QuickEditorEvent.OnEditAboutClicked -> navigateToPage(QuickEditorPage.ABOUT_EDITOR)
-            QuickEditorEvent.OnEditAvatarClicked -> navigateToPage(QuickEditorPage.AVATAR_PICKER)
+            QuickEditorEvent.OnEditAboutClicked -> navigateToPage(QuickEditorPage.AboutEditor)
+            QuickEditorEvent.OnEditAvatarClicked -> navigateToPage(QuickEditorPage.AvatarPicker)
         }
     }
 
@@ -93,21 +96,27 @@ internal class QuickEditorViewModelFactory(
 ) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
     override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
+        val scopeConfig = gravatarQuickEditorParams.scopeOption
         return QuickEditorViewModel(
             email = gravatarQuickEditorParams.email,
             profileRepository = QuickEditorContainer.getInstance().profileRepository,
-            navigationEnabled = gravatarQuickEditorParams.scope == QuickEditorScope.AVATAR_AND_ABOUT,
-            initialPage = gravatarQuickEditorParams.scope.initialPage,
+            navigationEnabled = scopeConfig.scope is Scope.AvatarPickerAndAboutEditor,
+            initialPage = scopeConfig.initialPage,
             clock = SystemClock(),
         ) as T
     }
 }
 
-private val QuickEditorScope.initialPage: QuickEditorPage
-    get() {
-        return when (this) {
-            QuickEditorScope.AVATAR -> QuickEditorPage.AVATAR_PICKER
-            QuickEditorScope.ABOUT -> QuickEditorPage.ABOUT_EDITOR
-            QuickEditorScope.AVATAR_AND_ABOUT -> QuickEditorPage.ABOUT_EDITOR
-        }
+private val QuickEditorScopeOption.initialPage: QuickEditorPage
+    get() = when (scope) {
+        is Scope.AvatarPicker -> QuickEditorPage.AvatarPicker
+        is Scope.AboutEditor -> QuickEditorPage.AboutEditor
+        is Scope.AvatarPickerAndAboutEditor -> scope.config.initialPage.internalType
+    }
+
+private val AvatarPickerAndAboutEditorConfiguration.Page.internalType: QuickEditorPage
+    get() = when (this) {
+        AvatarPicker -> QuickEditorPage.AvatarPicker
+        AboutEditor -> QuickEditorPage.AboutEditor
+        else -> QuickEditorPage.AvatarPicker
     }
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt
index 0a76bf338..ca49a492d 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt
@@ -81,7 +81,7 @@ public fun GravatarQuickEditorBottomSheet(
         onAvatarSelected = onAvatarSelected,
         onDismiss = onDismiss,
         modalBottomSheetState = rememberGravatarModalBottomSheetState(
-            avatarPickerContentLayout = gravatarQuickEditorParams.avatarPickerContentLayout,
+            avatarPickerContentLayout = gravatarQuickEditorParams.scopeOption.avatarPickerContentLayout,
         ),
     )
 }
diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/extensions/QuickEditorExtensions.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/extensions/QuickEditorExtensions.kt
index 2a76522b4..4a5023506 100644
--- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/extensions/QuickEditorExtensions.kt
+++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/extensions/QuickEditorExtensions.kt
@@ -49,7 +49,7 @@ private fun GravatarQuickEditorBottomSheetWrapper(
     val coroutineScope = rememberCoroutineScope()
 
     val modalBottomSheetState = rememberGravatarModalBottomSheetState(
-        avatarPickerContentLayout = gravatarQuickEditorParams.avatarPickerContentLayout,
+        avatarPickerContentLayout = gravatarQuickEditorParams.scopeOption.avatarPickerContentLayout,
     )
 
     GravatarQuickEditorBottomSheet(
diff --git a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorTest.kt b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorTest.kt
index fc281048d..2eb3b428c 100644
--- a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorTest.kt
+++ b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorTest.kt
@@ -22,7 +22,7 @@ class QuickEditorTest : RoborazziTest() {
     private val uiState = QuickEditorUiState(
         email = Email("william.henry.harrison@example.com"),
         profile = ComponentState.Loaded(profile),
-        page = QuickEditorPage.AVATAR_PICKER,
+        page = QuickEditorPage.AvatarPicker,
         pageNavigationEnabled = false,
     )
 
diff --git a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModelTest.kt b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModelTest.kt
index bfb1c71ee..c652f7fb3 100644
--- a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModelTest.kt
+++ b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/editor/QuickEditorViewModelTest.kt
@@ -54,7 +54,7 @@ class QuickEditorViewModelTest {
             val avatarPickerUiState = QuickEditorUiState(
                 email = email,
                 avatarCacheBuster = 0,
-                page = QuickEditorPage.ABOUT_EDITOR,
+                page = QuickEditorPage.AboutEditor,
                 pageNavigationEnabled = false,
             )
             assertEquals(avatarPickerUiState, awaitItem())
@@ -83,7 +83,7 @@ class QuickEditorViewModelTest {
             val avatarPickerUiState = QuickEditorUiState(
                 email = email,
                 avatarCacheBuster = 0,
-                page = QuickEditorPage.ABOUT_EDITOR,
+                page = QuickEditorPage.AboutEditor,
                 pageNavigationEnabled = false,
             )
             assertEquals(avatarPickerUiState, awaitItem())
@@ -135,34 +135,34 @@ class QuickEditorViewModelTest {
     @Test
     fun `given initial state when OnEditAboutClicked event then navigates to ABOUT_EDITOR page`() = runTest {
         viewModel = initViewModel(
-            initialPage = QuickEditorPage.AVATAR_PICKER,
+            initialPage = QuickEditorPage.AvatarPicker,
             navigationEnabled = true,
         )
 
         viewModel.onEvent(QuickEditorEvent.OnEditAboutClicked)
 
         viewModel.uiState.test {
-            assertEquals(QuickEditorPage.ABOUT_EDITOR, awaitItem().page)
+            assertEquals(QuickEditorPage.AboutEditor, awaitItem().page)
         }
     }
 
     @Test
     fun `given initial state when OnEditAvatarClicked event then navigates to AVATAR_PICKER page`() = runTest {
         viewModel = initViewModel(
-            initialPage = QuickEditorPage.ABOUT_EDITOR,
+            initialPage = QuickEditorPage.AboutEditor,
             navigationEnabled = true,
         )
 
         viewModel.onEvent(QuickEditorEvent.OnEditAvatarClicked)
 
         viewModel.uiState.test {
-            assertEquals(QuickEditorPage.AVATAR_PICKER, awaitItem().page)
+            assertEquals(QuickEditorPage.AvatarPicker, awaitItem().page)
         }
     }
 
     private fun initViewModel(
         navigationEnabled: Boolean = false,
-        initialPage: QuickEditorPage = QuickEditorPage.ABOUT_EDITOR,
+        initialPage: QuickEditorPage = QuickEditorPage.AboutEditor,
     ) = QuickEditorViewModel(
         email = email,
         profileRepository = profileRepository,


Reviews:
user: login: AdamGrzybkowski
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-12T12:33:47Z
user: login: etoledom
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T07:06:58Z
user: login: etoledom
body: Looking great!

Smoke tests works as expected 👍 

Just one small nit on the demo app side:

When the scope is set to About, the layout option has no effect, right?

<img src="https://github.com/user-attachments/assets/ead40e65-f462-44c8-ac71-022558663abd" width="40%">

On iOS we try to hide the options that are not set on the current selected scope. It will probably become more evident with the about fields selector option.
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T07:32:04Z
user: login: AdamGrzybkowski
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T09:54:07Z
user: login: etoledom
body: Nice! Looks pretty good to me 🎉 

Let's follow this same setup for the Pages on iOS
And the demo app improvements, smooth 👍 👍 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T11:12:37Z

Review comments:
diff_hunk: @@ -0,0 +1,31 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+/**
+ * The page of the Quick Editor. The page corresponds to the part of your Gravatar profile that will be shown.
+ *
+ * @property value The value of the page.
+ */
+@Parcelize
+@JvmInline
+public value class QuickEditorPage private constructor(
path: gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt
user: login: AdamGrzybkowski
body: Should we keep it as a general page that could be extended by different ones in the future, or should we keep it tightly coupled with `AvatarPickerAndAboutEditorConfiguration` for better type safety? 
created_at: 2025-05-12T12:32:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,31 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+/**
+ * The page of the Quick Editor. The page corresponds to the part of your Gravatar profile that will be shown.
+ *
+ * @property value The value of the page.
+ */
+@Parcelize
+@JvmInline
+public value class QuickEditorPage private constructor(
path: gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt
user: login: AdamGrzybkowski
body: I think that not being able to pass the wrong page to the `AvatarPickerAndAboutEditorConfiguration` would be great. 
created_at: 2025-05-12T12:33:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,31 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+/**
+ * The page of the Quick Editor. The page corresponds to the part of your Gravatar profile that will be shown.
+ *
+ * @property value The value of the page.
+ */
+@Parcelize
+@JvmInline
+public value class QuickEditorPage private constructor(
path: gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt
user: login: etoledom
body: > I think that not being able to pass the wrong page to the AvatarPickerAndAboutEditorConfiguration would be great.

I agree with this.
The whole idea is that the config is tight to the possibilities of its scope.

Since we don't know what we will be developing in the SDK in the future, maybe it's better to do this specific, to avoid future deprecations. So: 

> or should we keep it tightly coupled with AvatarPickerAndAboutEditorConfiguration for better type safety?

I'd say probably this is a good option.

What do you think?
created_at: 2025-05-13T07:06:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,31 @@
+package com.gravatar.quickeditor.ui.editor
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+/**
+ * The page of the Quick Editor. The page corresponds to the part of your Gravatar profile that will be shown.
+ *
+ * @property value The value of the page.
+ */
+@Parcelize
+@JvmInline
+public value class QuickEditorPage private constructor(
path: gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/QuickEditorPage.kt
user: login: AdamGrzybkowski
body: Yes! I've added `Page` to the `AvatarPickerAndAboutEditorConfiguration` to keep it close. The idea is that each config would have its own `Page` if needed. Let me know what you think.

I've kept the `QuickEditorPage` as an internal type.
created_at: 2025-05-13T09:54:07Z
author_association: CONTRIBUTOR

PR comments:
user: login: wpmobilebot
created_at: 2025-05-09T10:46:53Z
body: <!-- REUSE_ID: app-prototype-build-link -->

<details><summary>📲 You can test the changes from this Pull Request in <b>Gravatar Demo</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='3' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Fcdn.a8c-ci.services%2F428e0f921ef77474515d6e3cdb7d3e0a4f1f62c9%2Fgravatar-demo-prototype-build-pr628-99ad51b.apk' width='250' height='250' /></td>
  <td><b>App Name</b></td><td>Gravatar Demo</td>
</tr>
<tr><td><b>Commit</b></td><td>99ad51b188218e4b6096800084b39c45cf749dcf</td></tr>
<tr><td><b>Direct Download</b></td><td><a href='https://cdn.a8c-ci.services/428e0f921ef77474515d6e3cdb7d3e0a4f1f62c9/gravatar-demo-prototype-build-pr628-99ad51b.apk'><code>gravatar-demo-prototype-build-pr628-99ad51b.apk</code></a></td></tr>
</table>
</details>

author_association: COLLABORATOR
user: login: etoledom
created_at: 2025-05-12T05:18:52Z
body: This looks very similar to what we have on iOS, but maybe a bit in reverse.

So, from what I understand:

```kotlin
GravatarQuickEditorBottomSheet(
                gravatarQuickEditorParams = GravatarQuickEditorParams {
                    email = Email(userEmail)
                    uiMode = pickerUiMode
                    scopeConfig = ScopeConfig { // --> The configuration is initiated with a scope.
                        scope = editorScope // --> Scope goes here
                        initialPage = editorInitialPage // --> An initial page if needed for mixed scopes
                        avatarPickerContentLayout = pickerContentLayout // -> Layout for the avatar picker scope
                    }
                },
               // ( ... )
            )
```

What we have in iOS is that the scope holds a configuration, and every scope can only be configured with what that particular scope needs:

```swift
public struct QuickEditorScopeOption {
    public static func avatarPicker(
        _ config: AvatarPickerConfiguration = .horizontalInstrinsicHeight
    ) -> Self 

    public static func aboutEditor(
        _ config: AboutEditorConfiguration = .init()
    ) -> Self 

    public static func avatarPickerAndAboutInfoEditor(
        _ avatarPickerAndAboutEditorConfig: AvatarPickerAndAboutEditorConfiguration = .init()
    ) -> Self 
}
```

So the usage can look like this:

```swift
// Selecting a scope
let scope = QuickEditorScopeOption.aboutEditor(.init(fields: .all))

// Or directly on the Quick Editor view:
view
    .gravatarQuickEditorSheet(
        isPresented: $isPresentingPicker,
        email: email,
        authToken: token,
 // ---> Here the scope is set. And the scope option will require it's own configuration with what it needs.
        scopeOption: .aboutEditor(AboutEditorConfiguration(fields: .all)),
        customImageEditor: customImageEditor(),
        updateHandler: { updateType in
           // ( ... )
        },
        onDismiss: {
            // ( ... )
        }
    )
```

We also avoid using enums publicly to avoid future breaking changes, and we use the same strategy for this than on this PR.

I do like the concept of a `Page` (which we don't have yet). I think we can use it on iOS also. Internally I named the presenting context as a `Mode`, but I do like it more as a presenting `Page`. And we still need to work on the public API to choose this initial page. (cc @pinarol )

In short, both public APIs look similar. I don't think they have to be the same. I shared iOS in case it gives you a new idea and you think it could be an improvement, but I'm not requesting changes 👍 

Let me know what you think! But I'm happy to 🚢  as it is!
author_association: CONTRIBUTOR
user: login: AdamGrzybkowski
created_at: 2025-05-12T12:06:20Z
body: Thanks @etoledom, I like what you did on iOS. I will adjust the code and update the description. 
author_association: CONTRIBUTOR
user: login: AdamGrzybkowski
created_at: 2025-05-12T12:28:41Z
body: @etoledom This is now ready for another review. I've adjusted the code to match iOS (including some names). 
author_association: CONTRIBUTOR
user: login: AdamGrzybkowski
created_at: 2025-05-13T08:31:23Z
body: >When the scope is set to About, the layout option has no effect, right?

Correct - I haven't updated this part. I will change it. 
author_association: CONTRIBUTOR
user: login: AdamGrzybkowski
created_at: 2025-05-13T09:55:08Z
body: >On iOS we try to hide the options that are not set on the current selected scope. It will probably become more evident with the about fields selector option.

@etoledom Only config that is valid for a given scope should now be visible. 
author_association: CONTRIBUTOR