jekyll-theme-overflow 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8b3675cbb482980daf5d6ffc3d3b341ba5960797
4
- data.tar.gz: 8cc93727967cca49ad4e91753dc38da7f8da8787
2
+ SHA256:
3
+ metadata.gz: 1631bdb31b040b146111f5c8213a379d84e3a3cb512bfdee8da84ffa7901dbd4
4
+ data.tar.gz: dbfbbcf112c7927bffbfb1d1f94b2297e13d9bd14bc8a74e1139cde7963b9218
5
5
  SHA512:
6
- metadata.gz: 50f972458b8a35c55be19ab45733209316560702ffb525b943e016c2a511e2ef52a04735c9b9859feae131cbc60fc59b1ae35201a54f0d5c4c9aa7ddb0d6d63c
7
- data.tar.gz: 7f4381a0a898bf56d7c9c5bce183f56d90d7e5a15868605b590c2a640bbd48c61fa7128a5a01a1e4e466cf48534ae8f069d9dc15b23f45a8635d3089b793a174
6
+ metadata.gz: 325f54ac42333b15af8bac77d6a570cfb71ee1f5f361c7e67ba2dbde88762360ee411d0889ed4850bd2d2b309fed6911fb5eabbac8d9251386bd04077653b6ef
7
+ data.tar.gz: 7e267a18b42a295bad929759fe0e81b113140bd50de097cbe293ab265bd0214976f8e5800d4dc44b0416ad4b8019434c6424344479a9dee190b42119f4c023a5
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > A Jekyll version of the "Overflow" theme by [HTML5 UP][html5up].
4
4
 
5
- You can preview the theme [here](https://moodule.github.io/jekyll-theme-overfow
5
+ You can preview the theme [here](https://moodule.github.io/jekyll-theme-overflow
6
6
 
7
7
  ![Overflow Theme](assets/images/screenshot.jpg "Overflow Theme")
8
8
 
@@ -34,41 +34,75 @@ For those unfamiliar with how Jekyll works, check out [jekyllrb.com](https://jek
34
34
  or read up on just the basics of [front matter](https://jekyllrb.com/docs/frontmatter/), [writing posts](https://jekyllrb.com/docs/posts/),
35
35
  and [creating pages](https://jekyllrb.com/docs/pages/).
36
36
 
37
+ ## Configuration
38
+
39
+ You can use the following custom parameters in `_config.yml`.
40
+
41
+ ### Site
42
+ Both `title` and `subtitle` are displayed side by side :
43
+ - in the tab name
44
+ - at the top of the page, in the header
45
+
46
+ ### Social
47
+ Social icons will appear for each url your fill in, among `facebook_url` etc.
48
+
49
+ ### Contact
50
+ Your contact information can be used in contact forms, the footer or anywhere else.
51
+
37
52
  ## Publication
38
53
 
39
- To post your website as a Github page, fork this reposity and create a branch named `gh-pages`, then start editing the `_config.yml` file.
54
+ ### On Github Pages
40
55
 
41
- # Configuration
56
+ In your own website's repository, edit the `_config.yml` file:
42
57
 
43
- You can use the following custom parameters in `_config.yml`.
58
+ ```yaml
59
+ url: "https://<github-account-name>.github.io/<repository-name>"
60
+ ```
61
+
62
+ Build the website with:
63
+
64
+ $ JEKYLL_ENV=production bundle exec jekyll build
65
+
66
+ Commit all your work to the current branch.
67
+
68
+ Create a branch named `gh-pages`:
69
+
70
+ $ git checkout -b gh-pages
44
71
 
45
- ## Site
46
- - `subtitle` sets the text for the lighter colored text next to your site's title.
47
-
48
- ## Social
49
- - `500px_url`
50
- - `facebook_url`
51
- - `github_url`
52
- - `gitlab_url`
53
- - `googleplus_url`
54
- - `instagram_url`
55
- - `linkedin_url`
56
- - `pinterest_url`
57
- - `slack_url`
58
- - `twitter_url`
59
-
60
- ## Contact
61
- - `street_address`
62
- - `city`
63
- - `state`
64
- - `zip_code`
65
- - `country`
66
- - `phone`
67
- - `email`
72
+ And finally replace the repository's content with the generated webpages:
73
+
74
+ $ mkdir ~/backup
75
+ $ mv ./* ~/backup/
76
+ $ mv ~/backup/.git ./
77
+ $ mv ~/backup/_site/* ./
78
+ $ git add .
79
+ $ git commit -m "First draft"
80
+
81
+ The repository's content is backup in the home directory of the user.
82
+
83
+ And finally push to github
84
+
85
+ $ git push --u origin gh-pages
86
+
87
+ ### On any server
88
+
89
+ In your own website's directory, edit the `_config.yml` file:
90
+
91
+ ```yaml
92
+ url: "https:<domain-name>"
93
+ ```
94
+
95
+ Build the website with:
96
+
97
+ $ JEKYLL_ENV=production bundle exec jekyll build
98
+
99
+ Copy the content of the folder `_site` to your server, most likely in `www`.
100
+
101
+ If necessary, configure your server to serve this directory.
68
102
 
69
103
  # Contributing
70
104
 
71
- Bug reports and pull requests are welcome on GitHub at https://github.com/moodule/hello. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant][contributor-covenant] code of conduct.
105
+ Bug reports and pull requests are welcome on GitHub at https://github.com/moodule/jekyll-theme-overflow. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant][contributor-covenant] code of conduct.
72
106
 
73
107
  # Development
74
108
 
@@ -136,6 +170,8 @@ Credits:
136
170
 
137
171
  Inspired by the conversions of [Andrew Banchich][andrew-banchich].
138
172
 
173
+ Uses the basic template from the [cookie consent plugin][cookieconsent].
174
+
139
175
  Repository [Jekyll logo][jekyll-logo] icon licensed under a [Creative Commons Attribution 4.0 International License][cc4-license].
140
176
 
141
177
  ## License
@@ -145,5 +181,6 @@ The theme is available as open source under the terms of the [CC-BY-3.0](LICENSE
145
181
  [andrew-banchich]: https://gitlab.com/andrewbanchich
146
182
  [cc4-license]: http://choosealicense.com/licenses/cc-by-4.0/
147
183
  [contributor-covenant]: http://contributor-covenant.org
184
+ [cookieconsent]: https://github.com/osano/cookieconsent
148
185
  [html5up]: https://html5up.net/
149
186
  [jekyll-logo]: https://github.com/jekyll/brand
@@ -37,6 +37,8 @@
37
37
  <li>&copy; {{ site.title }} {{ site.subtitle }}. All rights reserved.</li>
38
38
  <li>Design: <a href="http://html5up.net" target="_blank">HTML5 UP</a></li>
39
39
  <li>Jekyll integration: <a href="http://github.com/moodule" target="_blank">David Mougeolle</a></li>
40
+ {% if site.privacy_policy_url %}<li><a href="{{ site.privacy_policy_url | absolute_url }}" target="_blank">Privacy Policy</a></li>{% endif %}
41
+ {% if site.legal_terms_url %}<li><a href="{{ site.legal_terms_url | absolute_url }}" target="_blank">Legal Terms</a></li>{% endif %}
40
42
  </ul>
41
43
  </div>
42
44
  </section>
data/_includes/head.html CHANGED
@@ -1,5 +1,5 @@
1
1
  <head>
2
- <title>{{ site.title }} {{ site.subtitle }}</title>
2
+ <title>{{ site.title }} - {{ site.subtitle }}</title>
3
3
  <meta charset="utf-8" />
4
4
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
5
5
  <link rel="stylesheet" href="assets/css/main.css" />
@@ -5,4 +5,17 @@
5
5
  <script src="assets/js/browser.min.js"></script>
6
6
  <script src="assets/js/breakpoints.min.js"></script>
7
7
  <script src="assets/js/util.js"></script>
8
- <script src="assets/js/main.js"></script>
8
+ <script src="assets/js/main.js"></script>
9
+ <script src="{{ 'assets/js/cookieconsent.min.js' | absolute_url }}" data-cfasync="false"></script>
10
+ <script>
11
+ window.cookieconsent.initialise({
12
+ "palette": {
13
+ "popup": {
14
+ "background": "#252e39"
15
+ },
16
+ "button": {
17
+ "background": "#14a7d0"
18
+ }
19
+ }
20
+ });
21
+ </script>
@@ -0,0 +1,10 @@
1
+ ---
2
+ lang: x-default
3
+ ---
4
+ <!doctype html>
5
+ <html>
6
+ <head>
7
+ <meta http-equiv="refresh" content="0; url={{ page.forward_url | absolute_url }}">
8
+ <link rel="canonical" href="{{ page.forward_url | absolute_url }}" />
9
+ </head>
10
+ </html>
@@ -0,0 +1,18 @@
1
+ ---
2
+ layout: sitemap
3
+ permalink: /sitemap.xml
4
+ ---
5
+ {% assign posts=site.posts %}
6
+ {% assign pages=site.html_pages | concat: posts %}
7
+ <?xml version="1.0" encoding="UTF-8"?>
8
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
9
+ {% for page in pages %}
10
+ {% unless page.url contains "404" %}
11
+ <url>
12
+ <loc>{{ page.url | absolute_url}}</loc>
13
+ <xhtml:link rel="alternate" hreflang="en" href="{{ page.url | absolute_url }}" />
14
+ <changefreq>weekly</changefreq>
15
+ </url>
16
+ {% endunless %}
17
+ {% endfor %}
18
+ </urlset>
@@ -0,0 +1,402 @@
1
+ .cc-window {
2
+ opacity: 1;
3
+
4
+ -webkit-transition: opacity 1s ease;
5
+ -moz-transition: opacity 1s ease;
6
+ -ms-transition: opacity 1s ease;
7
+ -o-transition: opacity 1s ease;
8
+ transition: opacity 1s ease;
9
+ }
10
+
11
+ .cc-window.cc-invisible {
12
+ opacity: 0;
13
+ }
14
+
15
+ /* only animate ifhas class 'cc-animate' */
16
+ .cc-animate.cc-revoke {
17
+ -webkit-transition: transform 1s ease;
18
+ -moz-transition: transform 1s ease;
19
+ -ms-transition: transform 1s ease;
20
+ -o-transition: transform 1s ease;
21
+ transition: transform 1s ease;
22
+ }
23
+ .cc-animate.cc-revoke.cc-top {
24
+ transform: translateY(-2em);
25
+ }
26
+ .cc-animate.cc-revoke.cc-bottom {
27
+ transform: translateY(2em);
28
+ }
29
+ .cc-animate.cc-revoke.cc-active.cc-top {
30
+ transform: translateY(0);
31
+ }
32
+ .cc-animate.cc-revoke.cc-active.cc-bottom {
33
+ transform: translateY(0);
34
+ }
35
+ .cc-revoke:hover {
36
+ transform: translateY(0);
37
+ }
38
+
39
+ .cc-grower {
40
+ /* Initially we don't want any height, and we want the contents to be hidden */
41
+ max-height: 0;
42
+ overflow: hidden;
43
+
44
+ /* Set our transitions up. */
45
+ -webkit-transition: max-height 1s;
46
+ -moz-transition: max-height 1s;
47
+ -ms-transition: max-height 1s;
48
+ -o-transition: max-height 1s;
49
+ transition: max-height 1s;
50
+ }
51
+
52
+ /* the popup window */
53
+ .cc-window,
54
+ .cc-revoke {
55
+ position: fixed;
56
+ overflow: hidden;
57
+ box-sizing: border-box; /* exclude padding when dealing with width */
58
+
59
+ font-family: Helvetica, Calibri, Arial, sans-serif;
60
+ font-size: 16px; /* by setting the base font here, we can size the rest of the popup using CSS `em` */
61
+ line-height: 1.5em;
62
+
63
+ display: flex;
64
+ flex-wrap: nowrap;
65
+
66
+ /* the following are random unjustified styles - just because - should probably be removed */
67
+ z-index: 9998;
68
+ }
69
+
70
+ .cc-revoke {
71
+ z-index: 9999;
72
+ }
73
+
74
+ .cc-window.cc-static {
75
+ position: static;
76
+ }
77
+
78
+ /* 2 basic types of window - floating / banner */
79
+ .cc-window.cc-floating {
80
+ padding: 2em;
81
+ max-width: 24em; /* 1em == 16px therefore 24em == 384px */
82
+ flex-direction: column;
83
+ }
84
+ .cc-window.cc-banner {
85
+ padding: 1em 1.8em;
86
+ width: 100%;
87
+ flex-direction: row;
88
+ }
89
+
90
+ .cc-revoke {
91
+ padding: 0.5em;
92
+ }
93
+ .cc-revoke:hover {
94
+ text-decoration: underline;
95
+ }
96
+
97
+ .cc-header {
98
+ font-size: 18px;
99
+ font-weight: bold;
100
+ }
101
+
102
+ /* clickable things */
103
+ .cc-btn,
104
+ .cc-link,
105
+ .cc-close,
106
+ .cc-revoke {
107
+ cursor: pointer;
108
+ }
109
+
110
+ .cc-link {
111
+ opacity: 0.8;
112
+ display: inline-block;
113
+ border: none;
114
+ padding: 0.2em;
115
+ text-decoration: underline;
116
+ }
117
+ .cc-link:hover {
118
+ opacity: 1;
119
+ }
120
+ .cc-link:active,
121
+ .cc-link:visited {
122
+ color: initial;
123
+ }
124
+
125
+ .cc-btn {
126
+ display: block;
127
+ padding: 0.4em 0.8em;
128
+ font-size: 0.9em;
129
+ font-weight: bold;
130
+ border-width: 2px;
131
+ border-style: solid;
132
+ text-align: center;
133
+ white-space: nowrap;
134
+ }
135
+
136
+ .cc-highlight .cc-btn:first-child {
137
+ background-color: transparent;
138
+ border-color: transparent;
139
+ }
140
+
141
+ .cc-highlight .cc-btn:first-child:hover,
142
+ .cc-highlight .cc-btn:first-child:focus {
143
+ background-color: transparent;
144
+ text-decoration: underline;
145
+ }
146
+
147
+ .cc-close {
148
+ display: block;
149
+ position: absolute;
150
+ top: 0.5em;
151
+ right: 0.5em;
152
+ font-size: 1.6em;
153
+ opacity: 0.9;
154
+
155
+ /* seeing as this contains text and not an image, the element taller than it is wide (because it is text) */
156
+ /* - we want it to be a square, because it's acting as an icon */
157
+ /* - setting the line height normalizes the height */
158
+ line-height: 0.75;
159
+ }
160
+ .cc-close:hover,
161
+ .cc-close:focus {
162
+ opacity: 1;
163
+ }
164
+
165
+ /* This file should contain styles that modifies the popup layout. */
166
+ /* By layout, we mean the physical position of the elements on the popup window, and the margin / padding around those elements. */
167
+
168
+ .cc-revoke.cc-top {
169
+ top: 0;
170
+ left: 3em;
171
+ border-bottom-left-radius: 0.5em;
172
+ border-bottom-right-radius: 0.5em;
173
+ }
174
+ .cc-revoke.cc-bottom {
175
+ bottom: 0;
176
+ left: 3em;
177
+ border-top-left-radius: 0.5em;
178
+ border-top-right-radius: 0.5em;
179
+ }
180
+ .cc-revoke.cc-left {
181
+ left: 3em;
182
+ right: unset;
183
+ }
184
+ .cc-revoke.cc-right {
185
+ right: 3em;
186
+ left: unset;
187
+ }
188
+
189
+ /**************************************** FLOATING ****************************************/
190
+
191
+ /* these classes position the floating element */
192
+ .cc-top {
193
+ top: 1em;
194
+ }
195
+ .cc-left {
196
+ left: 1em;
197
+ }
198
+ .cc-right {
199
+ right: 1em;
200
+ }
201
+ .cc-bottom {
202
+ bottom: 1em;
203
+ }
204
+
205
+ /* links that are direct decendants should be displayed as block */
206
+ .cc-floating > .cc-link {
207
+ margin-bottom: 1em;
208
+ }
209
+
210
+ .cc-floating .cc-message {
211
+ display: block;
212
+ margin-bottom: 1em;
213
+ }
214
+
215
+ .cc-window.cc-floating .cc-compliance {
216
+ flex: 1 0 auto;
217
+ }
218
+
219
+ /**************************************** BANNER ****************************************/
220
+
221
+ .cc-window.cc-banner {
222
+ align-items: center;
223
+ }
224
+
225
+ .cc-banner.cc-top {
226
+ left: 0;
227
+ right: 0;
228
+ top: 0;
229
+ }
230
+ .cc-banner.cc-bottom {
231
+ left: 0;
232
+ right: 0;
233
+ bottom: 0;
234
+ }
235
+
236
+ .cc-banner .cc-message {
237
+ display: block;
238
+ flex: 1 1 auto;
239
+ max-width: 100%;
240
+ margin-right: 1em;
241
+ }
242
+
243
+ /* COMPLIANCE BOX */
244
+
245
+ .cc-compliance {
246
+ display: flex;
247
+ align-items: center;
248
+ justify-content: space-between;
249
+ }
250
+ .cc-floating .cc-compliance > .cc-btn {
251
+ flex: 1;
252
+ }
253
+
254
+ .cc-btn + .cc-btn {
255
+ margin-left: 0.5em;
256
+ }
257
+
258
+ /* Categories Layout */
259
+ .cc-window.cc-type-categories {
260
+ display : inline-flex;
261
+ flex-direction: column;
262
+ overflow : visible;
263
+ .form{
264
+ text-align: right;
265
+ }
266
+ .cc-btn {
267
+ margin: 0;
268
+ &.cc-save {
269
+ margin : 0;
270
+ display : inline-block;
271
+ }
272
+ }
273
+ }
274
+ .cc-categories {
275
+ display: inline-flex;
276
+ .cc-category{
277
+ display : flex;
278
+ max-width: 100%;
279
+ margin : 0 2px;
280
+ position : relative;
281
+ }
282
+ .cc-btn {
283
+ border-right: none;
284
+ outline : none;
285
+ input[type=checkbox]{
286
+ float: left;
287
+ height: 26px;
288
+ width: calc( 100% - 22px );
289
+ display: block;
290
+ position: absolute;
291
+ top: 0;
292
+ left: 2px;
293
+ cursor: pointer;
294
+ }
295
+ &:not(.cc-info):not(.cc-save){
296
+ padding-left: 26px;
297
+ }
298
+ }
299
+ .cc-info {
300
+ border-left : none;
301
+ border-right: 2px solid lightgrey;
302
+ padding : 4px;
303
+ font-variant: all-small-caps;
304
+ &:focus + .cc-tooltip{
305
+ display: block;
306
+ }
307
+ }
308
+ .cc-tooltip{
309
+ display : none;
310
+ position : absolute;
311
+ z-index : 3;
312
+ width : 190px;
313
+ bottom : 46px;
314
+ padding : 8px;
315
+ border : thin solid lightgrey;
316
+ box-shadow: 1px 1px 4px rgba( 150, 150, 150, .7 );
317
+ &:after{
318
+ content : "";
319
+ width : 10px;
320
+ height : 10px;
321
+ transform : rotate(45deg);
322
+ position : absolute;
323
+ bottom : -7px;
324
+ left : 10px;
325
+ box-shadow: 2px 1px 1px rgba( 200, 200, 200, .5 );
326
+ }
327
+ p {
328
+ margin: 0;
329
+ }
330
+ }
331
+ }
332
+
333
+ @media print {
334
+ .cc-window,
335
+ .cc-revoke {
336
+ display: none;
337
+ }
338
+ }
339
+
340
+ @media screen and (max-width: 900px) {
341
+ .cc-btn {
342
+ white-space: normal;
343
+ }
344
+ }
345
+
346
+ /* dimensions for 'iPhone6 Plus' and lower */
347
+ @media screen and (max-width: 414px) and (orientation: portrait),
348
+ screen and (max-width: 736px) and (orientation: landscape) {
349
+ .cc-window {
350
+ &.cc-top {
351
+ top: 0;
352
+ }
353
+ &.cc-bottom {
354
+ bottom: 0;
355
+ }
356
+ &.cc-banner,
357
+ &.cc-floating,
358
+ &.cc-right,
359
+ &.cc-left {
360
+ left: 0;
361
+ right: 0;
362
+ }
363
+
364
+ &.cc-banner {
365
+ flex-direction: column;
366
+ align-items: unset;
367
+ .cc-compliance {
368
+ flex: 1 1 auto;
369
+ }
370
+ .cc-message {
371
+ margin-right: 0;
372
+ margin-bottom: 1em;
373
+ }
374
+ }
375
+ &.cc-floating {
376
+ max-width: none;
377
+ }
378
+ &.cc-type-categories {
379
+ flex-direction: column;
380
+ }
381
+ .cc-message {
382
+ margin-bottom: 1em;
383
+ }
384
+ .cc-categories{
385
+ flex-direction: column;
386
+ width: 100%;
387
+ margin-right: 8px;
388
+ }
389
+ .cc-category {
390
+ margin: 4px 0;
391
+ .cc-btn:not(.cc-info){
392
+ width: calc( 100% - 16px);
393
+ min-width: 140px;
394
+ }
395
+ }
396
+ }
397
+ }
398
+ @media screen and (max-width: 854px) {
399
+ .cc-window.cc-type-categories .cc-btn.cc-save {
400
+ margin: 8px 0;
401
+ }
402
+ }
data/_sass/main.scss CHANGED
@@ -22,6 +22,10 @@
22
22
  mobile: ( null, 736px )
23
23
  ));
24
24
 
25
+ // Components
26
+
27
+ @import 'components/cookieconsent';
28
+
25
29
  // Reset.
26
30
  // Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain)
27
31
 
@@ -0,0 +1 @@
1
+ !function(e){if(!e.hasInitialised){var t={escapeRegExp:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},hasClass:function(e,t){var i=" ";return 1===e.nodeType&&(i+e.className+i).replace(/[\n\t]/g,i).indexOf(i+t+i)>=0},addClass:function(e,t){e.className+=" "+t},removeClass:function(e,t){var i=new RegExp("\\b"+this.escapeRegExp(t)+"\\b");e.className=e.className.replace(i,"")},interpolateString:function(e,t){return e.replace(/{{([a-z][a-z0-9\-_]*)}}/gi,function(e){return t(arguments[1])||""})},getCookie:function(e){var t=("; "+document.cookie).split("; "+e+"=");return t.length<2?void 0:t.pop().split(";").shift()},setCookie:function(e,t,i,n,o,s){var r=new Date;r.setHours(r.getHours()+24*(i||365));var a=[e+"="+t,"expires="+r.toUTCString(),"path="+(o||"/")];n&&a.push("domain="+n),s&&a.push("secure"),document.cookie=a.join(";")},deepExtend:function(e,t){for(var i in t)t.hasOwnProperty(i)&&(i in e&&this.isPlainObject(e[i])&&this.isPlainObject(t[i])?this.deepExtend(e[i],t[i]):e[i]=t[i]);return e},throttle:function(e,t){var i=!1;return function(){i||(e.apply(this,arguments),i=!0,setTimeout(function(){i=!1},t))}},hash:function(e){var t,i,n=0;if(0===e.length)return n;for(t=0,i=e.length;t<i;++t)n=(n<<5)-n+e.charCodeAt(t),n|=0;return n},normaliseHex:function(e){return"#"==e[0]&&(e=e.substr(1)),3==e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e},getContrast:function(e){return e=this.normaliseHex(e),(299*parseInt(e.substr(0,2),16)+587*parseInt(e.substr(2,2),16)+114*parseInt(e.substr(4,2),16))/1e3>=128?"#000":"#fff"},getLuminance:function(e){var t=parseInt(this.normaliseHex(e),16),i=38+(t>>16),n=38+(t>>8&255),o=38+(255&t);return"#"+(16777216+65536*(i<255?i<1?0:i:255)+256*(n<255?n<1?0:n:255)+(o<255?o<1?0:o:255)).toString(16).slice(1)},isMobile:function(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},isPlainObject:function(e){return"object"==typeof e&&null!==e&&e.constructor==Object},traverseDOMPath:function(e,i){return e&&e.parentNode?t.hasClass(e,i)?e:this.traverseDOMPath(e.parentNode,i):null}};e.status={deny:"deny",allow:"allow",dismiss:"dismiss"},e.transitionEnd=function(){var e=document.createElement("div"),t={t:"transitionend",OT:"oTransitionEnd",msT:"MSTransitionEnd",MozT:"transitionend",WebkitT:"webkitTransitionEnd"};for(var i in t)if(t.hasOwnProperty(i)&&void 0!==e.style[i+"ransition"])return t[i];return""}(),e.hasTransition=!!e.transitionEnd;var i=Object.keys(e.status).map(t.escapeRegExp);e.customStyles={},e.Popup=function(){var n={enabled:!0,container:null,cookie:{name:"cookieconsent_status",path:"/",domain:"",expiryDays:365,secure:!1},onPopupOpen:function(){},onPopupClose:function(){},onInitialise:function(e){},onStatusChange:function(e,t){},onRevokeChoice:function(){},onNoCookieLaw:function(e,t){},content:{header:"Cookies used on the website!",message:"This website uses cookies to ensure you get the best experience on our website.",dismiss:"Got it!",allow:"Allow cookies",deny:"Decline",link:"Learn more",href:"https://www.cookiesandyou.com",close:"&#x274c;",target:"_blank",policy:"Cookie Policy"},elements:{header:'<span class="cc-header">{{header}}</span>&nbsp;',message:'<span id="cookieconsent:desc" class="cc-message">{{message}}</span>',messagelink:'<span id="cookieconsent:desc" class="cc-message">{{message}} <a aria-label="learn more about cookies" role=button tabindex="0" class="cc-link" href="{{href}}" rel="noopener noreferrer nofollow" target="{{target}}">{{link}}</a></span>',dismiss:'<a aria-label="dismiss cookie message" role=button tabindex="0" class="cc-btn cc-dismiss">{{dismiss}}</a>',allow:'<a aria-label="allow cookies" role=button tabindex="0" class="cc-btn cc-allow">{{allow}}</a>',deny:'<a aria-label="deny cookies" role=button tabindex="0" class="cc-btn cc-deny">{{deny}}</a>',link:'<a aria-label="learn more about cookies" role=button tabindex="0" class="cc-link" href="{{href}}" rel="noopener noreferrer nofollow" target="{{target}}">{{link}}</a>',close:'<span aria-label="dismiss cookie message" role=button tabindex="0" class="cc-close">{{close}}</span>'},window:'<div role="dialog" aria-live="polite" aria-label="cookieconsent" aria-describedby="cookieconsent:desc" class="cc-window {{classes}}">\x3c!--googleoff: all--\x3e{{children}}\x3c!--googleon: all--\x3e</div>',revokeBtn:'<div class="cc-revoke {{classes}}">{{policy}}</div>',compliance:{info:'<div class="cc-compliance">{{dismiss}}</div>',"opt-in":'<div class="cc-compliance cc-highlight">{{deny}}{{allow}}</div>',"opt-out":'<div class="cc-compliance cc-highlight">{{deny}}{{allow}}</div>'},type:"info",layouts:{basic:"{{messagelink}}{{compliance}}","basic-close":"{{messagelink}}{{compliance}}{{close}}","basic-header":"{{header}}{{message}}{{link}}{{compliance}}"},layout:"basic",position:"bottom",theme:"block",static:!1,palette:null,revokable:!1,animateRevokable:!0,showLink:!0,dismissOnScroll:!1,dismissOnTimeout:!1,dismissOnWindowClick:!1,ignoreClicksFrom:["cc-revoke","cc-btn"],autoOpen:!0,autoAttach:!0,whitelistPage:[],blacklistPage:[],overrideHTML:null};function o(){this.initialise.apply(this,arguments)}function s(e){this.openingTimeout=null,t.removeClass(e,"cc-invisible")}function r(t){t.style.display="none",t.removeEventListener(e.transitionEnd,this.afterTransition),this.afterTransition=null}function a(){var e=this.options.position.split("-"),t=[];return e.forEach(function(e){t.push("cc-"+e)}),t}function c(n){var o=this.options,s=document.createElement("div"),r=o.container&&1===o.container.nodeType?o.container:document.body;s.innerHTML=n;var a=s.children[0];return a.style.display="none",t.hasClass(a,"cc-window")&&e.hasTransition&&t.addClass(a,"cc-invisible"),this.onButtonClick=function(n){var o=t.traverseDOMPath(n.target,"cc-btn")||n.target;if(t.hasClass(o,"cc-btn")){var s=o.className.match(new RegExp("\\bcc-("+i.join("|")+")\\b")),r=s&&s[1]||!1;r&&(this.setStatus(r),this.close(!0))}t.hasClass(o,"cc-close")&&(this.setStatus(e.status.dismiss),this.close(!0));t.hasClass(o,"cc-revoke")&&this.revokeChoice()}.bind(this),a.addEventListener("click",this.onButtonClick),o.autoAttach&&(r.firstChild?r.insertBefore(a,r.firstChild):r.appendChild(a)),a}function l(e){return"000000"==(e=t.normaliseHex(e))?"#222":t.getLuminance(e)}function u(e,t){for(var i=0,n=e.length;i<n;++i){var o=e[i];if(o instanceof RegExp&&o.test(t)||"string"==typeof o&&o.length&&o===t)return!0}return!1}return o.prototype.initialise=function(i){this.options&&this.destroy(),t.deepExtend(this.options={},n),t.isPlainObject(i)&&t.deepExtend(this.options,i),function(){var t=this.options.onInitialise.bind(this);if(!window.navigator.cookieEnabled)return t(e.status.deny),!0;if(window.CookiesOK||window.navigator.CookiesOK)return t(e.status.allow),!0;var i=Object.keys(e.status),n=this.getStatus(),o=i.indexOf(n)>=0;o&&t(n);return o}.call(this)&&(this.options.enabled=!1),u(this.options.blacklistPage,location.pathname)&&(this.options.enabled=!1),u(this.options.whitelistPage,location.pathname)&&(this.options.enabled=!0);var o=this.options.window.replace("{{classes}}",function(){var i=this.options,n="top"==i.position||"bottom"==i.position?"banner":"floating";t.isMobile()&&(n="floating");var o=["cc-"+n,"cc-type-"+i.type,"cc-theme-"+i.theme];i.static&&o.push("cc-static");o.push.apply(o,a.call(this));(function(i){var n=t.hash(JSON.stringify(i)),o="cc-color-override-"+n,s=t.isPlainObject(i);this.customStyleSelector=s?o:null,s&&function(i,n,o){if(e.customStyles[i])return void++e.customStyles[i].references;var s={},r=n.popup,a=n.button,c=n.highlight;r&&(r.text=r.text?r.text:t.getContrast(r.background),r.link=r.link?r.link:r.text,s[o+".cc-window"]=["color: "+r.text,"background-color: "+r.background],s[o+".cc-revoke"]=["color: "+r.text,"background-color: "+r.background],s[o+" .cc-link,"+o+" .cc-link:active,"+o+" .cc-link:visited"]=["color: "+r.link],a&&(a.text=a.text?a.text:t.getContrast(a.background),a.border=a.border?a.border:"transparent",s[o+" .cc-btn"]=["color: "+a.text,"border-color: "+a.border,"background-color: "+a.background],a.padding&&s[o+" .cc-btn"].push("padding: "+a.padding),"transparent"!=a.background&&(s[o+" .cc-btn:hover, "+o+" .cc-btn:focus"]=["background-color: "+(a.hover||l(a.background))]),c?(c.text=c.text?c.text:t.getContrast(c.background),c.border=c.border?c.border:"transparent",s[o+" .cc-highlight .cc-btn:first-child"]=["color: "+c.text,"border-color: "+c.border,"background-color: "+c.background]):s[o+" .cc-highlight .cc-btn:first-child"]=["color: "+r.text]));var u=document.createElement("style");document.head.appendChild(u),e.customStyles[i]={references:1,element:u.sheet};var h=-1;for(var p in s)s.hasOwnProperty(p)&&u.sheet.insertRule(p+"{"+s[p].join(";")+"}",++h)}(n,i,"."+o);return s}).call(this,this.options.palette);this.customStyleSelector&&o.push(this.customStyleSelector);return o}.call(this).join(" ")).replace("{{children}}",function(){var e={},i=this.options;i.showLink||(i.elements.link="",i.elements.messagelink=i.elements.message);Object.keys(i.elements).forEach(function(n){e[n]=t.interpolateString(i.elements[n],function(e){var t=i.content[e];return e&&"string"==typeof t&&t.length?t:""})});var n=i.compliance[i.type];n||(n=i.compliance.info);e.compliance=t.interpolateString(n,function(t){return e[t]});var o=i.layouts[i.layout];o||(o=i.layouts.basic);return t.interpolateString(o,function(t){return e[t]})}.call(this)),s=this.options.overrideHTML;if("string"==typeof s&&s.length&&(o=s),this.options.static){var r=c.call(this,'<div class="cc-grower">'+o+"</div>");r.style.display="",this.element=r.firstChild,this.element.style.display="none",t.addClass(this.element,"cc-invisible")}else this.element=c.call(this,o);(function(){var i=this.setStatus.bind(this),n=this.close.bind(this),o=this.options.dismissOnTimeout;"number"==typeof o&&o>=0&&(this.dismissTimeout=window.setTimeout(function(){i(e.status.dismiss),n(!0)},Math.floor(o)));var s=this.options.dismissOnScroll;if("number"==typeof s&&s>=0){var r=function(t){window.pageYOffset>Math.floor(s)&&(i(e.status.dismiss),n(!0),window.removeEventListener("scroll",r),this.onWindowScroll=null)};this.options.enabled&&(this.onWindowScroll=r,window.addEventListener("scroll",r))}var a=this.options.dismissOnWindowClick,c=this.options.ignoreClicksFrom;if(a){var l=function(o){for(var s=!1,r=o.path.length,a=c.length,u=0;u<r;u++)if(!s)for(var h=0;h<a;h++)s||(s=t.hasClass(o.path[u],c[h]));s||(i(e.status.dismiss),n(!0),window.removeEventListener("click",l),window.removeEventListener("touchend",l),this.onWindowClick=null)}.bind(this);this.options.enabled&&(this.onWindowClick=l,window.addEventListener("click",l),window.addEventListener("touchend",l))}}).call(this),function(){"info"!=this.options.type&&(this.options.revokable=!0);t.isMobile()&&(this.options.animateRevokable=!1);if(this.options.revokable){var e=a.call(this);this.options.animateRevokable&&e.push("cc-animate"),this.customStyleSelector&&e.push(this.customStyleSelector);var i=this.options.revokeBtn.replace("{{classes}}",e.join(" ")).replace("{{policy}}",this.options.content.policy);this.revokeBtn=c.call(this,i);var n=this.revokeBtn;if(this.options.animateRevokable){var o=t.throttle(function(e){var i=!1,o=window.innerHeight-20;t.hasClass(n,"cc-top")&&e.clientY<20&&(i=!0),t.hasClass(n,"cc-bottom")&&e.clientY>o&&(i=!0),i?t.hasClass(n,"cc-active")||t.addClass(n,"cc-active"):t.hasClass(n,"cc-active")&&t.removeClass(n,"cc-active")},200);this.onMouseMove=o,window.addEventListener("mousemove",o)}}}.call(this),this.options.autoOpen&&this.autoOpen()},o.prototype.destroy=function(){this.onButtonClick&&this.element&&(this.element.removeEventListener("click",this.onButtonClick),this.onButtonClick=null),this.dismissTimeout&&(clearTimeout(this.dismissTimeout),this.dismissTimeout=null),this.onWindowScroll&&(window.removeEventListener("scroll",this.onWindowScroll),this.onWindowScroll=null),this.onWindowClick&&(window.removeEventListener("click",this.onWindowClick),this.onWindowClick=null),this.onMouseMove&&(window.removeEventListener("mousemove",this.onMouseMove),this.onMouseMove=null),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.revokeBtn&&this.revokeBtn.parentNode&&this.revokeBtn.parentNode.removeChild(this.revokeBtn),this.revokeBtn=null,function(i){if(t.isPlainObject(i)){var n=t.hash(JSON.stringify(i)),o=e.customStyles[n];if(o&&!--o.references){var s=o.element.ownerNode;s&&s.parentNode&&s.parentNode.removeChild(s),e.customStyles[n]=null}}}(this.options.palette),this.options=null},o.prototype.open=function(t){if(this.element)return this.isOpen()||(e.hasTransition?this.fadeIn():this.element.style.display="",this.options.revokable&&this.toggleRevokeButton(),this.options.onPopupOpen.call(this)),this},o.prototype.close=function(t){if(this.element)return this.isOpen()&&(e.hasTransition?this.fadeOut():this.element.style.display="none",t&&this.options.revokable&&this.toggleRevokeButton(!0),this.options.onPopupClose.call(this)),this},o.prototype.fadeIn=function(){var i=this.element;if(e.hasTransition&&i&&(this.afterTransition&&r.call(this,i),t.hasClass(i,"cc-invisible"))){if(i.style.display="",this.options.static){var n=this.element.clientHeight;this.element.parentNode.style.maxHeight=n+"px"}this.openingTimeout=setTimeout(s.bind(this,i),20)}},o.prototype.fadeOut=function(){var i=this.element;e.hasTransition&&i&&(this.openingTimeout&&(clearTimeout(this.openingTimeout),s.bind(this,i)),t.hasClass(i,"cc-invisible")||(this.options.static&&(this.element.parentNode.style.maxHeight=""),this.afterTransition=r.bind(this,i),i.addEventListener(e.transitionEnd,this.afterTransition),t.addClass(i,"cc-invisible")))},o.prototype.isOpen=function(){return this.element&&""==this.element.style.display&&(!e.hasTransition||!t.hasClass(this.element,"cc-invisible"))},o.prototype.toggleRevokeButton=function(e){this.revokeBtn&&(this.revokeBtn.style.display=e?"":"none")},o.prototype.revokeChoice=function(e){this.options.enabled=!0,this.clearStatus(),this.options.onRevokeChoice.call(this),e||this.autoOpen()},o.prototype.hasAnswered=function(t){return Object.keys(e.status).indexOf(this.getStatus())>=0},o.prototype.hasConsented=function(t){var i=this.getStatus();return i==e.status.allow||i==e.status.dismiss},o.prototype.autoOpen=function(e){!this.hasAnswered()&&this.options.enabled?this.open():this.hasAnswered()&&this.options.revokable&&this.toggleRevokeButton(!0)},o.prototype.setStatus=function(i){var n=this.options.cookie,o=t.getCookie(n.name),s=Object.keys(e.status).indexOf(o)>=0;Object.keys(e.status).indexOf(i)>=0?(t.setCookie(n.name,i,n.expiryDays,n.domain,n.path,n.secure),this.options.onStatusChange.call(this,i,s)):this.clearStatus()},o.prototype.getStatus=function(){return t.getCookie(this.options.cookie.name)},o.prototype.clearStatus=function(){var e=this.options.cookie;t.setCookie(e.name,"",-1,e.domain,e.path)},o}(),e.Location=function(){var e={timeout:5e3,services:["ipinfo"],serviceDefinitions:{ipinfo:function(){return{url:"//ipinfo.io",headers:["Accept: application/json"],callback:function(e,t){try{var i=JSON.parse(t);return i.error?s(i):{code:i.country}}catch(e){return s({error:"Invalid response ("+e+")"})}}}},ipinfodb:function(e){return{url:"//api.ipinfodb.com/v3/ip-country/?key={api_key}&format=json&callback={callback}",isScript:!0,callback:function(e,t){try{var i=JSON.parse(t);return"ERROR"==i.statusCode?s({error:i.statusMessage}):{code:i.countryCode}}catch(e){return s({error:"Invalid response ("+e+")"})}}}},maxmind:function(){return{url:"//js.maxmind.com/js/apis/geoip2/v2.1/geoip2.js",isScript:!0,callback:function(e){window.geoip2?geoip2.country(function(t){try{e({code:t.country.iso_code})}catch(t){e(s(t))}},function(t){e(s(t))}):e(new Error("Unexpected response format. The downloaded script should have exported `geoip2` to the global scope"))}}}}};function i(i){t.deepExtend(this.options={},e),t.isPlainObject(i)&&t.deepExtend(this.options,i),this.currentServiceIndex=-1}function n(e,t,i){var n,o=document.createElement("script");o.type="text/"+(e.type||"javascript"),o.src=e.src||e,o.async=!1,o.onreadystatechange=o.onload=function(){var e=o.readyState;clearTimeout(n),t.done||e&&!/loaded|complete/.test(e)||(t.done=!0,t(),o.onreadystatechange=o.onload=null)},document.body.appendChild(o),n=setTimeout(function(){t.done=!0,t(),o.onreadystatechange=o.onload=null},i)}function o(e,t,i,n,o){var s=new(window.XMLHttpRequest||window.ActiveXObject)("MSXML2.XMLHTTP.3.0");if(s.open(n?"POST":"GET",e,1),s.setRequestHeader("Content-type","application/x-www-form-urlencoded"),Array.isArray(o))for(var r=0,a=o.length;r<a;++r){var c=o[r].split(":",2);s.setRequestHeader(c[0].replace(/^\s+|\s+$/g,""),c[1].replace(/^\s+|\s+$/g,""))}"function"==typeof t&&(s.onreadystatechange=function(){s.readyState>3&&t(s)}),s.send(n)}function s(e){return new Error("Error ["+(e.code||"UNKNOWN")+"]: "+e.error)}return i.prototype.getNextService=function(){var e;do{e=this.getServiceByIdx(++this.currentServiceIndex)}while(this.currentServiceIndex<this.options.services.length&&!e);return e},i.prototype.getServiceByIdx=function(e){var i=this.options.services[e];if("function"==typeof i){var n=i();return n.name&&t.deepExtend(n,this.options.serviceDefinitions[n.name](n)),n}return"string"==typeof i?this.options.serviceDefinitions[i]():t.isPlainObject(i)?this.options.serviceDefinitions[i.name](i):null},i.prototype.locate=function(e,t){var i=this.getNextService();i?(this.callbackComplete=e,this.callbackError=t,this.runService(i,this.runNextServiceOnError.bind(this))):t(new Error("No services to run"))},i.prototype.setupUrl=function(e){var t=this.getCurrentServiceOpts();return e.url.replace(/\{(.*?)\}/g,function(i,n){if("callback"===n){var o="callback"+Date.now();return window[o]=function(t){e.__JSONP_DATA=JSON.stringify(t)},o}if(n in t.interpolateUrl)return t.interpolateUrl[n]})},i.prototype.runService=function(e,t){var i=this;e&&e.url&&e.callback&&(e.isScript?n:o)(this.setupUrl(e),function(n){var o=n?n.responseText:"";e.__JSONP_DATA&&(o=e.__JSONP_DATA,delete e.__JSONP_DATA),i.runServiceCallback.call(i,t,e,o)},this.options.timeout,e.data,e.headers)},i.prototype.runServiceCallback=function(e,t,i){var n=this,o=t.callback(function(t){o||n.onServiceResult.call(n,e,t)},i);o&&this.onServiceResult.call(this,e,o)},i.prototype.onServiceResult=function(e,t){t instanceof Error||t&&t.error?e.call(this,t,null):e.call(this,null,t)},i.prototype.runNextServiceOnError=function(e,t){if(e){this.logError(e);var i=this.getNextService();i?this.runService(i,this.runNextServiceOnError.bind(this)):this.completeService.call(this,this.callbackError,new Error("All services failed"))}else this.completeService.call(this,this.callbackComplete,t)},i.prototype.getCurrentServiceOpts=function(){var e=this.options.services[this.currentServiceIndex];return"string"==typeof e?{name:e}:"function"==typeof e?e():t.isPlainObject(e)?e:{}},i.prototype.completeService=function(e,t){this.currentServiceIndex=-1,e&&e(t)},i.prototype.logError=function(e){var t=this.currentServiceIndex,i=this.getServiceByIdx(t);console.warn("The service["+t+"] ("+i.url+") responded with the following error",e)},i}(),e.Law=function(){var e={regionalLaw:!0,hasLaw:["AT","BE","BG","HR","CZ","CY","DK","EE","FI","FR","DE","EL","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","SK","ES","SE","GB","UK","GR","EU"],revokable:["HR","CY","DK","EE","FR","DE","LV","LT","NL","PT","ES"],explicitAction:["HR","IT","ES"]};function i(e){this.initialise.apply(this,arguments)}return i.prototype.initialise=function(i){t.deepExtend(this.options={},e),t.isPlainObject(i)&&t.deepExtend(this.options,i)},i.prototype.get=function(e){var t=this.options;return{hasLaw:t.hasLaw.indexOf(e)>=0,revokable:t.revokable.indexOf(e)>=0,explicitAction:t.explicitAction.indexOf(e)>=0}},i.prototype.applyLaw=function(e,t){var i=this.get(t);return i.hasLaw||(e.enabled=!1,"function"==typeof e.onNoCookieLaw&&e.onNoCookieLaw(t,i)),this.options.regionalLaw&&(i.revokable&&(e.revokable=!0),i.explicitAction&&(e.dismissOnScroll=!1,e.dismissOnTimeout=!1)),e},i}(),e.initialise=function(i,n,o){var s=new e.Law(i.law);n||(n=function(){}),o||(o=function(){});var r=Object.keys(e.status),a=t.getCookie("cookieconsent_status");r.indexOf(a)>=0?n(new e.Popup(i)):e.getCountryCode(i,function(t){delete i.law,delete i.location,t.code&&(i=s.applyLaw(i,t.code)),n(new e.Popup(i))},function(t){delete i.law,delete i.location,o(t,new e.Popup(i))})},e.getCountryCode=function(t,i,n){t.law&&t.law.countryCode?i({code:t.law.countryCode}):t.location?new e.Location(t.location).locate(function(e){i(e||{})},n):i({})},e.utils=t,e.hasInitialised=!0,window.cookieconsent=e}}(window.cookieconsent||{});
data/sitemap.md ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ layout: sitemap
3
+ permalink: /sitemap.xml
4
+ ---
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-theme-overflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Mougeolle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-28 00:00:00.000000000 Z
11
+ date: 2019-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -73,6 +73,9 @@ files:
73
73
  - _layouts/default.html
74
74
  - _layouts/page.html
75
75
  - _layouts/post.html
76
+ - _layouts/redirect.html
77
+ - _layouts/sitemap.html
78
+ - _sass/components/_cookieconsent.scss
76
79
  - _sass/libs/_breakpoints.scss
77
80
  - _sass/libs/_functions.scss
78
81
  - _sass/libs/_html-grid.scss
@@ -119,11 +122,13 @@ files:
119
122
  - assets/images/thumbs/08.jpg
120
123
  - assets/js/breakpoints.min.js
121
124
  - assets/js/browser.min.js
125
+ - assets/js/cookieconsent.min.js
122
126
  - assets/js/jquery.min.js
123
127
  - assets/js/jquery.poptrox.min.js
124
128
  - assets/js/jquery.scrolly.min.js
125
129
  - assets/js/main.js
126
130
  - assets/js/util.js
131
+ - sitemap.md
127
132
  homepage: https://github.com/moodule/jekyll-theme-overflow
128
133
  licenses:
129
134
  - CC-BY-3.0
@@ -144,8 +149,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
149
  version: '0'
145
150
  requirements: []
146
151
  rubyforge_project:
147
- rubygems_version: 2.5.2.1
152
+ rubygems_version: 2.7.6.2
148
153
  signing_key:
149
154
  specification_version: 4
150
- summary: A Jekyll version of the \"Overflow\" theme by HTML5 UP.
155
+ summary: A Jekyll version of the \"Overflow\" theme by HTML5 UP, eased by lots of
156
+ automation.
151
157
  test_files: []