{m.profile_page_title()} {#if cropFile && browser} {#await import('$lib/components/AvatarCropModal.svelte') then { default: AvatarCropModal }} {/await} {/if}
{#if justSubscribed}

Welcome to Pro!

Your subscription is being activated. Refresh the page in a moment if the Pro badge doesn't appear yet.

{/if}

{data.user.username}

{data.user.role} {#if data.isPro} {m.profile_plan_pro()} {/if}
{#if avatarError}

{avatarError}

{:else}

{m.profile_click_to_change()}

{/if}
{#each (['profile', 'stats'] as const) as tab} {/each}
{#if activeTab === 'profile'} {#if !data.isPro}

{m.profile_subscription_heading()}

{m.profile_free_limits()}

{m.profile_plan_free()}

{m.profile_upgrade_heading()}

{m.profile_upgrade_desc()}

{#if checkoutError}

{checkoutError}

{/if}
{:else}

{m.profile_pro_active()}

{m.profile_pro_perks()}

{m.profile_manage_subscription()}
{/if}

Preferences

{#if saveStatus === 'saving'} {m.profile_saving()}… {:else if saveStatus === 'saved'} ✓ {m.profile_saved()} {:else} {m.profile_saved()} {/if}

{m.profile_theme_label()}

{#each THEMES as t, i} {#if i === 3} {/if} {/each}

{m.profile_font_family()}

{#each FONTS as f} {/each}

{m.profile_text_size()}

{#each FONT_SIZES as s} {/each}
{#if !voicesLoaded}
{:else if voices.length === 0} {:else} {/if}
{speed.toFixed(1)}x
0.5x3.0x

{m.profile_auto_advance()}

Automatically load the next chapter when audio finishes

{m.profile_sessions_heading()}

{m.profile_session_unrecognised()}

{#if revokeError}
{revokeError}
{/if} {#if sessions.length === 0}

{m.profile_no_sessions()}

{:else}
    {#each sessions as session (session.id)}
  • {parseUA(session.user_agent)} {#if session.is_current} {m.profile_session_this()} {/if}
    {#if session.ip}

    {session.ip}

    {/if}

    {m.profile_session_signed_in({ date: formatDate(session.created_at) })} {#if session.last_seen && session.last_seen !== session.created_at} {m.profile_session_last_seen({ date: formatDate(session.last_seen) })} {/if}

  • {/each}
{/if}
{/if} {#if activeTab === 'stats'}

Reading Overview

{#each [ { label: 'Chapters Read', value: data.stats.totalChaptersRead, icon: '📖' }, { label: 'Completed', value: data.stats.booksCompleted, icon: '✅' }, { label: 'Reading', value: data.stats.booksReading, icon: '📚' }, { label: 'Plan to Read', value: data.stats.booksPlanToRead, icon: '🔖' }, ] as stat}

{stat.value}

{stat.label}

{/each}

Activity

🔥

{data.stats.streak}

day streak

{data.stats.avgRatingGiven > 0 ? data.stats.avgRatingGiven.toFixed(1) : '—'}

avg rating given

{#if data.stats.topGenres.length > 0}

Favourite Genres

{#each data.stats.topGenres as genre, i} {#if i === 0}🏆{/if} {genre} {/each}
{/if} {#if data.stats.booksDropped > 0}

{data.stats.booksDropped} dropped book{data.stats.booksDropped !== 1 ? 's' : ''} — revisit your library

{/if}
{/if}