diff --git a/sass/_extra.scss b/sass/_extra.scss index 172239bb..b34e5d61 100644 --- a/sass/_extra.scss +++ b/sass/_extra.scss @@ -41,16 +41,38 @@ padding: 5em 0em; } +// This is a replacement for Semantic UI's .cards class, using CSS Grid +// instead of relying on negative margins for layout. +.card-grid { + display: grid; + grid-template-columns: 1fr; + gap: 1.5em; + margin: 0; +} + +.card-grid.three { + grid-template-columns: repeat(3, 1fr); +} + +.card-grid.four { + grid-template-columns: repeat(4, 1fr); +} + +.card-grid .ui.card { + width: 100%; + margin: 0; +} + .ui.card .image { height: 256px; } -.ui.cards > .card > .content > .header:not(.ui, .center.aligned), .ui.card > .content > .header:not(.ui, .center.aligned) { +.ui.card > .content > .header:not(.ui, .center.aligned) { display: inline-block; margin-bottom: 0; } -.ui.card > .image > img, .ui.cards > .card > .image > img { +.ui.card > .image > img { object-fit: cover; width: 100%; height: 100%; @@ -78,6 +100,11 @@ ul.ui.list li::before { margin-left: 0.5em; } +.crates-toolbar { + text-align: right; + margin-bottom: 1.5em; +} + @media only screen and (max-width: 991px) { .masthead .ui.menu a.item { display: none; @@ -107,6 +134,14 @@ ul.ui.list li::before { .vertical.stripe .text.container p { font-size: 1.1em; } + + .card-grid.three, .card-grid.four { + grid-template-columns: 1fr; + } + + #sort-menu { + width: 100%; + } } /* Colors overridden to avoid inaccessible contrast levels */ @@ -116,11 +151,8 @@ a { } .ui.card > .extra, -.ui.cards > .card > .extra, .ui.card .meta, -.ui.cards > .card .meta, -.ui.card .meta > a:not(.ui), -.ui.cards > .card .meta > a:not(.ui) { +.ui.card .meta > a:not(.ui) { color: #767676; } diff --git a/sass/_semantic.scss b/sass/_semantic.scss index a8a7134f..289b906e 100644 --- a/sass/_semantic.scss +++ b/sass/_semantic.scss @@ -31,7 +31,7 @@ // @import 'semantic/accordion'; // @import 'semantic/checkbox'; // @import 'semantic/dimmer'; -// @import 'semantic/dropdown'; +@import 'semantic/dropdown'; //@import 'semantic/embed'; //@import 'semantic/video'; // @import 'semantic/modal'; diff --git a/static/assets/js/sortCrates.js b/static/assets/js/sortCrates.js new file mode 100644 index 00000000..123f80be --- /dev/null +++ b/static/assets/js/sortCrates.js @@ -0,0 +1,42 @@ +function sortCrates(attribute, numeric, ascending) { + var section = $("#crates-section .card-grid"); + var cards = section.children(".card"); + + var default_value = numeric ? 0 : ""; + + cards.sort(function (a, b) { + var aAttr = a.getAttribute(attribute) || default_value; + var bAttr = b.getAttribute(attribute) || default_value; + + if (numeric) { + aAttr = parseInt(aAttr); + bAttr = parseInt(bAttr); + } else { + aAttr = aAttr.toUpperCase(); + bAttr = bAttr.toUpperCase(); + } + + if (aAttr > bAttr) { + return ascending ? 1 : -1; + } else if (aAttr < bAttr) { + return ascending ? -1 : 1; + } else { + return 0; + } + }); + + cards.detach().appendTo(section); +} + +$(document).ready(function () { + var sortDropdown = $("#sort-menu"); + + sortDropdown.dropdown({ + onChange: function (value, text, selected) { + var type = selected[0].getAttribute("data-type"); + var order = selected[0].getAttribute("data-order"); + + sortCrates(value, type == "num", order == "asc"); + }, + }); +}); diff --git a/templates/categories/macros.html b/templates/categories/macros.html index cb6ca57f..61fe7c3e 100644 --- a/templates/categories/macros.html +++ b/templates/categories/macros.html @@ -82,7 +82,7 @@ {% endif %} {% endif %} -