---
title: "Customize with slots"
description: "Keep a packaged component and replace only the regions you care about, with every prop and event it takes."
canonical_url: "https://nuxt-backend.dev/docs/ui/customize/slots"
---
# Customize with slots

> Keep a packaged component and replace only the regions you care about, with every prop and event it takes.

Create your own page at the same route (it wins automatically — see [Replace a page](https://nuxt-backend.dev/docs/ui/customize/replace-pages)) and keep the packaged component, replacing only the regions you care about. Every slot receives the full composable state the component runs on:

```vue [app/pages/pricing.vue]
<template>
  <PricingTable>
    <template #plan-action="{ plan, subscribe, pending }">
      <MyButton :loading="pending === plan.key" @click="subscribe(plan.key)">
        Start with {{ plan.product?.name }}
      </MyButton>
    </template>
  </PricingTable>
</template>
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Slots
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        <AuthForm>
      </code>
    </td>
    
    <td>
      <code>
        header
      </code>
      
      , <code>
        error
      </code>
      
      , <code>
        footer
      </code>
      
      , and one per step — <code>
        choose
      </code>
      
      , <code>
        request-code
      </code>
      
      , <code>
        verify-code
      </code>
      
      , <code>
        add-passkey
      </code>
      
       — each receiving the <code>
        useLoginFlow()
      </code>
      
       object
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <AcceptInvitation>
      </code>
    </td>
    
    <td>
      one per state — <code>
        loading
      </code>
      
      , <code>
        ready
      </code>
      
      , <code>
        accepted
      </code>
      
      , <code>
        declined
      </code>
      
      , <code>
        missing
      </code>
      
      , <code>
        error
      </code>
      
       — each receiving <code>
        { invitation, accept, decline, pending, error }
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <AgentConsent>
      </code>
    </td>
    
    <td>
      one per state — <code>
        loading
      </code>
      
      , <code>
        ready
      </code>
      
      , <code>
        missing
      </code>
      
      , <code>
        answered
      </code>
      
       — each receiving <code>
        { request, approve, deny, pending, error }
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <GiftClaimBanner>
      </code>
    </td>
    
    <td>
      <code>
        default
      </code>
      
       (<code>
        { gifts, claim, isClaiming }
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <PricingTable>
      </code>
    </td>
    
    <td>
      <code>
        header
      </code>
      
      , <code>
        plan
      </code>
      
      , <code>
        plan-action
      </code>
      
      , <code>
        packs
      </code>
      
      , <code>
        pack
      </code>
      
      , <code>
        portal
      </code>
      
      , <code>
        empty
      </code>
      
      , <code>
        error
      </code>
      
      , <code>
        footer
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <BillingHistory>
      </code>
    </td>
    
    <td>
      <code>
        header
      </code>
      
      , <code>
        loading
      </code>
      
      , <code>
        empty
      </code>
      
      , <code>
        error
      </code>
      
      , <code>
        order
      </code>
      
      , <code>
        pager
      </code>
      
      , <code>
        footer
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <UsageHistory>
      </code>
    </td>
    
    <td>
      <code>
        header
      </code>
      
      , <code>
        loading
      </code>
      
      , <code>
        empty
      </code>
      
      , <code>
        error
      </code>
      
      , <code>
        event
      </code>
      
      , <code>
        pager
      </code>
      
      , <code>
        footer
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <CreditsLowBanner>
      </code>
    </td>
    
    <td>
      <code>
        default
      </code>
      
      , <code>
        message
      </code>
      
      , <code>
        action
      </code>
      
      , <code>
        dismiss
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <WorkspaceSettings>
      </code>
    </td>
    
    <td>
      <code>
        workspaces
      </code>
      
      , <code>
        workspace
      </code>
      
      , <code>
        create
      </code>
      
      , <code>
        billing
      </code>
      
      , <code>
        credits
      </code>
      
      , <code>
        footer
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <ProfileSettings>
      </code>
    </td>
    
    <td>
      <code>
        identity
      </code>
      
      , <code>
        name
      </code>
      
      , <code>
        email
      </code>
      
      , <code>
        footer
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <SecuritySettings>
      </code>
    </td>
    
    <td>
      <code>
        verification
      </code>
      
      , <code>
        passkeys
      </code>
      
      , <code>
        passkey
      </code>
      
      , <code>
        sessions
      </code>
      
      , <code>
        session
      </code>
      
      , <code>
        danger
      </code>
      
      , <code>
        footer
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <RoleBoundary>
      </code>
      
      , <code>
        <FeatureBoundary>
      </code>
    </td>
    
    <td>
      <code>
        default
      </code>
      
      , <code>
        fallback
      </code>
      
       (the check failed), <code>
        placeholder
      </code>
      
       (still loading)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <OrganizationBoundary>
      </code>
    </td>
    
    <td>
      <code>
        default
      </code>
      
       (<code>
        { workspace }
      </code>
      
      ), <code>
        fallback
      </code>
      
       (no active workspace), <code>
        placeholder
      </code>
      
       (still loading)
    </td>
  </tr>
</tbody>
</table>

## Props and emits

Every prop is optional; the default is in parentheses. Components resolve `props ?? appConfig.backend.* ?? built-in default`.

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Props
    </th>
    
    <th>
      Emits
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        <AuthForm>
      </code>
    </td>
    
    <td>
      <code>
        title
      </code>
      
       (<code>
        'Sign in'
      </code>
      
      ), <code>
        requireName
      </code>
      
       (<code>
        true
      </code>
      
      ), <code>
        validateEmail
      </code>
    </td>
    
    <td>
      <code>
        success
      </code>
      
      , <code>
        error(message)
      </code>
      
      , <code>
        step(step)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <AcceptInvitation>
      </code>
    </td>
    
    <td>
      <code>
        invitationId
      </code>
      
       (the <code>
        ?id=
      </code>
      
       query parameter), <code>
        activate
      </code>
      
       (<code>
        true
      </code>
      
      )
    </td>
    
    <td>
      <code>
        accepted(invitation)
      </code>
      
      , <code>
        declined(invitation)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <AgentConsent>
      </code>
    </td>
    
    <td>
      —
    </td>
    
    <td>
      <code>
        answered(approved)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <GiftClaimBanner>
      </code>
    </td>
    
    <td>
      —
    </td>
    
    <td>
      <code>
        claimed(count)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <PricingTable>
      </code>
    </td>
    
    <td>
      <code>
        plans
      </code>
      
      , <code>
        packs
      </code>
      
       (<code>
        appConfig.backend.billing
      </code>
      
      ), <code>
        title
      </code>
      
      , <code>
        period
      </code>
      
       (<code>
        '/mo'
      </code>
      
      ), <code>
        showPacks
      </code>
      
       (<code>
        true
      </code>
      
      ), <code>
        showPortal
      </code>
      
       (<code>
        true
      </code>
      
      ), <code>
        redirect
      </code>
      
       (<code>
        true
      </code>
      
      )
    </td>
    
    <td>
      <code>
        checkout(url)
      </code>
      
       (only with <code>
        redirect: false
      </code>
      
      ), <code>
        plan-changed(key)
      </code>
      
      , <code>
        canceled
      </code>
      
      , <code>
        uncanceled
      </code>
      
      , <code>
        topped-up(key)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <BillingHistory>
      </code>
    </td>
    
    <td>
      <code>
        title
      </code>
      
      , <code>
        limit
      </code>
      
       (the provider's page size), <code>
        invoices
      </code>
      
       (<code>
        true
      </code>
      
      ), <code>
        redirect
      </code>
      
       (<code>
        false
      </code>
      
       — invoices open in a new tab)
    </td>
    
    <td>
      <code>
        invoice(url)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <UsageHistory>
      </code>
    </td>
    
    <td>
      <code>
        meter
      </code>
      
       (every metered event), <code>
        title
      </code>
      
      , <code>
        limit
      </code>
      
       (the provider's page size)
    </td>
    
    <td>
      —
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <CreditsLowBanner>
      </code>
    </td>
    
    <td>
      <code>
        meter
      </code>
      
       (the primary meter), <code>
        threshold
      </code>
      
       (<code>
        appConfig.backend.billing.lowCreditsThreshold
      </code>
      
      ), <code>
        pack
      </code>
      
       (a credit-pack key — turns the action into a top-up checkout), <code>
        dismissible
      </code>
      
       (<code>
        true
      </code>
      
      ), <code>
        redirect
      </code>
      
       (<code>
        true
      </code>
      
      )
    </td>
    
    <td>
      <code>
        dismissed
      </code>
      
      , <code>
        topped-up(url)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <WorkspaceSettings>
      </code>
    </td>
    
    <td>
      <code>
        sections
      </code>
      
       (<code>
        ['workspaces', 'billing', 'credits']
      </code>
      
      ), <code>
        pricingPath
      </code>
      
       (the mounted pricing page)
    </td>
    
    <td>
      <code>
        workspace-created(workspace)
      </code>
      
      , <code>
        workspace-switched(id)
      </code>
      
      , <code>
        plan-canceled
      </code>
      
      , <code>
        topped-up(key)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <ProfileSettings>
      </code>
    </td>
    
    <td>
      <code>
        validateEmail
      </code>
      
      , <code>
        showIdentity
      </code>
      
       (<code>
        true
      </code>
      
      )
    </td>
    
    <td>
      <code>
        name-saved(name)
      </code>
      
      , <code>
        email-changed(email)
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <SecuritySettings>
      </code>
    </td>
    
    <td>
      <code>
        sections
      </code>
      
       (<code>
        ['passkeys', 'sessions', 'danger']
      </code>
      
      ), <code>
        confirm
      </code>
      
       (<code>
        window.confirm
      </code>
      
      )
    </td>
    
    <td>
      <code>
        passkey-added
      </code>
      
      , <code>
        passkey-removed(id)
      </code>
      
      , <code>
        session-revoked(id)
      </code>
      
      , <code>
        sessions-revoked
      </code>
      
      , <code>
        delete-requested
      </code>
      
      , <code>
        signed-out
      </code>
      
      , <code>
        error(message)
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <RoleBoundary>
      </code>
    </td>
    
    <td>
      <code>
        role
      </code>
      
       (a role or an array — any match passes), <code>
        permission
      </code>
      
       (statements such as <code>
        { user: ['ban'] }
      </code>
      
      )
    </td>
    
    <td>
      —
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <OrganizationBoundary>
      </code>
    </td>
    
    <td>
      —
    </td>
    
    <td>
      —
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        <FeatureBoundary>
      </code>
    </td>
    
    <td>
      <code>
        feature
      </code>
      
      , <code>
        plan
      </code>
      
       (a key or an array — any match passes)
    </td>
    
    <td>
      —
    </td>
  </tr>
</tbody>
</table>


## Sitemap

See the full [sitemap](https://nuxt-backend.dev/sitemap.md) for all pages.
