roundabout,
created on Saturday, 6 January 2024, 10:22:00 (1704536520),
received on Wednesday, 31 July 2024, 06:54:40 (1722408880)
Author identity: vlad <vlad.muntoiu@gmail.com>
8f7d1a442dbe8a47c05609ec7f80346b6617a85b
app.py
@@ -304,7 +304,7 @@ def userProfile(username):
repos = Repo.query.filter_by(ownerName=username, visibility=2)
return flask.render_template("user-profile-repositories.html", user=user, repos=repos, relationship=oldRelationship)
case "followers":
return flask.render_template("user-profile-followers.html", user=user, repos=repos, relationship=oldRelationship)
return flask.render_template("user-profile-followers.html", user=user, relationship=oldRelationship)
case _:
return flask.render_template("user-profile-overview.html", user=user, relationship=oldRelationship)
static/marquee.js
@@ -0,0 +1,14 @@
function isOverflown(e) {
return e.scrollWidth > e.clientWidth;
}
let marquees = document.querySelectorAll(".inner-thumbnail-marquee");
for(const e of marquees) {
if(isOverflown(e)) {
e.style.animationPlayState = "running";
e.style.transform = "translateX(100%)";
} else {
e.style.animation = "none";
};
};
static/style.css
@@ -163,4 +163,28 @@ dd {
.dialog-tools {
position: relative;
left: 8px;
}
.thumbnail-marquee {
height: 1.5em;
overflow: hidden;
position: relative;
}
.inner-thumbnail-marquee {
position: absolute;
width: 100%;
height: 100%;
overflow: visible;
text-align: center;
animation: marquee 3000ms linear infinite;
}
@keyframes marquee {
0% {
transform: translateX(200%);
}
100% {
transform: translateX(-200%);
}
}
templates/default.html
@@ -115,4 +115,6 @@
<script src="/static/ripples.js"></script>
<script src="/static/efficient-ui/dialogs.js"></script>
<script src="/static/efficient-ui/toasts.js"></script>
{% block scripts %}
{% endblock %}
</html>
templates/user-profile-followers.html
@@ -0,0 +1,21 @@
{% extends "user-profile.html" %}
{% block content %}
<x-frame style="--width: 768px;">
<x-hbox class="wrap homogenous">
{% for follower in user.followers %}
<x-frame style="flex-basis: 96px; --width: 96px;">
<article class="card" style="flex: 0 1 auto;">
<section class="card-main">
<a href="/{{ follower.followed.username }}">
<img class="avatar" src="/info/{{ follower.followed.username }}/avatar" style="width: 100%;">
<div class="thumbnail-marquee">
<span class="inner-thumbnail-marquee" style="animation-play-state: paused;">{{ follower.followed.username }}</span>
</div>
</a>
</section>
</article>
</x-frame>
{% endfor %}
</x-hbox>
</x-frame>
{% endblock %}
templates/user-profile.html
@@ -9,7 +9,8 @@
<nav id="repo-nav" class="navbar">
<ul id="repo-tabs">
<li><a href="?">Overview</a></li>
<li><a href="?action=repositories">Repositories</a></li>
<li><a href="?action=repositories">Repositories ({{ user.repositories | length }})</a></li>
<li><a href="?action=followers">Followers ({{ user.followers | length }})</a></li>
</ul>
<x-buttonbox>
{% if loggedInUser != user.username and loggedInUser %}
@@ -24,3 +25,7 @@
</nav>
{% endblock %}
{% block scripts %}
<script src="/static/marquee.js"></script>
{% endblock %}