Tema: slider za brzinu animacije, zamena scaleIn sa blurIn, AJAX čuvanje
- nova animacija blurIn (zamagljivanje) umesto scaleIn koji je izgledao isto kao fadeIn - slider za brzinu animacije (0.1s–0.8s, korak 0.1) premešten u karticu animacije - brzina i vrsta animacije čuvaju se jednim klikom, iz istog forma - nova kolona lokalna_brzina_animacije u bazi (migracija 056) - AJAX čuvanje profil/tema: nema reload stranice, scroll ostaje, toast notifikacija - otpremnica vidljiva samo za status Završeno/Preuzeto; radni nalog skriven kada završeno - toast notifikacije sa punom bojom pozadine (svetla i tamna tema)
This commit is contained in:
@@ -83,24 +83,23 @@
|
||||
|
||||
<form method="POST" action="/profil/animacija">
|
||||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||||
<input type="hidden" name="lokalna_brzina_animacije" id="brzina-hidden" value="{{if .LokalnaBrzinaAnimacije}}{{.LokalnaBrzinaAnimacije}}{{else}}0.4{{end}}">
|
||||
<div class="kolona" style="gap:16px;">
|
||||
<div style="max-width:300px;">
|
||||
<label class="polje-labela" for="anim-select">Vrsta animacije pri učitavanju</label>
|
||||
<select id="anim-select" name="lokalna_animacija" style="width:100%;" onchange="animPreview(this.value)"><!-- preview se primenjuje na wrapper, ne na body -->
|
||||
<select id="anim-select" name="lokalna_animacija" style="width:100%;" onchange="animPreview(this.value)">
|
||||
<option value="" {{if eq .LokalnaAnimacija ""}}selected{{end}}>Podrazumevano (klizanje gore)</option>
|
||||
<option value="bez" {{if eq .LokalnaAnimacija "bez"}}selected{{end}}>Bez animacije</option>
|
||||
<option value="fadeInUp" {{if eq .LokalnaAnimacija "fadeInUp"}}selected{{end}}>Klizanje gore (fadeInUp)</option>
|
||||
<option value="fadeIn" {{if eq .LokalnaAnimacija "fadeIn"}}selected{{end}}>Pojavljivanje (fadeIn)</option>
|
||||
<option value="scaleIn" {{if eq .LokalnaAnimacija "scaleIn"}}selected{{end}}>Zumiranje (scaleIn)</option>
|
||||
<option value="slideLeft" {{if eq .LokalnaAnimacija "slideLeft"}}selected{{end}}>Klizanje s leva (slideLeft)</option>
|
||||
<option value="fadeInUp" {{if eq .LokalnaAnimacija "fadeInUp"}}selected{{end}}>Klizanje gore</option>
|
||||
<option value="fadeIn" {{if eq .LokalnaAnimacija "fadeIn"}}selected{{end}}>Pojavljivanje</option>
|
||||
<option value="blurIn" {{if eq .LokalnaAnimacija "blurIn"}}selected{{end}}>Zamagljivanje</option>
|
||||
<option value="slideLeft" {{if eq .LokalnaAnimacija "slideLeft"}}selected{{end}}>Klizanje s leva</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- preview -->
|
||||
<div>
|
||||
<div class="pomocni-tekst" style="margin-bottom:8px;">Pregled:</div>
|
||||
<!-- preview wrapper nosi data-animacija atribut; isti CSS [data-animacija] .animiraj
|
||||
koji radi globalno na body radi i ovde, ali izolovano — pogađa SAMO redove unutar wrappera -->
|
||||
<div id="anim-preview-wrap" style="border:0.5px solid var(--ivica);border-radius:8px;overflow:hidden;max-width:340px;">
|
||||
<table style="width:100%;border-collapse:collapse;">
|
||||
<tbody id="anim-preview-body">
|
||||
@@ -116,6 +115,20 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- slider brzine unutar iste forme -->
|
||||
<div style="max-width:340px;">
|
||||
<label class="polje-labela" for="brzina-slider">Trajanje efekta: <span id="brzina-labela">{{if .LokalnaBrzinaAnimacije}}{{.LokalnaBrzinaAnimacije}}s{{else}}0.4s{{end}}</span></label>
|
||||
<input type="range" id="brzina-slider"
|
||||
min="0.1" max="0.8" step="0.1"
|
||||
value="{{if .LokalnaBrzinaAnimacije}}{{.LokalnaBrzinaAnimacije}}{{else}}0.4{{end}}"
|
||||
style="width:100%;margin-top:8px;accent-color:var(--sb-akcent);"
|
||||
oninput="brzinaPromena(this.value)">
|
||||
<div style="display:flex;justify-content:space-between;margin-top:4px;">
|
||||
<span style="font-size:11px;color:var(--tekst-sporedni);">0.1s (brže)</span>
|
||||
<span style="font-size:11px;color:var(--tekst-sporedni);">0.8s (sporije)</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="submit" class="btn-primarno">Sačuvaj</button>
|
||||
</div>
|
||||
@@ -376,7 +389,7 @@ var animVrednosti = {
|
||||
'bez': 'bez',
|
||||
'fadeInUp': 'fadeInUp',
|
||||
'fadeIn': 'fadeIn',
|
||||
'scaleIn': 'scaleIn',
|
||||
'blurIn': 'blurIn',
|
||||
'slideLeft': 'slideLeft'
|
||||
};
|
||||
// postavlja data-animacija na PREVIEW wrapper (ne na body), pa CSS
|
||||
@@ -385,10 +398,13 @@ function animPreview(val) {
|
||||
var wrap = document.getElementById('anim-preview-wrap');
|
||||
if (!wrap) return;
|
||||
var anim = animVrednosti[val] || 'fadeInUp';
|
||||
// restartuj animaciju: skini atribut, izazovi reflow, pa ga vrati
|
||||
// skini data-animacija i klasu animiraj sa redova da bi se animacija resetovala
|
||||
wrap.removeAttribute('data-animacija');
|
||||
void wrap.offsetHeight; // reflow da bi se animacija ponovo okinula
|
||||
var redovi = wrap.querySelectorAll('.animiraj');
|
||||
redovi.forEach(function(r) { r.classList.remove('animiraj'); });
|
||||
void wrap.offsetHeight; // reflow — bez ovoga browser spoji promene i ne restartuje
|
||||
wrap.setAttribute('data-animacija', anim);
|
||||
redovi.forEach(function(r) { r.classList.add('animiraj'); });
|
||||
}
|
||||
// "Ponovi pregled" — ponovo okida animaciju za trenutno izabrani stil
|
||||
function animPreviewPonovi() {
|
||||
@@ -399,5 +415,16 @@ function animPreviewPonovi() {
|
||||
var sel = document.getElementById('anim-select');
|
||||
if (sel) animPreview(sel.value);
|
||||
})();
|
||||
|
||||
function brzinaPromena(val) {
|
||||
var v = parseFloat(val).toFixed(1);
|
||||
document.getElementById('brzina-hidden').value = v;
|
||||
document.getElementById('brzina-labela').textContent = v + 's';
|
||||
// primeni odmah — korisnik vidi efekat pre čuvanja
|
||||
document.body.dataset.brzinaAnimacije = v;
|
||||
// ažuriraj i preview wrapper da odmah odrazi novu brzinu
|
||||
var wrap = document.getElementById('anim-preview-wrap');
|
||||
if (wrap) wrap.style.setProperty('--anim-trajanje', v + 's');
|
||||
}
|
||||
</script>
|
||||
{{end}}
|
||||
|
||||
Reference in New Issue
Block a user