monitoring-jekyll-theme 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []