sibu 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +20 -20
  3. data/README.md +38 -38
  4. data/Rakefile +36 -36
  5. data/app/assets/config/sibu_manifest.js +2 -2
  6. data/app/assets/fonts/sibu/Sibu.eot +0 -0
  7. data/app/assets/fonts/sibu/Sibu.svg +13 -13
  8. data/app/assets/fonts/sibu/Sibu.ttf +0 -0
  9. data/app/assets/fonts/sibu/Sibu.woff +0 -0
  10. data/app/assets/javascripts/cropper/cropper.js +3694 -3694
  11. data/app/assets/javascripts/quill/quill.js +11401 -11401
  12. data/app/assets/javascripts/sibu/common.js +6 -6
  13. data/app/assets/javascripts/sibu/sibu.js.erb +155 -155
  14. data/app/assets/javascripts/tabs/van11y-accessible-tab-panel-aria.js +465 -465
  15. data/app/assets/stylesheets/cropper/cropper.css +304 -304
  16. data/app/assets/stylesheets/quill/quill.snow.css +945 -945
  17. data/app/assets/stylesheets/sibu/defaults.scss +336 -336
  18. data/app/assets/stylesheets/sibu/icons.scss +40 -40
  19. data/app/assets/stylesheets/sibu/sibu.css +131 -131
  20. data/app/controllers/sibu/application_controller.rb +14 -14
  21. data/app/controllers/sibu/documents_controller.rb +35 -35
  22. data/app/controllers/sibu/images_controller.rb +78 -78
  23. data/app/controllers/sibu/pages_controller.rb +197 -197
  24. data/app/controllers/sibu/sites_controller.rb +81 -81
  25. data/app/helpers/sibu/application_helper.rb +11 -11
  26. data/app/helpers/sibu/documents_helper.rb +4 -4
  27. data/app/helpers/sibu/images_helper.rb +4 -4
  28. data/app/helpers/sibu/pages_helper.rb +194 -194
  29. data/app/helpers/sibu/sites_helper.rb +23 -23
  30. data/app/jobs/sibu/application_job.rb +4 -4
  31. data/app/mailers/sibu/application_mailer.rb +6 -6
  32. data/app/models/concerns/sibu/document_uploader.rb +8 -8
  33. data/app/models/concerns/sibu/image_uploader.rb +31 -31
  34. data/app/models/concerns/sibu/sections_concern.rb +134 -134
  35. data/app/models/concerns/sibu/style_uploader.rb +1 -1
  36. data/app/models/concerns/sibu/user_concern.rb +8 -8
  37. data/app/models/sibu/application_record.rb +5 -5
  38. data/app/models/sibu/document.rb +16 -16
  39. data/app/models/sibu/dynamic_style.rb +76 -76
  40. data/app/models/sibu/image.rb +10 -19
  41. data/app/models/sibu/page.rb +66 -66
  42. data/app/models/sibu/site.rb +97 -97
  43. data/app/models/sibu/site_template.rb +22 -22
  44. data/app/views/layouts/sibu/application.html.erb +23 -23
  45. data/app/views/layouts/sibu/edit_content.html.erb +262 -262
  46. data/app/views/layouts/sibu/site.html.erb +45 -45
  47. data/app/views/sibu/documents/_form.html.erb +14 -14
  48. data/app/views/sibu/documents/index.html.erb +37 -37
  49. data/app/views/sibu/documents/new.html.erb +12 -12
  50. data/app/views/sibu/images/_edit_form.html.erb +23 -23
  51. data/app/views/sibu/images/_form.html.erb +34 -34
  52. data/app/views/sibu/images/edit.js.erb +2 -2
  53. data/app/views/sibu/images/index.html.erb +31 -13
  54. data/app/views/sibu/images/new.html.erb +12 -12
  55. data/app/views/sibu/images/show.html.erb +2 -2
  56. data/app/views/sibu/pages/_code_edit_panel.html.erb +17 -17
  57. data/app/views/sibu/pages/_element_actions.html.erb +4 -4
  58. data/app/views/sibu/pages/_error_panel.html.erb +4 -4
  59. data/app/views/sibu/pages/_form.html.erb +62 -62
  60. data/app/views/sibu/pages/_group_edit_panel.html.erb +3 -3
  61. data/app/views/sibu/pages/_link_edit_panel.html.erb +50 -50
  62. data/app/views/sibu/pages/_map_edit_panel.html.erb +27 -27
  63. data/app/views/sibu/pages/_media_edit_panel.html.erb +46 -46
  64. data/app/views/sibu/pages/_new_section_panel.html.erb +43 -43
  65. data/app/views/sibu/pages/_paragraph_edit_panel.html.erb +18 -18
  66. data/app/views/sibu/pages/_text_edit_panel.html.erb +19 -19
  67. data/app/views/sibu/pages/child_element.js.erb +6 -6
  68. data/app/views/sibu/pages/clone_element.js.erb +6 -6
  69. data/app/views/sibu/pages/create_section.js.erb +6 -6
  70. data/app/views/sibu/pages/delete_element.js.erb +6 -6
  71. data/app/views/sibu/pages/delete_section.js.erb +6 -6
  72. data/app/views/sibu/pages/destroy.html.erb +2 -2
  73. data/app/views/sibu/pages/edit.html.erb +8 -8
  74. data/app/views/sibu/pages/edit_content.html.erb +3 -3
  75. data/app/views/sibu/pages/edit_element.js.erb +100 -100
  76. data/app/views/sibu/pages/edit_section.js.erb +7 -7
  77. data/app/views/sibu/pages/index.html.erb +40 -40
  78. data/app/views/sibu/pages/new.html.erb +8 -8
  79. data/app/views/sibu/pages/new_section.js.erb +19 -19
  80. data/app/views/sibu/pages/show.html.erb +3 -3
  81. data/app/views/sibu/pages/update.html.erb +2 -2
  82. data/app/views/sibu/pages/update_element.js.erb +5 -5
  83. data/app/views/sibu/pages/update_section.js.erb +5 -5
  84. data/app/views/sibu/sites/_form.html.erb +125 -125
  85. data/app/views/sibu/sites/destroy.html.erb +2 -2
  86. data/app/views/sibu/sites/edit.html.erb +9 -9
  87. data/app/views/sibu/sites/edit_styles.html.erb +8 -8
  88. data/app/views/sibu/sites/index.html.erb +41 -41
  89. data/app/views/sibu/sites/new.html.erb +18 -18
  90. data/app/views/sibu/sites/update.html.erb +2 -2
  91. data/config/initializers/constants.rb +2 -2
  92. data/config/initializers/shrine.rb +18 -18
  93. data/config/routes.rb +30 -30
  94. data/config/tinymce.yml +5 -5
  95. data/db/migrate/20180124095041_create_sibu_sites.rb +12 -12
  96. data/db/migrate/20180124095213_create_sibu_pages.rb +15 -15
  97. data/db/migrate/20180124145030_create_sibu_site_templates.rb +10 -10
  98. data/db/migrate/20180125231638_add_user_id_to_sites.rb +5 -5
  99. data/db/migrate/20180126114522_rename_url_to_path_in_pages.rb +5 -5
  100. data/db/migrate/20180126114628_add_domain_to_sites.rb +5 -5
  101. data/db/migrate/20180127211533_create_sibu_images.rb +11 -11
  102. data/db/migrate/20180208082317_rename_images_user_id_to_site_id.rb +5 -5
  103. data/db/migrate/20180208125024_rename_image_data_column.rb +5 -5
  104. data/db/migrate/20180210181644_add_defaults_to_site_templates.rb +6 -6
  105. data/db/migrate/20180214134653_add_fields_to_sites.rb +5 -5
  106. data/db/migrate/20180227151519_add_default_templates_to_site_templates.rb +5 -5
  107. data/db/migrate/20180301121902_add_style_data_to_sites.rb +5 -5
  108. data/db/migrate/20180301152101_add_default_styles_to_templates.rb +5 -5
  109. data/db/migrate/20180321144021_move_images_to_user_level.rb +7 -7
  110. data/db/migrate/20180321170310_add_version_to_sibu_sites.rb +7 -7
  111. data/db/migrate/20180405095448_create_sibu_documents.rb +10 -10
  112. data/db/migrate/20190110204854_add_custom_data_to_sibu_pages.rb +5 -5
  113. data/lib/sibu.rb +4 -4
  114. data/lib/sibu/engine.rb +19 -19
  115. data/lib/sibu/utils.rb +14 -14
  116. data/lib/sibu/version.rb +3 -3
  117. data/lib/tasks/sibu_tasks.rake +4 -4
  118. metadata +3 -3
@@ -1,7 +1,7 @@
1
- function sibuCallback(actionName, args) {
2
- var callback = actionName + "SibuCallback";
3
- console.log(callback);
4
- if(typeof window[callback] === "function") {
5
- window[callback](args);
6
- }
1
+ function sibuCallback(actionName, args) {
2
+ var callback = actionName + "SibuCallback";
3
+ console.log(callback);
4
+ if(typeof window[callback] === "function") {
5
+ window[callback](args);
6
+ }
7
7
  }
@@ -1,156 +1,156 @@
1
- //= require jquery
2
- //= require jquery_ujs
3
- //= require sibu/common
4
- //= require ../quill/quill
5
- //= require ../tabs/van11y-accessible-tab-panel-aria
6
- //= require_self
7
-
8
- var Inline = Quill.import('blots/inline');
9
-
10
- class IconBlot extends Inline {
11
- static create(args) {
12
- let node = super.create();
13
- node.setAttribute('href', args[0]);
14
- node.setAttribute('target', '_blank');
15
- node.setAttribute('class', args[1]);
16
- return node;
17
- }
18
-
19
- static formats(node) {
20
- return node.getAttribute('href');
21
- }
22
-
23
- format(name, value) {
24
- if (name !== this.statics.blotName || !value) return super.format(name, value);
25
- this.domNode.setAttribute('href', value);
26
- }
27
- }
28
- IconBlot.blotName = 'icon';
29
- IconBlot.tagName = 'a';
30
-
31
- Quill.register(IconBlot);
32
- Quill.register(Quill.import('attributors/style/align'), true);
33
-
34
- var Link = Quill.import('formats/link');
35
-
36
- class CustomLink extends Link {
37
- static create(value) {
38
- let node = super.create(value);
39
- value = this.sanitize(value);
40
- node.setAttribute('href', value);
41
- if(value.startsWith("/")) {
42
- node.removeAttribute('target');
43
- }
44
- return node;
45
- }
46
- }
47
-
48
- Quill.register(CustomLink);
49
-
50
- function initQuillEditor(container) {
51
- var quillModules;
52
- var modulesCallback = "sibuEditorModules";
53
- if(typeof window[modulesCallback] === "function") {
54
- quillModules = window[modulesCallback]();
55
- } else {
56
- quillModules = {
57
- toolbar: [
58
- ['bold', 'italic', 'underline'], ['link'],
59
- [{ 'color': [] }, { 'background': [] }],
60
- [{ 'list': 'ordered'}, { 'list': 'bullet' }],
61
- [{ 'align': [] }],
62
- ['facebook', 'twitter', 'instagram', 'pinterest'],
63
- ['clean']
64
- ]
65
- };
66
- }
67
- var quill = new Quill(container, {
68
- modules: quillModules,
69
- theme: 'snow'
70
- });
71
-
72
- function promptWithInit(promptText) {
73
- var range = quill.getSelection(true);
74
- if(range && range.length === 0) {
75
- quill.insertText(range.index, ' ', Quill.sources.USER);
76
- quill.setSelection(range.index, 1, Quill.sources.USER);
77
- }
78
- return prompt(promptText);
79
- }
80
-
81
- var fbButton = document.querySelector('.ql-facebook');
82
- if(fbButton) {
83
- fbButton.addEventListener('click', function() {
84
- var value = promptWithInit('Adresse de la page Facebook :');
85
- quill.format('icon', [value, 'sb-facebook']);
86
- });
87
- }
88
- var twButton = document.querySelector('.ql-twitter');
89
- if(twButton) {
90
- twButton.addEventListener('click', function() {
91
- var value = promptWithInit('Adresse du compte Twitter :');
92
- quill.format('icon', [value, 'sb-twitter']);
93
- });
94
- }
95
- var igButton = document.querySelector('.ql-instagram');
96
- if(igButton) {
97
- igButton.addEventListener('click', function() {
98
- var value = promptWithInit('Adresse du compte Instagram :');
99
- quill.format('icon', [value, 'sb-instagram']);
100
- });
101
- }
102
- var piButton = document.querySelector('.ql-pinterest');
103
- if(piButton) {
104
- piButton.addEventListener('click', function() {
105
- var value = promptWithInit('Adresse du compte Pinterest :');
106
- quill.format('icon', [value, 'sb-pinterest']);
107
- });
108
- }
109
-
110
- return quill;
111
- }
112
-
113
- function initCustomCenter() {
114
- var wrapper = $(".sibu_center > img"), centerPos = $(".sibu_center > #sibu_center_pos");
115
- displayCurrentCenter(wrapper[0], centerPos);
116
- wrapper.click(function(e) {
117
- var rect = e.target.getBoundingClientRect();
118
- var x = e.clientX - rect.left;
119
- var y = e.clientY - rect.top;
120
- centerPos.css("top", y + "px");
121
- centerPos.css("left", x + "px");
122
- $("#element_class").val(`posx_${Math.floor((x / rect.width) * 10) * 10} posy_${Math.floor((y / rect.height) * 10) * 10}`);
123
- })
124
- }
125
-
126
- function displayCurrentCenter(img, centerPos) {
127
- var val = $("#element_class").val();
128
- var rect = img.getBoundingClientRect();
129
- if (val && val.indexOf('posx') !== -1 && val.indexOf('posy') !== -1) {
130
- var xpos = val.slice(val.indexOf("posx_") + 5, val.indexOf("posx_") + 7);
131
- var ypos = val.slice(val.indexOf("posy_") + 5, val.indexOf("posy_") + 7);
132
- centerPos.css("top", Math.round(+ypos * (rect.height / 100)) + "px");
133
- centerPos.css("left", Math.round(+xpos * (rect.width / 100)) + "px");
134
- } else {
135
- centerPos.css("top", (Math.round(rect.height / 2) - 15) + "px");
136
- centerPos.css("left", (Math.round(rect.width / 2) - 7) + "px");
137
- }
138
- centerPos.show();
139
- }
140
-
141
- function refreshAfterEdit(reload, sectionId) {
142
- var baseUrl = window.location.href.split('?')[0];
143
- if (reload) {
144
- if (sectionId) {
145
- window.location.href = baseUrl + '?edit_section=' + sectionId;
146
- } else {
147
- window.location.href = baseUrl;
148
- }
149
- } else {
150
- window.history.replaceState(null, null, window.location.pathname);
151
- }
152
- }
153
-
154
- function initSectionsPanel() {
155
-
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require sibu/common
4
+ //= require ../quill/quill
5
+ //= require ../tabs/van11y-accessible-tab-panel-aria
6
+ //= require_self
7
+
8
+ var Inline = Quill.import('blots/inline');
9
+
10
+ class IconBlot extends Inline {
11
+ static create(args) {
12
+ let node = super.create();
13
+ node.setAttribute('href', args[0]);
14
+ node.setAttribute('target', '_blank');
15
+ node.setAttribute('class', args[1]);
16
+ return node;
17
+ }
18
+
19
+ static formats(node) {
20
+ return node.getAttribute('href');
21
+ }
22
+
23
+ format(name, value) {
24
+ if (name !== this.statics.blotName || !value) return super.format(name, value);
25
+ this.domNode.setAttribute('href', value);
26
+ }
27
+ }
28
+ IconBlot.blotName = 'icon';
29
+ IconBlot.tagName = 'a';
30
+
31
+ Quill.register(IconBlot);
32
+ Quill.register(Quill.import('attributors/style/align'), true);
33
+
34
+ var Link = Quill.import('formats/link');
35
+
36
+ class CustomLink extends Link {
37
+ static create(value) {
38
+ let node = super.create(value);
39
+ value = this.sanitize(value);
40
+ node.setAttribute('href', value);
41
+ if(value.startsWith("/")) {
42
+ node.removeAttribute('target');
43
+ }
44
+ return node;
45
+ }
46
+ }
47
+
48
+ Quill.register(CustomLink);
49
+
50
+ function initQuillEditor(container) {
51
+ var quillModules;
52
+ var modulesCallback = "sibuEditorModules";
53
+ if(typeof window[modulesCallback] === "function") {
54
+ quillModules = window[modulesCallback]();
55
+ } else {
56
+ quillModules = {
57
+ toolbar: [
58
+ ['bold', 'italic', 'underline'], ['link'],
59
+ [{ 'color': [] }, { 'background': [] }],
60
+ [{ 'list': 'ordered'}, { 'list': 'bullet' }],
61
+ [{ 'align': [] }],
62
+ ['facebook', 'twitter', 'instagram', 'pinterest'],
63
+ ['clean']
64
+ ]
65
+ };
66
+ }
67
+ var quill = new Quill(container, {
68
+ modules: quillModules,
69
+ theme: 'snow'
70
+ });
71
+
72
+ function promptWithInit(promptText) {
73
+ var range = quill.getSelection(true);
74
+ if(range && range.length === 0) {
75
+ quill.insertText(range.index, ' ', Quill.sources.USER);
76
+ quill.setSelection(range.index, 1, Quill.sources.USER);
77
+ }
78
+ return prompt(promptText);
79
+ }
80
+
81
+ var fbButton = document.querySelector('.ql-facebook');
82
+ if(fbButton) {
83
+ fbButton.addEventListener('click', function() {
84
+ var value = promptWithInit('Adresse de la page Facebook :');
85
+ quill.format('icon', [value, 'sb-facebook']);
86
+ });
87
+ }
88
+ var twButton = document.querySelector('.ql-twitter');
89
+ if(twButton) {
90
+ twButton.addEventListener('click', function() {
91
+ var value = promptWithInit('Adresse du compte Twitter :');
92
+ quill.format('icon', [value, 'sb-twitter']);
93
+ });
94
+ }
95
+ var igButton = document.querySelector('.ql-instagram');
96
+ if(igButton) {
97
+ igButton.addEventListener('click', function() {
98
+ var value = promptWithInit('Adresse du compte Instagram :');
99
+ quill.format('icon', [value, 'sb-instagram']);
100
+ });
101
+ }
102
+ var piButton = document.querySelector('.ql-pinterest');
103
+ if(piButton) {
104
+ piButton.addEventListener('click', function() {
105
+ var value = promptWithInit('Adresse du compte Pinterest :');
106
+ quill.format('icon', [value, 'sb-pinterest']);
107
+ });
108
+ }
109
+
110
+ return quill;
111
+ }
112
+
113
+ function initCustomCenter() {
114
+ var wrapper = $(".sibu_center > img"), centerPos = $(".sibu_center > #sibu_center_pos");
115
+ displayCurrentCenter(wrapper[0], centerPos);
116
+ wrapper.click(function(e) {
117
+ var rect = e.target.getBoundingClientRect();
118
+ var x = e.clientX - rect.left;
119
+ var y = e.clientY - rect.top;
120
+ centerPos.css("top", y + "px");
121
+ centerPos.css("left", x + "px");
122
+ $("#element_class").val(`posx_${Math.floor((x / rect.width) * 10) * 10} posy_${Math.floor((y / rect.height) * 10) * 10}`);
123
+ })
124
+ }
125
+
126
+ function displayCurrentCenter(img, centerPos) {
127
+ var val = $("#element_class").val();
128
+ var rect = img.getBoundingClientRect();
129
+ if (val && val.indexOf('posx') !== -1 && val.indexOf('posy') !== -1) {
130
+ var xpos = val.slice(val.indexOf("posx_") + 5, val.indexOf("posx_") + 7);
131
+ var ypos = val.slice(val.indexOf("posy_") + 5, val.indexOf("posy_") + 7);
132
+ centerPos.css("top", Math.round(+ypos * (rect.height / 100)) + "px");
133
+ centerPos.css("left", Math.round(+xpos * (rect.width / 100)) + "px");
134
+ } else {
135
+ centerPos.css("top", (Math.round(rect.height / 2) - 15) + "px");
136
+ centerPos.css("left", (Math.round(rect.width / 2) - 7) + "px");
137
+ }
138
+ centerPos.show();
139
+ }
140
+
141
+ function refreshAfterEdit(reload, sectionId) {
142
+ var baseUrl = window.location.href.split('?')[0];
143
+ if (reload) {
144
+ if (sectionId) {
145
+ window.location.href = baseUrl + '?edit_section=' + sectionId;
146
+ } else {
147
+ window.location.href = baseUrl;
148
+ }
149
+ } else {
150
+ window.history.replaceState(null, null, window.location.pathname);
151
+ }
152
+ }
153
+
154
+ function initSectionsPanel() {
155
+
156
156
  }
@@ -1,466 +1,466 @@
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
- 'use strict';
7
-
8
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
-
10
- (function (doc) {
11
-
12
- 'use strict';
13
-
14
- var TABS_JS = 'js-tabs';
15
- var TABS_JS_LIST = 'js-tablist';
16
- var TABS_JS_LISTITEM = 'js-tablist__item';
17
- var TABS_JS_LISTLINK = 'js-tablist__link';
18
- var TABS_JS_CONTENT = 'js-tabcontent';
19
- var TABS_JS_LINK_TO_TAB = 'js-link-to-tab';
20
-
21
- var TABS_DATA_PREFIX_CLASS = 'data-tabs-prefix-class';
22
- var TABS_DATA_HX = 'data-hx';
23
- var TABS_DATA_GENERATED_HX_CLASS = 'data-tabs-generated-hx-class';
24
- var TABS_DATA_EXISTING_HX = 'data-existing-hx';
25
-
26
- var TABS_DATA_SELECTED_TAB = 'data-selected';
27
-
28
- var TABS_PREFIX_IDS = 'label_';
29
-
30
- var TABS_STYLE = 'tabs';
31
- var TABS_LIST_STYLE = 'tabs__list';
32
- var TABS_LISTITEM_STYLE = 'tabs__item';
33
- var TABS_LINK_STYLE = 'tabs__link';
34
- var TABS_CONTENT_STYLE = 'tabs__content';
35
-
36
- var TABS_HX_DEFAULT_CLASS = 'invisible';
37
-
38
- var TABS_ROLE_TABLIST = 'tablist';
39
- var TABS_ROLE_TAB = 'tab';
40
- var TABS_ROLE_TABPANEL = 'tabpanel';
41
- var TABS_ROLE_PRESENTATION = 'presentation';
42
-
43
- var ATTR_ROLE = 'role';
44
- var ATTR_LABELLEDBY = 'aria-labelledby';
45
- var ATTR_HIDDEN = 'aria-hidden';
46
- var ATTR_CONTROLS = 'aria-controls';
47
- var ATTR_SELECTED = 'aria-selected';
48
-
49
- var DELAY_HASH_UPDATE = 1000;
50
-
51
- var hash = window.location.hash.replace('#', '');
52
-
53
- //const IS_OPENED_CLASS = 'is-opened';
54
-
55
- var findById = function findById(id) {
56
- return doc.getElementById(id);
57
- };
58
-
59
- var addClass = function addClass(el, className) {
60
- if (el.classList) {
61
- el.classList.add(className); // IE 10+
62
- } else {
63
- el.className += ' ' + className; // IE 8+
64
- }
65
- };
66
-
67
- /*const removeClass = (el, className) => {
68
- if (el.classList) {
69
- el.classList.remove(className); // IE 10+
70
- }
71
- else {
72
- el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); // IE 8+
73
- }
74
- }*/
75
-
76
- var hasClass = function hasClass(el, className) {
77
- if (el.classList) {
78
- return el.classList.contains(className); // IE 10+
79
- } else {
80
- return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); // IE 8+ ?
81
- }
82
- };
83
-
84
- var setAttributes = function setAttributes(node, attrs) {
85
- Object.keys(attrs).forEach(function (attribute) {
86
- node.setAttribute(attribute, attrs[attribute]);
87
- });
88
- };
89
- var unSelectLinks = function unSelectLinks(elts) {
90
- elts.forEach(function (link_node) {
91
- var _setAttributes;
92
-
93
- setAttributes(link_node, (_setAttributes = {}, _defineProperty(_setAttributes, ATTR_SELECTED, 'false'), _defineProperty(_setAttributes, 'tabindex', '-1'), _setAttributes));
94
- });
95
- };
96
- var unSelectContents = function unSelectContents(elts) {
97
- elts.forEach(function (content_node) {
98
- content_node.setAttribute(ATTR_HIDDEN, true);
99
- });
100
- };
101
-
102
- var selectLink = function selectLink(el) {
103
- var _setAttributes2;
104
-
105
- var destination = findById(el.getAttribute(ATTR_CONTROLS));
106
- setAttributes(el, (_setAttributes2 = {}, _defineProperty(_setAttributes2, ATTR_SELECTED, 'true'), _defineProperty(_setAttributes2, 'tabindex', '0'), _setAttributes2));
107
- destination.removeAttribute(ATTR_HIDDEN);
108
- setTimeout(function () {
109
- el.focus();
110
- }, 0);
111
- // Note : removed to prevent conflicts when editing sibu elements
112
- // setTimeout(function () {
113
- // history.pushState(null, null, location.pathname + location.search + '#' + el.getAttribute(ATTR_CONTROLS));
114
- // }, DELAY_HASH_UPDATE);
115
- };
116
-
117
- var selectLinkInList = function selectLinkInList(itemsList, linkList, contentList, param) {
118
- var indice_trouve = undefined;
119
-
120
- itemsList.forEach(function (itemNode, index) {
121
- if (itemNode.querySelector('.' + TABS_JS_LISTLINK).getAttribute(ATTR_SELECTED) === 'true') {
122
- indice_trouve = index;
123
- }
124
- });
125
- unSelectLinks(linkList);
126
- unSelectContents(contentList);
127
- if (param === 'next') {
128
- selectLink(linkList[indice_trouve + 1]);
129
- setTimeout(function () {
130
- linkList[indice_trouve + 1].focus();
131
- }, 0);
132
- }
133
- if (param === 'prev') {
134
- selectLink(linkList[indice_trouve - 1]);
135
- setTimeout(function () {
136
- linkList[indice_trouve - 1].focus();
137
- }, 0);
138
- }
139
- };
140
-
141
- /* gets an element el, search if it is child of parent class, returns id of the parent */
142
- var searchParent = function searchParent(el, parentClass) {
143
- var found = false;
144
- var parentElement = el.parentNode;
145
- while (parentElement && found === false) {
146
- if (hasClass(parentElement, parentClass) === true) {
147
- found = true;
148
- } else {
149
- parentElement = parentElement.parentNode;
150
- }
151
- }
152
- if (found === true) {
153
- return parentElement.getAttribute('id');
154
- } else {
155
- return '';
156
- }
157
- };
158
-
159
- /** Find all tabs inside a container
160
- * @param {Node} node Default document
161
- * @return {Array}
162
- */
163
- var $listTabs = function $listTabs() {
164
- var node = arguments.length <= 0 || arguments[0] === undefined ? doc : arguments[0];
165
- return [].slice.call(node.querySelectorAll('.' + TABS_JS));
166
- };
167
-
168
- /**
169
- * Build tooltips for a container
170
- * @param {Node} node
171
- */
172
- var attach = function attach(node) {
173
-
174
- $listTabs(node).forEach(function (tabs_node) {
175
-
176
- var iLisible = Math.random().toString(32).slice(2, 12);
177
- var prefixClassName = tabs_node.hasAttribute(TABS_DATA_PREFIX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_PREFIX_CLASS) + '-' : '';
178
- var hx = tabs_node.hasAttribute(TABS_DATA_HX) === true ? tabs_node.getAttribute(TABS_DATA_HX) : '';
179
- var hxGeneratedClass = tabs_node.hasAttribute(TABS_DATA_GENERATED_HX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_GENERATED_HX_CLASS) : TABS_HX_DEFAULT_CLASS;
180
- var existingHx = tabs_node.hasAttribute(TABS_DATA_EXISTING_HX) === true ? tabs_node.getAttribute(TABS_DATA_EXISTING_HX) : '';
181
- var $tabList = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LIST));
182
- var $tabListItems = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTITEM));
183
- var $tabListLinks = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTLINK));
184
- var $tabListPanels = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_CONTENT));
185
- var noTabSelected = true;
186
-
187
- // container
188
- addClass(tabs_node, prefixClassName + TABS_STYLE);
189
- tabs_node.setAttribute('id', TABS_STYLE + iLisible);
190
-
191
- // ul
192
- $tabList.forEach(function (tabList) {
193
- var _setAttributes3;
194
-
195
- addClass(tabList, prefixClassName + TABS_LIST_STYLE);
196
- setAttributes(tabList, (_setAttributes3 = {}, _defineProperty(_setAttributes3, ATTR_ROLE, TABS_ROLE_TABLIST), _defineProperty(_setAttributes3, 'id', TABS_LIST_STYLE + iLisible), _setAttributes3));
197
- });
198
- // li
199
- $tabListItems.forEach(function (tabListItem, index) {
200
- var _setAttributes4;
201
-
202
- addClass(tabListItem, prefixClassName + TABS_LISTITEM_STYLE);
203
- setAttributes(tabListItem, (_setAttributes4 = {}, _defineProperty(_setAttributes4, ATTR_ROLE, TABS_ROLE_PRESENTATION), _defineProperty(_setAttributes4, 'id', TABS_LISTITEM_STYLE + iLisible + '-' + (index + 1)), _setAttributes4));
204
- });
205
- // a
206
- $tabListLinks.forEach(function (tabListLink) {
207
- var _setAttributes5, _setAttributes6;
208
-
209
- var idHref = tabListLink.getAttribute("href").replace('#', '');
210
- var panelControlled = findById(idHref);
211
- var linkText = tabListLink.innerText;
212
- var panelSelected = tabListLink.hasAttribute(TABS_DATA_SELECTED_TAB) === true;
213
-
214
- addClass(tabListLink, prefixClassName + TABS_LINK_STYLE);
215
- setAttributes(tabListLink, (_setAttributes5 = {
216
- 'id': TABS_PREFIX_IDS + idHref
217
- }, _defineProperty(_setAttributes5, ATTR_ROLE, TABS_ROLE_TAB), _defineProperty(_setAttributes5, ATTR_CONTROLS, idHref), _defineProperty(_setAttributes5, 'tabindex', '-1'), _defineProperty(_setAttributes5, ATTR_SELECTED, 'false'), _setAttributes5));
218
-
219
- // panel controlled
220
- setAttributes(panelControlled, (_setAttributes6 = {}, _defineProperty(_setAttributes6, ATTR_HIDDEN, 'true'), _defineProperty(_setAttributes6, ATTR_ROLE, TABS_ROLE_TABPANEL), _defineProperty(_setAttributes6, ATTR_LABELLEDBY, TABS_PREFIX_IDS + idHref), _setAttributes6));
221
- addClass(panelControlled, prefixClassName + TABS_CONTENT_STYLE);
222
-
223
- // if already selected
224
- if (panelSelected && noTabSelected) {
225
- noTabSelected = false;
226
- setAttributes(tabListLink, _defineProperty({
227
- 'tabindex': '0'
228
- }, ATTR_SELECTED, 'true'));
229
- setAttributes(panelControlled, _defineProperty({}, ATTR_HIDDEN, 'false'));
230
- }
231
-
232
- // hx
233
- if (hx !== '') {
234
- var hx_node = document.createElement(hx);
235
- hx_node.setAttribute('class', hxGeneratedClass);
236
- hx_node.setAttribute('tabindex', '0');
237
- hx_node.innerHTML = linkText;
238
- panelControlled.insertBefore(hx_node, panelControlled.firstChild);
239
- }
240
- // existingHx
241
-
242
- if (existingHx !== '') {
243
- var $hx_existing = [].slice.call(panelControlled.querySelectorAll(existingHx + ':first-child'));
244
- $hx_existing.forEach(function (hx_item) {
245
- hx_item.setAttribute('tabindex', '0');
246
- });
247
- }
248
-
249
- tabListLink.removeAttribute('href');
250
- });
251
-
252
- if (hash !== '') {
253
- var nodeHashed = findById(hash);
254
- if (nodeHashed !== null) {
255
- // just in case of an dumb error
256
- // search if hash is current tabs_node
257
- if (tabs_node.querySelector('#' + hash) !== null) {
258
- // search if hash is ON tabs
259
- if (hasClass(nodeHashed, TABS_JS_CONTENT) === true) {
260
- // unselect others
261
- unSelectLinks($tabListLinks);
262
- unSelectContents($tabListPanels);
263
- // select this one
264
- nodeHashed.removeAttribute(ATTR_HIDDEN);
265
- var linkHashed = findById(TABS_PREFIX_IDS + hash);
266
- setAttributes(linkHashed, _defineProperty({
267
- 'tabindex': '0'
268
- }, ATTR_SELECTED, 'true'));
269
- noTabSelected = false;
270
- } else {
271
- // search if hash is IN tabs
272
- var panelParentId = searchParent(nodeHashed, TABS_JS_CONTENT);
273
- if (panelParentId !== '') {
274
- // unselect others
275
- unSelectLinks($tabListLinks);
276
- unSelectContents($tabListPanels);
277
- // select this one
278
- var panelParent = findById(panelParentId);
279
- panelParent.removeAttribute(ATTR_HIDDEN);
280
- var linkParent = findById(TABS_PREFIX_IDS + panelParentId);
281
- setAttributes(linkParent, _defineProperty({
282
- 'tabindex': '0'
283
- }, ATTR_SELECTED, 'true'));
284
- noTabSelected = false;
285
- }
286
- }
287
- }
288
- }
289
- }
290
-
291
- // if no selected => select first
292
- if (noTabSelected === true) {
293
- setAttributes($tabListLinks[0], _defineProperty({
294
- 'tabindex': '0'
295
- }, ATTR_SELECTED, 'true'));
296
- var panelFirst = findById($tabListLinks[0].getAttribute(ATTR_CONTROLS));
297
- panelFirst.removeAttribute(ATTR_HIDDEN);
298
- }
299
- });
300
- };
301
-
302
- /* listeners */
303
- var bindListeners = function() {
304
- ['click', 'keydown'].forEach(function (eventName) {
305
- //let isCtrl = false;
306
-
307
- doc.body.addEventListener(eventName, function (e) {
308
-
309
- // click on a tab link or on something IN a tab link
310
- var parentLink = searchParent(e.target, TABS_JS_LISTLINK);
311
- if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'click') {
312
- var linkSelected = hasClass(e.target, TABS_JS_LISTLINK) === true ? e.target : findById(parentLink);
313
- var parentTabId = searchParent(e.target, TABS_JS);
314
- var parentTab = findById(parentTabId);
315
- //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
316
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
317
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
318
-
319
- // aria selected false on all links
320
- unSelectLinks($parentListLinks);
321
- // add aria-hidden on all tabs contents
322
- unSelectContents($parentListContents);
323
- // add aria selected on selected link + show linked panel
324
- selectLink(linkSelected);
325
-
326
- e.preventDefault();
327
- }
328
-
329
- // Key down on tabs
330
- if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'keydown') {
331
- //let linkSelected = hasClass( e.target, TABS_JS_LISTLINK) === true ? e.target : findById( parentLink );
332
- var parentTabId = searchParent(e.target, TABS_JS);
333
- var parentTab = findById(parentTabId);
334
- var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
335
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
336
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
337
- var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
338
- var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
339
-
340
- // strike home on a tab => 1st tab
341
- if (e.keyCode === 36) {
342
- unSelectLinks($parentListLinks);
343
- unSelectContents($parentListContents);
344
- selectLink(firstLink);
345
-
346
- e.preventDefault();
347
- }
348
- // strike end on a tab => last tab
349
- else if (e.keyCode === 35) {
350
- unSelectLinks($parentListLinks);
351
- unSelectContents($parentListContents);
352
- selectLink(lastLink);
353
-
354
- e.preventDefault();
355
- }
356
- // strike up or left on the tab => previous tab
357
- else if ((e.keyCode === 37 || e.keyCode === 38) && !e.ctrlKey) {
358
- if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
359
- unSelectLinks($parentListLinks);
360
- unSelectContents($parentListContents);
361
- selectLink(lastLink);
362
-
363
- e.preventDefault();
364
- } else {
365
- selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
366
- e.preventDefault();
367
- }
368
- }
369
- // strike down or right in the tab => next tab
370
- else if ((e.keyCode === 40 || e.keyCode === 39) && !e.ctrlKey) {
371
- if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
372
- unSelectLinks($parentListLinks);
373
- unSelectContents($parentListContents);
374
- selectLink(firstLink);
375
-
376
- e.preventDefault();
377
- } else {
378
- selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
379
- e.preventDefault();
380
- }
381
- }
382
- }
383
-
384
- // Key down in tab panels
385
- var parentTabPanelId = searchParent(e.target, TABS_JS_CONTENT);
386
- if (parentTabPanelId !== '' && eventName === 'keydown') {
387
- (function () {
388
- var linkSelected = findById(findById(parentTabPanelId).getAttribute(ATTR_LABELLEDBY));
389
- var parentTabId = searchParent(e.target, TABS_JS);
390
- var parentTab = findById(parentTabId);
391
- var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
392
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
393
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
394
- var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
395
- var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
396
-
397
- // strike up + ctrl => go to header
398
- if (e.keyCode === 38 && e.ctrlKey) {
399
- setTimeout(function () {
400
- linkSelected.focus();
401
- }, 0);
402
- e.preventDefault();
403
- }
404
- // strike pageup + ctrl => go to prev header
405
- if (e.keyCode === 33 && e.ctrlKey) {
406
- // go to header
407
- linkSelected.focus();
408
- e.preventDefault();
409
- // then previous
410
- if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
411
- unSelectLinks($parentListLinks);
412
- unSelectContents($parentListContents);
413
- selectLink(lastLink);
414
- } else {
415
- selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
416
- }
417
- }
418
- // strike pagedown + ctrl => go to next header
419
- if (e.keyCode === 34 && e.ctrlKey) {
420
- // go to header
421
- linkSelected.focus();
422
- e.preventDefault();
423
- // then next
424
- if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
425
- unSelectLinks($parentListLinks);
426
- unSelectContents($parentListContents);
427
- selectLink(firstLink);
428
- } else {
429
- selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
430
- }
431
- }
432
- })();
433
- }
434
-
435
- // click on a tab link
436
- var parentLinkToPanelId = searchParent(e.target, TABS_JS_LINK_TO_TAB);
437
- if ((hasClass(e.target, TABS_JS_LINK_TO_TAB) === true || parentLinkToPanelId !== '') && eventName === 'click') {
438
- var panelSelectedId = hasClass(e.target, TABS_JS_LINK_TO_TAB) === true ? e.target.getAttribute('href').replace('#', '') : findById(parentLinkToPanelId).replace('#', '');
439
- var panelSelected = findById(panelSelectedId);
440
- var buttonPanelSelected = findById(panelSelected.getAttribute(ATTR_LABELLEDBY));
441
- var parentTabId = searchParent(e.target, TABS_JS);
442
- var parentTab = findById(parentTabId);
443
- //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
444
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
445
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
446
-
447
- unSelectLinks($parentListLinks);
448
- unSelectContents($parentListContents);
449
- selectLink(buttonPanelSelected);
450
-
451
- e.preventDefault();
452
- }
453
- }, true);
454
- });
455
- };
456
-
457
- var onLoad = function onLoad() {
458
- attach();
459
- bindListeners();
460
- document.removeEventListener('DOMContentLoaded', onLoad);
461
- };
462
-
463
- document.addEventListener('DOMContentLoaded', onLoad);
464
-
465
- window.van11yAccessibleTabPanelAria = attach;
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
+ 'use strict';
7
+
8
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+
10
+ (function (doc) {
11
+
12
+ 'use strict';
13
+
14
+ var TABS_JS = 'js-tabs';
15
+ var TABS_JS_LIST = 'js-tablist';
16
+ var TABS_JS_LISTITEM = 'js-tablist__item';
17
+ var TABS_JS_LISTLINK = 'js-tablist__link';
18
+ var TABS_JS_CONTENT = 'js-tabcontent';
19
+ var TABS_JS_LINK_TO_TAB = 'js-link-to-tab';
20
+
21
+ var TABS_DATA_PREFIX_CLASS = 'data-tabs-prefix-class';
22
+ var TABS_DATA_HX = 'data-hx';
23
+ var TABS_DATA_GENERATED_HX_CLASS = 'data-tabs-generated-hx-class';
24
+ var TABS_DATA_EXISTING_HX = 'data-existing-hx';
25
+
26
+ var TABS_DATA_SELECTED_TAB = 'data-selected';
27
+
28
+ var TABS_PREFIX_IDS = 'label_';
29
+
30
+ var TABS_STYLE = 'tabs';
31
+ var TABS_LIST_STYLE = 'tabs__list';
32
+ var TABS_LISTITEM_STYLE = 'tabs__item';
33
+ var TABS_LINK_STYLE = 'tabs__link';
34
+ var TABS_CONTENT_STYLE = 'tabs__content';
35
+
36
+ var TABS_HX_DEFAULT_CLASS = 'invisible';
37
+
38
+ var TABS_ROLE_TABLIST = 'tablist';
39
+ var TABS_ROLE_TAB = 'tab';
40
+ var TABS_ROLE_TABPANEL = 'tabpanel';
41
+ var TABS_ROLE_PRESENTATION = 'presentation';
42
+
43
+ var ATTR_ROLE = 'role';
44
+ var ATTR_LABELLEDBY = 'aria-labelledby';
45
+ var ATTR_HIDDEN = 'aria-hidden';
46
+ var ATTR_CONTROLS = 'aria-controls';
47
+ var ATTR_SELECTED = 'aria-selected';
48
+
49
+ var DELAY_HASH_UPDATE = 1000;
50
+
51
+ var hash = window.location.hash.replace('#', '');
52
+
53
+ //const IS_OPENED_CLASS = 'is-opened';
54
+
55
+ var findById = function findById(id) {
56
+ return doc.getElementById(id);
57
+ };
58
+
59
+ var addClass = function addClass(el, className) {
60
+ if (el.classList) {
61
+ el.classList.add(className); // IE 10+
62
+ } else {
63
+ el.className += ' ' + className; // IE 8+
64
+ }
65
+ };
66
+
67
+ /*const removeClass = (el, className) => {
68
+ if (el.classList) {
69
+ el.classList.remove(className); // IE 10+
70
+ }
71
+ else {
72
+ el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); // IE 8+
73
+ }
74
+ }*/
75
+
76
+ var hasClass = function hasClass(el, className) {
77
+ if (el.classList) {
78
+ return el.classList.contains(className); // IE 10+
79
+ } else {
80
+ return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); // IE 8+ ?
81
+ }
82
+ };
83
+
84
+ var setAttributes = function setAttributes(node, attrs) {
85
+ Object.keys(attrs).forEach(function (attribute) {
86
+ node.setAttribute(attribute, attrs[attribute]);
87
+ });
88
+ };
89
+ var unSelectLinks = function unSelectLinks(elts) {
90
+ elts.forEach(function (link_node) {
91
+ var _setAttributes;
92
+
93
+ setAttributes(link_node, (_setAttributes = {}, _defineProperty(_setAttributes, ATTR_SELECTED, 'false'), _defineProperty(_setAttributes, 'tabindex', '-1'), _setAttributes));
94
+ });
95
+ };
96
+ var unSelectContents = function unSelectContents(elts) {
97
+ elts.forEach(function (content_node) {
98
+ content_node.setAttribute(ATTR_HIDDEN, true);
99
+ });
100
+ };
101
+
102
+ var selectLink = function selectLink(el) {
103
+ var _setAttributes2;
104
+
105
+ var destination = findById(el.getAttribute(ATTR_CONTROLS));
106
+ setAttributes(el, (_setAttributes2 = {}, _defineProperty(_setAttributes2, ATTR_SELECTED, 'true'), _defineProperty(_setAttributes2, 'tabindex', '0'), _setAttributes2));
107
+ destination.removeAttribute(ATTR_HIDDEN);
108
+ setTimeout(function () {
109
+ el.focus();
110
+ }, 0);
111
+ // Note : removed to prevent conflicts when editing sibu elements
112
+ // setTimeout(function () {
113
+ // history.pushState(null, null, location.pathname + location.search + '#' + el.getAttribute(ATTR_CONTROLS));
114
+ // }, DELAY_HASH_UPDATE);
115
+ };
116
+
117
+ var selectLinkInList = function selectLinkInList(itemsList, linkList, contentList, param) {
118
+ var indice_trouve = undefined;
119
+
120
+ itemsList.forEach(function (itemNode, index) {
121
+ if (itemNode.querySelector('.' + TABS_JS_LISTLINK).getAttribute(ATTR_SELECTED) === 'true') {
122
+ indice_trouve = index;
123
+ }
124
+ });
125
+ unSelectLinks(linkList);
126
+ unSelectContents(contentList);
127
+ if (param === 'next') {
128
+ selectLink(linkList[indice_trouve + 1]);
129
+ setTimeout(function () {
130
+ linkList[indice_trouve + 1].focus();
131
+ }, 0);
132
+ }
133
+ if (param === 'prev') {
134
+ selectLink(linkList[indice_trouve - 1]);
135
+ setTimeout(function () {
136
+ linkList[indice_trouve - 1].focus();
137
+ }, 0);
138
+ }
139
+ };
140
+
141
+ /* gets an element el, search if it is child of parent class, returns id of the parent */
142
+ var searchParent = function searchParent(el, parentClass) {
143
+ var found = false;
144
+ var parentElement = el.parentNode;
145
+ while (parentElement && found === false) {
146
+ if (hasClass(parentElement, parentClass) === true) {
147
+ found = true;
148
+ } else {
149
+ parentElement = parentElement.parentNode;
150
+ }
151
+ }
152
+ if (found === true) {
153
+ return parentElement.getAttribute('id');
154
+ } else {
155
+ return '';
156
+ }
157
+ };
158
+
159
+ /** Find all tabs inside a container
160
+ * @param {Node} node Default document
161
+ * @return {Array}
162
+ */
163
+ var $listTabs = function $listTabs() {
164
+ var node = arguments.length <= 0 || arguments[0] === undefined ? doc : arguments[0];
165
+ return [].slice.call(node.querySelectorAll('.' + TABS_JS));
166
+ };
167
+
168
+ /**
169
+ * Build tooltips for a container
170
+ * @param {Node} node
171
+ */
172
+ var attach = function attach(node) {
173
+
174
+ $listTabs(node).forEach(function (tabs_node) {
175
+
176
+ var iLisible = Math.random().toString(32).slice(2, 12);
177
+ var prefixClassName = tabs_node.hasAttribute(TABS_DATA_PREFIX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_PREFIX_CLASS) + '-' : '';
178
+ var hx = tabs_node.hasAttribute(TABS_DATA_HX) === true ? tabs_node.getAttribute(TABS_DATA_HX) : '';
179
+ var hxGeneratedClass = tabs_node.hasAttribute(TABS_DATA_GENERATED_HX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_GENERATED_HX_CLASS) : TABS_HX_DEFAULT_CLASS;
180
+ var existingHx = tabs_node.hasAttribute(TABS_DATA_EXISTING_HX) === true ? tabs_node.getAttribute(TABS_DATA_EXISTING_HX) : '';
181
+ var $tabList = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LIST));
182
+ var $tabListItems = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTITEM));
183
+ var $tabListLinks = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTLINK));
184
+ var $tabListPanels = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_CONTENT));
185
+ var noTabSelected = true;
186
+
187
+ // container
188
+ addClass(tabs_node, prefixClassName + TABS_STYLE);
189
+ tabs_node.setAttribute('id', TABS_STYLE + iLisible);
190
+
191
+ // ul
192
+ $tabList.forEach(function (tabList) {
193
+ var _setAttributes3;
194
+
195
+ addClass(tabList, prefixClassName + TABS_LIST_STYLE);
196
+ setAttributes(tabList, (_setAttributes3 = {}, _defineProperty(_setAttributes3, ATTR_ROLE, TABS_ROLE_TABLIST), _defineProperty(_setAttributes3, 'id', TABS_LIST_STYLE + iLisible), _setAttributes3));
197
+ });
198
+ // li
199
+ $tabListItems.forEach(function (tabListItem, index) {
200
+ var _setAttributes4;
201
+
202
+ addClass(tabListItem, prefixClassName + TABS_LISTITEM_STYLE);
203
+ setAttributes(tabListItem, (_setAttributes4 = {}, _defineProperty(_setAttributes4, ATTR_ROLE, TABS_ROLE_PRESENTATION), _defineProperty(_setAttributes4, 'id', TABS_LISTITEM_STYLE + iLisible + '-' + (index + 1)), _setAttributes4));
204
+ });
205
+ // a
206
+ $tabListLinks.forEach(function (tabListLink) {
207
+ var _setAttributes5, _setAttributes6;
208
+
209
+ var idHref = tabListLink.getAttribute("href").replace('#', '');
210
+ var panelControlled = findById(idHref);
211
+ var linkText = tabListLink.innerText;
212
+ var panelSelected = tabListLink.hasAttribute(TABS_DATA_SELECTED_TAB) === true;
213
+
214
+ addClass(tabListLink, prefixClassName + TABS_LINK_STYLE);
215
+ setAttributes(tabListLink, (_setAttributes5 = {
216
+ 'id': TABS_PREFIX_IDS + idHref
217
+ }, _defineProperty(_setAttributes5, ATTR_ROLE, TABS_ROLE_TAB), _defineProperty(_setAttributes5, ATTR_CONTROLS, idHref), _defineProperty(_setAttributes5, 'tabindex', '-1'), _defineProperty(_setAttributes5, ATTR_SELECTED, 'false'), _setAttributes5));
218
+
219
+ // panel controlled
220
+ setAttributes(panelControlled, (_setAttributes6 = {}, _defineProperty(_setAttributes6, ATTR_HIDDEN, 'true'), _defineProperty(_setAttributes6, ATTR_ROLE, TABS_ROLE_TABPANEL), _defineProperty(_setAttributes6, ATTR_LABELLEDBY, TABS_PREFIX_IDS + idHref), _setAttributes6));
221
+ addClass(panelControlled, prefixClassName + TABS_CONTENT_STYLE);
222
+
223
+ // if already selected
224
+ if (panelSelected && noTabSelected) {
225
+ noTabSelected = false;
226
+ setAttributes(tabListLink, _defineProperty({
227
+ 'tabindex': '0'
228
+ }, ATTR_SELECTED, 'true'));
229
+ setAttributes(panelControlled, _defineProperty({}, ATTR_HIDDEN, 'false'));
230
+ }
231
+
232
+ // hx
233
+ if (hx !== '') {
234
+ var hx_node = document.createElement(hx);
235
+ hx_node.setAttribute('class', hxGeneratedClass);
236
+ hx_node.setAttribute('tabindex', '0');
237
+ hx_node.innerHTML = linkText;
238
+ panelControlled.insertBefore(hx_node, panelControlled.firstChild);
239
+ }
240
+ // existingHx
241
+
242
+ if (existingHx !== '') {
243
+ var $hx_existing = [].slice.call(panelControlled.querySelectorAll(existingHx + ':first-child'));
244
+ $hx_existing.forEach(function (hx_item) {
245
+ hx_item.setAttribute('tabindex', '0');
246
+ });
247
+ }
248
+
249
+ tabListLink.removeAttribute('href');
250
+ });
251
+
252
+ if (hash !== '') {
253
+ var nodeHashed = findById(hash);
254
+ if (nodeHashed !== null) {
255
+ // just in case of an dumb error
256
+ // search if hash is current tabs_node
257
+ if (tabs_node.querySelector('#' + hash) !== null) {
258
+ // search if hash is ON tabs
259
+ if (hasClass(nodeHashed, TABS_JS_CONTENT) === true) {
260
+ // unselect others
261
+ unSelectLinks($tabListLinks);
262
+ unSelectContents($tabListPanels);
263
+ // select this one
264
+ nodeHashed.removeAttribute(ATTR_HIDDEN);
265
+ var linkHashed = findById(TABS_PREFIX_IDS + hash);
266
+ setAttributes(linkHashed, _defineProperty({
267
+ 'tabindex': '0'
268
+ }, ATTR_SELECTED, 'true'));
269
+ noTabSelected = false;
270
+ } else {
271
+ // search if hash is IN tabs
272
+ var panelParentId = searchParent(nodeHashed, TABS_JS_CONTENT);
273
+ if (panelParentId !== '') {
274
+ // unselect others
275
+ unSelectLinks($tabListLinks);
276
+ unSelectContents($tabListPanels);
277
+ // select this one
278
+ var panelParent = findById(panelParentId);
279
+ panelParent.removeAttribute(ATTR_HIDDEN);
280
+ var linkParent = findById(TABS_PREFIX_IDS + panelParentId);
281
+ setAttributes(linkParent, _defineProperty({
282
+ 'tabindex': '0'
283
+ }, ATTR_SELECTED, 'true'));
284
+ noTabSelected = false;
285
+ }
286
+ }
287
+ }
288
+ }
289
+ }
290
+
291
+ // if no selected => select first
292
+ if (noTabSelected === true) {
293
+ setAttributes($tabListLinks[0], _defineProperty({
294
+ 'tabindex': '0'
295
+ }, ATTR_SELECTED, 'true'));
296
+ var panelFirst = findById($tabListLinks[0].getAttribute(ATTR_CONTROLS));
297
+ panelFirst.removeAttribute(ATTR_HIDDEN);
298
+ }
299
+ });
300
+ };
301
+
302
+ /* listeners */
303
+ var bindListeners = function() {
304
+ ['click', 'keydown'].forEach(function (eventName) {
305
+ //let isCtrl = false;
306
+
307
+ doc.body.addEventListener(eventName, function (e) {
308
+
309
+ // click on a tab link or on something IN a tab link
310
+ var parentLink = searchParent(e.target, TABS_JS_LISTLINK);
311
+ if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'click') {
312
+ var linkSelected = hasClass(e.target, TABS_JS_LISTLINK) === true ? e.target : findById(parentLink);
313
+ var parentTabId = searchParent(e.target, TABS_JS);
314
+ var parentTab = findById(parentTabId);
315
+ //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
316
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
317
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
318
+
319
+ // aria selected false on all links
320
+ unSelectLinks($parentListLinks);
321
+ // add aria-hidden on all tabs contents
322
+ unSelectContents($parentListContents);
323
+ // add aria selected on selected link + show linked panel
324
+ selectLink(linkSelected);
325
+
326
+ e.preventDefault();
327
+ }
328
+
329
+ // Key down on tabs
330
+ if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'keydown') {
331
+ //let linkSelected = hasClass( e.target, TABS_JS_LISTLINK) === true ? e.target : findById( parentLink );
332
+ var parentTabId = searchParent(e.target, TABS_JS);
333
+ var parentTab = findById(parentTabId);
334
+ var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
335
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
336
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
337
+ var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
338
+ var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
339
+
340
+ // strike home on a tab => 1st tab
341
+ if (e.keyCode === 36) {
342
+ unSelectLinks($parentListLinks);
343
+ unSelectContents($parentListContents);
344
+ selectLink(firstLink);
345
+
346
+ e.preventDefault();
347
+ }
348
+ // strike end on a tab => last tab
349
+ else if (e.keyCode === 35) {
350
+ unSelectLinks($parentListLinks);
351
+ unSelectContents($parentListContents);
352
+ selectLink(lastLink);
353
+
354
+ e.preventDefault();
355
+ }
356
+ // strike up or left on the tab => previous tab
357
+ else if ((e.keyCode === 37 || e.keyCode === 38) && !e.ctrlKey) {
358
+ if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
359
+ unSelectLinks($parentListLinks);
360
+ unSelectContents($parentListContents);
361
+ selectLink(lastLink);
362
+
363
+ e.preventDefault();
364
+ } else {
365
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
366
+ e.preventDefault();
367
+ }
368
+ }
369
+ // strike down or right in the tab => next tab
370
+ else if ((e.keyCode === 40 || e.keyCode === 39) && !e.ctrlKey) {
371
+ if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
372
+ unSelectLinks($parentListLinks);
373
+ unSelectContents($parentListContents);
374
+ selectLink(firstLink);
375
+
376
+ e.preventDefault();
377
+ } else {
378
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
379
+ e.preventDefault();
380
+ }
381
+ }
382
+ }
383
+
384
+ // Key down in tab panels
385
+ var parentTabPanelId = searchParent(e.target, TABS_JS_CONTENT);
386
+ if (parentTabPanelId !== '' && eventName === 'keydown') {
387
+ (function () {
388
+ var linkSelected = findById(findById(parentTabPanelId).getAttribute(ATTR_LABELLEDBY));
389
+ var parentTabId = searchParent(e.target, TABS_JS);
390
+ var parentTab = findById(parentTabId);
391
+ var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
392
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
393
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
394
+ var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
395
+ var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
396
+
397
+ // strike up + ctrl => go to header
398
+ if (e.keyCode === 38 && e.ctrlKey) {
399
+ setTimeout(function () {
400
+ linkSelected.focus();
401
+ }, 0);
402
+ e.preventDefault();
403
+ }
404
+ // strike pageup + ctrl => go to prev header
405
+ if (e.keyCode === 33 && e.ctrlKey) {
406
+ // go to header
407
+ linkSelected.focus();
408
+ e.preventDefault();
409
+ // then previous
410
+ if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
411
+ unSelectLinks($parentListLinks);
412
+ unSelectContents($parentListContents);
413
+ selectLink(lastLink);
414
+ } else {
415
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
416
+ }
417
+ }
418
+ // strike pagedown + ctrl => go to next header
419
+ if (e.keyCode === 34 && e.ctrlKey) {
420
+ // go to header
421
+ linkSelected.focus();
422
+ e.preventDefault();
423
+ // then next
424
+ if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
425
+ unSelectLinks($parentListLinks);
426
+ unSelectContents($parentListContents);
427
+ selectLink(firstLink);
428
+ } else {
429
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
430
+ }
431
+ }
432
+ })();
433
+ }
434
+
435
+ // click on a tab link
436
+ var parentLinkToPanelId = searchParent(e.target, TABS_JS_LINK_TO_TAB);
437
+ if ((hasClass(e.target, TABS_JS_LINK_TO_TAB) === true || parentLinkToPanelId !== '') && eventName === 'click') {
438
+ var panelSelectedId = hasClass(e.target, TABS_JS_LINK_TO_TAB) === true ? e.target.getAttribute('href').replace('#', '') : findById(parentLinkToPanelId).replace('#', '');
439
+ var panelSelected = findById(panelSelectedId);
440
+ var buttonPanelSelected = findById(panelSelected.getAttribute(ATTR_LABELLEDBY));
441
+ var parentTabId = searchParent(e.target, TABS_JS);
442
+ var parentTab = findById(parentTabId);
443
+ //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
444
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
445
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
446
+
447
+ unSelectLinks($parentListLinks);
448
+ unSelectContents($parentListContents);
449
+ selectLink(buttonPanelSelected);
450
+
451
+ e.preventDefault();
452
+ }
453
+ }, true);
454
+ });
455
+ };
456
+
457
+ var onLoad = function onLoad() {
458
+ attach();
459
+ bindListeners();
460
+ document.removeEventListener('DOMContentLoaded', onLoad);
461
+ };
462
+
463
+ document.addEventListener('DOMContentLoaded', onLoad);
464
+
465
+ window.van11yAccessibleTabPanelAria = attach;
466
466
  })(document);