aria-ease 6.14.0 → 7.0.1
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.
- package/README.md +1 -1
- package/dist/AccordionComponentStrategy-2SWMNUR6.js +1 -0
- package/dist/ComboboxComponentStrategy-YSYLR2U5.js +5 -0
- package/dist/MenuComponentStrategy-C22BZEBH.js +5 -0
- package/dist/RelativeTargetResolver-T4P25J2M.js +1 -0
- package/dist/TabsComponentStrategy-ADEEFJXM.js +1 -0
- package/dist/audit-WBKVW7H6.js +9 -0
- package/dist/badgeHelper-IB5RTMAG.js +11 -0
- package/dist/badgeHelper-JSROP5ML.js +1 -0
- package/dist/buildContracts-T4XQZBDU.js +13 -0
- package/dist/chunk-52I3INNG.js +11 -0
- package/dist/chunk-APUMBDOT.js +1 -0
- package/dist/chunk-BHNO4ZI3.js +1 -0
- package/dist/chunk-CNU4N4AY.js +1 -0
- package/dist/chunk-SM6ZKEDR.js +1 -0
- package/dist/chunk-ZNQ5BXVJ.js +1 -0
- package/dist/cli.cjs +132 -3560
- package/dist/cli.js +19 -161
- package/dist/configLoader-ZEJVXLX7.js +1 -0
- package/dist/configLoader-ZXTSCIP6.js +1 -0
- package/dist/contractTestRunnerPlaywright-FOCQTM4L.js +46 -0
- package/dist/contractTestRunnerPlaywright-QPU6HZXG.js +46 -0
- package/dist/formatters-H3CPDLG5.js +87 -0
- package/dist/index.cjs +64 -5103
- package/dist/index.d.cts +4 -6
- package/dist/index.d.ts +4 -6
- package/dist/index.js +17 -2703
- package/dist/src/accordion/index.cjs +1 -183
- package/dist/src/accordion/index.js +1 -181
- package/dist/src/block/index.cjs +1 -124
- package/dist/src/block/index.js +1 -122
- package/dist/src/checkbox/index.cjs +1 -109
- package/dist/src/checkbox/index.js +1 -107
- package/dist/src/combobox/index.cjs +1 -265
- package/dist/src/combobox/index.js +1 -263
- package/dist/src/menu/index.cjs +1 -339
- package/dist/src/menu/index.js +1 -337
- package/dist/src/radio/index.cjs +1 -117
- package/dist/src/radio/index.js +1 -115
- package/dist/src/tabs/index.cjs +1 -265
- package/dist/src/tabs/index.js +1 -263
- package/dist/src/toggle/index.cjs +1 -119
- package/dist/src/toggle/index.js +1 -117
- package/dist/src/utils/test/AccordionComponentStrategy-X2GSQ5KT.js +1 -0
- package/dist/src/utils/test/ComboboxComponentStrategy-SICWLI27.js +5 -0
- package/dist/src/utils/test/MenuComponentStrategy-R4VPAHDE.js +5 -0
- package/dist/src/utils/test/RelativeTargetResolver-UQQMZHI6.js +1 -0
- package/dist/src/utils/test/TabsComponentStrategy-L2PYNEW6.js +1 -0
- package/dist/src/utils/test/badgeHelper-ER5ZOHWF.js +11 -0
- package/dist/src/utils/test/chunk-APUMBDOT.js +1 -0
- package/dist/src/utils/test/chunk-BHNO4ZI3.js +1 -0
- package/dist/src/utils/test/configLoader-NCYRL2O6.js +1 -0
- package/dist/src/utils/test/contractTestRunnerPlaywright-YZCMF64Q.js +46 -0
- package/dist/src/utils/test/dsl/index.cjs +1 -838
- package/dist/src/utils/test/dsl/index.d.cts +2 -4
- package/dist/src/utils/test/dsl/index.d.ts +2 -4
- package/dist/src/utils/test/dsl/index.js +1 -836
- package/dist/src/utils/test/index.cjs +64 -2672
- package/dist/src/utils/test/index.d.cts +2 -2
- package/dist/src/utils/test/index.d.ts +2 -2
- package/dist/src/utils/test/index.js +16 -340
- package/dist/test-VXSCSKV5.js +19 -0
- package/package.json +8 -10
- package/dist/AccordionComponentStrategy-4ZEIQ2V6.js +0 -42
- package/dist/ComboboxComponentStrategy-DU342VMB.js +0 -64
- package/dist/MenuComponentStrategy-VYCC2XOM.js +0 -81
- package/dist/RelativeTargetResolver-DJAITO6D.js +0 -7
- package/dist/TabsComponentStrategy-3SQURPMX.js +0 -29
- package/dist/audit-JYEPKLHR.js +0 -63
- package/dist/badgeHelper-JOWO6RQG.js +0 -15
- package/dist/badgeHelper-RDOMCC6E.js +0 -108
- package/dist/buildContracts-VIV6GM56.js +0 -437
- package/dist/chunk-4DU5Z5BR.js +0 -340
- package/dist/chunk-GJGUY643.js +0 -182
- package/dist/chunk-GLT43UVH.js +0 -43
- package/dist/chunk-I2KLQ2HA.js +0 -22
- package/dist/chunk-JJEPLK7L.js +0 -107
- package/dist/chunk-PK5L2SAF.js +0 -17
- package/dist/configLoader-Q7N5XV4P.js +0 -183
- package/dist/configLoader-REHK3S3Q.js +0 -7
- package/dist/contractTestRunnerPlaywright-B2HLZKKK.js +0 -1394
- package/dist/contractTestRunnerPlaywright-RWK52C7S.js +0 -1394
- package/dist/formatters-32KQIIYS.js +0 -183
- package/dist/src/utils/test/AccordionComponentStrategy-WRHZOEN6.js +0 -38
- package/dist/src/utils/test/ComboboxComponentStrategy-XKQ72RFD.js +0 -60
- package/dist/src/utils/test/MenuComponentStrategy-6XWU5KLW.js +0 -77
- package/dist/src/utils/test/RelativeTargetResolver-G2XDN2VV.js +0 -1
- package/dist/src/utils/test/TabsComponentStrategy-BKG53SEV.js +0 -26
- package/dist/src/utils/test/badgeHelper-HZKGOPB4.js +0 -102
- package/dist/src/utils/test/chunk-4DU5Z5BR.js +0 -332
- package/dist/src/utils/test/chunk-GLT43UVH.js +0 -41
- package/dist/src/utils/test/configLoader-NA7IBCS3.js +0 -181
- package/dist/src/utils/test/contractTestRunnerPlaywright-5FIGA5G4.js +0 -1372
- package/dist/test-WDBS5JWO.js +0 -358
|
@@ -1,183 +1 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/accordion/src/makeAccordionAccessible/makeAccordionAccessible.ts
|
|
4
|
-
function makeAccordionAccessible({ accordionId, triggersClass, panelsClass, allowMultipleOpen = false, callback }) {
|
|
5
|
-
const accordionContainer = document.querySelector(`#${accordionId}`);
|
|
6
|
-
if (!accordionContainer) {
|
|
7
|
-
console.error(`[aria-ease] Element with id="${accordionId}" not found. Make sure the accordion container exists before calling makeAccordionAccessible.`);
|
|
8
|
-
return { cleanup: () => {
|
|
9
|
-
} };
|
|
10
|
-
}
|
|
11
|
-
const triggers = Array.from(accordionContainer.querySelectorAll(`.${triggersClass}`));
|
|
12
|
-
if (triggers.length === 0) {
|
|
13
|
-
console.error(`[aria-ease] No elements with class="${triggersClass}" found. Make sure accordion triggers exist before calling makeAccordionAccessible.`);
|
|
14
|
-
return { cleanup: () => {
|
|
15
|
-
} };
|
|
16
|
-
}
|
|
17
|
-
const panels = Array.from(accordionContainer.querySelectorAll(`.${panelsClass}`));
|
|
18
|
-
if (panels.length === 0) {
|
|
19
|
-
console.error(`[aria-ease] No elements with class="${panelsClass}" found. Make sure accordion panels exist before calling makeAccordionAccessible.`);
|
|
20
|
-
return { cleanup: () => {
|
|
21
|
-
} };
|
|
22
|
-
}
|
|
23
|
-
if (triggers.length !== panels.length) {
|
|
24
|
-
console.error(`[aria-ease] Accordion trigger/panel mismatch: found ${triggers.length} triggers but ${panels.length} panels.`);
|
|
25
|
-
return { cleanup: () => {
|
|
26
|
-
} };
|
|
27
|
-
}
|
|
28
|
-
const handlerMap = /* @__PURE__ */ new WeakMap();
|
|
29
|
-
const clickHandlerMap = /* @__PURE__ */ new WeakMap();
|
|
30
|
-
function initialize() {
|
|
31
|
-
triggers.forEach((trigger, index) => {
|
|
32
|
-
const panel = panels[index];
|
|
33
|
-
if (!trigger.id) {
|
|
34
|
-
trigger.id = `${accordionId}-trigger-${index}`;
|
|
35
|
-
}
|
|
36
|
-
if (!panel.id) {
|
|
37
|
-
panel.id = `${accordionId}-panel-${index}`;
|
|
38
|
-
}
|
|
39
|
-
trigger.setAttribute("aria-controls", panel.id);
|
|
40
|
-
trigger.setAttribute("aria-expanded", "false");
|
|
41
|
-
if (!allowMultipleOpen || triggers.length <= 6) {
|
|
42
|
-
panel.setAttribute("role", "region");
|
|
43
|
-
}
|
|
44
|
-
panel.setAttribute("aria-labelledby", trigger.id);
|
|
45
|
-
panel.style.display = "none";
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
function expandItem(index) {
|
|
49
|
-
if (index < 0 || index >= triggers.length) {
|
|
50
|
-
console.error(`[aria-ease] Invalid accordion index: ${index}`);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const trigger = triggers[index];
|
|
54
|
-
const panel = panels[index];
|
|
55
|
-
trigger.setAttribute("aria-expanded", "true");
|
|
56
|
-
panel.style.display = "block";
|
|
57
|
-
if (callback?.onExpand) {
|
|
58
|
-
try {
|
|
59
|
-
callback.onExpand(index);
|
|
60
|
-
} catch (error) {
|
|
61
|
-
console.error("[aria-ease] Error in accordion onExpand callback:", error);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function collapseItem(index) {
|
|
66
|
-
if (index < 0 || index >= triggers.length) {
|
|
67
|
-
console.error(`[aria-ease] Invalid accordion index: ${index}`);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const trigger = triggers[index];
|
|
71
|
-
const panel = panels[index];
|
|
72
|
-
trigger.setAttribute("aria-expanded", "false");
|
|
73
|
-
panel.style.display = "none";
|
|
74
|
-
if (callback?.onCollapse) {
|
|
75
|
-
try {
|
|
76
|
-
callback.onCollapse(index);
|
|
77
|
-
} catch (error) {
|
|
78
|
-
console.error("[aria-ease] Error in accordion onCollapse callback:", error);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function toggleItem(index) {
|
|
83
|
-
const trigger = triggers[index];
|
|
84
|
-
const isExpanded = trigger.getAttribute("aria-expanded") === "true";
|
|
85
|
-
if (isExpanded) {
|
|
86
|
-
collapseItem(index);
|
|
87
|
-
} else {
|
|
88
|
-
if (!allowMultipleOpen) {
|
|
89
|
-
triggers.forEach((_, i) => {
|
|
90
|
-
if (i !== index) {
|
|
91
|
-
collapseItem(i);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
expandItem(index);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
function handleTriggerClick(index) {
|
|
99
|
-
return () => {
|
|
100
|
-
toggleItem(index);
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
function handleTriggerKeydown(index) {
|
|
104
|
-
return (event) => {
|
|
105
|
-
const { key } = event;
|
|
106
|
-
switch (key) {
|
|
107
|
-
case "Enter":
|
|
108
|
-
case " ":
|
|
109
|
-
event.preventDefault();
|
|
110
|
-
toggleItem(index);
|
|
111
|
-
break;
|
|
112
|
-
case "ArrowDown":
|
|
113
|
-
event.preventDefault();
|
|
114
|
-
{
|
|
115
|
-
const nextIndex = (index + 1) % triggers.length;
|
|
116
|
-
triggers[nextIndex].focus();
|
|
117
|
-
}
|
|
118
|
-
break;
|
|
119
|
-
case "ArrowUp":
|
|
120
|
-
event.preventDefault();
|
|
121
|
-
{
|
|
122
|
-
const prevIndex = (index - 1 + triggers.length) % triggers.length;
|
|
123
|
-
triggers[prevIndex].focus();
|
|
124
|
-
}
|
|
125
|
-
break;
|
|
126
|
-
case "Home":
|
|
127
|
-
event.preventDefault();
|
|
128
|
-
triggers[0].focus();
|
|
129
|
-
break;
|
|
130
|
-
case "End":
|
|
131
|
-
event.preventDefault();
|
|
132
|
-
triggers[triggers.length - 1].focus();
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
function addListeners() {
|
|
138
|
-
triggers.forEach((trigger, index) => {
|
|
139
|
-
const clickHandler = handleTriggerClick(index);
|
|
140
|
-
const keydownHandler = handleTriggerKeydown(index);
|
|
141
|
-
trigger.addEventListener("click", clickHandler);
|
|
142
|
-
trigger.addEventListener("keydown", keydownHandler);
|
|
143
|
-
handlerMap.set(trigger, keydownHandler);
|
|
144
|
-
clickHandlerMap.set(trigger, clickHandler);
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
function removeListeners() {
|
|
148
|
-
triggers.forEach((trigger) => {
|
|
149
|
-
const keydownHandler = handlerMap.get(trigger);
|
|
150
|
-
const clickHandler = clickHandlerMap.get(trigger);
|
|
151
|
-
if (keydownHandler) {
|
|
152
|
-
trigger.removeEventListener("keydown", keydownHandler);
|
|
153
|
-
handlerMap.delete(trigger);
|
|
154
|
-
}
|
|
155
|
-
if (clickHandler) {
|
|
156
|
-
trigger.removeEventListener("click", clickHandler);
|
|
157
|
-
clickHandlerMap.delete(trigger);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
function cleanup() {
|
|
162
|
-
removeListeners();
|
|
163
|
-
triggers.forEach((_, index) => {
|
|
164
|
-
collapseItem(index);
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
function refresh() {
|
|
168
|
-
removeListeners();
|
|
169
|
-
const newTriggers = Array.from(accordionContainer.querySelectorAll(`.${triggersClass}`));
|
|
170
|
-
const newPanels = Array.from(accordionContainer.querySelectorAll(`.${panelsClass}`));
|
|
171
|
-
triggers.length = 0;
|
|
172
|
-
triggers.push(...newTriggers);
|
|
173
|
-
panels.length = 0;
|
|
174
|
-
panels.push(...newPanels);
|
|
175
|
-
initialize();
|
|
176
|
-
addListeners();
|
|
177
|
-
}
|
|
178
|
-
initialize();
|
|
179
|
-
addListeners();
|
|
180
|
-
return { expandItem, collapseItem, toggleItem, cleanup, refresh };
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
exports.makeAccordionAccessible = makeAccordionAccessible;
|
|
1
|
+
'use strict';function H({accordionId:c,triggersClass:l,panelsClass:i,allowMultipleOpen:h=false,callback:u}){if(c==="")return console.error("[aria-ease] 'accordionId' should not be an empty string. Provide an id to the accordion container element that exists before calling makeAccordionAccessible."),{cleanup:()=>{}};let s=document.querySelector(`#${c}`);if(!s)return console.error(`[aria-ease] Element with id="${c}" not found. Make sure the accordion container exists before calling makeAccordionAccessible.`),{cleanup:()=>{}};if(l==="")return console.error("[aria-ease] 'triggersClass' should not be an empty string. Provide a class name that exists on the accordion trigger elements before calling makeAccordionAccessible."),{cleanup:()=>{}};let r=Array.from(s.querySelectorAll(`.${l}`));if(r.length===0)return console.error(`[aria-ease] No elements with class="${l}" found. Make sure accordion triggers exist before calling makeAccordionAccessible.`),{cleanup:()=>{}};if(i==="")return console.error("[aria-ease] 'panelsClass' should not be an empty string. Provide a class name that exists on the accordion panel elements before calling makeAccordionAccessible."),{cleanup:()=>{}};let a=Array.from(s.querySelectorAll(`.${i}`));if(a.length===0)return console.error(`[aria-ease] No elements with class="${i}" found. Make sure accordion panels exist before calling makeAccordionAccessible.`),{cleanup:()=>{}};if(r.length!==a.length)return console.error(`[aria-ease] Accordion trigger/panel mismatch: found ${r.length} triggers but ${a.length} panels.`),{cleanup:()=>{}};let f=new WeakMap,m=new WeakMap;function b(){r.forEach((e,n)=>{let o=a[n];e.id||(e.id=`${c}-trigger-${n}`),o.id||(o.id=`${c}-panel-${n}`),e.setAttribute("aria-controls",o.id),e.setAttribute("aria-expanded","false"),(!h||r.length<=6)&&o.setAttribute("role","region"),o.setAttribute("aria-labelledby",e.id),o.style.display="none";});}function A(e){if(e<0||e>=r.length){console.error(`[aria-ease] Invalid accordion index: ${e}`);return}let n=r[e],o=a[e];if(n.setAttribute("aria-expanded","true"),o.style.display="block",u?.onExpand)try{u.onExpand(e);}catch(t){console.error("[aria-ease] Error in accordion onExpand callback:",t);}}function d(e){if(e<0||e>=r.length){console.error(`[aria-ease] Invalid accordion index: ${e}`);return}let n=r[e],o=a[e];if(n.setAttribute("aria-expanded","false"),o.style.display="none",u?.onCollapse)try{u.onCollapse(e);}catch(t){console.error("[aria-ease] Error in accordion onCollapse callback:",t);}}function p(e){r[e].getAttribute("aria-expanded")==="true"?d(e):(h||r.forEach((t,E)=>{E!==e&&d(E);}),A(e));}function k(e){return ()=>{p(e);}}function v(e){return n=>{let{key:o}=n;switch(o){case "Enter":case " ":n.preventDefault(),p(e);break;case "ArrowDown":n.preventDefault();{let t=(e+1)%r.length;r[t].focus();}break;case "ArrowUp":n.preventDefault();{let t=(e-1+r.length)%r.length;r[t].focus();}break;case "Home":n.preventDefault(),r[0].focus();break;case "End":n.preventDefault(),r[r.length-1].focus();break}}}function y(){r.forEach((e,n)=>{let o=k(n),t=v(n);e.addEventListener("click",o),e.addEventListener("keydown",t),f.set(e,t),m.set(e,o);});}function g(){r.forEach(e=>{let n=f.get(e),o=m.get(e);n&&(e.removeEventListener("keydown",n),f.delete(e)),o&&(e.removeEventListener("click",o),m.delete(e));});}function $(){g(),r.forEach((e,n)=>{d(n);});}function w(){g();let e=Array.from(s.querySelectorAll(`.${l}`)),n=Array.from(s.querySelectorAll(`.${i}`));r.length=0,r.push(...e),a.length=0,a.push(...n),b(),y();}return b(),y(),{expandItem:A,collapseItem:d,toggleItem:p,cleanup:$,refresh:w}}exports.makeAccordionAccessible=H;
|
|
@@ -1,181 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function makeAccordionAccessible({ accordionId, triggersClass, panelsClass, allowMultipleOpen = false, callback }) {
|
|
3
|
-
const accordionContainer = document.querySelector(`#${accordionId}`);
|
|
4
|
-
if (!accordionContainer) {
|
|
5
|
-
console.error(`[aria-ease] Element with id="${accordionId}" not found. Make sure the accordion container exists before calling makeAccordionAccessible.`);
|
|
6
|
-
return { cleanup: () => {
|
|
7
|
-
} };
|
|
8
|
-
}
|
|
9
|
-
const triggers = Array.from(accordionContainer.querySelectorAll(`.${triggersClass}`));
|
|
10
|
-
if (triggers.length === 0) {
|
|
11
|
-
console.error(`[aria-ease] No elements with class="${triggersClass}" found. Make sure accordion triggers exist before calling makeAccordionAccessible.`);
|
|
12
|
-
return { cleanup: () => {
|
|
13
|
-
} };
|
|
14
|
-
}
|
|
15
|
-
const panels = Array.from(accordionContainer.querySelectorAll(`.${panelsClass}`));
|
|
16
|
-
if (panels.length === 0) {
|
|
17
|
-
console.error(`[aria-ease] No elements with class="${panelsClass}" found. Make sure accordion panels exist before calling makeAccordionAccessible.`);
|
|
18
|
-
return { cleanup: () => {
|
|
19
|
-
} };
|
|
20
|
-
}
|
|
21
|
-
if (triggers.length !== panels.length) {
|
|
22
|
-
console.error(`[aria-ease] Accordion trigger/panel mismatch: found ${triggers.length} triggers but ${panels.length} panels.`);
|
|
23
|
-
return { cleanup: () => {
|
|
24
|
-
} };
|
|
25
|
-
}
|
|
26
|
-
const handlerMap = /* @__PURE__ */ new WeakMap();
|
|
27
|
-
const clickHandlerMap = /* @__PURE__ */ new WeakMap();
|
|
28
|
-
function initialize() {
|
|
29
|
-
triggers.forEach((trigger, index) => {
|
|
30
|
-
const panel = panels[index];
|
|
31
|
-
if (!trigger.id) {
|
|
32
|
-
trigger.id = `${accordionId}-trigger-${index}`;
|
|
33
|
-
}
|
|
34
|
-
if (!panel.id) {
|
|
35
|
-
panel.id = `${accordionId}-panel-${index}`;
|
|
36
|
-
}
|
|
37
|
-
trigger.setAttribute("aria-controls", panel.id);
|
|
38
|
-
trigger.setAttribute("aria-expanded", "false");
|
|
39
|
-
if (!allowMultipleOpen || triggers.length <= 6) {
|
|
40
|
-
panel.setAttribute("role", "region");
|
|
41
|
-
}
|
|
42
|
-
panel.setAttribute("aria-labelledby", trigger.id);
|
|
43
|
-
panel.style.display = "none";
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
function expandItem(index) {
|
|
47
|
-
if (index < 0 || index >= triggers.length) {
|
|
48
|
-
console.error(`[aria-ease] Invalid accordion index: ${index}`);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const trigger = triggers[index];
|
|
52
|
-
const panel = panels[index];
|
|
53
|
-
trigger.setAttribute("aria-expanded", "true");
|
|
54
|
-
panel.style.display = "block";
|
|
55
|
-
if (callback?.onExpand) {
|
|
56
|
-
try {
|
|
57
|
-
callback.onExpand(index);
|
|
58
|
-
} catch (error) {
|
|
59
|
-
console.error("[aria-ease] Error in accordion onExpand callback:", error);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function collapseItem(index) {
|
|
64
|
-
if (index < 0 || index >= triggers.length) {
|
|
65
|
-
console.error(`[aria-ease] Invalid accordion index: ${index}`);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const trigger = triggers[index];
|
|
69
|
-
const panel = panels[index];
|
|
70
|
-
trigger.setAttribute("aria-expanded", "false");
|
|
71
|
-
panel.style.display = "none";
|
|
72
|
-
if (callback?.onCollapse) {
|
|
73
|
-
try {
|
|
74
|
-
callback.onCollapse(index);
|
|
75
|
-
} catch (error) {
|
|
76
|
-
console.error("[aria-ease] Error in accordion onCollapse callback:", error);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
function toggleItem(index) {
|
|
81
|
-
const trigger = triggers[index];
|
|
82
|
-
const isExpanded = trigger.getAttribute("aria-expanded") === "true";
|
|
83
|
-
if (isExpanded) {
|
|
84
|
-
collapseItem(index);
|
|
85
|
-
} else {
|
|
86
|
-
if (!allowMultipleOpen) {
|
|
87
|
-
triggers.forEach((_, i) => {
|
|
88
|
-
if (i !== index) {
|
|
89
|
-
collapseItem(i);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
expandItem(index);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
function handleTriggerClick(index) {
|
|
97
|
-
return () => {
|
|
98
|
-
toggleItem(index);
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
function handleTriggerKeydown(index) {
|
|
102
|
-
return (event) => {
|
|
103
|
-
const { key } = event;
|
|
104
|
-
switch (key) {
|
|
105
|
-
case "Enter":
|
|
106
|
-
case " ":
|
|
107
|
-
event.preventDefault();
|
|
108
|
-
toggleItem(index);
|
|
109
|
-
break;
|
|
110
|
-
case "ArrowDown":
|
|
111
|
-
event.preventDefault();
|
|
112
|
-
{
|
|
113
|
-
const nextIndex = (index + 1) % triggers.length;
|
|
114
|
-
triggers[nextIndex].focus();
|
|
115
|
-
}
|
|
116
|
-
break;
|
|
117
|
-
case "ArrowUp":
|
|
118
|
-
event.preventDefault();
|
|
119
|
-
{
|
|
120
|
-
const prevIndex = (index - 1 + triggers.length) % triggers.length;
|
|
121
|
-
triggers[prevIndex].focus();
|
|
122
|
-
}
|
|
123
|
-
break;
|
|
124
|
-
case "Home":
|
|
125
|
-
event.preventDefault();
|
|
126
|
-
triggers[0].focus();
|
|
127
|
-
break;
|
|
128
|
-
case "End":
|
|
129
|
-
event.preventDefault();
|
|
130
|
-
triggers[triggers.length - 1].focus();
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
function addListeners() {
|
|
136
|
-
triggers.forEach((trigger, index) => {
|
|
137
|
-
const clickHandler = handleTriggerClick(index);
|
|
138
|
-
const keydownHandler = handleTriggerKeydown(index);
|
|
139
|
-
trigger.addEventListener("click", clickHandler);
|
|
140
|
-
trigger.addEventListener("keydown", keydownHandler);
|
|
141
|
-
handlerMap.set(trigger, keydownHandler);
|
|
142
|
-
clickHandlerMap.set(trigger, clickHandler);
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
function removeListeners() {
|
|
146
|
-
triggers.forEach((trigger) => {
|
|
147
|
-
const keydownHandler = handlerMap.get(trigger);
|
|
148
|
-
const clickHandler = clickHandlerMap.get(trigger);
|
|
149
|
-
if (keydownHandler) {
|
|
150
|
-
trigger.removeEventListener("keydown", keydownHandler);
|
|
151
|
-
handlerMap.delete(trigger);
|
|
152
|
-
}
|
|
153
|
-
if (clickHandler) {
|
|
154
|
-
trigger.removeEventListener("click", clickHandler);
|
|
155
|
-
clickHandlerMap.delete(trigger);
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
function cleanup() {
|
|
160
|
-
removeListeners();
|
|
161
|
-
triggers.forEach((_, index) => {
|
|
162
|
-
collapseItem(index);
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
function refresh() {
|
|
166
|
-
removeListeners();
|
|
167
|
-
const newTriggers = Array.from(accordionContainer.querySelectorAll(`.${triggersClass}`));
|
|
168
|
-
const newPanels = Array.from(accordionContainer.querySelectorAll(`.${panelsClass}`));
|
|
169
|
-
triggers.length = 0;
|
|
170
|
-
triggers.push(...newTriggers);
|
|
171
|
-
panels.length = 0;
|
|
172
|
-
panels.push(...newPanels);
|
|
173
|
-
initialize();
|
|
174
|
-
addListeners();
|
|
175
|
-
}
|
|
176
|
-
initialize();
|
|
177
|
-
addListeners();
|
|
178
|
-
return { expandItem, collapseItem, toggleItem, cleanup, refresh };
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export { makeAccordionAccessible };
|
|
1
|
+
function H({accordionId:c,triggersClass:l,panelsClass:i,allowMultipleOpen:h=false,callback:u}){if(c==="")return console.error("[aria-ease] 'accordionId' should not be an empty string. Provide an id to the accordion container element that exists before calling makeAccordionAccessible."),{cleanup:()=>{}};let s=document.querySelector(`#${c}`);if(!s)return console.error(`[aria-ease] Element with id="${c}" not found. Make sure the accordion container exists before calling makeAccordionAccessible.`),{cleanup:()=>{}};if(l==="")return console.error("[aria-ease] 'triggersClass' should not be an empty string. Provide a class name that exists on the accordion trigger elements before calling makeAccordionAccessible."),{cleanup:()=>{}};let r=Array.from(s.querySelectorAll(`.${l}`));if(r.length===0)return console.error(`[aria-ease] No elements with class="${l}" found. Make sure accordion triggers exist before calling makeAccordionAccessible.`),{cleanup:()=>{}};if(i==="")return console.error("[aria-ease] 'panelsClass' should not be an empty string. Provide a class name that exists on the accordion panel elements before calling makeAccordionAccessible."),{cleanup:()=>{}};let a=Array.from(s.querySelectorAll(`.${i}`));if(a.length===0)return console.error(`[aria-ease] No elements with class="${i}" found. Make sure accordion panels exist before calling makeAccordionAccessible.`),{cleanup:()=>{}};if(r.length!==a.length)return console.error(`[aria-ease] Accordion trigger/panel mismatch: found ${r.length} triggers but ${a.length} panels.`),{cleanup:()=>{}};let f=new WeakMap,m=new WeakMap;function b(){r.forEach((e,n)=>{let o=a[n];e.id||(e.id=`${c}-trigger-${n}`),o.id||(o.id=`${c}-panel-${n}`),e.setAttribute("aria-controls",o.id),e.setAttribute("aria-expanded","false"),(!h||r.length<=6)&&o.setAttribute("role","region"),o.setAttribute("aria-labelledby",e.id),o.style.display="none";});}function A(e){if(e<0||e>=r.length){console.error(`[aria-ease] Invalid accordion index: ${e}`);return}let n=r[e],o=a[e];if(n.setAttribute("aria-expanded","true"),o.style.display="block",u?.onExpand)try{u.onExpand(e);}catch(t){console.error("[aria-ease] Error in accordion onExpand callback:",t);}}function d(e){if(e<0||e>=r.length){console.error(`[aria-ease] Invalid accordion index: ${e}`);return}let n=r[e],o=a[e];if(n.setAttribute("aria-expanded","false"),o.style.display="none",u?.onCollapse)try{u.onCollapse(e);}catch(t){console.error("[aria-ease] Error in accordion onCollapse callback:",t);}}function p(e){r[e].getAttribute("aria-expanded")==="true"?d(e):(h||r.forEach((t,E)=>{E!==e&&d(E);}),A(e));}function k(e){return ()=>{p(e);}}function v(e){return n=>{let{key:o}=n;switch(o){case "Enter":case " ":n.preventDefault(),p(e);break;case "ArrowDown":n.preventDefault();{let t=(e+1)%r.length;r[t].focus();}break;case "ArrowUp":n.preventDefault();{let t=(e-1+r.length)%r.length;r[t].focus();}break;case "Home":n.preventDefault(),r[0].focus();break;case "End":n.preventDefault(),r[r.length-1].focus();break}}}function y(){r.forEach((e,n)=>{let o=k(n),t=v(n);e.addEventListener("click",o),e.addEventListener("keydown",t),f.set(e,t),m.set(e,o);});}function g(){r.forEach(e=>{let n=f.get(e),o=m.get(e);n&&(e.removeEventListener("keydown",n),f.delete(e)),o&&(e.removeEventListener("click",o),m.delete(e));});}function $(){g(),r.forEach((e,n)=>{d(n);});}function w(){g();let e=Array.from(s.querySelectorAll(`.${l}`)),n=Array.from(s.querySelectorAll(`.${i}`));r.length=0,r.push(...e),a.length=0,a.push(...n),b(),y();}return b(),y(),{expandItem:A,collapseItem:d,toggleItem:p,cleanup:$,refresh:w}}export{H as makeAccordionAccessible};
|
package/dist/src/block/index.cjs
CHANGED
|
@@ -1,124 +1 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/utils/handleKeyPress/handleKeyPress.ts
|
|
4
|
-
function isTextInput(el) {
|
|
5
|
-
if (el.tagName !== "INPUT") return false;
|
|
6
|
-
const type = el.type;
|
|
7
|
-
return ["text", "email", "password", "tel", "number"].includes(type);
|
|
8
|
-
}
|
|
9
|
-
function isTextArea(el) {
|
|
10
|
-
return el.tagName === "TEXTAREA";
|
|
11
|
-
}
|
|
12
|
-
function isNativeButton(el) {
|
|
13
|
-
return el.tagName === "BUTTON" || el.tagName === "INPUT" && ["button", "submit", "reset"].includes(el.type);
|
|
14
|
-
}
|
|
15
|
-
function isLink(el) {
|
|
16
|
-
return el.tagName === "A";
|
|
17
|
-
}
|
|
18
|
-
function moveFocus(elementItems, currentIndex, direction) {
|
|
19
|
-
const len = elementItems.length;
|
|
20
|
-
const nextIndex = (currentIndex + direction + len) % len;
|
|
21
|
-
elementItems.item(nextIndex).focus();
|
|
22
|
-
}
|
|
23
|
-
function isClickableButNotSemantic(el) {
|
|
24
|
-
return el.getAttribute("data-custom-click") !== null && el.getAttribute("data-custom-click") !== void 0;
|
|
25
|
-
}
|
|
26
|
-
function handleKeyPress(event, elementItems, elementItemIndex) {
|
|
27
|
-
const currentEl = elementItems.item(elementItemIndex);
|
|
28
|
-
switch (event.key) {
|
|
29
|
-
case "ArrowUp":
|
|
30
|
-
case "ArrowLeft": {
|
|
31
|
-
if (!isTextInput(currentEl) && !isTextArea(currentEl)) {
|
|
32
|
-
event.preventDefault();
|
|
33
|
-
moveFocus(elementItems, elementItemIndex, -1);
|
|
34
|
-
} else if (isTextInput(currentEl) || isTextArea(currentEl)) {
|
|
35
|
-
const cursorStart = currentEl.selectionStart;
|
|
36
|
-
if (cursorStart === 0) {
|
|
37
|
-
event.preventDefault();
|
|
38
|
-
moveFocus(elementItems, elementItemIndex, -1);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
case "ArrowDown":
|
|
44
|
-
case "ArrowRight": {
|
|
45
|
-
if (!isTextInput(currentEl) && !isTextArea(currentEl)) {
|
|
46
|
-
event.preventDefault();
|
|
47
|
-
moveFocus(elementItems, elementItemIndex, 1);
|
|
48
|
-
} else if (isTextInput(currentEl) || isTextArea(currentEl)) {
|
|
49
|
-
const value = currentEl.value;
|
|
50
|
-
const cursorEnd = currentEl.selectionStart;
|
|
51
|
-
if (cursorEnd === value.length) {
|
|
52
|
-
event.preventDefault();
|
|
53
|
-
moveFocus(elementItems, elementItemIndex, 1);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
case "Escape": {
|
|
59
|
-
event.preventDefault();
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case "Enter":
|
|
63
|
-
case " ": {
|
|
64
|
-
if (!isNativeButton(currentEl) && !isLink(currentEl) && isClickableButNotSemantic(currentEl)) {
|
|
65
|
-
event.preventDefault();
|
|
66
|
-
currentEl.click();
|
|
67
|
-
} else if (isNativeButton(currentEl)) {
|
|
68
|
-
event.preventDefault();
|
|
69
|
-
currentEl.click();
|
|
70
|
-
}
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// src/block/src/makeBlockAccessible/makeBlockAccessible.ts
|
|
77
|
-
function makeBlockAccessible({ blockId, blockItemsClass }) {
|
|
78
|
-
const blockDiv = document.querySelector(`#${blockId}`);
|
|
79
|
-
if (!blockDiv) {
|
|
80
|
-
console.error(`[aria-ease] Element with id="${blockId}" not found. Make sure the block element exists before calling makeBlockAccessible.`);
|
|
81
|
-
return { cleanup: () => {
|
|
82
|
-
} };
|
|
83
|
-
}
|
|
84
|
-
let cachedItems = null;
|
|
85
|
-
function getItems() {
|
|
86
|
-
if (!cachedItems) {
|
|
87
|
-
cachedItems = blockDiv.querySelectorAll(`.${blockItemsClass}`);
|
|
88
|
-
}
|
|
89
|
-
return cachedItems;
|
|
90
|
-
}
|
|
91
|
-
const blockItems = getItems();
|
|
92
|
-
if (!blockItems || blockItems.length === 0) {
|
|
93
|
-
console.error(`[aria-ease] Element with class="${blockItemsClass}" not found. Make sure the block items exist before calling makeBlockAccessible.`);
|
|
94
|
-
return { cleanup: () => {
|
|
95
|
-
} };
|
|
96
|
-
}
|
|
97
|
-
const eventListenersMap = /* @__PURE__ */ new Map();
|
|
98
|
-
blockItems.forEach((blockItem) => {
|
|
99
|
-
if (!eventListenersMap.has(blockItem)) {
|
|
100
|
-
const handler = (event) => {
|
|
101
|
-
const items = blockDiv.querySelectorAll(`.${blockItemsClass}`);
|
|
102
|
-
const index = Array.prototype.indexOf.call(items, blockItem);
|
|
103
|
-
handleKeyPress(event, items, index);
|
|
104
|
-
};
|
|
105
|
-
blockItem.addEventListener("keydown", handler);
|
|
106
|
-
eventListenersMap.set(blockItem, handler);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
function cleanup() {
|
|
110
|
-
blockItems.forEach((blockItem) => {
|
|
111
|
-
const handler = eventListenersMap.get(blockItem);
|
|
112
|
-
if (handler) {
|
|
113
|
-
blockItem.removeEventListener("keydown", handler);
|
|
114
|
-
eventListenersMap.delete(blockItem);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
function refresh() {
|
|
119
|
-
cachedItems = null;
|
|
120
|
-
}
|
|
121
|
-
return { cleanup, refresh };
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
exports.makeBlockAccessible = makeBlockAccessible;
|
|
1
|
+
'use strict';function c(e){if(e.tagName!=="INPUT")return false;let n=e.type;return ["text","email","password","tel","number"].includes(n)}function u(e){return e.tagName==="TEXTAREA"}function d(e){return e.tagName==="BUTTON"||e.tagName==="INPUT"&&["button","submit","reset"].includes(e.type)}function k(e){return e.tagName==="A"}function f(e,n,r){let t=e.length,a=(n+r+t)%t;e.item(a).focus();}function M(e){return e.getAttribute("data-custom-click")!==null&&e.getAttribute("data-custom-click")!==void 0}function E(e,n,r){let t=n.item(r);switch(e.key){case "ArrowUp":case "ArrowLeft":{(!c(t)&&!u(t)||(c(t)||u(t))&&t.selectionStart===0)&&(e.preventDefault(),f(n,r,-1));break}case "ArrowDown":case "ArrowRight":{if(!c(t)&&!u(t))e.preventDefault(),f(n,r,1);else if(c(t)||u(t)){let a=t.value;t.selectionStart===a.length&&(e.preventDefault(),f(n,r,1));}break}case "Escape":{e.preventDefault();break}case "Enter":case " ":{(!d(t)&&!k(t)&&M(t)||d(t))&&(e.preventDefault(),t.click());break}}}function g({blockId:e,blockItemsClass:n}){if(e==="")return console.error("[aria-ease] 'blockId' should not be an empty string. Provide an id to the block container element that exists before calling makeBlockAccessible."),{cleanup:()=>{}};let r=document.querySelector(`#${e}`);if(!r)return console.error(`[aria-ease] Element with id="${e}" not found. Make sure the block element exists before calling makeBlockAccessible.`),{cleanup:()=>{}};if(n==="")return console.error("[aria-ease] 'blockItemsClass' should not be an empty string. Provide a class name that exists on the block item elements before calling makeBlockAccessible."),{cleanup:()=>{}};let t=null;function a(){return t||(t=r.querySelectorAll(`.${n}`)),t}let s=a();if(!s||s.length===0)return console.error(`[aria-ease] Element with class="${n}" not found. Make sure the block items exist before calling makeBlockAccessible.`),{cleanup:()=>{}};let l=new Map;s.forEach(o=>{if(!l.has(o)){let i=T=>{let m=r.querySelectorAll(`.${n}`),b=Array.prototype.indexOf.call(m,o);E(T,m,b);};o.addEventListener("keydown",i),l.set(o,i);}});function p(){s.forEach(o=>{let i=l.get(o);i&&(o.removeEventListener("keydown",i),l.delete(o));});}function L(){t=null;}return {cleanup:p,refresh:L}}exports.makeBlockAccessible=g;
|
package/dist/src/block/index.js
CHANGED
|
@@ -1,122 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function isTextInput(el) {
|
|
3
|
-
if (el.tagName !== "INPUT") return false;
|
|
4
|
-
const type = el.type;
|
|
5
|
-
return ["text", "email", "password", "tel", "number"].includes(type);
|
|
6
|
-
}
|
|
7
|
-
function isTextArea(el) {
|
|
8
|
-
return el.tagName === "TEXTAREA";
|
|
9
|
-
}
|
|
10
|
-
function isNativeButton(el) {
|
|
11
|
-
return el.tagName === "BUTTON" || el.tagName === "INPUT" && ["button", "submit", "reset"].includes(el.type);
|
|
12
|
-
}
|
|
13
|
-
function isLink(el) {
|
|
14
|
-
return el.tagName === "A";
|
|
15
|
-
}
|
|
16
|
-
function moveFocus(elementItems, currentIndex, direction) {
|
|
17
|
-
const len = elementItems.length;
|
|
18
|
-
const nextIndex = (currentIndex + direction + len) % len;
|
|
19
|
-
elementItems.item(nextIndex).focus();
|
|
20
|
-
}
|
|
21
|
-
function isClickableButNotSemantic(el) {
|
|
22
|
-
return el.getAttribute("data-custom-click") !== null && el.getAttribute("data-custom-click") !== void 0;
|
|
23
|
-
}
|
|
24
|
-
function handleKeyPress(event, elementItems, elementItemIndex) {
|
|
25
|
-
const currentEl = elementItems.item(elementItemIndex);
|
|
26
|
-
switch (event.key) {
|
|
27
|
-
case "ArrowUp":
|
|
28
|
-
case "ArrowLeft": {
|
|
29
|
-
if (!isTextInput(currentEl) && !isTextArea(currentEl)) {
|
|
30
|
-
event.preventDefault();
|
|
31
|
-
moveFocus(elementItems, elementItemIndex, -1);
|
|
32
|
-
} else if (isTextInput(currentEl) || isTextArea(currentEl)) {
|
|
33
|
-
const cursorStart = currentEl.selectionStart;
|
|
34
|
-
if (cursorStart === 0) {
|
|
35
|
-
event.preventDefault();
|
|
36
|
-
moveFocus(elementItems, elementItemIndex, -1);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
case "ArrowDown":
|
|
42
|
-
case "ArrowRight": {
|
|
43
|
-
if (!isTextInput(currentEl) && !isTextArea(currentEl)) {
|
|
44
|
-
event.preventDefault();
|
|
45
|
-
moveFocus(elementItems, elementItemIndex, 1);
|
|
46
|
-
} else if (isTextInput(currentEl) || isTextArea(currentEl)) {
|
|
47
|
-
const value = currentEl.value;
|
|
48
|
-
const cursorEnd = currentEl.selectionStart;
|
|
49
|
-
if (cursorEnd === value.length) {
|
|
50
|
-
event.preventDefault();
|
|
51
|
-
moveFocus(elementItems, elementItemIndex, 1);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
case "Escape": {
|
|
57
|
-
event.preventDefault();
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
case "Enter":
|
|
61
|
-
case " ": {
|
|
62
|
-
if (!isNativeButton(currentEl) && !isLink(currentEl) && isClickableButNotSemantic(currentEl)) {
|
|
63
|
-
event.preventDefault();
|
|
64
|
-
currentEl.click();
|
|
65
|
-
} else if (isNativeButton(currentEl)) {
|
|
66
|
-
event.preventDefault();
|
|
67
|
-
currentEl.click();
|
|
68
|
-
}
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// src/block/src/makeBlockAccessible/makeBlockAccessible.ts
|
|
75
|
-
function makeBlockAccessible({ blockId, blockItemsClass }) {
|
|
76
|
-
const blockDiv = document.querySelector(`#${blockId}`);
|
|
77
|
-
if (!blockDiv) {
|
|
78
|
-
console.error(`[aria-ease] Element with id="${blockId}" not found. Make sure the block element exists before calling makeBlockAccessible.`);
|
|
79
|
-
return { cleanup: () => {
|
|
80
|
-
} };
|
|
81
|
-
}
|
|
82
|
-
let cachedItems = null;
|
|
83
|
-
function getItems() {
|
|
84
|
-
if (!cachedItems) {
|
|
85
|
-
cachedItems = blockDiv.querySelectorAll(`.${blockItemsClass}`);
|
|
86
|
-
}
|
|
87
|
-
return cachedItems;
|
|
88
|
-
}
|
|
89
|
-
const blockItems = getItems();
|
|
90
|
-
if (!blockItems || blockItems.length === 0) {
|
|
91
|
-
console.error(`[aria-ease] Element with class="${blockItemsClass}" not found. Make sure the block items exist before calling makeBlockAccessible.`);
|
|
92
|
-
return { cleanup: () => {
|
|
93
|
-
} };
|
|
94
|
-
}
|
|
95
|
-
const eventListenersMap = /* @__PURE__ */ new Map();
|
|
96
|
-
blockItems.forEach((blockItem) => {
|
|
97
|
-
if (!eventListenersMap.has(blockItem)) {
|
|
98
|
-
const handler = (event) => {
|
|
99
|
-
const items = blockDiv.querySelectorAll(`.${blockItemsClass}`);
|
|
100
|
-
const index = Array.prototype.indexOf.call(items, blockItem);
|
|
101
|
-
handleKeyPress(event, items, index);
|
|
102
|
-
};
|
|
103
|
-
blockItem.addEventListener("keydown", handler);
|
|
104
|
-
eventListenersMap.set(blockItem, handler);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
function cleanup() {
|
|
108
|
-
blockItems.forEach((blockItem) => {
|
|
109
|
-
const handler = eventListenersMap.get(blockItem);
|
|
110
|
-
if (handler) {
|
|
111
|
-
blockItem.removeEventListener("keydown", handler);
|
|
112
|
-
eventListenersMap.delete(blockItem);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
function refresh() {
|
|
117
|
-
cachedItems = null;
|
|
118
|
-
}
|
|
119
|
-
return { cleanup, refresh };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export { makeBlockAccessible };
|
|
1
|
+
function c(e){if(e.tagName!=="INPUT")return false;let n=e.type;return ["text","email","password","tel","number"].includes(n)}function u(e){return e.tagName==="TEXTAREA"}function d(e){return e.tagName==="BUTTON"||e.tagName==="INPUT"&&["button","submit","reset"].includes(e.type)}function k(e){return e.tagName==="A"}function f(e,n,r){let t=e.length,a=(n+r+t)%t;e.item(a).focus();}function M(e){return e.getAttribute("data-custom-click")!==null&&e.getAttribute("data-custom-click")!==void 0}function E(e,n,r){let t=n.item(r);switch(e.key){case "ArrowUp":case "ArrowLeft":{(!c(t)&&!u(t)||(c(t)||u(t))&&t.selectionStart===0)&&(e.preventDefault(),f(n,r,-1));break}case "ArrowDown":case "ArrowRight":{if(!c(t)&&!u(t))e.preventDefault(),f(n,r,1);else if(c(t)||u(t)){let a=t.value;t.selectionStart===a.length&&(e.preventDefault(),f(n,r,1));}break}case "Escape":{e.preventDefault();break}case "Enter":case " ":{(!d(t)&&!k(t)&&M(t)||d(t))&&(e.preventDefault(),t.click());break}}}function g({blockId:e,blockItemsClass:n}){if(e==="")return console.error("[aria-ease] 'blockId' should not be an empty string. Provide an id to the block container element that exists before calling makeBlockAccessible."),{cleanup:()=>{}};let r=document.querySelector(`#${e}`);if(!r)return console.error(`[aria-ease] Element with id="${e}" not found. Make sure the block element exists before calling makeBlockAccessible.`),{cleanup:()=>{}};if(n==="")return console.error("[aria-ease] 'blockItemsClass' should not be an empty string. Provide a class name that exists on the block item elements before calling makeBlockAccessible."),{cleanup:()=>{}};let t=null;function a(){return t||(t=r.querySelectorAll(`.${n}`)),t}let s=a();if(!s||s.length===0)return console.error(`[aria-ease] Element with class="${n}" not found. Make sure the block items exist before calling makeBlockAccessible.`),{cleanup:()=>{}};let l=new Map;s.forEach(o=>{if(!l.has(o)){let i=T=>{let m=r.querySelectorAll(`.${n}`),b=Array.prototype.indexOf.call(m,o);E(T,m,b);};o.addEventListener("keydown",i),l.set(o,i);}});function p(){s.forEach(o=>{let i=l.get(o);i&&(o.removeEventListener("keydown",i),l.delete(o));});}function L(){t=null;}return {cleanup:p,refresh:L}}export{g as makeBlockAccessible};
|