/* Artemag Magazine: filtri dell'agenda (ricerca, città, momento, mostre concluse) senza ricaricare la pagina.
Ogni filtro ha il suo ordine: in programma per data di apertura, aperte dalla più recente,
in chiusura per data di chiusura. Le righe escono in dissolvenza, l'elenco cambia altezza con calma
e le nuove entrano una dopo l'altra. */
document.querySelectorAll('[data-amm-agenda]').forEach(function (box) {
var limit = parseInt(box.getAttribute('data-limit'), 10) || 6;
var list = box.querySelector('.amm-list');
var rows = Array.prototype.slice.call(box.querySelectorAll('.amm-row'));
var empty = box.querySelector('.amm-empty');
var pastBox = box.querySelector('[data-amm-past]');
var calm = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var turn = 0;
function current(attr) {
var on = box.querySelector('.amm-chip.is-active[' + attr + ']');
return on ? on.getAttribute(attr) : '';
}
var state = { city: current('data-city'), when: current('data-when'), past: !!(pastBox && pastBox.checked), q: '' };
// Ricerca libera: solo nella pagina completa dell'agenda (quella con la casella delle mostre concluse).
function norm(s) { return (s || '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/\s+/g, ' ').trim(); }
rows.forEach(function (r) { var b = r.querySelector('.amm-body'); r.ammText = norm(b ? b.textContent : ''); });
var searchBox = null;
if (pastBox) {
if (!document.getElementById('amm-search-css')) {
var css = document.createElement('style');
css.id = 'amm-search-css';
css.textContent = '.amm-search{flex-basis:100%;position:relative;max-width:460px}'
+ '.amm-search input{width:100%;box-sizing:border-box;font:400 16px/1.3 var(--amm-sans);color:var(--amm-ink);background:#fff;border:1px solid #c9c2b5;border-radius:999px;padding:10px 16px 10px 42px;-webkit-appearance:none;appearance:none}'
+ '.amm-search input:focus{outline:none;border-color:var(--amm-ink)}'
+ '.amm-search::before{content:"";position:absolute;left:16px;top:50%;width:12px;height:12px;margin-top:-9px;border:2px solid #8b8377;border-radius:50%;pointer-events:none}'
+ '.amm-search::after{content:"";position:absolute;left:29px;top:50%;width:2px;height:7px;margin-top:2px;background:#8b8377;transform:rotate(-45deg);pointer-events:none}';
document.head.appendChild(css);
}
var wrap = document.createElement('div');
wrap.className = 'amm-search';
wrap.innerHTML = '';
var head = box.querySelector('.amm-agenda__head');
if (head) {
head.insertBefore(wrap, head.querySelector('.amm-chips') || pastBox.parentNode);
searchBox = wrap.querySelector('input');
try { searchBox.value = new URL(window.location.href).searchParams.get('cerca') || ''; } catch (err) {}
state.q = norm(searchBox.value);
}
}
function g(r, k) { return r.getAttribute('data-' + k) || ''; }
function has(r, group) { return (' ' + g(r, 'groups') + ' ').indexOf(' ' + group + ' ') > -1; }
function cmp(a, b) { return a < b ? -1 : (a > b ? 1 : 0); }
function byIndex(a, b) { return parseInt(g(a, 'i'), 10) - parseInt(g(b, 'i'), 10); }
function sorter(when) {
if (when === 'programma') { return function (a, b) { return cmp(g(a, 'start'), g(b, 'start')) || byIndex(a, b); }; }
if (when === 'aperte') { return function (a, b) { return cmp(g(b, 'start'), g(a, 'start')) || byIndex(a, b); }; }
if (when === 'chiusura') { return function (a, b) { return cmp(g(a, 'end'), g(b, 'end')) || byIndex(a, b); }; }
return byIndex;
}
function apply() {
var ok = rows.filter(function (r) {
if (state.q && r.ammText.indexOf(state.q) < 0) { return false; }
if (state.city && g(r, 'city') !== state.city) { return false; }
if (has(r, 'conclusa')) { return state.past && !state.when; }
return !state.when || has(r, state.when);
});
ok.sort(sorter(state.when));
var rest = rows.filter(function (r) { return ok.indexOf(r) < 0; });
var visible = [];
ok.concat(rest).forEach(function (r, i) {
var show = ok.indexOf(r) > -1 && i < limit;
r.hidden = !show;
r.classList.remove('is-in');
r.style.animationDelay = '';
if (show) { visible.push(r); }
list.appendChild(r);
});
if (empty) { empty.hidden = visible.length > 0; }
return visible;
}
function run() {
if (calm || !list) { apply(); return; }
var mine = ++turn;
var from = list.offsetHeight;
list.style.height = from + 'px';
list.classList.add('is-leaving');
setTimeout(function () {
if (mine !== turn) { return; }
var visible = apply();
list.style.height = 'auto';
var to = list.offsetHeight;
list.style.height = from + 'px';
void list.offsetHeight;
list.classList.remove('is-leaving');
list.style.height = to + 'px';
visible.forEach(function (r, i) {
r.style.animationDelay = (i * 45) + 'ms';
r.classList.add('is-in');
});
setTimeout(function () {
if (mine === turn) { list.style.height = ''; }
}, 450);
}, 200);
}
function remember(key, value) {
try {
var u = new URL(window.location.href);
if (value) { u.searchParams.set(key, value); } else { u.searchParams.delete(key); }
history.replaceState(null, '', u.toString());
} catch (err) {}
}
box.querySelectorAll('.amm-chip').forEach(function (chip) {
chip.addEventListener('click', function (e) {
e.preventDefault();
if (chip.classList.contains('is-active')) { return; }
var attr = chip.hasAttribute('data-when') ? 'data-when' : 'data-city';
box.querySelectorAll('.amm-chip[' + attr + ']').forEach(function (c) {
var on = c === chip;
c.classList.toggle('is-active', on);
c.setAttribute('aria-pressed', on ? 'true' : 'false');
});
if (attr === 'data-when') { state.when = chip.getAttribute(attr); remember('stato', state.when); }
else { state.city = chip.getAttribute(attr); remember('citta', state.city); }
run();
});
});
if (pastBox) {
pastBox.addEventListener('change', function () {
state.past = pastBox.checked;
remember('concluse', state.past ? '1' : '');
// Le città con sole mostre concluse compaiono solo con la casella attiva.
box.querySelectorAll('[data-past-only]').forEach(function (c) { c.hidden = !state.past; });
var on = box.querySelector('.amm-chip.is-active[data-city]');
if (on && on.hidden) {
on.classList.remove('is-active');
on.setAttribute('aria-pressed', 'false');
var all = box.querySelector('.amm-chip[data-city=""]');
if (all) { all.classList.add('is-active'); all.setAttribute('aria-pressed', 'true'); }
state.city = '';
remember('citta', '');
}
run();
});
}
if (searchBox) {
var wait = null;
searchBox.addEventListener('input', function () {
clearTimeout(wait);
wait = setTimeout(function () {
var q = norm(searchBox.value);
if (q === state.q) { return; }
state.q = q;
remember('cerca', searchBox.value.trim());
run();
}, 250);
});
}
// Ordine giusto anche quando la pagina si apre con un filtro o una ricerca già scelti.
if (state.when || state.q) { apply(); }
});
/* Artemag Magazine: striscia rossa che scorre. Duplica le voci per un giro senza stacchi. */
document.querySelectorAll('.amm-ticker').forEach(function (t) {
if (t.getAttribute('data-amm-marquee')) { return; }
var items = Array.prototype.slice.call(t.children);
if (!items.length) { return; }
t.setAttribute('data-amm-marquee', '1');
var track = document.createElement('span');
track.className = 'amm-ticker__track';
items.forEach(function (i) { track.appendChild(i); });
var copy = track.cloneNode(true);
copy.setAttribute('aria-hidden', 'true');
copy.querySelectorAll('a').forEach(function (a) { a.setAttribute('tabindex', '-1'); });
t.appendChild(track);
t.appendChild(copy);
t.classList.add('is-marquee');
// Circa 60 px al secondo, qualunque sia la lunghezza dei titoli.
t.style.setProperty('--amm-marquee-duration', Math.max(20, Math.round(track.scrollWidth / 60)) + 's');
});
Arte Magazine - Il quotidiano di Arte e Cultura - Page 329
Vai al contenuto
Spazio pubblicitario970 × 120
[am_agenda limit=”6″ columns=”2″]
Spazio pubblicitario970 × 250