{% extends "base.html" %} {% import '_start_page_form.html' as startpage %} {# Your own profile. Everything on this page belongs to the signed-in account. It is NOT a settings page: /settings is admin-only, which is why a normal account could not reach its own theme, accent colour or media-server profile before this page existed. Built exactly like Settings / Integrations / Notifications: one .settings-container, a floating side menu, and one .settings-tab-panel per section switched client-side (no reload). See _profile_menu.html for the menu and switchProfileTab() below. The appearance controls deliberately reuse the ids the Design tab uses (themeBtnDark/themeBtnLight, accentPresetsSettings, accentHexInputSettings, accentColorPickerSettings). setTheme(), resetAppearance() and the preset renderer live in base.html and are loaded on every page, so they work here with no second implementation to keep in step. #} {% block styles %} {% endblock %} {% block content %} {# The menu goes INSIDE the container, after the page header -- that is what makes .floating-side-menu float beside the content instead of stacking as a full-width block above it (see notifications.html, which does the same). #}
{% include "_profile_menu.html" %} {# ── Account ───────────────────────────────────────────────────────── #}

{{ _('Account') }}

{{ _('Username') }} {{ account.username or _('Not signed in') }}
{% if account.role %}
{{ _('Role') }} {% if account.role == 'admin' %}{{ _('Administrator') }} {% elif account.role == 'kids' %}{{ _('Kids') }} {% else %}{{ _('User') }}{% endif %}
{% endif %} {% if account.role == 'kids' %}
{{ _('This account is age-limited. The limit is set by an administrator and cannot be changed here.') }}
{% endif %}
{% if account.auth_method == 'local' %}

{{ _('Change password') }}

{{ _('Your current password is asked for again on purpose — a session left open on a shared machine is exactly where someone else would change it.') }}
{% elif account.auth_method %}

{{ _('Password') }}

{{ _('This account signs in through your identity provider, so the password is managed there.') }}
{% endif %}
{# ── Appearance ────────────────────────────────────────────────────── #}

{{ _('Appearance') }}

{{ _('Stored on your account, so the look follows you to your next device instead of resetting.') }}

{{ _('Accent Color') }}

{{ _('Custom Color') }}

{{ _('Theme Packs') }}

{{ _('Theme packs restyle the whole interface — fonts, animations, checkboxes, inputs, the calendar and more. New theme packs can be installed from the Module Store.') }}

{{ _('Advanced Settings') }}

{{ _('These settings only change the design minimally. They are stored on your account, so they follow you to your next device.') }}
{{ _('A glow highlight for active menu items in the accent color') }}
{{ _('Change header color with accent color') }}
{{ _('Invert header color') }}
{{ _('An animated loading indicator for items not yet loaded in the overview') }}
{{ _('A highlight when hovering over a movie or series in the accent color') }}
{{ _('A highlight for currently downloading items in the accent color') }}
{{ _('Button becomes slightly brighter and 5%% smaller on click') }}
{{ _('Icons animate on hover in menus') }}
{# ── Language ──────────────────────────────────────────────────────── #}

{{ _('Language') }}

{# ── Media server ──────────────────────────────────────────────────── #} {# The panel and its menu entry stay hidden until static/profile.js has confirmed a Jellyfin or Plex server is configured: an empty picker for a feature nobody set up is furniture. #}

{{ _('Your Jellyfin/Plex profile') }}

{{ _('Pick your user on the media server and “Continue watching” shows what that server knows — including everything you started in its own app. The monthly recap then uses it too. Leave it empty to keep using MediaForge’s own playback positions.') }}
{# ── Start Page ──────────────────────────────────────────────────────── Named after the Settings tab it mirrors, so "where do I change my rows" has one answer. The form's user scope carries the layout switch (classic / new / follow the instance default) as its first group, which is why nothing extra is needed here for that. #}

{{ _('Start Page') }}

{{ _('These settings are yours alone. Anything you do not change follows the instance default.') }}
{{ startpage.start_page_form('user') }}
{% endblock %} {% block scripts %} {{ startpage.start_page_i18n() }} {% endblock %}