// // toggle non-rarity classes for icon instances on icons page function iconsToggleClass(classnames, label, off) { if (off) { $('#icons i.ss').each(function(index, icon) { $(icon).removeClass(classnames); }); $('details div.icon i').removeClass(classnames); $('#preview-extras-modal label[for="extras_'+label+'"]').removeClass('checked'); } else { $('#icons i.ss').each(function(index, icon) { $(icon).toggleClass(classnames); }); $('details div.icon i').toggleClass(classnames); $('#preview-extras-modal label[for="extras_'+label+'"]').toggleClass('checked'); } } // // rarity toggle handling on icons page function iconsChangeRarity(rarity) { // change each icon in the results $('#icons i.ss').each(function(index, icon) { $(icon).removeClass('ss-rarity-common ss-rarity-uncommon ss-rarity-rare ss-rarity-mythic ss-rarity-foil'); $(icon).addClass('ss-rarity-'+rarity); }); // change the modal $('#icon-rarity-modal label').removeClass('checked'); $('#icon-rarity-modal label[for="rarity_'+rarity+'"]').addClass('checked'); $('details div.icon i').removeClass('ss-rarity-common ss-rarity-uncommon ss-rarity-rare ss-rarity-mythic ss-rarity-foil'); $('details div.icon i').addClass('ss-rarity-'+rarity); // for commons, disable the gradient if (rarity == "common") { $('#extras_gradient').attr('disabled', 'disabled').prop('checked', false); $('label[for="extras_gradient"]').attr('disabled', 'disabled').addClass('disabled'); iconsToggleClass('ss-rarity-gradient', 'gradient', true); } else { $('#extras_gradient').attr('disabled', null); $('label[for="extras_gradient"]').attr('disabled', null).removeClass('disabled'); } } // // get the current values of all icon page menu items function getIconDisplaySettings() { let classes = ''; classes += $('#icon-rarity input:checked').data('class'); $('#icon-extras input:checked').each(function(index, extra) { classes += ' '+$(extra).data('class'); }); return classes; } // // icon search filtering function filterIcons(q) { // define some empty variables let code = ''; let tags = Object; let group = ''; let release = ''; let parent = ''; let is = ''; let modern = new Date('2003-08-28'); // set the URL to show the param if (q.length > 0) { window.history.replaceState({'q':q,}, "Set icon search results", '?q='+q); $('#search svg.clear').removeClass('hidden'); } else { window.history.replaceState({'q':'',}, "Set icons", '/sets'); $('#search svg.clear').addClass('hidden'); } // iterate over each icon and show/hide along with its parent group $('#icons figure').each(function() { code = $(this).data('code'); tags = $(this).data('tags'); group = $(this).data('order'); release = new Date($(this).data('release')); official = $(this).data('official'); parent = $('.set-group[data-id="'+group+'"]'); // check if we have an is: query; [old, modern, official, custom] if (q.substring(0, 3) == 'is:') { // hide everything right away $(this).addClass('hidden'); // get the mode is = q.split(':')[1]; // should this be a switch? if (is == 'modern') { if (release.getTime() >= modern.getTime()) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } } else if (is == 'old') { if (release.getTime() < modern.getTime()) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } } else if (is == 'official') { if (official) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } } else if (is == 'custom') { if (!official) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } } // check if after a date } else if (q.substring(0, 6) == 'after:') { // hide everything right away $(this).addClass('hidden'); // get and check against the date date = new Date(q.split(':')[1]); if (release.getTime() > date.getTime()) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } // check if before a date } else if (q.substring(0, 7) == 'before:') { // hide everything right away $(this).addClass('hidden'); // get and check against the date date = new Date(q.split(':')[1]); if (release.getTime() < date.getTime()) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } // otherwise check code/tags for the string } else { // show/hide icons based on query index if (code.indexOf(q) >= 0 || Object.values(tags).indexOf(q) >= 0) { $(this).removeClass('hidden'); } else { $(this).addClass('hidden'); } } // poll for group's non-hidden count and hide it if there are none if (parent.children().children().children('figure:not(.hidden)').length == 0) { parent.addClass('hidden'); } else { parent.removeClass('hidden'); } }); // if there are 0 results, show something if ($('#icons .set-group:not(.hidden)').length == 0) { $('#search-empty').removeClass('hidden'); } else { $('#search-empty').addClass('hidden'); } } function outputAliases(aliases) { let html = ''; aliases.forEach(function(alias, index) { html += ''; }); return html+'
'+alias.code+''+alias.name+'
'; } // // icons page modal handling function openModal(icon) { // get the data vars from the figure that was clicked let code = icon.data('code'); let name = icon.data('name'); let tags = icon.data('tags'); let tagp = ''; let tagc = ''; let group = icon.data('group'); let status = icon.data('official'); let statusl = (icon.data('official')) ? 'Official' : "Custom"; let rarity = (icon.data('rarity')) ? icon.data('rarity') : 'n/a'; let border = (icon.data('border')) ? icon.data('border') : 'n/a'; let inner = (icon.data('inner')) ? icon.data('inner') : 'n/a'; let version = icon.data('version'); let classes = getIconDisplaySettings(); // format any aliases into spans let aliases = (icon.data('aliases') == false) ? 'none' : outputAliases(Object.values(icon.data('aliases'))); // format the tags into spans tags.forEach(function(item, index) { // check if we're linking to a card with [[card]] const re = /\[\[(.*?)\]\]/g; if (item.match(re)) { tagc = item.substring(2, item.length -2).split("|"); tagp = tagp+''+tagc[0]+''; // otherwise link to search } else { tagp = tagp+''+item+''; } }); // update the fields $('details div.icon i').attr('class', 'ss ss-'+code+' '+classes); $('details div.table h2.name').html(name); $('details div.table h3.class').html(code); $('details div.table span.group').html(group); $('details div.table span.official').data("official", status).html(statusl); $('details div.table li.rarity span').html(rarity); $('details div.table li.rarity i').html('&#x'+rarity); $('details div.table li.border').attr('class', 'border '+icon.data('border')+''); $('details div.table li.border span').html(border); $('details div.table li.border i').html('&#x'+border); $('details div.table li.inner').attr('class', 'inner '+icon.data('inner')+''); $('details div.table li.inner span').html(inner); $('details div.table li.inner i').html('&#x'+inner); $('details div.table span.version').html(version); $('details div.table span.aliases').html(aliases); $('details div.tags').html(tagp); // specific function bindings $('#copy-unicode').on('click', function() { navigator.clipboard.writeText(rarity).then(function() { $('#copy-unicode em').html('Unicode copied!').animate('fadeup', 1200, 'ease-in-out'); }, function(err) { $('#copy-unicode em').html('Error copying').animate('fadeup', 1200, 'ease-in-out'); }); }); $('#copy-glyph').on('click', function() { navigator.clipboard.writeText($('details div.table li.rarity i').html()).then(function() { $('#copy-glyph em').html('Glyph copied!').animate('fadeup', 1200, 'ease-in-out'); }, function(err) { $('#copy-glyph em').html('Error copying').animate('fadeup', 1200, 'ease-in-out'); }); }); $('#download-svg').on('click', function() { $('#download-svg em').html('Coming soon!').animate('fadeup', 1200, 'ease-in-out'); }); // show the modal window.history.replaceState({'i':code,}, "Set icon details", '?i='+code); $('object').addClass('active'); } function closeModal() { $('object').removeClass('active'); window.history.replaceState({'q':'',}, "Set icons", '/sets'); } // // onload interactions Zepto(function($){ // // mobile nav $('header').on('click', '#toggle-nav', function(e) { $('nav').toggleClass('mobile'); $('#toggle-nav-svg').toggleClass('closed'); }); // // dark/light mode let toggle = $('#switch'); let cookie = localStorage.getItem('mode'); if (cookie) { if (cookie == 'dark') { document.documentElement.dataset.mode = 'dark'; toggle.prop('checked', 'checked'); } else if (cookie == 'light') { document.documentElement.dataset.mode = 'light'; toggle.prop('checked', false); } } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { document.documentElement.dataset.mode = 'dark'; toggle.prop('checked', 'checked'); localStorage.setItem('mode', 'dark'); } else { localStorage.setItem('mode', 'light'); } toggle.on('change', function() { if (toggle.prop('checked')) { document.documentElement.dataset.mode = 'dark'; localStorage.setItem('mode', 'dark'); } else { document.documentElement.dataset.mode = 'light'; localStorage.setItem('mode', 'light'); } }); // // filter icons if we have a ?q=, modal if we have an ?i= let url = new URLSearchParams(window.location.search); if (url.get('q')) { filterIcons(url.get('q')); $('#icon-filter').val(url.get('q')); } if (url.get('i')) { let icon = $('figure[data-code="'+url.get('i')+'"]'); if (icon) { openModal(icon); } } // // live icon filter via search box $('#icon-filter').on('input', function() { filterIcons($(this).val()); }); // // icon filter clear button $('.search-link').on('click', function(e) { e.preventDefault(); filterIcons($(this).data('q')); $('#icon-filter').val($(this).data('q')); }); // // icon display menus $('#icon-menu').on('change', 'input[type=radio][name="density"]', function() { $('#icons').data('density', $(this).val()); }); $('#icon-menu').on('change', 'input[type=radio][name="rarity"]', function() { iconsChangeRarity($(this).val()); }); $('#icon-menu').on('change', 'input[type=checkbox][name="border"]', function() { iconsToggleClass('ss-border', 'border'); }); $('#icon-menu').on('change', 'input[type=checkbox][name="inner"]', function() { iconsToggleClass('ss-inner', 'inner'); }); $('#icon-menu').on('change', 'input[type=checkbox][name="gradient"]', function() { iconsToggleClass('ss-rarity-gradient', 'gradient'); }); $('#icon-menu').on('change', 'input[type=checkbox][name="transparent"]', function() { $('#icons figure').each(function(index, figure) { $(figure).toggleClass('checkerboard'); }); }); // // icon modal $('#icons').on('click', 'figure', function() { openModal($(this)); }); $('object').on('click', '.close', function(e) { e.preventDefault(); closeModal(); }) });