monitoring-jekyll-theme 0.1.0

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.
@@ -0,0 +1,491 @@
1
+ /*
2
+ * ES2015 accessible tabs panel system, using ARIA
3
+ * Website: https://van11y.net/accessible-tab-panel/
4
+ * License MIT: https://github.com/nico3333fr/van11y-accessible-tab-panel-aria/blob/master/LICENSE
5
+ */
6
+ (doc => {
7
+
8
+ 'use strict';
9
+
10
+ const TABS_JS = 'js-tabs';
11
+ const TABS_JS_LIST = 'js-tablist';
12
+ const TABS_JS_LISTITEM = 'js-tablist__item';
13
+ const TABS_JS_LISTLINK = 'js-tablist__link';
14
+ const TABS_JS_CONTENT = 'js-tabcontent';
15
+ const TABS_JS_LINK_TO_TAB = 'js-link-to-tab';
16
+
17
+ const TABS_DATA_PREFIX_CLASS = 'data-tabs-prefix-class';
18
+ const TABS_DATA_HX = 'data-hx';
19
+ const TABS_DATA_GENERATED_HX_CLASS = 'data-tabs-generated-hx-class';
20
+ const TABS_DATA_EXISTING_HX = 'data-existing-hx';
21
+
22
+ const TABS_DATA_SELECTED_TAB = 'data-selected';
23
+
24
+ const TABS_PREFIX_IDS = 'label_';
25
+
26
+ const TABS_STYLE = 'tabs';
27
+ const TABS_LIST_STYLE = 'tabs__list';
28
+ const TABS_LISTITEM_STYLE = 'tabs__item';
29
+ const TABS_LINK_STYLE = 'tabs__link';
30
+ const TABS_CONTENT_STYLE = 'tabs__content';
31
+
32
+ const TABS_HX_DEFAULT_CLASS = 'invisible';
33
+
34
+ const TABS_ROLE_TABLIST = 'tablist';
35
+ const TABS_ROLE_TAB = 'tab';
36
+ const TABS_ROLE_TABPANEL = 'tabpanel';
37
+ const TABS_ROLE_PRESENTATION = 'presentation';
38
+
39
+ const ATTR_ROLE = 'role';
40
+ const ATTR_LABELLEDBY = 'aria-labelledby';
41
+ const ATTR_HIDDEN = 'aria-hidden';
42
+ const ATTR_CONTROLS = 'aria-controls';
43
+ const ATTR_SELECTED = 'aria-selected';
44
+
45
+ const DELAY_HASH_UPDATE = 1000;
46
+
47
+ let hash = window.location.hash.replace('#', '');
48
+
49
+ //const IS_OPENED_CLASS = 'is-opened';
50
+
51
+
52
+
53
+ const findById = id => doc.getElementById(id);
54
+
55
+ const addClass = (el, className) => {
56
+ if (el.classList) {
57
+ el.classList.add(className); // IE 10+
58
+ } else {
59
+ el.className += ' ' + className; // IE 8+
60
+ }
61
+ }
62
+
63
+ /*const removeClass = (el, className) => {
64
+ if (el.classList) {
65
+ el.classList.remove(className); // IE 10+
66
+ }
67
+ else {
68
+ el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); // IE 8+
69
+ }
70
+ }*/
71
+
72
+ const hasClass = (el, className) => {
73
+ if (el.classList) {
74
+ return el.classList.contains(className); // IE 10+
75
+ } else {
76
+ return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); // IE 8+ ?
77
+ }
78
+ }
79
+
80
+ const setAttributes = (node, attrs) => {
81
+ Object
82
+ .keys(attrs)
83
+ .forEach((attribute) => {
84
+ node.setAttribute(attribute, attrs[attribute]);
85
+ });
86
+ };
87
+ const unSelectLinks = (elts) => {
88
+ elts
89
+ .forEach((link_node) => {
90
+ setAttributes(link_node, {
91
+ [ATTR_SELECTED]: 'false',
92
+ 'tabindex': '-1'
93
+ });
94
+ });
95
+ }
96
+ const unSelectContents = (elts) => {
97
+ elts
98
+ .forEach((content_node) => {
99
+ content_node.setAttribute(ATTR_HIDDEN, true);
100
+ });
101
+ }
102
+
103
+ const selectLink = (el) => {
104
+ let destination = findById(el.getAttribute(ATTR_CONTROLS));
105
+ setAttributes(el, {
106
+ [ATTR_SELECTED]: 'true',
107
+ 'tabindex': '0'
108
+ });
109
+ destination.removeAttribute(ATTR_HIDDEN);
110
+ setTimeout(function() {
111
+ el.focus();
112
+ }, 0);
113
+ setTimeout(function() {
114
+ history.pushState(null, null, location.pathname + location.search + '#' + el.getAttribute(ATTR_CONTROLS))
115
+ }, DELAY_HASH_UPDATE);
116
+ }
117
+
118
+ const selectLinkInList = (itemsList, linkList, contentList, param) => {
119
+ let indice_trouve;
120
+
121
+ itemsList
122
+ .forEach((itemNode, index) => {
123
+ if (itemNode.querySelector('.' + TABS_JS_LISTLINK).getAttribute(ATTR_SELECTED) === 'true') {
124
+ indice_trouve = index;
125
+ }
126
+ });
127
+ unSelectLinks(linkList);
128
+ unSelectContents(contentList);
129
+ if (param === 'next') {
130
+ selectLink(linkList[indice_trouve + 1]);
131
+ setTimeout(function() {
132
+ linkList[indice_trouve + 1].focus();
133
+ }, 0);
134
+ }
135
+ if (param === 'prev') {
136
+ selectLink(linkList[indice_trouve - 1]);
137
+ setTimeout(function() {
138
+ linkList[indice_trouve - 1].focus();
139
+ }, 0);
140
+ }
141
+
142
+ }
143
+
144
+ /* gets an element el, search if it is child of parent class, returns id of the parent */
145
+ let searchParent = (el, parentClass) => {
146
+ let found = false;
147
+ let parentElement = el.parentNode;
148
+ while (parentElement && found === false) {
149
+ if (hasClass(parentElement, parentClass) === true) {
150
+ found = true;
151
+ } else {
152
+ parentElement = parentElement.parentNode;
153
+ }
154
+ }
155
+ if (found === true) {
156
+ return parentElement.getAttribute('id');
157
+ } else {
158
+ return '';
159
+ }
160
+ }
161
+
162
+
163
+ /** Find all tabs inside a container
164
+ * @param {Node} node Default document
165
+ * @return {Array}
166
+ */
167
+ const $listTabs = (node = doc) => [].slice.call(node.querySelectorAll('.' + TABS_JS));
168
+
169
+
170
+ /**
171
+ * Build tooltips for a container
172
+ * @param {Node} node
173
+ */
174
+ const attach = (node) => {
175
+
176
+ $listTabs(node)
177
+ .forEach((tabs_node) => {
178
+
179
+ let iLisible = Math.random().toString(32).slice(2, 12);
180
+ let prefixClassName = tabs_node.hasAttribute(TABS_DATA_PREFIX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_PREFIX_CLASS) + '-' : '';
181
+ let hx = tabs_node.hasAttribute(TABS_DATA_HX) === true ? tabs_node.getAttribute(TABS_DATA_HX) : '';
182
+ let hxGeneratedClass = tabs_node.hasAttribute(TABS_DATA_GENERATED_HX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_GENERATED_HX_CLASS) : TABS_HX_DEFAULT_CLASS;
183
+ let existingHx = tabs_node.hasAttribute(TABS_DATA_EXISTING_HX) === true ? tabs_node.getAttribute(TABS_DATA_EXISTING_HX) : '';
184
+ let $tabList = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LIST));
185
+ let $tabListItems = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTITEM));
186
+ let $tabListLinks = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTLINK));
187
+ let $tabListPanels = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_CONTENT));
188
+ let noTabSelected = true;
189
+
190
+ // container
191
+ addClass(tabs_node, prefixClassName + TABS_STYLE);
192
+ tabs_node.setAttribute('id', TABS_STYLE + iLisible);
193
+
194
+ // ul
195
+ $tabList.forEach((tabList) => {
196
+ addClass(tabList, prefixClassName + TABS_LIST_STYLE);
197
+ setAttributes(tabList, {
198
+ [ATTR_ROLE]: TABS_ROLE_TABLIST,
199
+ 'id': TABS_LIST_STYLE + iLisible
200
+ });
201
+ });
202
+ // li
203
+ $tabListItems.forEach((tabListItem, index) => {
204
+ addClass(tabListItem, prefixClassName + TABS_LISTITEM_STYLE);
205
+ setAttributes(tabListItem, {
206
+ [ATTR_ROLE]: TABS_ROLE_PRESENTATION,
207
+ 'id': TABS_LISTITEM_STYLE + iLisible + '-' + (index + 1)
208
+ });
209
+ });
210
+ // a
211
+ $tabListLinks.forEach((tabListLink) => {
212
+ let idHref = tabListLink.getAttribute("href").replace('#', '');
213
+ let panelControlled = findById(idHref);
214
+ let linkText = tabListLink.innerText;
215
+ let panelSelected = tabListLink.hasAttribute(TABS_DATA_SELECTED_TAB) === true;
216
+
217
+ addClass(tabListLink, prefixClassName + TABS_LINK_STYLE);
218
+ setAttributes(tabListLink, {
219
+ 'id': TABS_PREFIX_IDS + idHref,
220
+ [ATTR_ROLE]: TABS_ROLE_TAB,
221
+ [ATTR_CONTROLS]: idHref,
222
+ 'tabindex': '-1',
223
+ [ATTR_SELECTED]: 'false'
224
+ });
225
+
226
+ // panel controlled
227
+ setAttributes(panelControlled, {
228
+ [ATTR_HIDDEN]: 'true',
229
+ [ATTR_ROLE]: TABS_ROLE_TABPANEL,
230
+ [ATTR_LABELLEDBY]: TABS_PREFIX_IDS + idHref
231
+ });
232
+ addClass(panelControlled, prefixClassName + TABS_CONTENT_STYLE);
233
+
234
+ // if already selected
235
+ if (panelSelected && noTabSelected) {
236
+ noTabSelected = false;
237
+ setAttributes(tabListLink, {
238
+ 'tabindex': '0',
239
+ [ATTR_SELECTED]: 'true'
240
+ });
241
+ setAttributes(panelControlled, {
242
+ [ATTR_HIDDEN]: 'false'
243
+ });
244
+ }
245
+
246
+ // hx
247
+ if (hx !== '') {
248
+ let hx_node = document.createElement(hx);
249
+ hx_node.setAttribute('class', hxGeneratedClass);
250
+ hx_node.setAttribute('tabindex', '0');
251
+ hx_node.innerHTML = linkText;
252
+ panelControlled.insertBefore(hx_node, panelControlled.firstChild);
253
+ }
254
+ // existingHx
255
+
256
+ if (existingHx !== '') {
257
+ let $hx_existing = [].slice.call(panelControlled.querySelectorAll(existingHx + ':first-child'));
258
+ $hx_existing.forEach((hx_item) => {
259
+ hx_item.setAttribute('tabindex', '0');
260
+ });
261
+
262
+ }
263
+
264
+ tabListLink.removeAttribute('href');
265
+
266
+ });
267
+
268
+
269
+ if (hash !== '') {
270
+ let nodeHashed = findById(hash);
271
+ if (nodeHashed !== null) { // just in case of an dumb error
272
+ // search if hash is current tabs_node
273
+ if (tabs_node.querySelector('#' + hash) !== null) {
274
+ // search if hash is ON tabs
275
+ if (hasClass(nodeHashed, TABS_JS_CONTENT) === true) {
276
+ // unselect others
277
+ unSelectLinks($tabListLinks);
278
+ unSelectContents($tabListPanels);
279
+ // select this one
280
+ nodeHashed.removeAttribute(ATTR_HIDDEN);
281
+ let linkHashed = findById(TABS_PREFIX_IDS + hash);
282
+ setAttributes(linkHashed, {
283
+ 'tabindex': '0',
284
+ [ATTR_SELECTED]: 'true'
285
+ });
286
+ noTabSelected = false;
287
+ } else {
288
+ // search if hash is IN tabs
289
+ let panelParentId = searchParent(nodeHashed, TABS_JS_CONTENT);
290
+ if (panelParentId !== '') {
291
+ // unselect others
292
+ unSelectLinks($tabListLinks);
293
+ unSelectContents($tabListPanels);
294
+ // select this one
295
+ let panelParent = findById(panelParentId);
296
+ panelParent.removeAttribute(ATTR_HIDDEN);
297
+ let linkParent = findById(TABS_PREFIX_IDS + panelParentId);
298
+ setAttributes(linkParent, {
299
+ 'tabindex': '0',
300
+ [ATTR_SELECTED]: 'true'
301
+ });
302
+ noTabSelected = false;
303
+ }
304
+ }
305
+ }
306
+ }
307
+ }
308
+
309
+ // if no selected => select first
310
+ if (noTabSelected === true) {
311
+ setAttributes($tabListLinks[0], {
312
+ 'tabindex': '0',
313
+ [ATTR_SELECTED]: 'true'
314
+ });
315
+ let panelFirst = findById($tabListLinks[0].getAttribute(ATTR_CONTROLS));
316
+ panelFirst.removeAttribute(ATTR_HIDDEN);
317
+ }
318
+
319
+ });
320
+ };
321
+
322
+ /* listeners */
323
+ ['click', 'keydown']
324
+ .forEach(eventName => {
325
+ //let isCtrl = false;
326
+
327
+ doc.body
328
+ .addEventListener(eventName, e => {
329
+
330
+ // click on a tab link or on something IN a tab link
331
+ let parentLink = searchParent(e.target, TABS_JS_LISTLINK);
332
+ if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'click') {
333
+ let linkSelected = hasClass(e.target, TABS_JS_LISTLINK) === true ? e.target : findById(parentLink);
334
+ let parentTabId = searchParent(e.target, TABS_JS);
335
+ let parentTab = findById(parentTabId);
336
+ //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
337
+ let $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
338
+ let $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
339
+
340
+ // aria selected false on all links
341
+ unSelectLinks($parentListLinks);
342
+ // add aria-hidden on all tabs contents
343
+ unSelectContents($parentListContents);
344
+ // add aria selected on selected link + show linked panel
345
+ selectLink(linkSelected);
346
+
347
+ e.preventDefault();
348
+ }
349
+
350
+ // Key down on tabs
351
+ if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'keydown') {
352
+ //let linkSelected = hasClass( e.target, TABS_JS_LISTLINK) === true ? e.target : findById( parentLink );
353
+ let parentTabId = searchParent(e.target, TABS_JS);
354
+ let parentTab = findById(parentTabId);
355
+ let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
356
+ let $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
357
+ let $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
358
+ let firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
359
+ let lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
360
+
361
+ // strike home on a tab => 1st tab
362
+ if (e.keyCode === 36) {
363
+ unSelectLinks($parentListLinks);
364
+ unSelectContents($parentListContents);
365
+ selectLink(firstLink);
366
+
367
+ e.preventDefault();
368
+ }
369
+ // strike end on a tab => last tab
370
+ else if (e.keyCode === 35) {
371
+ unSelectLinks($parentListLinks);
372
+ unSelectContents($parentListContents);
373
+ selectLink(lastLink);
374
+
375
+ e.preventDefault();
376
+ }
377
+ // strike up or left on the tab => previous tab
378
+ else if ((e.keyCode === 37 || e.keyCode === 38) && !e.ctrlKey) {
379
+ if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
380
+ unSelectLinks($parentListLinks);
381
+ unSelectContents($parentListContents);
382
+ selectLink(lastLink);
383
+
384
+ e.preventDefault();
385
+ } else {
386
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
387
+ e.preventDefault();
388
+ }
389
+ }
390
+ // strike down or right in the tab => next tab
391
+ else if ((e.keyCode === 40 || e.keyCode === 39) && !e.ctrlKey) {
392
+ if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
393
+ unSelectLinks($parentListLinks);
394
+ unSelectContents($parentListContents);
395
+ selectLink(firstLink);
396
+
397
+ e.preventDefault();
398
+ } else {
399
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
400
+ e.preventDefault();
401
+ }
402
+ }
403
+
404
+ }
405
+
406
+ // Key down in tab panels
407
+ let parentTabPanelId = searchParent(e.target, TABS_JS_CONTENT);
408
+ if (parentTabPanelId !== '' && eventName === 'keydown') {
409
+ let linkSelected = findById(findById(parentTabPanelId).getAttribute(ATTR_LABELLEDBY));
410
+ let parentTabId = searchParent(e.target, TABS_JS);
411
+ let parentTab = findById(parentTabId);
412
+ let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
413
+ let $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
414
+ let $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
415
+ let firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
416
+ let lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
417
+
418
+
419
+ // strike up + ctrl => go to header
420
+ if (e.keyCode === 38 && e.ctrlKey) {
421
+ setTimeout(function() {
422
+ linkSelected.focus();
423
+ }, 0);
424
+ e.preventDefault();
425
+ }
426
+ // strike pageup + ctrl => go to prev header
427
+ if (e.keyCode === 33 && e.ctrlKey) {
428
+ // go to header
429
+ linkSelected.focus();
430
+ e.preventDefault();
431
+ // then previous
432
+ if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
433
+ unSelectLinks($parentListLinks);
434
+ unSelectContents($parentListContents);
435
+ selectLink(lastLink);
436
+
437
+ } else {
438
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
439
+ }
440
+
441
+ }
442
+ // strike pagedown + ctrl => go to next header
443
+ if (e.keyCode === 34 && e.ctrlKey) {
444
+ // go to header
445
+ linkSelected.focus();
446
+ e.preventDefault();
447
+ // then next
448
+ if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
449
+ unSelectLinks($parentListLinks);
450
+ unSelectContents($parentListContents);
451
+ selectLink(firstLink);
452
+
453
+ } else {
454
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
455
+ }
456
+ }
457
+ }
458
+
459
+ // click on a tab link
460
+ let parentLinkToPanelId = searchParent(e.target, TABS_JS_LINK_TO_TAB);
461
+ if ((hasClass(e.target, TABS_JS_LINK_TO_TAB) === true || parentLinkToPanelId !== '') && eventName === 'click') {
462
+ let panelSelectedId = hasClass(e.target, TABS_JS_LINK_TO_TAB) === true ? e.target.getAttribute('href').replace('#', '') : findById(parentLinkToPanelId).replace('#', '');
463
+ let panelSelected = findById(panelSelectedId);
464
+ let buttonPanelSelected = findById(panelSelected.getAttribute(ATTR_LABELLEDBY));
465
+ let parentTabId = searchParent(e.target, TABS_JS);
466
+ let parentTab = findById(parentTabId);
467
+ //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
468
+ let $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
469
+ let $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
470
+
471
+ unSelectLinks($parentListLinks);
472
+ unSelectContents($parentListContents);
473
+ selectLink(buttonPanelSelected);
474
+
475
+ e.preventDefault();
476
+ }
477
+
478
+ }, true);
479
+ });
480
+
481
+ const onLoad = () => {
482
+ attach();
483
+ document.removeEventListener('DOMContentLoaded', onLoad);
484
+ }
485
+
486
+ document.addEventListener('DOMContentLoaded', onLoad);
487
+
488
+ window.van11yAccessibleTabPanelAria = attach;
489
+
490
+
491
+ })(document);
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: monitoring-jekyll-theme
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - bertrandkeller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-09-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description:
56
+ email:
57
+ - bertrand.keller@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - README.md
63
+ - _includes/accessibility.html
64
+ - _includes/competitors.html
65
+ - _includes/lighthouse.html
66
+ - _includes/pagespeed.html
67
+ - _includes/seo.html
68
+ - _includes/statistiques.html
69
+ - _includes/styles.html
70
+ - _includes/stylestats.html
71
+ - _includes/yellowlabtools.html
72
+ - _layouts/default.html
73
+ - _plugins/humanize.rb
74
+ - assets/css/styles.css
75
+ - assets/fonts/IBMPlexMono-Bold.ttf
76
+ - assets/fonts/Optiker-K.woff2
77
+ - assets/fonts/PublicSans-Regular.woff2
78
+ - assets/js/frappe-charts.min.iife.js
79
+ - assets/js/lighthouse.js
80
+ - assets/js/van11y-accessible-hide-show-aria.es6.js
81
+ - assets/js/van11y-accessible-tab-panel-aria.es6.js
82
+ homepage: https://github.com/bertrandkeller/monitoring-jekyll-theme
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubygems_version: 3.0.3
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: A theme for monitoring website performance
105
+ test_files: []