/* Only complements native navigation; native search and Woo actions stay unchanged. */
(()=>{
const key='cfHeaderDraft40435';
window[key]?.dispose?.();
const abort=new AbortController(),media=matchMedia('(max-width:1024px)');
const header=()=>document.querySelector('.elementor-40435.elementor-location-header');
const toggle=()=>header()?.querySelector('.cf-header-nav .elementor-menu-toggle');
const expanded=t=>t&&(t.getAttribute('aria-expanded')==='true'||t.classList.contains('elementor-active'));
const close=focus=>{const t=toggle();if(expanded(t)){t.click();if(focus)t.focus();}};
document.addEventListener('keydown',event=>{
if(event.key==='Escape'&&expanded(toggle())){close(true);event.preventDefault();}
},{signal:abort.signal});
document.addEventListener('pointerdown',event=>{
const nav=header()?.querySelector('.cf-header-nav');
if(media.matches&&expanded(toggle())&&nav&&!nav.contains(event.target))close(false);
},{signal:abort.signal});
const change=()=>close(false);media.addEventListener('change',change);
const disposeCart=cfEnhanceDraftCart(header());
window[key]={dispose(){abort.abort();media.removeEventListener('change',change);disposeCart();}};
/* Proposal only. Call inside the draft header's existing behaviour IIFE:
* const disposeCart = cfEnhanceDraftCart(header());
* Include disposeCart() in that IIFE's existing dispose method.
* Native cart toggling, fragments and checkout links remain untouched.
*/
function cfEnhanceDraftCart(header) {
if (!header || header.getAttribute('data-elementor-id') === '353') return () => {};
const abort = new AbortController(), owned = new Map();
let wasOpen = false, closing = false, frame = 0;
const refs = () => {
const widget = header.querySelector('.cf-header-cart');
return {widget, pane:widget?.querySelector('.elementor-menu-cart__main'),
trigger:widget?.querySelector('.elementor-menu-cart__toggle_button'),
close:widget?.querySelector('.elementor-menu-cart__close-button, .elementor-menu-cart__close-button-custom')};
};
const open = r => !!r.widget?.classList.contains('elementor-menu-cart--shown');
const attribute = (el, name, value) => {
if (!el || el.getAttribute(name) === value) return;
if (!owned.has(el)) owned.set(el, new Map());
const values = owned.get(el), old = values.has(name) ? values.get(name).old : el.getAttribute(name);
values.set(name, {old, value}); el.setAttribute(name, value);
};
const prepare = r => {
if (!r.pane) return;
if (!r.pane.id) attribute(r.pane, 'id', 'cf-cart-dialog-' + header.getAttribute('data-elementor-id'));
attribute(r.pane, 'role', 'dialog'); attribute(r.pane, 'aria-modal', 'true');
if (!r.pane.hasAttribute('aria-label') && !r.pane.hasAttribute('aria-labelledby')) attribute(r.pane, 'aria-label', 'Shopping cart');
attribute(r.pane, 'tabindex', '-1');
attribute(r.trigger, 'aria-haspopup', 'dialog'); attribute(r.trigger, 'aria-controls', r.pane.id);
if (r.close) {
if (!r.close.matches('button, input[type="button"]')) attribute(r.close, 'role', 'button');
attribute(r.close, 'tabindex', '0');
if (!r.close.hasAttribute('aria-label') && !r.close.hasAttribute('aria-labelledby')) attribute(r.close, 'aria-label', 'Close shopping cart');
}
};
const focusable = pane => [...pane.querySelectorAll('a[href],button,input,select,textarea,summary,[tabindex],[contenteditable="true"]')]
.filter(el => el.tabIndex >= 0 && !el.matches(':disabled') && !el.closest('[hidden],[inert],[aria-hidden="true"]')
&& el.getClientRects().length && getComputedStyle(el).visibility === 'visible');
const focusInside = () => {
const r = refs(); if (!open(r) || closing || !r.pane) return;
(focusable(r.pane)[0] || r.pane).focus({preventScroll:true});
};
const returnFocus = () => { const t = refs().trigger; if (t?.isConnected) t.focus(); };
const sync = () => {
const r = refs(); prepare(r);
const now = open(r);
if (now && !wasOpen) {
closing = false; cancelAnimationFrame(frame); frame = requestAnimationFrame(focusInside);
} else if (!now && wasOpen) {
closing = true; cancelAnimationFrame(frame); returnFocus(); closing = false;
} else if (now && r.pane && !r.pane.contains(document.activeElement) && !closing) {
cancelAnimationFrame(frame); frame = requestAnimationFrame(focusInside);
}
wasOpen = now;
};
const closeNative = () => {
const r = refs(); if (!open(r)) return;
closing = true; returnFocus();
// Invoke the existing handler; never change its internal isCartOpen state.
(r.close || r.trigger)?.click();
if (open(refs())) { closing = false; focusInside(); }
};
document.addEventListener('keydown', event => {
const r = refs(); if (!open(r) || !r.pane) return;
if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); closeNative(); return; }
if ((event.key === 'Enter' || event.key === ' ') && r.close?.contains(event.target)
&& !r.close.matches('button, input[type="button"]')) {
event.preventDefault(); closeNative(); return;
}
if (event.key !== 'Tab') return;
const list = focusable(r.pane), first = list[0], last = list[list.length - 1], current = document.activeElement;
if (!first) { event.preventDefault(); r.pane.focus({preventScroll:true}); }
else if (!r.pane.contains(current) || (event.shiftKey && (current === first || current === r.pane))) {
event.preventDefault(); (event.shiftKey ? last : first).focus({preventScroll:true});
} else if (!event.shiftKey && current === last) {
event.preventDefault(); first.focus({preventScroll:true});
}
}, {capture:true, signal:abort.signal});
// Move focus before native click handlers apply aria-hidden to the pane.
document.addEventListener('click', event => {
const r = refs(); if (!open(r) || !r.pane) return;
if (r.close?.contains(event.target) || !r.pane.contains(event.target)) {
closing = true; returnFocus();
queueMicrotask(() => { if (open(refs())) { closing = false; focusInside(); } });
}
}, {capture:true, signal:abort.signal});
document.addEventListener('focusin', event => {
const r = refs(); if (!closing && open(r) && r.pane && !r.pane.contains(event.target)) focusInside();
}, {capture:true, signal:abort.signal});
const observer = new MutationObserver(sync);
observer.observe(header, {subtree:true, childList:true, attributes:true, attributeFilter:['class','aria-hidden']});
sync();
return () => {
observer.disconnect(); abort.abort(); cancelAnimationFrame(frame);
for (const [el, attrs] of owned) for (const [name, {old, value}] of attrs) {
if (el.getAttribute(name) !== value) continue;
if (old === null) el.removeAttribute(name); else el.setAttribute(name, old);
}
};
}
})();
Blog · 301 articles
Expert Advisor Reviews and Forex Guides
Page 14 of 25
How each Expert Advisor trades, what its backtests and live signals show, and the risks to check before you buy. Plus guides on prop firms, setup and automated trading.
De Moore EA MT5 is a gold M5 system combining trend-following, price action and multi-timeframe analysis. The public preset makes some controls inspectable, while the developer’s explanation of backtest differences is central to the assessment. A live account and a…
Smart Gold Impulse reviewed: session controls, the current signal, average wins versus losses, mixed customer feedback and a comparison with Smart Gold Hunter.
Janus Zone reviewed: three public signals, drawdown, recent fixes, selectable gold strategies and early customer feedback, with a comparison to Weltrix.
Angels Eye is a low-cost gold breakout EA. We examine its young BlackBull signal, mixed customer feedback, version 2.0 changes and the DowGold alternative.