roundabout,
created on Friday, 3 January 2025, 13:16:14 (1735910174),
received on Friday, 3 January 2025, 13:59:35 (1735912775)
Author identity: vlad <vlad.muntoiu@gmail.com>
85f84a32f7d4b840022ccf1f1edf3aae5fe2fc22
static/efficient-ui
@@ -1 +1 @@
Subproject commit 85d3e19a4ddf478cc9ca665b3695316dcd5efbff
Subproject commit 30b18afca348bd1168ee40ef9d11b1fb8fd502b9
static/style.css
@@ -16,6 +16,7 @@
--4-star: #FBC02D;
--5-star: #CDDC39;
view-transition-name: root;
--reserved-height-top: 0;
}
.ripple-pad {
@@ -225,10 +226,6 @@ iconify-icon {
stroke-opacity: 1;
}
@view-transition {
navigation: auto;
}
@keyframes move-out {
from {
transform: scale(1);
@@ -251,12 +248,12 @@ iconify-icon {
}
}
.thumbnail-list > li:is(:hover, :focus, :has(:focus)) > a > .annotation-zone,
#annotation-zone {
view-transition-name: thumbnail;
}
@media (prefers-reduced-motion: no-preference) {
.thumbnail-list > li:is(:hover, :focus, :has(:focus)) > a > .annotation-zone,
#annotation-zone {
view-transition-name: thumbnail;
}
::view-transition-old(root),
::view-transition-new(root) {
transform-origin: top;
@@ -281,7 +278,7 @@ iconify-icon {
animation-duration: 0s;
}
::view-transition-group(navbar) {
::view-transition-group(navbar), ::view-transition-group(navbar-mobile) {
animation-duration: 0.5s;
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
}
@@ -437,17 +434,31 @@ dd {
margin-left: 40px;
}
#mobile-navbar {
#mobile-navbar, #mobile-navbar-spacer {
display: none;
}
@media screen and (max-width: 576px) {
@media screen and (max-width: 896px) {
#mobile-navbar {
display: flex;
}
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 3;
}
#mobile-navbar-spacer {
display: block;
height: var(--height-navbar);
}
#desktop-navbar {
display: none;
}
:root {
--reserved-height-top: var(--height-navbar);
}
}
#hamburger > nav {
@@ -584,7 +595,7 @@ dd {
#picture-actions {
--width: 256px;
position: sticky;
top: 0;
top: var(--reserved-height-top);
overflow: auto;
max-height: 100vh;
height: 100%;
@@ -667,3 +678,36 @@ dd {
left: calc(-1 * (50vw - 50%));
}
}
.navbar > ul {
max-width: 100%;
}
#desktop-navbar > ul:first-child { /* list containing title */
flex: 0 1 auto;
min-width: 0;
}
#desktop-navbar > ul:last-child { /* list containing navigation */
flex: 1 0 auto;
justify-content: end;
}
#mobile-navbar-title, #desktop-navbar-title {
font: var(--h5-font);
font-weight: 700;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 0 1 auto;
min-width: 0;
}
nav .button-flat {
--color-flat-button-hover: transparent;
--color-flat-button-active: transparent;
}
nav .button-flat .ripple-pad {
background: #ffffff99;
}
templates/create-gallery.html
@@ -1,11 +1,11 @@
{% extends "default.html" %}
{% block nav_title %}Create gallery{% endblock %}
{% block title %}Create gallery | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 768px">
<form method="POST" class="vbox">
<h1>Create gallery</h1>
<p>
You can add content later.
</p>
templates/default.html
@@ -7,6 +7,13 @@
<link rel="stylesheet" href="/static/style.css">
<script src="https://cdn.jsdelivr.net/npm/iconify-icon@2.1.0/dist/iconify-icon.min.js"></script>
</head>
<style>
@media (prefers-reduced-motion: no-preference) {
@view-transition {
navigation: auto;
}
}
</style>
<body>
<dialog id="hamburger" class="sheet-left">
<nav>
@@ -33,24 +40,44 @@
<header>
<nav class="navbar" id="mobile-navbar">
<ul>
<li id="hamburger-button">
<button class="button-flat button-neutral" onclick="document.getElementById('hamburger').showModal()">
<iconify-icon icon="ic:baseline-menu">Menu</iconify-icon>
</button>
{% if back_url %}
<li id="back-button">
<a class="button button-flat button-neutral" href="{{ back_url | safe }}">
<iconify-icon icon="ic:baseline-arrow-back">Back</iconify-icon>
</a>
</li>
{% else %}
<li id="hamburger-button">
<button class="button-flat button-neutral" onclick="document.getElementById('hamburger').showModal()">
<iconify-icon icon="ic:baseline-menu">Menu</iconify-icon>
</button>
</li>
{% endif %}
<li id="mobile-navbar-title">
{% block nav_title %}{% endblock %}
</li>
</ul>
</nav>
<nav class="navbar" id="desktop-navbar">
<ul>
{% if back_url %}
<li id="back-button">
<a class="button button-flat button-neutral" href="{{ back_url | safe }}">
<iconify-icon icon="ic:baseline-arrow-back">Back</iconify-icon>
</a>
</li>
{% endif %}
<li id="desktop-navbar-title">{{ self.nav_title() }}</li> {# copy the block #}
</ul>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/object/">Object list</a></li>
<li><a href="/query-pictures">Query</a></li>
<li><a href="/info/">Help</a></li>
{% if session.username %}
<li><a href="/upload">Upload</a></li> <li><a href="/create-gallery">New gallery</a>
<li><a href="/upload">Upload</a></li>
<li><a href="/create-gallery">New gallery</a>
{% endif %}
</ul>
<ul>
{% if session.username %}
<li><a href="/profile/{{ session.username }}">Profile: {{ session.username }}</a></li>
<li><a href="/logout">Log out</a></li>
@@ -60,6 +87,7 @@
</ul>
</nav>
</header>
<div id="mobile-navbar-spacer"></div>
<main>
{% block content %}{% endblock %}
</main>
templates/edit-gallery.html
@@ -1,13 +1,11 @@
{% extends "default.html" %}
{% block title %}Editing {{ gallery.title }} | {{ site_name }}{% endblock %}
{% block nav_title %}{{ gallery.title }}{% endblock %}
{% block title %}Edit gallery '{{ gallery.title }}' | {{ site_name }}{% endblock %}
{% set back_url = "/gallery/" + gallery.id|string %}
{% block content %}
<x-frame style="--width: 768px" class="vbox">
<h1>Editing: {{ gallery.title }}</h1>
<p>
<a href="/gallery/{{ gallery.id }}/">Back</a>
</p>
<form method="POST" class="vbox">
<label>
<span class="required-asterisk">Title</span>
templates/edit-picture.html
@@ -1,12 +1,11 @@
{% extends "default.html" %}
{% block title %}Editing picture {{ resource.title }} | {{ site_name }}{% endblock %}
{% block nav_title %}Edit '{{ resource.title }}'{% endblock %}
{% block title %}Edit picture '{{ resource.title }}' | {{ site_name }}{% endblock %}
{% set back_url = "/picture/" + resource.id|string %}
{% block content %}
<x-frame style="--width: 768px">
<h1>Editing: {{ resource.title }}</h1>
<p>{{ resource.description }}</p>
<p>
<a href="/picture/{{ resource.id }}/">Back</a>
</p>
<form class="vbox" method="POST">
<label>
<span class="required-asterisk">Title</span>
templates/gallery-users.html
@@ -1,11 +1,11 @@
{% extends "default.html" %}
{% block nav_title %}{{ gallery.title }}{% endblock %}
{% block title %}Users of {{ gallery.title }} | {{ site_name }}{% endblock %}
{% set back_url = "/gallery/" + gallery.id|string %}
{% block content %}
<x-frame style="--width: 768px" class="vbox">
<h1>Users: {{ gallery.title }}</h1>
<p>{{ gallery.description }}</p>
{% if have_permission %}
<form class="buttonbox" method="POST" action="/gallery/{{ gallery.id }}/users/add">
<input name="username" type="text" placeholder="Username" required aria-label="Username">
templates/gallery.html
@@ -1,5 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}{{ gallery.title }}{% endblock %}
{% block title %}Gallery {{ gallery.title }} | {{ site_name }}{% endblock %}
{% block content %}
templates/graphical-query-pictures-results.html
@@ -1,5 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}Query results{% endblock %}
{% block title %}Picture query results | {{ site_name }}{% endblock %}
{% block content %}
templates/graphical-query-pictures.html
@@ -1,10 +1,10 @@
{% extends "default.html" %}
{% block nav_title %}Query pictures{% endblock %}
{% block title %}Query pictures | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 768px" class="vbox">
<h1>Query pictures</h1>
<form method="GET" action="/query-pictures-results" class="vbox">
<label>
<span class="required-asterisk">Query YAML</span>
templates/help.html
@@ -1,5 +1,8 @@
{% extends "default.html" %}
{% block nav_title %}Help{% endblock %}
{% block title %}Help | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 768px; padding: 1rem;">
{{ content | safe }}
templates/home.html
@@ -1,4 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}Home{% endblock %}
{% block title %}Home | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 768px">
templates/login.html
@@ -1,4 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}Log in{% endblock %}
{% block title %}Log in | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 384px" class="vbox">
templates/object-types.html
@@ -1,5 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}Objects{% endblock %}
{% block title %}List of objects | {{ site_name }}{% endblock %}
{% block content %}
templates/object.html
@@ -1,4 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}{{ object.id }}{% endblock %}
{% block title %}Object {{ object.id }} | {{ site_name }}{% endblock %}
{% block content %}
templates/picture-annotation.html
@@ -1,5 +1,9 @@
{% extends "default.html" %}
{% block nav_title %}{{ resource.title }}{% endblock %}
{% block title %}Annotating picture {{ resource.title }} | {{ site_name }}{% endblock %}
{% set back_url = "/picture/" + resource.id|string %}
{% block content %}
<style>
py-script {
templates/picture.html
@@ -1,4 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}{{ resource.title }}{% endblock %}
{% block title %}Picture {{ resource.title }} | {{ site_name }}{% endblock %}
{% macro shape_label(x, y, text) %}
{% if text %}
templates/profile.html
@@ -1,5 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}{{ user.formatted_name }}{% endblock %}
{% block title %}{{ user.formatted_name }}'s profile | {{ site_name }}{% endblock %}
{% block content %}
templates/put-annotations-form.html
@@ -1,9 +1,10 @@
{% extends "default.html" %}
{% block title %}Submit JSON annotations | {{ site_name }}{% endblock %}
{% block nav_title %}{{ resource.title }}{% endblock %}
{% block title %}Submit JSON annotations for {{ resource.title }} | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 768px">
<form method="POST" class="vbox">
<h1>Submit JSON annotations: {{ resource.title }}</h1>
<p>
Submit JSON annotations for the picture <a href="/picture/{{ resource.id }}">{{ resource.title }}</a>.
Check the documentation for the expected format.
templates/upload.html
@@ -1,4 +1,6 @@
{% extends "default.html" %}
{% block nav_title %}Upload{% endblock %}
{% block title %}Upload | {{ site_name }}{% endblock %}
{% block content %}
<x-frame style="--width: 768px">