summaryrefslogtreecommitdiff
path: root/web/template
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2025-03-26 16:59:39 +0100
committerLibravatar GitHub <noreply@github.com>2025-03-26 15:59:39 +0000
commitb6e481d63eec15191f2717957682c13ee8a68308 (patch)
tree03cb9fc8bcb5f9eefddee754ad64b9de10c44c39 /web/template
parent[chore] bumps our spf13/viper version (#3943) (diff)
downloadgotosocial-b6e481d63eec15191f2717957682c13ee8a68308.tar.xz
[feature] Allow user to choose "gallery" style layout for web view of profile (#3917)
* [feature] Allow user to choose "gallery" style web layout * find a bug and squish it up and all day long you'll have good luck * just a sec * [performance] reindex public timeline + tinker with query a bit * fiddling * should be good now * last bit of finagling, i'm done now i prommy * panic normally
Diffstat (limited to 'web/template')
-rw-r--r--web/template/profile-gallery.tmpl87
-rw-r--r--web/template/profile.tmpl197
-rw-r--r--web/template/profile_about_user.tmpl56
-rw-r--r--web/template/profile_header.tmpl185
-rw-r--r--web/template/status.tmpl20
-rw-r--r--web/template/status_attachment.tmpl179
-rw-r--r--web/template/status_attachments.tmpl195
-rw-r--r--web/template/status_info.tmpl29
8 files changed, 533 insertions, 415 deletions
diff --git a/web/template/profile-gallery.tmpl b/web/template/profile-gallery.tmpl
new file mode 100644
index 000000000..badb04615
--- /dev/null
+++ b/web/template/profile-gallery.tmpl
@@ -0,0 +1,87 @@
+{{- /*
+// GoToSocial
+// Copyright (C) GoToSocial Authors admin@gotosocial.org
+// SPDX-License-Identifier: AGPL-3.0-or-later
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/ -}}
+
+{{- with . }}
+<main class="profile h-card">
+ {{- with . }}
+ {{- include "profile_header.tmpl" . | indent 1 }}
+ {{- end }}
+ {{- with . }}
+ {{- include "profile_about_user.tmpl" . | indent 1 }}
+ {{- end }}
+ <div
+ class="media-galleries-wrapper"
+ role="region"
+ aria-label="Media by {{ .account.Username -}}"
+ >
+ {{- if .pinned_statuses }}
+ <section class="pinned h-feed" aria-labelledby="pinned">
+ <div class="col-header">
+ <h3 class="p-name" id="pinned">Pinned media</h3>
+ <a href="#recent">jump to recent</a>
+ </div>
+ <div
+ class="media-gallery photoswipe-gallery"
+ role="group"
+ >
+ {{- range $index, $attachment := .pinnedGalleryItems }}
+ {{- includeIndex "status_attachment.tmpl" $attachment $index | indent 4 }}
+ {{- end }}
+ </div>
+ </section>
+ {{- end }}
+ <section class="recent h-feed" aria-labelledby="recent">
+ <div class="col-header">
+ <h3 id="recent p-name" tabindex="-1">Recent media</h3>
+ {{- if .rssFeed }}
+ <a href="{{- .rssFeed -}}" class="rss-icon" aria-label="RSS feed">
+ <i class="fa fa-rss-square" aria-hidden="true"></i>
+ </a>
+ {{- end }}
+ </div>
+ {{- if not .galleryItems }}
+ <div data-nosnippet class="nothinghere">
+ {{- if .show_back_to_top }}
+ Reached the end of visible media!
+ {{- else }}
+ Nothing to see here! {{ .account.Username }} has either not posted any public media yet, or has opted not to make posts visible via the World Wide Web.
+ {{- end }}
+ </div>
+ {{- else }}
+ <div
+ class="media-gallery photoswipe-gallery"
+ role="group"
+ >
+ {{- range $index, $attachment := .galleryItems }}
+ {{- includeIndex "status_attachment.tmpl" $attachment $index | indent 4 }}
+ {{- end }}
+ </div>
+ {{- end }}
+ <nav class="backnextlinks">
+ {{- if .show_back_to_top }}
+ <a href="/@{{- .account.Username -}}">Back to top</a>
+ {{- end }}
+ {{- if .statuses_next }}
+ <a href="{{- .statuses_next -}}" class="next">Show older</a>
+ {{- end }}
+ </nav>
+ </section>
+ </div>
+</main>
+{{- end }} \ No newline at end of file
diff --git a/web/template/profile.tmpl b/web/template/profile.tmpl
index 6b486eb74..d7d24cb64 100644
--- a/web/template/profile.tmpl
+++ b/web/template/profile.tmpl
@@ -17,200 +17,15 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ -}}
-{{- define "profileMovedTo" -}}
-{{- with .account.Moved }}
-<div class="moved-to">
- <b>
- ℹ️ This account has permanently moved to
- <a
- href="{{ .URL }}"
- class="nounderline"
- rel="nofollow noreferrer noopener"
- target="_blank"
- >
- @{{ .Username }}
- </a>
- </b>
-</div>
-{{- end }}
-{{- end -}}
-
-{{- define "defaultAvatarDimension" -}}
-{{- /* 136 is the default width/height for 8.5rem avatars, double it to get a good look when expanded. */ -}}
-272
-{{- end -}}
-
-{{- define "avatarWidth" -}}
-{{- with .account }}
- {{- if isNil .AvatarAttachment -}}
- {{- template "defaultAvatarDimension" . -}}
- {{- else -}}
- {{- /* Use the avatar's proper dimensions. */ -}}
- {{- .AvatarAttachment.Meta.Original.Width -}}
- {{- end -}}
-{{- end }}
-{{- end -}}
-
-{{- define "avatarHeight" -}}
-{{- with .account }}
- {{- if isNil .AvatarAttachment -}}
- {{- template "defaultAvatarDimension" . -}}
- {{- else -}}
- {{- /* Use the avatar's proper dimensions. */ -}}
- {{- .AvatarAttachment.Meta.Original.Height -}}
- {{- end -}}
-{{- end }}
-{{- end -}}
-
-{{- define "avatarAlt" -}}
- Avatar for {{ .account.Username -}}
- {{- if .account.AvatarDescription }}
- {{- /* Add the avatar's image description. */ -}}
- : {{ .account.AvatarDescription -}}
- {{- end -}}
-{{- end -}}
-
-{{- define "headerAlt" -}}
- Header for {{ .account.Username -}}
- {{- if .account.HeaderDescription }}
- {{- /* Add the header's image description. */ -}}
- : {{ .account.HeaderDescription -}}
- {{- end -}}
-{{- end -}}
-
-{{- define "avatar" -}}
-{{- with . }}
-<div
- class="media photoswipe-gallery odd single avatar-image-wrapper"
- role="group"
->
- <a
- class="photoswipe-slide"
- href="{{- .account.Avatar -}}"
- target="_blank"
- data-pswp-width="{{- template "avatarWidth" . -}}px"
- data-pswp-height="{{- template "avatarHeight" . -}}px"
- data-cropped="true"
- alt="{{- template "avatarAlt" . -}}"
- title="{{- template "avatarAlt" . -}}"
- >
- <picture
- aria-hidden="true"
- >
- {{- if .account.AvatarAttachment }}
- <source
- class="avatar"
- srcset="{{- .account.AvatarStatic -}}"
- type="{{- .account.AvatarAttachment.PreviewMIMEType -}}"
- media="(prefers-reduced-motion: reduce)"
- />
- {{- end }}
- <img
- class="avatar u-photo"
- src="{{- .account.Avatar -}}"
- alt="{{- template "avatarAlt" . -}}"
- title="{{- template "avatarAlt" . -}}"
- width="{{- template "avatarWidth" . -}}"
- height="{{- template "avatarHeight" . -}}"
- />
- </picture>
- </a>
-</div>
-{{- end }}
-{{- end -}}
-
{{- with . }}
<main class="profile h-card">
- <h2 class="sr-only">Profile for {{ .account.Username -}}</h2>
- <section class="profile-header" role="region" aria-label="Basic info">
- {{- if .account.Moved }}
- {{- include "profileMovedTo" . | indent 2 }}
- {{- end }}
- <div class="header-image-wrapper">
- <picture>
- {{- if .account.HeaderAttachment }}
- <source
- srcset="{{- .account.HeaderStatic -}}"
- type="{{- .account.HeaderAttachment.PreviewMIMEType -}}"
- media="(prefers-reduced-motion: reduce)"
- />
- {{- end }}
- <img
- src="{{- .account.Header -}}"
- alt="{{- template "headerAlt" . -}}"
- title="{{- template "headerAlt" . -}}"
- />
- </picture>
- </div>
- <div class="basic-info">
- {{- with . }}
- {{- include "avatar" . | indent 3 }}
- {{- end }}
- <dl class="namerole">
- <dt class="sr-only">Display name</dt>
- <dd class="displayname text-cutoff p-name">
- {{- if .account.DisplayName -}}
- {{- emojify .account.Emojis (escape .account.DisplayName) -}}
- {{- else -}}
- {{- .account.Username -}}
- {{- end -}}
- </dd>
- <div class="bot-username-wrapper">
- {{- if .account.Bot }}
- <dt class="sr-only">Bot account</dt>
- <dd>
- <span class="sr-only">true</span>
- <div
- class="bot-legend-wrapper"
- aria-hidden="true"
- title="This is a bot account."
- >
- <i class="bot-icon fa fa-microchip"></i>
- <span class="bot-legend">bot</span>
- </div>
- </dd>
- {{- end }}
- <dt class="sr-only">Username</dt>
- <dd class="username text-cutoff p-nickname">@{{- .account.Username -}}@{{- .instance.AccountDomain -}}</dd>
- </div>
- {{- if .account.Roles }}
- <dt class="sr-only">Role</dt>
- {{- range .account.Roles }}
- <dd class="role {{ .Name -}}">{{- .Name -}}</dd>
- {{- end }}
- {{- end }}
- </dl>
- <a class="u-url u-uid hidden" rel="me" href="/@{{- .account.Username -}}"></a>
- </div>
- </section>
+ {{- with . }}
+ {{- include "profile_header.tmpl" . | indent 1 }}
+ {{- end }}
<div class="column-split">
- <section class="about-user" role="region" aria-labelledby="about-header">
- <div class="col-header">
- <h3 id="about-header">About<span class="sr-only">&nbsp;{{- .account.Username -}}</span></h3>
- </div>
- {{- if .account.Fields }}
- {{- include "profile_fields.tmpl" . | indent 3 }}
- {{- end }}
- <h4 class="sr-only">Bio</h4>
- <div class="bio p-note">
- {{- if .account.Note }}
- {{ emojify .account.Emojis (noescape .account.Note) }}
- {{- else }}
- <p>This GoToSocial user hasn't written a bio yet!</p>
- {{- end }}
- </div>
- <h4 class="sr-only">Stats</h4>
- <dl class="accountstats">
- <dt>Joined</dt>
- <dd><time datetime="{{- .account.CreatedAt -}}">{{- .account.CreatedAt | timestampVague -}}</time></dd>
- <dt>Posts</dt>
- <dd>{{- .account.StatusesCount -}}</dd>
- <dt>Followed by</dt>
- <dd>{{- if .account.HideCollections -}}<i>hidden</i>{{- else -}}{{- .account.FollowersCount -}}{{- end -}}</dd>
- <dt>Following</dt>
- <dd>{{- if .account.HideCollections -}}<i>hidden</i>{{- else -}}{{- .account.FollowingCount -}}{{- end -}}</dd>
- </dl>
- </section>
+ {{- with . }}
+ {{- include "profile_about_user.tmpl" . | indent 2 }}
+ {{- end }}
<div class="statuses-wrapper" role="region" aria-label="Posts by {{ .account.Username -}}">
{{- if .pinned_statuses }}
<section class="pinned statuses h-feed" aria-labelledby="pinned">
diff --git a/web/template/profile_about_user.tmpl b/web/template/profile_about_user.tmpl
new file mode 100644
index 000000000..7f3ce0e97
--- /dev/null
+++ b/web/template/profile_about_user.tmpl
@@ -0,0 +1,56 @@
+{{- /*
+// GoToSocial
+// Copyright (C) GoToSocial Authors admin@gotosocial.org
+// SPDX-License-Identifier: AGPL-3.0-or-later
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/ -}}
+
+{{- with . }}
+<section class="about-user" role="region" aria-labelledby="about-header">
+ <div class="col-header">
+ <h3 id="about-header">About<span class="sr-only">&nbsp;{{- .account.Username -}}</span></h3>
+ </div>
+ {{- if .account.Fields }}
+ {{- include "profile_fields.tmpl" . | indent 1 }}
+ {{- end }}
+ <h4 class="sr-only">Bio</h4>
+ <div class="bio p-note">
+ {{- if .account.Note }}
+ {{ emojify .account.Emojis (noescape .account.Note) }}
+ {{- else }}
+ <p>This GoToSocial user hasn't written a bio yet!</p>
+ {{- end }}
+ </div>
+ <h4 class="sr-only">Stats</h4>
+ <dl class="accountstats">
+ <div class="stats-item">
+ <dt class="joineddt text-cutoff">Joined</dt>
+ <dd class="joineddd text-cutoff"><time datetime="{{- .account.CreatedAt -}}">{{- .account.CreatedAt | timestampVague -}}</time></dd>
+ </div>
+ <div class="stats-item">
+ <dt class="postsdt text-cutoff">Posts</dt>
+ <dd class="postsdd text-cutoff">{{- .account.StatusesCount -}}</dd>
+ </div>
+ <div class="stats-item">
+ <dt class="followeddt text-cutoff">Followed by</dt>
+ <dd class="followeddd text-cutoff">{{- if .account.HideCollections -}}<i>hidden</i>{{- else -}}{{- .account.FollowersCount -}}{{- end -}}</dd>
+ </div>
+ <div class="stats-item">
+ <dt class="followingdt text-cutoff">Following</dt>
+ <dd class="followingdd text-cutoff">{{- if .account.HideCollections -}}<i>hidden</i>{{- else -}}{{- .account.FollowingCount -}}{{- end -}}</dd>
+ </div>
+ </dl>
+</section>
+{{- end }} \ No newline at end of file
diff --git a/web/template/profile_header.tmpl b/web/template/profile_header.tmpl
new file mode 100644
index 000000000..4be900287
--- /dev/null
+++ b/web/template/profile_header.tmpl
@@ -0,0 +1,185 @@
+{{- /*
+// GoToSocial
+// Copyright (C) GoToSocial Authors admin@gotosocial.org
+// SPDX-License-Identifier: AGPL-3.0-or-later
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/ -}}
+
+{{- define "profileMovedTo" -}}
+{{- with .account.Moved }}
+<div class="moved-to">
+ <b>
+ ℹ️ This account has permanently moved to
+ <a
+ href="{{ .URL }}"
+ class="nounderline"
+ rel="nofollow noreferrer noopener"
+ target="_blank"
+ >
+ @{{ .Username }}
+ </a>
+ </b>
+</div>
+{{- end }}
+{{- end -}}
+
+{{- define "defaultAvatarDimension" -}}
+{{- /* 136 is the default width/height for 8.5rem avatars, double it to get a good look when expanded. */ -}}
+272
+{{- end -}}
+
+{{- define "avatarWidth" -}}
+{{- with .account }}
+ {{- if isNil .AvatarAttachment -}}
+ {{- template "defaultAvatarDimension" . -}}
+ {{- else -}}
+ {{- /* Use the avatar's proper dimensions. */ -}}
+ {{- .AvatarAttachment.Meta.Original.Width -}}
+ {{- end -}}
+{{- end }}
+{{- end -}}
+
+{{- define "avatarHeight" -}}
+{{- with .account }}
+ {{- if isNil .AvatarAttachment -}}
+ {{- template "defaultAvatarDimension" . -}}
+ {{- else -}}
+ {{- /* Use the avatar's proper dimensions. */ -}}
+ {{- .AvatarAttachment.Meta.Original.Height -}}
+ {{- end -}}
+{{- end }}
+{{- end -}}
+
+{{- define "avatarAlt" -}}
+ Avatar for {{ .account.Username -}}
+ {{- if .account.AvatarDescription }}
+ {{- /* Add the avatar's image description. */ -}}
+ : {{ .account.AvatarDescription -}}
+ {{- end -}}
+{{- end -}}
+
+{{- define "headerAlt" -}}
+ Header for {{ .account.Username -}}
+ {{- if .account.HeaderDescription }}
+ {{- /* Add the header's image description. */ -}}
+ : {{ .account.HeaderDescription -}}
+ {{- end -}}
+{{- end -}}
+
+{{- define "avatar" -}}
+{{- with . }}
+<div
+ class="photoswipe-gallery odd single avatar-image-wrapper"
+ role="group"
+>
+ <a
+ class="photoswipe-slide"
+ href="{{- .account.Avatar -}}"
+ target="_blank"
+ data-pswp-width="{{- template "avatarWidth" . -}}px"
+ data-pswp-height="{{- template "avatarHeight" . -}}px"
+ data-cropped="true"
+ alt="{{- template "avatarAlt" . -}}"
+ title="{{- template "avatarAlt" . -}}"
+ >
+ <picture
+ aria-hidden="true"
+ >
+ {{- if .account.AvatarAttachment }}
+ <source
+ class="avatar"
+ srcset="{{- .account.AvatarStatic -}}"
+ type="{{- .account.AvatarAttachment.PreviewMIMEType -}}"
+ media="(prefers-reduced-motion: reduce)"
+ />
+ {{- end }}
+ <img
+ class="avatar u-photo"
+ src="{{- .account.Avatar -}}"
+ alt="{{- template "avatarAlt" . -}}"
+ title="{{- template "avatarAlt" . -}}"
+ width="{{- template "avatarWidth" . -}}"
+ height="{{- template "avatarHeight" . -}}"
+ />
+ </picture>
+ </a>
+</div>
+{{- end }}
+{{- end -}}
+
+{{- with . }}
+<h2 class="sr-only">Profile for {{ .account.Username -}}</h2>
+<section class="profile-header" role="region" aria-label="Basic info">
+ {{- if .account.Moved }}
+ {{- include "profileMovedTo" . | indent 2 }}
+ {{- end }}
+ <div class="header-image-wrapper">
+ <picture>
+ {{- if .account.HeaderAttachment }}
+ <source
+ srcset="{{- .account.HeaderStatic -}}"
+ type="{{- .account.HeaderAttachment.PreviewMIMEType -}}"
+ media="(prefers-reduced-motion: reduce)"
+ />
+ {{- end }}
+ <img
+ src="{{- .account.Header -}}"
+ alt="{{- template "headerAlt" . -}}"
+ title="{{- template "headerAlt" . -}}"
+ />
+ </picture>
+ </div>
+ <div class="basic-info">
+ {{- with . }}
+ {{- include "avatar" . | indent 3 }}
+ {{- end }}
+ <dl class="namerole">
+ <dt class="sr-only">Display name</dt>
+ <dd class="displayname text-cutoff p-name">
+ {{- if .account.DisplayName -}}
+ {{- emojify .account.Emojis (escape .account.DisplayName) -}}
+ {{- else -}}
+ {{- .account.Username -}}
+ {{- end -}}
+ </dd>
+ <div class="bot-username-wrapper">
+ {{- if .account.Bot }}
+ <dt class="sr-only">Bot account</dt>
+ <dd>
+ <span class="sr-only">true</span>
+ <div
+ class="bot-legend-wrapper"
+ aria-hidden="true"
+ title="This is a bot account."
+ >
+ <i class="bot-icon fa fa-microchip"></i>
+ <span class="bot-legend">bot</span>
+ </div>
+ </dd>
+ {{- end }}
+ <dt class="sr-only">Username</dt>
+ <dd class="username text-cutoff p-nickname">@{{- .account.Username -}}@{{- .instance.AccountDomain -}}</dd>
+ </div>
+ {{- if .account.Roles }}
+ <dt class="sr-only">Role</dt>
+ {{- range .account.Roles }}
+ <dd class="role {{ .Name -}}">{{- .Name -}}</dd>
+ {{- end }}
+ {{- end }}
+ </dl>
+ <a class="u-url u-uid hidden" rel="me" href="/@{{- .account.Username -}}"></a>
+ </div>
+</section>
+{{- end }} \ No newline at end of file
diff --git a/web/template/status.tmpl b/web/template/status.tmpl
index 85000fd72..872b784ed 100644
--- a/web/template/status.tmpl
+++ b/web/template/status.tmpl
@@ -30,6 +30,16 @@
it in an appropriate <article></article>!
*/ -}}
+{{- /* Produces something like "1 attachment", "2 attachments", etc */ -}}
+{{- define "attachmentsLength" -}}
+{{- (len .) }}{{- if eq (len .) 1 }} attachment{{- else }} attachments{{- end -}}
+{{- end -}}
+
+{{- /* Produces something like "media photoswipe-gallery odd single" */ -}}
+{{- define "galleryClass" -}}
+media photoswipe-gallery {{ (len .) | oddOrEven }} {{ if eq (len .) 1 }}single{{ else if eq (len .) 2 }}double{{ end }}
+{{- end -}}
+
{{- with . }}
<header class="status-header">
{{- include "status_header.tmpl" . | indent 1 }}
@@ -63,7 +73,15 @@
</div>
{{- end }}
{{- if .MediaAttachments }}
- {{- include "status_attachments.tmpl" . | indent 1 }}
+ <div
+ class="{{- template "galleryClass" .MediaAttachments -}}"
+ role="group"
+ aria-label="{{- template "attachmentsLength" .MediaAttachments -}}"
+ >
+ {{- range $index, $media := .MediaAttachments }}
+ {{- includeIndex "status_attachment.tmpl" $media $index | indent 2 }}
+ {{- end }}
+ </div>
{{- end }}
</div>
<aside class="status-info" aria-hidden="true">
diff --git a/web/template/status_attachment.tmpl b/web/template/status_attachment.tmpl
new file mode 100644
index 000000000..bdfafa96f
--- /dev/null
+++ b/web/template/status_attachment.tmpl
@@ -0,0 +1,179 @@
+{{- /*
+// GoToSocial
+// Copyright (C) GoToSocial Authors admin@gotosocial.org
+// SPDX-License-Identifier: AGPL-3.0-or-later
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/ -}}
+
+{{- define "imagePreview" }}
+<img
+ src="{{- .PreviewURL -}}"
+ loading="lazy"
+ {{- if .Description }}
+ alt="{{- .Description -}}"
+ title="{{- .Description -}}"
+ {{- end }}
+ width="{{- .Meta.Original.Width -}}"
+ height="{{- .Meta.Original.Height -}}"
+/>
+{{- end }}
+
+{{- define "videoPreview" }}
+<img
+ src="{{- .PreviewURL -}}"
+ loading="lazy"
+ {{- if .Description }}
+ alt="{{- .Description -}}"
+ title="{{- .Description -}}"
+ {{- end }}
+ width="{{- .Meta.Small.Width -}}"
+ height="{{- .Meta.Small.Height -}}"
+/>
+{{- end }}
+
+{{- define "audioPreview" }}
+{{- if and .PreviewURL .Meta.Small.Width }}
+<img
+ src="{{- .PreviewURL -}}"
+ loading="lazy"
+ {{- if .Description }}
+ alt="{{- .Description -}}"
+ title="{{- .Description -}}"
+ {{- end }}
+ width="{{- .Meta.Small.Width -}}"
+ height="{{- .Meta.Small.Height -}}"
+/>
+{{- else }}
+<img
+ src="/assets/logo.webp"
+ loading="lazy"
+ {{- if .Description }}
+ alt="{{- .Description -}}"
+ title="{{- .Description -}}"
+ {{- end }}
+ width="518"
+ height="460"
+/>
+{{- end }}
+{{- end }}
+
+{{- with . }}
+<div class="media-wrapper">
+ <details class="{{- .Item.Type -}}-spoiler media-spoiler" {{- if not .Item.Sensitive }} open{{- end -}}>
+ <summary>
+ <div class="show sensitive button" aria-hidden="true">Show sensitive</div>
+ <span class="eye button" role="button" tabindex="0" aria-label="Toggle media">
+ <i class="hide fa fa-fw fa-eye-slash" aria-hidden="true"></i>
+ <i class="show fa fa-fw fa-eye" aria-hidden="true"></i>
+ </span>
+ {{- if or (eq .Item.Type "video") (eq .Item.Type "gifv") }}
+ {{- include "videoPreview" .Item | indent 3 }}
+ {{- else if eq .Item.Type "image" }}
+ {{- include "imagePreview" .Item | indent 3 }}
+ {{- else if eq .Item.Type "audio" }}
+ {{- include "audioPreview" .Item | indent 3 }}
+ {{- end }}
+ </summary>
+ {{- if or (eq .Item.Type "video") (eq .Item.Type "gifv") }}
+ <video
+ {{- if eq .Item.Type "video" }}
+ preload="none"
+ {{- else }}
+ preload="auto"
+ muted
+ {{- end }}
+ class="plyr-video photoswipe-slide{{- if eq .Item.Type "gifv" }} gifv{{ end }}"
+ controls
+ playsinline
+ data-pswp-index="{{- .Index -}}"
+ data-pswp-parent-status="{{- .Item.ParentStatusLink -}}"
+ data-pswp-attachment-id="{{- .Item.ID -}}"
+ poster="{{- .Item.PreviewURL -}}"
+ data-pswp-width="{{- .Item.Meta.Original.Width -}}px"
+ data-pswp-height="{{- .Item.Meta.Original.Height -}}px"
+ {{- if .Item.Description }}
+ alt="{{- .Item.Description -}}"
+ title="{{- .Item.Description -}}"
+ {{- end }}
+ >
+ <source type="{{- .Item.MIMEType -}}" src="{{- .Item.URL -}}"/>
+ </video>
+ {{- else if eq .Item.Type "audio" }}
+ <video
+ preload="none"
+ class="plyr-video photoswipe-slide"
+ controls
+ playsinline
+ data-pswp-index="{{- .Index -}}"
+ data-pswp-parent-status="{{- .Item.ParentStatusLink -}}"
+ data-pswp-attachment-id="{{- .Item.ID -}}"
+ {{- if and .Item.PreviewURL .Item.Meta.Small.Width }}
+ poster="{{- .Item.PreviewURL -}}"
+ data-pswp-width="{{- .Item.Meta.Small.Width -}}px"
+ data-pswp-height="{{- .Item.Meta.Small.Height -}}px"
+ {{- else }}
+ poster="/assets/logo.webp"
+ width="518px"
+ height="460px"
+ {{- end }}
+ {{- if .Item.Description }}
+ alt="{{- .Item.Description -}}"
+ title="{{- .Item.Description -}}"
+ {{- end }}
+ >
+ <source type="{{- .Item.MIMEType -}}" src="{{- .Item.URL -}}"/>
+ </video>
+ {{- else if eq .Item.Type "image" }}
+ <a
+ class="photoswipe-slide"
+ data-pswp-index="{{- .Index -}}"
+ data-pswp-parent-status="{{- .Item.ParentStatusLink -}}"
+ data-pswp-attachment-id="{{- .Item.ID -}}"
+ href="{{- .Item.URL -}}"
+ target="_blank"
+ data-pswp-width="{{- .Item.Meta.Original.Width -}}px"
+ data-pswp-height="{{- .Item.Meta.Original.Height -}}px"
+ data-cropped="true"
+ {{- if .Item.Description }}
+ alt="{{- .Item.Description -}}"
+ title="{{- .Item.Description -}}"
+ {{- end }}
+ >
+ {{- with .Item }}
+ {{- include "imagePreview" . | indent 3 }}
+ {{- end }}
+ </a>
+ {{- else }}
+ <a
+ class="unknown-attachment"
+ href="{{- .Item.RemoteURL -}}"
+ rel="nofollow noreferrer noopener"
+ target="_blank"
+ {{- if .Item.Description }}
+ title="Open external media: {{ .Item.Description -}}&#10;&#13;{{- .Item.RemoteURL -}}"
+ {{- else }}
+ title="Open external media.&#10;&#13;{{- .Item.RemoteURL -}}"
+ {{- end }}
+ >
+ <div class="placeholder" aria-hidden="true">
+ <i class="placeholder-external-link fa fa-external-link"></i>
+ <i class="placeholder-icon fa fa-file-text"></i>
+ <div class="placeholder-link-to">External media</div>
+ </div>
+ </a>
+ {{- end }}
+ </details>
+</div>
+{{- end }} \ No newline at end of file
diff --git a/web/template/status_attachments.tmpl b/web/template/status_attachments.tmpl
deleted file mode 100644
index ee564d934..000000000
--- a/web/template/status_attachments.tmpl
+++ /dev/null
@@ -1,195 +0,0 @@
-{{- /*
-// GoToSocial
-// Copyright (C) GoToSocial Authors admin@gotosocial.org
-// SPDX-License-Identifier: AGPL-3.0-or-later
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/ -}}
-
-{{- /*
- Template for rendering a gallery of status media attachments.
- To use this template, pass a web view status into it.
-*/ -}}
-
-{{- define "imagePreview" }}
-<img
- src="{{- .PreviewURL -}}"
- loading="lazy"
- {{- if .Description }}
- alt="{{- .Description -}}"
- title="{{- .Description -}}"
- {{- end }}
- width="{{- .Meta.Original.Width -}}"
- height="{{- .Meta.Original.Height -}}"
-/>
-{{- end }}
-
-{{- define "videoPreview" }}
-<img
- src="{{- .PreviewURL -}}"
- loading="lazy"
- {{- if .Description }}
- alt="{{- .Description -}}"
- title="{{- .Description -}}"
- {{- end }}
- width="{{- .Meta.Small.Width -}}"
- height="{{- .Meta.Small.Height -}}"
-/>
-{{- end }}
-
-{{- define "audioPreview" }}
-{{- if and .PreviewURL .Meta.Small.Width }}
-<img
- src="{{- .PreviewURL -}}"
- loading="lazy"
- {{- if .Description }}
- alt="{{- .Description -}}"
- title="{{- .Description -}}"
- {{- end }}
- width="{{- .Meta.Small.Width -}}"
- height="{{- .Meta.Small.Height -}}"
-/>
-{{- else }}
-<img
- src="/assets/logo.webp"
- loading="lazy"
- {{- if .Description }}
- alt="{{- .Description -}}"
- title="{{- .Description -}}"
- {{- end }}
- width="518"
- height="460"
-/>
-{{- end }}
-{{- end }}
-
-{{- /* Produces something like "1 attachment", "2 attachments", etc */ -}}
-{{- define "attachmentsLength" -}}
-{{- (len .) }}{{- if eq (len .) 1 }} attachment{{- else }} attachments{{- end -}}
-{{- end -}}
-
-{{- /* Produces something like "media photoswipe-gallery odd single" */ -}}
-{{- define "galleryClass" -}}
-media photoswipe-gallery {{ (len .) | oddOrEven }} {{ if eq (len .) 1 }}single{{ else if eq (len .) 2 }}double{{ end }}
-{{- end -}}
-
-{{- with .MediaAttachments }}
-<div
- class="{{- template "galleryClass" . -}}"
- role="group"
- aria-label="{{- template "attachmentsLength" . -}}"
->
- {{- range $index, $media := . }}
- <div class="media-wrapper">
- <details class="{{- $media.Type -}}-spoiler media-spoiler" {{- if not $media.Sensitive }} open{{- end -}}>
- <summary>
- <div class="show sensitive button" aria-hidden="true">Show sensitive media</div>
- <span class="eye button" role="button" tabindex="0" aria-label="Toggle media">
- <i class="hide fa fa-fw fa-eye-slash" aria-hidden="true"></i>
- <i class="show fa fa-fw fa-eye" aria-hidden="true"></i>
- </span>
- {{- if or (eq .Type "video") (eq .Type "gifv") }}
- {{- include "videoPreview" $media | indent 4 }}
- {{- else if eq .Type "image" }}
- {{- include "imagePreview" $media | indent 4 }}
- {{- else if eq .Type "audio" }}
- {{- include "audioPreview" $media | indent 4 }}
- {{- end }}
- </summary>
- {{- if or (eq .Type "video") (eq .Type "gifv") }}
- <video
- {{- if eq .Type "video" }}
- preload="none"
- {{- else }}
- preload="auto"
- muted
- {{- end }}
- class="plyr-video photoswipe-slide{{- if eq .Type "gifv" }} gifv{{ end }}"
- controls
- playsinline
- data-pswp-index="{{- $index -}}"
- poster="{{- .PreviewURL -}}"
- data-pswp-width="{{- $media.Meta.Small.Width -}}px"
- data-pswp-height="{{- $media.Meta.Small.Height -}}px"
- {{- if .Description }}
- alt="{{- $media.Description -}}"
- title="{{- $media.Description -}}"
- {{- end }}
- >
- <source type="{{- $media.MIMEType -}}" src="{{- $media.URL -}}"/>
- </video>
- {{- else if eq .Type "audio" }}
- <video
- preload="none"
- class="plyr-video photoswipe-slide"
- controls
- playsinline
- data-pswp-index="{{- $index -}}"
- {{- if and $media.PreviewURL $media.Meta.Small.Width }}
- poster="{{- .PreviewURL -}}"
- data-pswp-width="{{- $media.Meta.Small.Width -}}px"
- data-pswp-height="{{- $media.Meta.Small.Height -}}px"
- {{- else }}
- poster="/assets/logo.webp"
- width="518px"
- height="460px"
- {{- end }}
- {{- if .Description }}
- alt="{{- $media.Description -}}"
- title="{{- $media.Description -}}"
- {{- end }}
- >
- <source type="{{- $media.MIMEType -}}" src="{{- $media.URL -}}"/>
- </video>
- {{- else if eq .Type "image" }}
- <a
- class="photoswipe-slide"
- href="{{- $media.URL -}}"
- target="_blank"
- data-pswp-width="{{- $media.Meta.Original.Width -}}px"
- data-pswp-height="{{- $media.Meta.Original.Height -}}px"
- data-cropped="true"
- {{- if .Description }}
- alt="{{- $media.Description -}}"
- title="{{- $media.Description -}}"
- {{- end }}
- >
- {{- with $media }}
- {{- include "imagePreview" . | indent 4 }}
- {{- end }}
- </a>
- {{- else }}
- <a
- class="unknown-attachment"
- href="{{- $media.RemoteURL -}}"
- rel="nofollow noreferrer noopener"
- target="_blank"
- {{- if .Description }}
- title="Open external media: {{ $media.Description -}}&#10;&#13;{{- $media.RemoteURL -}}"
- {{- else }}
- title="Open external media.&#10;&#13;{{- $media.RemoteURL -}}"
- {{- end }}
- >
- <div class="placeholder" aria-hidden="true">
- <i class="placeholder-external-link fa fa-external-link"></i>
- <i class="placeholder-icon fa fa-file-text"></i>
- <div class="placeholder-link-to">External media</div>
- </div>
- </a>
- {{- end }}
- </details>
- </div>
- {{- end }}
-</div>
-{{- end }} \ No newline at end of file
diff --git a/web/template/status_info.tmpl b/web/template/status_info.tmpl
index 5d26811d7..194a799f5 100644
--- a/web/template/status_info.tmpl
+++ b/web/template/status_info.tmpl
@@ -17,36 +17,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ -}}
-{{- define "visibility_icon" -}}
- {{- if eq .Visibility "public" -}}
- globe
- {{- else if eq .Visibility "unlisted" -}}
- unlock
- {{- else -}}
- question
- {{- end -}}
-{{- end -}}
-
-{{- define "visibility_title" -}}
- {{- if eq .Visibility "public" -}}
- Public
- {{- else if eq .Visibility "unlisted" -}}
- Unlisted
- {{- else -}}
- Unknown
- {{- end -}}
-{{- end -}}
-
{{- with . }}
<dl class="status-stats">
<div class="stats-grouping">
- <div class="stats-item visibility-level" title="{{- template "visibility_title" . -}}">
- <dt class="sr-only">Visibility</dt>
- <dd>
- <i class="fa fa-{{- template "visibility_icon" . -}}" aria-hidden="true"></i>
- <span class="sr-only">{{- template "visibility_title" . -}}</span>
- </dd>
- </div>
<div class="stats-item published-at text-cutoff">
<dt class="sr-only">Published</dt>
<dd>
@@ -57,7 +30,7 @@
<div class="stats-item edited-at text-cutoff">
<dt class="sr-only">Edited</dt>
<dd>
- edited <time class="dt-updated" datetime="{{- .EditedAt -}}">{{- .EditedAt | timestampPrecise -}}</time>
+ (edited <time class="dt-updated" datetime="{{- .EditedAt -}}">{{- .EditedAt | timestampPrecise -}}</time>)
</dd>
</div>
{{ end }}