sparrow-theme 0.1.1 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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);