sparrow-theme 0.1.1 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +48 -0
  4. data/_includes/footer.html +12 -0
  5. data/_includes/head.html +16 -0
  6. data/_includes/header.html +21 -0
  7. data/_includes/modules/card.html +8 -0
  8. data/_includes/modules/heroBanner.html +29 -0
  9. data/_includes/modules/heroSearch.html +11 -0
  10. data/_includes/modules/modal.html +13 -0
  11. data/_includes/modules/navSearch.html +12 -0
  12. data/_includes/modules/spinner.html +5 -0
  13. data/_includes/svg/icon-back.svg +3 -0
  14. data/_includes/svg/icon-chevron-left.svg +3 -0
  15. data/_includes/svg/icon-chevron-right.svg +3 -0
  16. data/_includes/svg/icon-close.svg +3 -0
  17. data/_includes/svg/icon-search.svg +3 -0
  18. data/_includes/svg/logo-smartsparrow.svg +7 -0
  19. data/_includes/typekit.html +13 -0
  20. data/_layouts/404.html +14 -0
  21. data/_layouts/compress.html +9 -0
  22. data/_layouts/default.html +18 -0
  23. data/_layouts/page.html +18 -0
  24. data/_layouts/post.html +5 -0
  25. data/_sass/sparrow-theme/base/_base.scss +226 -0
  26. data/_sass/sparrow-theme/base/_mixins.scss +25 -0
  27. data/_sass/sparrow-theme/base/_variables.scss +62 -0
  28. data/_sass/sparrow-theme/layout/_404.scss +49 -0
  29. data/_sass/sparrow-theme/layout/_catalog.scss +79 -0
  30. data/_sass/sparrow-theme/layout/_component.scss +289 -0
  31. data/_sass/sparrow-theme/layout/_footer.scss +81 -0
  32. data/_sass/sparrow-theme/layout/_header.scss +418 -0
  33. data/_sass/sparrow-theme/layout/_layout.scss +15 -0
  34. data/_sass/sparrow-theme/layout/_page.scss +70 -0
  35. data/_sass/sparrow-theme/modules/_actionPrompt.scss +33 -0
  36. data/_sass/sparrow-theme/modules/_button.scss +107 -0
  37. data/_sass/sparrow-theme/modules/_card.scss +93 -0
  38. data/_sass/sparrow-theme/modules/_carousel.scss +182 -0
  39. data/_sass/sparrow-theme/modules/_componentCard.scss +92 -0
  40. data/_sass/sparrow-theme/modules/_heroBanner.scss +230 -0
  41. data/_sass/sparrow-theme/modules/_modal.scss +122 -0
  42. data/_sass/sparrow-theme/modules/_navSearch.scss +161 -0
  43. data/_sass/sparrow-theme/modules/_preview.scss +99 -0
  44. data/_sass/sparrow-theme/modules/_sideNav.scss +41 -0
  45. data/_sass/sparrow-theme/modules/_spinner.scss +68 -0
  46. data/_sass/sparrow-theme/modules/_stepsList.scss +43 -0
  47. data/_sass/sparrow-theme/modules/_video.scss +13 -0
  48. data/_sass/sparrow-theme/vendor/_normalize.scss +429 -0
  49. data/_sass/sparrow-theme/vendor/_vendor.scss +3 -0
  50. data/assets/css/main.scss +7 -0
  51. data/assets/css/sparrow-theme.scss +38 -0
  52. data/assets/img/404.gif +0 -0
  53. data/assets/img/favicon.png +0 -0
  54. data/assets/img/touch.png +0 -0
  55. data/assets/js/scripts.js +5 -0
  56. data/assets/js/sparrow-theme/_partials/carousel.js +24 -0
  57. data/assets/js/sparrow-theme/_partials/catalog.js +226 -0
  58. data/assets/js/sparrow-theme/_partials/copyInput.js +107 -0
  59. data/assets/js/sparrow-theme/_partials/getData.js +23 -0
  60. data/assets/js/sparrow-theme/_partials/modal.js +51 -0
  61. data/assets/js/sparrow-theme/_partials/navigation.js +29 -0
  62. data/assets/js/sparrow-theme/_partials/scroll.js +102 -0
  63. data/assets/js/sparrow-theme/_partials/search.js +134 -0
  64. data/assets/js/sparrow-theme/_vendor/jquery-3.1.1.min.js +4 -0
  65. data/assets/js/sparrow-theme/_vendor/lunr.min.js +6 -0
  66. data/assets/js/sparrow-theme/_vendor/slick.min.js +18 -0
  67. data/assets/js/sparrow-theme/_vendor/uri.js +56 -0
  68. data/assets/js/sparrow-theme/sparrow-theme.js +23 -0
  69. metadata +71 -3
@@ -0,0 +1,3 @@
1
+ @import
2
+ "normalize"
3
+ ;
@@ -0,0 +1,7 @@
1
+ ---
2
+ # Only the main Sass file needs front matter (the dashes are enough)
3
+ ---
4
+
5
+ @charset "utf-8";
6
+
7
+ {% include_relative sparrow-theme.scss %}
@@ -0,0 +1,38 @@
1
+ // General styles
2
+ @import
3
+ "bourbon",
4
+ "neat",
5
+ "sparrow-theme/vendor/normalize",
6
+ "sparrow-theme/base/variables",
7
+ "sparrow-theme/base/mixins",
8
+ "sparrow-theme/base/base",
9
+ "sparrow-theme/layout/404",
10
+ "sparrow-theme/layout/footer",
11
+ "sparrow-theme/layout/header",
12
+ "sparrow-theme/layout/layout",
13
+ "sparrow-theme/layout/page",
14
+ "sparrow-theme/modules/button",
15
+ "sparrow-theme/modules/card",
16
+ "sparrow-theme/modules/heroBanner",
17
+ "sparrow-theme/modules/modal",
18
+ "sparrow-theme/modules/spinner",
19
+ "sparrow-theme/modules/video"
20
+ ;
21
+
22
+ // Search styles
23
+ {% if site.search %}
24
+ @import "sparrow-theme/modules/navSearch";
25
+ {% endif %}
26
+
27
+ // Catalog site styles
28
+ {% if site.catalog %}
29
+ @import
30
+ "sparrow-theme/layout/catalog",
31
+ "sparrow-theme/layout/component",
32
+ "sparrow-theme/modules/carousel",
33
+ "sparrow-theme/modules/componentCard",
34
+ "sparrow-theme/modules/actionPrompt",
35
+ "sparrow-theme/modules/sideNav",
36
+ "sparrow-theme/modules/preview"
37
+ ;
38
+ {% endif %}
Binary file
Binary file
Binary file
@@ -0,0 +1,5 @@
1
+ ---
2
+ layout: #blank to overrride default layout
3
+ ---
4
+
5
+ {% include_relative sparrow-theme/sparrow-theme.js %}
@@ -0,0 +1,24 @@
1
+ (function ($, root, undefined) {
2
+ 'use strict';
3
+
4
+ $(function() {
5
+ var prevArrow = $('.carousel__control--prev');
6
+ var nextArrow = $('.carousel__control--next');
7
+
8
+ $('.carousel__slides').slick({
9
+ prevArrow: prevArrow,
10
+ nextArrow: nextArrow,
11
+ dots: true,
12
+ dotsClass: 'carousel__dots',
13
+ responsive: [
14
+ {
15
+ breakpoint: 700,
16
+ settings: {
17
+ arrows: false,
18
+ }
19
+ }
20
+ ]
21
+ });
22
+ });
23
+
24
+ })(jQuery, this);
@@ -0,0 +1,226 @@
1
+ var ComponentCard = (function() {
2
+ 'use strict';
3
+
4
+ function ComponentCard(data) {
5
+ this.url = data.url;
6
+ this.title = data.title;
7
+ this.categories = data.categories;
8
+ this.featured = data.featured;
9
+ this.image = data.image;
10
+ this.description = data.description;
11
+ }
12
+
13
+ ComponentCard.prototype.renderComponentCard = function() {
14
+ var truncatedDesctription = this.description.substring(0, 90);
15
+ var card = '<a href="' + this.url + '" class="componentCard__item componentCard__item--faded">' +
16
+ '<div class="componentCard__thumbnail" style="background-image: url(' + this.image + ');"></div>' +
17
+ '<div class="componentCard__content">' +
18
+ '<h3 class="componentCard__title">' + this.title + '</h3>' +
19
+ '<p class="componentCard__description">' + truncatedDesctription + '...</p>' +
20
+ '</div>' +
21
+ '</a>';
22
+ return card;
23
+ };
24
+
25
+ return ComponentCard;
26
+ })();
27
+
28
+ var Catalog = (function() {
29
+ 'use strict';
30
+
31
+ function Catalog(element, data) {
32
+ this.data = data;
33
+ this.element = element;
34
+ this.catalogContent = this.element.find('.catalog__items');
35
+ this.filterLinks = this.element.find('.sideNav__link');
36
+ this.carousel = this.element.find('[data-content="carousel"]');
37
+ this.featuredContent = this.element.find('[data-content="featured"]');
38
+ this.newContent = this.element.find('[data-content="new"]');
39
+ this.featuredCollectionContent = this.element.find('[data-content="Featured Collections"]');
40
+ this.allCollectionContent = this.element.find('[data-content="All Collections"]');
41
+ this.filteredContent = this.element.find('[data-content="filtered"]');
42
+ this.filteredCardContainer = this.filteredContent.find('.componentCard');
43
+ this.filteredContentTitle = this.filteredContent.find('.catalog__title');
44
+ this.isMobile = window.matchMedia('(max-width: 700px)');
45
+
46
+ this.initialize();
47
+ }
48
+
49
+ Catalog.prototype.initialize = function() {
50
+ this.bindEvents();
51
+ this.showFeatured();
52
+ this.populateFromHistory();
53
+ this.animateCards();
54
+ };
55
+
56
+ Catalog.prototype.bindEvents = function() {
57
+ var self = this;
58
+
59
+ $('[data-filter]').click(function(e) {
60
+ var target = $(e.currentTarget);
61
+ var filterName = target.data('filter');
62
+ var filterValue = target.data('value');
63
+ var queryString = '?n=' + filterName + '&v=' + filterValue;
64
+
65
+ window.history.pushState({}, filterValue, queryString);
66
+ self.changeDisplay(filterName, filterValue);
67
+ self.scrollToContent();
68
+ });
69
+
70
+ window.onpopstate = function(event) {
71
+ self.populateFromHistory();
72
+ };
73
+ };
74
+
75
+ Catalog.prototype.scrollToContent = function() {
76
+ var scrollHeight = $('.heroBanner').height() - 50;
77
+ $(window).scrollTop(scrollHeight);
78
+ };
79
+
80
+ Catalog.prototype.showFeatured = function() {
81
+ this.resetDisplay();
82
+ this.catalogContent.append(this.carousel);
83
+ this.catalogContent.append(this.featuredContent);
84
+ this.catalogContent.append(this.newContent);
85
+
86
+ this.carousel.removeClass('catalog__section--hidden');
87
+ this.featuredContent.removeClass('catalog__section--hidden');
88
+ this.newContent.removeClass('catalog__section--hidden');
89
+ this.filterLinks.removeClass('sideNav__link--active');
90
+ this.carousel.removeClass('catalog__section--faded');
91
+
92
+ var featuredData = this.filterContent('featured', 'Featured Components', this.data);
93
+ var newData = this.filterContent('featured', 'New and Noteworthy', this.data);
94
+
95
+ this.renderComponentList(featuredData, this.featuredContent.find('.componentCard'), 2);
96
+ this.renderComponentList(newData, this.newContent.find('.componentCard'), 2);
97
+ };
98
+
99
+ Catalog.prototype.renderComponentList = function(data, container, limit) {
100
+ var self = this;
101
+ container.empty();
102
+
103
+ $.each(data, function(index, value){
104
+ var component = new ComponentCard(value);
105
+ var card = component.renderComponentCard();
106
+ container.append(card);
107
+ if (limit) return index < limit;
108
+ });
109
+
110
+ this.animateCards();
111
+ };
112
+
113
+ Catalog.prototype.animateCards = function() {
114
+ var index = 0;
115
+ var items = $('.componentCard__item');
116
+ var framesPerSecond = 30;
117
+
118
+ function animate() {
119
+ if (index <= items.length) {
120
+ setTimeout(function() {
121
+ window.requestAnimationFrame(animate);
122
+ $(items[index++]).removeClass('componentCard__item--faded');
123
+ }, 1000 / framesPerSecond);
124
+ }
125
+ }
126
+
127
+ animate();
128
+ };
129
+
130
+ Catalog.prototype.resetDisplay = function() {
131
+ $('.componentCard__item').addClass('componentCard__item--faded');
132
+ this.carousel = this.carousel.detach();
133
+ this.featuredContent = this.featuredContent.detach();
134
+ this.newContent = this.newContent.detach();
135
+ this.featuredCollectionContent = this.featuredCollectionContent.detach();
136
+ this.allCollectionContent = this.allCollectionContent.detach();
137
+ this.filteredContent = this.filteredContent.detach();
138
+ this.filterLinks.removeClass('sideNav__link--active');
139
+ };
140
+
141
+ Catalog.prototype.changeDisplay = function(filterName, filterValue) {
142
+ var selectedLink = $('.sideNav__link[data-value="' + filterValue + '"]');
143
+
144
+ this.resetDisplay();
145
+ selectedLink.addClass('sideNav__link--active');
146
+
147
+ if (filterValue === 'Featured Collections') {
148
+ this.catalogContent.html(this.featuredCollectionContent);
149
+ this.featuredCollectionContent.removeClass('catalog__section--hidden');
150
+ this.animateCards();
151
+
152
+ } else if (filterValue === 'All Collections') {
153
+ this.catalogContent.html(this.allCollectionContent);
154
+ this.allCollectionContent.removeClass('catalog__section--hidden');
155
+ this.animateCards();
156
+
157
+ } else {
158
+ this.catalogContent.html(this.filteredContent);
159
+ this.filteredContent.removeClass('catalog__section--hidden');
160
+ var filteredData = this.filterContent(filterName, filterValue, this.data);
161
+ this.renderComponentList(filteredData, this.filteredCardContainer);
162
+ }
163
+ };
164
+
165
+ Catalog.prototype.search = function(query) {
166
+ var self = this;
167
+ var results = window.idx.search(query);
168
+ var searchEntries = [];
169
+ this.resetDisplay();
170
+ this.catalogContent.append(this.filteredContent);
171
+ this.filteredContent.removeClass('catalog__section--hidden');
172
+
173
+ window.data.then(function(loaded_data) {
174
+
175
+ if (results.length) {
176
+ results.forEach(function(result) {
177
+ searchEntries.push(loaded_data[result.ref]);
178
+ });
179
+
180
+ self.filteredContentTitle.text('Results for ' + query);
181
+ self.renderComponentList(searchEntries, self.filteredCardContainer);
182
+ self.animateCards();
183
+ } else {
184
+ self.filteredContentTitle.text('No results found for ' + query);
185
+ }
186
+
187
+ self.scrollToContent();
188
+ });
189
+ };
190
+
191
+ Catalog.prototype.populateFromHistory = function() {
192
+ var uri = new URI(window.location.search.toString());
193
+ var queryString = uri.search(true);
194
+
195
+ if (queryString.hasOwnProperty('n') && queryString.hasOwnProperty('v')) {
196
+ this.changeDisplay(queryString.n.toString(), queryString.v.toString());
197
+ if (this.isMobile.matches) this.scrollToContent();
198
+ } else if (queryString.hasOwnProperty('q')) {
199
+ this.search(queryString.q.toString());
200
+ } else {
201
+ this.showFeatured();
202
+ }
203
+ };
204
+
205
+ Catalog.prototype.filterContent = function(filterName, filterValue, data) {
206
+ this.filteredContentTitle.text(filterValue);
207
+
208
+ var filteredData = data.filter(function(n, i) {
209
+ var data = n[filterName].split(', ');
210
+ return data.indexOf(filterValue) !== -1;
211
+ });
212
+
213
+ return filteredData;
214
+ };
215
+
216
+ return Catalog;
217
+ })();
218
+
219
+ $(function() {
220
+ // Only run for catalog pages
221
+ if ($('.catalog').length) {
222
+ window.data.then(function(data) {
223
+ var catalog = new Catalog($('.catalog'), data);
224
+ });
225
+ }
226
+ });
@@ -0,0 +1,107 @@
1
+ var CopyNotification = (function() {
2
+ 'use strict';
3
+
4
+ function CopyNotification(message) {
5
+ this.message = message;
6
+ this.copyInput = $('.copyInput');
7
+ }
8
+
9
+ CopyNotification.prototype.render = function() {
10
+ var copyNotification = '<div class="copyInput__notification">' + this.message + '</div>';
11
+ return copyNotification;
12
+ };
13
+
14
+ CopyNotification.prototype.animate = function() {
15
+ var animationEnd = 'webkitAnimationEnd oanimationend oAnimationEnd msAnimationEnd animationend';
16
+ var notification = this.copyInput.find('.copyInput__notification');
17
+ var fired = false;
18
+ notification.addClass('copyInput__notification--animating');
19
+
20
+ notification.one(animationEnd, function(e) {
21
+ if (!fired) {
22
+ fired = true;
23
+ notification.remove();
24
+ }
25
+ });
26
+ };
27
+
28
+ return CopyNotification;
29
+ })();
30
+
31
+ var CopyInput = (function() {
32
+ function CopyInput(element) {
33
+ this.element = element;
34
+ this.copyButton = this.element.find('.copyInput__button');
35
+ this.copyInputText = this.element.find('.copyInput__input');
36
+ this.copyInputClass = '.' + this.element.attr('class');
37
+ this.copyInputTextClass = this.copyInputText.attr('class');
38
+ this.bindEvents();
39
+ }
40
+
41
+ CopyInput.prototype.bindEvents = function() {
42
+ var self = this;
43
+ this.copyButton.on('click', function(e) {
44
+ e.preventDefault();
45
+ e.stopPropagation();
46
+ var copyTextParent = self.getClosest(this, self.copyInputClass);
47
+ var copyText = self.getChild(copyTextParent, self.copyInputTextClass);
48
+ self.copyToClipboard(copyText);
49
+ });
50
+
51
+ this.copyInputText.focus(function() {
52
+ $(this).select();
53
+ });
54
+ };
55
+
56
+ CopyInput.prototype.getClosest = function(elem, selector) {
57
+ var firstChar = selector.charAt(0);
58
+
59
+ // Get closest match
60
+ for (; elem && elem !== document; elem = elem.parentNode) {
61
+ if (firstChar === '.' ) {
62
+ if (elem.classList.contains(selector.substr(1))) {
63
+ return elem;
64
+ }
65
+ }
66
+ }
67
+ return false;
68
+ };
69
+
70
+ CopyInput.prototype.getChild = function(elem, selector) {
71
+ for (var i = 0; i < elem.childNodes.length; i++) {
72
+ if (elem.childNodes[i].className == selector) {
73
+ return elem.childNodes[i];
74
+ }
75
+ }
76
+ };
77
+
78
+ CopyInput.prototype.copyToClipboard = function(copyText) {
79
+ window.getSelection().removeAllRanges();
80
+ var range = document.createRange();
81
+ range.selectNode(copyText);
82
+ window.getSelection().addRange(range);
83
+
84
+ try {
85
+ var successful = document.execCommand('copy');
86
+ var msg = successful ? 'copied' : 'not copied';
87
+ var copyNotification = new CopyNotification(msg);
88
+ $('.copyInput__notification').remove();
89
+
90
+ this.copyButton.append(copyNotification.render());
91
+ copyNotification.animate();
92
+
93
+ } catch(err) {
94
+ alert('Oops, unable to copy');
95
+ }
96
+
97
+ window.getSelection().removeAllRanges();
98
+ };
99
+
100
+ return CopyInput;
101
+ })();
102
+
103
+ $(function() {
104
+ if ($('.copyInput').length) {
105
+ new CopyInput($('.copyInput'));
106
+ }
107
+ });
@@ -0,0 +1,23 @@
1
+ (function ($, root, undefined) {
2
+ 'use strict';
3
+
4
+ // Initalize lunr with the fields it will be searching on
5
+ window.idx = lunr(function() {
6
+ this.ref('id');
7
+ {% for field in site.search.fields %}
8
+ this.field('{{ field.title }}'{% if field.boost %}, {boost: {{ field.boost }}}{% endif %});
9
+ {% endfor %}
10
+ });
11
+
12
+ // Download the data from the JSON file we generated
13
+ window.data = $.getJSON('{{ site.search.data-url }}');
14
+
15
+ // Wait for the data to load and add it to lunr
16
+ window.data.then(function(loaded_data){
17
+ $.each(loaded_data, function(index, value){
18
+ window.idx.add(
19
+ $.extend({ "id": index }, value)
20
+ );
21
+ });
22
+ });
23
+ })(jQuery, this);