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.
- checksums.yaml +7 -0
- data/README.md +36 -0
- data/_includes/accessibility.html +38 -0
- data/_includes/competitors.html +1 -0
- data/_includes/lighthouse.html +26 -0
- data/_includes/pagespeed.html +22 -0
- data/_includes/seo.html +177 -0
- data/_includes/statistiques.html +173 -0
- data/_includes/styles.html +50 -0
- data/_includes/stylestats.html +33 -0
- data/_includes/yellowlabtools.html +34 -0
- data/_layouts/default.html +19 -0
- data/_plugins/humanize.rb +258 -0
- data/assets/css/styles.css +449 -0
- data/assets/fonts/IBMPlexMono-Bold.ttf +0 -0
- data/assets/fonts/Optiker-K.woff2 +0 -0
- data/assets/fonts/PublicSans-Regular.woff2 +0 -0
- data/assets/js/frappe-charts.min.iife.js +2 -0
- data/assets/js/lighthouse.js +81 -0
- data/assets/js/van11y-accessible-hide-show-aria.es6.js +326 -0
- data/assets/js/van11y-accessible-tab-panel-aria.es6.js +491 -0
- metadata +105 -0
@@ -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: []
|