add: forum posts ui

This commit is contained in:
trisua 2025-08-03 23:24:57 -04:00
parent ef029c59b3
commit 2be87c397d
90 changed files with 1459 additions and 1299 deletions

View file

@ -3,10 +3,10 @@
(text "Settings - {{ config.name }}"))
(text "{% endblock %} {% block body %} {{ macros::nav() }}")
(main
("class" "flex flex-col gap-2")
("class" "flex flex_col gap_2")
(text "{% if profile.id != user.id -%}")
(div
("class" "card w-full red flex gap-2 items-center")
("class" "card w_full red flex gap_2 items_center")
(text "{{ icon \"skull\" }}")
(b
(text "Editing other user's settings! Please be careful.")))
@ -36,10 +36,10 @@
; ...
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "presets")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -47,23 +47,23 @@
(span
(str (text "general:action.back"))))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(icon (text "cooking-pot"))
(span
(str (text "settings:tab.presets"))))
(div
("class" "card flex flex-col gap-2 secondary")
("class" "card flex flex_col gap_2 secondary")
(p (text "Not sure where to start? Try some settings presets!"))
(details
("class" "w-full accordion")
("class" "w_full accordion")
(summary
(icon (text "rss"))
(text "Microblogging"))
(div
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
(p ("class" "fade") (text "Focus on yourself and your communities."))
(ul ("id" "preset_microblogging_ul"))
(button
@ -72,13 +72,13 @@
(str (text "general:action.apply")))))
(details
("class" "w-full accordion")
("class" "w_full accordion")
(summary
(icon (text "message-circle-heart"))
(text "Q&A"))
(div
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
(p ("class" "fade") (text "Just like Neospring!"))
(ul ("id" "preset_questions_ul"))
(button
@ -87,13 +87,13 @@
(str (text "general:action.apply")))))
(details
("class" "w-full accordion")
("class" "w_full accordion")
(summary
(icon (text "key"))
(text "Private"))
(div
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
(p ("class" "fade") (text "This preset allows you to keep your profile and posts hidden to people you aren't following."))
(ul ("id" "preset_private_ul"))
(button
@ -102,13 +102,13 @@
(str (text "general:action.apply")))))
(details
("class" "w-full accordion")
("class" "w_full accordion")
(summary
(icon (text "eye-closed"))
(text "NSFW"))
(div
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
(p ("class" "fade") (text "NSFW content is allowed if it is hidden from main timelines. This preset will help you do that quickly."))
(ul ("id" "preset_nsfw_ul"))
(button
@ -117,10 +117,10 @@
(str (text "general:action.apply")))))))))
(div
("class" "w-full flex flex-col gap-2")
("class" "w_full flex flex_col gap_2")
("data-tab" "account")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
("id" "account_settings")
(div
("class" "pillmenu")
@ -178,7 +178,7 @@
(text "{%- endif %}")
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "home_timeline")
(div
("class" "card small")
@ -232,14 +232,14 @@
("class" "fade")
(text "This represents the timeline the home button takes you to."))))
(div
("class" "card-nest desktop")
("class" "card_nest desktop")
("ui_ident" "notifications")
(div
("class" "card small")
(b
(text "Notifications")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(button
("id" "notifications_button"))
(span
@ -254,17 +254,17 @@
]);
}, 150);"))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "change_username")
(div
("class" "card small")
(b
(text "{{ text \"settings:label.change_username\" }}")))
(form
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
("onsubmit" "change_username(event)")
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(label
("for" "new_username")
(text "{{ text \"settings:label.new_username\" }}"))
@ -280,22 +280,22 @@
(span
(text "{{ text \"general:action.save\" }}"))))))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "delete_account")
(div
("class" "card small flex items-center gap-2 red")
("class" "card small flex items_center gap_2 red")
(icon (text "skull"))
(b (str (text "communities:label.danger_zone"))))
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(details
("class" "accordion")
(summary
("class" "flex items-center gap-2")
("class" "flex items_center gap_2")
(icon_class (text "chevron-down") (text "dropdown_arrow"))
(str (text "settings:label.deactivate_account")))
(div
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
(p (text "Deactivating your account will treat it as deleted, but all your data will be recoverable if you change your mind. This option is recommended over a full deletion."))
(button
("onclick" "deactivate_account()")
@ -305,14 +305,14 @@
(details
("class" "accordion")
(summary
("class" "flex items-center gap-2")
("class" "flex items_center gap_2")
(icon_class (text "chevron-down") (text "dropdown_arrow"))
(str (text "settings:label.delete_account")))
(form
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
("onsubmit" "delete_account(event)")
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(label
("for" "current_password")
(text "{{ text \"settings:label.current_password\" }}"))
@ -335,10 +335,10 @@
(span
(text "{{ text \"general:action.save\" }}"))))
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/security")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -346,23 +346,23 @@
(span
(text "{{ text \"general:action.back\" }}")))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"user-lock\" }}")
(span
(text "{{ text \"settings:tab.security\" }}")))
(div
("class" "card flex flex-col gap-2 secondary")
("class" "card flex flex_col gap_2 secondary")
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "two_factor_authentication")
(div
("class" "card small")
(b
(text "{{ text \"settings:label.two_factor_authentication\" }}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% if profile.totp|length == 0 -%}")
(div
("id" "totp_stuff")
@ -391,7 +391,7 @@
("id" "totp_recovery_codes")
("style" "display: none"))
(div
("class" "flex gap-2 flex-wrap")
("class" "flex gap_2 flex_wrap")
(button
("class" "lowered red")
("onclick" "refresh_totp_codes(event)")
@ -402,17 +402,17 @@
(text "Disable TOTP 2FA")))
(text "{%- endif %}")))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "change_password")
(div
("class" "card small")
(b
(text "{{ text \"settings:label.change_password\" }}")))
(form
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
("onsubmit" "change_password(event)")
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(label
("for" "current_password")
(text "{{ text \"settings:label.current_password\" }}"))
@ -425,7 +425,7 @@
("minlength" "6")
("autocomplete" "off")))
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(label
("for" "new_password")
(text "{{ text \"settings:label.new_password\" }}"))
@ -442,10 +442,10 @@
(span
(text "{{ text \"general:action.save\" }}")))))))))
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/following")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -453,22 +453,22 @@
(span
(text "{{ text \"general:action.back\" }}")))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"rss\" }}")
(span
(text "{{ text \"auth:label.following\" }}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% for userfollow in following %} {% set user = userfollow[1] %}")
(div
("class" "card secondary flex flex-wrap gap-2 items-center justify-between")
("class" "card secondary flex flex_wrap gap_2 items_center justify_between")
(div
("class" "flex gap-2")
("class" "flex gap_2")
(text "{{ components::avatar(username=user.username) }} {{ components::full_username(user=user) }}"))
(div
("class" "flex gap-2")
("class" "flex gap_2")
(button
("class" "lowered red small")
("onclick" "toggle_follow_user('{{ user.id }}')")
@ -498,10 +498,10 @@
});
};")))
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/followers")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -509,22 +509,22 @@
(span
(text "{{ text \"general:action.back\" }}")))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"rss\" }}")
(span
(text "{{ text \"auth:label.followers\" }}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% for userfollow in followers %} {% set user = userfollow[1] %}")
(div
("class" "card secondary flex flex-wrap gap-2 items-center justify-between")
("class" "card secondary flex flex_wrap gap_2 items_center justify_between")
(div
("class" "flex gap-2")
("class" "flex gap_2")
(text "{{ components::avatar(username=user.username) }} {{ components::full_username(user=user) }}"))
(div
("class" "flex gap-2")
("class" "flex gap_2")
(button
("class" "lowered red small")
("onclick" "force_unfollow_me('{{ user.id }}')")
@ -554,10 +554,10 @@
});
};")))
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/blocks")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -567,36 +567,36 @@
; stack blocks
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"layers\" }}")
(span
(text "{{ text \"stacks:link.stacks\" }}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% for stack in stackblocks %}")
(text "{{ components::stack_listing(stack=stack) }}")
(text "{% endfor %}")))
; user blocks
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"users-round\" }}")
(span
(text "{{ text \"settings:label.users\" }}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% for user in blocks %}")
(div
("class" "card secondary flex flex-wrap gap-2 items-center justify-between")
("class" "card secondary flex flex_wrap gap_2 items_center justify_between")
(div
("class" "flex gap-2")
("class" "flex gap_2")
(text "{{ components::avatar(username=user.username) }} {{ components::full_username(user=user) }}"))
(div
("class" "flex gap-2")
("class" "flex gap_2")
(a
("href" "/stacks/add_user/{{ user.id }}")
("target" "_blank")
@ -612,21 +612,21 @@
; ip blocks
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"wifi\" }}")
(span
(text "{{ text \"settings:label.ips\" }}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% for ip in ipblocks %}")
(div
("class" "card secondary flex flex-wrap gap-2 items-center justify-between")
("class" "card secondary flex flex_wrap gap_2 items_center justify_between")
(span
(text "Block from: ") (span ("class" "date") (text "{{ ip.created }}")))
(div
("class" "flex gap-2")
("class" "flex gap_2")
(button
("onclick" "trigger('me::remove_ip_block', ['{{ ip.id }}'])")
("class" "lowered small red")
@ -634,10 +634,10 @@
(span (str (text "auth:action.unblock"))))))
(text "{% endfor %}")))))
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/uploads")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -645,21 +645,21 @@
(span
(text "{{ text \"general:action.back\" }}")))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"image-up\" }}")
(span
(text "{{ text \"settings:tab.uploads\" }}")))
(div
("class" "card flex flex-col gap-2 secondary")
("class" "card flex flex_col gap_2 secondary")
(text "{{ components::supporter_ad(body=\"Become a supporter to upload images directly to posts!\") }} {% for upload in uploads %}")
(details
("class" "accordion w-full")
("class" "accordion w_full")
(summary
("class" "card flex flex-wrap gap-2 items-center justify-between")
("class" "card flex flex_wrap gap_2 items_center justify_between")
(div
("class" "flex gap-2 items-center")
("class" "flex gap_2 items_center")
(icon_class (text "chevron-down") (text "dropdown_arrow"))
(b
(span
@ -667,7 +667,7 @@
(text "{{ upload.created }}"))
(text " ({{ upload.what }})")))
(div
("class" "flex gap-2")
("class" "flex gap_2")
(button
("class" "raised small")
("onclick" "trigger('ui::lightbox_open', ['/api/v1/uploads/{{ upload.id }}'])")
@ -682,17 +682,17 @@
(text "{{ text \"stacks:label.remove\" }}")))))
(div
("class" "inner flex flex-col gap-2")
("class" "inner flex flex_col gap_2")
(form
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
("onsubmit" "update_upload_alt(event, '{{ upload.id }}')")
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(label ("for" "alt_{{ upload.id }}") (b (str (text "settings:label.alt_text"))))
(textarea
("id" "alt_{{ upload.id }}")
("name" "alt")
("class" "w-full")
("class" "w_full")
("placeholder" "Alternative text")
(text "{{ upload.alt|safe }}")))
@ -744,10 +744,10 @@
(text "{% if config.security.enable_invite_codes -%}")
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/invites")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -755,14 +755,14 @@
(span
(text "{{ text \"general:action.back\" }}")))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"ticket\" }}")
(span
(text "{{ text \"settings:tab.invites\" }}")))
(div
("class" "card flex flex-col gap-2 secondary")
("class" "card flex flex_col gap_2 secondary")
(pre ("id" "invite_codes_output") ("class" "hidden") (code))
(pre ("id" "invite_codes_error_output") ("class" "hidden") (code ("class" "red")))
@ -773,7 +773,7 @@
(text "{{ components::supporter_ad(body=\"Become a supporter to generate up to 48 invite codes! You can currently have 2 maximum.\") }} {% for code in invites %}")
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(text "{% if code[1].is_used -%}")
; used
(b ("class" "{% if code[1].is_used -%} fade {%- endif %}") (s (text "{{ code[1].code }}")))
@ -824,10 +824,10 @@
(text "{%- endif %}")
(div
("class" "w-full flex flex-col gap-2 hidden")
("class" "w_full flex flex_col gap_2 hidden")
("data-tab" "account/billing")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
(a
("href" "#/account")
("class" "button secondary")
@ -835,26 +835,26 @@
(span
(text "{{ text \"general:action.back\" }}")))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card flex items-center gap-2 small")
("class" "card flex items_center gap_2 small")
(text "{{ icon \"credit-card\" }}")
(span
(text "{{ text \"settings:tab.billing\" }}")))
(div
("class" "card flex flex-col gap-2 secondary")
("class" "card flex flex_col gap_2 secondary")
(text "{% if config.stripe -%}")
(text "{% if has_developer_pass or is_supporter -%}")
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "supporter_card")
(div
("class" "card small flex items-center gap-2")
("class" "card small flex items_center gap_2")
(icon (text "credit-card"))
(b
(text "Manage billing")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(p
(text "You currently have a subscription! You can manage your billing information below. ")
(b
@ -868,15 +868,15 @@
(text "{%- endif %}")
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "supporter_card")
(div
("class" "card small flex items-center gap-2")
("class" "card small flex items_center gap_2")
(text "{{ icon \"star\" }}")
(b
(text "Supporter status")))
(div
("class" "card flex flex-col gap-2 no_p_margin")
("class" "card flex flex_col gap_2 no_p_margin")
(text "{% if is_supporter -%}")
(p
(text "You ")
@ -887,15 +887,15 @@
(text "{%- endif %}")))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "supporter_card")
(div
("class" "card small flex items-center gap-2")
("class" "card small flex items_center gap_2")
(icon (text "id-card-lanyard"))
(b
(text "Developer pass status")))
(div
("class" "card flex flex-col gap-2 no_p_margin")
("class" "card flex flex_col gap_2 no_p_margin")
(text "{% if has_developer_pass -%}")
(p
(text "You currently have a developer pass!"))
@ -905,12 +905,12 @@
(text "{% if user.was_purchased and user.invite_code == 0 -%}")
(form
("class" "card w-full lowered flex flex-col gap-2")
("class" "card w_full lowered flex flex_col gap_2")
("onsubmit" "update_invite_code(event)")
(p (text "Your account is currently activated without an invite code. If you stop paying for supporter, your account will be locked again until you renew. You can provide an invite code to avoid this if you're planning on cancelling."))
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(label
("for" "invite_code")
(b
@ -927,32 +927,32 @@
(text "{%- endif %}")
(text "{%- endif %}")))))
(div
("class" "w-full hidden flex flex-col gap-2")
("class" "w_full hidden flex flex_col gap_2")
("data-tab" "profile")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
("id" "profile_settings")
(text "{{ components::supporter_ad(body=\"Become a supporter to upload GIF images!\") }}")
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "change_avatar")
(div
("class" "card small")
(b
(text "{{ text \"settings:label.change_avatar\" }}")))
(form
("class" "card flex gap-2 flex-row flex-wrap items-center")
("class" "card flex gap_2 flex_row flex_wrap items_center")
("method" "post")
("enctype" "multipart/form-data")
("onsubmit" "upload_avatar(event)")
(div
("class" "flex gap-2 flex-row flex-wrap items-center")
("class" "flex gap_2 flex_row flex_wrap items_center")
(input
("id" "avatar_file")
("name" "file")
("type" "file")
("accept" "image/png,image/jpeg,image/avif,image/webp,image/gif")
("class" "w-content"))
("class" "w_content"))
(button
(text "{{ icon \"check\" }}")))
(span
@ -961,32 +961,32 @@
only supported for supporter users. GIFs can be at most
2 MB large."))))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "change_banner")
(div
("class" "card small")
(b
(text "{{ text \"settings:label.change_banner\" }}")))
(form
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
("method" "post")
("enctype" "multipart/form-data")
("onsubmit" "upload_banner(event)")
(div
("class" "flex gap-2 flex-row flex-wrap items-center")
("class" "flex gap_2 flex_row flex_wrap items_center")
(input
("id" "banner_file")
("name" "file")
("type" "file")
("accept" "image/png,image/jpeg,image/avif,image/webp,image/gif")
("class" "w-content"))
("class" "w_content"))
(button
(text "{{ icon \"check\" }}")))
(span
("class" "fade")
(text "Use an image of 1100x350px for the best results."))))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "default_profile_page")
(div
("class" "card small")
@ -1008,11 +1008,11 @@
("class" "fade")
(text "This represents the timeline that is shown on your profile by default."))))
(div
("class" "flex flex-col gap-2")
("class" "flex flex_col gap_2")
("ui_ident" "show_presets")
(hr ("class" "margin"))
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card small")
(b
@ -1030,13 +1030,13 @@
(span
(text "{{ text \"general:action.save\" }}"))))
(div
("class" "card w-full lowered hidden flex flex-col gap-2")
("class" "card w_full lowered hidden flex flex_col gap_2")
("data-tab" "sessions")
(text "{% for token in profile.tokens %}")
(div
("class" "card w-full flex justify-between flex-collapse gap-2")
("class" "card w_full flex justify_between flex_collapse gap_2")
(div
("class" "flex flex-col gap-1")
("class" "flex flex_col gap_1")
(b
("style" "
width: 200px;
@ -1046,7 +1046,7 @@
(text "{{ token[1] }}"))
(text "{% if is_helper -%}")
(span
("class" "flex gap-2 items-center")
("class" "flex gap_2 items_center")
(span
("class" "fade")
(a
@ -1068,18 +1068,18 @@
(text "{{ text \"general:action.delete\" }}")))
(text "{% endfor %}"))
(div
("class" "w-full hidden flex flex-col gap-2")
("class" "w_full hidden flex flex_col gap_2")
("data-tab" "theme")
(div
("class" "card lowered flex flex-col gap-2")
("class" "card lowered flex flex_col gap_2")
("id" "theme_settings")
(text "{% if failing_color_keys|length > 0 -%}")
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
("style" "background: white; color: black")
("ui_ident" "awful_contrast")
(div
("class" "flex gap-2 items-center")
("class" "flex gap_2 items_center")
(span
("class" "desktop")
("style" "display: contents")
@ -1095,7 +1095,7 @@
(text "{% endfor %}")))
(text "{%- endif %}")
(div
("class" "card w-full flex flex-wrap gap-2")
("class" "card w_full flex flex_wrap gap_2")
("ui_ident" "import_export")
(button
("onclick" "import_theme_settings()")
@ -1110,7 +1110,7 @@
(text "{{ text \"settings:label.export\" }}"))))
(text "{{ components::supporter_ad(body=\"Become a supporter to add custom CSS!\") }}")
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "theme_preference")
(div
("class" "card small")
@ -1136,7 +1136,7 @@
("class" "fade")
(text "This represents your local site theme."))))
(div
("class" "card-nest")
("class" "card_nest")
("ui_ident" "profile_theme")
(div
("class" "card small")
@ -1169,10 +1169,10 @@
(span
(text "{{ text \"general:action.save\" }}"))))
(div
("class" "card w-full lowered hidden flex flex-col gap-2")
("class" "card w_full lowered hidden flex flex_col gap_2")
("data-tab" "connections")
(div
("class" "card w-full flex flex-wrap gap-2")
("class" "card w_full flex flex_wrap gap_2")
(text "{% if config.connections.spotify_client_id and not profile.connections.Spotify %}")
(button
("class" "lowered")
@ -1190,12 +1190,12 @@
(text "{%- endif %}"))
(text "{% for key, value in profile.connections %}")
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card small flex items-center gap-2")
("class" "card small flex items_center gap_2")
(text "{{ components::connection_icon(key=key) }}")
(b
("class" "flex items-center gap-2")
("class" "flex items_center gap_2")
(text "{% if value[0].data.name -%}")
(span
(text "{{ value[0].data.name }}"))
@ -1211,50 +1211,50 @@
(text "{{ icon \"badge-alert\" }}"))
(text "{%- endif %}")))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(button
("class" "lowered red small")
("onclick" "trigger('connections::delete', ['{{ key }}'])")
(text "{{ text \"general:action.delete\" }}"))
(label
("for" "{{ key }}-shown")
("class" "flex items-center gap-2")
("class" "flex items_center gap_2")
(input
("type" "checkbox")
("checked" "{% if value[0].show_on_profile -%}true{% else %}false{%- endif %}")
("id" "{{ key }}-shown")
("onchange" "trigger('connections::push_con_shown', ['{{ key }}', event.target.checked])")
("class" "w-content"))
("class" "w_content"))
(span
(text "Shown on profile")))))
(text "{% endfor %}")
(text "{% for grant in profile_grants %}")
(div
("class" "card-nest")
("class" "card_nest")
(div
("class" "card small flex items-center gap-4")
("class" "card small flex items_center gap_4")
(div
("class" "flex items-center gap-2")
("class" "flex items_center gap_2")
(icon (text "bot"))
(a
("class" "flush")
("href" "{{ grant[0].homepage }}")
("target" "_blank")
(b
("class" "flex items-center gap-2")
("class" "flex items_center gap_2")
(text "{{ grant[0].title }}"))))
(span
("class" "fade flex items-center gap-2")
("class" "fade flex items_center gap_2")
(icon (text "clock"))
(span ("class" "date") (text "{{ grant[1].last_updated }}"))))
(div
("class" "card flex flex-col gap-2")
("class" "card flex flex_col gap_2")
(details
(summary (icon (text "scan-eye")) (text "{{ grant[1].scopes|length }} scope{{ grant[1].scopes|length|pluralize }}"))
(div
("class" "card lowered w-full")
("class" "card lowered w_full")
(ul
(text "{% for scope in grant[1].scopes -%}")
(li