PageSourceSearch

https://beyondyoga.com/cdn/shop/t/2162/assets/global-focusable-widget.js?v=74352962925567967041789405389

js beyondyoga.com collected 2026-09-24 19:59:44 UTC 4,811 bytes, 1 lines download raw bytes

1import{prepareTransition,a11y}from"@theme/global-utilities";export class FocusableWidget extends HTMLElement{constructor(e={}){if(super(),!e.name)throw new Error(`Focusable Widget(${e.name}) must have a name`);if(!this.id)throw new Error(`${e.name} must have an id`);if(!e.background)throw new Error(`Focusable Widget(${e.name}) must have a background`);this._clientConfig=e,this._init(e)}open=()=>{if(!this._isOpen)return this._closeFocusableWidgets(),this.toggle()};close=()=>{if(this._isOpen)return this.toggle()};toggle=()=>{if(prepareTransition(this),this._toggleClasses(),this._toggleAccessibilityAttributes(),this._isOpen)a11y.removeTrapFocus(this),this._unbindEvents(),this._dispatchEvents(this._events.close,["close"]);else{var e=a11y.getFocusableElements(this),t=e.length>0?e[0]:this;a11y.trapFocus(this,t),this._bindEvents(),this._dispatchEvents(this._events.open,["open"])}return this._isOpen=!this._isOpen,this};reinitWidget=()=>{this._init(this._clientConfig)};get isOpen(){return this._isOpen}_init({name:e,background:t,widgetOpenClasses:s=[],bodyOpenClasses:i=[],attributes:o={}}){this._name=e,this._isOpen=!1,this._selectors={background:t,open:this.getAttribute("open"),close:this.getAttribute("close")},this._nodes={background:document.querySelector(this._selectors.background)},this._events={open:["focusable-widget:open",`${e}:open`,`${this.id}:open`],close:["focusable-widget:close",`${e}:close`,`${this.id}:close`]},this._config={open:document.querySelectorAll(this._selectors.open),close:document.querySelectorAll(this._selectors.close),attributes:{"data-focusable-widget":"true","aria-hidden":"true",tabindex:0,...o},widgetOpenClasses:["open",this.getAttribute("open-class")].concat(s),bodyOpenClasses:["js-focusable-widget-open",`js-${e}-open`,this.getAttribute("body-open-class")].concat(i)},this._validateConfig(),this._addAccessibilityAttributes(),this._setupListeners()}_validateConfig(){var e=this.getAttribute("open");if(this._config.open&&this._config.open.length||null===e||""===e||console.warn(`WARN: ${this._name}: no open triggers found. Check your ${this._name} 'open' attribute, or add a trigger (if needed)`),!this._config.close||!this._config.close.length)throw new Error(`${this._name}: invalid close trigger selector, no elements found. Check your ${this._name} 'close' attribute`)}_setupListeners(){this._config.open.forEach(e=>e.addEventListener("click",this._open.bind(this))),this._config.close.forEach(e=>e.addEventListener("click",this._close.bind(this))),this.addEventListener("click",e=>e.stopPropagation())}_open(e){e&&(e.preventDefault(),e.stopPropagation()),this.open()}_close=e=>{e&&(e.preventDefault(),e.stopPropagation()),this.close()};_closeFocusableWidgets(){document.querySelectorAll("[data-focusable-widget].open").forEach(e=>e.close())}_dispatchEvents(e,t){e.forEach(e=>document.dispatchEvent(new CustomEvent(e))),t&&t.length&&t.forEach(e=>this.dispatchEvent(new CustomEvent(e)))}_bindEvents(){document.addEventListener("keyup",this._onKeyUp),this._nodes.background.addEventListener("click",this._close),this._nodes.background.addEventListener("touchmove",this._onTouchMove)}_unbindEvents(){document.removeEventListener("keyup",this._onKeyUp),this._nodes.background.removeEventListener("click",this._close),this._nodes.background.removeEventListener("touchmove",this._onTouchMove)}_toggleClasses(){this._isOpen?(this._config.bodyOpenClasses.forEach(e=>{e&&document.body.classList.remove(e)}),this._config.widgetOpenClasses.forEach(e=>{e&&this.classList.remove(e)})):(this._config.bodyOpenClasses.forEach(e=>{e&&document.body.classList.add(e)}),this._config.widgetOpenClasses.forEach(e=>{e&&this.classList.add(e)}))}_toggleAccessibilityAttributes(){const e=this.hasAttribute("no-expand-close");this._isOpen?(this.setAttribute("aria-hidden","true"),this.setAttribute("tabindex","-1"),this._config.open.forEach(e=>e.setAttribute("aria-expanded","false")),this._config.close.forEach(t=>{e?t.removeAttribute("aria-expanded"):t.setAttribute("aria-expanded","false")})):(this.setAttribute("aria-hidden","false"),this.setAttribute("tabindex","0"),this._config.open.forEac
1h(e=>e.setAttribute("aria-expanded","true")),this._config.close.forEach(t=>{e?t.removeAttribute("aria-expanded"):t.setAttribute("aria-expanded","true")}))}_addAccessibilityAttributes(){const e=this.hasAttribute("no-expand-close");for(const e in this._config.attributes)this.setAttribute(e,this._config.attributes[e]);this._config.open.forEach(e=>{e.setAttribute("tabindex","0"),e.setAttribute("aria-expanded","false"),e.setAttribute("aria-controls",this.id)}),this._config.close.forEach(t=>{t.setAttribute("tabindex","0"),t.setAttribute("aria-controls",this.id),e||t.setAttribute("aria-expanded","false")})}_onKeyUp=e=>{"ESCAPE"===e.code.toUpperCase()&&this.close()};_onTouchMove=()=>!1}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.