2023-10-21 15:49:01 +13:00
{% macro render_username(user) %}
2023-12-24 13:28:41 +13:00
< span class = "render_username" >
{% if user.deleted %}
[deleted]
{% else %}
2024-01-08 19:41:32 +13:00
{% if user.avatar_id and not low_bandwidth %}
2023-12-24 13:28:41 +13:00
< a href = "/u/{{ user.link() }}" title = "{{ user.ap_id if user.ap_id != none else user.user_name }}" >
2024-02-26 21:26:19 +13:00
< img src = "{{ user.avatar_thumbnail() }}" alt = "" loading = "lazy" / > < / a >
2023-12-24 13:28:41 +13:00
{% endif %}
2024-01-01 14:49:15 +13:00
< a href = "/u/{{ user.link() }}" title = "{{ user.ap_id if user.ap_id != none else user.user_name }}" > {{ user.display_name() }}< / a >
2023-12-24 13:28:41 +13:00
{% if user.created_recently() %}
< span class = "fe fe-new-account" title = "New account" > < / span >
{% endif %}
2023-12-27 11:00:30 +13:00
{% if user.reputation < -10 % }
< span class = "fe fe-warning red" title = "Very low reputation. Beware." > < / span >
< span class = "fe fe-warning red" title = "Very low reputation. Beware!" > < / span >
{% elif user.reputation < 0 % }
< span class = "fe fe-warning orangered" title = "Low reputation." > < / span >
{% endif %}
2023-11-30 05:14:22 +13:00
{% endif %}
2023-12-24 13:28:41 +13:00
< / span >
2023-10-21 15:49:01 +13:00
{% endmacro %}
2023-07-28 16:22:12 +12:00
<!doctype html>
< html lang = "en" >
< head >
{% block head %}
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no" >
< meta http-equiv = "Content-Language" content = "en" / >
2023-11-30 07:12:17 +13:00
< link rel = "preconnect" href = "https://cdn.jsdelivr.net" >
< link rel = "preconnect" href = "https://cdnjs.cloudflare.com" crossorigin >
2023-07-28 16:22:12 +12:00
< meta name = "msapplication-TileColor" content = "#007BBF" >
< meta name = "theme-color" content = "#007BBF" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black-translucent" / >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "mobile-web-app-capable" content = "yes" >
< meta name = "HandheldFriendly" content = "True" >
< meta name = "MobileOptimized" content = "320" >
{% block styles %}
2024-02-12 13:47:23 +13:00
< link href = "{{ url_for('static', filename='bootstrap.css') }}" type = "text/css" rel = "stylesheet" / >
2023-07-28 16:22:12 +12:00
< link href = "{{ url_for('static', filename='structure.css', changed=getmtime('structure.css')) }}" type = "text/css" rel = "stylesheet" / >
< link href = "{{ url_for('static', filename='styles.css', changed=getmtime('styles.css')) }}" type = "text/css" rel = "stylesheet" / >
2024-02-16 14:07:03 +13:00
< link href = "{{ url_for('static', filename='themes/high_contrast/styles.css') }}" type = "text/css" rel = "alternate stylesheet" title = "High contrast" / >
2024-02-28 20:12:57 +13:00
{% if not low_bandwidth %}
2023-12-26 10:49:08 +13:00
< link href = "{{ url_for('static', filename='js/markdown/downarea.css') }}" type = "text/css" rel = "stylesheet" / >
{% endif %}
2024-02-07 18:40:02 +13:00
{% if theme() and file_exists('app/templates/themes/' + theme() + '/styles.css') %}
2024-02-07 17:31:12 +13:00
< link href = "{{ url_for('static', filename='themes/' + theme() + '/styles.css') }}" type = "text/css" rel = "stylesheet" / >
{% endif %}
2023-07-28 16:22:12 +12:00
{% endblock %}
2024-01-06 17:21:39 +13:00
< title > {% if title %}{{ title }}{% else %}{{ _('PieFed') }}{% endif %}< / title >
2023-10-28 21:33:40 +13:00
< link rel = "apple-touch-icon" sizes = "152x152" href = "/static/images/apple-touch-icon.png" >
< link rel = "icon" type = "image/png" sizes = "32x32" href = "/static/images/favicon-32x32.png" >
< link rel = "icon" type = "image/png" sizes = "16x16" href = "/static/images/favicon-16x16.png" >
2024-02-28 17:42:49 +13:00
< link rel = "manifest" href = "/static/manifest.json" >
2023-10-28 21:33:40 +13:00
< link rel = "shortcut icon" type = "image/png" href = "/static/images/favicon-32x32.png" >
< link href = '/static/images/favicon.ico' rel = 'icon' type = 'image/x-icon' >
2023-07-28 16:22:12 +12:00
< meta name = "msapplication-TileColor" content = "#da532c" >
< meta name = "msapplication-config" content = "/static/browserconfig.xml" >
< meta name = "theme-color" content = "#ffffff" >
2023-10-02 22:16:44 +13:00
{% if canonical %}
< link rel = "canonical" href = "{{ canonical }}" / >
{% endif %}
2023-10-23 20:18:46 +13:00
{% if description %}
< meta name = "description" content = "{{ description }}" / >
{% endif %}
{% if og_image %}
< meta property = "og:image" content = "{{ og_image }}" / >
{% endif %}
2023-12-12 18:28:49 +13:00
{% if rss_feed %}
< link rel = "alternate" type = "application/rss+xml" title = "{{ rss_feed_name }}" href = "{{ rss_feed }}" / >
{% endif %}
2024-03-12 20:58:47 +13:00
{% if noindex %}
< meta name = "robots" content = "noindex" >
{% endif %}
2024-01-13 22:09:02 +13:00
< script nonce = "{{ session['nonce']}}" >
const getStoredTheme = () => localStorage.getItem('theme')
const setStoredTheme = theme => localStorage.setItem('theme', theme)
const getPreferredTheme = () => {
const storedTheme = getStoredTheme()
if (storedTheme) {
return storedTheme
}
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
}
const setTheme = theme => {
if (theme === 'auto' & & window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.setAttribute('data-bs-theme', 'dark')
} else {
document.documentElement.setAttribute('data-bs-theme', theme)
}
}
setTheme(getPreferredTheme());
< / script >
2023-07-28 16:22:12 +12:00
{% endblock %}
< / head >
2024-01-13 10:45:39 +13:00
< body class = "d-flex flex-column{{ ' low_bandwidth' if low_bandwidth }}" >
2024-01-23 19:17:05 +13:00
< a href = "#outer_container" class = "skip-link" role = "navigation" aria-label = "Skip main navigation" tabindex = "" > Skip to main content< / a >
2024-02-05 08:39:08 +13:00
< a href = "#side_pane" class = "skip-link" role = "navigation" aria-label = "Go to side pane" tabindex = "" > Go to side pane< / a >
2023-07-28 16:22:12 +12:00
<!-- Page content -->
{% block navbar %}
2024-02-23 18:41:15 +13:00
< div class = "navbar navbar-expand-lg sticky-md-top" >
2024-01-23 19:17:05 +13:00
< div class = "{{ 'container-lg' if post_layout != 'masonry_wide' else 'container-fluid' }}" role = "banner" >
2024-01-08 19:41:32 +13:00
< a class = "navbar-brand" href = "/" > {% if not low_bandwidth %}< img src = "/static/images/logo2.png" alt = "Logo" width = "50" height = "50" / > {% endif %}{{ g.site.name }}< / a >
2024-01-07 10:18:16 +13:00
{% if current_user.is_authenticated %}
2024-01-18 16:15:43 +13:00
< a class = "nav-link d-lg-none" href = "/notifications" aria-label = "{{ _('Notifications') }}" >
2024-01-07 10:18:16 +13:00
{% if current_user.unread_notifications %}
< span class = "fe fe-bell red" > < / span > < span class = "red" > {{ current_user.unread_notifications }}< / span >
{% else %}
< span class = "fe fe-bell" > < / span >
{% endif %}
< / a >
{% endif %}
2024-02-29 22:17:01 +13:00
< button id = "navbar-toggler" class = "navbar-toggler" type = "button" data-toggle = "collapse" data-target = "#navbarSupportedContent" aria-controls = "navbarSupportedContent" aria-expanded = "true" aria-label = "Toggle navigation" >
2023-07-28 16:22:12 +12:00
< span class = "navbar-toggler-icon" > < / span >
< / button >
2024-02-29 22:05:20 +13:00
< div class = "collapse navbar-collapse" id = "navbarSupportedContent" role = "navigation" >
2023-07-28 16:22:12 +12:00
< ul class = "nav navbar-nav ml-md-4" >
{% if current_user.is_anonymous %}
2024-01-12 17:15:08 +13:00
< li class = "nav-item dropdown{% if active_parent == 'home' %} active{% endif %}" >
2024-01-23 19:17:05 +13:00
< a class = "nav-link dropdown-toggle" data-bs-toggle = "dropdown" href = "/home" aria-haspopup = "true" aria-expanded = "false" > {{ _('Home') }}< / a >
2024-01-12 17:15:08 +13:00
< ul class = "dropdown-menu" >
< li > < a class = "dropdown-item{% if active_child == 'popular' %} active{% endif %}" href = "/home" > < span class = "fe fe-home" > < / span > {{ _('Home') }}< / a > < / li >
< li > < a class = "dropdown-item{% if active_child == 'popular' %} active{% endif %}" href = "/popular" > < span class = "fe fe-popular" > < / span > {{ _('Popular') }}< / a > < / li >
< li > < a class = "dropdown-item{% if active_child == 'all_posts' %} active{% endif %}" href = "/all" > < span class = "fe fe-all" > < / span > {{ _('All posts') }}< / a > < / li >
< / ul >
< li class = "nav-item dropdown{% if active_parent == 'communities' %} active{% endif %}" >
2024-01-28 18:11:32 +13:00
< a class = "nav-link dropdown-toggle" data-bs-toggle = "dropdown" href = "/topics" aria-haspopup = "true" aria-expanded = "false" > {{ _('Topics') }}< / a >
2024-01-12 17:15:08 +13:00
< ul class = "dropdown-menu" >
2024-01-28 18:11:32 +13:00
< li > < a class = "dropdown-item{% if active_child == 'list_communities' %} active{% endif %}" href = "/topics" > {{ _('Browse by topic') }}< / a > < / li >
< li > < a class = "dropdown-item{% if active_child == 'list_topics' %} active{% endif %}" href = "/communities" > {{ _('All communities') }}< / a > < / li >
2024-01-12 17:15:08 +13:00
< / ul >
< / li >
2023-08-26 15:41:11 +12:00
< li class = "nav-item" > < a class = "nav-link" href = "/auth/login" > {{ _('Log in') }}< / a > < / li >
< li class = "nav-item" > < a class = "nav-link" href = "/auth/register" > {{ _('Register') }}< / a > < / li >
2024-01-05 16:14:55 +13:00
< li class = "nav-item" > < a class = "nav-link" href = "/donate" > {{ _('Donate') }}< / a > < / li >
2023-07-28 16:22:12 +12:00
{% else %}
2024-01-12 17:15:08 +13:00
< li class = "nav-item dropdown{% if active_parent == 'home' %} active{% endif %}" >
2024-01-23 19:17:05 +13:00
< a class = "nav-link dropdown-toggle" data-bs-toggle = "dropdown" href = "/home" aria-haspopup = "true" aria-expanded = "false" > {{ _('Home') }}< / a >
2024-01-12 17:15:08 +13:00
< ul class = "dropdown-menu" >
2024-02-19 15:56:56 +13:00
< li > < a class = "dropdown-item{% if active_child == 'home' %} active{% endif %}" href = "/home" > < span class = "fe fe-home" > < / span > {{ _('Home') }}< / a > < / li >
2024-01-12 17:15:08 +13:00
< li > < a class = "dropdown-item{% if active_child == 'popular' %} active{% endif %}" href = "/popular" > < span class = "fe fe-popular" > < / span > {{ _('Popular') }}< / a > < / li >
2024-02-19 15:56:56 +13:00
< li > < a class = "dropdown-item{% if active_child == 'all' %} active{% endif %}" href = "/all" > < span class = "fe fe-all" > < / span > {{ _('All posts') }}< / a > < / li >
2024-01-12 17:15:08 +13:00
< / ul >
2024-01-12 12:34:08 +13:00
< li class = "nav-item dropdown{% if active_parent == 'communities' %} active{% endif %}" >
2024-01-28 18:11:32 +13:00
< a class = "nav-link dropdown-toggle" data-bs-toggle = "dropdown" href = "/topics" aria-haspopup = "true" aria-expanded = "false" > {{ _('Topics') }}< / a >
2024-01-12 12:34:08 +13:00
< ul class = "dropdown-menu" >
2024-01-28 18:11:32 +13:00
< li > < a class = "dropdown-item{% if active_child == 'list_communities' %} active{% endif %}" href = "/topics" > {{ _('Browse by topic') }}< / a > < / li >
< li > < a class = "dropdown-item{% if active_child == 'list_topics' %} active{% endif %}" href = "/communities" > {{ _('All communities') }}< / a > < / li >
2024-01-12 12:34:08 +13:00
{% if moderating_communities %}
< li > < h6 class = "dropdown-header" > {{ _('Moderating') }}< / h6 > < / li >
2024-02-19 15:56:56 +13:00
{% for community_menu_item in moderating_communities %}
< li class = "pl-2" > < a class = "dropdown-item{% if community and community.id == community_menu_item.id%} active{% endif %}" href = "/c/{{ community_menu_item.link() }}" > {{ community_menu_item.title }}< / a > < / li >
2024-01-12 12:34:08 +13:00
{% endfor %}
{% endif %}
{% if joined_communities %}
< li > < h6 class = "dropdown-header" > {{ _('Joined communities') }}< / h6 > < / li >
2024-02-19 15:56:56 +13:00
{% for community_menu_item in joined_communities %}
< li class = "pl-2" > < a class = "dropdown-item{% if community and community.id == community_menu_item.id%} active{% endif %}" href = "/c/{{ community_menu_item.link() }}" > {{ community_menu_item.title }}< / a > < / li >
2024-01-12 12:34:08 +13:00
{% endfor %}
{% endif %}
< / ul >
< / li >
< li class = "nav-item dropdown{% if active_parent == 'account' %} active{% endif %}" >
2024-01-23 19:17:05 +13:00
< a class = "nav-link dropdown-toggle" data-bs-toggle = "dropdown" href = "/u/{{ current_user.user_name }}" aria-haspopup = "true" aria-expanded = "false" > {{ _('Account') }}< / a >
2024-01-12 12:34:08 +13:00
< ul class = "dropdown-menu" >
< li > < a class = "dropdown-item{% if active_child == 'view_profile' %} active{% endif %}" href = "/u/{{ current_user.user_name }}" > {{ _('View profile') }}< / a > < / li >
2024-03-11 20:18:27 +13:00
< li > < a class = "dropdown-item{% if active_child == 'edit_profile' %} active{% endif %}" href = "/user/settings" > {{ _('Edit profile & settings') }}< / a > < / li >
2024-02-19 15:56:56 +13:00
< li > < a class = "dropdown-item{% if active_child == 'chats' %} active{% endif %}" href = "/chat" > {{ _('Chats') }}< / a > < / li >
2024-01-12 12:34:08 +13:00
< / ul >
< / li >
2024-01-05 16:14:55 +13:00
< li class = "nav-item" > < a class = "nav-link" href = "/donate" > {{ _('Donate') }}< / a > < / li >
2023-11-03 21:59:48 +13:00
{% if user_access('change instance settings', current_user.id) %}
< li class = "nav-item" > < a class = "nav-link" href = "/admin/" > {{ _('Admin') }}< / a > < / li >
{% endif %}
2023-08-26 15:41:11 +12:00
< li class = "nav-item" > < a class = "nav-link" href = "/auth/logout" > {{ _('Log out') }}< / a > < / li >
2024-01-07 10:18:16 +13:00
< li class = "nav-item d-none d-md-inline-block" >
2024-02-26 21:26:19 +13:00
< a class = "nav-link" href = "/notifications" aria-label = "{{ _('%(num)d unread notifications', num=current_user.unread_notifications) if current_user.unread_notifications else _('Notifications') }}" >
2024-01-06 11:01:44 +13:00
{% if current_user.unread_notifications %}
< span class = "fe fe-bell red" > < / span > < span class = "red" > {{ current_user.unread_notifications }}< / span >
{% else %}
< span class = "fe fe-bell" > < / span >
{% endif %}
< / a >
< / li >
2023-07-28 16:22:12 +12:00
{% endif %}
2024-03-01 20:50:02 +13:00
< li class = "nav-item" aria-label = "{{ _('Search') }}" > < a class = "nav-link" id = "search" href = "/search" tabindex = "" title = "{{ _('Search') }}" > < span class = "fe fe-search" > < / span > < / a > < / li >
2024-01-24 09:23:44 +13:00
< li class = "nav-item" aria-label = "{{ _('Light mode') }}" > < a class = "nav-link" id = "light_mode" href = "#" tabindex = "" title = "{{ _('Light mode') }}" > < span class = "fe fe-sun" > < / span > < / a > < / li >
< li class = "nav-item" aria-label = "{{ _('Dark mode') }}" > < a class = "nav-link" id = "dark_mode" href = "#" tabindex = "" title = "{{ _('Dark mode') }}" > < span class = "fe fe-moon" > < / span > < / a > < / li >
2023-07-28 16:22:12 +12:00
< / ul >
< / div >
< / div >
2024-01-23 19:17:05 +13:00
< / div >
2023-07-28 16:22:12 +12:00
{% endblock %}
{% block content %}
2024-01-23 19:17:05 +13:00
< div id = "outer_container" class = "{{ 'container-lg' if post_layout != 'masonry_wide' else 'container-fluid' }} flex-shrink-0" role = "main" >
2023-07-28 16:22:12 +12:00
{% with messages = get_flashed_messages(with_categories=True) %}
{% if messages %}
{% for category, message in messages %}
< div class = "alert alert-{{ category }}" role = "alert" > {{ message }}< / div >
{% endfor %}
{% endif %}
{% endwith %}
{# application content needs to be provided in the app_content block #}
{% block app_content %}{% endblock %}
< / div >
2024-01-23 19:17:05 +13:00
< footer class = "footer mt-auto" role = "contentinfo" >
2024-02-26 21:26:19 +13:00
< p role = "timer" id = "timeSpent" class = "text-center mt-4" title = "This is how long you have spent using PieFed during this month. We hope this use of your time aligns with your priorities and values." > < / p >
2024-01-08 19:41:32 +13:00
{% if not low_bandwidth %}
< p class = "text-center mt-4" > < a href = "https://liberapay.com/PieFed/donate" > < img alt = "Donate using Liberapay" src = "https://liberapay.com/assets/widgets/donate.svg" > < / a > < / p >
{% else %}
< p class = "text-center mt-4" > < a href = "https://liberapay.com/PieFed/donate" > Donate with Liberapay< / a > < / p >
{% endif %}
2024-01-21 12:35:20 +13:00
< p class = "text-center" > < a href = "/keyboard_shortcuts" > {{ _('Keyboard shortcuts') }}< / a > < / p >
2024-01-05 14:54:45 +13:00
< p class = "text-center" > < a href = "https://patreon.com/PieFed" > Donate with Patreon< / a > < / p >
2024-01-26 13:07:16 +13:00
< p class = "text-center" > < a href = "https://codeberg.org/rimu/pyfedi" > PieFed is free and open source< / a > .< br / > Please < a href = "https://codeberg.org/rimu/pyfedi/issues" > report bugs< / a > or < a href = "https://join.piefed.social/get-involved/" > get involved< / a > .< / p >
2024-01-05 16:14:55 +13:00
< p class = "text-center" > < a href = "/privacy" > Privacy policy< / a > < / p >
2023-07-28 16:22:12 +12:00
< / footer >
{% endblock %}
{% block scripts %}
2024-01-08 19:41:32 +13:00
{% if not low_bandwidth %}
2023-10-02 22:16:44 +13:00
{{ str(moment.include_moment()).replace('< script > ' , ' < s c r i p t n o n c e = " ' + s e s s i o n [ ' n o n c e ' ] + ' " > ' ) | s a f e } }
{{ str(moment.lang(g.locale)).replace('< script > ' , ' < s c r i p t n o n c e = " ' + s e s s i o n [ ' n o n c e ' ] + ' " > ' ) | s a f e } }
2024-01-08 19:41:32 +13:00
{% endif %}
2023-07-28 16:22:12 +12:00
{% endblock %}
2024-01-08 19:41:32 +13:00
{% if not low_bandwidth %}
2024-01-12 12:34:08 +13:00
{{ str(bootstrap.load_js()).replace('< script ' , ' < script nonce = "' + session['nonce'] + '" ' ) | safe } }
2024-01-08 19:41:32 +13:00
{% endif %}
2023-07-28 16:22:12 +12:00
< script type = "text/javascript" src = "{{ url_for('static', filename='js/htmx.min.js') }}" > < / script >
< script type = "text/javascript" src = "{{ url_for('static', filename='js/scripts.js', changed=getmtime('js/scripts.js')) }}" > < / script >
2024-02-28 20:12:57 +13:00
{% if not low_bandwidth %}
2023-12-26 10:49:08 +13:00
< script type = "text/javascript" src = "{{ url_for('static', filename='js/markdown/downarea.js') }}" > < / script >
{% endif %}
2024-02-07 18:40:02 +13:00
{% if theme() and file_exists('app/templates/themes/' + theme() + '/scripts.js') %}
< script src = "{{ url_for('static', filename='themes/' + theme() + '/scripts.js') }}" / >
{% endif %}
2023-07-28 16:22:12 +12:00
{% block end_scripts %}
{% endblock %}
< / body >
< / html >