roundabout,
created on Sunday, 15 September 2024, 10:45:32 (1726397132),
received on Sunday, 15 September 2024, 10:45:35 (1726397135)
Author identity: vlad <vlad.muntoiu@gmail.com>
ccc6e3fbae2d1a3b39d1a076b3bd860b0e3b0168
static/efficient-ui
@@ -1 +1 @@
Subproject commit de68efc82aa23ebb7a5f007af0f393167e2c4105Subproject commit a98d70311f88ffc0d1551bc96a8a85c64f30fdf5
static/ripples.js
@@ -0,0 +1,32 @@
// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt Apache-2.0 (() => { const rippleHosts = document.querySelectorAll('.button, button:not(.link-button), input, select, .navbar a, .navrail a'); function generateRipple(rippleX, rippleY, rippleDimensions) { const div = document.createElement('div'); div.className = 'ripple-pad'; div.style.width = `${rippleDimensions}px`; div.style.height = `${rippleDimensions}px`; div.style.left = `${rippleX}px`; div.style.top = `${rippleY}px`; div.style.borderRadius = `${rippleDimensions}px`; return div; } for (const host of rippleHosts) { host.addEventListener('mousedown', (event) => { const rect = host.getBoundingClientRect(); const cursorX = event.clientX; const cursorY = event.clientY; const fromTop = cursorY - rect.top; const fromBottom = rect.height - fromTop; const fromLeft = cursorX - rect.left; const fromRight = rect.width - fromLeft; const requiredDimension = Math.ceil(Math.max(fromRight, fromLeft, fromTop, fromBottom)); const ripple = generateRipple(fromLeft - requiredDimension, fromTop - requiredDimension, requiredDimension * 2); host.appendChild(ripple); ripple.addEventListener('animationend', ({ animationName }) => { if (animationName === 'RippleEffect') ripple.remove(); }); }); } })() // @license-end
static/style.css
@@ -18,6 +18,30 @@
/*view-transition-name: root;*/ } .ripple-pad { background: #ffffff99; position: absolute; opacity: 1; transform: scale(0); animation: RippleEffect 375ms cubic-bezier(0, 0.55, 0.45, 1) forwards; } .button-flat .ripple-pad { background: var(--color-primary-3); } @keyframes RippleEffect { to { transform: scale(1); opacity: 0; } } button, input, .button, select { position: relative; overflow: hidden; } nav { /*view-transition-name: nav;*/ }
@@ -599,3 +623,7 @@ dd {
gap: 0.5rch; font-weight: 400; } #picture-buttons { padding: 0 1rem; }
templates/default.html
@@ -94,5 +94,6 @@
{% endwith %} <script src="/static/efficient-ui/dialogs.js"></script> <script src="/static/efficient-ui/toasts.js"></script> <script src="/static/ripples.js"></script></body> </html>
templates/picture.html
@@ -11,27 +11,33 @@
<div id="picture-view"> <x-frame id="picture-actions"> <ul class="action-list"> <li><a href="{{ resource.origin_url }}"><iconify-icon icon="mdi:web"></iconify-icon>Original source</a></li><li><a href="/raw/picture/{{ resource.id }}" target="_blank"><iconify-icon icon="mdi:image"></iconify-icon>View separately</a></li><li><a href="/raw/picture/{{ resource.id }}" download="GigadataPicture_{{ resource.id }}{{ file_extension }}"> <iconify-icon icon="mdi:download"></iconify-icon>Download </a></li> <li><a href="/picture/{{ resource.id }}/get-annotations"> <iconify-icon icon="ic:baseline-account-tree"></iconify-icon>JSON annotations </a></li> <li><a href="/raw/picture/{{ resource.id }}" target="_blank"> <iconify-icon icon="mdi:image"></iconify-icon>View separately </a></li>{% if have_permission %} <li><a href="/picture/{{ resource.id }}/annotate"> <iconify-icon icon="mdi:vector-point-select"></iconify-icon>Annotate </a></li> <li><a href="/picture/{{ resource.id }}/put-annotations-form"><iconify-icon icon="mdi:file-edit"></iconify-icon>Submit JSON annotations{% endif %} {% if resource.origin_url %} <li><a href="{{ resource.origin_url }}"> <iconify-icon icon="mdi:web"></iconify-icon>Original source</a></li> <li><a href="/picture/{{ resource.id }}/edit-metadata"><iconify-icon icon="mdi:edit"></iconify-icon>Edit metadata{% endif %} {% if resource.replaced_by %} <li><a href="/picture/{{ resource.replaced_by.id }}"> <iconify-icon icon="mdi:new-releases"></iconify-icon>Replacement </a></li> {% endif %} {% if resource.replaces %} <li><a href="/picture/{{ resource.replaces.id }}"> <iconify-icon icon="mdi:archive"></iconify-icon>Old version</a></li> {% endif %} {% if current_user %}
@@ -39,6 +45,14 @@
<iconify-icon icon="mdi:content-copy"></iconify-icon>Copy </a></li> {% endif %} {% if have_permission %} <li><a href="/picture/{{ resource.id }}/put-annotations-form"> <iconify-icon icon="mdi:file-edit"></iconify-icon>Submit JSON annotations </a></li> <li><a href="/picture/{{ resource.id }}/edit-metadata"> <iconify-icon icon="mdi:edit"></iconify-icon>Edit metadata </a></li> {% endif %}{% if have_permission %} <li><details> <summary>