ally-widget 1.0.0 → 1.0.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.
- package/README.md +397 -37
- package/dist/ally-widget.cjs.js +3 -30
- package/dist/ally-widget.esm.js +3 -30
- package/dist/ally-widget.js +6 -12
- package/dist/ally-widget.min.js +3 -8
- package/dist/ally-widget.min.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ally-widget.min.js","sources":["../src/constants/theme.js","../src/constants/icons.js","../src/constants/selectors.js","../src/constants/translations.js","../src/state.js","../src/styles.js","../src/features.js","../src/ui.js","../src/index.js"],"sourcesContent":["export const WIDGET_THEME = {\n primaryColor: '#1976d2',\n primaryColorLight: '#42a5f5',\n primaryColorDark: '#0d47a1',\n backgroundColor: '#f5f7fa',\n textColor: '#222222',\n textColorInverted: '#ffffff',\n buttonSize: '52px',\n cardBackground: '#ffffff',\n borderColor: '#d1d5db',\n focusRingColor: '#1976d2',\n hoverColor: '#42a5f5',\n activeColor: '#0d47a1',\n successColor: '#2e7d32',\n errorColor: '#c62828',\n warningColor: '#f57c00',\n headerHeight: '54px',\n borderRadius: '8px',\n buttonBorderRadius: '0.4rem',\n menuPosition: 'right',\n zIndex: 100000,\n focusBorderWidth: '3px',\n focusOutlineOffset: '2px'\n};\n","export const WIDGET_ICONS = {\n accessibility: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM360-80v-520q-60-5-122-15t-118-25l20-80q78 21 166 30.5t174 9.5q86 0 174-9.5T820-720l20 80q-56 15-118 25t-122 15v520h-80v-240h-80v240h-80Z\"/></svg>',\n accessibilityVariants: {\n default: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM360-80v-520q-60-5-122-15t-118-25l20-80q78 21 166 30.5t174 9.5q86 0 174-9.5T820-720l20 80q-56 15-118 25t-122 15v520h-80v-240h-80v240h-80Z\"/></svg>',\n 'icon-2': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM360-80v-520H120v-80h720v80H600v520h-80v-240h-80v240h-80Z\"/></svg>',\n 'icon-3': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM680-80v-200H480q-33 0-56.5-23.5T400-360v-240q0-33 23.5-56.5T480-680q24 0 41.5 10.5T559-636q55 66 99.5 90.5T760-520v80q-53 0-107-23t-93-55v138h120q33 0 56.5 23.5T760-300v220h-80Zm-280 0q-83 0-141.5-58.5T200-280q0-72 45.5-127T360-476v82q-35 14-57.5 44.5T280-280q0 50 35 85t85 35q39 0 69.5-22.5T514-240h82q-14 69-69 114.5T400-80Z\"/></svg>',\n 'icon-4': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M320-80q-83 0-141.5-58.5T120-280q0-83 58.5-141.5T320-480v80q-50 0-85 35t-35 85q0 50 35 85t85 35q50 0 85-35t35-85h80q0 83-58.5 141.5T320-80Zm360-40v-200H440q-44 0-68-37.5t-6-78.5l74-164h-91l-24 62-77-22 28-72q9-23 29.5-35.5T350-680h208q45 0 68.5 36.5T632-566l-66 146h114q33 0 56.5 23.5T760-340v220h-80Zm-96.5-603.5Q560-747 560-780t23.5-56.5Q607-860 640-860t56.5 23.5Q720-813 720-780t-23.5 56.5Q673-700 640-700t-56.5-23.5Z\"/></svg>'\n },\n largePointer: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"><path d=\"m320-410 79-110h170L320-716v306ZM551-80 406-392 240-160v-720l560 440H516l144 309-109 51ZM399-520Z\"/></svg>',\n pauseMotion: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m791-55-91-91q-49 32-104.5 49T480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 17-115.5T146-700l-91-91 57-57 736 736-57 57ZM480-160q43 0 83.5-11t78.5-33L204-642q-22 38-33 78.5T160-480q0 133 93.5 226.5T480-160Zm334-100-58-58q22-38 33-78.5t11-83.5q0-133-93.5-226.5T480-800q-43 0-83.5 11T318-756l-58-58q49-32 104.5-49T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 60-17 115.5T814-260ZM537-537ZM423-423Z\"/></svg>',\n readingAid: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M320-80v-440l-80-120v-240h480v240l-80 120v440H320Zm160-260q-25 0-42.5-17.5T420-400q0-25 17.5-42.5T480-460q25 0 42.5 17.5T540-400q0 25-17.5 42.5T480-340ZM320-760h320v-40H320v40Zm320 80H320v16l80 120v384h160v-384l80-120v-16ZM480-480Z\"/></svg>',\n boldText: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\"/></svg>',\n lineSpacing: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M240-160 80-320l56-56 64 62v-332l-64 62-56-56 160-160 160 160-56 56-64-62v332l64-62 56 56-160 160Zm240-40v-80h400v80H480Zm0-240v-80h400v80H480Zm0-240v-80h400v80H480Z\"/></svg>',\n letterSpacing: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M320-80 160-240l160-160 57 56-64 64h334l-63-64 56-56 160 160L640-80l-57-56 64-64H313l63 64-56 56ZM200-480v-400h80v400h-80Zm240 0v-400h80v400h-80Zm240 0v-400h80v400h-80Z\"/></svg>',\n dyslexiaFont: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m131-252 165-440h79l165 440h-76l-39-112H247l-40 112h-76Zm139-176h131l-64-182h-4l-63 182Zm395 186q-51 0-81-27.5T554-342q0-44 34.5-72.5T677-443q23 0 45 4t38 11v-12q0-29-20.5-47T685-505q-23 0-42 9.5T610-468l-47-35q24-29 54.5-43t68.5-14q69 0 103 32.5t34 97.5v178h-63v-37h-4q-14 23-38 35t-53 12Zm12-54q35 0 59.5-24t24.5-56q-14-8-33.5-12.5T689-393q-32 0-50 14t-18 37q0 20 16 33t40 13Z\"/></svg>',\n highlightLinks: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\"/></svg>',\n highlightTitle: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M320-280q17 0 28.5-11.5T360-320q0-17-11.5-28.5T320-360q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280Zm0-160q17 0 28.5-11.5T360-480q0-17-11.5-28.5T320-520q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440Zm0-160q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm120 320h240v-80H440v80Zm0-160h240v-80H440v80Zm0-160h240v-80H440v80ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\"/></svg>',\n contrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m480-260 60-60h100v-100l60-60-60-60v-100H540l-60-60-60 60H320v100l-60 60 60 60v100h100l60 60Zm0-100v-240q50 0 85 35t35 85q0 50-35 85t-85 35ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-480H160v480Zm0 0v-480 480Z\"/></svg>',\n darkContrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M484-80q-84 0-157.5-32t-128-86.5Q144-253 112-326.5T80-484q0-146 93-257.5T410-880q-18 99 11 193.5T521-521q71 71 165.5 100T880-410q-26 144-138 237T484-80Zm0-80q88 0 163-44t118-121q-86-8-163-43.5T464-465q-61-61-97-138t-43-163q-77 43-120.5 118.5T160-484q0 135 94.5 229.5T484-160Zm-20-305Z\"/></svg>',\n lightContrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M440-800v-120h80v120h-80Zm0 760v-120h80v120h-80Zm360-400v-80h120v80H800Zm-760 0v-80h120v80H40Zm708-252-56-56 70-72 58 58-72 70ZM198-140l-58-58 72-70 56 56-70 72Zm564 0-70-72 56-56 72 70-58 58ZM212-692l-72-70 58-58 70 72-56 56Zm268 452q-100 0-170-70t-70-170q0-100 70-170t170-70q100 0 170 70t70 170q0 100-70 170t-170 70Zm0-80q67 0 113.5-46.5T640-480q0-67-46.5-113.5T480-640q-67 0-113.5 46.5T320-480q0 67 46.5 113.5T480-320Zm0-160Z\"/></svg>',\n invertColors: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-64-24.5-122.5T706-706L254-254q45 45 103.5 69.5T480-160Zm0-160v-60h200v60H480ZM320-500h60v-80h80v-60h-80v-80h-60v80h-80v60h80v80Z\"/></svg>',\n saturation: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-120q-133 0-226.5-92.5T160-436q0-66 25-122t69-100l226-222 226 222q44 44 69 100t25 122q0 131-93.5 223.5T480-120Zm0-80v-568L310-600q-35 33-52.5 74.5T240-436q0 97 70 166.5T480-200Z\"/></svg>',\n lowSaturation: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-120q-133 0-226.5-92T160-436q0-65 25-121.5T254-658l226-222 226 222q44 44 69 100.5T800-436q0 132-93.5 224T480-120ZM242-400h474q12-72-13.5-123T650-600L480-768 310-600q-27 26-53 77t-15 123Z\"/></svg>',\n highSaturation: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 32.5-156t88-127Q256-817 330-848.5T488-880q80 0 151 27.5t124.5 76q53.5 48.5 85 115T880-518q0 115-70 176.5T640-280h-74q-9 0-12.5 5t-3.5 11q0 12 15 34.5t15 51.5q0 50-27.5 74T480-80Zm0-400Zm-220 40q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm120-160q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm200 0q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm120 160q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17ZM480-160q9 0 14.5-5t5.5-13q0-14-15-33t-15-57q0-42 29-67t71-25h70q66 0 113-38.5T800-518q0-121-92.5-201.5T488-800q-136 0-232 93t-96 227q0 133 93.5 226.5T480-160Z\"/></svg>',\n reset: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M440-122q-121-15-200.5-105.5T160-440q0-66 26-126.5T260-672l57 57q-38 34-57.5 79T240-440q0 88 56 155.5T440-202v80Zm80 0v-80q87-16 143.5-83T720-440q0-100-70-170t-170-70h-3l44 44-56 56-140-140 140-140 56 56-44 44h3q134 0 227 93t93 227q0 121-79.5 211.5T520-122Z\"/></svg>',\n close: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>',\n increase: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2Z\"/></svg>',\n decrease: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2Z\"/></svg>',\n arrowBack: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M400-80 0-480l400-400 71 71-329 329 329 329-71 71Z\"/></svg>',\n adjustFontSize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M2 4v3h5v12h3V7h5V4H2m19 5h-9v3h3v7h3v-7h3V9Z\"/></svg>',\n language: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-155.5t86-127Q252-817 325-848.5T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 82-31.5 155t-86 127.5q-54.5 54.5-127 86T480-80Zm0-82q26-36 45-75t31-83H404q12 44 31 83t45 75Zm-104-16q-18-33-31.5-68.5T322-320H204q29 50 72.5 87t99.5 55Zm208 0q56-18 99.5-55t72.5-87H638q-9 38-22.5 73.5T584-178ZM170-400h136q-3-20-4.5-39.5T300-480q0-21 1.5-40.5T306-560H170q-5 20-7.5 39.5T160-480q0 21 2.5 40.5T170-400Zm216 0h188q3-20 4.5-39.5T580-480q0-21-1.5-40.5T574-560H386q-3 20-4.5 39.5T380-480q0 21 1.5 40.5T386-400Zm268 0h136q5-20 7.5-39.5T800-480q0-21-2.5-40.5T790-560H654q3 20 4.5 39.5T660-480q0 21-1.5 40.5T654-400Zm-16-240h118q-29-50-72.5-87T584-782q18 33 31.5 68.5T638-640Zm-234 0h152q-12-44-31-83t-45-75q-26 36-45 75t-31 83Zm-200 0h118q9-38 22.5-73.5T376-782q-56 18-99.5 55T204-640Z\"/></svg>',\n hideImages: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m840-234-80-80v-446H314l-80-80h526q33 0 56.5 23.5T840-760v526ZM792-56l-64-64H200q-33 0-56.5-23.5T120-200v-528l-64-64 56-56 736 736-56 56ZM240-280l120-160 90 120 33-44-283-283v447h447l-80-80H240Zm297-257ZM424-424Z\"/></svg>',\n accessibilityReport: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h168q13-36 43.5-58t68.5-22q38 0 68.5 22t43.5 58h168q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm80-80h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm221.5-198.5Q510-807 510-820t-8.5-21.5Q493-850 480-850t-21.5 8.5Q450-833 450-820t8.5 21.5Q467-790 480-790t21.5-8.5ZM200-200v-560 560Z\"/></svg>',\n annotations: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v268q-19-9-39-15.5t-41-9.5v-243H200v560h242q3 22 9.5 42t15.5 38H200Zm0-120v40-560 243-3 280Zm80-40h163q3-21 9.5-41t14.5-39H280v80Zm0-160h244q32-30 71.5-50t84.5-27v-3H280v80Zm0-160h400v-80H280v80ZM720-40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40Zm-20-80h40v-100h100v-40H740v-100h-40v100H600v40h100v100Z\"/></svg>',\n textToSpeech: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M560-131v-82q90-26 145-100t55-168q0-94-55-168T560-749v-82q124 28 202 125.5T840-481q0 127-78 224.5T560-131ZM120-360v-240h160l200-200v640L280-360H120Zm440 40v-322q47 22 73.5 66t26.5 96q0 51-26.5 94.5T560-320ZM400-606l-86 86H200v80h114l86 86v-252ZM300-480Z\"/></svg>',\n highContrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93v640Z\"/></svg>',\n simplifyLayout: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M760-360v-80H200v80h560Zm0-160v-80H200v80h560Zm0-160v-80H200v80h560ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm560-80v-80H200v80h560Z\"/></svg>'\n};\n","export const TARGET_SELECTORS = {\n ALL: ['', '*:not(.material-icons,.acc-menu,.acc-menu *)'],\n LINKS: ['a[href]'],\n HEADERS: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', '.wsite-headline', '.wsite-content-title'],\n TEXT: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', '.wsite-headline', '.wsite-content-title', 'img', 'p', 'i', 'svg', 'a', 'button:not(.acc-btn)', 'label', 'li', 'ol']\n};\n\nexport const PAGE_CONTENT_SELECTOR = 'body > *:not(.acc-container):not(.acc-rg-container):not(#acc-skip-link)';\n","export const TRANSLATIONS = {\n en: {\n \"Accessibility Menu\": \"Accessibility Menu\",\n \"Reset settings\": \"Reset settings\",\n \"Reset All Settings\": \"Reset All Settings\",\n \"Close\": \"Close\",\n \"Content Adjustments\": \"Content Adjustments\",\n \"Adjust Font Size\": \"Adjust Font Size\",\n \"Highlight Title\": \"Highlight Title\",\n \"Highlight Links\": \"Highlight Links\",\n \"Readable Font\": \"Readable Font\",\n \"Color Adjustments\": \"Color Adjustments\",\n \"Invert Colors\": \"Invert Colors\",\n \"Light Contrast\": \"Light Contrast\",\n \"Dark Contrast\": \"Dark Contrast\",\n \"High Contrast\": \"High Contrast\",\n \"High Saturation\": \"High Saturation\",\n \"Low Saturation\": \"Low Saturation\",\n \"Monochrome\": \"Monochrome\",\n \"Tools\": \"Tools\",\n \"Reading Guide\": \"Reading Guide\",\n \"Stop Animations\": \"Stop Animations\",\n \"Big Cursor\": \"Big Cursor\",\n \"Increase Font Size\": \"Increase Font Size\",\n \"Decrease Font Size\": \"Decrease Font Size\",\n \"Letter Spacing\": \"Letter Spacing\",\n \"Line Height\": \"Line Height\",\n \"Font Weight\": \"Font Weight\",\n \"Dyslexia Font\": \"Dyslexia Font\",\n \"Language\": \"Language\",\n \"Open Accessibility Menu\": \"Open Accessibility Menu\",\n \"Hide Images\": \"Hide Images\",\n \"Skip to accessibility menu\": \"Skip to accessibility menu\",\n \"Accessibility Report\": \"Accessibility Report\",\n \"Run Accessibility Check\": \"Run Accessibility Check\",\n \"Loading...\": \"Loading...\",\n \"Analyzing page...\": \"Analyzing page...\",\n \"Critical\": \"Critical\",\n \"Serious\": \"Serious\",\n \"Moderate\": \"Moderate\",\n \"Minor\": \"Minor\",\n \"Violations Found\": \"Violations Found\",\n \"No Issues Found\": \"No Issues Found\",\n \"Element\": \"Element\",\n \"Issue\": \"Issue\",\n \"How to Fix\": \"How to Fix\",\n \"Close Report\": \"Close Report\",\n \"Passed Tests\": \"Passed Tests\",\n \"Items Need Review\": \"Items Need Review\",\n \"Annotations\": \"Annotations\",\n \"Text to Speech\": \"Text to Speech\",\n \"Text to Speech On\": \"Text to Speech On\",\n \"Text to Speech Off\": \"Text to Speech Off\",\n \"Simplify Layout\": \"Simplify Layout\",\n \"Play\": \"Play\",\n \"Pause\": \"Pause\",\n \"Stop\": \"Stop\",\n \"Loading voice...\": \"Loading voice...\",\n \"Reading...\": \"Reading...\",\n \"All Languages\": \"All Languages\",\n \"Search language\": \"Search language\",\n \"Font Size\": \"Font Size\",\n \"Contrast\": \"Contrast\",\n \"Saturation\": \"Saturation\",\n \"Accessibility\": \"Accessibility\"\n },\n ne: {\n \"Accessibility Menu\": \"पहुँच मेनु\",\n \"Reset settings\": \"सेटिङ रिसेट गर्नुहोस्\",\n \"Reset All Settings\": \"सबै सेटिङ रिसेट गर्नुहोस्\",\n \"Close\": \"बन्द गर्नुहोस्\",\n \"Content Adjustments\": \"सामग्री समायोजन\",\n \"Adjust Font Size\": \"फन्ट आकार समायोजन\",\n \"Highlight Title\": \"शीर्षक हाइलाइट\",\n \"Highlight Links\": \"लिङ्क हाइलाइट\",\n \"Readable Font\": \"पठनीय फन्ट\",\n \"Color Adjustments\": \"रङ समायोजन\",\n \"Invert Colors\": \"रङ उल्टाउनुहोस्\",\n \"Light Contrast\": \"हल्का कन्ट्रास्ट\",\n \"Dark Contrast\": \"गाढा कन्ट्रास्ट\",\n \"High Contrast\": \"उच्च कन्ट्रास्ट\",\n \"High Saturation\": \"उच्च संतृप्तता\",\n \"Low Saturation\": \"कम संतृप्तता\",\n \"Monochrome\": \"एकरङी\",\n \"Tools\": \"उपकरणहरू\",\n \"Reading Guide\": \"पठन सहायक\",\n \"Stop Animations\": \"एनिमेसन रोक्नुहोस्\",\n \"Big Cursor\": \"ठूलो कर्सर\",\n \"Increase Font Size\": \"फन्ट आकार बढाउनुहोस्\",\n \"Decrease Font Size\": \"फन्ट आकार घटाउनुहोस्\",\n \"Letter Spacing\": \"अक्षर दूरी\",\n \"Line Height\": \"लाइन उचाइ\",\n \"Font Weight\": \"फन्ट वजन\",\n \"Dyslexia Font\": \"डिस्लेक्सिया फन्ट\",\n \"Language\": \"भाषा\",\n \"Open Accessibility Menu\": \"पहुँच मेनु खोल्नुहोस्\",\n \"Hide Images\": \"तस्बिर लुकाउनुहोस्\",\n \"Skip to accessibility menu\": \"पहुँच मेनुमा जानुहोस्\",\n \"Accessibility Report\": \"पहुँच प्रतिवेदन\",\n \"Run Accessibility Check\": \"पहुँच जाँच चलाउनुहोस्\",\n \"Loading...\": \"लोड हुँदैछ...\",\n \"Analyzing page...\": \"पृष्ठ विश्लेषण हुँदैछ...\",\n \"Critical\": \"गम्भीर\",\n \"Serious\": \"साँघुरो\",\n \"Moderate\": \"मध्यम\",\n \"Minor\": \"सामान्य\",\n \"Violations Found\": \"उल्लंघनहरू फेला परे\",\n \"No Issues Found\": \"कुनै समस्या फेला परेन\",\n \"Element\": \"तत्व\",\n \"Issue\": \"समस्या\",\n \"How to Fix\": \"कसरी ठीक गर्ने\",\n \"Close Report\": \"प्रतिवेदन बन्द गर्नुहोस्\",\n \"Passed Tests\": \"पास भएका परीक्षणहरू\",\n \"Items Need Review\": \"समीक्षा आवश्यक वस्तुहरू\",\n \"Annotations\": \"टिप्पणीहरू\",\n \"Text to Speech\": \"पाठ वाचन\",\n \"Text to Speech On\": \"पाठ वाचन सक्रिय\",\n \"Text to Speech Off\": \"पाठ वाचन निष्क्रिय\",\n \"Simplify Layout\": \"लेआउट सरल बनाउनुहोस्\",\n \"Play\": \"प्ले\",\n \"Pause\": \"पज\",\n \"Stop\": \"रोक्नुहोस्\",\n \"Loading voice...\": \"आवाज लोड हुँदैछ...\",\n \"Reading...\": \"पढिँदैछ...\",\n \"All Languages\": \"सबै भाषाहरू\",\n \"Search language\": \"भाषा खोज्नुहोस्\",\n \"Font Size\": \"फन्ट आकार\",\n \"Contrast\": \"कन्ट्रास्ट\",\n \"Saturation\": \"संतृप्तता\",\n \"Accessibility\": \"पहुँचयोग्यता\"\n }\n};\n\nexport const SUPPORTED_LANGUAGES = [\n { code: 'en', label: 'English (English)' },\n { code: 'ne', label: 'नेपाली (Nepali)' }\n];\n","/** @typedef {import('./index.js').default} AllyWidget */\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const stateMethods = {\n\n storageAvailable() {\n try {\n const test = '__ally_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n },\n\n fetchCookie(name) {\n const cookieName = name + '=';\n try {\n const decodedCookie = decodeURIComponent(document.cookie);\n return decodedCookie.split(';')\n .map(c => c.trim())\n .find(c => c.startsWith(cookieName))\n ?.substring(cookieName.length) || '{}';\n } catch (e) {\n console.warn('[AllyWidget] Error reading cookie:', e);\n return '{}';\n }\n },\n\n storeCookie(name, value, days) {\n try {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = 'expires=' + d.toUTCString();\n const isSecure = window.location.protocol === 'https:';\n document.cookie = name + '=' + value + ';' + expires + ';path=/;SameSite=Strict' + (isSecure ? ';Secure' : '');\n } catch (e) {\n console.warn('[AllyWidget] Error setting cookie:', e);\n }\n },\n\n getSavedLanguage() {\n try {\n if (this.storageAvailable()) {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n const config = JSON.parse(stored);\n if (config.lang) return config.lang;\n }\n }\n const cookieVal = this.fetchCookie(this.storageKey);\n if (cookieVal && cookieVal !== '') {\n const config = JSON.parse(cookieVal);\n if (config.lang) return config.lang;\n }\n } catch {\n // ignore\n }\n return null;\n },\n\n getBrowserLanguage() {\n if (typeof navigator === 'undefined') return 'en';\n const supportedCodes = this.supportedLanguages.map(lang => lang.code);\n const browserLanguages = navigator.languages\n ? [...navigator.languages]\n : [navigator.language || 'en'];\n\n for (const browserLang of browserLanguages) {\n const primaryCode = browserLang.split('-')[0].toLowerCase();\n if (supportedCodes.includes(primaryCode)) return primaryCode;\n }\n return 'en';\n },\n\n getDefaultLanguage() {\n const savedLang = this.getSavedLanguage();\n if (savedLang) {\n const supportedCodes = this.supportedLanguages.map(lang => lang.code);\n if (supportedCodes.includes(savedLang)) return savedLang;\n }\n return this.getBrowserLanguage();\n },\n\n isDevMode() {\n if (typeof window === 'undefined') return false;\n try {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get('ally-dev') === 'true' || urlParams.get('acc-dev') === 'true';\n } catch {\n return false;\n }\n },\n\n getDataAttributeOptions() {\n const options = {};\n if (typeof document === 'undefined') return options;\n const attributes = ['lang', 'position', 'offset', 'size', 'icon'];\n\n const assignValue = (key, value) => {\n if (value === null || typeof value === 'undefined' || value === '') return;\n switch (key) {\n case 'lang': {\n const lang = String(value).trim();\n if (lang) options.lang = lang;\n break;\n }\n case 'position': {\n const position = String(value).trim();\n if (position) options.position = position;\n break;\n }\n case 'offset': {\n const normalized = this.normalizeOffset(value);\n if (normalized) options.offset = normalized;\n break;\n }\n case 'size': {\n const normalizedSize = this.normalizeButtonSize(value);\n if (normalizedSize) options.size = normalizedSize;\n break;\n }\n case 'icon': {\n const icon = String(value).trim();\n if (icon) options.icon = icon;\n break;\n }\n default: break;\n }\n };\n\n const inspectElement = (el) => {\n if (!el) return;\n attributes.forEach(key => {\n const attrName = `data-ally-${key}`;\n const fallback = `data-acc-${key}`;\n const attrValue = el.getAttribute ? (el.getAttribute(attrName) || el.getAttribute(fallback)) : null;\n assignValue(key, attrValue);\n });\n };\n\n const scriptCandidates = [];\n if (document.currentScript) scriptCandidates.push(document.currentScript);\n document.querySelectorAll('script[data-ally-lang],script[data-ally-position],script[data-ally-offset],script[data-ally-size],script[data-ally-icon]').forEach(script => {\n if (!scriptCandidates.includes(script)) scriptCandidates.push(script);\n });\n scriptCandidates.forEach(inspectElement);\n\n attributes.forEach(key => {\n if (options[key] !== undefined) return;\n const el = document.querySelector(`[data-ally-${key}]`) || document.querySelector(`[data-acc-${key}]`);\n if (el) assignValue(key, el.getAttribute(`data-ally-${key}`) || el.getAttribute(`data-acc-${key}`));\n });\n\n return options;\n },\n\n normalizeOffset(value) {\n if (!value && value !== 0) return undefined;\n let parts = [];\n if (Array.isArray(value)) {\n parts = value;\n } else if (typeof value === 'string') {\n parts = value.split(/[, ]+/);\n } else {\n parts = [value];\n }\n const parsed = parts\n .map(part => {\n const number = Number(part);\n return Number.isFinite(number) ? Math.round(number) : null;\n })\n .filter(number => number !== null);\n\n if (!parsed.length) return undefined;\n if (parsed.length === 1) parsed.push(parsed[0]);\n return [parsed[0], parsed[1] !== undefined ? parsed[1] : parsed[0]];\n },\n\n normalizeButtonSize(value) {\n const fallback = this.widgetTheme?.buttonSize || '52px';\n if (typeof value === 'number' && Number.isFinite(value)) {\n return `${Math.max(24, Math.round(value))}px`;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return fallback;\n if (/^\\d+(\\.\\d+)?(px|em|rem|%)$/i.test(trimmed)) return trimmed;\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) return `${Math.max(24, Math.round(numeric))}px`;\n return trimmed;\n }\n return fallback;\n },\n\n toggleDisplay(el, state) {\n if (!el) return;\n try {\n el.style.display = (typeof state === 'undefined')\n ? (el.style.display === 'none' ? 'block' : 'none')\n : (state ? 'block' : 'none');\n } catch (e) {\n console.warn('[AllyWidget] Error toggling element:', e);\n }\n },\n\n isSystemControlledPreference(key) {\n const systemDefaults = this.widgetConfig?.systemDefaults || {};\n return Object.prototype.hasOwnProperty.call(systemDefaults, key);\n },\n\n hasExplicitStatePreference(key) {\n const states = this.widgetConfig?.states || {};\n if (!Object.prototype.hasOwnProperty.call(states, key)) return false;\n return !this.isSystemControlledPreference(key);\n },\n\n hasExplicitColorFilterPreference() {\n const states = this.widgetConfig?.states || {};\n const systemDefaults = this.widgetConfig?.systemDefaults || {};\n const keys = Array.isArray(this.colorFilterKeys) ? this.colorFilterKeys : [];\n return keys.some((key) =>\n Object.prototype.hasOwnProperty.call(states, key) &&\n !Object.prototype.hasOwnProperty.call(systemDefaults, key)\n );\n },\n\n updateState(payload, options = {}) {\n const source = options.source || 'user';\n const previousStates = this.widgetConfig.states || {};\n const previousSystemDefaults = this.widgetConfig.systemDefaults || {};\n const nextStates = { ...previousStates, ...payload };\n const nextSystemDefaults = { ...previousSystemDefaults };\n const keys = Object.keys(payload || {});\n\n if (source === 'system') {\n keys.forEach((key) => { nextSystemDefaults[key] = payload[key]; });\n } else {\n keys.forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextSystemDefaults, key)) {\n delete nextSystemDefaults[key];\n }\n });\n }\n\n const updatedConfig = { ...this.widgetConfig, states: nextStates, systemDefaults: nextSystemDefaults };\n this.saveConfig(updatedConfig);\n return updatedConfig;\n },\n\n saveConfig(newConfig) {\n this.widgetConfig = { ...this.widgetConfig, ...newConfig };\n const data = JSON.stringify(this.widgetConfig);\n if (this.storageAvailable()) {\n try {\n localStorage.setItem(this.storageKey, data);\n } catch {\n this.storeCookie(this.storageKey, data, 365);\n }\n } else {\n this.storeCookie(this.storageKey, data, 365);\n }\n },\n\n retrieveState(key) {\n return this.widgetConfig.states ? this.widgetConfig.states[key] : undefined;\n },\n\n loadConfig(cache = true) {\n if (cache) return this.widgetConfig;\n const savedConfig = this.fetchSavedConfig();\n if (savedConfig) {\n try {\n this.widgetConfig = JSON.parse(savedConfig);\n } catch (e) {\n console.warn('[AllyWidget] Error parsing config:', e);\n this.widgetConfig = {};\n }\n }\n return this.widgetConfig;\n },\n\n fetchSavedConfig() {\n if (this.storageAvailable()) {\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) return stored;\n } catch (e) {\n console.warn('[AllyWidget] localStorage failed, falling back to cookies:', e);\n }\n }\n const cookieVal = this.fetchCookie(this.storageKey);\n return cookieVal && cookieVal !== '' ? cookieVal : '{}';\n }\n\n};\n","import menuCSS from './styles/menu.css';\nimport widgetCSS from './styles/widget.css';\nimport reportCSS from './styles/report.css';\nimport readingGuideCSS from './styles/reading-guide.css';\nimport skipLinkCSS from './styles/skip-link.css';\nimport annotationsCSS from './styles/annotations.css';\n\nconst STATIC_STYLE_ID = 'ally-static-styles';\nconst STATIC_STYLES = [\n menuCSS,\n widgetCSS,\n reportCSS,\n readingGuideCSS,\n skipLinkCSS,\n annotationsCSS\n].join('\\n');\n\n/** @typedef {import('./index.js').default} AllyWidget */\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const styleMethods = {\n\n findElement(selector, parent = document) {\n try {\n return parent.querySelector(selector);\n } catch (e) {\n console.warn(`[AllyWidget] Failed to query selector: ${selector}`, e);\n return null;\n }\n },\n\n injectStyle(id, css) {\n if (!css || typeof document === 'undefined') return;\n try {\n let style = document.getElementById(id) || document.createElement('style');\n style.innerHTML = css;\n if (!style.id) {\n style.id = id;\n document.head.appendChild(style);\n }\n } catch (e) {\n console.warn('[AllyWidget] Error adding stylesheet:', e);\n }\n },\n\n createCSS(styles) {\n let css = '';\n if (!styles) return css;\n const browserPrefixes = ['-o-', '-ms-', '-moz-', '-webkit-', ''];\n const prefixedProperties = ['filter'];\n for (let key in styles) {\n if (!Object.prototype.hasOwnProperty.call(styles, key)) continue;\n let prefixes = prefixedProperties.includes(key) ? browserPrefixes : [''];\n prefixes.forEach(prefix => {\n css += `${prefix}${key}:${styles[key]} !important;`;\n });\n }\n return css;\n },\n\n wrapCSS(selector, childrenSelector, css) {\n let output = '';\n childrenSelector.forEach(child => {\n output += `${selector} ${child}{${css}}`;\n });\n return output;\n },\n\n buildCSS(config) {\n if (!config) return '';\n let output = '';\n output += this.createCSS(config.styles || {});\n if (output.length && config.selector) {\n output = this.wrapCSS(config.selector, config.childrenSelector || [''], output);\n }\n output += config.css || '';\n return output;\n },\n\n applyToolStyle(config) {\n let { id = '', enable = false } = config;\n let styleId = `acc-${id}`;\n if (enable) {\n let css = this.buildCSS(config);\n this.injectStyle(styleId, css);\n } else {\n let style = document.getElementById(styleId);\n if (style) style.remove();\n }\n document.documentElement.classList.toggle(styleId, enable);\n },\n\n applyThemeVariables() {\n if (typeof document === 'undefined') return;\n const vars = {\n '--acc-primary-color': this.widgetTheme.primaryColor,\n '--acc-primary-color-light': this.widgetTheme.primaryColorLight,\n '--acc-primary-color-dark': this.widgetTheme.primaryColorDark,\n '--acc-bg-color': this.widgetTheme.backgroundColor,\n '--acc-text-color': this.widgetTheme.textColor,\n '--acc-text-color-inverted': this.widgetTheme.textColorInverted,\n '--acc-card-bg': this.widgetTheme.cardBackground,\n '--acc-border-color': this.widgetTheme.borderColor,\n '--acc-focus-ring-color': this.widgetTheme.focusRingColor,\n '--acc-hover-color': this.widgetTheme.hoverColor,\n '--acc-active-color': this.widgetTheme.activeColor,\n '--acc-border-radius': this.widgetTheme.borderRadius,\n '--acc-button-border-radius': this.widgetTheme.buttonBorderRadius,\n '--acc-header-height': this.widgetTheme.headerHeight,\n '--acc-focus-outline-width': this.widgetTheme.focusBorderWidth,\n '--acc-focus-outline-offset': this.widgetTheme.focusOutlineOffset,\n '--acc-widget-z-index': String(this.widgetTheme.zIndex),\n '--acc-button-size': this.widgetTheme.buttonSize\n };\n Object.entries(vars).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n },\n\n registerStaticStyles() {\n if (this.staticStylesRegistered) return;\n this.injectStyle(STATIC_STYLE_ID, STATIC_STYLES);\n this.staticStylesRegistered = true;\n }\n\n};\n","/** @typedef {import('./index.js').default} AllyWidget */\n\nconst AXE_CORE_VERSION = '4.11.1';\nconst AXE_CORE_SRC = `https://cdn.jsdelivr.net/npm/axe-core@${AXE_CORE_VERSION}/axe.min.js`;\nconst AXE_CORE_INTEGRITY = 'sha384-wb3zgvLcZeMFSec08dk7g8K8yDFFAX2uNKVwOUuowwc/wIfE2t6XVUjTEgPrOJCS';\nconst AXE_RUN_OPTIONS = {\n runOnly: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'best-practice']\n};\nconst MAX_ANNOTATIONS = 50;\nconst SYSTEM_PREFERS_REDUCED_MOTION = '(prefers-reduced-motion: reduce)';\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const featureMethods = {\n\n getContrastToggleDisplay(index) {\n if (index === 0) {\n return { key: 'light-contrast', label: 'Light', icon: this.widgetIcons.lightContrast };\n }\n if (index === 1) {\n return { key: 'dark-contrast', label: 'Dark', icon: this.widgetIcons.darkContrast };\n }\n return { key: null, label: 'Contrast', icon: this.widgetIcons.contrast };\n },\n\n updateContrastToggleButton(button, index) {\n if (!button) return;\n const display = this.getContrastToggleDisplay(index);\n const iconNode = button.querySelector('svg');\n if (iconNode) {\n iconNode.outerHTML = display.icon;\n } else {\n button.insertAdjacentHTML('afterbegin', display.icon);\n }\n\n const translatedLabel = this.translate(display.label);\n const labelNode = button.querySelector('.acc-label');\n if (labelNode) {\n labelNode.setAttribute('data-acc-text', display.label);\n labelNode.innerText = translatedLabel;\n }\n button.setAttribute('title', translatedLabel);\n button.setAttribute('aria-label', translatedLabel);\n button.setAttribute('data-contrast-mode', display.key || 'off');\n },\n\n getSaturationToggleDisplay(index) {\n if (index === 0) {\n return { key: 'low-saturation', label: 'Low', icon: this.widgetIcons.lowSaturation };\n }\n if (index === 1) {\n return { key: 'high-saturation', label: 'High', icon: this.widgetIcons.highSaturation };\n }\n return { key: null, label: 'Saturation', icon: this.widgetIcons.saturation };\n },\n\n updateSaturationToggleButton(button, index) {\n if (!button) return;\n const display = this.getSaturationToggleDisplay(index);\n const iconNode = button.querySelector('svg');\n if (iconNode) {\n iconNode.outerHTML = display.icon;\n } else {\n button.insertAdjacentHTML('afterbegin', display.icon);\n }\n\n const translatedLabel = this.translate(display.label);\n const labelNode = button.querySelector('.acc-label');\n if (labelNode) {\n labelNode.setAttribute('data-acc-text', display.label);\n labelNode.innerText = translatedLabel;\n }\n button.setAttribute('title', translatedLabel);\n button.setAttribute('aria-label', translatedLabel);\n button.setAttribute('data-saturation-mode', display.key || 'off');\n },\n\n ensureSkipLink() {\n if (typeof document === 'undefined') return null;\n if (this.skipLinkElement && document.body.contains(this.skipLinkElement)) {\n this.updateSkipLinkLabel();\n return this.skipLinkElement;\n }\n const existing = document.getElementById('acc-skip-link');\n if (existing) {\n this.skipLinkElement = existing;\n if (!existing.getAttribute('data-acc-text')) {\n existing.setAttribute('data-acc-text', 'Skip to accessibility menu');\n }\n this.updateSkipLinkLabel();\n return existing;\n }\n \n const button = document.createElement('button');\n button.type = 'button';\n button.id = 'acc-skip-link';\n button.className = 'acc-skip-link';\n button.setAttribute('tabindex', '0');\n button.setAttribute('data-acc-text', 'Skip to accessibility menu');\n button.setAttribute('aria-label', this.translate('Skip to accessibility menu'));\n button.textContent = this.translate('Skip to accessibility menu');\n \n button.addEventListener('click', (event) => {\n event.preventDefault();\n const toggle = this.widgetToggleButton;\n if (!toggle) return;\n \n const currentMenu = this.activeMenuContainer || this.menuContainer;\n const menuIsVisible = currentMenu && currentMenu.style.display !== 'none';\n \n const focusMenu = () => {\n const targetMenu = this.activeMenuContainer || this.menuContainer;\n if (!targetMenu) return;\n const focusables = this.getFocusableElements(targetMenu);\n if (focusables.length) {\n focusables[0].focus();\n }\n };\n \n if (!menuIsVisible) {\n toggle.click();\n requestAnimationFrame(focusMenu);\n } else {\n focusMenu();\n }\n });\n \n document.body.insertBefore(button, document.body.firstChild);\n this.skipLinkElement = button;\n return button;\n },\n\n updateSkipLinkLabel() {\n if (!this.skipLinkElement) return;\n const key = this.skipLinkElement.getAttribute('data-acc-text') || 'Skip to accessibility menu';\n const label = this.translate(key);\n this.skipLinkElement.textContent = label;\n this.skipLinkElement.setAttribute('aria-label', label);\n },\n\n shouldSkipScaling(element) {\n return element.closest('.acc-menu, .acc-container, .acc-widget');\n },\n\n collectDirectTextParents(rootElement = document.body) {\n const directTextParents = new Set();\n if (typeof document === 'undefined' || typeof NodeFilter === 'undefined') {\n return directTextParents;\n }\n\n const root = rootElement instanceof Element ? rootElement : document.body;\n if (!root) return directTextParents;\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode: (node) => {\n if (!node || !node.textContent || !node.textContent.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n const parent = node.parentElement;\n if (!parent) return NodeFilter.FILTER_REJECT;\n if (this.shouldSkipScaling(parent)) return NodeFilter.FILTER_REJECT;\n if (parent.closest('script,style,noscript,textarea,pre,code,svg')) {\n return NodeFilter.FILTER_REJECT;\n }\n if (parent.matches(this.textScaleSelectors)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n\n let currentNode = walker.nextNode();\n while (currentNode) {\n const parent = currentNode.parentElement;\n if (parent) {\n directTextParents.add(parent);\n }\n currentNode = walker.nextNode();\n }\n\n return directTextParents;\n },\n\n applyScaleToElement(element, multiplier) {\n if (\n !element ||\n !(element instanceof Element) ||\n this.shouldSkipScaling(element) ||\n element.classList.contains('material-icons') ||\n element.classList.contains('fa')\n ) {\n return;\n }\n const baseAttr = 'data-acc-baseSize';\n if (!element.hasAttribute(baseAttr)) {\n const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n if (Number.isNaN(computedSize) || computedSize <= 0) {\n return;\n }\n element.setAttribute(baseAttr, String(computedSize));\n }\n const baseSize = parseFloat(element.getAttribute(baseAttr));\n if (Number.isNaN(baseSize) || baseSize <= 0) {\n return;\n }\n element.style.fontSize = `${baseSize * multiplier}px`;\n },\n\n ensureTextScaleObserver() {\n if (this.textScaleObserver || !document.body) return;\n this.textScaleObserver = new MutationObserver((mutations) => {\n if (Math.abs(this.currentTextScaleMultiplier - 1) < 0.001) {\n return;\n }\n const pending = new Set();\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (!(node instanceof Element)) return;\n if (node.matches && node.matches(this.textScaleSelectors)) {\n pending.add(node);\n }\n node.querySelectorAll?.(this.textScaleSelectors).forEach(el => pending.add(el));\n this.collectDirectTextParents(node).forEach(el => pending.add(el));\n });\n });\n if (!pending.size) return;\n pending.forEach(el => this.applyScaleToElement(el, this.currentTextScaleMultiplier));\n });\n this.textScaleObserver.observe(document.body, { childList: true, subtree: true });\n },\n\n disconnectTextScaleObserver() {\n if (!this.textScaleObserver) return;\n this.textScaleObserver.disconnect();\n this.textScaleObserver = null;\n },\n\n scaleText(multiply = 1) {\n try {\n const numericMultiply = Number(multiply);\n const resolvedMultiply = Number.isFinite(numericMultiply) && numericMultiply > 0 ? numericMultiply : 1;\n const isDefaultScale = Math.abs(resolvedMultiply - 1) < 0.001;\n this.currentTextScaleMultiplier = resolvedMultiply;\n if (!isDefaultScale) {\n this.ensureTextScaleObserver();\n const elements = document.querySelectorAll(this.textScaleSelectors);\n elements.forEach(el => this.applyScaleToElement(el, resolvedMultiply));\n this.collectDirectTextParents(document.body).forEach(el => this.applyScaleToElement(el, resolvedMultiply));\n } else {\n this.disconnectTextScaleObserver();\n const scaledElements = document.querySelectorAll('[data-acc-baseSize]');\n scaledElements.forEach(el => {\n if (this.shouldSkipScaling(el)) return;\n el.style.fontSize = '';\n el.removeAttribute('data-acc-baseSize');\n });\n }\n } catch (e) {\n console.warn('Error scaling text:', e);\n }\n },\n\n clampTextScalePercent(percent) {\n const min = Number(this.textScaleMinPercent) || 80;\n const max = Number(this.textScaleMaxPercent) || 150;\n const step = Number(this.textScaleStepPercent) || 5;\n const numeric = Number(percent);\n if (!Number.isFinite(numeric)) return 100;\n const snapped = Math.round((numeric - min) / step) * step + min;\n return Math.min(max, Math.max(min, snapped));\n },\n\n getTextScalePercent(scaleValue = 1) {\n if (scaleValue === false || scaleValue === null || typeof scaleValue === 'undefined') {\n return this.clampTextScalePercent(100);\n }\n const numeric = Number(scaleValue);\n if (!Number.isFinite(numeric)) {\n return this.clampTextScalePercent(100);\n }\n if (numeric <= 0) {\n return this.clampTextScalePercent(100);\n }\n const percent = numeric > 10 ? numeric : numeric * 100;\n return this.clampTextScalePercent(percent);\n },\n\n syncTextScaleControlUI(menu, scaleValue = 1) {\n if (!menu || !menu.querySelector) return;\n const range = menu.querySelector('.acc-text-scale-range');\n const label = menu.querySelector('.acc-text-scale-percent');\n const percent = this.getTextScalePercent(scaleValue);\n if (range) {\n const min = Number(this.textScaleMinPercent) || 80;\n const max = Number(this.textScaleMaxPercent) || 150;\n const progress = ((percent - min) / (max - min)) * 100;\n range.value = String(percent);\n range.style.setProperty('--acc-text-scale-progress', `${Math.max(0, Math.min(100, progress))}%`);\n }\n if (label) {\n label.textContent = `${percent}%`;\n }\n },\n\n setTextScaleFromPercent(percent, options = {}) {\n const shouldPersist = options.persist !== false;\n const clampedPercent = this.getTextScalePercent(percent);\n const multiplier = Number((clampedPercent / 100).toFixed(2));\n const exactIndex = this.textScaleValues.indexOf(multiplier);\n\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = exactIndex;\n }\n\n if (exactIndex > -1) {\n this.textScaleIndex = exactIndex;\n } else {\n let nearestIndex = 0;\n let minDistance = Infinity;\n this.textScaleValues.forEach((value, index) => {\n const distance = Math.abs(value - multiplier);\n if (distance < minDistance) {\n minDistance = distance;\n nearestIndex = index;\n }\n });\n this.textScaleIndex = nearestIndex;\n }\n\n this.scaleText(multiplier);\n\n if (shouldPersist) {\n this.updateState({ 'text-scale': multiplier });\n }\n\n return multiplier;\n },\n\n enableBoldText(enable = false) {\n const contentSelector = [\n '*',\n ':not(.material-icons)',\n ':not(.material-icons-outlined)',\n ':not(.material-icons-round)',\n ':not(.material-symbols-outlined)',\n ':not(.material-symbols-rounded)',\n ':not(.fa)',\n ':not(.fas)',\n ':not(.far)',\n ':not(.fab)',\n ':not(.fa-solid)',\n ':not(.fa-regular)',\n ':not(.fa-brands)',\n ':not(.glyphicon)',\n ':not(.icon)',\n ':not(.icons)',\n ':not([class*=\"icon-\"])',\n ':not([data-icon])'\n ].join('');\n const config = {\n id: \"bold-text\",\n selector: \"body\",\n childrenSelector: [contentSelector],\n styles: { 'font-weight': '700' },\n css: `\n .acc-container, .acc-container *, .acc-menu, .acc-menu * {\n font-weight: inherit !important;\n }\n input::placeholder, textarea::placeholder {\n font-weight: 700 !important;\n }\n `\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n adjustLetterSpacing(enable = false) {\n const config = {\n id: \"letter-spacing\",\n selector: \"html\",\n childrenSelector: ['', '*:not(.material-icons,.acc-menu,.acc-menu *, .acc-widget, .acc-widget *)'],\n styles: { 'letter-spacing': '2px' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n adjustLineSpacing(enable = false) {\n const config = {\n id: \"line-spacing\",\n selector: \"html\",\n childrenSelector: ['', '*:not(.material-icons,.acc-menu,.acc-menu *, .acc-widget, .acc-widget *)'],\n styles: { 'line-height': '3' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n enableLargePointer(enable = false) {\n const config = {\n id: \"large-pointer\",\n selector: \"body\",\n childrenSelector: ['*'],\n styles: {\n 'cursor': `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='98px' height='98px' viewBox='0 0 48 48'%3E%3Cpath fill='%23FFFFFF' d='M27.8 39.7c-.1 0-.2 0-.4-.1s-.4-.3-.6-.5l-3.7-8.6-4.5 4.2c-.1.2-.3.3-.6.3-.1 0-.3 0-.4-.1-.3-.1-.6-.5-.6-.9V12c0-.4.2-.8.6-.9.1-.1.3-.1.4-.1.2 0 .5.1.7.3l16 15c.3.3.4.7.3 1.1-.1.4-.5.6-.9.7l-6.3.6 3.9 8.5c.1.2.1.5 0 .8-.1.2-.3.5-.5.6l-2.9 1.3c-.2-.2-.4-.2-.5-.2z'/%3E%3Cpath fill='%23212121' d='m18 12 16 15-7.7.7 4.5 9.8-2.9 1.3-4.3-9.9L18 34V12m0-2c-.3 0-.5.1-.8.2-.7.3-1.2 1-1.2 1.8v22c0 .8.5 1.5 1.2 1.8.3.2.6.2.8.2.5 0 1-.2 1.4-.5l3.4-3.2 3.1 7.3c.2.5.6.9 1.1 1.1.2.1.5.1.7.1.3 0 .5-.1.8-.2l2.9-1.3c.5-.2.9-.6 1.1-1.1.2-.5.2-1.1 0-1.5l-3.3-7.2 4.9-.4c.8-.1 1.5-.6 1.7-1.3.3-.7.1-1.6-.5-2.1l-16-15c-.3-.5-.8-.7-1.3-.7z'/%3E%3C/svg%3E\") 40 15, auto`\n }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n highlightLinks(enable = false) {\n const config = {\n id: \"highlight-links\",\n selector: \"html\",\n childrenSelector: [\n \"a[href]:not(.acc-menu a, .acc-widget a)\",\n \"summary.header__menu-item:not(.acc-menu summary, .acc-widget summary)\",\n \"summary.link:not(.acc-menu summary, .acc-widget summary)\",\n \"summary[role='button']:not(.acc-menu summary, .acc-widget summary)\",\n \"details > summary.list-menu__item:not(.acc-menu summary, .acc-widget summary)\",\n \".header__menu-item[role='button']:not(.acc-menu *, .acc-widget *)\"\n ],\n styles: { 'outline': `3px solid ${this.widgetTheme.primaryColor}`, 'outline-offset': '2px' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n highlightTitles(enable = false) {\n const config = {\n id: \"highlight-title\",\n selector: \"html\",\n childrenSelector: this.targetSelectors.HEADERS,\n styles: { 'outline': `3px solid ${this.widgetTheme.primaryColor}`, 'outline-offset': '2px' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n ensureReadableFontLoaded() {\n if (this.readableFontLoaded) return;\n const existing = document.getElementById('acc-readable-text-font');\n if (existing) {\n this.readableFontLoaded = true;\n return;\n }\n const style = document.createElement('style');\n style.id = 'acc-readable-text-font';\n style.textContent = `\n @font-face {\n font-family: \"OpenDyslexic3\";\n src: url(\"https://website-widgets.pages.dev/fonts/OpenDyslexic3-Regular.woff\") format(\"woff\"),\n url(\"https://website-widgets.pages.dev/fonts/OpenDyslexic3-Regular.ttf\") format(\"truetype\");\n font-display: swap;\n }\n `;\n document.head.appendChild(style);\n this.readableFontLoaded = true;\n },\n\n enableReadableText(enable = false) {\n const shouldEnable = !!enable;\n if (shouldEnable) {\n this.ensureReadableFontLoaded();\n }\n const contentSelector = [\n '*',\n ':not(.material-icons)',\n ':not(.material-icons-outlined)',\n ':not(.material-icons-round)',\n ':not(.material-symbols-outlined)',\n ':not(.material-symbols-rounded)',\n ':not(.fa)',\n ':not(.fas)',\n ':not(.far)',\n ':not(.fab)',\n ':not(.fa-solid)',\n ':not(.fa-regular)',\n ':not(.fa-brands)',\n ':not(.glyphicon)',\n ':not(.icon)',\n ':not(.icons)',\n ':not([class*=\"icon-\"])',\n ':not([data-icon])'\n ].join('');\n const config = {\n id: \"readable-text\",\n selector: \"body\",\n childrenSelector: [contentSelector],\n styles: { \n 'font-family': '\"OpenDyslexic3\", \"Comic Sans MS\", Arial, Helvetica, sans-serif' \n },\n css: `\n .acc-container, .acc-container *, .acc-menu, .acc-menu * {\n font-family: inherit !important;\n }\n input::placeholder, textarea::placeholder {\n font-family: \"OpenDyslexic3\", \"Comic Sans MS\", Arial, Helvetica, sans-serif !important;\n }\n `\n };\n this.applyToolStyle({ ...config, enable: shouldEnable });\n },\n\n pauseMotion(enable = false) {\n const config = {\n id: \"pause-motion\",\n selector: \"html\",\n childrenSelector: ['*'],\n styles: { 'transition': 'none', 'animation-fill-mode': 'forwards', 'animation-iteration-count': '1', 'animation-duration': '.01s' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n enableHighContrastMode(enable = false) {\n const X = ':not(.acc-container):not(.acc-container *):not(.acc-rg-container):not(.acc-rg-container *)';\n const config = {\n id: 'high-contrast-mode',\n css: `\n /* ── Base: force black on white ── */\n body.acc-high-contrast-mode *${X} {\n color: #000 !important;\n background-color: #fff !important;\n background-image: none !important;\n text-shadow: none !important;\n box-shadow: none !important;\n }\n\n body.acc-high-contrast-mode {\n background: #fff !important;\n }\n\n /* ── Borders: solid and visible ── */\n body.acc-high-contrast-mode *${X} {\n border-color: #000 !important;\n }\n\n /* ── Links: underlined, distinct color ── */\n body.acc-high-contrast-mode a${X} {\n color: #00e !important;\n text-decoration: underline !important;\n }\n\n body.acc-high-contrast-mode a:visited${X} {\n color: #551a8b !important;\n }\n\n /* ── Headings: bold black ── */\n body.acc-high-contrast-mode :where(h1,h2,h3,h4,h5,h6)${X} {\n color: #000 !important;\n font-weight: 700 !important;\n }\n\n /* ── Images: keep visible, add border ── */\n body.acc-high-contrast-mode img${X} {\n border: 1px solid #000 !important;\n }\n\n /* ── Inputs & buttons: high-contrast borders ── */\n body.acc-high-contrast-mode :where(input, textarea, select, button)${X} {\n border: 2px solid #000 !important;\n background: #fff !important;\n color: #000 !important;\n }\n\n /* ── Focus rings: thick, high-visibility ── */\n body.acc-high-contrast-mode :focus-visible${X} {\n outline: 3px solid #000 !important;\n outline-offset: 2px !important;\n }\n\n /* ── Tables: visible cell borders ── */\n body.acc-high-contrast-mode :where(table, th, td)${X} {\n border: 1px solid #000 !important;\n }\n `\n };\n this.applyToolStyle({ ...config, enable });\n document.body?.classList.toggle('acc-high-contrast-mode', !!enable);\n },\n\n enableReadingAid(enable = false) {\n try {\n let container = this.findElement('.acc-rg-container');\n const guideHeight = 100; // Height of the clear reading window\n \n if (enable) {\n // Always clean up existing listener first to prevent duplicates\n if (window.__accweb__scrollGuide) {\n document.removeEventListener('mousemove', window.__accweb__scrollGuide);\n delete window.__accweb__scrollGuide;\n }\n \n if (!container) {\n // Create container but don't make it visible yet\n container = document.createElement('div');\n container.setAttribute('class', 'acc-rg-container');\n container.setAttribute('aria-hidden', 'true');\n container.innerHTML = this.readingAidTemplate;\n document.body.prepend(container);\n }\n \n const rgTop = container.querySelector('.acc-rg-top');\n const rgBottom = container.querySelector('.acc-rg-bottom');\n \n // Initially hide the guide completely\n rgTop.style.display = 'none';\n rgBottom.style.display = 'none';\n this.readingAidVisible = false;\n \n const updateGuidePosition = this.throttle((event) => {\n // If first mouse movement after enabling, make the guide visible\n if (!this.readingAidVisible) {\n rgTop.style.display = 'block';\n rgBottom.style.display = 'block';\n this.readingAidVisible = true;\n }\n \n // Position the guide at the mouse Y coordinate\n const mouseY = event.clientY;\n const topHeight = Math.max(0, mouseY - guideHeight / 2);\n const bottomHeight = Math.max(0, window.innerHeight - (mouseY + guideHeight / 2));\n rgTop.style.height = `${topHeight}px`;\n rgBottom.style.height = `${bottomHeight}px`;\n }, 16);\n \n window.__accweb__scrollGuide = updateGuidePosition;\n document.addEventListener('mousemove', updateGuidePosition, { passive: true });\n } else {\n // Reset visibility flag when disabled\n this.readingAidVisible = false;\n \n // Clean up event listener\n if (window.__accweb__scrollGuide) {\n document.removeEventListener('mousemove', window.__accweb__scrollGuide);\n delete window.__accweb__scrollGuide;\n }\n \n // Remove container\n if (container) {\n container.remove();\n }\n }\n } catch (e) {\n console.warn('Error with reading aid:', e);\n }\n },\n\n loadAxeCore() {\n if (this.axeCoreLoaded && window.axe) {\n return Promise.resolve(window.axe);\n }\n \n if (this.axeCorePromise) {\n return this.axeCorePromise;\n }\n \n this.axeCoreLoading = true;\n this.axeCorePromise = new Promise((resolve, reject) => {\n let script = document.querySelector('script[data-acc-axe-core=\"true\"]');\n let settled = false;\n let timeoutId = null;\n \n const settleSuccess = () => {\n if (settled) return;\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n if (!window.axe) {\n this.axeCoreLoading = false;\n this.axeCoreLoaded = false;\n this.axeCorePromise = null;\n reject(new Error('axe-core loaded but window.axe is unavailable'));\n return;\n }\n this.axeCoreLoading = false;\n this.axeCoreLoaded = true;\n if (script) {\n script.setAttribute('data-acc-axe-core-loaded', 'true');\n }\n resolve(window.axe);\n };\n \n const settleError = (error) => {\n if (settled) return;\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n this.axeCoreLoading = false;\n this.axeCoreLoaded = false;\n this.axeCorePromise = null;\n reject(error);\n };\n \n if (window.axe) {\n settleSuccess();\n return;\n }\n \n if (script && !script.src.includes(`/axe-core@${AXE_CORE_VERSION}/`)) {\n script.remove();\n script = null;\n }\n\n if (!script) {\n script = document.createElement('script');\n script.src = AXE_CORE_SRC;\n script.async = true;\n script.integrity = AXE_CORE_INTEGRITY;\n script.crossOrigin = 'anonymous';\n script.setAttribute('data-acc-axe-core', 'true');\n document.head.appendChild(script);\n }\n \n script.addEventListener('load', settleSuccess, { once: true });\n script.addEventListener('error', () => settleError(new Error('Failed to load axe-core')), { once: true });\n timeoutId = setTimeout(() => {\n settleError(new Error('Timed out loading axe-core'));\n }, 15000);\n });\n \n return this.axeCorePromise;\n },\n\n getAxeRunOptions() {\n return { ...AXE_RUN_OPTIONS };\n },\n\n getViolationCounts(results = {}) {\n const counts = { critical: 0, serious: 0, moderate: 0, minor: 0 };\n const violations = Array.isArray(results.violations) ? results.violations : [];\n violations.forEach((violation) => {\n const impact = violation?.impact;\n if (impact && counts[impact] !== undefined) {\n counts[impact] += Array.isArray(violation.nodes) ? violation.nodes.length : 0;\n }\n });\n return counts;\n },\n\n updateViolationBubble(results = null) {\n const bubble = this.violationBubble || this.findElement('.acc-violation-bubble');\n if (!bubble) return;\n\n const counts = this.getViolationCounts(results || this.axeScanResults || {});\n const devMode = this.isDevMode();\n\n let displayCount = 0;\n let severity = '';\n\n if (counts.critical > 0) {\n displayCount = counts.critical;\n severity = 'critical';\n } else if (devMode && counts.serious > 0) {\n displayCount = counts.serious;\n severity = 'serious';\n } else if (devMode && counts.moderate > 0) {\n displayCount = counts.moderate;\n severity = 'moderate';\n }\n\n if (displayCount <= 0) {\n bubble.textContent = '';\n bubble.hidden = true;\n bubble.removeAttribute('data-severity');\n return;\n }\n\n bubble.hidden = false;\n bubble.dataset.severity = severity;\n bubble.textContent = displayCount > 99 ? '99+' : String(displayCount);\n },\n\n async runBackgroundAxeScan({ force = false } = {}) {\n if (!force && this.axeScanResults) {\n this.updateViolationBubble(this.axeScanResults);\n return this.axeScanResults;\n }\n\n if (!force && this.axeScanPromise) {\n return this.axeScanPromise;\n }\n\n this.axeScanPromise = (async () => {\n try {\n const axe = await this.loadAxeCore();\n const results = await axe.run(document, this.getAxeRunOptions());\n this.axeScanResults = results;\n this.updateViolationBubble(results);\n return results;\n } catch (error) {\n this.updateViolationBubble({ violations: [] });\n throw error;\n } finally {\n this.axeScanPromise = null;\n }\n })();\n\n return this.axeScanPromise;\n },\n\n ensureMediaQuery(query) {\n if (!query || typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return null;\n }\n if (!this.systemPreferenceMediaQueries) {\n this.systemPreferenceMediaQueries = {};\n }\n if (!this.systemPreferenceMediaQueries[query]) {\n this.systemPreferenceMediaQueries[query] = window.matchMedia(query);\n }\n return this.systemPreferenceMediaQueries[query];\n },\n\n applySystemMotionPreference(shouldEnable) {\n this.loadConfig();\n if (this.hasExplicitStatePreference('pause-motion')) {\n return false;\n }\n\n const currentValue = !!this.retrieveState('pause-motion');\n if (currentValue === shouldEnable && this.isSystemControlledPreference('pause-motion')) {\n return false;\n }\n\n this.updateState({ 'pause-motion': shouldEnable }, { source: 'system' });\n return true;\n },\n\n detectSystemPreferences() {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n\n const reducedMotionQuery = this.ensureMediaQuery(SYSTEM_PREFERS_REDUCED_MOTION);\n const shouldPauseMotion = !!reducedMotionQuery?.matches;\n const motionChanged = this.applySystemMotionPreference(shouldPauseMotion);\n\n if (motionChanged) {\n this.applyEnhancements();\n }\n },\n\n clearSystemPreferenceListeners() {\n const listeners = Array.isArray(this.systemPreferenceListeners) ? this.systemPreferenceListeners : [];\n listeners.forEach((remove) => {\n if (typeof remove === 'function') {\n remove();\n }\n });\n this.systemPreferenceListeners = [];\n },\n\n setupMediaQueryListeners() {\n this.clearSystemPreferenceListeners();\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n\n const reducedMotionQuery = this.ensureMediaQuery(SYSTEM_PREFERS_REDUCED_MOTION);\n\n const listen = (mediaQuery, handler) => {\n if (!mediaQuery || typeof handler !== 'function') return;\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handler);\n this.systemPreferenceListeners.push(() => mediaQuery.removeEventListener('change', handler));\n } else if (typeof mediaQuery.addListener === 'function') {\n mediaQuery.addListener(handler);\n this.systemPreferenceListeners.push(() => mediaQuery.removeListener(handler));\n }\n };\n\n const onReducedMotionChange = (event) => {\n const changed = this.applySystemMotionPreference(!!event.matches);\n if (changed) {\n this.applyEnhancements();\n }\n };\n\n listen(reducedMotionQuery, onReducedMotionChange);\n },\n\n async runAccessibilityReport() {\n // Create or get report panel\n let panel = this.findElement('.acc-report-panel');\n \n if (!panel) {\n panel = this.createReportPanel();\n document.body.appendChild(panel);\n }\n \n this.openReportPanel(panel);\n \n const contentArea = this.findElement('.acc-report-content', panel);\n const statusArea = this.findElement('.acc-report-status', panel);\n \n // Show loading state\n statusArea.textContent = this.translate('Loading...');\n contentArea.innerHTML = `<div class=\"acc-report-loading\">${this.translate('Analyzing page...')}</div>`;\n \n try {\n const results = await this.runBackgroundAxeScan({ force: true });\n\n this.displayReportResults(panel, results);\n \n } catch (error) {\n contentArea.innerHTML = `<div class=\"acc-report-error\">Error: ${error.message}</div>`;\n statusArea.textContent = '';\n }\n },\n\n getReportFocusableElements(panel) {\n if (!panel) return [];\n const dialog = this.findElement('.acc-report-dialog', panel);\n return this.getFocusableElements(dialog || panel);\n },\n\n openReportPanel(panel) {\n if (!panel) return;\n \n this.reportPreviousFocus = document.activeElement && typeof document.activeElement.focus === 'function'\n ? document.activeElement\n : null;\n \n panel.classList.add('acc-report-visible');\n panel.setAttribute('aria-hidden', 'false');\n \n const dialog = this.findElement('.acc-report-dialog', panel);\n const focusTarget = dialog || panel;\n if (!focusTarget.hasAttribute('tabindex')) {\n focusTarget.setAttribute('tabindex', '-1');\n }\n \n if (this.reportKeyListener) {\n document.removeEventListener('keydown', this.reportKeyListener, true);\n }\n \n this.reportKeyListener = (event) => {\n if (!panel.classList.contains('acc-report-visible')) return;\n \n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n event.stopPropagation();\n this.closeReportPanel();\n return;\n }\n \n if (event.key !== 'Tab') return;\n \n const focusables = this.getReportFocusableElements(panel);\n if (!focusables.length) {\n event.preventDefault();\n focusTarget.focus();\n return;\n }\n \n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement;\n const outsidePanel = !panel.contains(active);\n \n if (event.shiftKey) {\n if (active === first || outsidePanel) {\n event.preventDefault();\n last.focus();\n }\n return;\n }\n \n if (active === last || outsidePanel) {\n event.preventDefault();\n first.focus();\n }\n };\n \n document.addEventListener('keydown', this.reportKeyListener, true);\n \n requestAnimationFrame(() => {\n const focusables = this.getReportFocusableElements(panel);\n if (focusables.length) {\n focusables[0].focus();\n return;\n }\n focusTarget.focus();\n });\n },\n\n createReportPanel() {\n const panel = document.createElement('div');\n panel.className = 'acc-report-panel acc-container';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-hidden', 'true');\n panel.setAttribute('aria-labelledby', 'acc-report-title');\n \n panel.innerHTML = `\n <div class=\"acc-report-overlay\"></div>\n <div class=\"acc-report-dialog\">\n <div class=\"acc-report-header\">\n <h2 id=\"acc-report-title\" class=\"acc-report-title\">${this.translate('Accessibility Report')}</h2>\n <button type=\"button\" class=\"acc-report-close\" aria-label=\"${this.translate('Close')}\">${this.widgetIcons.close}</button>\n </div>\n <div class=\"acc-report-status\"></div>\n <div class=\"acc-report-content\"></div>\n <div class=\"acc-report-footer\">\n <span class=\"acc-report-powered\">Powered by axe-core</span>\n </div>\n </div>\n `;\n \n // Close handlers\n const closeBtn = panel.querySelector('.acc-report-close');\n const overlay = panel.querySelector('.acc-report-overlay');\n \n closeBtn.addEventListener('click', () => this.closeReportPanel());\n overlay.addEventListener('click', () => this.closeReportPanel());\n \n return panel;\n },\n\n displayReportResults(panel, results) {\n const contentArea = this.findElement('.acc-report-content', panel);\n const statusArea = this.findElement('.acc-report-status', panel);\n \n const violations = results.violations || [];\n const passes = results.passes || [];\n const incomplete = results.incomplete || [];\n \n // Count by severity\n const counts = { critical: 0, serious: 0, moderate: 0, minor: 0 };\n violations.forEach(v => {\n if (counts[v.impact] !== undefined) {\n counts[v.impact] += v.nodes.length;\n }\n });\n \n const totalViolations = Object.values(counts).reduce((a, b) => a + b, 0);\n \n statusArea.textContent = totalViolations > 0\n ? `${totalViolations} ${this.translate('Violations Found')}`\n : this.translate('No Issues Found');\n \n let html = `\n <div class=\"acc-report-summary\">\n <div class=\"acc-report-stat critical\">\n <span class=\"acc-report-stat-value\">${counts.critical}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Critical')}</span>\n </div>\n <div class=\"acc-report-stat serious\">\n <span class=\"acc-report-stat-value\">${counts.serious}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Serious')}</span>\n </div>\n <div class=\"acc-report-stat moderate\">\n <span class=\"acc-report-stat-value\">${counts.moderate}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Moderate')}</span>\n </div>\n <div class=\"acc-report-stat minor\">\n <span class=\"acc-report-stat-value\">${counts.minor}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Minor')}</span>\n </div>\n <div class=\"acc-report-stat passed\">\n <span class=\"acc-report-stat-value\">${passes.length}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Passed Tests')}</span>\n </div>\n </div>\n `;\n \n if (violations.length === 0) {\n html += `\n <div class=\"acc-report-success\">\n <div class=\"acc-report-success-icon\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>\n </div>\n <h3>${this.translate('No Issues Found')}</h3>\n </div>\n `;\n } else {\n html += `<div class=\"acc-report-section\">\n <div class=\"acc-report-section-title\">${this.translate('Violations Found')} (${violations.length})</div>\n `;\n \n // Sort by severity\n const severityOrder = { critical: 0, serious: 1, moderate: 2, minor: 3 };\n violations.sort((a, b) => (severityOrder[a.impact] || 4) - (severityOrder[b.impact] || 4));\n \n violations.forEach((violation, index) => {\n html += `\n <div class=\"acc-report-violation\" data-index=\"${index}\">\n <div class=\"acc-report-violation-header\">\n <span class=\"acc-report-violation-impact ${violation.impact}\">${this.translate(this.capitalizeFirst(violation.impact))}</span>\n <span class=\"acc-report-violation-title\">${this.escapeHtml(violation.help)}</span>\n <span class=\"acc-report-violation-count\">${violation.nodes.length} ${this.translate('Element')}${violation.nodes.length > 1 ? 's' : ''}</span>\n </div>\n <div class=\"acc-report-violation-details\">\n <p class=\"acc-report-violation-desc\">${this.escapeHtml(violation.description)}</p>\n <p class=\"acc-report-violation-help\">\n <a href=\"${violation.helpUrl}\" target=\"_blank\" rel=\"noopener\">${this.translate('How to Fix')} →</a>\n </p>\n ${violation.nodes.slice(0, 5).map(node => `\n <div class=\"acc-report-node\">\n <div class=\"acc-report-node-html\">${this.escapeHtml(node.html)}</div>\n ${node.failureSummary ? `<div class=\"acc-report-node-fix\"><strong>${this.translate('Issue')}:</strong> ${this.escapeHtml(node.failureSummary)}</div>` : ''}\n </div>\n `).join('')}\n ${violation.nodes.length > 5 ? `<p style=\"color:#666;font-size:13px;margin-top:12px;\">... and ${violation.nodes.length - 5} more elements</p>` : ''}\n </div>\n </div>\n `;\n });\n \n html += `</div>`;\n }\n \n if (incomplete.length > 0) {\n html += `\n <div class=\"acc-report-section\">\n <div class=\"acc-report-section-title\">${this.translate('Items Need Review')} (${incomplete.length})</div>\n <p style=\"color:#666;font-size:14px;\">These items require manual verification.</p>\n </div>\n `;\n }\n \n contentArea.innerHTML = html;\n \n // Add click handlers for expandable violations\n contentArea.querySelectorAll('.acc-report-violation-header').forEach(header => {\n header.addEventListener('click', () => {\n header.parentElement.classList.toggle('expanded');\n });\n });\n },\n\n capitalizeFirst(str) {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1);\n },\n\n escapeHtml(str) {\n if (!str) return '';\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n },\n\n closeReportPanel() {\n const panel = this.findElement('.acc-report-panel');\n if (panel) {\n panel.classList.remove('acc-report-visible');\n panel.setAttribute('aria-hidden', 'true');\n }\n \n if (this.reportKeyListener) {\n document.removeEventListener('keydown', this.reportKeyListener, true);\n this.reportKeyListener = null;\n }\n \n const focusTarget = this.reportPreviousFocus;\n this.reportPreviousFocus = null;\n if (focusTarget && typeof focusTarget.focus === 'function') {\n focusTarget.focus();\n }\n },\n\n concealImages(enable = false) {\n const styleId = `acc-hide-images`;\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) existingStyle.remove();\n document.documentElement.classList.toggle(styleId, enable);\n if (enable) {\n const css = `\n body > *:not(.acc-container) img,\n body > *:not(.acc-container) picture,\n body > *:not(.acc-container) svg:not(.acc-container svg),\n body > *:not(.acc-container) video,\n body > *:not(.acc-container) iframe,\n body > *:not(.acc-container) canvas,\n body > *:not(.acc-container) .video,\n body > *:not(.acc-container) .image {\n display: none !important;\n }\n `;\n this.injectStyle(styleId, css);\n }\n },\n\n supportsSpeechSynthesis() {\n if (typeof window === 'undefined') return false;\n return (\n 'speechSynthesis' in window &&\n typeof window.SpeechSynthesisUtterance !== 'undefined'\n );\n },\n\n supportsTextToSpeech() {\n return this.supportsSpeechSynthesis();\n },\n\n normalizeSpeechLanguage(languageCode = 'en') {\n const code = String(languageCode || 'en').toLowerCase();\n const languageMap = {\n en: 'en-US',\n ne: 'ne-NP'\n };\n return languageMap[code] || code;\n },\n\n getNativeTtsRate() {\n const configured = Number(this.nativeTtsConfig?.rate);\n if (!Number.isFinite(configured)) return 1;\n return Math.min(2, Math.max(0.5, configured));\n },\n\n getNativeTtsPitch() {\n const configured = Number(this.nativeTtsConfig?.pitch);\n if (!Number.isFinite(configured)) return 1;\n return Math.min(2, Math.max(0, configured));\n },\n\n isElementVisibleForTts(element) {\n if (!(element instanceof Element)) return false;\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n },\n\n isTtsExcludedElement(element, { allowLandmarkRegions = false } = {}) {\n if (!(element instanceof Element)) return true;\n if (element.closest('.acc-container')) return true;\n if (element.closest('script,style,noscript,template')) return true;\n if (element.closest('[aria-hidden=\"true\"]')) return true;\n if (\n !allowLandmarkRegions &&\n element.closest(\n 'nav,header,footer,aside,form,dialog,[role=\"navigation\"],[role=\"complementary\"],[role=\"search\"],[role=\"menu\"],[role=\"dialog\"],[role=\"alert\"],[aria-live]'\n )\n ) {\n return true;\n }\n return false;\n },\n\n normalizeReadableText(text = '') {\n return String(text)\n .replace(/\\s+/g, ' ')\n .replace(/[ \\t]+([,.;!?])/g, '$1')\n .trim();\n },\n\n getTtsCandidateRoots() {\n const selectors = [\n 'article',\n 'main',\n '[role=\"main\"]',\n '.content',\n '.post',\n '.entry-content',\n '#content'\n ];\n const roots = [];\n const seen = new Set();\n\n selectors.forEach((selector) => {\n document.querySelectorAll(selector).forEach((element) => {\n if (!(element instanceof Element)) return;\n if (this.isTtsExcludedElement(element) || !this.isElementVisibleForTts(element)) return;\n if (seen.has(element)) return;\n seen.add(element);\n roots.push(element);\n });\n });\n\n return roots;\n },\n\n getPrimaryContentRoot() {\n if (typeof document === 'undefined') return null;\n const candidates = this.getTtsCandidateRoots();\n if (!candidates.length) {\n const explicitCandidates = Array.from(\n document.querySelectorAll('main,article,[role=\"main\"],#content,.content,.post,.entry-content')\n ).filter((element) =>\n element instanceof Element &&\n !this.isTtsExcludedElement(element) &&\n this.isElementVisibleForTts(element)\n );\n\n if (explicitCandidates.length) {\n let explicitBest = explicitCandidates[0];\n let explicitBestScore = -1;\n explicitCandidates.forEach((candidate) => {\n const textLength = this.normalizeReadableText(candidate.innerText || candidate.textContent || '').length;\n const rect = candidate.getBoundingClientRect();\n const score = textLength + (rect.width * rect.height * 0.0025);\n if (score > explicitBestScore) {\n explicitBestScore = score;\n explicitBest = candidate;\n }\n });\n return explicitBest;\n }\n\n if (document.body) {\n const topLevelCandidates = Array.from(document.body.children).filter((element) =>\n element instanceof Element &&\n !element.classList.contains('acc-container') &&\n this.isElementVisibleForTts(element)\n );\n\n if (topLevelCandidates.length) {\n let best = topLevelCandidates[0];\n let bestScore = -1;\n topLevelCandidates.forEach((candidate) => {\n const textLength = this.normalizeReadableText(candidate.innerText || candidate.textContent || '').length;\n const rect = candidate.getBoundingClientRect();\n const score = textLength + (rect.width * rect.height * 0.0025);\n if (score > bestScore) {\n bestScore = score;\n best = candidate;\n }\n });\n return best;\n }\n }\n\n return document.body;\n }\n\n let bestRoot = candidates[0];\n let bestScore = -1;\n candidates.forEach((candidate) => {\n const blocks = this.extractReadableBlocks(candidate);\n const score = blocks.join(' ').length;\n if (score > bestScore) {\n bestScore = score;\n bestRoot = candidate;\n }\n });\n return bestRoot;\n },\n\n extractReadableBlocks(root) {\n if (!(root instanceof Element)) return [];\n const blockSelector = 'h1,h2,h3,h4,h5,h6,p,li,dt,dd,blockquote,figcaption,caption,th,td';\n const blocks = [];\n root.querySelectorAll(blockSelector).forEach((element) => {\n if (!(element instanceof Element)) return;\n if (this.isTtsExcludedElement(element) || !this.isElementVisibleForTts(element)) return;\n const text = this.normalizeReadableText(element.innerText || element.textContent || '');\n if (text.length < 15) return;\n blocks.push(text);\n });\n return blocks;\n },\n\n getReadableContent() {\n if (typeof document === 'undefined') return '';\n const candidateRoots = this.getTtsCandidateRoots();\n let bestBlocks = [];\n let bestScore = -1;\n\n candidateRoots.forEach((root) => {\n const blocks = this.extractReadableBlocks(root);\n if (!blocks.length) return;\n const characterCount = blocks.join(' ').length;\n const score = (blocks.length * 60) + characterCount;\n if (score > bestScore) {\n bestScore = score;\n bestBlocks = blocks;\n }\n });\n\n if (!bestBlocks.length && document.body) {\n bestBlocks = this.extractReadableBlocks(document.body);\n }\n\n if (!bestBlocks.length && document.body) {\n const fallback = this.normalizeReadableText(document.body.innerText || document.body.textContent || '');\n return fallback.slice(0, 30000);\n }\n\n return bestBlocks.join('\\n\\n').slice(0, 30000);\n },\n\n splitLongSpeechSegment(segment, maxLength = 240) {\n if (!segment) return [];\n if (segment.length <= maxLength) return [segment];\n\n const parts = [];\n let remaining = segment;\n while (remaining.length > maxLength) {\n let splitIndex = remaining.lastIndexOf(',', maxLength);\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = remaining.lastIndexOf(' ', maxLength);\n }\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = maxLength;\n }\n parts.push(remaining.slice(0, splitIndex).trim());\n remaining = remaining.slice(splitIndex).trim();\n }\n if (remaining.length) {\n parts.push(remaining);\n }\n return parts.filter(Boolean);\n },\n\n buildSpeechQueue(text = '') {\n const normalized = this.normalizeReadableText(text);\n if (!normalized) return [];\n\n const paragraphCandidates = text\n .split(/\\n{2,}/)\n .map((paragraph) => this.normalizeReadableText(paragraph))\n .filter(Boolean);\n\n const paragraphs = paragraphCandidates.length ? paragraphCandidates : [normalized];\n const queue = [];\n\n paragraphs.forEach((paragraph) => {\n const sentences = paragraph.split(/(?<=[.!?])\\s+/).filter(Boolean);\n const sentenceList = sentences.length ? sentences : [paragraph];\n let chunk = '';\n\n sentenceList.forEach((sentence) => {\n const next = chunk ? `${chunk} ${sentence}` : sentence;\n if (next.length <= 240) {\n chunk = next;\n return;\n }\n if (chunk) {\n queue.push(...this.splitLongSpeechSegment(chunk, 240));\n }\n chunk = sentence;\n });\n\n if (chunk) {\n queue.push(...this.splitLongSpeechSegment(chunk, 240));\n }\n });\n\n return queue.slice(0, 300);\n },\n\n resolveSpeechVoice(languageCode) {\n if (!this.supportsSpeechSynthesis()) return null;\n const synth = window.speechSynthesis;\n const voices = synth.getVoices?.() || [];\n if (!voices.length) return null;\n\n const preferredVoiceName = String(this.nativeTtsConfig?.preferredVoiceName || '').trim().toLowerCase();\n if (preferredVoiceName) {\n const byExactName = voices.find((voice) => String(voice.name || '').trim().toLowerCase() === preferredVoiceName);\n if (byExactName) return byExactName;\n const byNameContains = voices.find((voice) => String(voice.name || '').toLowerCase().includes(preferredVoiceName));\n if (byNameContains) return byNameContains;\n }\n\n const configuredVoiceLang = String(this.nativeTtsConfig?.preferredVoiceLang || '').trim();\n const targetLanguage = configuredVoiceLang || languageCode;\n const normalized = this.normalizeSpeechLanguage(targetLanguage).toLowerCase();\n const primary = normalized.split('-')[0];\n const localExact = voices.find((voice) => (\n voice.localService &&\n String(voice.lang || '').toLowerCase() === normalized\n ));\n const exact = voices.find((voice) => String(voice.lang || '').toLowerCase() === normalized);\n const localByPrimary = voices.find((voice) => (\n voice.localService &&\n String(voice.lang || '').toLowerCase().startsWith(primary)\n ));\n const byPrimary = voices.find((voice) => String(voice.lang || '').toLowerCase().startsWith(primary));\n const defaultVoice = voices.find((voice) => voice.default);\n return localExact || exact || localByPrimary || byPrimary || defaultVoice || voices[0];\n },\n\n getSpeechTargetFromEvent(event) {\n const target = event?.target;\n if (!(target instanceof Element)) return null;\n if (target.closest('.acc-container')) return null;\n\n const block = target.closest('h1,h2,h3,h4,h5,h6,p,li,dt,dd,blockquote,figcaption,caption,th,td,div,section');\n if (!(block instanceof Element)) return null;\n if (this.isTtsExcludedElement(block, { allowLandmarkRegions: true }) || !this.isElementVisibleForTts(block)) return null;\n\n const text = this.normalizeReadableText(block.innerText || block.textContent || '');\n if (text.length < 2) return null;\n\n return {\n element: block,\n text: text.slice(0, 30000)\n };\n },\n\n setActiveSpeechTarget(element = null) {\n if (this.ttsActiveTarget && this.ttsActiveTarget !== element) {\n this.ttsActiveTarget.classList.remove('acc-tts-active-block');\n }\n this.ttsActiveTarget = element;\n if (this.ttsActiveTarget) {\n this.ttsActiveTarget.classList.add('acc-tts-active-block');\n }\n },\n\n startTtsClickMode() {\n if (typeof document === 'undefined' || this.ttsClickListener) return;\n this.ttsClickListener = (event) => {\n this.handleTtsClick(event);\n };\n document.addEventListener('click', this.ttsClickListener, true);\n document.body?.classList.add('acc-tts-click-mode');\n },\n\n stopTtsClickMode() {\n if (typeof document === 'undefined') return;\n if (this.ttsClickListener) {\n document.removeEventListener('click', this.ttsClickListener, true);\n this.ttsClickListener = null;\n }\n document.body?.classList.remove('acc-tts-click-mode');\n this.setActiveSpeechTarget(null);\n },\n\n handleTtsClick(event) {\n if (!this.retrieveState('text-to-speech')) return;\n const target = this.getSpeechTargetFromEvent(event);\n if (!target) return;\n\n this.setActiveSpeechTarget(target.element);\n this.ttsTextCache = target.text;\n this.startSpeechPlayback({ restart: true });\n },\n\n ensureTtsQueue() {\n const text = this.ttsTextCache || this.getReadableContent();\n if (!text) {\n this.ttsQueue = [];\n this.ttsQueueIndex = 0;\n return false;\n }\n this.ttsTextCache = text;\n this.ttsQueue = this.buildSpeechQueue(text);\n this.ttsQueueIndex = 0;\n return this.ttsQueue.length > 0;\n },\n\n speakNextTtsChunk(sessionId) {\n if (!this.supportsSpeechSynthesis()) return;\n if (sessionId !== this.ttsSessionId) return;\n\n if (this.ttsQueueIndex >= this.ttsQueue.length) {\n this.ttsStatus = 'stopped';\n this.setActiveSpeechTarget(null);\n return;\n }\n\n const synth = window.speechSynthesis;\n const chunk = this.ttsQueue[this.ttsQueueIndex];\n if (!chunk) {\n this.ttsQueueIndex += 1;\n this.speakNextTtsChunk(sessionId);\n return;\n }\n\n const utterance = new window.SpeechSynthesisUtterance(chunk);\n utterance.lang = this.normalizeSpeechLanguage(this.loadConfig().lang || 'en');\n if (!this.ttsVoice || this.ttsVoice.lang?.toLowerCase() !== utterance.lang.toLowerCase()) {\n this.ttsVoice = this.resolveSpeechVoice(utterance.lang);\n }\n if (this.ttsVoice) {\n utterance.voice = this.ttsVoice;\n }\n utterance.rate = this.getNativeTtsRate();\n utterance.pitch = this.getNativeTtsPitch();\n\n utterance.onstart = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'reading';\n };\n utterance.onpause = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'paused';\n };\n utterance.onresume = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'reading';\n };\n utterance.onend = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsQueueIndex += 1;\n this.speakNextTtsChunk(sessionId);\n };\n utterance.onerror = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'stopped';\n this.setActiveSpeechTarget(null);\n };\n\n this.ttsUtterance = utterance;\n synth.speak(utterance);\n },\n\n startNativeSpeechPlayback({ restart = false } = {}) {\n if (!this.supportsSpeechSynthesis()) return;\n const synth = window.speechSynthesis;\n\n if (!restart && synth.paused) {\n synth.resume();\n this.ttsStatus = 'reading';\n return;\n }\n\n const hasQueue = restart || !this.ttsQueue.length || this.ttsQueueIndex >= this.ttsQueue.length\n ? this.ensureTtsQueue()\n : true;\n if (!hasQueue) {\n this.stopSpeech();\n return;\n }\n\n const sessionId = this.ttsSessionId + 1;\n this.ttsSessionId = sessionId;\n synth.cancel();\n this.ttsStatus = 'reading';\n this.speakNextTtsChunk(sessionId);\n },\n\n startSpeechPlayback({ restart = false } = {}) {\n this.startNativeSpeechPlayback({ restart });\n },\n\n pauseSpeech() {\n if (!this.supportsSpeechSynthesis()) return;\n const synth = window.speechSynthesis;\n if (synth.speaking && !synth.paused) {\n synth.pause();\n this.ttsStatus = 'paused';\n }\n },\n\n resumeSpeech() {\n if (!this.supportsSpeechSynthesis()) return;\n const synth = window.speechSynthesis;\n if (synth.paused) {\n synth.resume();\n this.ttsStatus = 'reading';\n return;\n }\n this.startSpeechPlayback({ restart: false });\n },\n\n stopSpeech() {\n const synth = this.supportsSpeechSynthesis() ? window.speechSynthesis : null;\n this.ttsSessionId += 1;\n if (synth && (synth.speaking || synth.paused)) {\n synth.cancel();\n }\n this.ttsUtterance = null;\n this.ttsQueueIndex = 0;\n this.ttsStatus = 'stopped';\n this.setActiveSpeechTarget(null);\n },\n\n enableTextToSpeech(enable = false) {\n if (!this.supportsTextToSpeech()) return;\n const isUserToggle = this.userInitiatedToggleKey === 'text-to-speech';\n\n if (!enable) {\n if (isUserToggle) this.announceTtsState(false);\n this.stopSpeech();\n this.stopTtsClickMode();\n return;\n }\n\n const synth = window.speechSynthesis;\n if (synth?.getVoices) {\n synth.getVoices();\n }\n\n this.startTtsClickMode();\n this.ttsStatus = 'idle';\n if (isUserToggle) this.announceTtsState(true);\n },\n\n announceTtsState(active) {\n if (!this.supportsTextToSpeech()) return;\n const synth = window.speechSynthesis;\n if (!synth) return;\n const msg = active\n ? this.translate('Text to Speech On')\n : this.translate('Text to Speech Off');\n synth.cancel();\n const utterance = new SpeechSynthesisUtterance(msg);\n const lang = this.normalizeSpeechLanguage(this.loadConfig().lang || 'en');\n utterance.lang = lang;\n const voice = this.resolveSpeechVoice(lang);\n if (voice) {\n utterance.voice = voice;\n }\n utterance.rate = this.getNativeTtsRate();\n utterance.pitch = this.getNativeTtsPitch();\n synth.speak(utterance);\n },\n\n ensureAnnotationLayer() {\n if (this.annotationLayer && document.body.contains(this.annotationLayer)) {\n return this.annotationLayer;\n }\n const layer = document.createElement('div');\n layer.className = 'acc-annotation-layer acc-container';\n layer.setAttribute('aria-hidden', 'true');\n document.body.appendChild(layer);\n this.annotationLayer = layer;\n return layer;\n },\n\n resolveAnnotationTarget(selector) {\n if (!selector || typeof selector !== 'string') return null;\n try {\n const element = document.querySelector(selector);\n if (!element || element.closest('.acc-container')) return null;\n return element;\n } catch {\n return null;\n }\n },\n\n buildAnnotationEntries(results = {}) {\n const violations = Array.isArray(results.violations) ? results.violations : [];\n const entries = [];\n const seen = new Set();\n\n violations.forEach((violation) => {\n const nodes = Array.isArray(violation.nodes) ? violation.nodes : [];\n nodes.forEach((node) => {\n const targets = Array.isArray(node.target) ? node.target : [];\n const selector = targets.find((target) => typeof target === 'string' && target.trim().length);\n if (!selector) return;\n const key = `${selector}::${violation.id || violation.help || ''}`;\n if (seen.has(key)) return;\n\n const element = this.resolveAnnotationTarget(selector);\n if (!element) return;\n seen.add(key);\n entries.push({\n selector,\n element,\n impact: violation.impact || 'minor',\n title: violation.help || this.translate('Issue'),\n description: violation.description || '',\n helpUrl: violation.helpUrl || '',\n failureSummary: node.failureSummary || ''\n });\n });\n });\n\n return entries.slice(0, MAX_ANNOTATIONS);\n },\n\n createAnnotationMarker(annotation) {\n const marker = document.createElement('button');\n marker.type = 'button';\n marker.className = 'acc-annotation-marker';\n marker.dataset.impact = annotation.impact || 'minor';\n marker.setAttribute('aria-label', annotation.title);\n marker.title = annotation.title;\n marker.innerHTML = '';\n\n marker.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.showAnnotationPopup(annotation, marker);\n });\n\n return marker;\n },\n\n positionAnnotationPopup(popup, marker) {\n if (!popup || !marker) return;\n const markerRect = marker.getBoundingClientRect();\n const popupWidth = popup.offsetWidth || 300;\n const popupHeight = popup.offsetHeight || 180;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 10;\n\n let left = window.scrollX + markerRect.left + gap;\n let top = window.scrollY + markerRect.bottom + gap;\n\n if (left + popupWidth > window.scrollX + viewportWidth - gap) {\n left = window.scrollX + viewportWidth - popupWidth - gap;\n }\n if (left < window.scrollX + gap) {\n left = window.scrollX + gap;\n }\n\n if (top + popupHeight > window.scrollY + viewportHeight - gap) {\n top = window.scrollY + markerRect.top - popupHeight - gap;\n }\n if (top < window.scrollY + gap) {\n top = window.scrollY + gap;\n }\n\n popup.style.left = `${left}px`;\n popup.style.top = `${top}px`;\n },\n\n clearAnnotationPopup() {\n if (this.annotationPopup) {\n this.annotationPopup.remove();\n this.annotationPopup = null;\n }\n },\n\n showAnnotationPopup(annotation, marker) {\n if (!annotation || !marker || !this.annotationLayer) return;\n this.clearAnnotationPopup();\n\n const popup = document.createElement('div');\n popup.className = 'acc-annotation-popup';\n popup.innerHTML = `\n <div class=\"acc-annotation-popup-header\">\n <h3 class=\"acc-annotation-popup-title\">${this.escapeHtml(annotation.title)}</h3>\n <button type=\"button\" class=\"acc-annotation-popup-close\" aria-label=\"${this.translate('Close')}\">${this.widgetIcons.close}</button>\n </div>\n <p><strong>${this.translate(this.capitalizeFirst(annotation.impact))}</strong></p>\n <p>${this.escapeHtml(annotation.description)}</p>\n ${annotation.failureSummary ? `<p><strong>${this.translate('Issue')}:</strong> ${this.escapeHtml(annotation.failureSummary)}</p>` : ''}\n ${annotation.helpUrl ? `<p><a href=\"${annotation.helpUrl}\" target=\"_blank\" rel=\"noopener\">${this.translate('How to Fix')} →</a></p>` : ''}\n `;\n popup.__accMarker = marker;\n\n const closeButton = popup.querySelector('.acc-annotation-popup-close');\n closeButton?.addEventListener('click', () => this.clearAnnotationPopup());\n\n this.annotationLayer.appendChild(popup);\n this.annotationPopup = popup;\n this.positionAnnotationPopup(popup, marker);\n },\n\n positionAnnotations() {\n if (!Array.isArray(this.annotationItems) || !this.annotationItems.length) return;\n\n this.annotationItems.forEach((item) => {\n if (!item?.target || !item?.marker) return;\n if (!document.contains(item.target)) {\n item.marker.hidden = true;\n return;\n }\n\n const rect = item.target.getBoundingClientRect();\n const outOfView = (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.bottom < 0 ||\n rect.top > window.innerHeight ||\n rect.right < 0 ||\n rect.left > window.innerWidth\n );\n\n if (outOfView) {\n item.marker.hidden = true;\n return;\n }\n\n item.marker.hidden = false;\n item.marker.style.top = `${window.scrollY + rect.top + Math.min(16, rect.height / 2)}px`;\n item.marker.style.left = `${window.scrollX + rect.right}px`;\n });\n\n if (this.annotationPopup?.__accMarker && !this.annotationPopup.__accMarker.hidden) {\n this.positionAnnotationPopup(this.annotationPopup, this.annotationPopup.__accMarker);\n }\n },\n\n enableAnnotations(enable = false) {\n if (!enable) {\n this.disableAnnotations();\n return;\n }\n\n const requestId = ++this.annotationRequestId;\n this.disableAnnotations({ cancelPending: false });\n const layer = this.ensureAnnotationLayer();\n\n this.runBackgroundAxeScan()\n .then((results) => {\n if (requestId !== this.annotationRequestId || !this.retrieveState('annotations')) {\n return;\n }\n const annotations = this.buildAnnotationEntries(results);\n this.annotationItems = annotations.map((annotation) => {\n const marker = this.createAnnotationMarker(annotation);\n layer.appendChild(marker);\n return {\n marker,\n target: annotation.element,\n data: annotation\n };\n });\n\n if (!this.annotationRepositionHandler) {\n this.annotationRepositionHandler = this.throttle(() => this.positionAnnotations(), 80);\n }\n window.addEventListener('scroll', this.annotationRepositionHandler, { passive: true });\n window.addEventListener('resize', this.annotationRepositionHandler, { passive: true });\n\n if (!this.annotationOutsideHandler) {\n this.annotationOutsideHandler = (event) => {\n if (!this.annotationPopup) return;\n const clickedPopup = this.annotationPopup.contains(event.target);\n const clickedMarker = event.target?.closest?.('.acc-annotation-marker');\n if (!clickedPopup && !clickedMarker) {\n this.clearAnnotationPopup();\n }\n };\n }\n document.addEventListener('click', this.annotationOutsideHandler, true);\n\n this.positionAnnotations();\n })\n .catch((error) => {\n console.warn('Failed to render annotations:', error);\n });\n },\n\n disableAnnotations({ cancelPending = true } = {}) {\n if (cancelPending) {\n this.annotationRequestId += 1;\n }\n this.clearAnnotationPopup();\n\n if (this.annotationOutsideHandler) {\n document.removeEventListener('click', this.annotationOutsideHandler, true);\n }\n if (this.annotationRepositionHandler) {\n window.removeEventListener('scroll', this.annotationRepositionHandler);\n window.removeEventListener('resize', this.annotationRepositionHandler);\n }\n\n if (this.annotationLayer) {\n this.annotationLayer.remove();\n this.annotationLayer = null;\n }\n\n this.annotationItems = [];\n },\n\n\n clearSimpleLayoutDomMutations() {\n if (this.simpleLayoutRoot) {\n this.simpleLayoutRoot.classList.remove('acc-simple-layout-root');\n this.simpleLayoutRoot = null;\n }\n\n if (Array.isArray(this.simpleLayoutHiddenElements)) {\n this.simpleLayoutHiddenElements.forEach((element) => {\n if (element && element.classList) {\n element.classList.remove('acc-simple-layout-hidden');\n }\n });\n }\n this.simpleLayoutHiddenElements = [];\n },\n\n applySimpleLayoutDomMutations() {\n const root = this.getPrimaryContentRoot();\n if (!root || !document.body) return;\n\n this.simpleLayoutRoot = root;\n root.classList.add('acc-simple-layout-root');\n\n const hiddenElements = [];\n Array.from(document.body.children).forEach((child) => {\n if (!(child instanceof Element)) return;\n if (child.classList.contains('acc-container')) return;\n if (child === root || child.contains(root)) return;\n child.classList.add('acc-simple-layout-hidden');\n hiddenElements.push(child);\n });\n\n const clutterSelectors = [\n 'aside',\n 'nav',\n 'form',\n 'footer',\n '[role=\"complementary\"]',\n '[role=\"search\"]',\n '[role=\"contentinfo\"]',\n '[aria-hidden=\"true\"]',\n '[class*=\"cookie\"]',\n '[id*=\"cookie\"]',\n '[class*=\"banner\"]',\n '[id*=\"banner\"]',\n '[class*=\"popup\"]',\n '[id*=\"popup\"]',\n '[class*=\"modal\"]',\n '[id*=\"modal\"]',\n '[class*=\"advert\"]',\n '[id*=\"advert\"]',\n '[class*=\"ads\"]',\n '[id*=\"ads\"]',\n '[class*=\"sidebar\"]',\n '[id*=\"sidebar\"]',\n '[class*=\"social\"]',\n '[id*=\"social\"]',\n '[class*=\"share\"]',\n '[id*=\"share\"]',\n '[class*=\"newsletter\"]',\n '[id*=\"newsletter\"]',\n '[class*=\"related\"]',\n '[id*=\"related\"]',\n '[class*=\"comment\"]',\n '[id*=\"comment\"]',\n '[class*=\"footer\"]',\n '[id*=\"footer\"]',\n '[class*=\"promo\"]',\n '[id*=\"promo\"]'\n ].join(',');\n\n root.querySelectorAll(clutterSelectors).forEach((element) => {\n if (!(element instanceof Element)) return;\n if (element.closest('.acc-container')) return;\n if (element === root) return;\n element.classList.add('acc-simple-layout-hidden');\n hiddenElements.push(element);\n });\n\n this.simpleLayoutHiddenElements = hiddenElements;\n },\n\n enableSimpleLayout(enable = false) {\n const S = 'body.acc-simple-layout-enabled';\n const R = `${S} .acc-simple-layout-root`;\n const X = ':not(.acc-container):not(.acc-container *)';\n const config = {\n id: 'simple-layout',\n css: `\n /* ── Body & root container ── */\n ${S} {\n background: #fff !important;\n }\n\n ${S} .acc-simple-layout-hidden {\n display: none !important;\n }\n\n ${R} {\n max-width: 72ch !important;\n margin: 0 auto !important;\n padding: clamp(20px, 4vw, 40px) 20px !important;\n position: relative !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n }\n\n /* ── Universal decoration strip ── */\n ${R} :where(*)${X} {\n background-color: transparent !important;\n background-image: none !important;\n box-shadow: none !important;\n text-shadow: none !important;\n border-color: transparent !important;\n }\n\n /* ── Layout linearization ── */\n ${R} :where(div, section, article, header, main, footer, figure, figcaption, details, summary, hgroup, search)${X} {\n display: block !important;\n position: static !important;\n float: none !important;\n transform: none !important;\n columns: auto !important;\n column-count: auto !important;\n width: auto !important;\n min-width: 0 !important;\n max-width: 100% !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n /* ── Color reset ── */\n ${R} :where(h1, h2, h3, h4, h5, h6)${X} {\n color: #111 !important;\n }\n\n ${R} :where(p, li, dt, dd, td, th, span, blockquote, figcaption, label, summary, details)${X} {\n color: #222 !important;\n }\n\n ${R} :where(a)${X} {\n color: #1a0dab !important;\n }\n\n ${R} :where(a:visited)${X} {\n color: #681da8 !important;\n }\n\n /* ── Typography ── */\n ${R} :where(*)${X} {\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !important;\n }\n\n ${R} :where(p, li, dt, dd, blockquote, figcaption, td, th, label, summary)${X} {\n font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem) !important;\n line-height: 1.8 !important;\n letter-spacing: 0.01em !important;\n max-width: 70ch !important;\n }\n\n ${R} :where(h1)${X} {\n font-size: 2em !important;\n line-height: 1.2 !important;\n margin: 0.67em 0 !important;\n font-weight: 700 !important;\n }\n\n ${R} :where(h2)${X} {\n font-size: 1.5em !important;\n line-height: 1.25 !important;\n margin: 0.83em 0 !important;\n font-weight: 700 !important;\n }\n\n ${R} :where(h3)${X} {\n font-size: 1.25em !important;\n line-height: 1.3 !important;\n margin: 1em 0 !important;\n font-weight: 600 !important;\n }\n\n ${R} :where(h4, h5, h6)${X} {\n font-size: 1.1em !important;\n line-height: 1.35 !important;\n margin: 1em 0 !important;\n font-weight: 600 !important;\n }\n\n /* ── Decorative images hidden ── */\n ${R} :where(img[role=\"presentation\"], img[alt=\"\"], img:not([alt]), svg[aria-hidden=\"true\"])${X} {\n display: none !important;\n }\n\n /* ── Meaningful borders restored ── */\n ${R} :where(hr)${X} {\n border: none !important;\n border-top: 1px solid #d1d5db !important;\n margin: 1.5em 0 !important;\n }\n\n ${R} :where(blockquote)${X} {\n border-left: 4px solid #d1d5db !important;\n padding-left: 1em !important;\n margin-left: 0 !important;\n font-style: italic !important;\n }\n\n ${R} :where(table)${X} {\n border-collapse: collapse !important;\n max-width: 100% !important;\n overflow-x: auto !important;\n display: table !important;\n }\n\n ${R} :where(th, td)${X} {\n border: 1px solid #d1d5db !important;\n padding: 8px 12px !important;\n text-align: left !important;\n }\n\n ${R} :where(th)${X} {\n font-weight: 600 !important;\n background: #f8f9fa !important;\n }\n\n /* ── Lists ── */\n ${R} :where(ul, ol)${X} {\n padding-left: 1.5em !important;\n margin: 0.75em 0 !important;\n }\n\n ${R} :where(li)${X} {\n display: list-item !important;\n margin: 0.25em 0 !important;\n }\n\n /* ── Code blocks ── */\n ${R} :where(pre)${X} {\n background: #f6f8fa !important;\n border-radius: 6px !important;\n padding: 1em !important;\n overflow-x: auto !important;\n max-width: 100% !important;\n }\n\n ${R} :where(code, kbd, samp)${X} {\n font-family: ui-monospace, \"SFMono-Regular\", \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace !important;\n font-size: 0.9em !important;\n }\n\n ${R} :where(code):not(pre code)${X} {\n background: #f0f2f5 !important;\n padding: 0.15em 0.4em !important;\n border-radius: 3px !important;\n }\n\n /* ── Empty wrapper collapse ── */\n ${R} :where(div:empty)${X} {\n display: none !important;\n }\n\n /* ── Media ── */\n ${R} :where(img, video, iframe)${X} {\n max-width: 100% !important;\n height: auto !important;\n border-radius: 4px !important;\n }\n `\n };\n\n this.applyToolStyle({ ...config, enable });\n document.body?.classList.toggle('acc-simple-layout-enabled', !!enable);\n\n this.clearSimpleLayoutDomMutations();\n if (enable) {\n this.applySimpleLayoutDomMutations();\n }\n },\n\n applyEnhancements() {\n const { states } = this.loadConfig();\n // Handle font size scaling\n const hasTextScaleState = !!(states && Object.prototype.hasOwnProperty.call(states, 'text-scale'));\n if (hasTextScaleState) {\n const storedScale = states['text-scale'] === false ? 1 : states['text-scale'];\n const appliedScale = this.setTextScaleFromPercent(storedScale, { persist: false });\n this.syncTextScaleControlUI(document.querySelector('.acc-menu'), appliedScale);\n } else {\n this.textScaleIndex = 0;\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = -1;\n }\n this.scaleText(1);\n this.syncTextScaleControlUI(document.querySelector('.acc-menu'), 1);\n }\n // Apply other enhancements\n this.concealImages(states && states['hide-images']);\n this.highlightTitles(states && states['highlight-title']);\n this.highlightLinks(states && states['highlight-links']);\n this.adjustLetterSpacing(states && states['letter-spacing']);\n this.adjustLineSpacing(states && states['line-spacing']);\n this.enableBoldText(states && states['bold-text']);\n this.enableReadableText(states && states['readable-text']);\n this.enableReadingAid(states && states['reading-aid']);\n this.pauseMotion(states && states['pause-motion']);\n this.enableLargePointer(states && states['large-pointer']);\n this.enableHighContrastMode(states && states['high-contrast-mode']);\n this.enableAnnotations(states && states['annotations']);\n this.enableTextToSpeech(states && states['text-to-speech']);\n this.enableSimpleLayout(states && states['simple-layout']);\n },\n\n isColorFilterKey(key) {\n return Array.isArray(this.colorFilterKeys) && this.colorFilterKeys.includes(key);\n },\n\n getActiveColorFilterKey(states = this.widgetConfig.states) {\n if (!this.colorFilterKeys || !this.colorFilterKeys.length) return null;\n if (!states) return this.activeColorFilterKey || null;\n for (const key of this.colorFilterKeys) {\n if (states[key]) {\n return key;\n }\n }\n return null;\n },\n\n setColorFilterUI(menu, activeKey = null) {\n if (!menu || !menu.querySelectorAll) return;\n const contrastFeature = this.multiLevelFeatures?.['contrast-toggle'];\n const contrastButton = menu.querySelector('.acc-btn[data-key=\"contrast-toggle\"]');\n if (contrastFeature) {\n const contrastIndex = contrastFeature.values.indexOf(activeKey);\n contrastFeature.currentIndex = contrastIndex;\n this.updateContrastToggleButton(contrastButton, contrastIndex);\n if (contrastButton) {\n const isContrastActive = contrastIndex >= 0;\n contrastButton.classList.toggle('acc-selected', isContrastActive);\n contrastButton.setAttribute('aria-pressed', isContrastActive ? 'true' : 'false');\n const indicator = contrastButton.querySelector('.acc-progress-indicator[data-feature=\"contrast-toggle\"]');\n if (indicator) {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach((dot, index) => {\n dot.classList.toggle('active', index === contrastIndex);\n });\n }\n }\n }\n const saturationFeature = this.multiLevelFeatures?.['saturation-toggle'];\n const saturationButton = menu.querySelector('.acc-btn[data-key=\"saturation-toggle\"]');\n if (saturationFeature) {\n const saturationIndex = saturationFeature.values.indexOf(activeKey);\n saturationFeature.currentIndex = saturationIndex;\n this.updateSaturationToggleButton(saturationButton, saturationIndex);\n if (saturationButton) {\n const isSaturationActive = saturationIndex >= 0;\n saturationButton.classList.toggle('acc-selected', isSaturationActive);\n saturationButton.setAttribute('aria-pressed', isSaturationActive ? 'true' : 'false');\n const indicator = saturationButton.querySelector('.acc-progress-indicator[data-feature=\"saturation-toggle\"]');\n if (indicator) {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach((dot, index) => {\n dot.classList.toggle('active', index === saturationIndex);\n });\n }\n }\n }\n this.colorFilterKeys.forEach(filterKey => {\n const button = menu.querySelector(`.acc-btn[data-key=\"${filterKey}\"]`);\n if (!button) return;\n const isActive = filterKey === activeKey;\n button.classList.toggle('acc-selected', isActive);\n button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n });\n },\n\n updateColorFilterState(activeKey = null, source = 'user') {\n if (!this.colorFilterKeys || !this.colorFilterKeys.length) {\n this.activeColorFilterKey = null;\n return;\n }\n const states = this.widgetConfig.states || {};\n const payload = {};\n let requiresUpdate = false;\n this.colorFilterKeys.forEach(filterKey => {\n const rawCurrent = states[filterKey];\n const shouldBeActive = activeKey === filterKey;\n if (shouldBeActive) {\n if (rawCurrent !== true) {\n payload[filterKey] = true;\n requiresUpdate = true;\n }\n } else if (rawCurrent) {\n payload[filterKey] = false;\n requiresUpdate = true;\n }\n });\n if (requiresUpdate) {\n this.updateState(payload, { source });\n }\n this.activeColorFilterKey = activeKey;\n },\n\n computeFilteredBodyColor(filterKey) {\n const bg = window.getComputedStyle(document.body).backgroundColor;\n const m = bg.match(/rgba?\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!m) return null;\n let r = +m[1], g = +m[2], b = +m[3];\n const clamp = (v) => Math.min(255, Math.max(0, Math.round(v)));\n\n switch (filterKey) {\n case 'invert-colors':\n r = 255 - r; g = 255 - g; b = 255 - b;\n break;\n case 'dark-contrast': {\n // filter: contrast(150%) brightness(0.8) — applied left to right\n r = 128 + (r - 128) * 1.5; g = 128 + (g - 128) * 1.5; b = 128 + (b - 128) * 1.5;\n r *= 0.8; g *= 0.8; b *= 0.8;\n break;\n }\n case 'light-contrast': {\n // filter: contrast(125%) brightness(1.2)\n r = 128 + (r - 128) * 1.25; g = 128 + (g - 128) * 1.25; b = 128 + (b - 128) * 1.25;\n r *= 1.2; g *= 1.2; b *= 1.2;\n break;\n }\n case 'low-saturation': {\n // filter: saturate(50%) — use standard saturate matrix with s=0.5\n const s = 0.5;\n const nr = (0.213 + 0.787 * s) * r + (0.715 - 0.715 * s) * g + (0.072 - 0.072 * s) * b;\n const ng = (0.213 - 0.213 * s) * r + (0.715 + 0.285 * s) * g + (0.072 - 0.072 * s) * b;\n const nb = (0.213 - 0.213 * s) * r + (0.715 - 0.715 * s) * g + (0.072 + 0.928 * s) * b;\n r = nr; g = ng; b = nb;\n break;\n }\n case 'high-saturation': {\n // filter: saturate(200%) — use standard saturate matrix with s=2\n const s2 = 2;\n const hr = (0.213 + 0.787 * s2) * r + (0.715 - 0.715 * s2) * g + (0.072 - 0.072 * s2) * b;\n const hg = (0.213 - 0.213 * s2) * r + (0.715 + 0.285 * s2) * g + (0.072 - 0.072 * s2) * b;\n const hb = (0.213 - 0.213 * s2) * r + (0.715 - 0.715 * s2) * g + (0.072 + 0.928 * s2) * b;\n r = hr; g = hg; b = hb;\n break;\n }\n default:\n return null;\n }\n r = clamp(r); g = clamp(g); b = clamp(b);\n // Skip if the result is the same as the original (no visible change)\n if (r === +m[1] && g === +m[2] && b === +m[3]) return null;\n return `rgb(${r},${g},${b})`;\n },\n\n applyVisualFilters() {\n const { states } = this.loadConfig();\n const activeKey = this.getActiveColorFilterKey(states);\n this.activeColorFilterKey = activeKey;\n \n if (!activeKey) {\n const style = document.getElementById('acc-filter-style');\n if (style) style.remove();\n return;\n }\n const filter = this.visualFilters[activeKey];\n if (!filter) {\n const style = document.getElementById('acc-filter-style');\n if (style) style.remove();\n return;\n }\n const adjustedFilter = {\n ...filter,\n selector: filter.selector || 'body > *:not(.acc-container):not(.acc-rg-container):not(#acc-skip-link)'\n };\n let css = this.buildCSS(adjustedFilter);\n\n // Compute a filtered body background so the body itself matches\n // the visual filter applied to its children.\n const filteredBg = this.computeFilteredBodyColor(activeKey);\n if (filteredBg) {\n css += `body{background-color:${filteredBg}!important;}`;\n }\n\n this.injectStyle('acc-filter-style', css);\n },\n\n cycleTextScale(enable = false) {\n if (enable) {\n this.textScaleIndex = (this.textScaleIndex + 1) % this.textScaleValues.length;\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = this.textScaleIndex;\n }\n } else {\n this.textScaleIndex = 0;\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = -1;\n }\n }\n const progressIndicator = document.querySelector(`.acc-progress-indicator[data-feature=\"text-scale\"]`);\n if (progressIndicator) {\n const dots = progressIndicator.querySelectorAll('.acc-progress-dot');\n dots.forEach(dot => dot.classList.remove('active'));\n if (enable && this.textScaleIndex < dots.length) {\n dots[this.textScaleIndex].classList.add('active');\n }\n }\n const multiply = enable ? this.textScaleValues[this.textScaleIndex] : 1;\n this.scaleText(multiply);\n this.updateState({ 'text-scale': multiply });\n return this.textScaleIndex;\n },\n\n cycleMultiLevelFeature(featureKey, button) {\n const feature = this.multiLevelFeatures[featureKey];\n if (!feature || !button) return;\n\n if (featureKey === 'contrast-toggle' || featureKey === 'saturation-toggle') {\n const newIndex = feature.currentIndex + 1;\n const newActiveKey = newIndex >= feature.levels ? null : feature.values[newIndex];\n this.updateColorFilterState(newActiveKey);\n this.setColorFilterUI(button.closest('.acc-menu'), newActiveKey);\n this.applyVisualFilters();\n return;\n }\n\n const newIndex = feature.currentIndex + 1;\n if (newIndex >= feature.levels) {\n feature.currentIndex = -1;\n button.classList.remove('acc-selected');\n button.setAttribute('aria-pressed', 'false');\n this.updateState({ [featureKey]: featureKey === 'text-scale' ? 1 : false });\n if (featureKey === 'text-scale') {\n this.textScaleIndex = 0;\n }\n } else {\n feature.currentIndex = newIndex;\n button.classList.add('acc-selected');\n button.setAttribute('aria-pressed', 'true');\n const newValue = feature.values[newIndex];\n this.updateState({ [featureKey]: newValue });\n if (featureKey === 'text-scale') {\n this.textScaleIndex = newIndex;\n }\n }\n const indicator = button.querySelector(`.acc-progress-indicator[data-feature=\"${featureKey}\"]`);\n if (indicator) {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach((dot, i) => {\n dot.classList.toggle('active', i === feature.currentIndex);\n });\n }\n if (featureKey === 'text-scale') {\n const multiply = feature.currentIndex >= 0 ? feature.values[feature.currentIndex] : 1;\n this.scaleText(multiply);\n } else {\n this.applyVisualFilters();\n }\n },\n\n resetEnhancements() {\n this.saveConfig({ states: {}, systemDefaults: {} });\n this.textScaleIndex = 0;\n this.activeColorFilterKey = null;\n Object.keys(this.multiLevelFeatures).forEach(key => {\n this.multiLevelFeatures[key].currentIndex = -1;\n });\n const selected = document.querySelectorAll(\".acc-selected\");\n selected.forEach(el => {\n el.classList.remove(\"acc-selected\");\n el.setAttribute('aria-pressed', 'false');\n });\n const indicators = document.querySelectorAll('.acc-progress-indicator');\n indicators.forEach(indicator => {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach(dot => dot.classList.remove('active'));\n });\n const menu = document.querySelector('.acc-menu');\n if (menu) {\n this.setColorFilterUI(menu, null);\n this.syncTextScaleControlUI(menu, 1);\n }\n \n // Remove focus from active element to fix the persistent focus ring bug\n if (document.activeElement) {\n document.activeElement.blur();\n }\n const styleIds = [\n 'acc-bold-text',\n 'acc-letter-spacing',\n 'acc-line-spacing',\n 'acc-large-pointer',\n 'acc-highlight-links',\n 'acc-highlight-title',\n 'acc-readable-text',\n 'acc-pause-motion',\n 'acc-hide-images',\n 'acc-filter-style',\n 'acc-simple-layout'\n ];\n styleIds.forEach(id => {\n const style = document.getElementById(id);\n if (style) style.remove();\n });\n this.clearSimpleLayoutDomMutations();\n document.documentElement.classList.remove(\n 'acc-filter',\n 'acc-saturation',\n 'acc-bold-text',\n 'acc-letter-spacing',\n 'acc-line-spacing',\n 'acc-large-pointer',\n 'acc-highlight-links',\n 'acc-highlight-title',\n 'acc-readable-text',\n 'acc-pause-motion',\n 'acc-hide-images',\n 'acc-high-contrast-mode',\n 'acc-simple-layout'\n );\n document.body?.classList.remove('acc-simple-layout-enabled');\n document.body?.classList.remove('acc-high-contrast-mode');\n this.disconnectTextScaleObserver();\n this.currentTextScaleMultiplier = 1;\n const scaledElements = document.querySelectorAll('[data-acc-baseSize]');\n scaledElements.forEach(el => {\n if (!(el instanceof Element) || this.shouldSkipScaling(el)) return;\n el.style.fontSize = '';\n el.removeAttribute('data-acc-baseSize');\n });\n let guide = this.findElement('.acc-rg-container');\n if (guide) {\n guide.remove();\n if (window.__accweb__scrollGuide) {\n document.removeEventListener('mousemove', window.__accweb__scrollGuide);\n delete window.__accweb__scrollGuide;\n }\n }\n this.disableAnnotations();\n this.stopSpeech();\n this.stopTtsClickMode();\n this.clearSystemPreferenceListeners();\n this.detectSystemPreferences();\n this.setupMediaQueryListeners();\n this.updateViolationBubble(this.axeScanResults);\n this._fireCallback('onReset');\n },\n\n};\n","/** @typedef {import('./index.js').default} AllyWidget */\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const uiMethods = {\n\n _fireCallback(name, ...args) {\n const fn = this.options && this.options[name];\n if (typeof fn === 'function') {\n try { fn(...args); } catch (e) { console.warn(`[AllyWidget] Callback \"${name}\" threw:`, e); }\n }\n },\n\n translate(label) {\n const { lang } = this.loadConfig();\n const dictionary = this.translations[lang] || this.translations['en'];\n return dictionary[label] || label;\n },\n\n getLanguageCountryLabel(languageCode) {\n const countryByLanguage = {\n en: 'USA',\n ne: 'Nepal'\n };\n return countryByLanguage[languageCode] || String(languageCode || '').toUpperCase();\n },\n\n getLanguageFlag(languageCode) {\n const countryCodeByLanguage = {\n en: 'US',\n ne: 'NP'\n };\n const countryCode = (countryCodeByLanguage[languageCode] || String(languageCode || '').slice(0, 2)).toUpperCase();\n if (!/^[A-Z]{2}$/.test(countryCode)) return '';\n return String.fromCodePoint(...countryCode.split('').map(char => 127397 + char.charCodeAt(0)));\n },\n\n formatLanguageLabel(language) {\n if (!language) return 'English (USA)';\n const baseName = String(language.label || language.code || '')\n .split('(')[0].trim() || String(language.code || 'en').toUpperCase();\n return `${baseName} (${this.getLanguageCountryLabel(language.code)})`;\n },\n\n getWidgetIconMarkup(iconKey) {\n const normalized = typeof iconKey === 'string' ? iconKey.trim().toLowerCase() : '';\n const variants = this.widgetIcons?.accessibilityVariants || {};\n return variants[normalized] || variants.default || this.widgetIcons.accessibility;\n },\n\n throttle(func, limit) {\n let inThrottle;\n return function (...args) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n },\n\n getFocusableElements(root) {\n if (!root) return [];\n const selectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(',');\n const hasDocument = typeof document !== 'undefined';\n const activeElement = hasDocument ? document.activeElement : null;\n return Array.from(root.querySelectorAll(selectors)).filter(el => {\n if (el.hasAttribute('disabled')) return false;\n if (el.getAttribute('aria-hidden') === 'true') return false;\n if (el.closest('[aria-hidden=\"true\"]')) return false;\n const rect = el.getBoundingClientRect();\n const style = typeof window !== 'undefined' && window.getComputedStyle ? window.getComputedStyle(el) : { visibility: 'visible', display: 'block' };\n const hasSize = rect.width > 0 || rect.height > 0;\n const isVisible = (hasSize || (hasDocument && el === activeElement)) && style.visibility !== 'hidden' && style.display !== 'none';\n return isVisible;\n });\n },\n\n openMenu(menuContainer, toggleBtn) {\n if (!menuContainer) return;\n const menu = this.findElement('.acc-menu', menuContainer);\n this.activeMenuContainer = menuContainer;\n this.activeMenuToggle = toggleBtn || this.activeMenuToggle;\n this.previousFocus = document.activeElement && typeof document.activeElement.focus === 'function'\n ? document.activeElement : null;\n\n menuContainer.style.display = 'block';\n if (menu) {\n menu.setAttribute('aria-hidden', 'false');\n menu.setAttribute('aria-modal', 'true');\n if (!menu.hasAttribute('tabindex')) menu.setAttribute('tabindex', '-1');\n }\n\n if (this.activeMenuToggle) this.activeMenuToggle.setAttribute('aria-expanded', 'true');\n\n const focusable = this.getFocusableElements(menuContainer);\n if (focusable.length) {\n focusable[0].focus();\n } else if (menu) {\n menu.focus();\n }\n\n if (this.menuKeyListener) document.removeEventListener('keydown', this.menuKeyListener, true);\n\n this.menuKeyListener = (event) => {\n if (!this.activeMenuContainer) return;\n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n this.closeMenu(this.activeMenuContainer);\n return;\n }\n if (event.key === 'Tab') {\n const focusables = this.getFocusableElements(this.activeMenuContainer);\n if (!focusables.length) { event.preventDefault(); return; }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (event.shiftKey) {\n if (document.activeElement === first) { event.preventDefault(); last.focus(); }\n } else if (document.activeElement === last) {\n event.preventDefault(); first.focus();\n }\n }\n };\n\n document.addEventListener('keydown', this.menuKeyListener, true);\n this._fireCallback('onOpen');\n },\n\n closeMenu(menuContainer, toggleBtn) {\n const targetContainer = menuContainer || this.activeMenuContainer;\n if (!targetContainer) return;\n const menu = this.findElement('.acc-menu', targetContainer);\n targetContainer.style.display = 'none';\n if (menu) {\n menu.setAttribute('aria-hidden', 'true');\n menu.setAttribute('aria-modal', 'false');\n }\n\n const langModal = this.findElement('#acc-lang-modal', targetContainer);\n if (langModal) langModal.setAttribute('hidden', '');\n\n const langToggle = this.findElement('.acc-footer-lang-toggle', targetContainer);\n if (langToggle) langToggle.setAttribute('aria-expanded', 'false');\n\n const langSearch = this.findElement('#acc-lang-search', targetContainer);\n if (langSearch) langSearch.value = '';\n\n targetContainer.querySelectorAll('.acc-lang-item').forEach(item => {\n item.style.display = '';\n });\n\n if (this.menuKeyListener) {\n document.removeEventListener('keydown', this.menuKeyListener, true);\n this.menuKeyListener = null;\n }\n\n const toggle = toggleBtn || this.activeMenuToggle;\n if (toggle) toggle.setAttribute('aria-expanded', 'false');\n\n const focusTarget = toggle || this.previousFocus;\n if (focusTarget && typeof focusTarget.focus === 'function') focusTarget.focus();\n\n this.stopSpeech();\n\n this.activeMenuContainer = null;\n this.activeMenuToggle = null;\n this.previousFocus = null;\n this._fireCallback('onClose');\n },\n\n renderOptions(options, optionClass) {\n let html = '';\n for (let i = 0; i < options.length; i++) {\n const opt = options[i];\n if (opt.requiresSpeechSynthesis && !this.supportsTextToSpeech()) continue;\n const isMultiLevel = opt.multiLevel === true;\n const mergedOptionClass = [optionClass, opt.optionClass].filter(Boolean).join(' ');\n let progressIndicator = '';\n if (isMultiLevel) {\n const featureData = this.multiLevelFeatures[opt.key];\n if (featureData) {\n progressIndicator = `<div class=\"acc-progress-indicator\" data-feature=\"${opt.key}\">`;\n for (let j = 0; j < featureData.levels; j++) {\n const isActive = featureData.currentIndex === j;\n progressIndicator += `<div class=\"acc-progress-dot${isActive ? ' active' : ''}\" data-level=\"${j}\"> </div>`;\n }\n progressIndicator += ` </div>`;\n }\n }\n html += `<button\n class=\"acc-btn ${mergedOptionClass} ${this.multiLevelFeatures[opt.key]?.currentIndex >= 0 ? 'acc-selected' : ''}\"\n type=\"button\"\n data-key=\"${opt.key}\"\n data-multi-level=\"${isMultiLevel}\"\n title=\"${opt.label}\"\n aria-label=\"${opt.label}\"\n aria-pressed=\"${this.multiLevelFeatures[opt.key]?.currentIndex >= 0 || false}\"\n aria-controls=\"acc-menu-content\">\n ${opt.icon}\n <span class=\"acc-label\">${opt.label}</span>\n ${progressIndicator}\n </button>`;\n }\n return html;\n },\n\n renderTextScaleControl(scaleValue = 1) {\n const percent = this.getTextScalePercent(scaleValue);\n const min = Number(this.textScaleMinPercent) || 80;\n const max = Number(this.textScaleMaxPercent) || 150;\n const step = Number(this.textScaleStepPercent) || 5;\n const progress = ((percent - min) / (max - min)) * 100;\n\n return `\n <div class=\"acc-text-scale-control\" data-key=\"text-scale\">\n <div class=\"acc-text-scale-meta\">\n <span class=\"acc-text-scale-icon\" aria-hidden=\"true\">${this.widgetIcons.adjustFontSize}</span>\n <span class=\"acc-label\" data-acc-text=\"Font Size\">Font Size</span>\n <span class=\"acc-text-scale-percent\">${percent}%</span>\n </div>\n <input\n type=\"range\"\n class=\"acc-text-scale-range\"\n min=\"${min}\"\n max=\"${max}\"\n step=\"${step}\"\n value=\"${percent}\"\n data-acc-text=\"Font Size\"\n aria-label=\"Font Size\"\n style=\"--acc-text-scale-progress: ${Math.max(0, Math.min(100, progress))}%\">\n </div>\n `;\n },\n\n getTranslatedText(el, defaultValue) {\n let text = el.getAttribute('data-acc-text');\n if (!text && defaultValue) {\n text = defaultValue;\n el.setAttribute('data-acc-text', text);\n }\n return this.translate(text);\n },\n\n translateMenuUI(menu) {\n menu.querySelectorAll('.acc-section-title, .acc-label').forEach(el => {\n el.innerText = this.getTranslatedText(el, el.innerText.trim());\n });\n menu.querySelectorAll('[title]').forEach(el => {\n el.setAttribute('title', this.getTranslatedText(el, el.getAttribute('title')));\n });\n menu.querySelectorAll('[aria-label]').forEach(el => {\n el.setAttribute('aria-label', this.getTranslatedText(el, el.getAttribute('aria-label')));\n });\n this.updateSkipLinkLabel();\n },\n\n displayMenu({ container, lang, position = 'bottom-right', offset = [20, 20], size, icon }) {\n try {\n this.applyThemeVariables();\n this.registerStaticStyles();\n\n const activeLanguageCode = String(lang || 'en').split(/[_-]/)[0].toLowerCase();\n\n // Configurable branding\n const poweredByText = this.options?.poweredByText || 'Ally Widget';\n const poweredByUrl = this.options?.poweredByUrl || 'https://github.com/SunilCz/ally';\n\n const menuTemplate = `\n <div class=\"acc-menu\" role=\"dialog\" aria-labelledby=\"accessibility-title\">\n <div class=\"acc-menu-header\">\n <div id=\"accessibility-title\" class=\"acc-menu-title\">\n <span class=\"acc-menu-title-icon\" aria-hidden=\"true\">${this.getWidgetIconMarkup(icon)}</span>\n <span class=\"acc-label\">Accessibility</span>\n </div>\n <div class=\"acc-header-actions\"></div>\n </div>\n <div id=\"acc-menu-content\" class=\"acc-menu-content\">\n <div class=\"acc-options-all\"> </div>\n </div>\n <div class=\"acc-footer\">\n <button type=\"button\" class=\"acc-footer-reset\" title=\"Reset settings\" aria-label=\"Reset settings\">\n ${this.widgetIcons.reset}\n <span class=\"acc-label\">Reset settings</span>\n </button>\n <div class=\"acc-footer-meta\">\n <a href=\"${poweredByUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${poweredByText}</a>\n <button type=\"button\" class=\"acc-footer-lang-toggle\" title=\"Language\" aria-label=\"Language\" aria-expanded=\"false\" aria-controls=\"acc-lang-modal\">\n <span id=\"acc-current-language\" class=\"acc-footer-lang-current\">${String(activeLanguageCode || 'en').toUpperCase()}</span>\n <span class=\"acc-footer-lang-arrow\" aria-hidden=\"true\"> </span>\n </button>\n </div>\n <div id=\"acc-lang-modal\" class=\"acc-lang-modal\" hidden>\n <div class=\"acc-lang-modal-header\">\n <div class=\"acc-section-title acc-label\">All Languages</div>\n </div>\n <div class=\"acc-lang-search-wrapper\">\n <input type=\"text\" id=\"acc-lang-search\" class=\"acc-lang-search\" placeholder=\"Search language\" aria-label=\"Search language\">\n </div>\n <div class=\"acc-lang-list\">\n ${this.supportedLanguages.map(language => {\n const languageLabel = this.formatLanguageLabel(language);\n const languageFlag = this.getLanguageFlag(language.code);\n return `<button type=\"button\" class=\"acc-lang-item${language.code === activeLanguageCode ? ' selected' : ''}\" data-lang=\"${language.code}\" aria-label=\"${languageLabel}\">\n <span class=\"acc-lang-item-main\">\n <span class=\"acc-lang-flag\" aria-hidden=\"true\">${languageFlag}</span>\n <span class=\"acc-lang-item-label\">${languageLabel}</span>\n </span>\n <span class=\"acc-icon-check\" aria-hidden=\"true\"> </span>\n </button>`;\n }).join('')}\n </div>\n </div>\n </div>\n </div>\n <div class=\"acc-overlay\"> </div>\n `;\n\n const menuContainer = document.createElement('div');\n menuContainer.innerHTML = menuTemplate;\n menuContainer.style.display = 'none';\n const menu = this.findElement('.acc-menu', menuContainer);\n if (menu) {\n menu.setAttribute('aria-hidden', 'true');\n if (!menu.hasAttribute('tabindex')) menu.setAttribute('tabindex', '-1');\n }\n\n const isRightAligned = position === 'bottom-right' || position === 'top-right' || this.widgetTheme.menuPosition === 'right';\n if (isRightAligned) {\n menu.style.right = 'var(--acc-menu-inline-gap, 12px)';\n menu.style.left = 'auto';\n } else {\n menu.style.left = 'var(--acc-menu-inline-gap, 12px)';\n menu.style.right = 'auto';\n }\n\n const normalizedOffset = this.normalizeOffset(offset) || [20, 20];\n const offsetY = normalizedOffset[1] ?? 25;\n const buttonSize = size !== undefined && size !== null && String(size).trim() !== ''\n ? this.normalizeButtonSize(size)\n : (this.widgetTheme?.buttonSize || '52px');\n\n if (position === 'bottom-right' || position === 'bottom-left') {\n menu.style.bottom = `calc(${offsetY}px + ${buttonSize} + 16px)`;\n } else if (position === 'top-right' || position === 'top-left') {\n menu.style.top = `calc(${offsetY}px + ${buttonSize} + 16px)`;\n }\n\n const config = this.loadConfig();\n\n const textKeys = new Set(['text-scale', 'bold-text', 'line-spacing', 'letter-spacing', 'readable-text']);\n const colorKeys = new Set(['contrast-toggle', 'invert-colors', 'saturation-toggle', 'high-contrast-mode']);\n const readingAidsKeys = new Set(['reading-aid', 'highlight-links', 'highlight-title', 'simple-layout']);\n\n const sourceOptions = [\n ...this.contentOptions.map(option => ({ ...option })),\n ...this.colorOptions.map(option => ({ ...option, optionClass: 'acc-filter' })),\n ...this.accessTools.map(option => ({ ...option, optionClass: 'acc-tools' }))\n ];\n\n const groupedOptions = { speech: [], text: [], color: [], reading: [], interaction: [] };\n const seenKeys = new Set();\n sourceOptions.forEach(option => {\n if (!option?.key || seenKeys.has(option.key)) return;\n seenKeys.add(option.key);\n if (option.key === 'text-to-speech') { groupedOptions.speech.push(option); return; }\n if (textKeys.has(option.key)) { groupedOptions.text.push(option); return; }\n if (colorKeys.has(option.key)) { groupedOptions.color.push(option); return; }\n if (readingAidsKeys.has(option.key)) { groupedOptions.reading.push(option); return; }\n groupedOptions.interaction.push(option);\n });\n\n const sectionConfig = [\n { key: 'speech', label: 'Speech', containerClass: 'acc-tts-toggle-container', optionClass: 'acc-tts-toggle' },\n { key: 'text', label: 'Text', containerClass: 'acc-options acc-options-text' },\n { key: 'color', label: 'Color & Contrast', containerClass: 'acc-options' },\n { key: 'reading', label: 'Reading Aids', containerClass: 'acc-options' },\n { key: 'interaction', label: 'Interaction', containerClass: 'acc-options' }\n ];\n\n const sectionMarkup = sectionConfig.map(section => {\n let sectionOptions = groupedOptions[section.key];\n let specialContent = '';\n\n if (section.key === 'text') {\n const textScaleOption = sectionOptions.find(option => option.key === 'text-scale');\n sectionOptions = sectionOptions.filter(option => option.key !== 'text-scale');\n const textOrder = ['line-spacing', 'letter-spacing', 'bold-text', 'readable-text'];\n sectionOptions.sort((a, b) => {\n const rankA = textOrder.indexOf(a.key); const rankB = textOrder.indexOf(b.key);\n return (rankA === -1 ? Number.MAX_SAFE_INTEGER : rankA) - (rankB === -1 ? Number.MAX_SAFE_INTEGER : rankB);\n });\n if (textScaleOption) specialContent = this.renderTextScaleControl(config.states?.['text-scale'] || 1);\n\n const firstThinRowKeys = new Set(['line-spacing', 'letter-spacing']);\n const secondThinRowKeys = new Set(['bold-text', 'readable-text']);\n const firstThinRowOptions = sectionOptions.filter(o => firstThinRowKeys.has(o.key));\n const secondThinRowOptions = sectionOptions.filter(o => secondThinRowKeys.has(o.key));\n const remainingTextOptions = sectionOptions.filter(o => !firstThinRowKeys.has(o.key) && !secondThinRowKeys.has(o.key));\n const firstThinRowHtml = firstThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(firstThinRowOptions, 'acc-text-inline')}</div>` : '';\n const secondThinRowHtml = secondThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(secondThinRowOptions, 'acc-text-inline')}</div>` : '';\n const remainingTextHtml = remainingTextOptions.length ? `<div class=\"${section.containerClass}\">${this.renderOptions(remainingTextOptions, section.optionClass || '')}</div>` : '';\n if (!specialContent && !firstThinRowHtml && !secondThinRowHtml && !remainingTextHtml) return '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">${section.label}</div>${specialContent}${firstThinRowHtml}${secondThinRowHtml}${remainingTextHtml}</section>`;\n }\n\n if (section.key === 'color') {\n const colorOrder = ['contrast-toggle', 'saturation-toggle', 'invert-colors', 'high-contrast-mode'];\n sectionOptions.sort((a, b) => {\n const rankA = colorOrder.indexOf(a.key); const rankB = colorOrder.indexOf(b.key);\n return (rankA === -1 ? Number.MAX_SAFE_INTEGER : rankA) - (rankB === -1 ? Number.MAX_SAFE_INTEGER : rankB);\n });\n const firstThinRowKeys = new Set(['contrast-toggle', 'saturation-toggle']);\n const secondThinRowKeys = new Set(['invert-colors', 'high-contrast-mode']);\n const firstThinRowOptions = sectionOptions.filter(o => firstThinRowKeys.has(o.key));\n const secondThinRowOptions = sectionOptions.filter(o => secondThinRowKeys.has(o.key));\n const remainingColorOptions = sectionOptions.filter(o => !firstThinRowKeys.has(o.key) && !secondThinRowKeys.has(o.key));\n const firstThinRowHtml = firstThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(firstThinRowOptions, 'acc-text-inline')}</div>` : '';\n const secondThinRowHtml = secondThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(secondThinRowOptions, 'acc-text-inline')}</div>` : '';\n const remainingColorHtml = remainingColorOptions.length ? `<div class=\"${section.containerClass}\">${this.renderOptions(remainingColorOptions, section.optionClass || '')}</div>` : '';\n if (!firstThinRowHtml && !secondThinRowHtml && !remainingColorHtml) return '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">Color & Contrast</div>${firstThinRowHtml}${secondThinRowHtml}${remainingColorHtml}</section>`;\n }\n\n if (section.key === 'reading') {\n const readingOrder = ['highlight-links', 'highlight-title', 'reading-aid', 'simple-layout'];\n sectionOptions.sort((a, b) => {\n const rankA = readingOrder.indexOf(a.key); const rankB = readingOrder.indexOf(b.key);\n return (rankA === -1 ? Number.MAX_SAFE_INTEGER : rankA) - (rankB === -1 ? Number.MAX_SAFE_INTEGER : rankB);\n });\n const firstThinRowKeys = new Set(['highlight-links', 'highlight-title']);\n const secondThinRowKeys = new Set(['reading-aid', 'simple-layout']);\n const firstThinRowOptions = sectionOptions.filter(o => firstThinRowKeys.has(o.key));\n const secondThinRowOptions = sectionOptions.filter(o => secondThinRowKeys.has(o.key));\n const remainingReadingOptions = sectionOptions.filter(o => !firstThinRowKeys.has(o.key) && !secondThinRowKeys.has(o.key));\n const firstThinRowHtml = firstThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(firstThinRowOptions, 'acc-text-inline')}</div>` : '';\n const secondThinRowHtml = secondThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(secondThinRowOptions, 'acc-text-inline')}</div>` : '';\n const remainingReadingHtml = remainingReadingOptions.length ? `<div class=\"${section.containerClass}\">${this.renderOptions(remainingReadingOptions, section.optionClass || '')}</div>` : '';\n if (!firstThinRowHtml && !secondThinRowHtml && !remainingReadingHtml) return '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">Reading Aids</div>${firstThinRowHtml}${secondThinRowHtml}${remainingReadingHtml}</section>`;\n }\n\n const sectionOptionsHtml = sectionOptions.length ? this.renderOptions(sectionOptions, section.optionClass || '') : '';\n if (!specialContent && !sectionOptionsHtml.trim()) return '';\n const optionsContainer = sectionOptionsHtml.trim() ? `<div class=\"${section.containerClass}\">${sectionOptionsHtml}</div>` : '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">${section.label}</div>${specialContent}${optionsContainer}</section>`;\n }).join('');\n\n menu.querySelector('.acc-options-all').innerHTML = sectionMarkup;\n\n const langModal = this.findElement('#acc-lang-modal', menu);\n const langToggle = this.findElement('.acc-footer-lang-toggle', menu);\n const langSearch = this.findElement('#acc-lang-search', menu);\n const langItems = menu.querySelectorAll('.acc-lang-item');\n\n const closeLanguageModal = () => {\n if (langModal) langModal.setAttribute('hidden', '');\n if (langToggle) langToggle.setAttribute('aria-expanded', 'false');\n if (langSearch) langSearch.value = '';\n langItems.forEach(item => { item.style.display = ''; });\n };\n\n const openLanguageModal = () => {\n if (langModal) langModal.removeAttribute('hidden');\n if (langToggle) langToggle.setAttribute('aria-expanded', 'true');\n if (langSearch) langSearch.focus();\n };\n\n if (langToggle && langModal) {\n langToggle.addEventListener('click', (event) => {\n event.stopPropagation();\n langModal.hasAttribute('hidden') ? openLanguageModal() : closeLanguageModal();\n });\n }\n\n if (langSearch) {\n langSearch.addEventListener('input', () => {\n const searchValue = langSearch.value.toLowerCase();\n langItems.forEach(item => {\n const labelElement = item.querySelector('.acc-lang-item-label');\n const text = (labelElement?.textContent || item.textContent).toLowerCase();\n item.style.display = text.includes(searchValue) ? '' : 'none';\n });\n });\n }\n\n langItems.forEach(item => {\n item.addEventListener('click', () => {\n const langCode = item.getAttribute('data-lang');\n if (!langCode) return;\n langItems.forEach(i => i.classList.remove('selected'));\n item.classList.add('selected');\n const currentLang = this.findElement('#acc-current-language', menu);\n if (currentLang) currentLang.textContent = String(langCode).toUpperCase();\n closeLanguageModal();\n this.saveConfig({ lang: langCode });\n this.translateMenuUI(menuContainer);\n });\n });\n\n const textScaleRange = this.findElement('.acc-text-scale-range', menu);\n if (textScaleRange) {\n textScaleRange.addEventListener('input', () => {\n const multiplier = this.setTextScaleFromPercent(textScaleRange.value, { persist: false });\n this.syncTextScaleControlUI(menu, multiplier);\n });\n textScaleRange.addEventListener('change', () => {\n const multiplier = this.setTextScaleFromPercent(textScaleRange.value, { persist: true });\n this.syncTextScaleControlUI(menu, multiplier);\n this._fireCallback('onFeatureToggle', 'text-scale', multiplier);\n });\n this.syncTextScaleControlUI(menu, config.states?.['text-scale'] || 1);\n }\n\n menu.addEventListener('click', (e) => {\n if (langModal && !langModal.hasAttribute('hidden')) {\n const clickedInsideLanguageModal = Boolean(e.target.closest('.acc-lang-modal'));\n const clickedLanguageToggle = Boolean(e.target.closest('.acc-footer-lang-toggle'));\n if (!clickedInsideLanguageModal && !clickedLanguageToggle) closeLanguageModal();\n }\n\n const target = e.target.closest('[role=\"button\"], button, .acc-overlay');\n if (!target) return;\n if (target.classList.contains('acc-overlay')) { this.closeMenu(menuContainer); return; }\n if (target.classList.contains('acc-footer-reset')) { this.resetEnhancements(); return; }\n\n const btn = target.classList.contains('acc-btn') ? target : null;\n if (btn) {\n const key = btn.dataset.key;\n if (key === 'accessibility-report') {\n this.runAccessibilityReport();\n } else if (this.multiLevelFeatures[key]) {\n this.cycleMultiLevelFeature(key, btn);\n this._fireCallback('onFeatureToggle', key, this.multiLevelFeatures[key].currentIndex >= 0);\n } else if (this.isColorFilterKey(key)) {\n const isCurrentlyActive = btn.classList.contains('acc-selected');\n const newActiveKey = isCurrentlyActive ? null : key;\n this.setColorFilterUI(menu, newActiveKey);\n this.updateColorFilterState(newActiveKey);\n this.applyVisualFilters();\n this._fireCallback('onFeatureToggle', key, !!newActiveKey);\n } else {\n const isSelected = !btn.classList.contains('acc-selected');\n btn.classList.toggle('acc-selected', isSelected);\n btn.setAttribute('aria-pressed', isSelected);\n this.userInitiatedToggleKey = key;\n try {\n this.updateState({ [key]: isSelected });\n this.applyEnhancements();\n this._fireCallback('onFeatureToggle', key, isSelected);\n } finally {\n this.userInitiatedToggleKey = null;\n }\n }\n }\n });\n\n menu.querySelectorAll('[role=\"button\"], button').forEach(el => {\n el.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); el.click(); }\n });\n });\n\n this.translateMenuUI(menuContainer);\n const activeColorFilter = this.getActiveColorFilterKey(config.states);\n this.setColorFilterUI(menu, activeColorFilter);\n this.updateColorFilterState(activeColorFilter);\n\n if (config.states) {\n for (let key in config.states) {\n if (this.isColorFilterKey(key)) continue;\n if (config.states[key] && key !== 'text-scale') {\n const btn = this.findElement(`.acc-btn[data-key=\"${key}\"]`, menu);\n if (btn) { btn.classList.add('acc-selected'); btn.setAttribute('aria-pressed', 'true'); }\n }\n }\n }\n\n container.appendChild(menuContainer);\n return menuContainer;\n } catch (e) {\n console.error('[AllyWidget] Error displaying menu:', e);\n return null;\n }\n },\n\n displayWidget(options) {\n try {\n this.applyThemeVariables();\n this.registerStaticStyles();\n\n const widgetTemplate = `\n <div class=\"acc-widget\">\n <a href=\"#\" id=\"allyWidget\" class=\"acc-toggle-btn\" title=\"Open Accessibility Menu\" role=\"button\" aria-label=\"Open accessibility menu\" aria-expanded=\"false\">\n <span class=\"acc-toggle-icon\" aria-hidden=\"true\">${this.getWidgetIconMarkup(options?.icon)}</span>\n <span class=\"acc-violation-bubble\" data-severity=\"warning\" hidden> </span>\n </a>\n </div>\n `;\n\n const widget = document.createElement('div');\n widget.innerHTML = widgetTemplate;\n widget.classList.add('acc-container');\n const btn = this.findElement('.acc-toggle-btn', widget);\n this.violationBubble = this.findElement('.acc-violation-bubble', widget);\n this.widgetToggleButton = btn;\n\n const { position = 'bottom-right', offset = [20, 20], size } = options;\n const normalizedOffset = this.normalizeOffset(offset) || [20, 20];\n const offsetX = normalizedOffset[0] ?? 20;\n const offsetY = normalizedOffset[1] ?? 25;\n let buttonStyle = { left: `${offsetX}px`, bottom: `${offsetY}px` };\n if (position === 'bottom-right') {\n buttonStyle = { right: `${offsetX}px`, left: 'auto', bottom: `${offsetY}px` };\n } else if (position === 'top-left') {\n buttonStyle = { top: `${offsetY}px`, bottom: 'auto', left: `${offsetX}px` };\n } else if (position === 'top-right') {\n buttonStyle = { top: `${offsetY}px`, right: `${offsetX}px`, bottom: 'auto', left: 'auto' };\n }\n Object.assign(btn.style, buttonStyle);\n\n if (size !== undefined && size !== null && String(size).trim() !== '') {\n const buttonSize = this.normalizeButtonSize(size);\n btn.style.setProperty('--acc-button-size', buttonSize);\n }\n\n let menu;\n btn.addEventListener('click', (event) => {\n event.preventDefault();\n if (!menu) {\n menu = this.displayMenu({ ...options, container: widget });\n if (!menu) return;\n this.menuContainer = menu;\n const overlay = menu.querySelector('.acc-overlay');\n if (overlay) {\n overlay.addEventListener('click', (overlayEvent) => {\n overlayEvent.stopPropagation();\n this.closeMenu(menu, btn);\n });\n }\n }\n const isHidden = menu.style.display === 'none' || window.getComputedStyle(menu).display === 'none';\n if (isHidden) { this.openMenu(menu, btn); } else { this.closeMenu(menu, btn); }\n });\n\n btn.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); btn.click(); }\n });\n\n document.body.appendChild(widget);\n this.translateMenuUI(widget);\n this.ensureSkipLink();\n\n // Optional keyboard shortcut (Alt+A) to toggle the widget\n if (this.options?.keyboardShortcut !== false) {\n document.addEventListener('keydown', (e) => {\n if (e.altKey && e.key === 'a') {\n e.preventDefault();\n btn.click();\n }\n });\n }\n\n this.runBackgroundAxeScan().catch(() => {\n this.updateViolationBubble({ violations: [] });\n });\n\n if (this.isDevMode()) {\n const rerunDevScan = () => {\n this.runBackgroundAxeScan({ force: true }).catch(() => {\n this.updateViolationBubble(this.axeScanResults || { violations: [] });\n });\n };\n if (document.readyState === 'complete') {\n setTimeout(rerunDevScan, 250);\n } else {\n window.addEventListener('load', () => { setTimeout(rerunDevScan, 150); }, { once: true });\n }\n }\n\n document.addEventListener('click', (e) => {\n if (!btn) return;\n const clickedToggle = e.target === btn || btn.contains(e.target);\n const clickedInsideWidget = e.target.closest('.acc-container');\n if (menu && this.activeMenuContainer === menu && menu.style.display !== 'none') {\n const clickedInsideMenu = menu.contains(e.target);\n if (!clickedToggle && !clickedInsideMenu && !clickedInsideWidget) {\n this.closeMenu(menu, btn);\n }\n } else if (!clickedToggle) {\n btn.blur();\n }\n });\n\n return widget;\n } catch (e) {\n console.error('[AllyWidget] Error displaying widget:', e);\n return null;\n }\n },\n\n startAccessibleWebWidget() {\n try {\n if (document.querySelector('.acc-widget .acc-toggle-btn')) return;\n\n const dataAttributeOptions = this.getDataAttributeOptions();\n if (dataAttributeOptions && Object.keys(dataAttributeOptions).length) {\n this.dataOptions = dataAttributeOptions;\n this.options = { ...this.options, ...dataAttributeOptions };\n }\n\n const baseOptions = { ...this.options };\n const lang = baseOptions.lang ||\n document.querySelector('html')?.getAttribute('lang')?.replace(/[_-].*/, '') ||\n navigator.language ||\n 'en';\n baseOptions.lang = lang;\n baseOptions.position = baseOptions.position || 'bottom-right';\n\n if (baseOptions.offset) baseOptions.offset = this.normalizeOffset(baseOptions.offset);\n if (baseOptions.size) {\n baseOptions.size = this.normalizeButtonSize(baseOptions.size);\n this.widgetTheme.buttonSize = baseOptions.size;\n }\n\n this.options = { ...baseOptions };\n this.applyThemeOverrides(baseOptions);\n this.applyThemeVariables();\n this.registerStaticStyles();\n\n this.loadConfig(false);\n this.detectSystemPreferences();\n this.setupMediaQueryListeners();\n const initialColorFilter = this.getActiveColorFilterKey(this.widgetConfig.states);\n this.updateColorFilterState(initialColorFilter);\n\n this.applyEnhancements();\n this.applyVisualFilters();\n this.launchWidget(baseOptions);\n } catch (e) {\n console.error('[AllyWidget] Error starting widget:', e);\n }\n },\n\n launchWidget(args = {}) {\n try {\n let options = { lang: this.getDefaultLanguage(), position: 'bottom-right', offset: [20, 20] };\n try {\n const savedConfig = this.fetchSavedConfig();\n if (savedConfig) {\n options = { ...options, ...JSON.parse(savedConfig) };\n }\n } catch (e) {\n console.warn('[AllyWidget] Error loading saved config:', e);\n }\n options = { ...options, ...args };\n this.saveConfig(options);\n this.displayWidget(options);\n } catch (e) {\n console.error('[AllyWidget] Error in widget launch:', e);\n }\n }\n\n};\n","/*!\n * Ally Widget v1.0.0\n * https://github.com/SunilCz/ally\n *\n * Copyright (c) 2025 SunilCz\n * Released under the MIT License\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND.\n * This widget does not guarantee accessibility compliance.\n *\n * ─── Developer Options Reference ─────────────────────────────────────────────\n *\n * window.AllyWidgetOptions = {\n * // ── Position & Size ──────────────────────────────────────────────────────\n * position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n * offset: [20, 20] // [horizontal, vertical] px from edge\n * size: '52px' // toggle button size (px / em / rem / %)\n * keyboardShortcut: true // Alt+A to toggle (set false to disable)\n *\n * // ── Language ─────────────────────────────────────────────────────────────\n * lang: 'en' | 'ne'\n *\n * // ── Storage ──────────────────────────────────────────────────────────────\n * storageKey: 'ally-wgt' // localStorage key (change to avoid collisions)\n *\n * // ── Branding / Footer ────────────────────────────────────────────────────\n * poweredByText: 'Ally Widget' // footer link label\n * poweredByUrl: 'https://...' // footer link href\n *\n * // ── Toggle Button Icon ───────────────────────────────────────────────────\n * icon: 'default' | 'person' | 'eye' | 'universal' (built-in variants)\n * OR any SVG string for a fully custom icon\n *\n * // ── Color Theme ──────────────────────────────────────────────────────────\n * primaryColor: '#4f46e5'\n * primaryColorLight: '#818cf8'\n * primaryColorDark: '#3730a3'\n * backgroundColor: '#ffffff'\n * textColor: '#1f2937'\n * textColorInverted: '#ffffff'\n * cardBackground: '#f9fafb'\n * borderColor: '#e5e7eb'\n * focusRingColor: '#4f46e5'\n * hoverColor: '#f3f4f6'\n * activeColor: '#ede9fe'\n * borderRadius: '12px'\n * buttonBorderRadius: '50%'\n * headerHeight: '56px'\n * focusBorderWidth: '2px'\n * focusOutlineOffset: '2px'\n * zIndex: 9999\n * buttonSize: '52px' // alias for size\n *\n * // ── OR pass all theme keys nested under `theme: {}` ──────────────────────\n * theme: { primaryColor: '#e11d48', borderRadius: '8px', ... }\n *\n * // ── Features: disable specific features ──────────────────────────────────\n * disableFeatures: ['hide-images', 'dyslexia-font', 'annotations']\n * // All feature keys: 'bold-text' | 'line-spacing' | 'letter-spacing' |\n * // 'hide-images' | 'readable-text' | 'highlight-links' | 'highlight-title' |\n * // 'text-scale' | 'contrast-toggle' | 'invert-colors' | 'saturation-toggle' |\n * // 'large-pointer' | 'pause-motion' | 'reading-aid' | 'text-to-speech' |\n * // 'high-contrast-mode' | 'simple-layout' | 'annotations' | 'accessibility-report'\n *\n * // ── Features: override label or icon for any feature ─────────────────────\n * featureOverrides: {\n * 'bold-text': { label: 'Bold', icon: '<svg>...</svg>' },\n * 'text-to-speech': { label: 'Read Aloud' }\n * }\n *\n * // ── TTS voice configuration ───────────────────────────────────────────────\n * ttsNativeVoiceName: '' // exact voice name to prefer (e.g. 'Google हिन्दी')\n * ttsNativeVoiceLang: '' // BCP-47 lang tag override (e.g. 'ne-NP')\n * ttsRate: 1 // speech rate 0.5–2\n * ttsPitch: 1 // speech pitch 0–2\n *\n * // ── Event Callbacks ───────────────────────────────────────────────────────\n * onOpen() // widget menu opened\n * onClose() // widget menu closed\n * onFeatureToggle(key, enabled) // a feature was toggled\n * onReset() // all settings reset\n * };\n * ─────────────────────────────────────────────────────────────────────────────\n */\n\nimport { WIDGET_THEME } from './constants/theme.js';\nimport { WIDGET_ICONS } from './constants/icons.js';\nimport { TARGET_SELECTORS, PAGE_CONTENT_SELECTOR } from './constants/selectors.js';\nimport { TRANSLATIONS, SUPPORTED_LANGUAGES } from './constants/translations.js';\nimport { stateMethods } from './state.js';\nimport { styleMethods } from './styles.js';\nimport { featureMethods } from './features.js';\nimport { uiMethods } from './ui.js';\n\nclass AllyWidget {\n constructor(options = {}) {\n this.widgetTheme = { ...WIDGET_THEME };\n\n // Allow full icon override via options.icons\n this.widgetIcons = options.icons && typeof options.icons === 'object'\n ? { ...WIDGET_ICONS, ...options.icons }\n : { ...WIDGET_ICONS };\n\n this.targetSelectors = TARGET_SELECTORS;\n\n this.visualFilters = {\n 'dark-contrast': {\n styles: { 'filter': 'contrast(150%) brightness(0.8)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'light-contrast': {\n styles: { 'filter': 'contrast(125%) brightness(1.2)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'invert-colors': {\n styles: { 'filter': 'invert(100%)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'low-saturation': {\n styles: { 'filter': 'saturate(50%)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'high-saturation': {\n styles: { 'filter': 'saturate(200%)' },\n selector: PAGE_CONTENT_SELECTOR\n }\n };\n\n this.translations = TRANSLATIONS;\n this.supportedLanguages = SUPPORTED_LANGUAGES.map((language) => ({ ...language }));\n\n // Build the disabled-features set for quick lookup\n const disabledSet = new Set(\n Array.isArray(options.disableFeatures) ? options.disableFeatures : []\n );\n\n // Per-feature label/icon overrides: { 'bold-text': { label: '...', icon: '...' } }\n const featureOverrides = (options.featureOverrides && typeof options.featureOverrides === 'object')\n ? options.featureOverrides\n : {};\n\n const applyOverride = (item) => {\n const override = featureOverrides[item.key];\n if (!override) return item;\n return {\n ...item,\n ...(override.label ? { label: override.label } : {}),\n ...(override.icon ? { icon: override.icon } : {})\n };\n };\n\n const filterAndOverride = (items) =>\n items\n .filter(item => !disabledSet.has(item.key))\n .map(applyOverride);\n\n this.accessTools = filterAndOverride([\n { label: 'Big Cursor', key: 'large-pointer', icon: this.widgetIcons.largePointer },\n { label: 'Stop Animations', key: 'pause-motion', icon: this.widgetIcons.pauseMotion },\n { label: 'Reading Guide', key: 'reading-aid', icon: this.widgetIcons.readingAid },\n {\n label: 'Text to Speech',\n key: 'text-to-speech',\n icon: this.widgetIcons.textToSpeech,\n requiresSpeechSynthesis: true\n },\n { label: 'High Contrast', key: 'high-contrast-mode', icon: this.widgetIcons.highContrast },\n { label: 'Simplify Layout', key: 'simple-layout', icon: this.widgetIcons.simplifyLayout }\n ]);\n\n if (this.isDevMode()) {\n if (!disabledSet.has('annotations')) {\n this.accessTools.push(applyOverride(\n { label: 'Annotations', key: 'annotations', icon: this.widgetIcons.annotations }\n ));\n }\n if (!disabledSet.has('accessibility-report')) {\n this.accessTools.push(applyOverride(\n { label: 'Accessibility Report', key: 'accessibility-report', icon: this.widgetIcons.accessibilityReport, isAction: true }\n ));\n }\n }\n\n // axe-core state\n this.axeCoreLoaded = false;\n this.axeCoreLoading = false;\n this.axeCorePromise = null;\n this.axeScanResults = null;\n this.axeScanPromise = null;\n this.violationBubble = null;\n\n // Accessibility report modal state\n this.reportPreviousFocus = null;\n this.reportKeyListener = null;\n\n // System preference state\n this.systemPreferenceListeners = [];\n this.systemPreferenceMediaQueries = {};\n\n // Annotation state\n this.annotationLayer = null;\n this.annotationItems = [];\n this.annotationPopup = null;\n this.annotationRepositionHandler = null;\n this.annotationOutsideHandler = null;\n this.annotationRequestId = 0;\n\n // Text-to-speech state\n this.ttsUtterance = null;\n this.ttsClickListener = null;\n this.ttsActiveTarget = null;\n this.ttsTextCache = '';\n this.ttsStatus = 'stopped';\n this.ttsQueue = [];\n this.ttsQueueIndex = 0;\n this.ttsSessionId = 0;\n this.ttsVoice = null;\n\n // Simple layout state\n this.simpleLayoutRoot = null;\n this.simpleLayoutHiddenElements = [];\n\n this.userInitiatedToggleKey = null;\n\n // Font size / multi-level state\n this.textScaleIndex = 0;\n this.textScaleValues = [1.2, 1.4, 1.6];\n this.textScaleMinPercent = 80;\n this.textScaleMaxPercent = 150;\n this.textScaleStepPercent = 5;\n this.contrastFilterValues = ['light-contrast', 'dark-contrast'];\n this.saturationFilterValues = ['low-saturation', 'high-saturation'];\n\n this.contentOptions = filterAndOverride([\n { label: 'Font Weight', key: 'bold-text', icon: this.widgetIcons.boldText },\n { label: 'Line Height', key: 'line-spacing', icon: this.widgetIcons.lineSpacing },\n { label: 'Letter Spacing', key: 'letter-spacing', icon: this.widgetIcons.letterSpacing },\n { label: 'Hide Images', key: 'hide-images', icon: this.widgetIcons.hideImages },\n { label: 'Dyslexia Font', key: 'readable-text', icon: this.widgetIcons.dyslexiaFont },\n { label: 'Highlight Links', key: 'highlight-links', icon: this.widgetIcons.highlightLinks },\n { label: 'Highlight Title', key: 'highlight-title', icon: this.widgetIcons.highlightTitle },\n {\n label: 'Font Size',\n key: 'text-scale',\n icon: this.widgetIcons.adjustFontSize,\n multiLevel: true,\n levels: this.textScaleValues.length\n }\n ]);\n\n this.multiLevelFeatures = {\n 'text-scale': {\n levels: this.textScaleValues.length,\n currentIndex: -1,\n values: this.textScaleValues\n },\n 'contrast-toggle': {\n levels: this.contrastFilterValues.length,\n currentIndex: -1,\n values: this.contrastFilterValues\n },\n 'saturation-toggle': {\n levels: this.saturationFilterValues.length,\n currentIndex: -1,\n values: this.saturationFilterValues\n }\n };\n\n this.readingAidTemplate = `\n <div class=\"acc-rg acc-rg-top\" role=\"presentation\"> </div>\n <div class=\"acc-rg acc-rg-bottom\" role=\"presentation\"> </div>\n `;\n\n this.colorOptions = filterAndOverride([\n {\n label: 'Contrast',\n key: 'contrast-toggle',\n icon: this.widgetIcons.contrast,\n multiLevel: true,\n levels: this.contrastFilterValues.length\n },\n { label: 'Invert Colors', key: 'invert-colors', icon: this.widgetIcons.invertColors },\n {\n label: 'Saturation',\n key: 'saturation-toggle',\n icon: this.widgetIcons.saturation,\n multiLevel: true,\n levels: this.saturationFilterValues.length\n }\n ]);\n\n this.colorFilterKeys = Object.keys(this.visualFilters);\n this.activeColorFilterKey = null;\n\n this.textScaleSelectors = 'h1,h2,h3,h4,h5,h6,p,a,dl,dt,li,ol,th,td,span,blockquote,.acc-text';\n this.textScaleObserver = null;\n this.currentTextScaleMultiplier = 1;\n\n this.widgetConfig = {};\n\n // Configurable storage key\n this.storageKey = (typeof options.storageKey === 'string' && options.storageKey.trim())\n ? options.storageKey.trim()\n : 'ally-wgt';\n\n this.readingAidVisible = false;\n this.readableFontLoaded = false;\n\n // Menu state\n this.activeMenuContainer = null;\n this.activeMenuToggle = null;\n this.menuKeyListener = null;\n this.previousFocus = null;\n this.widgetToggleButton = null;\n this.skipLinkElement = null;\n this.menuContainer = null;\n\n this.staticStylesRegistered = false;\n\n this.dataOptions = this.getDataAttributeOptions();\n\n this.options = {\n lang: this.getDefaultLanguage(),\n position: 'bottom-right',\n ...this.dataOptions,\n ...options\n };\n\n this.applyThemeOverrides(this.options);\n\n const normalizeTtsRate = (value) => {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) return 1;\n return Math.min(2, Math.max(0.5, numeric));\n };\n\n const normalizeTtsPitch = (value) => {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) return 1;\n return Math.min(2, Math.max(0, numeric));\n };\n\n this.nativeTtsConfig = {\n preferredVoiceName: (\n typeof options.ttsNativeVoiceName === 'string' &&\n options.ttsNativeVoiceName.trim()\n ) ? options.ttsNativeVoiceName.trim() : '',\n preferredVoiceLang: (\n typeof options.ttsNativeVoiceLang === 'string' &&\n options.ttsNativeVoiceLang.trim()\n ) ? options.ttsNativeVoiceLang.trim() : '',\n rate: normalizeTtsRate(options.ttsRate),\n pitch: normalizeTtsPitch(options.ttsPitch)\n };\n\n if (this.options.offset) {\n this.options.offset = this.normalizeOffset(this.options.offset);\n }\n\n if (this.options.size) {\n this.widgetTheme.buttonSize = this.normalizeButtonSize(this.options.size);\n this.options.size = this.widgetTheme.buttonSize;\n }\n\n this.applyThemeVariables();\n this.registerStaticStyles();\n }\n\n applyThemeOverrides(options = {}) {\n if (!options || typeof options !== 'object') return;\n\n const mergedOptions = {\n ...(options.theme && typeof options.theme === 'object' ? options.theme : {}),\n ...options\n };\n\n const themeKeys = [\n 'primaryColor', 'primaryColorLight', 'primaryColorDark',\n 'backgroundColor', 'textColor', 'textColorInverted',\n 'cardBackground', 'borderColor', 'focusRingColor',\n 'hoverColor', 'activeColor', 'borderRadius', 'buttonBorderRadius',\n 'headerHeight', 'focusBorderWidth', 'focusOutlineOffset', 'zIndex'\n ];\n\n themeKeys.forEach((key) => {\n const value = mergedOptions[key];\n if (value === undefined || value === null) return;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return;\n this.widgetTheme[key] = trimmed;\n return;\n }\n this.widgetTheme[key] = value;\n });\n\n if (mergedOptions.buttonSize !== undefined && mergedOptions.buttonSize !== null && mergedOptions.buttonSize !== '') {\n this.widgetTheme.buttonSize = this.normalizeButtonSize(mergedOptions.buttonSize);\n }\n }\n}\n\n/** @typedef {typeof stateMethods & typeof styleMethods & typeof featureMethods & typeof uiMethods} AllyWidgetMixedMethods */\n/** @typedef {AllyWidget & AllyWidgetMixedMethods} AllyWidgetInstance */\n\n/** @type {AllyWidget['prototype'] & AllyWidgetMixedMethods} */\nconst widgetPrototype = AllyWidget.prototype;\n\nObject.assign(\n widgetPrototype,\n stateMethods,\n styleMethods,\n featureMethods,\n uiMethods\n);\n\n/**\n * AllyWidget.init(options) — programmatic initialisation.\n *\n * Use this instead of the auto-init in frameworks (Next.js, Nuxt, SvelteKit…)\n * where you control when the widget mounts:\n *\n * // Next.js app router component (use client)\n * useEffect(() => { AllyWidget.init({ primaryColor: '#6366f1' }); }, []);\n *\n * // CDN\n * AllyWidget.init({ lang: 'ne' });\n *\n * Returns the widget instance, or null when called server-side.\n */\nAllyWidget.init = function init(options = {}) {\n if (typeof document === 'undefined') return null;\n const instance = new AllyWidget(options);\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n instance.startAccessibleWebWidget();\n } else {\n document.addEventListener('DOMContentLoaded', () => instance.startAccessibleWebWidget(), { once: true });\n }\n return instance;\n};\n\nif (typeof window !== 'undefined') {\n window.AllyWidget = AllyWidget;\n}\n\n// Auto-init for CDN / script-tag usage.\n// Skipped when:\n// • running server-side (no document)\n// • window.AllyWidgetOptions.autoInit === false (opt-out for manual control)\nif (typeof document !== 'undefined') {\n const globalAutoInitOptions = (\n typeof window !== 'undefined' &&\n window.AllyWidgetOptions &&\n typeof window.AllyWidgetOptions === 'object'\n ) ? window.AllyWidgetOptions : {};\n\n if (globalAutoInitOptions.autoInit !== false) {\n /** @type {AllyWidgetInstance} */\n const widgetInstance = new AllyWidget(globalAutoInitOptions);\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n widgetInstance.startAccessibleWebWidget();\n } else {\n document.addEventListener('DOMContentLoaded', () => widgetInstance.startAccessibleWebWidget(), { once: true });\n }\n }\n}\n\nexport default AllyWidget;\n"],"names":["WIDGET_THEME","primaryColor","primaryColorLight","primaryColorDark","backgroundColor","textColor","textColorInverted","buttonSize","cardBackground","borderColor","focusRingColor","hoverColor","activeColor","successColor","errorColor","warningColor","headerHeight","borderRadius","buttonBorderRadius","menuPosition","zIndex","focusBorderWidth","focusOutlineOffset","WIDGET_ICONS","accessibility","accessibilityVariants","default","largePointer","pauseMotion","readingAid","boldText","lineSpacing","letterSpacing","dyslexiaFont","highlightLinks","highlightTitle","contrast","darkContrast","lightContrast","invertColors","saturation","lowSaturation","highSaturation","reset","close","increase","decrease","arrowBack","adjustFontSize","language","hideImages","accessibilityReport","annotations","textToSpeech","highContrast","simplifyLayout","TARGET_SELECTORS","ALL","LINKS","HEADERS","TEXT","PAGE_CONTENT_SELECTOR","TRANSLATIONS","en","Close","Monochrome","Tools","Language","Critical","Serious","Moderate","Minor","Element","Issue","Annotations","Play","Pause","Stop","Contrast","Saturation","Accessibility","ne","SUPPORTED_LANGUAGES","code","label","stateMethods","storageAvailable","test","localStorage","setItem","removeItem","fetchCookie","name","cookieName","decodedCookie","decodeURIComponent","document","cookie","split","map","c","trim","find","startsWith","substring","length","e","console","warn","storeCookie","value","days","d","Date","setTime","getTime","expires","toUTCString","isSecure","window","location","protocol","getSavedLanguage","this","stored","getItem","storageKey","config","JSON","parse","lang","cookieVal","getBrowserLanguage","navigator","supportedCodes","supportedLanguages","browserLanguages","languages","browserLang","primaryCode","toLowerCase","includes","getDefaultLanguage","savedLang","isDevMode","urlParams","URLSearchParams","search","get","getDataAttributeOptions","options","attributes","assignValue","key","String","position","normalized","normalizeOffset","offset","normalizedSize","normalizeButtonSize","size","icon","scriptCandidates","currentScript","push","querySelectorAll","forEach","script","el","attrName","fallback","attrValue","getAttribute","undefined","querySelector","parts","Array","isArray","parsed","part","number","Number","isFinite","Math","round","filter","widgetTheme","max","trimmed","numeric","toggleDisplay","state","style","display","isSystemControlledPreference","systemDefaults","widgetConfig","Object","prototype","hasOwnProperty","call","hasExplicitStatePreference","states","hasExplicitColorFilterPreference","colorFilterKeys","some","updateState","payload","source","previousStates","previousSystemDefaults","nextStates","nextSystemDefaults","keys","updatedConfig","saveConfig","newConfig","data","stringify","retrieveState","loadConfig","cache","savedConfig","fetchSavedConfig","STATIC_STYLES","join","styleMethods","findElement","selector","parent","injectStyle","id","css","getElementById","createElement","innerHTML","head","appendChild","createCSS","styles","browserPrefixes","prefixedProperties","prefix","wrapCSS","childrenSelector","output","child","buildCSS","applyToolStyle","enable","styleId","remove","documentElement","classList","toggle","applyThemeVariables","vars","entries","setProperty","registerStaticStyles","staticStylesRegistered","AXE_CORE_VERSION","AXE_CORE_SRC","AXE_RUN_OPTIONS","runOnly","SYSTEM_PREFERS_REDUCED_MOTION","featureMethods","getContrastToggleDisplay","index","widgetIcons","updateContrastToggleButton","button","iconNode","outerHTML","insertAdjacentHTML","translatedLabel","translate","labelNode","setAttribute","innerText","getSaturationToggleDisplay","updateSaturationToggleButton","ensureSkipLink","skipLinkElement","body","contains","updateSkipLinkLabel","existing","type","className","textContent","addEventListener","event","preventDefault","widgetToggleButton","currentMenu","activeMenuContainer","menuContainer","focusMenu","targetMenu","focusables","getFocusableElements","focus","click","requestAnimationFrame","insertBefore","firstChild","shouldSkipScaling","element","closest","collectDirectTextParents","rootElement","directTextParents","Set","NodeFilter","root","walker","createTreeWalker","SHOW_TEXT","acceptNode","node","FILTER_REJECT","parentElement","matches","textScaleSelectors","FILTER_ACCEPT","currentNode","nextNode","add","applyScaleToElement","multiplier","baseAttr","hasAttribute","computedSize","parseFloat","getComputedStyle","fontSize","isNaN","baseSize","ensureTextScaleObserver","textScaleObserver","MutationObserver","mutations","abs","currentTextScaleMultiplier","pending","mutation","addedNodes","observe","childList","subtree","disconnectTextScaleObserver","disconnect","scaleText","multiply","numericMultiply","resolvedMultiply","isDefaultScale","removeAttribute","clampTextScalePercent","percent","min","textScaleMinPercent","textScaleMaxPercent","step","textScaleStepPercent","snapped","getTextScalePercent","scaleValue","syncTextScaleControlUI","menu","range","progress","setTextScaleFromPercent","shouldPersist","persist","clampedPercent","toFixed","exactIndex","textScaleValues","indexOf","multiLevelFeatures","currentIndex","textScaleIndex","nearestIndex","minDistance","Infinity","distance","enableBoldText","adjustLetterSpacing","adjustLineSpacing","enableLargePointer","cursor","outline","highlightTitles","targetSelectors","ensureReadableFontLoaded","readableFontLoaded","enableReadableText","shouldEnable","transition","enableHighContrastMode","X","enableReadingAid","container","guideHeight","__accweb__scrollGuide","removeEventListener","readingAidTemplate","prepend","rgTop","rgBottom","readingAidVisible","updateGuidePosition","throttle","mouseY","clientY","topHeight","bottomHeight","innerHeight","height","passive","loadAxeCore","axeCoreLoaded","axe","Promise","resolve","axeCorePromise","axeCoreLoading","reject","settled","timeoutId","settleSuccess","clearTimeout","Error","settleError","error","src","async","integrity","crossOrigin","once","setTimeout","getAxeRunOptions","getViolationCounts","results","counts","critical","serious","moderate","minor","violations","violation","impact","nodes","updateViolationBubble","bubble","violationBubble","axeScanResults","devMode","displayCount","severity","hidden","dataset","runBackgroundAxeScan","force","axeScanPromise","run","ensureMediaQuery","query","matchMedia","systemPreferenceMediaQueries","applySystemMotionPreference","detectSystemPreferences","reducedMotionQuery","shouldPauseMotion","applyEnhancements","clearSystemPreferenceListeners","systemPreferenceListeners","setupMediaQueryListeners","mediaQuery","handler","addListener","removeListener","listen","runAccessibilityReport","panel","createReportPanel","openReportPanel","contentArea","statusArea","displayReportResults","message","getReportFocusableElements","dialog","reportPreviousFocus","activeElement","focusTarget","reportKeyListener","stopPropagation","closeReportPanel","first","last","active","outsidePanel","shiftKey","closeBtn","overlay","passes","incomplete","v","totalViolations","values","reduce","a","b","html","severityOrder","sort","capitalizeFirst","escapeHtml","help","description","helpUrl","slice","failureSummary","header","str","charAt","toUpperCase","div","concealImages","existingStyle","supportsSpeechSynthesis","SpeechSynthesisUtterance","supportsTextToSpeech","normalizeSpeechLanguage","languageCode","getNativeTtsRate","configured","nativeTtsConfig","rate","getNativeTtsPitch","pitch","isElementVisibleForTts","visibility","rect","getBoundingClientRect","width","isTtsExcludedElement","allowLandmarkRegions","normalizeReadableText","text","replace","getTtsCandidateRoots","roots","seen","has","getPrimaryContentRoot","candidates","explicitCandidates","from","explicitBest","explicitBestScore","candidate","textLength","score","topLevelCandidates","children","best","bestScore","bestRoot","extractReadableBlocks","blocks","getReadableContent","candidateRoots","bestBlocks","characterCount","splitLongSpeechSegment","segment","maxLength","remaining","splitIndex","lastIndexOf","floor","Boolean","buildSpeechQueue","paragraphCandidates","paragraph","paragraphs","queue","sentences","sentenceList","chunk","sentence","next","resolveSpeechVoice","synth","speechSynthesis","voices","getVoices","preferredVoiceName","byExactName","voice","byNameContains","targetLanguage","preferredVoiceLang","primary","localExact","localService","exact","localByPrimary","byPrimary","defaultVoice","getSpeechTargetFromEvent","target","block","setActiveSpeechTarget","ttsActiveTarget","startTtsClickMode","ttsClickListener","handleTtsClick","stopTtsClickMode","ttsTextCache","startSpeechPlayback","restart","ensureTtsQueue","ttsQueue","ttsQueueIndex","speakNextTtsChunk","sessionId","ttsSessionId","ttsStatus","utterance","ttsVoice","onstart","onpause","onresume","onend","onerror","ttsUtterance","speak","startNativeSpeechPlayback","paused","resume","stopSpeech","cancel","pauseSpeech","speaking","pause","resumeSpeech","enableTextToSpeech","isUserToggle","userInitiatedToggleKey","announceTtsState","msg","ensureAnnotationLayer","annotationLayer","layer","resolveAnnotationTarget","buildAnnotationEntries","title","createAnnotationMarker","annotation","marker","showAnnotationPopup","positionAnnotationPopup","popup","markerRect","popupWidth","offsetWidth","popupHeight","offsetHeight","viewportWidth","innerWidth","viewportHeight","gap","left","scrollX","top","scrollY","bottom","clearAnnotationPopup","annotationPopup","__accMarker","closeButton","positionAnnotations","annotationItems","item","right","enableAnnotations","disableAnnotations","requestId","annotationRequestId","cancelPending","then","annotationRepositionHandler","annotationOutsideHandler","clickedPopup","clickedMarker","catch","clearSimpleLayoutDomMutations","simpleLayoutRoot","simpleLayoutHiddenElements","applySimpleLayoutDomMutations","hiddenElements","clutterSelectors","enableSimpleLayout","S","R","storedScale","appliedScale","isColorFilterKey","getActiveColorFilterKey","activeColorFilterKey","setColorFilterUI","activeKey","contrastFeature","contrastButton","contrastIndex","isContrastActive","indicator","dot","saturationFeature","saturationButton","saturationIndex","isSaturationActive","filterKey","isActive","updateColorFilterState","requiresUpdate","rawCurrent","computeFilteredBodyColor","m","match","r","g","clamp","s","ng","nb","s2","hg","hb","applyVisualFilters","visualFilters","adjustedFilter","filteredBg","cycleTextScale","progressIndicator","dots","cycleMultiLevelFeature","featureKey","feature","newIndex","newActiveKey","levels","newValue","i","resetEnhancements","blur","guide","_fireCallback","uiMethods","args","fn","translations","getLanguageCountryLabel","getLanguageFlag","countryCode","fromCodePoint","char","charCodeAt","formatLanguageLabel","getWidgetIconMarkup","iconKey","variants","func","limit","inThrottle","apply","selectors","hasDocument","openMenu","toggleBtn","activeMenuToggle","previousFocus","focusable","menuKeyListener","closeMenu","targetContainer","langModal","langToggle","langSearch","renderOptions","optionClass","opt","requiresSpeechSynthesis","isMultiLevel","multiLevel","mergedOptionClass","featureData","j","renderTextScaleControl","getTranslatedText","defaultValue","translateMenuUI","displayMenu","activeLanguageCode","poweredByText","poweredByUrl","menuTemplate","languageLabel","languageFlag","offsetY","textKeys","colorKeys","readingAidsKeys","sourceOptions","contentOptions","option","colorOptions","accessTools","groupedOptions","speech","color","reading","interaction","seenKeys","sectionMarkup","containerClass","section","sectionOptions","specialContent","textScaleOption","textOrder","rankA","rankB","MAX_SAFE_INTEGER","firstThinRowKeys","secondThinRowKeys","firstThinRowOptions","o","secondThinRowOptions","remainingTextOptions","firstThinRowHtml","secondThinRowHtml","remainingTextHtml","colorOrder","remainingColorOptions","remainingColorHtml","readingOrder","remainingReadingOptions","remainingReadingHtml","sectionOptionsHtml","optionsContainer","langItems","closeLanguageModal","openLanguageModal","searchValue","labelElement","langCode","currentLang","textScaleRange","clickedInsideLanguageModal","clickedLanguageToggle","btn","isSelected","activeColorFilter","displayWidget","widgetTemplate","widget","normalizedOffset","offsetX","buttonStyle","assign","overlayEvent","keyboardShortcut","altKey","rerunDevScan","readyState","clickedToggle","clickedInsideWidget","clickedInsideMenu","startAccessibleWebWidget","dataAttributeOptions","dataOptions","baseOptions","applyThemeOverrides","initialColorFilter","launchWidget","AllyWidget","constructor","icons","disabledSet","disableFeatures","featureOverrides","applyOverride","override","filterAndOverride","items","isAction","contrastFilterValues","saturationFilterValues","ttsNativeVoiceName","ttsNativeVoiceLang","normalizeTtsRate","ttsRate","normalizeTtsPitch","ttsPitch","mergedOptions","theme","widgetPrototype","init","instance","globalAutoInitOptions","AllyWidgetOptions","autoInit","widgetInstance"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ally-widget.min.js","sources":["../src/constants/theme.js","../src/constants/icons.js","../src/constants/selectors.js","../src/constants/translations.js","../src/state.js","../src/styles.js","../src/features.js","../src/ui.js","../src/index.js"],"sourcesContent":["export const WIDGET_THEME = {\n primaryColor: '#1976d2',\n primaryColorLight: '#42a5f5',\n primaryColorDark: '#0d47a1',\n backgroundColor: '#f5f7fa',\n textColor: '#222222',\n textColorInverted: '#ffffff',\n buttonSize: '52px',\n cardBackground: '#ffffff',\n borderColor: '#d1d5db',\n focusRingColor: '#1976d2',\n hoverColor: '#42a5f5',\n activeColor: '#0d47a1',\n successColor: '#2e7d32',\n errorColor: '#c62828',\n warningColor: '#f57c00',\n headerHeight: '54px',\n borderRadius: '8px',\n buttonBorderRadius: '0.4rem',\n menuPosition: 'right',\n zIndex: 100000,\n focusBorderWidth: '3px',\n focusOutlineOffset: '2px'\n};\n","export const WIDGET_ICONS = {\n accessibility: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM360-80v-520q-60-5-122-15t-118-25l20-80q78 21 166 30.5t174 9.5q86 0 174-9.5T820-720l20 80q-56 15-118 25t-122 15v520h-80v-240h-80v240h-80Z\"/></svg>',\n accessibilityVariants: {\n default: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM360-80v-520q-60-5-122-15t-118-25l20-80q78 21 166 30.5t174 9.5q86 0 174-9.5T820-720l20 80q-56 15-118 25t-122 15v520h-80v-240h-80v240h-80Z\"/></svg>',\n 'icon-2': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM360-80v-520H120v-80h720v80H600v520h-80v-240h-80v240h-80Z\"/></svg>',\n 'icon-3': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M423.5-743.5Q400-767 400-800t23.5-56.5Q447-880 480-880t56.5 23.5Q560-833 560-800t-23.5 56.5Q513-720 480-720t-56.5-23.5ZM680-80v-200H480q-33 0-56.5-23.5T400-360v-240q0-33 23.5-56.5T480-680q24 0 41.5 10.5T559-636q55 66 99.5 90.5T760-520v80q-53 0-107-23t-93-55v138h120q33 0 56.5 23.5T760-300v220h-80Zm-280 0q-83 0-141.5-58.5T200-280q0-72 45.5-127T360-476v82q-35 14-57.5 44.5T280-280q0 50 35 85t85 35q39 0 69.5-22.5T514-240h82q-14 69-69 114.5T400-80Z\"/></svg>',\n 'icon-4': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\"><path d=\"M320-80q-83 0-141.5-58.5T120-280q0-83 58.5-141.5T320-480v80q-50 0-85 35t-35 85q0 50 35 85t85 35q50 0 85-35t35-85h80q0 83-58.5 141.5T320-80Zm360-40v-200H440q-44 0-68-37.5t-6-78.5l74-164h-91l-24 62-77-22 28-72q9-23 29.5-35.5T350-680h208q45 0 68.5 36.5T632-566l-66 146h114q33 0 56.5 23.5T760-340v220h-80Zm-96.5-603.5Q560-747 560-780t23.5-56.5Q607-860 640-860t56.5 23.5Q720-813 720-780t-23.5 56.5Q673-700 640-700t-56.5-23.5Z\"/></svg>'\n },\n largePointer: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"><path d=\"m320-410 79-110h170L320-716v306ZM551-80 406-392 240-160v-720l560 440H516l144 309-109 51ZM399-520Z\"/></svg>',\n pauseMotion: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m791-55-91-91q-49 32-104.5 49T480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 17-115.5T146-700l-91-91 57-57 736 736-57 57ZM480-160q43 0 83.5-11t78.5-33L204-642q-22 38-33 78.5T160-480q0 133 93.5 226.5T480-160Zm334-100-58-58q22-38 33-78.5t11-83.5q0-133-93.5-226.5T480-800q-43 0-83.5 11T318-756l-58-58q49-32 104.5-49T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 60-17 115.5T814-260ZM537-537ZM423-423Z\"/></svg>',\n readingAid: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M320-80v-440l-80-120v-240h480v240l-80 120v440H320Zm160-260q-25 0-42.5-17.5T420-400q0-25 17.5-42.5T480-460q25 0 42.5 17.5T540-400q0 25-17.5 42.5T480-340ZM320-760h320v-40H320v40Zm320 80H320v16l80 120v384h160v-384l80-120v-16ZM480-480Z\"/></svg>',\n boldText: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\"/></svg>',\n lineSpacing: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M240-160 80-320l56-56 64 62v-332l-64 62-56-56 160-160 160 160-56 56-64-62v332l64-62 56 56-160 160Zm240-40v-80h400v80H480Zm0-240v-80h400v80H480Zm0-240v-80h400v80H480Z\"/></svg>',\n letterSpacing: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M320-80 160-240l160-160 57 56-64 64h334l-63-64 56-56 160 160L640-80l-57-56 64-64H313l63 64-56 56ZM200-480v-400h80v400h-80Zm240 0v-400h80v400h-80Zm240 0v-400h80v400h-80Z\"/></svg>',\n dyslexiaFont: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m131-252 165-440h79l165 440h-76l-39-112H247l-40 112h-76Zm139-176h131l-64-182h-4l-63 182Zm395 186q-51 0-81-27.5T554-342q0-44 34.5-72.5T677-443q23 0 45 4t38 11v-12q0-29-20.5-47T685-505q-23 0-42 9.5T610-468l-47-35q24-29 54.5-43t68.5-14q69 0 103 32.5t34 97.5v178h-63v-37h-4q-14 23-38 35t-53 12Zm12-54q35 0 59.5-24t24.5-56q-14-8-33.5-12.5T689-393q-32 0-50 14t-18 37q0 20 16 33t40 13Z\"/></svg>',\n highlightLinks: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\"/></svg>',\n highlightTitle: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M320-280q17 0 28.5-11.5T360-320q0-17-11.5-28.5T320-360q-17 0-28.5 11.5T280-320q0 17 11.5 28.5T320-280Zm0-160q17 0 28.5-11.5T360-480q0-17-11.5-28.5T320-520q-17 0-28.5 11.5T280-480q0 17 11.5 28.5T320-440Zm0-160q17 0 28.5-11.5T360-640q0-17-11.5-28.5T320-680q-17 0-28.5 11.5T280-640q0 17 11.5 28.5T320-600Zm120 320h240v-80H440v80Zm0-160h240v-80H440v80Zm0-160h240v-80H440v80ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\"/></svg>',\n contrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m480-260 60-60h100v-100l60-60-60-60v-100H540l-60-60-60 60H320v100l-60 60 60 60v100h100l60 60Zm0-100v-240q50 0 85 35t35 85q0 50-35 85t-85 35ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-480H160v480Zm0 0v-480 480Z\"/></svg>',\n darkContrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M484-80q-84 0-157.5-32t-128-86.5Q144-253 112-326.5T80-484q0-146 93-257.5T410-880q-18 99 11 193.5T521-521q71 71 165.5 100T880-410q-26 144-138 237T484-80Zm0-80q88 0 163-44t118-121q-86-8-163-43.5T464-465q-61-61-97-138t-43-163q-77 43-120.5 118.5T160-484q0 135 94.5 229.5T484-160Zm-20-305Z\"/></svg>',\n lightContrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M440-800v-120h80v120h-80Zm0 760v-120h80v120h-80Zm360-400v-80h120v80H800Zm-760 0v-80h120v80H40Zm708-252-56-56 70-72 58 58-72 70ZM198-140l-58-58 72-70 56 56-70 72Zm564 0-70-72 56-56 72 70-58 58ZM212-692l-72-70 58-58 70 72-56 56Zm268 452q-100 0-170-70t-70-170q0-100 70-170t170-70q100 0 170 70t70 170q0 100-70 170t-170 70Zm0-80q67 0 113.5-46.5T640-480q0-67-46.5-113.5T480-640q-67 0-113.5 46.5T320-480q0 67 46.5 113.5T480-320Zm0-160Z\"/></svg>',\n invertColors: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-64-24.5-122.5T706-706L254-254q45 45 103.5 69.5T480-160Zm0-160v-60h200v60H480ZM320-500h60v-80h80v-60h-80v-80h-60v80h-80v60h80v80Z\"/></svg>',\n saturation: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-120q-133 0-226.5-92.5T160-436q0-66 25-122t69-100l226-222 226 222q44 44 69 100t25 122q0 131-93.5 223.5T480-120Zm0-80v-568L310-600q-35 33-52.5 74.5T240-436q0 97 70 166.5T480-200Z\"/></svg>',\n lowSaturation: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-120q-133 0-226.5-92T160-436q0-65 25-121.5T254-658l226-222 226 222q44 44 69 100.5T800-436q0 132-93.5 224T480-120ZM242-400h474q12-72-13.5-123T650-600L480-768 310-600q-27 26-53 77t-15 123Z\"/></svg>',\n highSaturation: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 32.5-156t88-127Q256-817 330-848.5T488-880q80 0 151 27.5t124.5 76q53.5 48.5 85 115T880-518q0 115-70 176.5T640-280h-74q-9 0-12.5 5t-3.5 11q0 12 15 34.5t15 51.5q0 50-27.5 74T480-80Zm0-400Zm-220 40q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm120-160q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm200 0q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm120 160q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17ZM480-160q9 0 14.5-5t5.5-13q0-14-15-33t-15-57q0-42 29-67t71-25h70q66 0 113-38.5T800-518q0-121-92.5-201.5T488-800q-136 0-232 93t-96 227q0 133 93.5 226.5T480-160Z\"/></svg>',\n reset: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M440-122q-121-15-200.5-105.5T160-440q0-66 26-126.5T260-672l57 57q-38 34-57.5 79T240-440q0 88 56 155.5T440-202v80Zm80 0v-80q87-16 143.5-83T720-440q0-100-70-170t-170-70h-3l44 44-56 56-140-140 140-140 56 56-44 44h3q134 0 227 93t93 227q0 121-79.5 211.5T520-122Z\"/></svg>',\n close: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z\"/></svg>',\n increase: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2Z\"/></svg>',\n decrease: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2Z\"/></svg>',\n arrowBack: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M400-80 0-480l400-400 71 71-329 329 329 329-71 71Z\"/></svg>',\n adjustFontSize: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M2 4v3h5v12h3V7h5V4H2m19 5h-9v3h3v7h3v-7h3V9Z\"/></svg>',\n language: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"currentColor\"><path d=\"M480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-155.5t86-127Q252-817 325-848.5T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 82-31.5 155t-86 127.5q-54.5 54.5-127 86T480-80Zm0-82q26-36 45-75t31-83H404q12 44 31 83t45 75Zm-104-16q-18-33-31.5-68.5T322-320H204q29 50 72.5 87t99.5 55Zm208 0q56-18 99.5-55t72.5-87H638q-9 38-22.5 73.5T584-178ZM170-400h136q-3-20-4.5-39.5T300-480q0-21 1.5-40.5T306-560H170q-5 20-7.5 39.5T160-480q0 21 2.5 40.5T170-400Zm216 0h188q3-20 4.5-39.5T580-480q0-21-1.5-40.5T574-560H386q-3 20-4.5 39.5T380-480q0 21 1.5 40.5T386-400Zm268 0h136q5-20 7.5-39.5T800-480q0-21-2.5-40.5T790-560H654q3 20 4.5 39.5T660-480q0 21-1.5 40.5T654-400Zm-16-240h118q-29-50-72.5-87T584-782q18 33 31.5 68.5T638-640Zm-234 0h152q-12-44-31-83t-45-75q-26 36-45 75t-31 83Zm-200 0h118q9-38 22.5-73.5T376-782q-56 18-99.5 55T204-640Z\"/></svg>',\n hideImages: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"m840-234-80-80v-446H314l-80-80h526q33 0 56.5 23.5T840-760v526ZM792-56l-64-64H200q-33 0-56.5-23.5T120-200v-528l-64-64 56-56 736 736-56 56ZM240-280l120-160 90 120 33-44-283-283v447h447l-80-80H240Zm297-257ZM424-424Z\"/></svg>',\n accessibilityReport: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h168q13-36 43.5-58t68.5-22q38 0 68.5 22t43.5 58h168q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm80-80h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm221.5-198.5Q510-807 510-820t-8.5-21.5Q493-850 480-850t-21.5 8.5Q450-833 450-820t8.5 21.5Q467-790 480-790t21.5-8.5ZM200-200v-560 560Z\"/></svg>',\n annotations: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v268q-19-9-39-15.5t-41-9.5v-243H200v560h242q3 22 9.5 42t15.5 38H200Zm0-120v40-560 243-3 280Zm80-40h163q3-21 9.5-41t14.5-39H280v80Zm0-160h244q32-30 71.5-50t84.5-27v-3H280v80Zm0-160h400v-80H280v80ZM720-40q-83 0-141.5-58.5T520-240q0-83 58.5-141.5T720-440q83 0 141.5 58.5T920-240q0 83-58.5 141.5T720-40Zm-20-80h40v-100h100v-40H740v-100h-40v100H600v40h100v100Z\"/></svg>',\n textToSpeech: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M560-131v-82q90-26 145-100t55-168q0-94-55-168T560-749v-82q124 28 202 125.5T840-481q0 127-78 224.5T560-131ZM120-360v-240h160l200-200v640L280-360H120Zm440 40v-322q47 22 73.5 66t26.5 96q0 51-26.5 94.5T560-320ZM400-606l-86 86H200v80h114l86 86v-252ZM300-480Z\"/></svg>',\n highContrast: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93v640Z\"/></svg>',\n simplifyLayout: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#1f1f1f\"><path d=\"M760-360v-80H200v80h560Zm0-160v-80H200v80h560Zm0-160v-80H200v80h560ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm560-80v-80H200v80h560Z\"/></svg>'\n};\n","export const TARGET_SELECTORS = {\n ALL: ['', '*:not(.material-icons,.acc-menu,.acc-menu *)'],\n LINKS: ['a[href]'],\n HEADERS: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', '.wsite-headline', '.wsite-content-title'],\n TEXT: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', '.wsite-headline', '.wsite-content-title', 'img', 'p', 'i', 'svg', 'a', 'button:not(.acc-btn)', 'label', 'li', 'ol']\n};\n\nexport const PAGE_CONTENT_SELECTOR = 'body > *:not(.acc-container):not(.acc-rg-container):not(#acc-skip-link)';\n","export const TRANSLATIONS = {\n en: {\n \"Accessibility Menu\": \"Accessibility Menu\",\n \"Reset settings\": \"Reset settings\",\n \"Reset All Settings\": \"Reset All Settings\",\n \"Close\": \"Close\",\n \"Content Adjustments\": \"Content Adjustments\",\n \"Adjust Font Size\": \"Adjust Font Size\",\n \"Highlight Title\": \"Highlight Title\",\n \"Highlight Links\": \"Highlight Links\",\n \"Readable Font\": \"Readable Font\",\n \"Color Adjustments\": \"Color Adjustments\",\n \"Invert Colors\": \"Invert Colors\",\n \"Light Contrast\": \"Light Contrast\",\n \"Dark Contrast\": \"Dark Contrast\",\n \"High Contrast\": \"High Contrast\",\n \"High Saturation\": \"High Saturation\",\n \"Low Saturation\": \"Low Saturation\",\n \"Monochrome\": \"Monochrome\",\n \"Tools\": \"Tools\",\n \"Reading Guide\": \"Reading Guide\",\n \"Stop Animations\": \"Stop Animations\",\n \"Big Cursor\": \"Big Cursor\",\n \"Increase Font Size\": \"Increase Font Size\",\n \"Decrease Font Size\": \"Decrease Font Size\",\n \"Letter Spacing\": \"Letter Spacing\",\n \"Line Height\": \"Line Height\",\n \"Font Weight\": \"Font Weight\",\n \"Dyslexia Font\": \"Dyslexia Font\",\n \"Language\": \"Language\",\n \"Open Accessibility Menu\": \"Open Accessibility Menu\",\n \"Hide Images\": \"Hide Images\",\n \"Skip to accessibility menu\": \"Skip to accessibility menu\",\n \"Accessibility Report\": \"Accessibility Report\",\n \"Run Accessibility Check\": \"Run Accessibility Check\",\n \"Loading...\": \"Loading...\",\n \"Analyzing page...\": \"Analyzing page...\",\n \"Critical\": \"Critical\",\n \"Serious\": \"Serious\",\n \"Moderate\": \"Moderate\",\n \"Minor\": \"Minor\",\n \"Violations Found\": \"Violations Found\",\n \"No Issues Found\": \"No Issues Found\",\n \"Element\": \"Element\",\n \"Issue\": \"Issue\",\n \"How to Fix\": \"How to Fix\",\n \"Close Report\": \"Close Report\",\n \"Passed Tests\": \"Passed Tests\",\n \"Items Need Review\": \"Items Need Review\",\n \"Annotations\": \"Annotations\",\n \"Text to Speech\": \"Text to Speech\",\n \"Text to Speech On\": \"Text to Speech On\",\n \"Text to Speech Off\": \"Text to Speech Off\",\n \"Simplify Layout\": \"Simplify Layout\",\n \"Play\": \"Play\",\n \"Pause\": \"Pause\",\n \"Stop\": \"Stop\",\n \"Loading voice...\": \"Loading voice...\",\n \"Reading...\": \"Reading...\",\n \"All Languages\": \"All Languages\",\n \"Search language\": \"Search language\",\n \"Font Size\": \"Font Size\",\n \"Contrast\": \"Contrast\",\n \"Saturation\": \"Saturation\",\n \"Accessibility\": \"Accessibility\"\n },\n ne: {\n \"Accessibility Menu\": \"पहुँच मेनु\",\n \"Reset settings\": \"सेटिङ रिसेट गर्नुहोस्\",\n \"Reset All Settings\": \"सबै सेटिङ रिसेट गर्नुहोस्\",\n \"Close\": \"बन्द गर्नुहोस्\",\n \"Content Adjustments\": \"सामग्री समायोजन\",\n \"Adjust Font Size\": \"फन्ट आकार समायोजन\",\n \"Highlight Title\": \"शीर्षक हाइलाइट\",\n \"Highlight Links\": \"लिङ्क हाइलाइट\",\n \"Readable Font\": \"पठनीय फन्ट\",\n \"Color Adjustments\": \"रङ समायोजन\",\n \"Invert Colors\": \"रङ उल्टाउनुहोस्\",\n \"Light Contrast\": \"हल्का कन्ट्रास्ट\",\n \"Dark Contrast\": \"गाढा कन्ट्रास्ट\",\n \"High Contrast\": \"उच्च कन्ट्रास्ट\",\n \"High Saturation\": \"उच्च संतृप्तता\",\n \"Low Saturation\": \"कम संतृप्तता\",\n \"Monochrome\": \"एकरङी\",\n \"Tools\": \"उपकरणहरू\",\n \"Reading Guide\": \"पठन सहायक\",\n \"Stop Animations\": \"एनिमेसन रोक्नुहोस्\",\n \"Big Cursor\": \"ठूलो कर्सर\",\n \"Increase Font Size\": \"फन्ट आकार बढाउनुहोस्\",\n \"Decrease Font Size\": \"फन्ट आकार घटाउनुहोस्\",\n \"Letter Spacing\": \"अक्षर दूरी\",\n \"Line Height\": \"लाइन उचाइ\",\n \"Font Weight\": \"फन्ट वजन\",\n \"Dyslexia Font\": \"डिस्लेक्सिया फन्ट\",\n \"Language\": \"भाषा\",\n \"Open Accessibility Menu\": \"पहुँच मेनु खोल्नुहोस्\",\n \"Hide Images\": \"तस्बिर लुकाउनुहोस्\",\n \"Skip to accessibility menu\": \"पहुँच मेनुमा जानुहोस्\",\n \"Accessibility Report\": \"पहुँच प्रतिवेदन\",\n \"Run Accessibility Check\": \"पहुँच जाँच चलाउनुहोस्\",\n \"Loading...\": \"लोड हुँदैछ...\",\n \"Analyzing page...\": \"पृष्ठ विश्लेषण हुँदैछ...\",\n \"Critical\": \"गम्भीर\",\n \"Serious\": \"साँघुरो\",\n \"Moderate\": \"मध्यम\",\n \"Minor\": \"सामान्य\",\n \"Violations Found\": \"उल्लंघनहरू फेला परे\",\n \"No Issues Found\": \"कुनै समस्या फेला परेन\",\n \"Element\": \"तत्व\",\n \"Issue\": \"समस्या\",\n \"How to Fix\": \"कसरी ठीक गर्ने\",\n \"Close Report\": \"प्रतिवेदन बन्द गर्नुहोस्\",\n \"Passed Tests\": \"पास भएका परीक्षणहरू\",\n \"Items Need Review\": \"समीक्षा आवश्यक वस्तुहरू\",\n \"Annotations\": \"टिप्पणीहरू\",\n \"Text to Speech\": \"पाठ वाचन\",\n \"Text to Speech On\": \"पाठ वाचन सक्रिय\",\n \"Text to Speech Off\": \"पाठ वाचन निष्क्रिय\",\n \"Simplify Layout\": \"लेआउट सरल बनाउनुहोस्\",\n \"Play\": \"प्ले\",\n \"Pause\": \"पज\",\n \"Stop\": \"रोक्नुहोस्\",\n \"Loading voice...\": \"आवाज लोड हुँदैछ...\",\n \"Reading...\": \"पढिँदैछ...\",\n \"All Languages\": \"सबै भाषाहरू\",\n \"Search language\": \"भाषा खोज्नुहोस्\",\n \"Font Size\": \"फन्ट आकार\",\n \"Contrast\": \"कन्ट्रास्ट\",\n \"Saturation\": \"संतृप्तता\",\n \"Accessibility\": \"पहुँचयोग्यता\"\n }\n};\n\nexport const SUPPORTED_LANGUAGES = [\n { code: 'en', label: 'English (English)' },\n { code: 'ne', label: 'नेपाली (Nepali)' }\n];\n","/** @typedef {import('./index.js').default} AllyWidget */\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const stateMethods = {\n\n storageAvailable() {\n try {\n const test = '__ally_test__';\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n },\n\n fetchCookie(name) {\n const cookieName = name + '=';\n try {\n const decodedCookie = decodeURIComponent(document.cookie);\n return decodedCookie.split(';')\n .map(c => c.trim())\n .find(c => c.startsWith(cookieName))\n ?.substring(cookieName.length) || '{}';\n } catch (e) {\n console.warn('[AllyWidget] Error reading cookie:', e);\n return '{}';\n }\n },\n\n storeCookie(name, value, days) {\n try {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = 'expires=' + d.toUTCString();\n const isSecure = window.location.protocol === 'https:';\n document.cookie = name + '=' + value + ';' + expires + ';path=/;SameSite=Strict' + (isSecure ? ';Secure' : '');\n } catch (e) {\n console.warn('[AllyWidget] Error setting cookie:', e);\n }\n },\n\n getSavedLanguage() {\n try {\n if (this.storageAvailable()) {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n const config = JSON.parse(stored);\n if (config.lang) return config.lang;\n }\n }\n const cookieVal = this.fetchCookie(this.storageKey);\n if (cookieVal && cookieVal !== '') {\n const config = JSON.parse(cookieVal);\n if (config.lang) return config.lang;\n }\n } catch {\n // ignore\n }\n return null;\n },\n\n getBrowserLanguage() {\n if (typeof navigator === 'undefined') return 'en';\n const supportedCodes = this.supportedLanguages.map(lang => lang.code);\n const browserLanguages = navigator.languages\n ? [...navigator.languages]\n : [navigator.language || 'en'];\n\n for (const browserLang of browserLanguages) {\n const primaryCode = browserLang.split('-')[0].toLowerCase();\n if (supportedCodes.includes(primaryCode)) return primaryCode;\n }\n return 'en';\n },\n\n getDefaultLanguage() {\n const savedLang = this.getSavedLanguage();\n if (savedLang) {\n const supportedCodes = this.supportedLanguages.map(lang => lang.code);\n if (supportedCodes.includes(savedLang)) return savedLang;\n }\n return this.getBrowserLanguage();\n },\n\n isDevMode() {\n if (typeof window === 'undefined') return false;\n try {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get('ally-dev') === 'true' || urlParams.get('acc-dev') === 'true';\n } catch {\n return false;\n }\n },\n\n getDataAttributeOptions() {\n const options = {};\n if (typeof document === 'undefined') return options;\n const attributes = ['lang', 'position', 'offset', 'size', 'icon'];\n\n const assignValue = (key, value) => {\n if (value === null || typeof value === 'undefined' || value === '') return;\n switch (key) {\n case 'lang': {\n const lang = String(value).trim();\n if (lang) options.lang = lang;\n break;\n }\n case 'position': {\n const position = String(value).trim();\n if (position) options.position = position;\n break;\n }\n case 'offset': {\n const normalized = this.normalizeOffset(value);\n if (normalized) options.offset = normalized;\n break;\n }\n case 'size': {\n const normalizedSize = this.normalizeButtonSize(value);\n if (normalizedSize) options.size = normalizedSize;\n break;\n }\n case 'icon': {\n const icon = String(value).trim();\n if (icon) options.icon = icon;\n break;\n }\n default: break;\n }\n };\n\n const inspectElement = (el) => {\n if (!el) return;\n attributes.forEach(key => {\n const attrName = `data-ally-${key}`;\n const fallback = `data-acc-${key}`;\n const attrValue = el.getAttribute ? (el.getAttribute(attrName) || el.getAttribute(fallback)) : null;\n assignValue(key, attrValue);\n });\n };\n\n const scriptCandidates = [];\n if (document.currentScript) scriptCandidates.push(document.currentScript);\n document.querySelectorAll('script[data-ally-lang],script[data-ally-position],script[data-ally-offset],script[data-ally-size],script[data-ally-icon]').forEach(script => {\n if (!scriptCandidates.includes(script)) scriptCandidates.push(script);\n });\n scriptCandidates.forEach(inspectElement);\n\n attributes.forEach(key => {\n if (options[key] !== undefined) return;\n const el = document.querySelector(`[data-ally-${key}]`) || document.querySelector(`[data-acc-${key}]`);\n if (el) assignValue(key, el.getAttribute(`data-ally-${key}`) || el.getAttribute(`data-acc-${key}`));\n });\n\n return options;\n },\n\n normalizeOffset(value) {\n if (!value && value !== 0) return undefined;\n let parts = [];\n if (Array.isArray(value)) {\n parts = value;\n } else if (typeof value === 'string') {\n parts = value.split(/[, ]+/);\n } else {\n parts = [value];\n }\n const parsed = parts\n .map(part => {\n const number = Number(part);\n return Number.isFinite(number) ? Math.round(number) : null;\n })\n .filter(number => number !== null);\n\n if (!parsed.length) return undefined;\n if (parsed.length === 1) parsed.push(parsed[0]);\n return [parsed[0], parsed[1] !== undefined ? parsed[1] : parsed[0]];\n },\n\n normalizeButtonSize(value) {\n const fallback = this.widgetTheme?.buttonSize || '52px';\n if (typeof value === 'number' && Number.isFinite(value)) {\n return `${Math.max(24, Math.round(value))}px`;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return fallback;\n if (/^\\d+(\\.\\d+)?(px|em|rem|%)$/i.test(trimmed)) return trimmed;\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) return `${Math.max(24, Math.round(numeric))}px`;\n return trimmed;\n }\n return fallback;\n },\n\n toggleDisplay(el, state) {\n if (!el) return;\n try {\n el.style.display = (typeof state === 'undefined')\n ? (el.style.display === 'none' ? 'block' : 'none')\n : (state ? 'block' : 'none');\n } catch (e) {\n console.warn('[AllyWidget] Error toggling element:', e);\n }\n },\n\n isSystemControlledPreference(key) {\n const systemDefaults = this.widgetConfig?.systemDefaults || {};\n return Object.prototype.hasOwnProperty.call(systemDefaults, key);\n },\n\n hasExplicitStatePreference(key) {\n const states = this.widgetConfig?.states || {};\n if (!Object.prototype.hasOwnProperty.call(states, key)) return false;\n return !this.isSystemControlledPreference(key);\n },\n\n hasExplicitColorFilterPreference() {\n const states = this.widgetConfig?.states || {};\n const systemDefaults = this.widgetConfig?.systemDefaults || {};\n const keys = Array.isArray(this.colorFilterKeys) ? this.colorFilterKeys : [];\n return keys.some((key) =>\n Object.prototype.hasOwnProperty.call(states, key) &&\n !Object.prototype.hasOwnProperty.call(systemDefaults, key)\n );\n },\n\n updateState(payload, options = {}) {\n const source = options.source || 'user';\n const previousStates = this.widgetConfig.states || {};\n const previousSystemDefaults = this.widgetConfig.systemDefaults || {};\n const nextStates = { ...previousStates, ...payload };\n const nextSystemDefaults = { ...previousSystemDefaults };\n const keys = Object.keys(payload || {});\n\n if (source === 'system') {\n keys.forEach((key) => { nextSystemDefaults[key] = payload[key]; });\n } else {\n keys.forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextSystemDefaults, key)) {\n delete nextSystemDefaults[key];\n }\n });\n }\n\n const updatedConfig = { ...this.widgetConfig, states: nextStates, systemDefaults: nextSystemDefaults };\n this.saveConfig(updatedConfig);\n return updatedConfig;\n },\n\n saveConfig(newConfig) {\n this.widgetConfig = { ...this.widgetConfig, ...newConfig };\n const data = JSON.stringify(this.widgetConfig);\n if (this.storageAvailable()) {\n try {\n localStorage.setItem(this.storageKey, data);\n } catch {\n this.storeCookie(this.storageKey, data, 365);\n }\n } else {\n this.storeCookie(this.storageKey, data, 365);\n }\n },\n\n retrieveState(key) {\n return this.widgetConfig.states ? this.widgetConfig.states[key] : undefined;\n },\n\n loadConfig(cache = true) {\n if (cache) return this.widgetConfig;\n const savedConfig = this.fetchSavedConfig();\n if (savedConfig) {\n try {\n this.widgetConfig = JSON.parse(savedConfig);\n } catch (e) {\n console.warn('[AllyWidget] Error parsing config:', e);\n this.widgetConfig = {};\n }\n }\n return this.widgetConfig;\n },\n\n fetchSavedConfig() {\n if (this.storageAvailable()) {\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) return stored;\n } catch (e) {\n console.warn('[AllyWidget] localStorage failed, falling back to cookies:', e);\n }\n }\n const cookieVal = this.fetchCookie(this.storageKey);\n return cookieVal && cookieVal !== '' ? cookieVal : '{}';\n }\n\n};\n","import menuCSS from './styles/menu.css';\nimport widgetCSS from './styles/widget.css';\nimport reportCSS from './styles/report.css';\nimport readingGuideCSS from './styles/reading-guide.css';\nimport skipLinkCSS from './styles/skip-link.css';\nimport annotationsCSS from './styles/annotations.css';\n\nconst STATIC_STYLE_ID = 'ally-static-styles';\nconst STATIC_STYLES = [\n menuCSS,\n widgetCSS,\n reportCSS,\n readingGuideCSS,\n skipLinkCSS,\n annotationsCSS\n].join('\\n');\n\n/** @typedef {import('./index.js').default} AllyWidget */\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const styleMethods = {\n\n findElement(selector, parent = document) {\n try {\n return parent.querySelector(selector);\n } catch (e) {\n console.warn(`[AllyWidget] Failed to query selector: ${selector}`, e);\n return null;\n }\n },\n\n injectStyle(id, css) {\n if (!css || typeof document === 'undefined') return;\n try {\n let style = document.getElementById(id) || document.createElement('style');\n style.innerHTML = css;\n if (!style.id) {\n style.id = id;\n document.head.appendChild(style);\n }\n } catch (e) {\n console.warn('[AllyWidget] Error adding stylesheet:', e);\n }\n },\n\n createCSS(styles) {\n let css = '';\n if (!styles) return css;\n const browserPrefixes = ['-o-', '-ms-', '-moz-', '-webkit-', ''];\n const prefixedProperties = ['filter'];\n for (let key in styles) {\n if (!Object.prototype.hasOwnProperty.call(styles, key)) continue;\n let prefixes = prefixedProperties.includes(key) ? browserPrefixes : [''];\n prefixes.forEach(prefix => {\n css += `${prefix}${key}:${styles[key]} !important;`;\n });\n }\n return css;\n },\n\n wrapCSS(selector, childrenSelector, css) {\n let output = '';\n childrenSelector.forEach(child => {\n output += `${selector} ${child}{${css}}`;\n });\n return output;\n },\n\n buildCSS(config) {\n if (!config) return '';\n let output = '';\n output += this.createCSS(config.styles || {});\n if (output.length && config.selector) {\n output = this.wrapCSS(config.selector, config.childrenSelector || [''], output);\n }\n output += config.css || '';\n return output;\n },\n\n applyToolStyle(config) {\n let { id = '', enable = false } = config;\n let styleId = `acc-${id}`;\n if (enable) {\n let css = this.buildCSS(config);\n this.injectStyle(styleId, css);\n } else {\n let style = document.getElementById(styleId);\n if (style) style.remove();\n }\n document.documentElement.classList.toggle(styleId, enable);\n },\n\n applyThemeVariables() {\n if (typeof document === 'undefined') return;\n const vars = {\n '--acc-primary-color': this.widgetTheme.primaryColor,\n '--acc-primary-color-light': this.widgetTheme.primaryColorLight,\n '--acc-primary-color-dark': this.widgetTheme.primaryColorDark,\n '--acc-bg-color': this.widgetTheme.backgroundColor,\n '--acc-text-color': this.widgetTheme.textColor,\n '--acc-text-color-inverted': this.widgetTheme.textColorInverted,\n '--acc-card-bg': this.widgetTheme.cardBackground,\n '--acc-border-color': this.widgetTheme.borderColor,\n '--acc-focus-ring-color': this.widgetTheme.focusRingColor,\n '--acc-hover-color': this.widgetTheme.hoverColor,\n '--acc-active-color': this.widgetTheme.activeColor,\n '--acc-border-radius': this.widgetTheme.borderRadius,\n '--acc-button-border-radius': this.widgetTheme.buttonBorderRadius,\n '--acc-header-height': this.widgetTheme.headerHeight,\n '--acc-focus-outline-width': this.widgetTheme.focusBorderWidth,\n '--acc-focus-outline-offset': this.widgetTheme.focusOutlineOffset,\n '--acc-widget-z-index': String(this.widgetTheme.zIndex),\n '--acc-button-size': this.widgetTheme.buttonSize\n };\n Object.entries(vars).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n },\n\n registerStaticStyles() {\n if (this.staticStylesRegistered) return;\n this.injectStyle(STATIC_STYLE_ID, STATIC_STYLES);\n this.staticStylesRegistered = true;\n }\n\n};\n","/** @typedef {import('./index.js').default} AllyWidget */\n\nconst AXE_CORE_VERSION = '4.11.1';\nconst AXE_CORE_SRC = `https://cdn.jsdelivr.net/npm/axe-core@${AXE_CORE_VERSION}/axe.min.js`;\nconst AXE_CORE_INTEGRITY = 'sha384-wb3zgvLcZeMFSec08dk7g8K8yDFFAX2uNKVwOUuowwc/wIfE2t6XVUjTEgPrOJCS';\nconst AXE_RUN_OPTIONS = {\n runOnly: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'best-practice']\n};\nconst MAX_ANNOTATIONS = 50;\nconst SYSTEM_PREFERS_REDUCED_MOTION = '(prefers-reduced-motion: reduce)';\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const featureMethods = {\n\n getContrastToggleDisplay(index) {\n if (index === 0) {\n return { key: 'light-contrast', label: 'Light', icon: this.widgetIcons.lightContrast };\n }\n if (index === 1) {\n return { key: 'dark-contrast', label: 'Dark', icon: this.widgetIcons.darkContrast };\n }\n return { key: null, label: 'Contrast', icon: this.widgetIcons.contrast };\n },\n\n updateContrastToggleButton(button, index) {\n if (!button) return;\n const display = this.getContrastToggleDisplay(index);\n const iconNode = button.querySelector('svg');\n if (iconNode) {\n iconNode.outerHTML = display.icon;\n } else {\n button.insertAdjacentHTML('afterbegin', display.icon);\n }\n\n const translatedLabel = this.translate(display.label);\n const labelNode = button.querySelector('.acc-label');\n if (labelNode) {\n labelNode.setAttribute('data-acc-text', display.label);\n labelNode.innerText = translatedLabel;\n }\n button.setAttribute('title', translatedLabel);\n button.setAttribute('aria-label', translatedLabel);\n button.setAttribute('data-contrast-mode', display.key || 'off');\n },\n\n getSaturationToggleDisplay(index) {\n if (index === 0) {\n return { key: 'low-saturation', label: 'Low', icon: this.widgetIcons.lowSaturation };\n }\n if (index === 1) {\n return { key: 'high-saturation', label: 'High', icon: this.widgetIcons.highSaturation };\n }\n return { key: null, label: 'Saturation', icon: this.widgetIcons.saturation };\n },\n\n updateSaturationToggleButton(button, index) {\n if (!button) return;\n const display = this.getSaturationToggleDisplay(index);\n const iconNode = button.querySelector('svg');\n if (iconNode) {\n iconNode.outerHTML = display.icon;\n } else {\n button.insertAdjacentHTML('afterbegin', display.icon);\n }\n\n const translatedLabel = this.translate(display.label);\n const labelNode = button.querySelector('.acc-label');\n if (labelNode) {\n labelNode.setAttribute('data-acc-text', display.label);\n labelNode.innerText = translatedLabel;\n }\n button.setAttribute('title', translatedLabel);\n button.setAttribute('aria-label', translatedLabel);\n button.setAttribute('data-saturation-mode', display.key || 'off');\n },\n\n ensureSkipLink() {\n if (typeof document === 'undefined') return null;\n if (this.skipLinkElement && document.body.contains(this.skipLinkElement)) {\n this.updateSkipLinkLabel();\n return this.skipLinkElement;\n }\n const existing = document.getElementById('acc-skip-link');\n if (existing) {\n this.skipLinkElement = existing;\n if (!existing.getAttribute('data-acc-text')) {\n existing.setAttribute('data-acc-text', 'Skip to accessibility menu');\n }\n this.updateSkipLinkLabel();\n return existing;\n }\n \n const button = document.createElement('button');\n button.type = 'button';\n button.id = 'acc-skip-link';\n button.className = 'acc-skip-link';\n button.setAttribute('tabindex', '0');\n button.setAttribute('data-acc-text', 'Skip to accessibility menu');\n button.setAttribute('aria-label', this.translate('Skip to accessibility menu'));\n button.textContent = this.translate('Skip to accessibility menu');\n \n button.addEventListener('click', (event) => {\n event.preventDefault();\n const toggle = this.widgetToggleButton;\n if (!toggle) return;\n \n const currentMenu = this.activeMenuContainer || this.menuContainer;\n const menuIsVisible = currentMenu && currentMenu.style.display !== 'none';\n \n const focusMenu = () => {\n const targetMenu = this.activeMenuContainer || this.menuContainer;\n if (!targetMenu) return;\n const focusables = this.getFocusableElements(targetMenu);\n if (focusables.length) {\n focusables[0].focus();\n }\n };\n \n if (!menuIsVisible) {\n toggle.click();\n requestAnimationFrame(focusMenu);\n } else {\n focusMenu();\n }\n });\n \n document.body.insertBefore(button, document.body.firstChild);\n this.skipLinkElement = button;\n return button;\n },\n\n updateSkipLinkLabel() {\n if (!this.skipLinkElement) return;\n const key = this.skipLinkElement.getAttribute('data-acc-text') || 'Skip to accessibility menu';\n const label = this.translate(key);\n this.skipLinkElement.textContent = label;\n this.skipLinkElement.setAttribute('aria-label', label);\n },\n\n shouldSkipScaling(element) {\n return element.closest('.acc-menu, .acc-container, .acc-widget');\n },\n\n collectDirectTextParents(rootElement = document.body) {\n const directTextParents = new Set();\n if (typeof document === 'undefined' || typeof NodeFilter === 'undefined') {\n return directTextParents;\n }\n\n const root = rootElement instanceof Element ? rootElement : document.body;\n if (!root) return directTextParents;\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode: (node) => {\n if (!node || !node.textContent || !node.textContent.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n const parent = node.parentElement;\n if (!parent) return NodeFilter.FILTER_REJECT;\n if (this.shouldSkipScaling(parent)) return NodeFilter.FILTER_REJECT;\n if (parent.closest('script,style,noscript,textarea,pre,code,svg')) {\n return NodeFilter.FILTER_REJECT;\n }\n if (parent.matches(this.textScaleSelectors)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n\n let currentNode = walker.nextNode();\n while (currentNode) {\n const parent = currentNode.parentElement;\n if (parent) {\n directTextParents.add(parent);\n }\n currentNode = walker.nextNode();\n }\n\n return directTextParents;\n },\n\n applyScaleToElement(element, multiplier) {\n if (\n !element ||\n !(element instanceof Element) ||\n this.shouldSkipScaling(element) ||\n element.classList.contains('material-icons') ||\n element.classList.contains('fa')\n ) {\n return;\n }\n const baseAttr = 'data-acc-baseSize';\n if (!element.hasAttribute(baseAttr)) {\n const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n if (Number.isNaN(computedSize) || computedSize <= 0) {\n return;\n }\n element.setAttribute(baseAttr, String(computedSize));\n }\n const baseSize = parseFloat(element.getAttribute(baseAttr));\n if (Number.isNaN(baseSize) || baseSize <= 0) {\n return;\n }\n element.style.fontSize = `${baseSize * multiplier}px`;\n },\n\n ensureTextScaleObserver() {\n if (this.textScaleObserver || !document.body) return;\n this.textScaleObserver = new MutationObserver((mutations) => {\n if (Math.abs(this.currentTextScaleMultiplier - 1) < 0.001) {\n return;\n }\n const pending = new Set();\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (!(node instanceof Element)) return;\n if (node.matches && node.matches(this.textScaleSelectors)) {\n pending.add(node);\n }\n node.querySelectorAll?.(this.textScaleSelectors).forEach(el => pending.add(el));\n this.collectDirectTextParents(node).forEach(el => pending.add(el));\n });\n });\n if (!pending.size) return;\n pending.forEach(el => this.applyScaleToElement(el, this.currentTextScaleMultiplier));\n });\n this.textScaleObserver.observe(document.body, { childList: true, subtree: true });\n },\n\n disconnectTextScaleObserver() {\n if (!this.textScaleObserver) return;\n this.textScaleObserver.disconnect();\n this.textScaleObserver = null;\n },\n\n scaleText(multiply = 1) {\n try {\n const numericMultiply = Number(multiply);\n const resolvedMultiply = Number.isFinite(numericMultiply) && numericMultiply > 0 ? numericMultiply : 1;\n const isDefaultScale = Math.abs(resolvedMultiply - 1) < 0.001;\n this.currentTextScaleMultiplier = resolvedMultiply;\n if (!isDefaultScale) {\n this.ensureTextScaleObserver();\n const elements = document.querySelectorAll(this.textScaleSelectors);\n elements.forEach(el => this.applyScaleToElement(el, resolvedMultiply));\n this.collectDirectTextParents(document.body).forEach(el => this.applyScaleToElement(el, resolvedMultiply));\n } else {\n this.disconnectTextScaleObserver();\n const scaledElements = document.querySelectorAll('[data-acc-baseSize]');\n scaledElements.forEach(el => {\n if (this.shouldSkipScaling(el)) return;\n el.style.fontSize = '';\n el.removeAttribute('data-acc-baseSize');\n });\n }\n } catch (e) {\n console.warn('Error scaling text:', e);\n }\n },\n\n clampTextScalePercent(percent) {\n const min = Number(this.textScaleMinPercent) || 80;\n const max = Number(this.textScaleMaxPercent) || 150;\n const step = Number(this.textScaleStepPercent) || 5;\n const numeric = Number(percent);\n if (!Number.isFinite(numeric)) return 100;\n const snapped = Math.round((numeric - min) / step) * step + min;\n return Math.min(max, Math.max(min, snapped));\n },\n\n getTextScalePercent(scaleValue = 1) {\n if (scaleValue === false || scaleValue === null || typeof scaleValue === 'undefined') {\n return this.clampTextScalePercent(100);\n }\n const numeric = Number(scaleValue);\n if (!Number.isFinite(numeric)) {\n return this.clampTextScalePercent(100);\n }\n if (numeric <= 0) {\n return this.clampTextScalePercent(100);\n }\n const percent = numeric > 10 ? numeric : numeric * 100;\n return this.clampTextScalePercent(percent);\n },\n\n syncTextScaleControlUI(menu, scaleValue = 1) {\n if (!menu || !menu.querySelector) return;\n const range = menu.querySelector('.acc-text-scale-range');\n const label = menu.querySelector('.acc-text-scale-percent');\n const percent = this.getTextScalePercent(scaleValue);\n if (range) {\n const min = Number(this.textScaleMinPercent) || 80;\n const max = Number(this.textScaleMaxPercent) || 150;\n const progress = ((percent - min) / (max - min)) * 100;\n range.value = String(percent);\n range.style.setProperty('--acc-text-scale-progress', `${Math.max(0, Math.min(100, progress))}%`);\n }\n if (label) {\n label.textContent = `${percent}%`;\n }\n },\n\n setTextScaleFromPercent(percent, options = {}) {\n const shouldPersist = options.persist !== false;\n const clampedPercent = this.getTextScalePercent(percent);\n const multiplier = Number((clampedPercent / 100).toFixed(2));\n const exactIndex = this.textScaleValues.indexOf(multiplier);\n\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = exactIndex;\n }\n\n if (exactIndex > -1) {\n this.textScaleIndex = exactIndex;\n } else {\n let nearestIndex = 0;\n let minDistance = Infinity;\n this.textScaleValues.forEach((value, index) => {\n const distance = Math.abs(value - multiplier);\n if (distance < minDistance) {\n minDistance = distance;\n nearestIndex = index;\n }\n });\n this.textScaleIndex = nearestIndex;\n }\n\n this.scaleText(multiplier);\n\n if (shouldPersist) {\n this.updateState({ 'text-scale': multiplier });\n }\n\n return multiplier;\n },\n\n enableBoldText(enable = false) {\n const contentSelector = [\n '*',\n ':not(.material-icons)',\n ':not(.material-icons-outlined)',\n ':not(.material-icons-round)',\n ':not(.material-symbols-outlined)',\n ':not(.material-symbols-rounded)',\n ':not(.fa)',\n ':not(.fas)',\n ':not(.far)',\n ':not(.fab)',\n ':not(.fa-solid)',\n ':not(.fa-regular)',\n ':not(.fa-brands)',\n ':not(.glyphicon)',\n ':not(.icon)',\n ':not(.icons)',\n ':not([class*=\"icon-\"])',\n ':not([data-icon])'\n ].join('');\n const config = {\n id: \"bold-text\",\n selector: \"body\",\n childrenSelector: [contentSelector],\n styles: { 'font-weight': '700' },\n css: `\n .acc-container, .acc-container *, .acc-menu, .acc-menu * {\n font-weight: inherit !important;\n }\n input::placeholder, textarea::placeholder {\n font-weight: 700 !important;\n }\n `\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n adjustLetterSpacing(enable = false) {\n const config = {\n id: \"letter-spacing\",\n selector: \"html\",\n childrenSelector: ['', '*:not(.material-icons,.acc-menu,.acc-menu *, .acc-widget, .acc-widget *)'],\n styles: { 'letter-spacing': '2px' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n adjustLineSpacing(enable = false) {\n const config = {\n id: \"line-spacing\",\n selector: \"html\",\n childrenSelector: ['', '*:not(.material-icons,.acc-menu,.acc-menu *, .acc-widget, .acc-widget *)'],\n styles: { 'line-height': '3' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n enableLargePointer(enable = false) {\n const config = {\n id: \"large-pointer\",\n selector: \"body\",\n childrenSelector: ['*'],\n styles: {\n 'cursor': `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='98px' height='98px' viewBox='0 0 48 48'%3E%3Cpath fill='%23FFFFFF' d='M27.8 39.7c-.1 0-.2 0-.4-.1s-.4-.3-.6-.5l-3.7-8.6-4.5 4.2c-.1.2-.3.3-.6.3-.1 0-.3 0-.4-.1-.3-.1-.6-.5-.6-.9V12c0-.4.2-.8.6-.9.1-.1.3-.1.4-.1.2 0 .5.1.7.3l16 15c.3.3.4.7.3 1.1-.1.4-.5.6-.9.7l-6.3.6 3.9 8.5c.1.2.1.5 0 .8-.1.2-.3.5-.5.6l-2.9 1.3c-.2-.2-.4-.2-.5-.2z'/%3E%3Cpath fill='%23212121' d='m18 12 16 15-7.7.7 4.5 9.8-2.9 1.3-4.3-9.9L18 34V12m0-2c-.3 0-.5.1-.8.2-.7.3-1.2 1-1.2 1.8v22c0 .8.5 1.5 1.2 1.8.3.2.6.2.8.2.5 0 1-.2 1.4-.5l3.4-3.2 3.1 7.3c.2.5.6.9 1.1 1.1.2.1.5.1.7.1.3 0 .5-.1.8-.2l2.9-1.3c.5-.2.9-.6 1.1-1.1.2-.5.2-1.1 0-1.5l-3.3-7.2 4.9-.4c.8-.1 1.5-.6 1.7-1.3.3-.7.1-1.6-.5-2.1l-16-15c-.3-.5-.8-.7-1.3-.7z'/%3E%3C/svg%3E\") 40 15, auto`\n }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n highlightLinks(enable = false) {\n const config = {\n id: \"highlight-links\",\n selector: \"html\",\n childrenSelector: [\n \"a[href]:not(.acc-menu a, .acc-widget a)\",\n \"summary.header__menu-item:not(.acc-menu summary, .acc-widget summary)\",\n \"summary.link:not(.acc-menu summary, .acc-widget summary)\",\n \"summary[role='button']:not(.acc-menu summary, .acc-widget summary)\",\n \"details > summary.list-menu__item:not(.acc-menu summary, .acc-widget summary)\",\n \".header__menu-item[role='button']:not(.acc-menu *, .acc-widget *)\"\n ],\n styles: { 'outline': `3px solid ${this.widgetTheme.primaryColor}`, 'outline-offset': '2px' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n highlightTitles(enable = false) {\n const config = {\n id: \"highlight-title\",\n selector: \"html\",\n childrenSelector: this.targetSelectors.HEADERS,\n styles: { 'outline': `3px solid ${this.widgetTheme.primaryColor}`, 'outline-offset': '2px' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n ensureReadableFontLoaded() {\n if (this.readableFontLoaded) return;\n const existing = document.getElementById('acc-readable-text-font');\n if (existing) {\n this.readableFontLoaded = true;\n return;\n }\n const style = document.createElement('style');\n style.id = 'acc-readable-text-font';\n style.textContent = `\n @font-face {\n font-family: \"OpenDyslexic3\";\n src: url(\"https://website-widgets.pages.dev/fonts/OpenDyslexic3-Regular.woff\") format(\"woff\"),\n url(\"https://website-widgets.pages.dev/fonts/OpenDyslexic3-Regular.ttf\") format(\"truetype\");\n font-display: swap;\n }\n `;\n document.head.appendChild(style);\n this.readableFontLoaded = true;\n },\n\n enableReadableText(enable = false) {\n const shouldEnable = !!enable;\n if (shouldEnable) {\n this.ensureReadableFontLoaded();\n }\n const contentSelector = [\n '*',\n ':not(.material-icons)',\n ':not(.material-icons-outlined)',\n ':not(.material-icons-round)',\n ':not(.material-symbols-outlined)',\n ':not(.material-symbols-rounded)',\n ':not(.fa)',\n ':not(.fas)',\n ':not(.far)',\n ':not(.fab)',\n ':not(.fa-solid)',\n ':not(.fa-regular)',\n ':not(.fa-brands)',\n ':not(.glyphicon)',\n ':not(.icon)',\n ':not(.icons)',\n ':not([class*=\"icon-\"])',\n ':not([data-icon])'\n ].join('');\n const config = {\n id: \"readable-text\",\n selector: \"body\",\n childrenSelector: [contentSelector],\n styles: { \n 'font-family': '\"OpenDyslexic3\", \"Comic Sans MS\", Arial, Helvetica, sans-serif' \n },\n css: `\n .acc-container, .acc-container *, .acc-menu, .acc-menu * {\n font-family: inherit !important;\n }\n input::placeholder, textarea::placeholder {\n font-family: \"OpenDyslexic3\", \"Comic Sans MS\", Arial, Helvetica, sans-serif !important;\n }\n `\n };\n this.applyToolStyle({ ...config, enable: shouldEnable });\n },\n\n pauseMotion(enable = false) {\n const config = {\n id: \"pause-motion\",\n selector: \"html\",\n childrenSelector: ['*'],\n styles: { 'transition': 'none', 'animation-fill-mode': 'forwards', 'animation-iteration-count': '1', 'animation-duration': '.01s' }\n };\n this.applyToolStyle({ ...config, enable });\n },\n\n enableHighContrastMode(enable = false) {\n const X = ':not(.acc-container):not(.acc-container *):not(.acc-rg-container):not(.acc-rg-container *)';\n const config = {\n id: 'high-contrast-mode',\n css: `\n /* ── Base: force black on white ── */\n body.acc-high-contrast-mode *${X} {\n color: #000 !important;\n background-color: #fff !important;\n background-image: none !important;\n text-shadow: none !important;\n box-shadow: none !important;\n }\n\n body.acc-high-contrast-mode {\n background: #fff !important;\n }\n\n /* ── Borders: solid and visible ── */\n body.acc-high-contrast-mode *${X} {\n border-color: #000 !important;\n }\n\n /* ── Links: underlined, distinct color ── */\n body.acc-high-contrast-mode a${X} {\n color: #00e !important;\n text-decoration: underline !important;\n }\n\n body.acc-high-contrast-mode a:visited${X} {\n color: #551a8b !important;\n }\n\n /* ── Headings: bold black ── */\n body.acc-high-contrast-mode :where(h1,h2,h3,h4,h5,h6)${X} {\n color: #000 !important;\n font-weight: 700 !important;\n }\n\n /* ── Images: keep visible, add border ── */\n body.acc-high-contrast-mode img${X} {\n border: 1px solid #000 !important;\n }\n\n /* ── Inputs & buttons: high-contrast borders ── */\n body.acc-high-contrast-mode :where(input, textarea, select, button)${X} {\n border: 2px solid #000 !important;\n background: #fff !important;\n color: #000 !important;\n }\n\n /* ── Focus rings: thick, high-visibility ── */\n body.acc-high-contrast-mode :focus-visible${X} {\n outline: 3px solid #000 !important;\n outline-offset: 2px !important;\n }\n\n /* ── Tables: visible cell borders ── */\n body.acc-high-contrast-mode :where(table, th, td)${X} {\n border: 1px solid #000 !important;\n }\n `\n };\n this.applyToolStyle({ ...config, enable });\n document.body?.classList.toggle('acc-high-contrast-mode', !!enable);\n },\n\n enableReadingAid(enable = false) {\n try {\n let container = this.findElement('.acc-rg-container');\n const guideHeight = 100; // Height of the clear reading window\n \n if (enable) {\n // Always clean up existing listener first to prevent duplicates\n if (window.__accweb__scrollGuide) {\n document.removeEventListener('mousemove', window.__accweb__scrollGuide);\n delete window.__accweb__scrollGuide;\n }\n \n if (!container) {\n // Create container but don't make it visible yet\n container = document.createElement('div');\n container.setAttribute('class', 'acc-rg-container');\n container.setAttribute('aria-hidden', 'true');\n container.innerHTML = this.readingAidTemplate;\n document.body.prepend(container);\n }\n \n const rgTop = container.querySelector('.acc-rg-top');\n const rgBottom = container.querySelector('.acc-rg-bottom');\n \n // Initially hide the guide completely\n rgTop.style.display = 'none';\n rgBottom.style.display = 'none';\n this.readingAidVisible = false;\n \n const updateGuidePosition = this.throttle((event) => {\n // If first mouse movement after enabling, make the guide visible\n if (!this.readingAidVisible) {\n rgTop.style.display = 'block';\n rgBottom.style.display = 'block';\n this.readingAidVisible = true;\n }\n \n // Position the guide at the mouse Y coordinate\n const mouseY = event.clientY;\n const topHeight = Math.max(0, mouseY - guideHeight / 2);\n const bottomHeight = Math.max(0, window.innerHeight - (mouseY + guideHeight / 2));\n rgTop.style.height = `${topHeight}px`;\n rgBottom.style.height = `${bottomHeight}px`;\n }, 16);\n \n window.__accweb__scrollGuide = updateGuidePosition;\n document.addEventListener('mousemove', updateGuidePosition, { passive: true });\n } else {\n // Reset visibility flag when disabled\n this.readingAidVisible = false;\n \n // Clean up event listener\n if (window.__accweb__scrollGuide) {\n document.removeEventListener('mousemove', window.__accweb__scrollGuide);\n delete window.__accweb__scrollGuide;\n }\n \n // Remove container\n if (container) {\n container.remove();\n }\n }\n } catch (e) {\n console.warn('Error with reading aid:', e);\n }\n },\n\n loadAxeCore() {\n if (this.axeCoreLoaded && window.axe) {\n return Promise.resolve(window.axe);\n }\n \n if (this.axeCorePromise) {\n return this.axeCorePromise;\n }\n \n this.axeCoreLoading = true;\n this.axeCorePromise = new Promise((resolve, reject) => {\n let script = document.querySelector('script[data-acc-axe-core=\"true\"]');\n let settled = false;\n let timeoutId = null;\n \n const settleSuccess = () => {\n if (settled) return;\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n if (!window.axe) {\n this.axeCoreLoading = false;\n this.axeCoreLoaded = false;\n this.axeCorePromise = null;\n reject(new Error('axe-core loaded but window.axe is unavailable'));\n return;\n }\n this.axeCoreLoading = false;\n this.axeCoreLoaded = true;\n if (script) {\n script.setAttribute('data-acc-axe-core-loaded', 'true');\n }\n resolve(window.axe);\n };\n \n const settleError = (error) => {\n if (settled) return;\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n this.axeCoreLoading = false;\n this.axeCoreLoaded = false;\n this.axeCorePromise = null;\n reject(error);\n };\n \n if (window.axe) {\n settleSuccess();\n return;\n }\n \n if (script && !script.src.includes(`/axe-core@${AXE_CORE_VERSION}/`)) {\n script.remove();\n script = null;\n }\n\n if (!script) {\n script = document.createElement('script');\n script.src = AXE_CORE_SRC;\n script.async = true;\n script.integrity = AXE_CORE_INTEGRITY;\n script.crossOrigin = 'anonymous';\n script.setAttribute('data-acc-axe-core', 'true');\n document.head.appendChild(script);\n }\n \n script.addEventListener('load', settleSuccess, { once: true });\n script.addEventListener('error', () => settleError(new Error('Failed to load axe-core')), { once: true });\n timeoutId = setTimeout(() => {\n settleError(new Error('Timed out loading axe-core'));\n }, 15000);\n });\n \n return this.axeCorePromise;\n },\n\n getAxeRunOptions() {\n return { ...AXE_RUN_OPTIONS };\n },\n\n getViolationCounts(results = {}) {\n const counts = { critical: 0, serious: 0, moderate: 0, minor: 0 };\n const violations = Array.isArray(results.violations) ? results.violations : [];\n violations.forEach((violation) => {\n const impact = violation?.impact;\n if (impact && counts[impact] !== undefined) {\n counts[impact] += Array.isArray(violation.nodes) ? violation.nodes.length : 0;\n }\n });\n return counts;\n },\n\n updateViolationBubble(results = null) {\n const bubble = this.violationBubble || this.findElement('.acc-violation-bubble');\n if (!bubble) return;\n\n const counts = this.getViolationCounts(results || this.axeScanResults || {});\n const devMode = this.isDevMode();\n\n let displayCount = 0;\n let severity = '';\n\n if (counts.critical > 0) {\n displayCount = counts.critical;\n severity = 'critical';\n } else if (devMode && counts.serious > 0) {\n displayCount = counts.serious;\n severity = 'serious';\n } else if (devMode && counts.moderate > 0) {\n displayCount = counts.moderate;\n severity = 'moderate';\n }\n\n if (displayCount <= 0) {\n bubble.textContent = '';\n bubble.hidden = true;\n bubble.removeAttribute('data-severity');\n return;\n }\n\n bubble.hidden = false;\n bubble.dataset.severity = severity;\n bubble.textContent = displayCount > 99 ? '99+' : String(displayCount);\n },\n\n async runBackgroundAxeScan({ force = false } = {}) {\n if (!force && this.axeScanResults) {\n this.updateViolationBubble(this.axeScanResults);\n return this.axeScanResults;\n }\n\n if (!force && this.axeScanPromise) {\n return this.axeScanPromise;\n }\n\n this.axeScanPromise = (async () => {\n try {\n const axe = await this.loadAxeCore();\n const results = await axe.run(document, this.getAxeRunOptions());\n this.axeScanResults = results;\n this.updateViolationBubble(results);\n return results;\n } catch (error) {\n this.updateViolationBubble({ violations: [] });\n throw error;\n } finally {\n this.axeScanPromise = null;\n }\n })();\n\n return this.axeScanPromise;\n },\n\n ensureMediaQuery(query) {\n if (!query || typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return null;\n }\n if (!this.systemPreferenceMediaQueries) {\n this.systemPreferenceMediaQueries = {};\n }\n if (!this.systemPreferenceMediaQueries[query]) {\n this.systemPreferenceMediaQueries[query] = window.matchMedia(query);\n }\n return this.systemPreferenceMediaQueries[query];\n },\n\n applySystemMotionPreference(shouldEnable) {\n this.loadConfig();\n if (this.hasExplicitStatePreference('pause-motion')) {\n return false;\n }\n\n const currentValue = !!this.retrieveState('pause-motion');\n if (currentValue === shouldEnable && this.isSystemControlledPreference('pause-motion')) {\n return false;\n }\n\n this.updateState({ 'pause-motion': shouldEnable }, { source: 'system' });\n return true;\n },\n\n detectSystemPreferences() {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n\n const reducedMotionQuery = this.ensureMediaQuery(SYSTEM_PREFERS_REDUCED_MOTION);\n const shouldPauseMotion = !!reducedMotionQuery?.matches;\n const motionChanged = this.applySystemMotionPreference(shouldPauseMotion);\n\n if (motionChanged) {\n this.applyEnhancements();\n }\n },\n\n clearSystemPreferenceListeners() {\n const listeners = Array.isArray(this.systemPreferenceListeners) ? this.systemPreferenceListeners : [];\n listeners.forEach((remove) => {\n if (typeof remove === 'function') {\n remove();\n }\n });\n this.systemPreferenceListeners = [];\n },\n\n setupMediaQueryListeners() {\n this.clearSystemPreferenceListeners();\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n\n const reducedMotionQuery = this.ensureMediaQuery(SYSTEM_PREFERS_REDUCED_MOTION);\n\n const listen = (mediaQuery, handler) => {\n if (!mediaQuery || typeof handler !== 'function') return;\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handler);\n this.systemPreferenceListeners.push(() => mediaQuery.removeEventListener('change', handler));\n } else if (typeof mediaQuery.addListener === 'function') {\n mediaQuery.addListener(handler);\n this.systemPreferenceListeners.push(() => mediaQuery.removeListener(handler));\n }\n };\n\n const onReducedMotionChange = (event) => {\n const changed = this.applySystemMotionPreference(!!event.matches);\n if (changed) {\n this.applyEnhancements();\n }\n };\n\n listen(reducedMotionQuery, onReducedMotionChange);\n },\n\n async runAccessibilityReport() {\n // Create or get report panel\n let panel = this.findElement('.acc-report-panel');\n \n if (!panel) {\n panel = this.createReportPanel();\n document.body.appendChild(panel);\n }\n \n this.openReportPanel(panel);\n \n const contentArea = this.findElement('.acc-report-content', panel);\n const statusArea = this.findElement('.acc-report-status', panel);\n \n // Show loading state\n statusArea.textContent = this.translate('Loading...');\n contentArea.innerHTML = `<div class=\"acc-report-loading\">${this.translate('Analyzing page...')}</div>`;\n \n try {\n const results = await this.runBackgroundAxeScan({ force: true });\n\n this.displayReportResults(panel, results);\n \n } catch (error) {\n contentArea.innerHTML = `<div class=\"acc-report-error\">Error: ${error.message}</div>`;\n statusArea.textContent = '';\n }\n },\n\n getReportFocusableElements(panel) {\n if (!panel) return [];\n const dialog = this.findElement('.acc-report-dialog', panel);\n return this.getFocusableElements(dialog || panel);\n },\n\n openReportPanel(panel) {\n if (!panel) return;\n \n this.reportPreviousFocus = document.activeElement && typeof document.activeElement.focus === 'function'\n ? document.activeElement\n : null;\n \n panel.classList.add('acc-report-visible');\n panel.setAttribute('aria-hidden', 'false');\n \n const dialog = this.findElement('.acc-report-dialog', panel);\n const focusTarget = dialog || panel;\n if (!focusTarget.hasAttribute('tabindex')) {\n focusTarget.setAttribute('tabindex', '-1');\n }\n \n if (this.reportKeyListener) {\n document.removeEventListener('keydown', this.reportKeyListener, true);\n }\n \n this.reportKeyListener = (event) => {\n if (!panel.classList.contains('acc-report-visible')) return;\n \n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n event.stopPropagation();\n this.closeReportPanel();\n return;\n }\n \n if (event.key !== 'Tab') return;\n \n const focusables = this.getReportFocusableElements(panel);\n if (!focusables.length) {\n event.preventDefault();\n focusTarget.focus();\n return;\n }\n \n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement;\n const outsidePanel = !panel.contains(active);\n \n if (event.shiftKey) {\n if (active === first || outsidePanel) {\n event.preventDefault();\n last.focus();\n }\n return;\n }\n \n if (active === last || outsidePanel) {\n event.preventDefault();\n first.focus();\n }\n };\n \n document.addEventListener('keydown', this.reportKeyListener, true);\n \n requestAnimationFrame(() => {\n const focusables = this.getReportFocusableElements(panel);\n if (focusables.length) {\n focusables[0].focus();\n return;\n }\n focusTarget.focus();\n });\n },\n\n createReportPanel() {\n const panel = document.createElement('div');\n panel.className = 'acc-report-panel acc-container';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-hidden', 'true');\n panel.setAttribute('aria-labelledby', 'acc-report-title');\n \n panel.innerHTML = `\n <div class=\"acc-report-overlay\"></div>\n <div class=\"acc-report-dialog\">\n <div class=\"acc-report-header\">\n <h2 id=\"acc-report-title\" class=\"acc-report-title\">${this.translate('Accessibility Report')}</h2>\n <button type=\"button\" class=\"acc-report-close\" aria-label=\"${this.translate('Close')}\">${this.widgetIcons.close}</button>\n </div>\n <div class=\"acc-report-status\"></div>\n <div class=\"acc-report-content\"></div>\n <div class=\"acc-report-footer\">\n <span class=\"acc-report-powered\">Powered by axe-core</span>\n </div>\n </div>\n `;\n \n // Close handlers\n const closeBtn = panel.querySelector('.acc-report-close');\n const overlay = panel.querySelector('.acc-report-overlay');\n \n closeBtn.addEventListener('click', () => this.closeReportPanel());\n overlay.addEventListener('click', () => this.closeReportPanel());\n \n return panel;\n },\n\n displayReportResults(panel, results) {\n const contentArea = this.findElement('.acc-report-content', panel);\n const statusArea = this.findElement('.acc-report-status', panel);\n \n const violations = results.violations || [];\n const passes = results.passes || [];\n const incomplete = results.incomplete || [];\n \n // Count by severity\n const counts = { critical: 0, serious: 0, moderate: 0, minor: 0 };\n violations.forEach(v => {\n if (counts[v.impact] !== undefined) {\n counts[v.impact] += v.nodes.length;\n }\n });\n \n const totalViolations = Object.values(counts).reduce((a, b) => a + b, 0);\n \n statusArea.textContent = totalViolations > 0\n ? `${totalViolations} ${this.translate('Violations Found')}`\n : this.translate('No Issues Found');\n \n let html = `\n <div class=\"acc-report-summary\">\n <div class=\"acc-report-stat critical\">\n <span class=\"acc-report-stat-value\">${counts.critical}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Critical')}</span>\n </div>\n <div class=\"acc-report-stat serious\">\n <span class=\"acc-report-stat-value\">${counts.serious}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Serious')}</span>\n </div>\n <div class=\"acc-report-stat moderate\">\n <span class=\"acc-report-stat-value\">${counts.moderate}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Moderate')}</span>\n </div>\n <div class=\"acc-report-stat minor\">\n <span class=\"acc-report-stat-value\">${counts.minor}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Minor')}</span>\n </div>\n <div class=\"acc-report-stat passed\">\n <span class=\"acc-report-stat-value\">${passes.length}</span>\n <span class=\"acc-report-stat-label\">${this.translate('Passed Tests')}</span>\n </div>\n </div>\n `;\n \n if (violations.length === 0) {\n html += `\n <div class=\"acc-report-success\">\n <div class=\"acc-report-success-icon\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>\n </div>\n <h3>${this.translate('No Issues Found')}</h3>\n </div>\n `;\n } else {\n html += `<div class=\"acc-report-section\">\n <div class=\"acc-report-section-title\">${this.translate('Violations Found')} (${violations.length})</div>\n `;\n \n // Sort by severity\n const severityOrder = { critical: 0, serious: 1, moderate: 2, minor: 3 };\n violations.sort((a, b) => (severityOrder[a.impact] || 4) - (severityOrder[b.impact] || 4));\n \n violations.forEach((violation, index) => {\n html += `\n <div class=\"acc-report-violation\" data-index=\"${index}\">\n <div class=\"acc-report-violation-header\">\n <span class=\"acc-report-violation-impact ${violation.impact}\">${this.translate(this.capitalizeFirst(violation.impact))}</span>\n <span class=\"acc-report-violation-title\">${this.escapeHtml(violation.help)}</span>\n <span class=\"acc-report-violation-count\">${violation.nodes.length} ${this.translate('Element')}${violation.nodes.length > 1 ? 's' : ''}</span>\n </div>\n <div class=\"acc-report-violation-details\">\n <p class=\"acc-report-violation-desc\">${this.escapeHtml(violation.description)}</p>\n <p class=\"acc-report-violation-help\">\n <a href=\"${violation.helpUrl}\" target=\"_blank\" rel=\"noopener\">${this.translate('How to Fix')} →</a>\n </p>\n ${violation.nodes.slice(0, 5).map(node => `\n <div class=\"acc-report-node\">\n <div class=\"acc-report-node-html\">${this.escapeHtml(node.html)}</div>\n ${node.failureSummary ? `<div class=\"acc-report-node-fix\"><strong>${this.translate('Issue')}:</strong> ${this.escapeHtml(node.failureSummary)}</div>` : ''}\n </div>\n `).join('')}\n ${violation.nodes.length > 5 ? `<p style=\"color:#666;font-size:13px;margin-top:12px;\">... and ${violation.nodes.length - 5} more elements</p>` : ''}\n </div>\n </div>\n `;\n });\n \n html += `</div>`;\n }\n \n if (incomplete.length > 0) {\n html += `\n <div class=\"acc-report-section\">\n <div class=\"acc-report-section-title\">${this.translate('Items Need Review')} (${incomplete.length})</div>\n <p style=\"color:#666;font-size:14px;\">These items require manual verification.</p>\n </div>\n `;\n }\n \n contentArea.innerHTML = html;\n \n // Add click handlers for expandable violations\n contentArea.querySelectorAll('.acc-report-violation-header').forEach(header => {\n header.addEventListener('click', () => {\n header.parentElement.classList.toggle('expanded');\n });\n });\n },\n\n capitalizeFirst(str) {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1);\n },\n\n escapeHtml(str) {\n if (!str) return '';\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n },\n\n closeReportPanel() {\n const panel = this.findElement('.acc-report-panel');\n if (panel) {\n panel.classList.remove('acc-report-visible');\n panel.setAttribute('aria-hidden', 'true');\n }\n \n if (this.reportKeyListener) {\n document.removeEventListener('keydown', this.reportKeyListener, true);\n this.reportKeyListener = null;\n }\n \n const focusTarget = this.reportPreviousFocus;\n this.reportPreviousFocus = null;\n if (focusTarget && typeof focusTarget.focus === 'function') {\n focusTarget.focus();\n }\n },\n\n concealImages(enable = false) {\n const styleId = `acc-hide-images`;\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) existingStyle.remove();\n document.documentElement.classList.toggle(styleId, enable);\n if (enable) {\n const css = `\n body > *:not(.acc-container) img,\n body > *:not(.acc-container) picture,\n body > *:not(.acc-container) svg:not(.acc-container svg),\n body > *:not(.acc-container) video,\n body > *:not(.acc-container) iframe,\n body > *:not(.acc-container) canvas,\n body > *:not(.acc-container) .video,\n body > *:not(.acc-container) .image {\n display: none !important;\n }\n `;\n this.injectStyle(styleId, css);\n }\n },\n\n supportsSpeechSynthesis() {\n if (typeof window === 'undefined') return false;\n return (\n 'speechSynthesis' in window &&\n typeof window.SpeechSynthesisUtterance !== 'undefined'\n );\n },\n\n supportsTextToSpeech() {\n return this.supportsSpeechSynthesis();\n },\n\n normalizeSpeechLanguage(languageCode = 'en') {\n const code = String(languageCode || 'en').toLowerCase();\n const languageMap = {\n en: 'en-US',\n ne: 'ne-NP'\n };\n return languageMap[code] || code;\n },\n\n getNativeTtsRate() {\n const configured = Number(this.nativeTtsConfig?.rate);\n if (!Number.isFinite(configured)) return 1;\n return Math.min(2, Math.max(0.5, configured));\n },\n\n getNativeTtsPitch() {\n const configured = Number(this.nativeTtsConfig?.pitch);\n if (!Number.isFinite(configured)) return 1;\n return Math.min(2, Math.max(0, configured));\n },\n\n isElementVisibleForTts(element) {\n if (!(element instanceof Element)) return false;\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n },\n\n isTtsExcludedElement(element, { allowLandmarkRegions = false } = {}) {\n if (!(element instanceof Element)) return true;\n if (element.closest('.acc-container')) return true;\n if (element.closest('script,style,noscript,template')) return true;\n if (element.closest('[aria-hidden=\"true\"]')) return true;\n if (\n !allowLandmarkRegions &&\n element.closest(\n 'nav,header,footer,aside,form,dialog,[role=\"navigation\"],[role=\"complementary\"],[role=\"search\"],[role=\"menu\"],[role=\"dialog\"],[role=\"alert\"],[aria-live]'\n )\n ) {\n return true;\n }\n return false;\n },\n\n normalizeReadableText(text = '') {\n return String(text)\n .replace(/\\s+/g, ' ')\n .replace(/[ \\t]+([,.;!?])/g, '$1')\n .trim();\n },\n\n getTtsCandidateRoots() {\n const selectors = [\n 'article',\n 'main',\n '[role=\"main\"]',\n '.content',\n '.post',\n '.entry-content',\n '#content'\n ];\n const roots = [];\n const seen = new Set();\n\n selectors.forEach((selector) => {\n document.querySelectorAll(selector).forEach((element) => {\n if (!(element instanceof Element)) return;\n if (this.isTtsExcludedElement(element) || !this.isElementVisibleForTts(element)) return;\n if (seen.has(element)) return;\n seen.add(element);\n roots.push(element);\n });\n });\n\n return roots;\n },\n\n getPrimaryContentRoot() {\n if (typeof document === 'undefined') return null;\n const candidates = this.getTtsCandidateRoots();\n if (!candidates.length) {\n const explicitCandidates = Array.from(\n document.querySelectorAll('main,article,[role=\"main\"],#content,.content,.post,.entry-content')\n ).filter((element) =>\n element instanceof Element &&\n !this.isTtsExcludedElement(element) &&\n this.isElementVisibleForTts(element)\n );\n\n if (explicitCandidates.length) {\n let explicitBest = explicitCandidates[0];\n let explicitBestScore = -1;\n explicitCandidates.forEach((candidate) => {\n const textLength = this.normalizeReadableText(candidate.innerText || candidate.textContent || '').length;\n const rect = candidate.getBoundingClientRect();\n const score = textLength + (rect.width * rect.height * 0.0025);\n if (score > explicitBestScore) {\n explicitBestScore = score;\n explicitBest = candidate;\n }\n });\n return explicitBest;\n }\n\n if (document.body) {\n const topLevelCandidates = Array.from(document.body.children).filter((element) =>\n element instanceof Element &&\n !element.classList.contains('acc-container') &&\n this.isElementVisibleForTts(element)\n );\n\n if (topLevelCandidates.length) {\n let best = topLevelCandidates[0];\n let bestScore = -1;\n topLevelCandidates.forEach((candidate) => {\n const textLength = this.normalizeReadableText(candidate.innerText || candidate.textContent || '').length;\n const rect = candidate.getBoundingClientRect();\n const score = textLength + (rect.width * rect.height * 0.0025);\n if (score > bestScore) {\n bestScore = score;\n best = candidate;\n }\n });\n return best;\n }\n }\n\n return document.body;\n }\n\n let bestRoot = candidates[0];\n let bestScore = -1;\n candidates.forEach((candidate) => {\n const blocks = this.extractReadableBlocks(candidate);\n const score = blocks.join(' ').length;\n if (score > bestScore) {\n bestScore = score;\n bestRoot = candidate;\n }\n });\n return bestRoot;\n },\n\n extractReadableBlocks(root) {\n if (!(root instanceof Element)) return [];\n const blockSelector = 'h1,h2,h3,h4,h5,h6,p,li,dt,dd,blockquote,figcaption,caption,th,td';\n const blocks = [];\n root.querySelectorAll(blockSelector).forEach((element) => {\n if (!(element instanceof Element)) return;\n if (this.isTtsExcludedElement(element) || !this.isElementVisibleForTts(element)) return;\n const text = this.normalizeReadableText(element.innerText || element.textContent || '');\n if (text.length < 15) return;\n blocks.push(text);\n });\n return blocks;\n },\n\n getReadableContent() {\n if (typeof document === 'undefined') return '';\n const candidateRoots = this.getTtsCandidateRoots();\n let bestBlocks = [];\n let bestScore = -1;\n\n candidateRoots.forEach((root) => {\n const blocks = this.extractReadableBlocks(root);\n if (!blocks.length) return;\n const characterCount = blocks.join(' ').length;\n const score = (blocks.length * 60) + characterCount;\n if (score > bestScore) {\n bestScore = score;\n bestBlocks = blocks;\n }\n });\n\n if (!bestBlocks.length && document.body) {\n bestBlocks = this.extractReadableBlocks(document.body);\n }\n\n if (!bestBlocks.length && document.body) {\n const fallback = this.normalizeReadableText(document.body.innerText || document.body.textContent || '');\n return fallback.slice(0, 30000);\n }\n\n return bestBlocks.join('\\n\\n').slice(0, 30000);\n },\n\n splitLongSpeechSegment(segment, maxLength = 240) {\n if (!segment) return [];\n if (segment.length <= maxLength) return [segment];\n\n const parts = [];\n let remaining = segment;\n while (remaining.length > maxLength) {\n let splitIndex = remaining.lastIndexOf(',', maxLength);\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = remaining.lastIndexOf(' ', maxLength);\n }\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = maxLength;\n }\n parts.push(remaining.slice(0, splitIndex).trim());\n remaining = remaining.slice(splitIndex).trim();\n }\n if (remaining.length) {\n parts.push(remaining);\n }\n return parts.filter(Boolean);\n },\n\n buildSpeechQueue(text = '') {\n const normalized = this.normalizeReadableText(text);\n if (!normalized) return [];\n\n const paragraphCandidates = text\n .split(/\\n{2,}/)\n .map((paragraph) => this.normalizeReadableText(paragraph))\n .filter(Boolean);\n\n const paragraphs = paragraphCandidates.length ? paragraphCandidates : [normalized];\n const queue = [];\n\n paragraphs.forEach((paragraph) => {\n const sentences = paragraph.split(/(?<=[.!?])\\s+/).filter(Boolean);\n const sentenceList = sentences.length ? sentences : [paragraph];\n let chunk = '';\n\n sentenceList.forEach((sentence) => {\n const next = chunk ? `${chunk} ${sentence}` : sentence;\n if (next.length <= 240) {\n chunk = next;\n return;\n }\n if (chunk) {\n queue.push(...this.splitLongSpeechSegment(chunk, 240));\n }\n chunk = sentence;\n });\n\n if (chunk) {\n queue.push(...this.splitLongSpeechSegment(chunk, 240));\n }\n });\n\n return queue.slice(0, 300);\n },\n\n resolveSpeechVoice(languageCode) {\n if (!this.supportsSpeechSynthesis()) return null;\n const synth = window.speechSynthesis;\n const voices = synth.getVoices?.() || [];\n if (!voices.length) return null;\n\n const preferredVoiceName = String(this.nativeTtsConfig?.preferredVoiceName || '').trim().toLowerCase();\n if (preferredVoiceName) {\n const byExactName = voices.find((voice) => String(voice.name || '').trim().toLowerCase() === preferredVoiceName);\n if (byExactName) return byExactName;\n const byNameContains = voices.find((voice) => String(voice.name || '').toLowerCase().includes(preferredVoiceName));\n if (byNameContains) return byNameContains;\n }\n\n const configuredVoiceLang = String(this.nativeTtsConfig?.preferredVoiceLang || '').trim();\n const targetLanguage = configuredVoiceLang || languageCode;\n const normalized = this.normalizeSpeechLanguage(targetLanguage).toLowerCase();\n const primary = normalized.split('-')[0];\n const localExact = voices.find((voice) => (\n voice.localService &&\n String(voice.lang || '').toLowerCase() === normalized\n ));\n const exact = voices.find((voice) => String(voice.lang || '').toLowerCase() === normalized);\n const localByPrimary = voices.find((voice) => (\n voice.localService &&\n String(voice.lang || '').toLowerCase().startsWith(primary)\n ));\n const byPrimary = voices.find((voice) => String(voice.lang || '').toLowerCase().startsWith(primary));\n const defaultVoice = voices.find((voice) => voice.default);\n return localExact || exact || localByPrimary || byPrimary || defaultVoice || voices[0];\n },\n\n getSpeechTargetFromEvent(event) {\n const target = event?.target;\n if (!(target instanceof Element)) return null;\n if (target.closest('.acc-container')) return null;\n\n const block = target.closest('h1,h2,h3,h4,h5,h6,p,li,dt,dd,blockquote,figcaption,caption,th,td,div,section');\n if (!(block instanceof Element)) return null;\n if (this.isTtsExcludedElement(block, { allowLandmarkRegions: true }) || !this.isElementVisibleForTts(block)) return null;\n\n const text = this.normalizeReadableText(block.innerText || block.textContent || '');\n if (text.length < 2) return null;\n\n return {\n element: block,\n text: text.slice(0, 30000)\n };\n },\n\n setActiveSpeechTarget(element = null) {\n if (this.ttsActiveTarget && this.ttsActiveTarget !== element) {\n this.ttsActiveTarget.classList.remove('acc-tts-active-block');\n }\n this.ttsActiveTarget = element;\n if (this.ttsActiveTarget) {\n this.ttsActiveTarget.classList.add('acc-tts-active-block');\n }\n },\n\n startTtsClickMode() {\n if (typeof document === 'undefined' || this.ttsClickListener) return;\n this.ttsClickListener = (event) => {\n this.handleTtsClick(event);\n };\n document.addEventListener('click', this.ttsClickListener, true);\n document.body?.classList.add('acc-tts-click-mode');\n },\n\n stopTtsClickMode() {\n if (typeof document === 'undefined') return;\n if (this.ttsClickListener) {\n document.removeEventListener('click', this.ttsClickListener, true);\n this.ttsClickListener = null;\n }\n document.body?.classList.remove('acc-tts-click-mode');\n this.setActiveSpeechTarget(null);\n },\n\n handleTtsClick(event) {\n if (!this.retrieveState('text-to-speech')) return;\n const target = this.getSpeechTargetFromEvent(event);\n if (!target) return;\n\n this.setActiveSpeechTarget(target.element);\n this.ttsTextCache = target.text;\n this.startSpeechPlayback({ restart: true });\n },\n\n ensureTtsQueue() {\n const text = this.ttsTextCache || this.getReadableContent();\n if (!text) {\n this.ttsQueue = [];\n this.ttsQueueIndex = 0;\n return false;\n }\n this.ttsTextCache = text;\n this.ttsQueue = this.buildSpeechQueue(text);\n this.ttsQueueIndex = 0;\n return this.ttsQueue.length > 0;\n },\n\n speakNextTtsChunk(sessionId) {\n if (!this.supportsSpeechSynthesis()) return;\n if (sessionId !== this.ttsSessionId) return;\n\n if (this.ttsQueueIndex >= this.ttsQueue.length) {\n this.ttsStatus = 'stopped';\n this.setActiveSpeechTarget(null);\n return;\n }\n\n const synth = window.speechSynthesis;\n const chunk = this.ttsQueue[this.ttsQueueIndex];\n if (!chunk) {\n this.ttsQueueIndex += 1;\n this.speakNextTtsChunk(sessionId);\n return;\n }\n\n const utterance = new window.SpeechSynthesisUtterance(chunk);\n utterance.lang = this.normalizeSpeechLanguage(this.loadConfig().lang || 'en');\n if (!this.ttsVoice || this.ttsVoice.lang?.toLowerCase() !== utterance.lang.toLowerCase()) {\n this.ttsVoice = this.resolveSpeechVoice(utterance.lang);\n }\n if (this.ttsVoice) {\n utterance.voice = this.ttsVoice;\n }\n utterance.rate = this.getNativeTtsRate();\n utterance.pitch = this.getNativeTtsPitch();\n\n utterance.onstart = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'reading';\n };\n utterance.onpause = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'paused';\n };\n utterance.onresume = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'reading';\n };\n utterance.onend = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsQueueIndex += 1;\n this.speakNextTtsChunk(sessionId);\n };\n utterance.onerror = () => {\n if (sessionId !== this.ttsSessionId) return;\n this.ttsStatus = 'stopped';\n this.setActiveSpeechTarget(null);\n };\n\n this.ttsUtterance = utterance;\n synth.speak(utterance);\n },\n\n startNativeSpeechPlayback({ restart = false } = {}) {\n if (!this.supportsSpeechSynthesis()) return;\n const synth = window.speechSynthesis;\n\n if (!restart && synth.paused) {\n synth.resume();\n this.ttsStatus = 'reading';\n return;\n }\n\n const hasQueue = restart || !this.ttsQueue.length || this.ttsQueueIndex >= this.ttsQueue.length\n ? this.ensureTtsQueue()\n : true;\n if (!hasQueue) {\n this.stopSpeech();\n return;\n }\n\n const sessionId = this.ttsSessionId + 1;\n this.ttsSessionId = sessionId;\n synth.cancel();\n this.ttsStatus = 'reading';\n this.speakNextTtsChunk(sessionId);\n },\n\n startSpeechPlayback({ restart = false } = {}) {\n this.startNativeSpeechPlayback({ restart });\n },\n\n pauseSpeech() {\n if (!this.supportsSpeechSynthesis()) return;\n const synth = window.speechSynthesis;\n if (synth.speaking && !synth.paused) {\n synth.pause();\n this.ttsStatus = 'paused';\n }\n },\n\n resumeSpeech() {\n if (!this.supportsSpeechSynthesis()) return;\n const synth = window.speechSynthesis;\n if (synth.paused) {\n synth.resume();\n this.ttsStatus = 'reading';\n return;\n }\n this.startSpeechPlayback({ restart: false });\n },\n\n stopSpeech() {\n const synth = this.supportsSpeechSynthesis() ? window.speechSynthesis : null;\n this.ttsSessionId += 1;\n if (synth && (synth.speaking || synth.paused)) {\n synth.cancel();\n }\n this.ttsUtterance = null;\n this.ttsQueueIndex = 0;\n this.ttsStatus = 'stopped';\n this.setActiveSpeechTarget(null);\n },\n\n enableTextToSpeech(enable = false) {\n if (!this.supportsTextToSpeech()) return;\n const isUserToggle = this.userInitiatedToggleKey === 'text-to-speech';\n\n if (!enable) {\n if (isUserToggle) this.announceTtsState(false);\n this.stopSpeech();\n this.stopTtsClickMode();\n return;\n }\n\n const synth = window.speechSynthesis;\n if (synth?.getVoices) {\n synth.getVoices();\n }\n\n this.startTtsClickMode();\n this.ttsStatus = 'idle';\n if (isUserToggle) this.announceTtsState(true);\n },\n\n announceTtsState(active) {\n if (!this.supportsTextToSpeech()) return;\n const synth = window.speechSynthesis;\n if (!synth) return;\n const msg = active\n ? this.translate('Text to Speech On')\n : this.translate('Text to Speech Off');\n synth.cancel();\n const utterance = new SpeechSynthesisUtterance(msg);\n const lang = this.normalizeSpeechLanguage(this.loadConfig().lang || 'en');\n utterance.lang = lang;\n const voice = this.resolveSpeechVoice(lang);\n if (voice) {\n utterance.voice = voice;\n }\n utterance.rate = this.getNativeTtsRate();\n utterance.pitch = this.getNativeTtsPitch();\n synth.speak(utterance);\n },\n\n ensureAnnotationLayer() {\n if (this.annotationLayer && document.body.contains(this.annotationLayer)) {\n return this.annotationLayer;\n }\n const layer = document.createElement('div');\n layer.className = 'acc-annotation-layer acc-container';\n layer.setAttribute('aria-hidden', 'true');\n document.body.appendChild(layer);\n this.annotationLayer = layer;\n return layer;\n },\n\n resolveAnnotationTarget(selector) {\n if (!selector || typeof selector !== 'string') return null;\n try {\n const element = document.querySelector(selector);\n if (!element || element.closest('.acc-container')) return null;\n return element;\n } catch {\n return null;\n }\n },\n\n buildAnnotationEntries(results = {}) {\n const violations = Array.isArray(results.violations) ? results.violations : [];\n const entries = [];\n const seen = new Set();\n\n violations.forEach((violation) => {\n const nodes = Array.isArray(violation.nodes) ? violation.nodes : [];\n nodes.forEach((node) => {\n const targets = Array.isArray(node.target) ? node.target : [];\n const selector = targets.find((target) => typeof target === 'string' && target.trim().length);\n if (!selector) return;\n const key = `${selector}::${violation.id || violation.help || ''}`;\n if (seen.has(key)) return;\n\n const element = this.resolveAnnotationTarget(selector);\n if (!element) return;\n seen.add(key);\n entries.push({\n selector,\n element,\n impact: violation.impact || 'minor',\n title: violation.help || this.translate('Issue'),\n description: violation.description || '',\n helpUrl: violation.helpUrl || '',\n failureSummary: node.failureSummary || ''\n });\n });\n });\n\n return entries.slice(0, MAX_ANNOTATIONS);\n },\n\n createAnnotationMarker(annotation) {\n const marker = document.createElement('button');\n marker.type = 'button';\n marker.className = 'acc-annotation-marker';\n marker.dataset.impact = annotation.impact || 'minor';\n marker.setAttribute('aria-label', annotation.title);\n marker.title = annotation.title;\n marker.innerHTML = '';\n\n marker.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.showAnnotationPopup(annotation, marker);\n });\n\n return marker;\n },\n\n positionAnnotationPopup(popup, marker) {\n if (!popup || !marker) return;\n const markerRect = marker.getBoundingClientRect();\n const popupWidth = popup.offsetWidth || 300;\n const popupHeight = popup.offsetHeight || 180;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 10;\n\n let left = window.scrollX + markerRect.left + gap;\n let top = window.scrollY + markerRect.bottom + gap;\n\n if (left + popupWidth > window.scrollX + viewportWidth - gap) {\n left = window.scrollX + viewportWidth - popupWidth - gap;\n }\n if (left < window.scrollX + gap) {\n left = window.scrollX + gap;\n }\n\n if (top + popupHeight > window.scrollY + viewportHeight - gap) {\n top = window.scrollY + markerRect.top - popupHeight - gap;\n }\n if (top < window.scrollY + gap) {\n top = window.scrollY + gap;\n }\n\n popup.style.left = `${left}px`;\n popup.style.top = `${top}px`;\n },\n\n clearAnnotationPopup() {\n if (this.annotationPopup) {\n this.annotationPopup.remove();\n this.annotationPopup = null;\n }\n },\n\n showAnnotationPopup(annotation, marker) {\n if (!annotation || !marker || !this.annotationLayer) return;\n this.clearAnnotationPopup();\n\n const popup = document.createElement('div');\n popup.className = 'acc-annotation-popup';\n popup.innerHTML = `\n <div class=\"acc-annotation-popup-header\">\n <h3 class=\"acc-annotation-popup-title\">${this.escapeHtml(annotation.title)}</h3>\n <button type=\"button\" class=\"acc-annotation-popup-close\" aria-label=\"${this.translate('Close')}\">${this.widgetIcons.close}</button>\n </div>\n <p><strong>${this.translate(this.capitalizeFirst(annotation.impact))}</strong></p>\n <p>${this.escapeHtml(annotation.description)}</p>\n ${annotation.failureSummary ? `<p><strong>${this.translate('Issue')}:</strong> ${this.escapeHtml(annotation.failureSummary)}</p>` : ''}\n ${annotation.helpUrl ? `<p><a href=\"${annotation.helpUrl}\" target=\"_blank\" rel=\"noopener\">${this.translate('How to Fix')} →</a></p>` : ''}\n `;\n popup.__accMarker = marker;\n\n const closeButton = popup.querySelector('.acc-annotation-popup-close');\n closeButton?.addEventListener('click', () => this.clearAnnotationPopup());\n\n this.annotationLayer.appendChild(popup);\n this.annotationPopup = popup;\n this.positionAnnotationPopup(popup, marker);\n },\n\n positionAnnotations() {\n if (!Array.isArray(this.annotationItems) || !this.annotationItems.length) return;\n\n this.annotationItems.forEach((item) => {\n if (!item?.target || !item?.marker) return;\n if (!document.contains(item.target)) {\n item.marker.hidden = true;\n return;\n }\n\n const rect = item.target.getBoundingClientRect();\n const outOfView = (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.bottom < 0 ||\n rect.top > window.innerHeight ||\n rect.right < 0 ||\n rect.left > window.innerWidth\n );\n\n if (outOfView) {\n item.marker.hidden = true;\n return;\n }\n\n item.marker.hidden = false;\n item.marker.style.top = `${window.scrollY + rect.top + Math.min(16, rect.height / 2)}px`;\n item.marker.style.left = `${window.scrollX + rect.right}px`;\n });\n\n if (this.annotationPopup?.__accMarker && !this.annotationPopup.__accMarker.hidden) {\n this.positionAnnotationPopup(this.annotationPopup, this.annotationPopup.__accMarker);\n }\n },\n\n enableAnnotations(enable = false) {\n if (!enable) {\n this.disableAnnotations();\n return;\n }\n\n const requestId = ++this.annotationRequestId;\n this.disableAnnotations({ cancelPending: false });\n const layer = this.ensureAnnotationLayer();\n\n this.runBackgroundAxeScan()\n .then((results) => {\n if (requestId !== this.annotationRequestId || !this.retrieveState('annotations')) {\n return;\n }\n const annotations = this.buildAnnotationEntries(results);\n this.annotationItems = annotations.map((annotation) => {\n const marker = this.createAnnotationMarker(annotation);\n layer.appendChild(marker);\n return {\n marker,\n target: annotation.element,\n data: annotation\n };\n });\n\n if (!this.annotationRepositionHandler) {\n this.annotationRepositionHandler = this.throttle(() => this.positionAnnotations(), 80);\n }\n window.addEventListener('scroll', this.annotationRepositionHandler, { passive: true });\n window.addEventListener('resize', this.annotationRepositionHandler, { passive: true });\n\n if (!this.annotationOutsideHandler) {\n this.annotationOutsideHandler = (event) => {\n if (!this.annotationPopup) return;\n const clickedPopup = this.annotationPopup.contains(event.target);\n const clickedMarker = event.target?.closest?.('.acc-annotation-marker');\n if (!clickedPopup && !clickedMarker) {\n this.clearAnnotationPopup();\n }\n };\n }\n document.addEventListener('click', this.annotationOutsideHandler, true);\n\n this.positionAnnotations();\n })\n .catch((error) => {\n console.warn('Failed to render annotations:', error);\n });\n },\n\n disableAnnotations({ cancelPending = true } = {}) {\n if (cancelPending) {\n this.annotationRequestId += 1;\n }\n this.clearAnnotationPopup();\n\n if (this.annotationOutsideHandler) {\n document.removeEventListener('click', this.annotationOutsideHandler, true);\n }\n if (this.annotationRepositionHandler) {\n window.removeEventListener('scroll', this.annotationRepositionHandler);\n window.removeEventListener('resize', this.annotationRepositionHandler);\n }\n\n if (this.annotationLayer) {\n this.annotationLayer.remove();\n this.annotationLayer = null;\n }\n\n this.annotationItems = [];\n },\n\n\n clearSimpleLayoutDomMutations() {\n if (this.simpleLayoutRoot) {\n this.simpleLayoutRoot.classList.remove('acc-simple-layout-root');\n this.simpleLayoutRoot = null;\n }\n\n if (Array.isArray(this.simpleLayoutHiddenElements)) {\n this.simpleLayoutHiddenElements.forEach((element) => {\n if (element && element.classList) {\n element.classList.remove('acc-simple-layout-hidden');\n }\n });\n }\n this.simpleLayoutHiddenElements = [];\n },\n\n applySimpleLayoutDomMutations() {\n const root = this.getPrimaryContentRoot();\n if (!root || !document.body) return;\n\n this.simpleLayoutRoot = root;\n root.classList.add('acc-simple-layout-root');\n\n const hiddenElements = [];\n Array.from(document.body.children).forEach((child) => {\n if (!(child instanceof Element)) return;\n if (child.classList.contains('acc-container')) return;\n if (child === root || child.contains(root)) return;\n child.classList.add('acc-simple-layout-hidden');\n hiddenElements.push(child);\n });\n\n const clutterSelectors = [\n 'aside',\n 'nav',\n 'form',\n 'footer',\n '[role=\"complementary\"]',\n '[role=\"search\"]',\n '[role=\"contentinfo\"]',\n '[aria-hidden=\"true\"]',\n '[class*=\"cookie\"]',\n '[id*=\"cookie\"]',\n '[class*=\"banner\"]',\n '[id*=\"banner\"]',\n '[class*=\"popup\"]',\n '[id*=\"popup\"]',\n '[class*=\"modal\"]',\n '[id*=\"modal\"]',\n '[class*=\"advert\"]',\n '[id*=\"advert\"]',\n '[class*=\"ads\"]',\n '[id*=\"ads\"]',\n '[class*=\"sidebar\"]',\n '[id*=\"sidebar\"]',\n '[class*=\"social\"]',\n '[id*=\"social\"]',\n '[class*=\"share\"]',\n '[id*=\"share\"]',\n '[class*=\"newsletter\"]',\n '[id*=\"newsletter\"]',\n '[class*=\"related\"]',\n '[id*=\"related\"]',\n '[class*=\"comment\"]',\n '[id*=\"comment\"]',\n '[class*=\"footer\"]',\n '[id*=\"footer\"]',\n '[class*=\"promo\"]',\n '[id*=\"promo\"]'\n ].join(',');\n\n root.querySelectorAll(clutterSelectors).forEach((element) => {\n if (!(element instanceof Element)) return;\n if (element.closest('.acc-container')) return;\n if (element === root) return;\n element.classList.add('acc-simple-layout-hidden');\n hiddenElements.push(element);\n });\n\n this.simpleLayoutHiddenElements = hiddenElements;\n },\n\n enableSimpleLayout(enable = false) {\n const S = 'body.acc-simple-layout-enabled';\n const R = `${S} .acc-simple-layout-root`;\n const X = ':not(.acc-container):not(.acc-container *)';\n const config = {\n id: 'simple-layout',\n css: `\n /* ── Body & root container ── */\n ${S} {\n background: #fff !important;\n }\n\n ${S} .acc-simple-layout-hidden {\n display: none !important;\n }\n\n ${R} {\n max-width: 72ch !important;\n margin: 0 auto !important;\n padding: clamp(20px, 4vw, 40px) 20px !important;\n position: relative !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n }\n\n /* ── Universal decoration strip ── */\n ${R} :where(*)${X} {\n background-color: transparent !important;\n background-image: none !important;\n box-shadow: none !important;\n text-shadow: none !important;\n border-color: transparent !important;\n }\n\n /* ── Layout linearization ── */\n ${R} :where(div, section, article, header, main, footer, figure, figcaption, details, summary, hgroup, search)${X} {\n display: block !important;\n position: static !important;\n float: none !important;\n transform: none !important;\n columns: auto !important;\n column-count: auto !important;\n width: auto !important;\n min-width: 0 !important;\n max-width: 100% !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n /* ── Color reset ── */\n ${R} :where(h1, h2, h3, h4, h5, h6)${X} {\n color: #111 !important;\n }\n\n ${R} :where(p, li, dt, dd, td, th, span, blockquote, figcaption, label, summary, details)${X} {\n color: #222 !important;\n }\n\n ${R} :where(a)${X} {\n color: #1a0dab !important;\n }\n\n ${R} :where(a:visited)${X} {\n color: #681da8 !important;\n }\n\n /* ── Typography ── */\n ${R} :where(*)${X} {\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !important;\n }\n\n ${R} :where(p, li, dt, dd, blockquote, figcaption, td, th, label, summary)${X} {\n font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem) !important;\n line-height: 1.8 !important;\n letter-spacing: 0.01em !important;\n max-width: 70ch !important;\n }\n\n ${R} :where(h1)${X} {\n font-size: 2em !important;\n line-height: 1.2 !important;\n margin: 0.67em 0 !important;\n font-weight: 700 !important;\n }\n\n ${R} :where(h2)${X} {\n font-size: 1.5em !important;\n line-height: 1.25 !important;\n margin: 0.83em 0 !important;\n font-weight: 700 !important;\n }\n\n ${R} :where(h3)${X} {\n font-size: 1.25em !important;\n line-height: 1.3 !important;\n margin: 1em 0 !important;\n font-weight: 600 !important;\n }\n\n ${R} :where(h4, h5, h6)${X} {\n font-size: 1.1em !important;\n line-height: 1.35 !important;\n margin: 1em 0 !important;\n font-weight: 600 !important;\n }\n\n /* ── Decorative images hidden ── */\n ${R} :where(img[role=\"presentation\"], img[alt=\"\"], img:not([alt]), svg[aria-hidden=\"true\"])${X} {\n display: none !important;\n }\n\n /* ── Meaningful borders restored ── */\n ${R} :where(hr)${X} {\n border: none !important;\n border-top: 1px solid #d1d5db !important;\n margin: 1.5em 0 !important;\n }\n\n ${R} :where(blockquote)${X} {\n border-left: 4px solid #d1d5db !important;\n padding-left: 1em !important;\n margin-left: 0 !important;\n font-style: italic !important;\n }\n\n ${R} :where(table)${X} {\n border-collapse: collapse !important;\n max-width: 100% !important;\n overflow-x: auto !important;\n display: table !important;\n }\n\n ${R} :where(th, td)${X} {\n border: 1px solid #d1d5db !important;\n padding: 8px 12px !important;\n text-align: left !important;\n }\n\n ${R} :where(th)${X} {\n font-weight: 600 !important;\n background: #f8f9fa !important;\n }\n\n /* ── Lists ── */\n ${R} :where(ul, ol)${X} {\n padding-left: 1.5em !important;\n margin: 0.75em 0 !important;\n }\n\n ${R} :where(li)${X} {\n display: list-item !important;\n margin: 0.25em 0 !important;\n }\n\n /* ── Code blocks ── */\n ${R} :where(pre)${X} {\n background: #f6f8fa !important;\n border-radius: 6px !important;\n padding: 1em !important;\n overflow-x: auto !important;\n max-width: 100% !important;\n }\n\n ${R} :where(code, kbd, samp)${X} {\n font-family: ui-monospace, \"SFMono-Regular\", \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace !important;\n font-size: 0.9em !important;\n }\n\n ${R} :where(code):not(pre code)${X} {\n background: #f0f2f5 !important;\n padding: 0.15em 0.4em !important;\n border-radius: 3px !important;\n }\n\n /* ── Empty wrapper collapse ── */\n ${R} :where(div:empty)${X} {\n display: none !important;\n }\n\n /* ── Media ── */\n ${R} :where(img, video, iframe)${X} {\n max-width: 100% !important;\n height: auto !important;\n border-radius: 4px !important;\n }\n `\n };\n\n this.applyToolStyle({ ...config, enable });\n document.body?.classList.toggle('acc-simple-layout-enabled', !!enable);\n\n this.clearSimpleLayoutDomMutations();\n if (enable) {\n this.applySimpleLayoutDomMutations();\n }\n },\n\n applyEnhancements() {\n const { states } = this.loadConfig();\n // Handle font size scaling\n const hasTextScaleState = !!(states && Object.prototype.hasOwnProperty.call(states, 'text-scale'));\n if (hasTextScaleState) {\n const storedScale = states['text-scale'] === false ? 1 : states['text-scale'];\n const appliedScale = this.setTextScaleFromPercent(storedScale, { persist: false });\n this.syncTextScaleControlUI(document.querySelector('.acc-menu'), appliedScale);\n } else {\n this.textScaleIndex = 0;\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = -1;\n }\n this.scaleText(1);\n this.syncTextScaleControlUI(document.querySelector('.acc-menu'), 1);\n }\n // Apply other enhancements\n this.concealImages(states && states['hide-images']);\n this.highlightTitles(states && states['highlight-title']);\n this.highlightLinks(states && states['highlight-links']);\n this.adjustLetterSpacing(states && states['letter-spacing']);\n this.adjustLineSpacing(states && states['line-spacing']);\n this.enableBoldText(states && states['bold-text']);\n this.enableReadableText(states && states['readable-text']);\n this.enableReadingAid(states && states['reading-aid']);\n this.pauseMotion(states && states['pause-motion']);\n this.enableLargePointer(states && states['large-pointer']);\n this.enableHighContrastMode(states && states['high-contrast-mode']);\n this.enableAnnotations(states && states['annotations']);\n this.enableTextToSpeech(states && states['text-to-speech']);\n this.enableSimpleLayout(states && states['simple-layout']);\n },\n\n isColorFilterKey(key) {\n return Array.isArray(this.colorFilterKeys) && this.colorFilterKeys.includes(key);\n },\n\n getActiveColorFilterKey(states = this.widgetConfig.states) {\n if (!this.colorFilterKeys || !this.colorFilterKeys.length) return null;\n if (!states) return this.activeColorFilterKey || null;\n for (const key of this.colorFilterKeys) {\n if (states[key]) {\n return key;\n }\n }\n return null;\n },\n\n setColorFilterUI(menu, activeKey = null) {\n if (!menu || !menu.querySelectorAll) return;\n const contrastFeature = this.multiLevelFeatures?.['contrast-toggle'];\n const contrastButton = menu.querySelector('.acc-btn[data-key=\"contrast-toggle\"]');\n if (contrastFeature) {\n const contrastIndex = contrastFeature.values.indexOf(activeKey);\n contrastFeature.currentIndex = contrastIndex;\n this.updateContrastToggleButton(contrastButton, contrastIndex);\n if (contrastButton) {\n const isContrastActive = contrastIndex >= 0;\n contrastButton.classList.toggle('acc-selected', isContrastActive);\n contrastButton.setAttribute('aria-pressed', isContrastActive ? 'true' : 'false');\n const indicator = contrastButton.querySelector('.acc-progress-indicator[data-feature=\"contrast-toggle\"]');\n if (indicator) {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach((dot, index) => {\n dot.classList.toggle('active', index === contrastIndex);\n });\n }\n }\n }\n const saturationFeature = this.multiLevelFeatures?.['saturation-toggle'];\n const saturationButton = menu.querySelector('.acc-btn[data-key=\"saturation-toggle\"]');\n if (saturationFeature) {\n const saturationIndex = saturationFeature.values.indexOf(activeKey);\n saturationFeature.currentIndex = saturationIndex;\n this.updateSaturationToggleButton(saturationButton, saturationIndex);\n if (saturationButton) {\n const isSaturationActive = saturationIndex >= 0;\n saturationButton.classList.toggle('acc-selected', isSaturationActive);\n saturationButton.setAttribute('aria-pressed', isSaturationActive ? 'true' : 'false');\n const indicator = saturationButton.querySelector('.acc-progress-indicator[data-feature=\"saturation-toggle\"]');\n if (indicator) {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach((dot, index) => {\n dot.classList.toggle('active', index === saturationIndex);\n });\n }\n }\n }\n this.colorFilterKeys.forEach(filterKey => {\n const button = menu.querySelector(`.acc-btn[data-key=\"${filterKey}\"]`);\n if (!button) return;\n const isActive = filterKey === activeKey;\n button.classList.toggle('acc-selected', isActive);\n button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n });\n },\n\n updateColorFilterState(activeKey = null, source = 'user') {\n if (!this.colorFilterKeys || !this.colorFilterKeys.length) {\n this.activeColorFilterKey = null;\n return;\n }\n const states = this.widgetConfig.states || {};\n const payload = {};\n let requiresUpdate = false;\n this.colorFilterKeys.forEach(filterKey => {\n const rawCurrent = states[filterKey];\n const shouldBeActive = activeKey === filterKey;\n if (shouldBeActive) {\n if (rawCurrent !== true) {\n payload[filterKey] = true;\n requiresUpdate = true;\n }\n } else if (rawCurrent) {\n payload[filterKey] = false;\n requiresUpdate = true;\n }\n });\n if (requiresUpdate) {\n this.updateState(payload, { source });\n }\n this.activeColorFilterKey = activeKey;\n },\n\n computeFilteredBodyColor(filterKey) {\n const bg = window.getComputedStyle(document.body).backgroundColor;\n const m = bg.match(/rgba?\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!m) return null;\n let r = +m[1], g = +m[2], b = +m[3];\n const clamp = (v) => Math.min(255, Math.max(0, Math.round(v)));\n\n switch (filterKey) {\n case 'invert-colors':\n r = 255 - r; g = 255 - g; b = 255 - b;\n break;\n case 'dark-contrast': {\n // filter: contrast(150%) brightness(0.8) — applied left to right\n r = 128 + (r - 128) * 1.5; g = 128 + (g - 128) * 1.5; b = 128 + (b - 128) * 1.5;\n r *= 0.8; g *= 0.8; b *= 0.8;\n break;\n }\n case 'light-contrast': {\n // filter: contrast(125%) brightness(1.2)\n r = 128 + (r - 128) * 1.25; g = 128 + (g - 128) * 1.25; b = 128 + (b - 128) * 1.25;\n r *= 1.2; g *= 1.2; b *= 1.2;\n break;\n }\n case 'low-saturation': {\n // filter: saturate(50%) — use standard saturate matrix with s=0.5\n const s = 0.5;\n const nr = (0.213 + 0.787 * s) * r + (0.715 - 0.715 * s) * g + (0.072 - 0.072 * s) * b;\n const ng = (0.213 - 0.213 * s) * r + (0.715 + 0.285 * s) * g + (0.072 - 0.072 * s) * b;\n const nb = (0.213 - 0.213 * s) * r + (0.715 - 0.715 * s) * g + (0.072 + 0.928 * s) * b;\n r = nr; g = ng; b = nb;\n break;\n }\n case 'high-saturation': {\n // filter: saturate(200%) — use standard saturate matrix with s=2\n const s2 = 2;\n const hr = (0.213 + 0.787 * s2) * r + (0.715 - 0.715 * s2) * g + (0.072 - 0.072 * s2) * b;\n const hg = (0.213 - 0.213 * s2) * r + (0.715 + 0.285 * s2) * g + (0.072 - 0.072 * s2) * b;\n const hb = (0.213 - 0.213 * s2) * r + (0.715 - 0.715 * s2) * g + (0.072 + 0.928 * s2) * b;\n r = hr; g = hg; b = hb;\n break;\n }\n default:\n return null;\n }\n r = clamp(r); g = clamp(g); b = clamp(b);\n // Skip if the result is the same as the original (no visible change)\n if (r === +m[1] && g === +m[2] && b === +m[3]) return null;\n return `rgb(${r},${g},${b})`;\n },\n\n applyVisualFilters() {\n const { states } = this.loadConfig();\n const activeKey = this.getActiveColorFilterKey(states);\n this.activeColorFilterKey = activeKey;\n \n if (!activeKey) {\n const style = document.getElementById('acc-filter-style');\n if (style) style.remove();\n return;\n }\n const filter = this.visualFilters[activeKey];\n if (!filter) {\n const style = document.getElementById('acc-filter-style');\n if (style) style.remove();\n return;\n }\n const adjustedFilter = {\n ...filter,\n selector: filter.selector || 'body > *:not(.acc-container):not(.acc-rg-container):not(#acc-skip-link)'\n };\n let css = this.buildCSS(adjustedFilter);\n\n // Compute a filtered body background so the body itself matches\n // the visual filter applied to its children.\n const filteredBg = this.computeFilteredBodyColor(activeKey);\n if (filteredBg) {\n css += `body{background-color:${filteredBg}!important;}`;\n }\n\n this.injectStyle('acc-filter-style', css);\n },\n\n cycleTextScale(enable = false) {\n if (enable) {\n this.textScaleIndex = (this.textScaleIndex + 1) % this.textScaleValues.length;\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = this.textScaleIndex;\n }\n } else {\n this.textScaleIndex = 0;\n if (this.multiLevelFeatures['text-scale']) {\n this.multiLevelFeatures['text-scale'].currentIndex = -1;\n }\n }\n const progressIndicator = document.querySelector(`.acc-progress-indicator[data-feature=\"text-scale\"]`);\n if (progressIndicator) {\n const dots = progressIndicator.querySelectorAll('.acc-progress-dot');\n dots.forEach(dot => dot.classList.remove('active'));\n if (enable && this.textScaleIndex < dots.length) {\n dots[this.textScaleIndex].classList.add('active');\n }\n }\n const multiply = enable ? this.textScaleValues[this.textScaleIndex] : 1;\n this.scaleText(multiply);\n this.updateState({ 'text-scale': multiply });\n return this.textScaleIndex;\n },\n\n cycleMultiLevelFeature(featureKey, button) {\n const feature = this.multiLevelFeatures[featureKey];\n if (!feature || !button) return;\n\n if (featureKey === 'contrast-toggle' || featureKey === 'saturation-toggle') {\n const newIndex = feature.currentIndex + 1;\n const newActiveKey = newIndex >= feature.levels ? null : feature.values[newIndex];\n this.updateColorFilterState(newActiveKey);\n this.setColorFilterUI(button.closest('.acc-menu'), newActiveKey);\n this.applyVisualFilters();\n return;\n }\n\n const newIndex = feature.currentIndex + 1;\n if (newIndex >= feature.levels) {\n feature.currentIndex = -1;\n button.classList.remove('acc-selected');\n button.setAttribute('aria-pressed', 'false');\n this.updateState({ [featureKey]: featureKey === 'text-scale' ? 1 : false });\n if (featureKey === 'text-scale') {\n this.textScaleIndex = 0;\n }\n } else {\n feature.currentIndex = newIndex;\n button.classList.add('acc-selected');\n button.setAttribute('aria-pressed', 'true');\n const newValue = feature.values[newIndex];\n this.updateState({ [featureKey]: newValue });\n if (featureKey === 'text-scale') {\n this.textScaleIndex = newIndex;\n }\n }\n const indicator = button.querySelector(`.acc-progress-indicator[data-feature=\"${featureKey}\"]`);\n if (indicator) {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach((dot, i) => {\n dot.classList.toggle('active', i === feature.currentIndex);\n });\n }\n if (featureKey === 'text-scale') {\n const multiply = feature.currentIndex >= 0 ? feature.values[feature.currentIndex] : 1;\n this.scaleText(multiply);\n } else {\n this.applyVisualFilters();\n }\n },\n\n resetEnhancements() {\n this.saveConfig({ states: {}, systemDefaults: {} });\n this.textScaleIndex = 0;\n this.activeColorFilterKey = null;\n Object.keys(this.multiLevelFeatures).forEach(key => {\n this.multiLevelFeatures[key].currentIndex = -1;\n });\n const selected = document.querySelectorAll(\".acc-selected\");\n selected.forEach(el => {\n el.classList.remove(\"acc-selected\");\n el.setAttribute('aria-pressed', 'false');\n });\n const indicators = document.querySelectorAll('.acc-progress-indicator');\n indicators.forEach(indicator => {\n const dots = indicator.querySelectorAll('.acc-progress-dot');\n dots.forEach(dot => dot.classList.remove('active'));\n });\n const menu = document.querySelector('.acc-menu');\n if (menu) {\n this.setColorFilterUI(menu, null);\n this.syncTextScaleControlUI(menu, 1);\n }\n \n // Remove focus from active element to fix the persistent focus ring bug\n if (document.activeElement) {\n document.activeElement.blur();\n }\n const styleIds = [\n 'acc-bold-text',\n 'acc-letter-spacing',\n 'acc-line-spacing',\n 'acc-large-pointer',\n 'acc-highlight-links',\n 'acc-highlight-title',\n 'acc-readable-text',\n 'acc-pause-motion',\n 'acc-hide-images',\n 'acc-filter-style',\n 'acc-simple-layout'\n ];\n styleIds.forEach(id => {\n const style = document.getElementById(id);\n if (style) style.remove();\n });\n this.clearSimpleLayoutDomMutations();\n document.documentElement.classList.remove(\n 'acc-filter',\n 'acc-saturation',\n 'acc-bold-text',\n 'acc-letter-spacing',\n 'acc-line-spacing',\n 'acc-large-pointer',\n 'acc-highlight-links',\n 'acc-highlight-title',\n 'acc-readable-text',\n 'acc-pause-motion',\n 'acc-hide-images',\n 'acc-high-contrast-mode',\n 'acc-simple-layout'\n );\n document.body?.classList.remove('acc-simple-layout-enabled');\n document.body?.classList.remove('acc-high-contrast-mode');\n this.disconnectTextScaleObserver();\n this.currentTextScaleMultiplier = 1;\n const scaledElements = document.querySelectorAll('[data-acc-baseSize]');\n scaledElements.forEach(el => {\n if (!(el instanceof Element) || this.shouldSkipScaling(el)) return;\n el.style.fontSize = '';\n el.removeAttribute('data-acc-baseSize');\n });\n let guide = this.findElement('.acc-rg-container');\n if (guide) {\n guide.remove();\n if (window.__accweb__scrollGuide) {\n document.removeEventListener('mousemove', window.__accweb__scrollGuide);\n delete window.__accweb__scrollGuide;\n }\n }\n this.disableAnnotations();\n this.stopSpeech();\n this.stopTtsClickMode();\n this.clearSystemPreferenceListeners();\n this.detectSystemPreferences();\n this.setupMediaQueryListeners();\n this.updateViolationBubble(this.axeScanResults);\n this._fireCallback('onReset');\n },\n\n};\n","/** @typedef {import('./index.js').default} AllyWidget */\n\n/** @type {{ [methodName: string]: (this: AllyWidget, ...args: any[]) => any }} */\nexport const uiMethods = {\n\n _fireCallback(name, ...args) {\n const fn = this.options && this.options[name];\n if (typeof fn === 'function') {\n try { fn(...args); } catch (e) { console.warn(`[AllyWidget] Callback \"${name}\" threw:`, e); }\n }\n },\n\n translate(label) {\n const { lang } = this.loadConfig();\n const dictionary = this.translations[lang] || this.translations['en'];\n return dictionary[label] || label;\n },\n\n getLanguageCountryLabel(languageCode) {\n const countryByLanguage = {\n en: 'USA',\n ne: 'Nepal'\n };\n return countryByLanguage[languageCode] || String(languageCode || '').toUpperCase();\n },\n\n getLanguageFlag(languageCode) {\n const countryCodeByLanguage = {\n en: 'US',\n ne: 'NP'\n };\n const countryCode = (countryCodeByLanguage[languageCode] || String(languageCode || '').slice(0, 2)).toUpperCase();\n if (!/^[A-Z]{2}$/.test(countryCode)) return '';\n return String.fromCodePoint(...countryCode.split('').map(char => 127397 + char.charCodeAt(0)));\n },\n\n formatLanguageLabel(language) {\n if (!language) return 'English (USA)';\n const baseName = String(language.label || language.code || '')\n .split('(')[0].trim() || String(language.code || 'en').toUpperCase();\n return `${baseName} (${this.getLanguageCountryLabel(language.code)})`;\n },\n\n getWidgetIconMarkup(iconKey) {\n const normalized = typeof iconKey === 'string' ? iconKey.trim().toLowerCase() : '';\n const variants = this.widgetIcons?.accessibilityVariants || {};\n return variants[normalized] || variants.default || this.widgetIcons.accessibility;\n },\n\n throttle(func, limit) {\n let inThrottle;\n return function (...args) {\n if (!inThrottle) {\n func.apply(this, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n },\n\n getFocusableElements(root) {\n if (!root) return [];\n const selectors = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(',');\n const hasDocument = typeof document !== 'undefined';\n const activeElement = hasDocument ? document.activeElement : null;\n return Array.from(root.querySelectorAll(selectors)).filter(el => {\n if (el.hasAttribute('disabled')) return false;\n if (el.getAttribute('aria-hidden') === 'true') return false;\n if (el.closest('[aria-hidden=\"true\"]')) return false;\n const rect = el.getBoundingClientRect();\n const style = typeof window !== 'undefined' && window.getComputedStyle ? window.getComputedStyle(el) : { visibility: 'visible', display: 'block' };\n const hasSize = rect.width > 0 || rect.height > 0;\n const isVisible = (hasSize || (hasDocument && el === activeElement)) && style.visibility !== 'hidden' && style.display !== 'none';\n return isVisible;\n });\n },\n\n openMenu(menuContainer, toggleBtn) {\n if (!menuContainer) return;\n const menu = this.findElement('.acc-menu', menuContainer);\n this.activeMenuContainer = menuContainer;\n this.activeMenuToggle = toggleBtn || this.activeMenuToggle;\n this.previousFocus = document.activeElement && typeof document.activeElement.focus === 'function'\n ? document.activeElement : null;\n\n menuContainer.style.display = 'block';\n if (menu) {\n menu.setAttribute('aria-hidden', 'false');\n menu.setAttribute('aria-modal', 'true');\n if (!menu.hasAttribute('tabindex')) menu.setAttribute('tabindex', '-1');\n }\n\n if (this.activeMenuToggle) this.activeMenuToggle.setAttribute('aria-expanded', 'true');\n\n const focusable = this.getFocusableElements(menuContainer);\n if (focusable.length) {\n focusable[0].focus();\n } else if (menu) {\n menu.focus();\n }\n\n if (this.menuKeyListener) document.removeEventListener('keydown', this.menuKeyListener, true);\n\n this.menuKeyListener = (event) => {\n if (!this.activeMenuContainer) return;\n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n this.closeMenu(this.activeMenuContainer);\n return;\n }\n if (event.key === 'Tab') {\n const focusables = this.getFocusableElements(this.activeMenuContainer);\n if (!focusables.length) { event.preventDefault(); return; }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (event.shiftKey) {\n if (document.activeElement === first) { event.preventDefault(); last.focus(); }\n } else if (document.activeElement === last) {\n event.preventDefault(); first.focus();\n }\n }\n };\n\n document.addEventListener('keydown', this.menuKeyListener, true);\n this._fireCallback('onOpen');\n },\n\n closeMenu(menuContainer, toggleBtn) {\n const targetContainer = menuContainer || this.activeMenuContainer;\n if (!targetContainer) return;\n const menu = this.findElement('.acc-menu', targetContainer);\n targetContainer.style.display = 'none';\n if (menu) {\n menu.setAttribute('aria-hidden', 'true');\n menu.setAttribute('aria-modal', 'false');\n }\n\n const langModal = this.findElement('#acc-lang-modal', targetContainer);\n if (langModal) langModal.setAttribute('hidden', '');\n\n const langToggle = this.findElement('.acc-footer-lang-toggle', targetContainer);\n if (langToggle) langToggle.setAttribute('aria-expanded', 'false');\n\n const langSearch = this.findElement('#acc-lang-search', targetContainer);\n if (langSearch) langSearch.value = '';\n\n targetContainer.querySelectorAll('.acc-lang-item').forEach(item => {\n item.style.display = '';\n });\n\n if (this.menuKeyListener) {\n document.removeEventListener('keydown', this.menuKeyListener, true);\n this.menuKeyListener = null;\n }\n\n const toggle = toggleBtn || this.activeMenuToggle;\n if (toggle) toggle.setAttribute('aria-expanded', 'false');\n\n const focusTarget = toggle || this.previousFocus;\n if (focusTarget && typeof focusTarget.focus === 'function') focusTarget.focus();\n\n this.stopSpeech();\n\n this.activeMenuContainer = null;\n this.activeMenuToggle = null;\n this.previousFocus = null;\n this._fireCallback('onClose');\n },\n\n renderOptions(options, optionClass) {\n let html = '';\n for (let i = 0; i < options.length; i++) {\n const opt = options[i];\n if (opt.requiresSpeechSynthesis && !this.supportsTextToSpeech()) continue;\n const isMultiLevel = opt.multiLevel === true;\n const mergedOptionClass = [optionClass, opt.optionClass].filter(Boolean).join(' ');\n let progressIndicator = '';\n if (isMultiLevel) {\n const featureData = this.multiLevelFeatures[opt.key];\n if (featureData) {\n progressIndicator = `<div class=\"acc-progress-indicator\" data-feature=\"${opt.key}\">`;\n for (let j = 0; j < featureData.levels; j++) {\n const isActive = featureData.currentIndex === j;\n progressIndicator += `<div class=\"acc-progress-dot${isActive ? ' active' : ''}\" data-level=\"${j}\"> </div>`;\n }\n progressIndicator += ` </div>`;\n }\n }\n html += `<button\n class=\"acc-btn ${mergedOptionClass} ${this.multiLevelFeatures[opt.key]?.currentIndex >= 0 ? 'acc-selected' : ''}\"\n type=\"button\"\n data-key=\"${opt.key}\"\n data-multi-level=\"${isMultiLevel}\"\n title=\"${opt.label}\"\n aria-label=\"${opt.label}\"\n aria-pressed=\"${this.multiLevelFeatures[opt.key]?.currentIndex >= 0 || false}\"\n aria-controls=\"acc-menu-content\">\n ${opt.icon}\n <span class=\"acc-label\">${opt.label}</span>\n ${progressIndicator}\n </button>`;\n }\n return html;\n },\n\n renderTextScaleControl(scaleValue = 1) {\n const percent = this.getTextScalePercent(scaleValue);\n const min = Number(this.textScaleMinPercent) || 80;\n const max = Number(this.textScaleMaxPercent) || 150;\n const step = Number(this.textScaleStepPercent) || 5;\n const progress = ((percent - min) / (max - min)) * 100;\n\n return `\n <div class=\"acc-text-scale-control\" data-key=\"text-scale\">\n <div class=\"acc-text-scale-meta\">\n <span class=\"acc-text-scale-icon\" aria-hidden=\"true\">${this.widgetIcons.adjustFontSize}</span>\n <span class=\"acc-label\" data-acc-text=\"Font Size\">Font Size</span>\n <span class=\"acc-text-scale-percent\">${percent}%</span>\n </div>\n <input\n type=\"range\"\n class=\"acc-text-scale-range\"\n min=\"${min}\"\n max=\"${max}\"\n step=\"${step}\"\n value=\"${percent}\"\n data-acc-text=\"Font Size\"\n aria-label=\"Font Size\"\n style=\"--acc-text-scale-progress: ${Math.max(0, Math.min(100, progress))}%\">\n </div>\n `;\n },\n\n getTranslatedText(el, defaultValue) {\n let text = el.getAttribute('data-acc-text');\n if (!text && defaultValue) {\n text = defaultValue;\n el.setAttribute('data-acc-text', text);\n }\n return this.translate(text);\n },\n\n translateMenuUI(menu) {\n menu.querySelectorAll('.acc-section-title, .acc-label').forEach(el => {\n el.innerText = this.getTranslatedText(el, el.innerText.trim());\n });\n menu.querySelectorAll('[title]').forEach(el => {\n el.setAttribute('title', this.getTranslatedText(el, el.getAttribute('title')));\n });\n menu.querySelectorAll('[aria-label]').forEach(el => {\n el.setAttribute('aria-label', this.getTranslatedText(el, el.getAttribute('aria-label')));\n });\n this.updateSkipLinkLabel();\n },\n\n displayMenu({ container, lang, position = 'bottom-right', offset = [20, 20], size, icon }) {\n try {\n this.applyThemeVariables();\n this.registerStaticStyles();\n\n const activeLanguageCode = String(lang || 'en').split(/[_-]/)[0].toLowerCase();\n\n // Configurable branding\n const poweredByText = this.options?.poweredByText || 'Ally Widget';\n const poweredByUrl = this.options?.poweredByUrl || '';\n\n const menuTemplate = `\n <div class=\"acc-menu\" role=\"dialog\" aria-labelledby=\"accessibility-title\">\n <div class=\"acc-menu-header\">\n <div id=\"accessibility-title\" class=\"acc-menu-title\">\n <span class=\"acc-menu-title-icon\" aria-hidden=\"true\">${this.getWidgetIconMarkup(icon)}</span>\n <span class=\"acc-label\">Accessibility</span>\n </div>\n <div class=\"acc-header-actions\"></div>\n </div>\n <div id=\"acc-menu-content\" class=\"acc-menu-content\">\n <div class=\"acc-options-all\"> </div>\n </div>\n <div class=\"acc-footer\">\n <button type=\"button\" class=\"acc-footer-reset\" title=\"Reset settings\" aria-label=\"Reset settings\">\n ${this.widgetIcons.reset}\n <span class=\"acc-label\">Reset settings</span>\n </button>\n <div class=\"acc-footer-meta\">\n <a href=\"${poweredByUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${poweredByText}</a>\n <button type=\"button\" class=\"acc-footer-lang-toggle\" title=\"Language\" aria-label=\"Language\" aria-expanded=\"false\" aria-controls=\"acc-lang-modal\">\n <span id=\"acc-current-language\" class=\"acc-footer-lang-current\">${String(activeLanguageCode || 'en').toUpperCase()}</span>\n <span class=\"acc-footer-lang-arrow\" aria-hidden=\"true\"> </span>\n </button>\n </div>\n <div id=\"acc-lang-modal\" class=\"acc-lang-modal\" hidden>\n <div class=\"acc-lang-modal-header\">\n <div class=\"acc-section-title acc-label\">All Languages</div>\n </div>\n <div class=\"acc-lang-search-wrapper\">\n <input type=\"text\" id=\"acc-lang-search\" class=\"acc-lang-search\" placeholder=\"Search language\" aria-label=\"Search language\">\n </div>\n <div class=\"acc-lang-list\">\n ${this.supportedLanguages.map(language => {\n const languageLabel = this.formatLanguageLabel(language);\n const languageFlag = this.getLanguageFlag(language.code);\n return `<button type=\"button\" class=\"acc-lang-item${language.code === activeLanguageCode ? ' selected' : ''}\" data-lang=\"${language.code}\" aria-label=\"${languageLabel}\">\n <span class=\"acc-lang-item-main\">\n <span class=\"acc-lang-flag\" aria-hidden=\"true\">${languageFlag}</span>\n <span class=\"acc-lang-item-label\">${languageLabel}</span>\n </span>\n <span class=\"acc-icon-check\" aria-hidden=\"true\"> </span>\n </button>`;\n }).join('')}\n </div>\n </div>\n </div>\n </div>\n <div class=\"acc-overlay\"> </div>\n `;\n\n const menuContainer = document.createElement('div');\n menuContainer.innerHTML = menuTemplate;\n menuContainer.style.display = 'none';\n const menu = this.findElement('.acc-menu', menuContainer);\n if (menu) {\n menu.setAttribute('aria-hidden', 'true');\n if (!menu.hasAttribute('tabindex')) menu.setAttribute('tabindex', '-1');\n }\n\n const isRightAligned = position === 'bottom-right' || position === 'top-right' || this.widgetTheme.menuPosition === 'right';\n if (isRightAligned) {\n menu.style.right = 'var(--acc-menu-inline-gap, 12px)';\n menu.style.left = 'auto';\n } else {\n menu.style.left = 'var(--acc-menu-inline-gap, 12px)';\n menu.style.right = 'auto';\n }\n\n const normalizedOffset = this.normalizeOffset(offset) || [20, 20];\n const offsetY = normalizedOffset[1] ?? 25;\n const buttonSize = size !== undefined && size !== null && String(size).trim() !== ''\n ? this.normalizeButtonSize(size)\n : (this.widgetTheme?.buttonSize || '52px');\n\n if (position === 'bottom-right' || position === 'bottom-left') {\n menu.style.bottom = `calc(${offsetY}px + ${buttonSize} + 16px)`;\n } else if (position === 'top-right' || position === 'top-left') {\n menu.style.top = `calc(${offsetY}px + ${buttonSize} + 16px)`;\n }\n\n const config = this.loadConfig();\n\n const textKeys = new Set(['text-scale', 'bold-text', 'line-spacing', 'letter-spacing', 'readable-text']);\n const colorKeys = new Set(['contrast-toggle', 'invert-colors', 'saturation-toggle', 'high-contrast-mode']);\n const readingAidsKeys = new Set(['reading-aid', 'highlight-links', 'highlight-title', 'simple-layout']);\n\n const sourceOptions = [\n ...this.contentOptions.map(option => ({ ...option })),\n ...this.colorOptions.map(option => ({ ...option, optionClass: 'acc-filter' })),\n ...this.accessTools.map(option => ({ ...option, optionClass: 'acc-tools' }))\n ];\n\n const groupedOptions = { speech: [], text: [], color: [], reading: [], interaction: [] };\n const seenKeys = new Set();\n sourceOptions.forEach(option => {\n if (!option?.key || seenKeys.has(option.key)) return;\n seenKeys.add(option.key);\n if (option.key === 'text-to-speech') { groupedOptions.speech.push(option); return; }\n if (textKeys.has(option.key)) { groupedOptions.text.push(option); return; }\n if (colorKeys.has(option.key)) { groupedOptions.color.push(option); return; }\n if (readingAidsKeys.has(option.key)) { groupedOptions.reading.push(option); return; }\n groupedOptions.interaction.push(option);\n });\n\n const sectionConfig = [\n { key: 'speech', label: 'Speech', containerClass: 'acc-tts-toggle-container', optionClass: 'acc-tts-toggle' },\n { key: 'text', label: 'Text', containerClass: 'acc-options acc-options-text' },\n { key: 'color', label: 'Color & Contrast', containerClass: 'acc-options' },\n { key: 'reading', label: 'Reading Aids', containerClass: 'acc-options' },\n { key: 'interaction', label: 'Interaction', containerClass: 'acc-options' }\n ];\n\n const sectionMarkup = sectionConfig.map(section => {\n let sectionOptions = groupedOptions[section.key];\n let specialContent = '';\n\n if (section.key === 'text') {\n const textScaleOption = sectionOptions.find(option => option.key === 'text-scale');\n sectionOptions = sectionOptions.filter(option => option.key !== 'text-scale');\n const textOrder = ['line-spacing', 'letter-spacing', 'bold-text', 'readable-text'];\n sectionOptions.sort((a, b) => {\n const rankA = textOrder.indexOf(a.key); const rankB = textOrder.indexOf(b.key);\n return (rankA === -1 ? Number.MAX_SAFE_INTEGER : rankA) - (rankB === -1 ? Number.MAX_SAFE_INTEGER : rankB);\n });\n if (textScaleOption) specialContent = this.renderTextScaleControl(config.states?.['text-scale'] || 1);\n\n const firstThinRowKeys = new Set(['line-spacing', 'letter-spacing']);\n const secondThinRowKeys = new Set(['bold-text', 'readable-text']);\n const firstThinRowOptions = sectionOptions.filter(o => firstThinRowKeys.has(o.key));\n const secondThinRowOptions = sectionOptions.filter(o => secondThinRowKeys.has(o.key));\n const remainingTextOptions = sectionOptions.filter(o => !firstThinRowKeys.has(o.key) && !secondThinRowKeys.has(o.key));\n const firstThinRowHtml = firstThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(firstThinRowOptions, 'acc-text-inline')}</div>` : '';\n const secondThinRowHtml = secondThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(secondThinRowOptions, 'acc-text-inline')}</div>` : '';\n const remainingTextHtml = remainingTextOptions.length ? `<div class=\"${section.containerClass}\">${this.renderOptions(remainingTextOptions, section.optionClass || '')}</div>` : '';\n if (!specialContent && !firstThinRowHtml && !secondThinRowHtml && !remainingTextHtml) return '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">${section.label}</div>${specialContent}${firstThinRowHtml}${secondThinRowHtml}${remainingTextHtml}</section>`;\n }\n\n if (section.key === 'color') {\n const colorOrder = ['contrast-toggle', 'saturation-toggle', 'invert-colors', 'high-contrast-mode'];\n sectionOptions.sort((a, b) => {\n const rankA = colorOrder.indexOf(a.key); const rankB = colorOrder.indexOf(b.key);\n return (rankA === -1 ? Number.MAX_SAFE_INTEGER : rankA) - (rankB === -1 ? Number.MAX_SAFE_INTEGER : rankB);\n });\n const firstThinRowKeys = new Set(['contrast-toggle', 'saturation-toggle']);\n const secondThinRowKeys = new Set(['invert-colors', 'high-contrast-mode']);\n const firstThinRowOptions = sectionOptions.filter(o => firstThinRowKeys.has(o.key));\n const secondThinRowOptions = sectionOptions.filter(o => secondThinRowKeys.has(o.key));\n const remainingColorOptions = sectionOptions.filter(o => !firstThinRowKeys.has(o.key) && !secondThinRowKeys.has(o.key));\n const firstThinRowHtml = firstThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(firstThinRowOptions, 'acc-text-inline')}</div>` : '';\n const secondThinRowHtml = secondThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(secondThinRowOptions, 'acc-text-inline')}</div>` : '';\n const remainingColorHtml = remainingColorOptions.length ? `<div class=\"${section.containerClass}\">${this.renderOptions(remainingColorOptions, section.optionClass || '')}</div>` : '';\n if (!firstThinRowHtml && !secondThinRowHtml && !remainingColorHtml) return '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">Color & Contrast</div>${firstThinRowHtml}${secondThinRowHtml}${remainingColorHtml}</section>`;\n }\n\n if (section.key === 'reading') {\n const readingOrder = ['highlight-links', 'highlight-title', 'reading-aid', 'simple-layout'];\n sectionOptions.sort((a, b) => {\n const rankA = readingOrder.indexOf(a.key); const rankB = readingOrder.indexOf(b.key);\n return (rankA === -1 ? Number.MAX_SAFE_INTEGER : rankA) - (rankB === -1 ? Number.MAX_SAFE_INTEGER : rankB);\n });\n const firstThinRowKeys = new Set(['highlight-links', 'highlight-title']);\n const secondThinRowKeys = new Set(['reading-aid', 'simple-layout']);\n const firstThinRowOptions = sectionOptions.filter(o => firstThinRowKeys.has(o.key));\n const secondThinRowOptions = sectionOptions.filter(o => secondThinRowKeys.has(o.key));\n const remainingReadingOptions = sectionOptions.filter(o => !firstThinRowKeys.has(o.key) && !secondThinRowKeys.has(o.key));\n const firstThinRowHtml = firstThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(firstThinRowOptions, 'acc-text-inline')}</div>` : '';\n const secondThinRowHtml = secondThinRowOptions.length ? `<div class=\"acc-options acc-options-text-inline\">${this.renderOptions(secondThinRowOptions, 'acc-text-inline')}</div>` : '';\n const remainingReadingHtml = remainingReadingOptions.length ? `<div class=\"${section.containerClass}\">${this.renderOptions(remainingReadingOptions, section.optionClass || '')}</div>` : '';\n if (!firstThinRowHtml && !secondThinRowHtml && !remainingReadingHtml) return '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">Reading Aids</div>${firstThinRowHtml}${secondThinRowHtml}${remainingReadingHtml}</section>`;\n }\n\n const sectionOptionsHtml = sectionOptions.length ? this.renderOptions(sectionOptions, section.optionClass || '') : '';\n if (!specialContent && !sectionOptionsHtml.trim()) return '';\n const optionsContainer = sectionOptionsHtml.trim() ? `<div class=\"${section.containerClass}\">${sectionOptionsHtml}</div>` : '';\n return `<section class=\"acc-option-category acc-option-category-${section.key}\"><div class=\"acc-section-title acc-label\">${section.label}</div>${specialContent}${optionsContainer}</section>`;\n }).join('');\n\n menu.querySelector('.acc-options-all').innerHTML = sectionMarkup;\n\n const langModal = this.findElement('#acc-lang-modal', menu);\n const langToggle = this.findElement('.acc-footer-lang-toggle', menu);\n const langSearch = this.findElement('#acc-lang-search', menu);\n const langItems = menu.querySelectorAll('.acc-lang-item');\n\n const closeLanguageModal = () => {\n if (langModal) langModal.setAttribute('hidden', '');\n if (langToggle) langToggle.setAttribute('aria-expanded', 'false');\n if (langSearch) langSearch.value = '';\n langItems.forEach(item => { item.style.display = ''; });\n };\n\n const openLanguageModal = () => {\n if (langModal) langModal.removeAttribute('hidden');\n if (langToggle) langToggle.setAttribute('aria-expanded', 'true');\n if (langSearch) langSearch.focus();\n };\n\n if (langToggle && langModal) {\n langToggle.addEventListener('click', (event) => {\n event.stopPropagation();\n langModal.hasAttribute('hidden') ? openLanguageModal() : closeLanguageModal();\n });\n }\n\n if (langSearch) {\n langSearch.addEventListener('input', () => {\n const searchValue = langSearch.value.toLowerCase();\n langItems.forEach(item => {\n const labelElement = item.querySelector('.acc-lang-item-label');\n const text = (labelElement?.textContent || item.textContent).toLowerCase();\n item.style.display = text.includes(searchValue) ? '' : 'none';\n });\n });\n }\n\n langItems.forEach(item => {\n item.addEventListener('click', () => {\n const langCode = item.getAttribute('data-lang');\n if (!langCode) return;\n langItems.forEach(i => i.classList.remove('selected'));\n item.classList.add('selected');\n const currentLang = this.findElement('#acc-current-language', menu);\n if (currentLang) currentLang.textContent = String(langCode).toUpperCase();\n closeLanguageModal();\n this.saveConfig({ lang: langCode });\n this.translateMenuUI(menuContainer);\n });\n });\n\n const textScaleRange = this.findElement('.acc-text-scale-range', menu);\n if (textScaleRange) {\n textScaleRange.addEventListener('input', () => {\n const multiplier = this.setTextScaleFromPercent(textScaleRange.value, { persist: false });\n this.syncTextScaleControlUI(menu, multiplier);\n });\n textScaleRange.addEventListener('change', () => {\n const multiplier = this.setTextScaleFromPercent(textScaleRange.value, { persist: true });\n this.syncTextScaleControlUI(menu, multiplier);\n this._fireCallback('onFeatureToggle', 'text-scale', multiplier);\n });\n this.syncTextScaleControlUI(menu, config.states?.['text-scale'] || 1);\n }\n\n menu.addEventListener('click', (e) => {\n if (langModal && !langModal.hasAttribute('hidden')) {\n const clickedInsideLanguageModal = Boolean(e.target.closest('.acc-lang-modal'));\n const clickedLanguageToggle = Boolean(e.target.closest('.acc-footer-lang-toggle'));\n if (!clickedInsideLanguageModal && !clickedLanguageToggle) closeLanguageModal();\n }\n\n const target = e.target.closest('[role=\"button\"], button, .acc-overlay');\n if (!target) return;\n if (target.classList.contains('acc-overlay')) { this.closeMenu(menuContainer); return; }\n if (target.classList.contains('acc-footer-reset')) { this.resetEnhancements(); return; }\n\n const btn = target.classList.contains('acc-btn') ? target : null;\n if (btn) {\n const key = btn.dataset.key;\n if (key === 'accessibility-report') {\n this.runAccessibilityReport();\n } else if (this.multiLevelFeatures[key]) {\n this.cycleMultiLevelFeature(key, btn);\n this._fireCallback('onFeatureToggle', key, this.multiLevelFeatures[key].currentIndex >= 0);\n } else if (this.isColorFilterKey(key)) {\n const isCurrentlyActive = btn.classList.contains('acc-selected');\n const newActiveKey = isCurrentlyActive ? null : key;\n this.setColorFilterUI(menu, newActiveKey);\n this.updateColorFilterState(newActiveKey);\n this.applyVisualFilters();\n this._fireCallback('onFeatureToggle', key, !!newActiveKey);\n } else {\n const isSelected = !btn.classList.contains('acc-selected');\n btn.classList.toggle('acc-selected', isSelected);\n btn.setAttribute('aria-pressed', isSelected);\n this.userInitiatedToggleKey = key;\n try {\n this.updateState({ [key]: isSelected });\n this.applyEnhancements();\n this._fireCallback('onFeatureToggle', key, isSelected);\n } finally {\n this.userInitiatedToggleKey = null;\n }\n }\n }\n });\n\n menu.querySelectorAll('[role=\"button\"], button').forEach(el => {\n el.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); el.click(); }\n });\n });\n\n this.translateMenuUI(menuContainer);\n const activeColorFilter = this.getActiveColorFilterKey(config.states);\n this.setColorFilterUI(menu, activeColorFilter);\n this.updateColorFilterState(activeColorFilter);\n\n if (config.states) {\n for (let key in config.states) {\n if (this.isColorFilterKey(key)) continue;\n if (config.states[key] && key !== 'text-scale') {\n const btn = this.findElement(`.acc-btn[data-key=\"${key}\"]`, menu);\n if (btn) { btn.classList.add('acc-selected'); btn.setAttribute('aria-pressed', 'true'); }\n }\n }\n }\n\n container.appendChild(menuContainer);\n return menuContainer;\n } catch (e) {\n console.error('[AllyWidget] Error displaying menu:', e);\n return null;\n }\n },\n\n displayWidget(options) {\n try {\n this.applyThemeVariables();\n this.registerStaticStyles();\n\n const widgetTemplate = `\n <div class=\"acc-widget\">\n <a href=\"#\" id=\"allyWidget\" class=\"acc-toggle-btn\" title=\"Open Accessibility Menu\" role=\"button\" aria-label=\"Open accessibility menu\" aria-expanded=\"false\">\n <span class=\"acc-toggle-icon\" aria-hidden=\"true\">${this.getWidgetIconMarkup(options?.icon)}</span>\n <span class=\"acc-violation-bubble\" data-severity=\"warning\" hidden> </span>\n </a>\n </div>\n `;\n\n const widget = document.createElement('div');\n widget.innerHTML = widgetTemplate;\n widget.classList.add('acc-container');\n const btn = this.findElement('.acc-toggle-btn', widget);\n this.violationBubble = this.findElement('.acc-violation-bubble', widget);\n this.widgetToggleButton = btn;\n\n const { position = 'bottom-right', offset = [20, 20], size } = options;\n const normalizedOffset = this.normalizeOffset(offset) || [20, 20];\n const offsetX = normalizedOffset[0] ?? 20;\n const offsetY = normalizedOffset[1] ?? 25;\n let buttonStyle = { left: `${offsetX}px`, bottom: `${offsetY}px` };\n if (position === 'bottom-right') {\n buttonStyle = { right: `${offsetX}px`, left: 'auto', bottom: `${offsetY}px` };\n } else if (position === 'top-left') {\n buttonStyle = { top: `${offsetY}px`, bottom: 'auto', left: `${offsetX}px` };\n } else if (position === 'top-right') {\n buttonStyle = { top: `${offsetY}px`, right: `${offsetX}px`, bottom: 'auto', left: 'auto' };\n }\n Object.assign(btn.style, buttonStyle);\n\n if (size !== undefined && size !== null && String(size).trim() !== '') {\n const buttonSize = this.normalizeButtonSize(size);\n btn.style.setProperty('--acc-button-size', buttonSize);\n }\n\n let menu;\n btn.addEventListener('click', (event) => {\n event.preventDefault();\n if (!menu) {\n menu = this.displayMenu({ ...options, container: widget });\n if (!menu) return;\n this.menuContainer = menu;\n const overlay = menu.querySelector('.acc-overlay');\n if (overlay) {\n overlay.addEventListener('click', (overlayEvent) => {\n overlayEvent.stopPropagation();\n this.closeMenu(menu, btn);\n });\n }\n }\n const isHidden = menu.style.display === 'none' || window.getComputedStyle(menu).display === 'none';\n if (isHidden) { this.openMenu(menu, btn); } else { this.closeMenu(menu, btn); }\n });\n\n btn.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); btn.click(); }\n });\n\n document.body.appendChild(widget);\n this.translateMenuUI(widget);\n this.ensureSkipLink();\n\n // Optional keyboard shortcut (Alt+A) to toggle the widget\n if (this.options?.keyboardShortcut !== false) {\n document.addEventListener('keydown', (e) => {\n if (e.altKey && e.key === 'a') {\n e.preventDefault();\n btn.click();\n }\n });\n }\n\n this.runBackgroundAxeScan().catch(() => {\n this.updateViolationBubble({ violations: [] });\n });\n\n if (this.isDevMode()) {\n const rerunDevScan = () => {\n this.runBackgroundAxeScan({ force: true }).catch(() => {\n this.updateViolationBubble(this.axeScanResults || { violations: [] });\n });\n };\n if (document.readyState === 'complete') {\n setTimeout(rerunDevScan, 250);\n } else {\n window.addEventListener('load', () => { setTimeout(rerunDevScan, 150); }, { once: true });\n }\n }\n\n document.addEventListener('click', (e) => {\n if (!btn) return;\n const clickedToggle = e.target === btn || btn.contains(e.target);\n const clickedInsideWidget = e.target.closest('.acc-container');\n if (menu && this.activeMenuContainer === menu && menu.style.display !== 'none') {\n const clickedInsideMenu = menu.contains(e.target);\n if (!clickedToggle && !clickedInsideMenu && !clickedInsideWidget) {\n this.closeMenu(menu, btn);\n }\n } else if (!clickedToggle) {\n btn.blur();\n }\n });\n\n return widget;\n } catch (e) {\n console.error('[AllyWidget] Error displaying widget:', e);\n return null;\n }\n },\n\n startAccessibleWebWidget() {\n try {\n if (document.querySelector('.acc-widget .acc-toggle-btn')) return;\n\n const dataAttributeOptions = this.getDataAttributeOptions();\n if (dataAttributeOptions && Object.keys(dataAttributeOptions).length) {\n this.dataOptions = dataAttributeOptions;\n this.options = { ...this.options, ...dataAttributeOptions };\n }\n\n const baseOptions = { ...this.options };\n const lang = baseOptions.lang ||\n document.querySelector('html')?.getAttribute('lang')?.replace(/[_-].*/, '') ||\n navigator.language ||\n 'en';\n baseOptions.lang = lang;\n baseOptions.position = baseOptions.position || 'bottom-right';\n\n if (baseOptions.offset) baseOptions.offset = this.normalizeOffset(baseOptions.offset);\n if (baseOptions.size) {\n baseOptions.size = this.normalizeButtonSize(baseOptions.size);\n this.widgetTheme.buttonSize = baseOptions.size;\n }\n\n this.options = { ...baseOptions };\n this.applyThemeOverrides(baseOptions);\n this.applyThemeVariables();\n this.registerStaticStyles();\n\n this.loadConfig(false);\n this.detectSystemPreferences();\n this.setupMediaQueryListeners();\n const initialColorFilter = this.getActiveColorFilterKey(this.widgetConfig.states);\n this.updateColorFilterState(initialColorFilter);\n\n this.applyEnhancements();\n this.applyVisualFilters();\n this.launchWidget(baseOptions);\n } catch (e) {\n console.error('[AllyWidget] Error starting widget:', e);\n }\n },\n\n launchWidget(args = {}) {\n try {\n let options = { lang: this.getDefaultLanguage(), position: 'bottom-right', offset: [20, 20] };\n try {\n const savedConfig = this.fetchSavedConfig();\n if (savedConfig) {\n options = { ...options, ...JSON.parse(savedConfig) };\n }\n } catch (e) {\n console.warn('[AllyWidget] Error loading saved config:', e);\n }\n options = { ...options, ...args };\n this.saveConfig(options);\n this.displayWidget(options);\n } catch (e) {\n console.error('[AllyWidget] Error in widget launch:', e);\n }\n }\n\n};\n","/*!\n * Ally Widget v1.0.2\n * Released under the MIT License\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND.\n * This widget does not guarantee accessibility compliance.\n *\n * ─── Developer Options Reference ─────────────────────────────────────────────\n *\n * window.AllyWidgetOptions = {\n * // ── Position & Size ──────────────────────────────────────────────────────\n * position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n * offset: [20, 20] // [horizontal, vertical] px from edge\n * size: '52px' // toggle button size (px / em / rem / %)\n * keyboardShortcut: true // Alt+A to toggle (set false to disable)\n *\n * // ── Language ─────────────────────────────────────────────────────────────\n * lang: 'en' | 'ne'\n *\n * // ── Storage ──────────────────────────────────────────────────────────────\n * storageKey: 'ally-wgt' // localStorage key (change to avoid collisions)\n *\n * // ── Branding / Footer ────────────────────────────────────────────────────\n * poweredByText: 'Ally Widget' // footer link label\n * poweredByUrl: 'https://...' // footer link href\n *\n * // ── Toggle Button Icon ───────────────────────────────────────────────────\n * icon: 'default' | 'person' | 'eye' | 'universal' (built-in variants)\n * OR any SVG string for a fully custom icon\n *\n * // ── Color Theme ──────────────────────────────────────────────────────────\n * primaryColor: '#4f46e5'\n * primaryColorLight: '#818cf8'\n * primaryColorDark: '#3730a3'\n * backgroundColor: '#ffffff'\n * textColor: '#1f2937'\n * textColorInverted: '#ffffff'\n * cardBackground: '#f9fafb'\n * borderColor: '#e5e7eb'\n * focusRingColor: '#4f46e5'\n * hoverColor: '#f3f4f6'\n * activeColor: '#ede9fe'\n * borderRadius: '12px'\n * buttonBorderRadius: '50%'\n * headerHeight: '56px'\n * focusBorderWidth: '2px'\n * focusOutlineOffset: '2px'\n * zIndex: 9999\n * buttonSize: '52px' // alias for size\n *\n * // ── OR pass all theme keys nested under `theme: {}` ──────────────────────\n * theme: { primaryColor: '#e11d48', borderRadius: '8px', ... }\n *\n * // ── Features: disable specific features ──────────────────────────────────\n * disableFeatures: ['hide-images', 'dyslexia-font', 'annotations']\n * // All feature keys: 'bold-text' | 'line-spacing' | 'letter-spacing' |\n * // 'hide-images' | 'readable-text' | 'highlight-links' | 'highlight-title' |\n * // 'text-scale' | 'contrast-toggle' | 'invert-colors' | 'saturation-toggle' |\n * // 'large-pointer' | 'pause-motion' | 'reading-aid' | 'text-to-speech' |\n * // 'high-contrast-mode' | 'simple-layout' | 'annotations' | 'accessibility-report'\n *\n * // ── Features: override label or icon for any feature ─────────────────────\n * featureOverrides: {\n * 'bold-text': { label: 'Bold', icon: '<svg>...</svg>' },\n * 'text-to-speech': { label: 'Read Aloud' }\n * }\n *\n * // ── TTS voice configuration ───────────────────────────────────────────────\n * ttsNativeVoiceName: '' // exact voice name to prefer (e.g. 'Google हिन्दी')\n * ttsNativeVoiceLang: '' // BCP-47 lang tag override (e.g. 'ne-NP')\n * ttsRate: 1 // speech rate 0.5–2\n * ttsPitch: 1 // speech pitch 0–2\n *\n * // ── Event Callbacks ───────────────────────────────────────────────────────\n * onOpen() // widget menu opened\n * onClose() // widget menu closed\n * onFeatureToggle(key, enabled) // a feature was toggled\n * onReset() // all settings reset\n * };\n * ─────────────────────────────────────────────────────────────────────────────\n */\n\nimport { WIDGET_THEME } from './constants/theme.js';\nimport { WIDGET_ICONS } from './constants/icons.js';\nimport { TARGET_SELECTORS, PAGE_CONTENT_SELECTOR } from './constants/selectors.js';\nimport { TRANSLATIONS, SUPPORTED_LANGUAGES } from './constants/translations.js';\nimport { stateMethods } from './state.js';\nimport { styleMethods } from './styles.js';\nimport { featureMethods } from './features.js';\nimport { uiMethods } from './ui.js';\n\nclass AllyWidget {\n constructor(options = {}) {\n this.widgetTheme = { ...WIDGET_THEME };\n\n // Allow full icon override via options.icons\n this.widgetIcons = options.icons && typeof options.icons === 'object'\n ? { ...WIDGET_ICONS, ...options.icons }\n : { ...WIDGET_ICONS };\n\n this.targetSelectors = TARGET_SELECTORS;\n\n this.visualFilters = {\n 'dark-contrast': {\n styles: { 'filter': 'contrast(150%) brightness(0.8)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'light-contrast': {\n styles: { 'filter': 'contrast(125%) brightness(1.2)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'invert-colors': {\n styles: { 'filter': 'invert(100%)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'low-saturation': {\n styles: { 'filter': 'saturate(50%)' },\n selector: PAGE_CONTENT_SELECTOR\n },\n 'high-saturation': {\n styles: { 'filter': 'saturate(200%)' },\n selector: PAGE_CONTENT_SELECTOR\n }\n };\n\n this.translations = TRANSLATIONS;\n this.supportedLanguages = SUPPORTED_LANGUAGES.map((language) => ({ ...language }));\n\n // Build the disabled-features set for quick lookup\n const disabledSet = new Set(\n Array.isArray(options.disableFeatures) ? options.disableFeatures : []\n );\n\n // Per-feature label/icon overrides: { 'bold-text': { label: '...', icon: '...' } }\n const featureOverrides = (options.featureOverrides && typeof options.featureOverrides === 'object')\n ? options.featureOverrides\n : {};\n\n const applyOverride = (item) => {\n const override = featureOverrides[item.key];\n if (!override) return item;\n return {\n ...item,\n ...(override.label ? { label: override.label } : {}),\n ...(override.icon ? { icon: override.icon } : {})\n };\n };\n\n const filterAndOverride = (items) =>\n items\n .filter(item => !disabledSet.has(item.key))\n .map(applyOverride);\n\n this.accessTools = filterAndOverride([\n { label: 'Big Cursor', key: 'large-pointer', icon: this.widgetIcons.largePointer },\n { label: 'Stop Animations', key: 'pause-motion', icon: this.widgetIcons.pauseMotion },\n { label: 'Reading Guide', key: 'reading-aid', icon: this.widgetIcons.readingAid },\n {\n label: 'Text to Speech',\n key: 'text-to-speech',\n icon: this.widgetIcons.textToSpeech,\n requiresSpeechSynthesis: true\n },\n { label: 'High Contrast', key: 'high-contrast-mode', icon: this.widgetIcons.highContrast },\n { label: 'Simplify Layout', key: 'simple-layout', icon: this.widgetIcons.simplifyLayout }\n ]);\n\n if (this.isDevMode()) {\n if (!disabledSet.has('annotations')) {\n this.accessTools.push(applyOverride(\n { label: 'Annotations', key: 'annotations', icon: this.widgetIcons.annotations }\n ));\n }\n if (!disabledSet.has('accessibility-report')) {\n this.accessTools.push(applyOverride(\n { label: 'Accessibility Report', key: 'accessibility-report', icon: this.widgetIcons.accessibilityReport, isAction: true }\n ));\n }\n }\n\n // axe-core state\n this.axeCoreLoaded = false;\n this.axeCoreLoading = false;\n this.axeCorePromise = null;\n this.axeScanResults = null;\n this.axeScanPromise = null;\n this.violationBubble = null;\n\n // Accessibility report modal state\n this.reportPreviousFocus = null;\n this.reportKeyListener = null;\n\n // System preference state\n this.systemPreferenceListeners = [];\n this.systemPreferenceMediaQueries = {};\n\n // Annotation state\n this.annotationLayer = null;\n this.annotationItems = [];\n this.annotationPopup = null;\n this.annotationRepositionHandler = null;\n this.annotationOutsideHandler = null;\n this.annotationRequestId = 0;\n\n // Text-to-speech state\n this.ttsUtterance = null;\n this.ttsClickListener = null;\n this.ttsActiveTarget = null;\n this.ttsTextCache = '';\n this.ttsStatus = 'stopped';\n this.ttsQueue = [];\n this.ttsQueueIndex = 0;\n this.ttsSessionId = 0;\n this.ttsVoice = null;\n\n // Simple layout state\n this.simpleLayoutRoot = null;\n this.simpleLayoutHiddenElements = [];\n\n this.userInitiatedToggleKey = null;\n\n // Font size / multi-level state\n this.textScaleIndex = 0;\n this.textScaleValues = [1.2, 1.4, 1.6];\n this.textScaleMinPercent = 80;\n this.textScaleMaxPercent = 150;\n this.textScaleStepPercent = 5;\n this.contrastFilterValues = ['light-contrast', 'dark-contrast'];\n this.saturationFilterValues = ['low-saturation', 'high-saturation'];\n\n this.contentOptions = filterAndOverride([\n { label: 'Font Weight', key: 'bold-text', icon: this.widgetIcons.boldText },\n { label: 'Line Height', key: 'line-spacing', icon: this.widgetIcons.lineSpacing },\n { label: 'Letter Spacing', key: 'letter-spacing', icon: this.widgetIcons.letterSpacing },\n { label: 'Hide Images', key: 'hide-images', icon: this.widgetIcons.hideImages },\n { label: 'Dyslexia Font', key: 'readable-text', icon: this.widgetIcons.dyslexiaFont },\n { label: 'Highlight Links', key: 'highlight-links', icon: this.widgetIcons.highlightLinks },\n { label: 'Highlight Title', key: 'highlight-title', icon: this.widgetIcons.highlightTitle },\n {\n label: 'Font Size',\n key: 'text-scale',\n icon: this.widgetIcons.adjustFontSize,\n multiLevel: true,\n levels: this.textScaleValues.length\n }\n ]);\n\n this.multiLevelFeatures = {\n 'text-scale': {\n levels: this.textScaleValues.length,\n currentIndex: -1,\n values: this.textScaleValues\n },\n 'contrast-toggle': {\n levels: this.contrastFilterValues.length,\n currentIndex: -1,\n values: this.contrastFilterValues\n },\n 'saturation-toggle': {\n levels: this.saturationFilterValues.length,\n currentIndex: -1,\n values: this.saturationFilterValues\n }\n };\n\n this.readingAidTemplate = `\n <div class=\"acc-rg acc-rg-top\" role=\"presentation\"> </div>\n <div class=\"acc-rg acc-rg-bottom\" role=\"presentation\"> </div>\n `;\n\n this.colorOptions = filterAndOverride([\n {\n label: 'Contrast',\n key: 'contrast-toggle',\n icon: this.widgetIcons.contrast,\n multiLevel: true,\n levels: this.contrastFilterValues.length\n },\n { label: 'Invert Colors', key: 'invert-colors', icon: this.widgetIcons.invertColors },\n {\n label: 'Saturation',\n key: 'saturation-toggle',\n icon: this.widgetIcons.saturation,\n multiLevel: true,\n levels: this.saturationFilterValues.length\n }\n ]);\n\n this.colorFilterKeys = Object.keys(this.visualFilters);\n this.activeColorFilterKey = null;\n\n this.textScaleSelectors = 'h1,h2,h3,h4,h5,h6,p,a,dl,dt,li,ol,th,td,span,blockquote,.acc-text';\n this.textScaleObserver = null;\n this.currentTextScaleMultiplier = 1;\n\n this.widgetConfig = {};\n\n // Configurable storage key\n this.storageKey = (typeof options.storageKey === 'string' && options.storageKey.trim())\n ? options.storageKey.trim()\n : 'ally-wgt';\n\n this.readingAidVisible = false;\n this.readableFontLoaded = false;\n\n // Menu state\n this.activeMenuContainer = null;\n this.activeMenuToggle = null;\n this.menuKeyListener = null;\n this.previousFocus = null;\n this.widgetToggleButton = null;\n this.skipLinkElement = null;\n this.menuContainer = null;\n\n this.staticStylesRegistered = false;\n\n this.dataOptions = this.getDataAttributeOptions();\n\n this.options = {\n lang: this.getDefaultLanguage(),\n position: 'bottom-right',\n ...this.dataOptions,\n ...options\n };\n\n this.applyThemeOverrides(this.options);\n\n const normalizeTtsRate = (value) => {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) return 1;\n return Math.min(2, Math.max(0.5, numeric));\n };\n\n const normalizeTtsPitch = (value) => {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) return 1;\n return Math.min(2, Math.max(0, numeric));\n };\n\n this.nativeTtsConfig = {\n preferredVoiceName: (\n typeof options.ttsNativeVoiceName === 'string' &&\n options.ttsNativeVoiceName.trim()\n ) ? options.ttsNativeVoiceName.trim() : '',\n preferredVoiceLang: (\n typeof options.ttsNativeVoiceLang === 'string' &&\n options.ttsNativeVoiceLang.trim()\n ) ? options.ttsNativeVoiceLang.trim() : '',\n rate: normalizeTtsRate(options.ttsRate),\n pitch: normalizeTtsPitch(options.ttsPitch)\n };\n\n if (this.options.offset) {\n this.options.offset = this.normalizeOffset(this.options.offset);\n }\n\n if (this.options.size) {\n this.widgetTheme.buttonSize = this.normalizeButtonSize(this.options.size);\n this.options.size = this.widgetTheme.buttonSize;\n }\n\n this.applyThemeVariables();\n this.registerStaticStyles();\n }\n\n applyThemeOverrides(options = {}) {\n if (!options || typeof options !== 'object') return;\n\n const mergedOptions = {\n ...(options.theme && typeof options.theme === 'object' ? options.theme : {}),\n ...options\n };\n\n const themeKeys = [\n 'primaryColor', 'primaryColorLight', 'primaryColorDark',\n 'backgroundColor', 'textColor', 'textColorInverted',\n 'cardBackground', 'borderColor', 'focusRingColor',\n 'hoverColor', 'activeColor', 'borderRadius', 'buttonBorderRadius',\n 'headerHeight', 'focusBorderWidth', 'focusOutlineOffset', 'zIndex'\n ];\n\n themeKeys.forEach((key) => {\n const value = mergedOptions[key];\n if (value === undefined || value === null) return;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return;\n this.widgetTheme[key] = trimmed;\n return;\n }\n this.widgetTheme[key] = value;\n });\n\n if (mergedOptions.buttonSize !== undefined && mergedOptions.buttonSize !== null && mergedOptions.buttonSize !== '') {\n this.widgetTheme.buttonSize = this.normalizeButtonSize(mergedOptions.buttonSize);\n }\n }\n}\n\n/** @typedef {typeof stateMethods & typeof styleMethods & typeof featureMethods & typeof uiMethods} AllyWidgetMixedMethods */\n/** @typedef {AllyWidget & AllyWidgetMixedMethods} AllyWidgetInstance */\n\n/** @type {AllyWidget['prototype'] & AllyWidgetMixedMethods} */\nconst widgetPrototype = AllyWidget.prototype;\n\nObject.assign(\n widgetPrototype,\n stateMethods,\n styleMethods,\n featureMethods,\n uiMethods\n);\n\n/**\n * AllyWidget.init(options) — programmatic initialisation.\n *\n * Use this instead of the auto-init in frameworks (Next.js, Nuxt, SvelteKit…)\n * where you control when the widget mounts:\n *\n * // Next.js app router component (use client)\n * useEffect(() => { AllyWidget.init({ primaryColor: '#6366f1' }); }, []);\n *\n * // CDN\n * AllyWidget.init({ lang: 'ne' });\n *\n * Returns the widget instance, or null when called server-side.\n */\nAllyWidget.init = function init(options = {}) {\n if (typeof document === 'undefined') return null;\n const instance = new AllyWidget(options);\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n instance.startAccessibleWebWidget();\n } else {\n document.addEventListener('DOMContentLoaded', () => instance.startAccessibleWebWidget(), { once: true });\n }\n return instance;\n};\n\nif (typeof window !== 'undefined') {\n window.AllyWidget = AllyWidget;\n}\n\n// Auto-init only in IIFE/CDN builds (__ALLY_AUTO_INIT__ is replaced at build time).\n// ESM and CJS builds set this to false so importing the module never triggers\n// a default-themed widget that would conflict with AllyWidget.init() calls.\nif (__ALLY_AUTO_INIT__ && typeof document !== 'undefined') {\n const globalAutoInitOptions = (\n typeof window !== 'undefined' &&\n window.AllyWidgetOptions &&\n typeof window.AllyWidgetOptions === 'object'\n ) ? window.AllyWidgetOptions : {};\n\n if (globalAutoInitOptions.autoInit !== false) {\n /** @type {AllyWidgetInstance} */\n const widgetInstance = new AllyWidget(globalAutoInitOptions);\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n widgetInstance.startAccessibleWebWidget();\n } else {\n document.addEventListener('DOMContentLoaded', () => widgetInstance.startAccessibleWebWidget(), { once: true });\n }\n }\n}\n\nexport default AllyWidget;\n"],"names":["WIDGET_THEME","primaryColor","primaryColorLight","primaryColorDark","backgroundColor","textColor","textColorInverted","buttonSize","cardBackground","borderColor","focusRingColor","hoverColor","activeColor","successColor","errorColor","warningColor","headerHeight","borderRadius","buttonBorderRadius","menuPosition","zIndex","focusBorderWidth","focusOutlineOffset","WIDGET_ICONS","accessibility","accessibilityVariants","default","largePointer","pauseMotion","readingAid","boldText","lineSpacing","letterSpacing","dyslexiaFont","highlightLinks","highlightTitle","contrast","darkContrast","lightContrast","invertColors","saturation","lowSaturation","highSaturation","reset","close","increase","decrease","arrowBack","adjustFontSize","language","hideImages","accessibilityReport","annotations","textToSpeech","highContrast","simplifyLayout","TARGET_SELECTORS","ALL","LINKS","HEADERS","TEXT","PAGE_CONTENT_SELECTOR","TRANSLATIONS","en","Close","Monochrome","Tools","Language","Critical","Serious","Moderate","Minor","Element","Issue","Annotations","Play","Pause","Stop","Contrast","Saturation","Accessibility","ne","SUPPORTED_LANGUAGES","code","label","stateMethods","storageAvailable","test","localStorage","setItem","removeItem","fetchCookie","name","cookieName","decodedCookie","decodeURIComponent","document","cookie","split","map","c","trim","find","startsWith","substring","length","e","console","warn","storeCookie","value","days","d","Date","setTime","getTime","expires","toUTCString","isSecure","window","location","protocol","getSavedLanguage","this","stored","getItem","storageKey","config","JSON","parse","lang","cookieVal","getBrowserLanguage","navigator","supportedCodes","supportedLanguages","browserLanguages","languages","browserLang","primaryCode","toLowerCase","includes","getDefaultLanguage","savedLang","isDevMode","urlParams","URLSearchParams","search","get","getDataAttributeOptions","options","attributes","assignValue","key","String","position","normalized","normalizeOffset","offset","normalizedSize","normalizeButtonSize","size","icon","scriptCandidates","currentScript","push","querySelectorAll","forEach","script","el","attrName","fallback","attrValue","getAttribute","undefined","querySelector","parts","Array","isArray","parsed","part","number","Number","isFinite","Math","round","filter","widgetTheme","max","trimmed","numeric","toggleDisplay","state","style","display","isSystemControlledPreference","systemDefaults","widgetConfig","Object","prototype","hasOwnProperty","call","hasExplicitStatePreference","states","hasExplicitColorFilterPreference","colorFilterKeys","some","updateState","payload","source","previousStates","previousSystemDefaults","nextStates","nextSystemDefaults","keys","updatedConfig","saveConfig","newConfig","data","stringify","retrieveState","loadConfig","cache","savedConfig","fetchSavedConfig","STATIC_STYLES","join","styleMethods","findElement","selector","parent","injectStyle","id","css","getElementById","createElement","innerHTML","head","appendChild","createCSS","styles","browserPrefixes","prefixedProperties","prefix","wrapCSS","childrenSelector","output","child","buildCSS","applyToolStyle","enable","styleId","remove","documentElement","classList","toggle","applyThemeVariables","vars","entries","setProperty","registerStaticStyles","staticStylesRegistered","AXE_CORE_VERSION","AXE_CORE_SRC","AXE_RUN_OPTIONS","runOnly","SYSTEM_PREFERS_REDUCED_MOTION","featureMethods","getContrastToggleDisplay","index","widgetIcons","updateContrastToggleButton","button","iconNode","outerHTML","insertAdjacentHTML","translatedLabel","translate","labelNode","setAttribute","innerText","getSaturationToggleDisplay","updateSaturationToggleButton","ensureSkipLink","skipLinkElement","body","contains","updateSkipLinkLabel","existing","type","className","textContent","addEventListener","event","preventDefault","widgetToggleButton","currentMenu","activeMenuContainer","menuContainer","focusMenu","targetMenu","focusables","getFocusableElements","focus","click","requestAnimationFrame","insertBefore","firstChild","shouldSkipScaling","element","closest","collectDirectTextParents","rootElement","directTextParents","Set","NodeFilter","root","walker","createTreeWalker","SHOW_TEXT","acceptNode","node","FILTER_REJECT","parentElement","matches","textScaleSelectors","FILTER_ACCEPT","currentNode","nextNode","add","applyScaleToElement","multiplier","baseAttr","hasAttribute","computedSize","parseFloat","getComputedStyle","fontSize","isNaN","baseSize","ensureTextScaleObserver","textScaleObserver","MutationObserver","mutations","abs","currentTextScaleMultiplier","pending","mutation","addedNodes","observe","childList","subtree","disconnectTextScaleObserver","disconnect","scaleText","multiply","numericMultiply","resolvedMultiply","isDefaultScale","removeAttribute","clampTextScalePercent","percent","min","textScaleMinPercent","textScaleMaxPercent","step","textScaleStepPercent","snapped","getTextScalePercent","scaleValue","syncTextScaleControlUI","menu","range","progress","setTextScaleFromPercent","shouldPersist","persist","clampedPercent","toFixed","exactIndex","textScaleValues","indexOf","multiLevelFeatures","currentIndex","textScaleIndex","nearestIndex","minDistance","Infinity","distance","enableBoldText","adjustLetterSpacing","adjustLineSpacing","enableLargePointer","cursor","outline","highlightTitles","targetSelectors","ensureReadableFontLoaded","readableFontLoaded","enableReadableText","shouldEnable","transition","enableHighContrastMode","X","enableReadingAid","container","guideHeight","__accweb__scrollGuide","removeEventListener","readingAidTemplate","prepend","rgTop","rgBottom","readingAidVisible","updateGuidePosition","throttle","mouseY","clientY","topHeight","bottomHeight","innerHeight","height","passive","loadAxeCore","axeCoreLoaded","axe","Promise","resolve","axeCorePromise","axeCoreLoading","reject","settled","timeoutId","settleSuccess","clearTimeout","Error","settleError","error","src","async","integrity","crossOrigin","once","setTimeout","getAxeRunOptions","getViolationCounts","results","counts","critical","serious","moderate","minor","violations","violation","impact","nodes","updateViolationBubble","bubble","violationBubble","axeScanResults","devMode","displayCount","severity","hidden","dataset","runBackgroundAxeScan","force","axeScanPromise","run","ensureMediaQuery","query","matchMedia","systemPreferenceMediaQueries","applySystemMotionPreference","detectSystemPreferences","reducedMotionQuery","shouldPauseMotion","applyEnhancements","clearSystemPreferenceListeners","systemPreferenceListeners","setupMediaQueryListeners","mediaQuery","handler","addListener","removeListener","listen","runAccessibilityReport","panel","createReportPanel","openReportPanel","contentArea","statusArea","displayReportResults","message","getReportFocusableElements","dialog","reportPreviousFocus","activeElement","focusTarget","reportKeyListener","stopPropagation","closeReportPanel","first","last","active","outsidePanel","shiftKey","closeBtn","overlay","passes","incomplete","v","totalViolations","values","reduce","a","b","html","severityOrder","sort","capitalizeFirst","escapeHtml","help","description","helpUrl","slice","failureSummary","header","str","charAt","toUpperCase","div","concealImages","existingStyle","supportsSpeechSynthesis","SpeechSynthesisUtterance","supportsTextToSpeech","normalizeSpeechLanguage","languageCode","getNativeTtsRate","configured","nativeTtsConfig","rate","getNativeTtsPitch","pitch","isElementVisibleForTts","visibility","rect","getBoundingClientRect","width","isTtsExcludedElement","allowLandmarkRegions","normalizeReadableText","text","replace","getTtsCandidateRoots","roots","seen","has","getPrimaryContentRoot","candidates","explicitCandidates","from","explicitBest","explicitBestScore","candidate","textLength","score","topLevelCandidates","children","best","bestScore","bestRoot","extractReadableBlocks","blocks","getReadableContent","candidateRoots","bestBlocks","characterCount","splitLongSpeechSegment","segment","maxLength","remaining","splitIndex","lastIndexOf","floor","Boolean","buildSpeechQueue","paragraphCandidates","paragraph","paragraphs","queue","sentences","sentenceList","chunk","sentence","next","resolveSpeechVoice","synth","speechSynthesis","voices","getVoices","preferredVoiceName","byExactName","voice","byNameContains","targetLanguage","preferredVoiceLang","primary","localExact","localService","exact","localByPrimary","byPrimary","defaultVoice","getSpeechTargetFromEvent","target","block","setActiveSpeechTarget","ttsActiveTarget","startTtsClickMode","ttsClickListener","handleTtsClick","stopTtsClickMode","ttsTextCache","startSpeechPlayback","restart","ensureTtsQueue","ttsQueue","ttsQueueIndex","speakNextTtsChunk","sessionId","ttsSessionId","ttsStatus","utterance","ttsVoice","onstart","onpause","onresume","onend","onerror","ttsUtterance","speak","startNativeSpeechPlayback","paused","resume","stopSpeech","cancel","pauseSpeech","speaking","pause","resumeSpeech","enableTextToSpeech","isUserToggle","userInitiatedToggleKey","announceTtsState","msg","ensureAnnotationLayer","annotationLayer","layer","resolveAnnotationTarget","buildAnnotationEntries","title","createAnnotationMarker","annotation","marker","showAnnotationPopup","positionAnnotationPopup","popup","markerRect","popupWidth","offsetWidth","popupHeight","offsetHeight","viewportWidth","innerWidth","viewportHeight","gap","left","scrollX","top","scrollY","bottom","clearAnnotationPopup","annotationPopup","__accMarker","closeButton","positionAnnotations","annotationItems","item","right","enableAnnotations","disableAnnotations","requestId","annotationRequestId","cancelPending","then","annotationRepositionHandler","annotationOutsideHandler","clickedPopup","clickedMarker","catch","clearSimpleLayoutDomMutations","simpleLayoutRoot","simpleLayoutHiddenElements","applySimpleLayoutDomMutations","hiddenElements","clutterSelectors","enableSimpleLayout","S","R","storedScale","appliedScale","isColorFilterKey","getActiveColorFilterKey","activeColorFilterKey","setColorFilterUI","activeKey","contrastFeature","contrastButton","contrastIndex","isContrastActive","indicator","dot","saturationFeature","saturationButton","saturationIndex","isSaturationActive","filterKey","isActive","updateColorFilterState","requiresUpdate","rawCurrent","computeFilteredBodyColor","m","match","r","g","clamp","s","ng","nb","s2","hg","hb","applyVisualFilters","visualFilters","adjustedFilter","filteredBg","cycleTextScale","progressIndicator","dots","cycleMultiLevelFeature","featureKey","feature","newIndex","newActiveKey","levels","newValue","i","resetEnhancements","blur","guide","_fireCallback","uiMethods","args","fn","translations","getLanguageCountryLabel","getLanguageFlag","countryCode","fromCodePoint","char","charCodeAt","formatLanguageLabel","getWidgetIconMarkup","iconKey","variants","func","limit","inThrottle","apply","selectors","hasDocument","openMenu","toggleBtn","activeMenuToggle","previousFocus","focusable","menuKeyListener","closeMenu","targetContainer","langModal","langToggle","langSearch","renderOptions","optionClass","opt","requiresSpeechSynthesis","isMultiLevel","multiLevel","mergedOptionClass","featureData","j","renderTextScaleControl","getTranslatedText","defaultValue","translateMenuUI","displayMenu","activeLanguageCode","poweredByText","poweredByUrl","menuTemplate","languageLabel","languageFlag","offsetY","textKeys","colorKeys","readingAidsKeys","sourceOptions","contentOptions","option","colorOptions","accessTools","groupedOptions","speech","color","reading","interaction","seenKeys","sectionMarkup","containerClass","section","sectionOptions","specialContent","textScaleOption","textOrder","rankA","rankB","MAX_SAFE_INTEGER","firstThinRowKeys","secondThinRowKeys","firstThinRowOptions","o","secondThinRowOptions","remainingTextOptions","firstThinRowHtml","secondThinRowHtml","remainingTextHtml","colorOrder","remainingColorOptions","remainingColorHtml","readingOrder","remainingReadingOptions","remainingReadingHtml","sectionOptionsHtml","optionsContainer","langItems","closeLanguageModal","openLanguageModal","searchValue","labelElement","langCode","currentLang","textScaleRange","clickedInsideLanguageModal","clickedLanguageToggle","btn","isSelected","activeColorFilter","displayWidget","widgetTemplate","widget","normalizedOffset","offsetX","buttonStyle","assign","overlayEvent","keyboardShortcut","altKey","rerunDevScan","readyState","clickedToggle","clickedInsideWidget","clickedInsideMenu","startAccessibleWebWidget","dataAttributeOptions","dataOptions","baseOptions","applyThemeOverrides","initialColorFilter","launchWidget","AllyWidget","constructor","icons","disabledSet","disableFeatures","featureOverrides","applyOverride","override","filterAndOverride","items","isAction","contrastFilterValues","saturationFilterValues","ttsNativeVoiceName","ttsNativeVoiceLang","normalizeTtsRate","ttsRate","normalizeTtsPitch","ttsPitch","mergedOptions","theme","widgetPrototype","init","instance","globalAutoInitOptions","AllyWidgetOptions","autoInit","widgetInstance"],"mappings":"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"}
|