PluginProbe
Elementor Website Builder – more than just a page builder / 3.30.0-beta1
Elementor Website Builder – more than just a page builder v3.30.0-beta1
4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 All 457 releases
elementor / assets / js / nested-title-keyboard-handler.967db65f6ba460c1f2e9.bundle.js

nested-title-keyboard-handler.967db65f6ba460c1f2e9.bundle.js in Elementor Website Builder – more than just a page builder 3.30.0-beta1, at assets/js/nested-title-keyboard-handler.967db65f6ba460c1f2e9.bundle.js

209 lines 7.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*! elementor - v3.30.0 - 10-06-2025 */
2 "use strict";
3 (self["webpackChunkelementorFrontend"] = self["webpackChunkelementorFrontend"] || []).push([["nested-title-keyboard-handler"],{
4
5 /***/ "../assets/dev/js/frontend/handlers/accessibility/nested-title-keyboard-handler.js":
6 /*!*****************************************************************************************!*\
7 !*** ../assets/dev/js/frontend/handlers/accessibility/nested-title-keyboard-handler.js ***!
8 \*****************************************************************************************/
9 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10
11
12
13 var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
14 Object.defineProperty(exports, "__esModule", ({
15 value: true
16 }));
17 exports["default"] = void 0;
18 __webpack_require__(/*! core-js/modules/es.array.includes.js */ "../node_modules/core-js/modules/es.array.includes.js");
19 __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ "../node_modules/core-js/modules/esnext.iterator.constructor.js");
20 __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ "../node_modules/core-js/modules/esnext.iterator.filter.js");
21 __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ "../node_modules/core-js/modules/esnext.iterator.find.js");
22 var _base = _interopRequireDefault(__webpack_require__(/*! ../base */ "../assets/dev/js/frontend/handlers/base.js"));
23 class NestedTitleKeyboardHandler extends _base.default {
24 __construct(settings) {
25 super.__construct(settings);
26 this.directionNext = 'next';
27 this.directionPrevious = 'previous';
28 this.focusableElementSelector = 'audio, button, canvas, details, iframe, input, select, summary, textarea, video, [accesskey], [contenteditable], [href], [tabindex]:not([tabindex="-1"])';
29 }
30 getWidgetNumber() {
31 return this.$element.find('> .elementor-widget-container > .e-n-tabs, > .e-n-tabs').attr('data-widget-number');
32 }
33 getDefaultSettings() {
34 return {
35 selectors: {
36 itemTitle: `[id*="e-n-tab-title-${this.getWidgetNumber()}"]`,
37 itemContainer: `[id*="e-n-tab-content-${this.getWidgetNumber()}"]`
38 },
39 ariaAttributes: {
40 titleStateAttribute: 'aria-selected',
41 activeTitleSelector: '[aria-selected="true"]'
42 },
43 datasets: {
44 titleIndex: 'data-tab-index'
45 },
46 keyDirection: {
47 ArrowLeft: elementorFrontendConfig.is_rtl ? this.directionNext : this.directionPrevious,
48 ArrowUp: this.directionPrevious,
49 ArrowRight: elementorFrontendConfig.is_rtl ? this.directionPrevious : this.directionNext,
50 ArrowDown: this.directionNext
51 }
52 };
53 }
54 getDefaultElements() {
55 const selectors = this.getSettings('selectors');
56 return {
57 $itemTitles: this.findElement(selectors.itemTitle),
58 $itemContainers: this.findElement(selectors.itemContainer),
59 $focusableContainerElements: this.getFocusableElements(this.findElement(selectors.itemContainer))
60 };
61 }
62 getFocusableElements($elements) {
63 return $elements.find(this.focusableElementSelector).not('[disabled], [inert]');
64 }
65 getKeyDirectionValue(event) {
66 const direction = this.getSettings('keyDirection')[event.key];
67 return this.directionNext === direction ? 1 : -1;
68 }
69
70 /**
71 * @param {HTMLElement} itemTitleElement
72 *
73 * @return {string}
74 */
75 getTitleIndex(itemTitleElement) {
76 const {
77 titleIndex: indexAttribute
78 } = this.getSettings('datasets');
79 return itemTitleElement.getAttribute(indexAttribute);
80 }
81
82 /**
83 * @param {string|number} titleIndex
84 *
85 * @return {string}
86 */
87 getTitleFilterSelector(titleIndex) {
88 const {
89 titleIndex: indexAttribute
90 } = this.getSettings('datasets');
91 return `[${indexAttribute}="${titleIndex}"]`;
92 }
93 getActiveTitleElement() {
94 const activeTitleFilter = this.getSettings('ariaAttributes').activeTitleSelector;
95 return this.elements.$itemTitles.filter(activeTitleFilter);
96 }
97 onInit() {
98 super.onInit(...arguments);
99 }
100 bindEvents() {
101 this.elements.$itemTitles.on(this.getTitleEvents());
102 this.elements.$focusableContainerElements.on(this.getContentElementEvents());
103 }
104 unbindEvents() {
105 this.elements.$itemTitles.off(this.getTitleEvents());
106 this.elements.$focusableContainerElements.children().off(this.getContentElementEvents());
107 }
108 getTitleEvents() {
109 return {
110 keydown: this.handleTitleKeyboardNavigation.bind(this)
111 };
112 }
113 getContentElementEvents() {
114 return {
115 keydown: this.handleContentElementKeyboardNavigation.bind(this)
116 };
117 }
118 isDirectionKey(event) {
119 const directionKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];
120 return directionKeys.includes(event.key);
121 }
122 isActivationKey(event) {
123 const activationKeys = ['Enter', ' '];
124 return activationKeys.includes(event.key);
125 }
126 handleTitleKeyboardNavigation(event) {
127 if (this.isDirectionKey(event)) {
128 event.preventDefault();
129 const currentTitleIndex = parseInt(this.getTitleIndex(event.currentTarget)) || 1,
130 numberOfTitles = this.elements.$itemTitles.length,
131 titleIndexUpdated = this.getTitleIndexFocusUpdated(event, currentTitleIndex, numberOfTitles);
132 this.changeTitleFocus(titleIndexUpdated);
133 event.stopPropagation();
134 } else if (this.isActivationKey(event)) {
135 event.preventDefault();
136 if (this.handeTitleLinkEnterOrSpaceEvent(event)) {
137 return;
138 }
139 const titleIndex = this.getTitleIndex(event.currentTarget);
140 elementorFrontend.elements.$window.trigger('elementor/nested-elements/activate-by-keyboard', {
141 widgetId: this.getID(),
142 titleIndex
143 });
144 } else if ('Escape' === event.key) {
145 this.handleTitleEscapeKeyEvents(event);
146 }
147 }
148 handeTitleLinkEnterOrSpaceEvent(event) {
149 const isLinkElement = 'a' === event?.currentTarget?.tagName?.toLowerCase();
150 if (!elementorFrontend.isEditMode() && isLinkElement) {
151 event?.currentTarget?.click();
152 event.stopPropagation();
153 }
154 return isLinkElement;
155 }
156 getTitleIndexFocusUpdated(event, currentTitleIndex, numberOfTitles) {
157 let titleIndexUpdated = 0;
158 switch (event.key) {
159 case 'Home':
160 titleIndexUpdated = 1;
161 break;
162 case 'End':
163 titleIndexUpdated = numberOfTitles;
164 break;
165 default:
166 const directionValue = this.getKeyDirectionValue(event),
167 isEndReached = numberOfTitles < currentTitleIndex + directionValue,
168 isStartReached = 0 === currentTitleIndex + directionValue;
169 if (isEndReached) {
170 titleIndexUpdated = 1;
171 } else if (isStartReached) {
172 titleIndexUpdated = numberOfTitles;
173 } else {
174 titleIndexUpdated = currentTitleIndex + directionValue;
175 }
176 }
177 return titleIndexUpdated;
178 }
179 changeTitleFocus(titleIndexUpdated) {
180 const $newTitle = this.elements.$itemTitles.filter(this.getTitleFilterSelector(titleIndexUpdated));
181 this.setTitleTabindex(titleIndexUpdated);
182 $newTitle.trigger('focus');
183 }
184 setTitleTabindex(titleIndex) {
185 this.elements.$itemTitles.attr('tabindex', '-1');
186 const $newTitle = this.elements.$itemTitles.filter(this.getTitleFilterSelector(titleIndex));
187 $newTitle.attr('tabindex', '0');
188 }
189 handleTitleEscapeKeyEvents() {}
190 handleContentElementKeyboardNavigation(event) {
191 if ('Tab' === event.key && !event.shiftKey) {
192 this.handleContentElementTabEvents(event);
193 } else if ('Escape' === event.key) {
194 event.preventDefault();
195 event.stopPropagation();
196 this.handleContentElementEscapeEvents(event);
197 }
198 }
199 handleContentElementEscapeEvents() {
200 this.getActiveTitleElement().trigger('focus');
201 }
202 handleContentElementTabEvents() {}
203 }
204 exports["default"] = NestedTitleKeyboardHandler;
205
206 /***/ })
207
208 }]);
209 //# sourceMappingURL=nested-title-keyboard-handler.967db65f6ba460c1f2e9.bundle.js.map