diff --git a/index.css b/index.css
index 004c98c..ca99a99 100644
--- a/index.css
+++ b/index.css
@@ -36,6 +36,10 @@ a:active {
text-decoration: none;
color: inherit;
}
+.no-smooth {
+ font-smooth: never;
+ -webkit-font-smoothing: none;
+}
.octicon {
fill: currentColor;
}
@@ -56,25 +60,31 @@ article {
width: 100%;
}
section {
- flex: 1;
+ flex: 0;
flex-shrink: 0;
}
+section#filters,
section.config {
font-size: 10px;
background: #eee;
- flex: 0;
padding: 10px;
display: grid;
grid-column-gap: 5px;
grid-row-gap: 5px;
grid-template-columns: auto auto auto auto;
}
+
+section#filters {
+ grid-template-columns: auto auto auto auto auto;
+}
+
section.config > * {
text-align: center;
padding: 0;
white-space: nowrap;
}
section.select-list {
+ flex: 1;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
@@ -89,6 +99,9 @@ section.select-list .entry {
section.select-list .entry:hover {
background: #fff;
}
+section.select-list .entry.filtered-out {
+ display: none;
+}
section.select-list a[data-value] {
display: block;
position: relative;
@@ -158,7 +171,6 @@ section.select-list .details {
text-overflow: ellipsis;
}
footer {
- flex: 0;
padding: 5px 10px;
font-size: 10px;
text-align: center;
@@ -205,11 +217,43 @@ input[type="number"] {
border-radius: 3px;
text-align: left;
}
+fieldset {
+ all: unset;
+}
+button {
+ all: unset;
+ display: block;
+ margin: 0;
+ padding: 0 .5ex;
+ border: 1px solid #e4e4e4;
+ border-radius: 3px;
+ color: #777;
+ position: relative;
+ transition: top .2s ease-in-out;
+}
+button:active {
+ top: 1px;
+}
+
+.toggle {
+ display: flex;
+}
+.toggle button:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.toggle button:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+button:hover,
+button.selected,
input[type="number"]:hover,
input[type="number"]:focus,
select:hover,
select:focus {
border-color: #777;
+ background: #f5f5f5;
}
pre,
textarea,
@@ -244,10 +288,6 @@ label[for="select-theme"] {
min-height: 100%;
text-rendering: optimizeLegibility;
}
-.CodeMirror.no-smooth {
- font-smooth: never;
- -webkit-font-smoothing: none;
-}
.CodeMirror .cm-atom {
font-style: italic;
}
diff --git a/index.html b/index.html
index 0cd182e..550ce90 100755
--- a/index.html
+++ b/index.html
@@ -89,6 +89,29 @@
+
+
+
+
+
+
diff --git a/index.js b/index.js
index 1e58477..eb49516 100644
--- a/index.js
+++ b/index.js
@@ -14,6 +14,13 @@ var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
var input = document.getElementById('select-theme');
var font_data = {};
+var filters = {
+ 'style': false,
+ 'rendering': false,
+ 'liga': false,
+ 'author': false,
+ 'name': false
+};
function selectTheme() {
var theme = 'monokai';
@@ -191,6 +198,92 @@ function decreaseFontSize() {
sizeEl.onchange();
}
+function applyFilters() {
+ var count = 0;
+ switch (filters.style) {
+ case 'sans':
+ $('[data-group="style"] [value="sans"]').addClass('selected');
+ $('[data-group="style"] [value="serif"]').removeClass('selected');
+ break;
+ case 'serif':
+ $('[data-group="style"] [value="sans"]').removeClass('selected');
+ $('[data-group="style"] [value="serif"]').addClass('selected');
+ break;
+ default:
+ $('[data-group="style"] [value="sans"]').removeClass('selected');
+ $('[data-group="style"] [value="serif"]').removeClass('selected');
+ }
+
+ switch (filters.rendering) {
+ case 'vector':
+ $('[data-group="rendering"] [value="vector"]').addClass('selected');
+ $('[data-group="rendering"] [value="bitmap"]').removeClass('selected');
+ break;
+ case 'bitmap':
+ $('[data-group="rendering"] [value="vector"]').removeClass('selected');
+ $('[data-group="rendering"] [value="bitmap"]').addClass('selected');
+ break;
+ default:
+ $('[data-group="rendering"] [value="vector"]').removeClass('selected');
+ $('[data-group="rendering"] [value="bitmap"]').removeClass('selected');
+ }
+
+ switch (filters.liga) {
+ case 'yes':
+ $('[data-group="liga"] [value="yes"]').addClass('selected');
+ $('[data-group="liga"] [value="no"]').removeClass('selected');
+ break;
+ case 'no':
+ $('[data-group="liga"] [value="yes"]').removeClass('selected');
+ $('[data-group="liga"] [value="no"]').addClass('selected');
+ break;
+ default:
+ $('[data-group="liga"] [value="yes"]').removeClass('selected');
+ $('[data-group="liga"] [value="no"]').removeClass('selected');
+ }
+
+ $('.entry[data-alias]').each(function(iteration, element) {
+ var data = font_data[$(element).data().alias];
+ if (
+ (!filters.style || data.style === filters.style) &&
+ (!filters.rendering || data.rendering === filters.rendering) &&
+ (!filters.liga || data.ligatures === false && filters.liga === 'no' || data.ligatures === true && filters.liga === 'yes')
+ ) {
+ $(element).removeClass('filtered-out');
+ count++;
+ } else {
+ $(element).addClass('filtered-out');
+ }
+ });
+
+ if (count === 1) {
+ $('h1 a').text(count + ' Programming Font');
+ } else {
+ $('h1 a').text(count + ' Programming Fonts');
+ }
+
+}
+
+function toggleFilter(value, group) {
+ function toggleValue(name, value) {
+ if (filters[name] == value) {
+ filters[name] = false;
+ } else {
+ filters[name] = value;
+ }
+ }
+
+ if (group === 'style') {
+ toggleValue('style', value);
+ } else if (group === 'rendering') {
+ toggleValue('rendering', value);
+ } else if (group === 'liga') {
+ toggleValue('liga', value);
+ }
+
+ applyFilters();
+}
+
$(document).ready(function() {
var cookieValueSpacing = document.cookie.replace(/(?:(?:^|.*;\s*)spacing\s*=\s*([^;]*).*$)|^.*$/, '$1');
var cookieValueSize = document.cookie.replace(/(?:(?:^|.*;\s*)size\s*=\s*([^;]*).*$)|^.*$/, '$1');
@@ -226,6 +319,14 @@ $(document).ready(function() {
selectTheme();
});
+ $('#filters button').on('click', function(event) {
+ var button = $(this);
+ var button_group = button.parent().data().group;
+ event.preventDefault();
+ event.stopPropagation();
+ toggleFilter(button.val(), button_group);
+ });
+
$('body').on('keydown', function(event) {
if (
event.target === document.querySelector('.select-list')