Settings Panel
A composable, themeable and customizable settings panel.
Supported Features
- Account settings
- Update/delete account
- Change password
- Device sessions
- Passkeys management
- Link social accounts
- Theme select
- Localization support for
EN,DE,ES - Timezone support
- Workspace settings
- Update/delete/leave workspace
- Members & scopes management
- Teamspaces management
- Billing
- Payment method, billing address, billing email
- Plan upgrade / change
- Stripe integration
- Custom emoji management
- Workspace icon upload
Installation
pnpm add @notion-kit/settings-panelAnatomy
<SettingsProvider adapters={adapters}>
<SettingsSidebar>
<SettingsSidebarGroup>
<SettingsSidebarTitle>{/* Your sidebar title */}</SettingsSidebarTitle>
<SettingsTab />
<SettingsTab />
<SettingsTab />
</SettingsSidebarGroup>
</SettingsSidebar>
<SettingsContent>
<SettingsSection>
<SettingsRule>{/* Your settings rule 1 */}</SettingsRule>
<SettingsRule>{/* Your settings rule 2 */}</SettingsRule>
<SettingsRule>{/* Your settings rule 3 */}</SettingsRule>
</SettingsSection>
<SettingsSection>
<SettingsRule>{/* Your settings rule 4 */}</SettingsRule>
<SettingsRule>{/* Your settings rule 5 */}</SettingsRule>
</SettingsSection>
</SettingsContent>
</SettingsProvider>Examples
Notion Settings Panel
API Reference
SettingsProvider
A provider that supplies adapters for each settings domain.
| Prop | Type | Description |
|---|---|---|
adapters* | SettingsAdapters | Domain-specific adapter objects for each settings group. |
SettingsAdapters
Each adapter is optional; only include the ones your application supports.
| Prop | Type | Description |
|---|---|---|
account | AccountAdapter | Account management. |
sessions | SessionsAdapter | Device session management. |
passkeys | PasskeysAdapter | Passkey management. |
connections | ConnectionsAdapter | Social connections management. |
workspace | WorkspaceAdapter | Workspace settings. |
people | PeopleAdapter | Member management. |
invitations | InvitationsAdapter | Invitation management. |
teamspaces | TeamspacesAdapter | Teamspace management. |
emoji | EmojiAdapter | Custom emoji management. |
billing | BillingAdapter | Billing and subscription. |
uploadFile | (file: File) => Promise<void> | File upload handler. |
Account Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<AccountStore> | Retrieve the account data. |
update* | (data: Partial<Omit<AccountStore, "id">>) => Promise<void> | Update account fields. |
delete* | (data: { accountId: string; email: string }) => Promise<void> | Delete the account. |
sendEmailVerification* | (email: string) => Promise<void> | Send email verification. |
changePassword* | (data: { newPassword: string; currentPassword: string }) => Promise<void> | Change the password. |
setPassword | (newPassword: string) => Promise<void> | Set password (for OAuth-only accounts). |
Sessions Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<SessionRow[]> | Retrieve all active sessions. |
delete* | (token: string) => Promise<void> | Revoke a specific session. |
deleteAll* | () => Promise<void> | Revoke all sessions except current. |
Passkeys Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<Passkey[]> | Retrieve all passkeys. |
add* | () => Promise<boolean> | Add a new passkey. Returns success. |
update* | (data: { id: string; name: string }) => Promise<void> | Rename a passkey. |
delete* | (id: string) => Promise<void> | Delete a passkey. |
Connections Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<Connection[]> | Retrieve all connections. |
add* | (strategy: ConnectionStrategy) => Promise<void> | Add a new connection. |
delete* | (connection: Connection) => Promise<void> | Remove a connection. |
Workspace Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<WorkspaceStore> | Retrieve workspace data. |
update* | (data: Partial<Omit<WorkspaceStore, "id">>) => Promise<void> | Update workspace. |
delete* | (id: string) => Promise<void> | Delete workspace. |
leave* | (id: string) => Promise<void> | Leave workspace. |
resetLink* | () => Promise<void> | Reset the invite link. |
People Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<Memberships> | Retrieve all members. |
update* | (data: { id: string; memberId: string; role: Role }) => Promise<void> | Update a member's role. |
delete* | (data: { id: string; memberId: string }) => Promise<void> | Remove a member. |
Invitations Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<Invitations> | Retrieve all invitations. |
add* | (data: { emails: string[]; role: Role }) => Promise<void> | Send invitations. |
cancel* | (invitationId: string) => Promise<void> | Cancel an invitation. |
Teamspaces Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<Teamspaces> | Retrieve all teamspaces. |
add* | (data: { name: string; icon: IconData; description?: string; permission: TeamspacePermission }) => Promise<void> | Create a teamspace. |
update* | (data: { id: string; name?: string; icon?: IconData; description?: string; permission?: TeamspacePermission }) => Promise<void> | Update a teamspace. |
delete* | (teamspaceId: string) => Promise<void> | Delete a teamspace. |
leave* | (teamspaceId: string) => Promise<void> | Leave a teamspace. |
addMembers* | (data: { teamspaceId: string; userIds: string[]; role: TeamspaceRole }) => Promise<void> | Add members. |
updateMember* | (data: { teamspaceId: string; userId: string; role: TeamspaceRole }) => Promise<void> | Update a member's role. |
deleteMember* | (data: { teamspaceId: string; userId: string }) => Promise<void> | Remove a member. |
Emoji Adapter
| Method | Type | Description |
|---|---|---|
getAll* | () => Promise<Emojis> | Retrieve all emojis. |
add* | (data: { name: string; file: File }) => Promise<void> | Add a custom emoji. |
update* | (data: { id: string; name?: string; file?: File }) => Promise<void> | Update a custom emoji. |
delete* | (id: string) => Promise<void> | Delete a custom emoji. |
Billing Adapter
| Prop/Method | Type | Description |
|---|---|---|
stripePublishableKey | string | Stripe publishable key for Elements. |
getAll* | () => Promise<BillingStore> | Retrieve billing data. |
upgrade* | (plan: Plan, annual: boolean) => Promise<void> | Upgrade the plan. |
changePlan* | (plan: Plan) => Promise<void> | Change the plan. |
editMethod* | () => Promise<void> | Edit payment method. |
editBilledTo* | (address: BillingAddress & { businessName: string }) => Promise<void> | Edit billing address. |
editEmail* | (email: string) => Promise<void> | Edit billing email. |
toggleInvoiceEmails | (checked: boolean) => void | Toggle invoice email receipts. |
editVat | () => void | Edit VAT number. |
viewInvoice | () => void | View invoices. |
See schema definitions for:
SettingsPanel
The portal of the entire settings panel.
A SettingsPanel extends the <div> element.
SettingsSidebar
A SettingsSidebar extends the <div> element.
We offer some components for layout in sidebar:
SettingsSidebarGroup
A SettingsSidebarGroup extends the <div> element.
SettingsSidebarTitle
A SettingsSidebarTitle extends the <div> element.
SettingsTab
| Prop | Type | Description |
|---|---|---|
name* | string | Name of the tab. |
Icon* | React.ReactNode | Icon of the tab. |
isActive* | boolean | Whether the tab is active. |
onClick | () => void | Handler that is called when the tab is clicked. |
SettingsContent
A SettingsContent extends the <div> element.
We offer some components for layout in settings content:
SettingsSection
| Prop | Type | Default | Description |
|---|---|---|---|
title* | string | - | Name of the section. |
children | React.ReactNode | - | Section content. |
hideSeparator | boolean | false | Whether the separator below the title should be hidden. |
SettingsRule
| Prop | Type | Default | Description |
|---|---|---|---|
title* | string | - | Name of the rule. |
description\ | React.ReactNode | - | Description of the rule. |
children | React.ReactNode | - | Section content. |
plan | string | - | Plan information for the rule. |