{% macro avatar(username, size="24px", selector_type="username") -%} <img title="{{ username }}'s avatar" src="/api/v1/auth/profile/{{ username }}/avatar?selector_type={{ selector_type }}" alt="@{{ username }}" class="avatar shadow" loading="lazy" style="--size: {{ size }}" /> {%- endmacro %} {% macro community_avatar(id, community=false, size="24px") -%} {% if community %} <img src="/api/v1/communities/{{ id }}/avatar" alt="{{ community.title }}'s avatar" class="avatar shadow" loading="lazy" style="--size: {{ size }}" /> {% else %} <img src="/api/v1/communities/{{ id }}/avatar" alt="{{ id }}'s avatar" class="avatar shadow" loading="lazy" style="--size: {{ size }}" /> {% endif %} {%- endmacro %} {% macro banner(username) -%} <img title="{{ username }}'s banner" src="/api/v1/auth/profile/{{ username }}/banner" alt="@{{ username }}'s banner" class="banner shadow" loading="lazy" /> {%- endmacro %} {% macro community_banner(id, community=false) -%} {% if community %} <img src="/api/v1/communities/{{ id }}/banner" alt="{{ community.title }}'s banner" class="banner shadow" loading="lazy" /> {% else %} <img src="/api/v1/communities/{{ id }}/banner" alt="{{ id }}'s banner" class="banner shadow" loading="lazy" /> {% endif %} {%- endmacro %} {% macro community_listing_card(community) -%} <a class="card w-full flex items-center gap-4" href="/community/{{ community.title }}" > {{ components::community_avatar(id=community.id, community=community, size="48px") }} <div class="flex flex-col"> <h3>{{ community.context.display_name }}</h3> <span class="fade"><b>{{ community.member_count }}</b> members</span> </div> </a> {%- endmacro %} {% macro username(user) -%} <div style="display: contents"> {% if user.settings.display_name %} {{ user.settings.display_name }} {% else %} {{ user.username }} {% endif %} </div> {%- endmacro %} {% macro likes(id, asset_type, likes=0, dislikes=0) -%} <button title="Like" class="camo small" hook_element="reaction.like" onclick="trigger('me::react', [event.target, '{{ id }}', '{{ asset_type }}', true])" > {{ icon "heart" }} {% if likes > 0 %} <span>{{ likes }}</span> {% endif %} </button> <button title="Dislike" class="camo small" hook_element="reaction.dislike" onclick="trigger('me::react', [event.target, '{{ id }}', '{{ asset_type }}', false])" > {{ icon "heart-crack" }} {% if dislikes > 0 %} <span>{{ dislikes }}</span> {% endif %} </button> {%- endmacro %} {% macro post(post, owner, secondary=false, community=false, show_community=true) -%} <div class="card flex flex-col gap-2 {% if secondary %}secondary{% endif %}"> <div class="w-full flex gap-2"> <a href="/user/{{ owner.username }}"> {{ components::avatar(username=post.owner, size="52px", selector_type="id") }} </a> <div class="flex flex-col w-full gap-1"> <div class="flex flex-wrap gap-2 items-center"> <a href="/user/{{ owner.username }}" >{{ components::username(user=owner) }}</a > <span class="fade date">{{ post.created }}</span> {% if show_community %} <a href="/api/v1/communities/find/{{ post.community }}"> <!-- prettier-ignore --> {% if community %} {{ components::community_avatar(id=post.community, community=community) }} {% else %} {{ components::community_avatar(id=post.community) }} {% endif %} </a> {% endif %} </div> <span id="post-content:{{ post.id }}" >{{ post.content|markdown|safe }}</span > </div> </div> <div class="flex justify-between items-center gap-2 w-full"> {% if user %} <div class="flex gap-1 reactions_box" hook="check_reactions" hook-arg:id="{{ post.id }}" > {{ components::likes(id=post.id, asset_type="Post", likes=post.likes, dislikes=post.dislikes) }} </div> {% else %} <div></div> {% endif %} <div class="flex gap-1 buttons_box"> <a href="/post/{{ post.id }}" class="button camo small"> {{ icon "message-circle" }} <span>{{ post.comment_count }}</span> </a> <a href="/post/{{ post.id }}" class="button camo small" target="_blank" > {{ icon "external-link" }} </a> {% if user %} {% if (user.id == post.owner) or is_helper %} <div class="dropdown"> <button class="camo small" onclick="trigger('atto::hooks::dropdown', [event])" exclude="dropdown" > {{ icon "ellipsis" }} </button> <div class="inner"> <button class="red" onclick="trigger('me::remove_post', ['{{ post.id }}'])" > {{ icon "trash" }} <span>{{ text "general:action.delete" }}</span> </button> </div> </div> {% endif %} {% endif %} </div> </div> </div> {%- endmacro %} {% macro notification(notification) -%} <div class="w-full card-nest"> <div class="card small notif_title flex items-center"> {% if not notification.read %} <svg width="24" height="24" viewBox="0 0 24 24" style="fill: var(--color-link)" > <circle cx="12" cy="12" r="6"></circle> </svg> {% endif %} <b>{{ notification.title|markdown|safe }}</b> </div> <div class="card notif_content flex flex-col gap-2"> <span>{{ notification.content|markdown|safe }}</span> <div class="card secondary w-full flex flex-wrap gap-2"> {% if notification.read %} <button class="tertiary" onclick="trigger('me::update_notification_read_statsu', ['{{ notification.id }}', false])" > {{ icon "undo" }} <span>{{ text "notifs:action.mark_as_unread" }}</span> </button> {% else %} <button class="green tertiary" onclick="trigger('me::update_notification_read_statsu', ['{{ notification.id }}', true])" > {{ icon "check" }} <span>{{ text "notifs:action.mark_as_read" }}</span> </button> {% endif %} <button class="red tertiary" onclick="trigger('me::remove_notification', ['{{ notification.id }}'])" > {{ icon "trash" }} <span>{{ text "general:action.delete" }}</span> </button> </div> </div> </div> {%- endmacro %}