@diplodoc/tabs-extension 3.10.6 → 3.10.7
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/build/plugin/index-node.js +86 -1
- package/build/plugin/index-node.js.map +4 -4
- package/build/plugin/index.js +86 -1
- package/build/plugin/index.js.map +4 -4
- package/build/plugin/utils/tabs.d.ts +2 -2
- package/build/runtime/TabsController.d.ts +3 -0
- package/build/runtime/index.js +1 -1
- package/build/runtime/index.js.map +4 -4
- package/build/tab-key.d.ts +22 -0
- package/package.json +2 -1
package/build/runtime/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var G="yfm-tabs",D="yfm-tab",h="yfm-tab-panel",Q="yfm-tab-list",d="active";var x="data-diplodoc-group",L="data-diplodoc-key",T="data-diplodoc-variant",U="data-diplodoc-id",W="defaultTabsGroup-";var F="data-diplodoc-forced";var w="yfm-tabs-dropdown-select";var E="yfm-tabs-vertical";var O=(g=>(g.Regular="regular",g.Radio="radio",g.Dropdown="dropdown",g.Accordion="accordion",g))(O||{}),v=Symbol.for("diplodocTabs");var B=n=>{let t=n.composedPath();return Array.isArray(t)&&t.length>0?t[0]:n.target},Z=n=>{let t=B(n);return!t||!t.matches},R=n=>Math.abs(n.scrollHeight-n.clientHeight)>1?n:n.parentElement?R(n.parentElement):void 0,H=(n,t)=>{let e=n.getBoundingClientRect(),o=t.getBoundingClientRect();return{top:e.top-o.top,left:e.left-o.left,scrollTop:t.scrollTop,scrollLeft:t.scrollLeft}};var m={TABS:`.${G}`,TAB_LIST:`.${Q}`,TAB:`.${D}`,TAB_PANEL:`.${h}`,VERTICAL_TABS:`.${E}`};function S(n){return n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function f(n,t,e){let o=n.querySelectorAll(`${m.TABS}[${x}="${S(t)}"]`),g=[];return o.forEach(c=>{c.querySelectorAll(m.TAB).forEach(i=>{i.getAttribute(L)===e&&g.push(i)})}),g}var y=class{constructor(t,e={}){this._onSelectTabHandlers=new Set;this._currentPageTabGroups=[];this._isRestoringTabs=!1;this._document=t,this._options=Object.assign({saveTabsToLocalStorage:!1,saveTabsToQueryStateMode:"none"},e),this._document.addEventListener("click",o=>{let g=B(o);if(o.target&&this.hideAllDropdown(o.target),Z(o))return;if(this.isElementDropdownSelect(g)){g.classList.toggle(d);return}if(!this.isValidTabElement(g))return;let c=this.getTabDataFromHTMLElement(g);c&&this._selectTab(c,g)}),this._document.addEventListener("keydown",o=>{let g=null;switch(o.key){case"ArrowLeft":{g="left";break}case"ArrowRight":{g="right";break}case"ArrowUp":{g="left";break}case"ArrowDown":{g="right";break}}if(!g)return;let c=B(o);if(Z(o)||!this.isValidTabElement(c))return;let{tabs:i,nodes:I}=this.getTabs(c),a=this.getTabDataFromHTMLElement(c),r=i.findIndex(({key:A})=>(a==null?void 0:a.key)&&A===a.key);if(!a||i.length<=1||r===-1)return;let s=(r+(g==="left"?-1:1)+i.length)%i.length;this.selectTab(i[s]),I[s].focus()})}configure(t){this._options=Object.assign(this._options,t)}onSelectTab(t){return this._onSelectTabHandlers.add(t),()=>{this._onSelectTabHandlers.delete(t)}}selectTabById(t,e){let o=this._document.querySelector(`${m.TAB}[${U}="${t}"]`);if(!o||!this.isValidTabElement(o))return;let g=this.getTabDataFromHTMLElement(o);g&&this._selectTab(g,o),e!=null&&e.scrollToElement&&o.scrollIntoView()}selectTab(t){this._selectTab(t)}restoreTabs(t){this._isRestoringTabs=!0;try{for(let[e,o]of Object.entries(t))if(e){let g={group:e,...o};this.selectTab(g)}}finally{this._isRestoringTabs=!1}}getTabsFromLocalStorage(){return JSON.parse(localStorage.getItem("tabsHistory")||"{}")}getTabsFromSearchQuery(){let t={},e=new URLSearchParams(window.location.search);return e.has("tabs")&&(e.get("tabs")||"").split(",").forEach(c=>{let i=c.split("_"),[I,a]=i,r="regular";if(i.length===3&&(r=i[2]),I&&a&&Object.values(O).includes(r)){let s=a;t[I]={key:s,variant:r}}}),t}updateLocalStorageWithTabs(t){this._options.saveTabsToLocalStorage&&(this._isRestoringTabs||localStorage.setItem("tabsHistory",JSON.stringify(t)))}updateQueryParamWithTabs(t){if(this._isRestoringTabs)return;let e=new URLSearchParams(window.location.search),o=Object.entries(t).map(([i,{key:I,variant:a}])=>a==="regular"?`${i}_${I}`:`${i}_${I}_${a}`);o.length>0?e.set("tabs",o.join(",")):e.delete("tabs");let g=history.state||{},c=new URL(window.location.href);c.search=e.toString(),window.history.replaceState({...g},document.title,c.href)}getCurrentPageTabHistory(t){return Object.fromEntries(Object.entries(t).filter(([e])=>this._currentPageTabGroups.includes(e)))}onPageChanged(){this._currentPageTabGroups=this.getCurrentPageTabGroups()}getCurrentPageTabGroups(){let t=this._document.getElementsByClassName(G),e=new Set;return Array.from(t).forEach(o=>{let g=o.getAttribute(x);g&&e.add(g)}),Array.from(e)}clearTabsPreferred(){localStorage.removeItem("tabsHistory"),this.updateQueryParamWithTabs({})}_selectTab(t,e){let{group:o,key:g,variant:c}=t;if(!o)return;this.saveTabPreferred({group:o,key:g,variant:c});let i=e&&R(e),I=i&&H(e,i);this.updateHTML({group:o,key:g,variant:c},e,c)>0&&(this.fireSelectTabEvent({group:o,key:g,variant:c},e==null?void 0:e.dataset.diplodocId),I&&this.resetScroll(e,i,I))}updateHTML(t,e,o){switch(o){case"radio":return this.updateHTMLRadio(t,e);case"accordion":return this.updateHTMLAccordion(t,e);case"regular":return this.updateHTMLRegular(t);case"dropdown":return this.updateHTMLDropdown(t);default:return 0}}saveTabPreferred(t){let e={};switch(this._options.saveTabsToLocalStorage&&(e=JSON.parse(localStorage.getItem("tabsHistory")||"{}")),e[t.group]={key:t.key,variant:t.variant},this._options.saveTabsToLocalStorage&&this.updateLocalStorageWithTabs(e),this._options.saveTabsToQueryStateMode){case"all":{this.updateQueryParamWithTabs(e);break}case"page":{this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(e));break}}}updateHTMLRadio(t,e){let{group:o,key:g}=t,{isForced:c,root:i}=this.didTabOpenForce(e),I=f(this._document,o,g);c&&(I=I.filter(r=>r.getAttribute(F)==="true")),c&&(i==null||i.removeAttribute(F));let a=0;return I.forEach(r=>{let A=r.parentNode.children;for(let C=0;C<A.length;C+=2){let[b,l]=[A.item(C),A.item(C+1)],p=b.children.item(0);if(b===r){p.checked?(b.classList.remove("active"),l==null||l.classList.remove("active"),p.removeAttribute("checked")):(b.classList.add("active"),l==null||l.classList.add("active"),p.setAttribute("checked","true"));continue}p.hasAttribute("checked")&&(b.classList.remove("active"),l==null||l.classList.remove("active"),p.removeAttribute("checked")),a++}}),a}updateHTMLRegular(t){let{group:e,key:o}=t,g=f(this._document,e,o),c=0;return g.forEach(i=>{let I=i;if(!this.isValidTabElement(I)||I.dataset.diplodocIsActive==="true")return;c++;let a=i,r=a.parentNode,s=r==null?void 0:r.parentNode,A=Array.from((r==null?void 0:r.querySelectorAll(m.TAB))||[]),C=Array.from((s==null?void 0:s.children)||[]).filter(l=>l.classList.contains(h)),b=A.indexOf(a);A.forEach((l,p)=>{let X=C[p],u=p===b,N=l;N.dataset.diplodocIsActive=u?"true":"false",l.classList.toggle(d,u),l.setAttribute("aria-selected",u.toString()),l.setAttribute("tabindex",u?"0":"-1"),X.classList.toggle(d,u)})}),c}updateHTMLDropdown(t){let{group:e,key:o}=t,g=f(this._document,e,o),c=0;return g.forEach(i=>{let I=i.closest(`[${T}=dropdown]`);if(!(I!=null&&I.children))return;let a=I.children.item(0),r=I.children.item(1);a==null||a.classList.remove(d);let s=Array.from((r==null?void 0:r.children)||[]).indexOf(i)+2;for(let A=2;A<I.children.length;A++){let C=I.children.item(A),b=r==null?void 0:r.children.item(A-2);if(c++,s===A){C==null||C.classList.add(d),b.classList.add(d),a.innerHTML=i.innerHTML,a.classList.add("filled");continue}b.classList.remove(d),C.classList.remove(d)}}),c}updateHTMLAccordion(t,e){let{group:o,key:g}=t,c=f(this._document,o,g),i=0;return c.forEach(I=>{let a=I.closest(`[${T}=accordion]`);if(a!=null&&a.children)for(let r=0;r<a.children.length;r+=2){let s=a.children.item(r),A=a.children.item(r+1);if(i++,I===s){s==null||s.classList.toggle(d),A==null||A.classList.toggle(d);continue}s==null||s.classList.remove(d),A==null||A.classList.remove(d)}}),e&&!this.checkVisible(e)&&setTimeout(()=>{e.scrollIntoView({block:"nearest"})}),i}checkVisible(t){let e=t.getBoundingClientRect(),o=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-o>=0)}hideAllDropdown(t){this._document.querySelectorAll(".yfm-tabs-dropdown-select.active").forEach(o=>{o.contains(t)||o.classList.remove(d)})}resetScroll(t,e,o){let g=H(t,e),c=g.top-o.top,i=g.left-o.left,I=g.scrollTop-o.scrollTop,a=g.scrollLeft-o.scrollLeft;e.scrollTo(e.scrollLeft+i-a,e.scrollTop+c-I)}didTabOpenForce(t){if(!t)return{};if(t.dataset.diplodocForced)return{root:t,isForced:!0};let e=t.dataset.diplodocVerticalTab?t:t.parentElement,o=typeof(e==null?void 0:e.dataset.diplodocForced)!="undefined";return{root:e,isForced:o}}fireSelectTabEvent(t,e){let{group:o,key:g,variant:c}=t,i=o.startsWith(W)?{key:g,variant:c}:t;this._onSelectTabHandlers.forEach(I=>{I({tab:i,currentTabId:e})})}getTabsType(t){let e=t.closest(`[${T}]`);if(e)return e.dataset.diplodocVariant}isValidTabElement(t){return!!this.getTabsType(t)}isElementDropdownSelect(t){return t.classList.contains(w)}getTabDataFromHTMLElement(t){var c,i,I;let e=this.getTabsType(t);if(e==="radio"){let a=t.dataset.diplodocVerticalTab?t:t.parentElement,r=a.dataset.diplodocKey,s=(c=a.closest(m.TABS))==null?void 0:c.dataset.diplodocGroup;return r&&s?{group:s,key:r,variant:"radio"}:null}if(e==="dropdown"||e==="accordion"){let a=t.dataset.diplodocKey,r=(i=t.closest(m.TABS))==null?void 0:i.dataset.diplodocGroup;return a&&r?{group:r,key:a,variant:e}:null}let o=t.dataset.diplodocKey,g=(I=t.closest(m.TABS))==null?void 0:I.dataset.diplodocGroup;return o&&g?{group:g,key:o,variant:"regular"}:null}getTabs(t){var c,i;let e=(c=t.closest(m.TABS))==null?void 0:c.dataset.diplodocGroup,o=(i=t.closest(m.TAB_LIST))==null?void 0:i.querySelectorAll(m.TAB),g=[];return o.forEach(I=>{let a=I==null?void 0:I.dataset.diplodocKey;a&&g.push({group:e,key:a,variant:"regular"})}),{tabs:g,nodes:o}}};typeof window!="undefined"&&typeof document!="undefined"&&!window[v]&&(window[v]=new y(document));})();
|
|
1
|
+
"use strict";(()=>{var $=Object.create;var N=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var tt=Object.getOwnPropertyNames;var et=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var it=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports);var at=(n,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of tt(t))!ot.call(n,o)&&o!==e&&N(n,o,{get:()=>t[o],enumerable:!(i=q(t,o))||i.enumerable});return n};var rt=(n,t,e)=>(e=n!=null?$(et(n)):{},at(t||!n||!n.__esModule?N(e,"default",{value:n,enumerable:!0}):e,n));var j=it((U,D)=>{"use strict";(function(n,t,e){typeof U=="object"?(D.exports=e(),D.exports.default=e()):typeof define=="function"&&define.amd?define(e):t[n]=e()})("slugify",U,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","\xA2":"cent","\xA3":"pound","\xA4":"currency","\xA5":"yen","\xA9":"(c)","\xAA":"a","\xAE":"(r)","\xBA":"o","\xC0":"A","\xC1":"A","\xC2":"A","\xC3":"A","\xC4":"A","\xC5":"A","\xC6":"AE","\xC7":"C","\xC8":"E","\xC9":"E","\xCA":"E","\xCB":"E","\xCC":"I","\xCD":"I","\xCE":"I","\xCF":"I","\xD0":"D","\xD1":"N","\xD2":"O","\xD3":"O","\xD4":"O","\xD5":"O","\xD6":"O","\xD8":"O","\xD9":"U","\xDA":"U","\xDB":"U","\xDC":"U","\xDD":"Y","\xDE":"TH","\xDF":"ss","\xE0":"a","\xE1":"a","\xE2":"a","\xE3":"a","\xE4":"a","\xE5":"a","\xE6":"ae","\xE7":"c","\xE8":"e","\xE9":"e","\xEA":"e","\xEB":"e","\xEC":"i","\xED":"i","\xEE":"i","\xEF":"i","\xF0":"d","\xF1":"n","\xF2":"o","\xF3":"o","\xF4":"o","\xF5":"o","\xF6":"o","\xF8":"o","\xF9":"u","\xFA":"u","\xFB":"u","\xFC":"u","\xFD":"y","\xFE":"th","\xFF":"y","\u0100":"A","\u0101":"a","\u0102":"A","\u0103":"a","\u0104":"A","\u0105":"a","\u0106":"C","\u0107":"c","\u010C":"C","\u010D":"c","\u010E":"D","\u010F":"d","\u0110":"DJ","\u0111":"dj","\u0112":"E","\u0113":"e","\u0116":"E","\u0117":"e","\u0118":"e","\u0119":"e","\u011A":"E","\u011B":"e","\u011E":"G","\u011F":"g","\u0122":"G","\u0123":"g","\u0128":"I","\u0129":"i","\u012A":"i","\u012B":"i","\u012E":"I","\u012F":"i","\u0130":"I","\u0131":"i","\u0136":"k","\u0137":"k","\u013B":"L","\u013C":"l","\u013D":"L","\u013E":"l","\u0141":"L","\u0142":"l","\u0143":"N","\u0144":"n","\u0145":"N","\u0146":"n","\u0147":"N","\u0148":"n","\u014C":"O","\u014D":"o","\u0150":"O","\u0151":"o","\u0152":"OE","\u0153":"oe","\u0154":"R","\u0155":"r","\u0158":"R","\u0159":"r","\u015A":"S","\u015B":"s","\u015E":"S","\u015F":"s","\u0160":"S","\u0161":"s","\u0162":"T","\u0163":"t","\u0164":"T","\u0165":"t","\u0168":"U","\u0169":"u","\u016A":"u","\u016B":"u","\u016E":"U","\u016F":"u","\u0170":"U","\u0171":"u","\u0172":"U","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017A":"z","\u017B":"Z","\u017C":"z","\u017D":"Z","\u017E":"z","\u018F":"E","\u0192":"f","\u01A0":"O","\u01A1":"o","\u01AF":"U","\u01B0":"u","\u01C8":"LJ","\u01C9":"lj","\u01CB":"NJ","\u01CC":"nj","\u0218":"S","\u0219":"s","\u021A":"T","\u021B":"t","\u0259":"e","\u02DA":"o","\u0386":"A","\u0388":"E","\u0389":"H","\u038A":"I","\u038C":"O","\u038E":"Y","\u038F":"W","\u0390":"i","\u0391":"A","\u0392":"B","\u0393":"G","\u0394":"D","\u0395":"E","\u0396":"Z","\u0397":"H","\u0398":"8","\u0399":"I","\u039A":"K","\u039B":"L","\u039C":"M","\u039D":"N","\u039E":"3","\u039F":"O","\u03A0":"P","\u03A1":"R","\u03A3":"S","\u03A4":"T","\u03A5":"Y","\u03A6":"F","\u03A7":"X","\u03A8":"PS","\u03A9":"W","\u03AA":"I","\u03AB":"Y","\u03AC":"a","\u03AD":"e","\u03AE":"h","\u03AF":"i","\u03B0":"y","\u03B1":"a","\u03B2":"b","\u03B3":"g","\u03B4":"d","\u03B5":"e","\u03B6":"z","\u03B7":"h","\u03B8":"8","\u03B9":"i","\u03BA":"k","\u03BB":"l","\u03BC":"m","\u03BD":"n","\u03BE":"3","\u03BF":"o","\u03C0":"p","\u03C1":"r","\u03C2":"s","\u03C3":"s","\u03C4":"t","\u03C5":"y","\u03C6":"f","\u03C7":"x","\u03C8":"ps","\u03C9":"w","\u03CA":"i","\u03CB":"y","\u03CC":"o","\u03CD":"y","\u03CE":"w","\u0401":"Yo","\u0402":"DJ","\u0404":"Ye","\u0406":"I","\u0407":"Yi","\u0408":"J","\u0409":"LJ","\u040A":"NJ","\u040B":"C","\u040F":"DZ","\u0410":"A","\u0411":"B","\u0412":"V","\u0413":"G","\u0414":"D","\u0415":"E","\u0416":"Zh","\u0417":"Z","\u0418":"I","\u0419":"J","\u041A":"K","\u041B":"L","\u041C":"M","\u041D":"N","\u041E":"O","\u041F":"P","\u0420":"R","\u0421":"S","\u0422":"T","\u0423":"U","\u0424":"F","\u0425":"H","\u0426":"C","\u0427":"Ch","\u0428":"Sh","\u0429":"Sh","\u042A":"U","\u042B":"Y","\u042C":"","\u042D":"E","\u042E":"Yu","\u042F":"Ya","\u0430":"a","\u0431":"b","\u0432":"v","\u0433":"g","\u0434":"d","\u0435":"e","\u0436":"zh","\u0437":"z","\u0438":"i","\u0439":"j","\u043A":"k","\u043B":"l","\u043C":"m","\u043D":"n","\u043E":"o","\u043F":"p","\u0440":"r","\u0441":"s","\u0442":"t","\u0443":"u","\u0444":"f","\u0445":"h","\u0446":"c","\u0447":"ch","\u0448":"sh","\u0449":"sh","\u044A":"u","\u044B":"y","\u044C":"","\u044D":"e","\u044E":"yu","\u044F":"ya","\u0451":"yo","\u0452":"dj","\u0454":"ye","\u0456":"i","\u0457":"yi","\u0458":"j","\u0459":"lj","\u045A":"nj","\u045B":"c","\u045D":"u","\u045F":"dz","\u0490":"G","\u0491":"g","\u0492":"GH","\u0493":"gh","\u049A":"KH","\u049B":"kh","\u04A2":"NG","\u04A3":"ng","\u04AE":"UE","\u04AF":"ue","\u04B0":"U","\u04B1":"u","\u04BA":"H","\u04BB":"h","\u04D8":"AE","\u04D9":"ae","\u04E8":"OE","\u04E9":"oe","\u0531":"A","\u0532":"B","\u0533":"G","\u0534":"D","\u0535":"E","\u0536":"Z","\u0537":"E'","\u0538":"Y'","\u0539":"T'","\u053A":"JH","\u053B":"I","\u053C":"L","\u053D":"X","\u053E":"C'","\u053F":"K","\u0540":"H","\u0541":"D'","\u0542":"GH","\u0543":"TW","\u0544":"M","\u0545":"Y","\u0546":"N","\u0547":"SH","\u0549":"CH","\u054A":"P","\u054B":"J","\u054C":"R'","\u054D":"S","\u054E":"V","\u054F":"T","\u0550":"R","\u0551":"C","\u0553":"P'","\u0554":"Q'","\u0555":"O''","\u0556":"F","\u0587":"EV","\u0621":"a","\u0622":"aa","\u0623":"a","\u0624":"u","\u0625":"i","\u0626":"e","\u0627":"a","\u0628":"b","\u0629":"h","\u062A":"t","\u062B":"th","\u062C":"j","\u062D":"h","\u062E":"kh","\u062F":"d","\u0630":"th","\u0631":"r","\u0632":"z","\u0633":"s","\u0634":"sh","\u0635":"s","\u0636":"dh","\u0637":"t","\u0638":"z","\u0639":"a","\u063A":"gh","\u0641":"f","\u0642":"q","\u0643":"k","\u0644":"l","\u0645":"m","\u0646":"n","\u0647":"h","\u0648":"w","\u0649":"a","\u064A":"y","\u064B":"an","\u064C":"on","\u064D":"en","\u064E":"a","\u064F":"u","\u0650":"e","\u0652":"","\u0660":"0","\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u067E":"p","\u0686":"ch","\u0698":"zh","\u06A9":"k","\u06AF":"g","\u06CC":"y","\u06F0":"0","\u06F1":"1","\u06F2":"2","\u06F3":"3","\u06F4":"4","\u06F5":"5","\u06F6":"6","\u06F7":"7","\u06F8":"8","\u06F9":"9","\u0E3F":"baht","\u10D0":"a","\u10D1":"b","\u10D2":"g","\u10D3":"d","\u10D4":"e","\u10D5":"v","\u10D6":"z","\u10D7":"t","\u10D8":"i","\u10D9":"k","\u10DA":"l","\u10DB":"m","\u10DC":"n","\u10DD":"o","\u10DE":"p","\u10DF":"zh","\u10E0":"r","\u10E1":"s","\u10E2":"t","\u10E3":"u","\u10E4":"f","\u10E5":"k","\u10E6":"gh","\u10E7":"q","\u10E8":"sh","\u10E9":"ch","\u10EA":"ts","\u10EB":"dz","\u10EC":"ts","\u10ED":"ch","\u10EE":"kh","\u10EF":"j","\u10F0":"h","\u1E62":"S","\u1E63":"s","\u1E80":"W","\u1E81":"w","\u1E82":"W","\u1E83":"w","\u1E84":"W","\u1E85":"w","\u1E9E":"SS","\u1EA0":"A","\u1EA1":"a","\u1EA2":"A","\u1EA3":"a","\u1EA4":"A","\u1EA5":"a","\u1EA6":"A","\u1EA7":"a","\u1EA8":"A","\u1EA9":"a","\u1EAA":"A","\u1EAB":"a","\u1EAC":"A","\u1EAD":"a","\u1EAE":"A","\u1EAF":"a","\u1EB0":"A","\u1EB1":"a","\u1EB2":"A","\u1EB3":"a","\u1EB4":"A","\u1EB5":"a","\u1EB6":"A","\u1EB7":"a","\u1EB8":"E","\u1EB9":"e","\u1EBA":"E","\u1EBB":"e","\u1EBC":"E","\u1EBD":"e","\u1EBE":"E","\u1EBF":"e","\u1EC0":"E","\u1EC1":"e","\u1EC2":"E","\u1EC3":"e","\u1EC4":"E","\u1EC5":"e","\u1EC6":"E","\u1EC7":"e","\u1EC8":"I","\u1EC9":"i","\u1ECA":"I","\u1ECB":"i","\u1ECC":"O","\u1ECD":"o","\u1ECE":"O","\u1ECF":"o","\u1ED0":"O","\u1ED1":"o","\u1ED2":"O","\u1ED3":"o","\u1ED4":"O","\u1ED5":"o","\u1ED6":"O","\u1ED7":"o","\u1ED8":"O","\u1ED9":"o","\u1EDA":"O","\u1EDB":"o","\u1EDC":"O","\u1EDD":"o","\u1EDE":"O","\u1EDF":"o","\u1EE0":"O","\u1EE1":"o","\u1EE2":"O","\u1EE3":"o","\u1EE4":"U","\u1EE5":"u","\u1EE6":"U","\u1EE7":"u","\u1EE8":"U","\u1EE9":"u","\u1EEA":"U","\u1EEB":"u","\u1EEC":"U","\u1EED":"u","\u1EEE":"U","\u1EEF":"u","\u1EF0":"U","\u1EF1":"u","\u1EF2":"Y","\u1EF3":"y","\u1EF4":"Y","\u1EF5":"y","\u1EF6":"Y","\u1EF7":"y","\u1EF8":"Y","\u1EF9":"y","\u2013":"-","\u2018":"'","\u2019":"'","\u201C":"\\"","\u201D":"\\"","\u201E":"\\"","\u2020":"+","\u2022":"*","\u2026":"...","\u20A0":"ecu","\u20A2":"cruzeiro","\u20A3":"french franc","\u20A4":"lira","\u20A5":"mill","\u20A6":"naira","\u20A7":"peseta","\u20A8":"rupee","\u20A9":"won","\u20AA":"new shequel","\u20AB":"dong","\u20AC":"euro","\u20AD":"kip","\u20AE":"tugrik","\u20AF":"drachma","\u20B0":"penny","\u20B1":"peso","\u20B2":"guarani","\u20B3":"austral","\u20B4":"hryvnia","\u20B5":"cedi","\u20B8":"kazakhstani tenge","\u20B9":"indian rupee","\u20BA":"turkish lira","\u20BD":"russian ruble","\u20BF":"bitcoin","\u2120":"sm","\u2122":"tm","\u2202":"d","\u2206":"delta","\u2211":"sum","\u221E":"infinity","\u2665":"love","\u5143":"yuan","\u5186":"yen","\uFDFC":"rial","\uFEF5":"laa","\uFEF7":"laa","\uFEF9":"lai","\uFEFB":"la"}`),t=JSON.parse('{"bg":{"\u0419":"Y","\u0426":"Ts","\u0429":"Sht","\u042A":"A","\u042C":"Y","\u0439":"y","\u0446":"ts","\u0449":"sht","\u044A":"a","\u044C":"y"},"de":{"\xC4":"AE","\xE4":"ae","\xD6":"OE","\xF6":"oe","\xDC":"UE","\xFC":"ue","\xDF":"ss","%":"prozent","&":"und","|":"oder","\u2211":"summe","\u221E":"unendlich","\u2665":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","\xA2":"centavos","\xA3":"libras","\xA4":"moneda","\u20A3":"francos","\u2211":"suma","\u221E":"infinito","\u2665":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","\xA2":"centime","\xA3":"livre","\xA4":"devise","\u20A3":"franc","\u2211":"somme","\u221E":"infini","\u2665":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","\xA2":"centavo","\u2211":"soma","\xA3":"libra","\u221E":"infinito","\u2665":"amor"},"uk":{"\u0418":"Y","\u0438":"y","\u0419":"Y","\u0439":"y","\u0426":"Ts","\u0446":"ts","\u0425":"Kh","\u0445":"kh","\u0429":"Shch","\u0449":"shch","\u0413":"H","\u0433":"h"},"vi":{"\u0110":"D","\u0111":"d"},"da":{"\xD8":"OE","\xF8":"oe","\xC5":"AA","\xE5":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"st\xF8rre end"},"nb":{"&":"og","\xC5":"AA","\xC6":"AE","\xD8":"OE","\xE5":"aa","\xE6":"ae","\xF8":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","\xC5":"AA","\xC4":"AE","\xD6":"OE","\xE5":"aa","\xE4":"ae","\xF6":"oe"}}');function e(i,o){if(typeof i!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var s=t[o.locale]||{},a=o.replacement===void 0?"-":o.replacement,r=o.trim===void 0?!0:o.trim,g=i.normalize().split("").reduce(function(c,I){var A=s[I];return A===void 0&&(A=n[I]),A===void 0&&(A=I),A===a&&(A=" "),c+A.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(g=g.replace(/[^A-Za-z0-9\s]/g,"")),r&&(g=g.trim()),g=g.replace(/\s+/g,a),o.lower&&(g=g.toLowerCase()),g}return e.extend=function(i){Object.assign(n,i)},e})});var R="yfm-tabs",W="yfm-tab",Z="yfm-tab-panel",V="yfm-tab-list",C="active";var h="data-diplodoc-group",B="data-diplodoc-key",T="data-diplodoc-variant",Y="data-diplodoc-id",M="defaultTabsGroup-";var E="data-diplodoc-forced";var k="yfm-tabs-dropdown-select";var J="yfm-tabs-vertical";var O=(o=>(o.Regular="regular",o.Radio="radio",o.Dropdown="dropdown",o.Accordion="accordion",o))(O||{}),H=Symbol.for("diplodocTabs");var S=rt(j()),z={lower:!0,strict:!0},gt=/^[\p{P}\s]$/u,st=new Set(["#"]);function nt(n){return Array.from(n).map(t=>{if((0,S.default)(t,z)||gt.test(t)&&!st.has(t))return t;let e=t.codePointAt(0);return typeof e=="number"?` u${e.toString(16)} `:t}).join("")}function _(n){let t=n.normalize("NFC").trim(),e=(0,S.default)(nt(t),z);return e||Array.from(t).map(i=>{var o;return`u${(o=i.codePointAt(0))==null?void 0:o.toString(16)}`}).join("-")}function f(n){try{return _(decodeURIComponent(n))}catch{return _(n)}}var x=n=>{let t=n.composedPath();return Array.isArray(t)&&t.length>0?t[0]:n.target},X=n=>{let t=x(n);return!t||!t.matches},L=n=>Math.abs(n.scrollHeight-n.clientHeight)>1?n:n.parentElement?L(n.parentElement):void 0,w=(n,t)=>{let e=n.getBoundingClientRect(),i=t.getBoundingClientRect();return{top:e.top-i.top,left:e.left-i.left,scrollTop:t.scrollTop,scrollLeft:t.scrollLeft}};var l={TABS:`.${R}`,TAB_LIST:`.${V}`,TAB:`.${W}`,TAB_PANEL:`.${Z}`,VERTICAL_TABS:`.${J}`};function Q(n){return n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function v(n,t,e){let i=n.querySelectorAll(`${l.TABS}[${h}="${Q(t)}"]`),o=[];return i.forEach(s=>{s.querySelectorAll(l.TAB).forEach(a=>{a.getAttribute(B)===e&&o.push(a)})}),o}function P(n,t,e,i){let o=n.querySelectorAll(`${l.TABS}[${h}="${Q(t)}"][${T}="${i}"]`);return Array.from(o).some(s=>Array.from(s.querySelectorAll(l.TAB)).some(a=>a.closest(l.TABS)===s&&a.getAttribute(B)===e))}var F=class{constructor(t,e={}){this._onSelectTabHandlers=new Set;this._currentPageTabGroups=[];this._isRestoringTabs=!1;this._defaultTabKeys=new WeakMap;this._document=t,this._options=Object.assign({saveTabsToLocalStorage:!1,saveTabsToQueryStateMode:"none"},e),this._document.addEventListener("click",i=>{let o=x(i);if(i.target&&this.hideAllDropdown(i.target),X(i))return;if(this.isElementDropdownSelect(o)){o.classList.toggle(C);return}if(!this.isValidTabElement(o))return;let s=this.getTabDataFromHTMLElement(o);s&&this._selectTab(s,o)}),this._document.addEventListener("keydown",i=>{let o=null;switch(i.key){case"ArrowLeft":{o="left";break}case"ArrowRight":{o="right";break}case"ArrowUp":{o="left";break}case"ArrowDown":{o="right";break}}if(!o)return;let s=x(i);if(X(i)||!this.isValidTabElement(s))return;let{tabs:a,nodes:r}=this.getTabs(s),g=this.getTabDataFromHTMLElement(s),c=a.findIndex(({key:A})=>(g==null?void 0:g.key)&&A===g.key);if(!g||a.length<=1||c===-1)return;let I=(c+(o==="left"?-1:1)+a.length)%a.length;this.selectTab(a[I]),r[I].focus()}),this.rememberDefaultTabs()}configure(t){this._options=Object.assign(this._options,t)}onSelectTab(t){return this._onSelectTabHandlers.add(t),()=>{this._onSelectTabHandlers.delete(t)}}selectTabById(t,e){let i=this._document.querySelector(`${l.TAB}[${Y}="${t}"]`);if(!i||!this.isValidTabElement(i))return;let o=this.getTabDataFromHTMLElement(i);o&&this._selectTab(o,i),e!=null&&e.scrollToElement&&i.scrollIntoView()}selectTab(t){this._selectTab(t)}restoreTabs(t){this._isRestoringTabs=!0;try{for(let[e,i]of Object.entries(t))if(e){let o={group:e,...i,key:f(i.key)};this.selectTab(o)}}finally{this._isRestoringTabs=!1}}getTabsFromLocalStorage(){return JSON.parse(localStorage.getItem("tabsHistory")||"{}")}getTabsFromSearchQuery(){let t={},e=new URLSearchParams(window.location.search);if(e.has("tabs")){let o=(e.get("tabs")||"").split(","),s=this.getCurrentPageTabGroups().sort((a,r)=>r.length-a.length);o.forEach(a=>{let r=s.find(d=>a.startsWith(`${d}_`));if(r){let d=a.slice(r.length+1),u=Object.values(O).filter(p=>p!=="regular"),b=f(d),m=P(this._document,r,b,"regular")?void 0:u.find(p=>{let G=`_${p}`,K=d.slice(0,-G.length);return d.endsWith(G)&&P(this._document,r,f(K),p)}),y=m?d.slice(0,-`_${m}`.length):d;y&&(t[r]={key:f(y),variant:m!=null?m:"regular"});return}let g=a.split("_"),[c,I]=g,A=g.length===3?g[2]:"regular";c&&I&&Object.values(O).includes(A)&&(t[c]={key:f(I),variant:A})})}return t}updateLocalStorageWithTabs(t){this._options.saveTabsToLocalStorage&&(this._isRestoringTabs||localStorage.setItem("tabsHistory",JSON.stringify(t)))}updateQueryParamWithTabs(t){if(this._isRestoringTabs)return;let e=new URLSearchParams(window.location.search),i=Object.entries(t).reduce((a,[r,{key:g,variant:c}])=>{let I=f(g);return this.isDefaultTab(r,I,c)||a.push(c==="regular"?`${r}_${I}`:`${r}_${I}_${c}`),a},[]);i.length>0?e.set("tabs",i.join(",")):e.delete("tabs");let o=history.state||{},s=new URL(window.location.href);s.search=e.toString(),window.history.replaceState({...o},document.title,s.href)}getCurrentPageTabHistory(t){return Object.fromEntries(Object.entries(t).filter(([e])=>this._currentPageTabGroups.includes(e)))}onPageChanged(){this.rememberDefaultTabs(),this._currentPageTabGroups=this.getCurrentPageTabGroups()}getCurrentPageTabGroups(){let t=this._document.getElementsByClassName(R),e=new Set;return Array.from(t).forEach(i=>{let o=i.getAttribute(h);o&&e.add(o)}),Array.from(e)}clearTabsPreferred(){localStorage.removeItem("tabsHistory"),this.updateQueryParamWithTabs({})}_selectTab(t,e){let{group:i,key:o,variant:s}=t;if(!i)return;this.saveTabPreferred({group:i,key:o,variant:s});let a=e&&L(e),r=a&&w(e,a);this.updateHTML({group:i,key:o,variant:s},e,s)>0&&(this.fireSelectTabEvent({group:i,key:o,variant:s},e==null?void 0:e.dataset.diplodocId),r&&this.resetScroll(e,a,r))}updateHTML(t,e,i){switch(i){case"radio":return this.updateHTMLRadio(t,e);case"accordion":return this.updateHTMLAccordion(t,e);case"regular":return this.updateHTMLRegular(t);case"dropdown":return this.updateHTMLDropdown(t);default:return 0}}saveTabPreferred(t){let e={};switch(this._options.saveTabsToLocalStorage&&(e=JSON.parse(localStorage.getItem("tabsHistory")||"{}")),e[t.group]={key:t.key,variant:t.variant},this._options.saveTabsToLocalStorage&&this.updateLocalStorageWithTabs(e),this._options.saveTabsToQueryStateMode){case"all":{this.updateQueryParamWithTabs(e);break}case"page":{this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(e));break}}}isDefaultTab(t,e,i){if(i!=="regular")return!1;this.rememberDefaultTabs();let s=Array.from(this._document.querySelectorAll(`${l.TABS}[${h}="${Q(t)}"][${T}="${i}"]`)).map(a=>Array.from(a.querySelectorAll(l.TAB)).filter(r=>r.closest(l.TABS)===a)).filter(a=>a.some(r=>r.getAttribute(B)===e));return s.length>0&&s.every(a=>{var g;let r=(g=a[0])==null?void 0:g.closest(l.TABS);return r?this._defaultTabKeys.get(r)===e:!1})}rememberDefaultTabs(){this._document.querySelectorAll(`${l.TABS}[${T}="regular"]`).forEach(e=>{var s,a;if(this._defaultTabKeys.has(e))return;let i=Array.from(e.querySelectorAll(l.TAB)).filter(r=>r.closest(l.TABS)===e),o=(s=i.find(r=>r.classList.contains(C)))!=null?s:i[0];this._defaultTabKeys.set(e,(a=o==null?void 0:o.getAttribute(B))!=null?a:null)})}updateHTMLRadio(t,e){let{group:i,key:o}=t,{isForced:s,root:a}=this.didTabOpenForce(e),r=v(this._document,i,o);s&&(r=r.filter(c=>c.getAttribute(E)==="true")),s&&(a==null||a.removeAttribute(E));let g=0;return r.forEach(c=>{let A=c.parentNode.children;for(let d=0;d<A.length;d+=2){let[u,b]=[A.item(d),A.item(d+1)],m=u.children.item(0);if(u===c){m.checked?(u.classList.remove("active"),b==null||b.classList.remove("active"),m.removeAttribute("checked")):(u.classList.add("active"),b==null||b.classList.add("active"),m.setAttribute("checked","true"));continue}m.hasAttribute("checked")&&(u.classList.remove("active"),b==null||b.classList.remove("active"),m.removeAttribute("checked")),g++}}),g}updateHTMLRegular(t){let{group:e,key:i}=t,o=v(this._document,e,i),s=0;return o.forEach(a=>{let r=a;if(!this.isValidTabElement(r)||r.dataset.diplodocIsActive==="true")return;s++;let g=a,c=g.parentNode,I=c==null?void 0:c.parentNode,A=Array.from((c==null?void 0:c.querySelectorAll(l.TAB))||[]),d=Array.from((I==null?void 0:I.children)||[]).filter(b=>b.classList.contains(Z)),u=A.indexOf(g);A.forEach((b,m)=>{let y=d[m],p=m===u,G=b;G.dataset.diplodocIsActive=p?"true":"false",b.classList.toggle(C,p),b.setAttribute("aria-selected",p.toString()),b.setAttribute("tabindex",p?"0":"-1"),y.classList.toggle(C,p)})}),s}updateHTMLDropdown(t){let{group:e,key:i}=t,o=v(this._document,e,i),s=0;return o.forEach(a=>{let r=a.closest(`[${T}=dropdown]`);if(!(r!=null&&r.children))return;let g=r.children.item(0),c=r.children.item(1);g==null||g.classList.remove(C);let I=Array.from((c==null?void 0:c.children)||[]).indexOf(a)+2;for(let A=2;A<r.children.length;A++){let d=r.children.item(A),u=c==null?void 0:c.children.item(A-2);if(s++,I===A){d==null||d.classList.add(C),u.classList.add(C),g.innerHTML=a.innerHTML,g.classList.add("filled");continue}u.classList.remove(C),d.classList.remove(C)}}),s}updateHTMLAccordion(t,e){let{group:i,key:o}=t,s=v(this._document,i,o),a=0;return s.forEach(r=>{let g=r.closest(`[${T}=accordion]`);if(g!=null&&g.children)for(let c=0;c<g.children.length;c+=2){let I=g.children.item(c),A=g.children.item(c+1);if(a++,r===I){I==null||I.classList.toggle(C),A==null||A.classList.toggle(C);continue}I==null||I.classList.remove(C),A==null||A.classList.remove(C)}}),e&&!this.checkVisible(e)&&setTimeout(()=>{e.scrollIntoView({block:"nearest"})}),a}checkVisible(t){let e=t.getBoundingClientRect(),i=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-i>=0)}hideAllDropdown(t){this._document.querySelectorAll(".yfm-tabs-dropdown-select.active").forEach(i=>{i.contains(t)||i.classList.remove(C)})}resetScroll(t,e,i){let o=w(t,e),s=o.top-i.top,a=o.left-i.left,r=o.scrollTop-i.scrollTop,g=o.scrollLeft-i.scrollLeft;e.scrollTo(e.scrollLeft+a-g,e.scrollTop+s-r)}didTabOpenForce(t){if(!t)return{};if(t.dataset.diplodocForced)return{root:t,isForced:!0};let e=t.dataset.diplodocVerticalTab?t:t.parentElement,i=typeof(e==null?void 0:e.dataset.diplodocForced)!="undefined";return{root:e,isForced:i}}fireSelectTabEvent(t,e){let{group:i,key:o,variant:s}=t,a=i.startsWith(M)?{key:o,variant:s}:t;this._onSelectTabHandlers.forEach(r=>{r({tab:a,currentTabId:e})})}getTabsType(t){let e=t.closest(`[${T}]`);if(e)return e.dataset.diplodocVariant}isValidTabElement(t){return!!this.getTabsType(t)}isElementDropdownSelect(t){return t.classList.contains(k)}getTabDataFromHTMLElement(t){var s,a,r;let e=this.getTabsType(t);if(e==="radio"){let g=t.dataset.diplodocVerticalTab?t:t.parentElement,c=g.dataset.diplodocKey,I=(s=g.closest(l.TABS))==null?void 0:s.dataset.diplodocGroup;return c&&I?{group:I,key:c,variant:"radio"}:null}if(e==="dropdown"||e==="accordion"){let g=t.dataset.diplodocKey,c=(a=t.closest(l.TABS))==null?void 0:a.dataset.diplodocGroup;return g&&c?{group:c,key:g,variant:e}:null}let i=t.dataset.diplodocKey,o=(r=t.closest(l.TABS))==null?void 0:r.dataset.diplodocGroup;return i&&o?{group:o,key:i,variant:"regular"}:null}getTabs(t){var s,a;let e=(s=t.closest(l.TABS))==null?void 0:s.dataset.diplodocGroup,i=(a=t.closest(l.TAB_LIST))==null?void 0:a.querySelectorAll(l.TAB),o=[];return i.forEach(r=>{let g=r==null?void 0:r.dataset.diplodocKey;g&&o.push({group:e,key:g,variant:"regular"})}),{tabs:o,nodes:i}}};typeof window!="undefined"&&typeof document!="undefined"&&!window[H]&&(window[H]=new F(document));})();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/common.ts", "../../src/runtime/utils.ts", "../../src/runtime/TabsController.ts", "../../src/runtime/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared constants, types and globals for the tabs extension.\n * Used by both the MarkdownIt plugin (compile-time) and the runtime controller (DOM).\n */\nimport {type TabsController} from './runtime/TabsController';\n\n/** Regex to match the opening `{% list tabs ... %}` tag (optionally backtick-escaped). */\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\n\n/** CSS class names for tab structure. */\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\n\n/** Data attributes used by the runtime to identify groups, keys, variants and active state. */\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\n/** Dropdown variant: container, menu and select element class names. */\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\n/** Accordion variant. */\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\n/** Radio (vertical) variant. */\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\n/** Available tab block variants (regular horizontal, radio, dropdown, accordion). */\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\n/** Which variants are enabled in the plugin (others fall back to Regular). */\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\n/** Identifies a tab: group id, tab key (from content), and variant. */\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\n/** Payload passed to onSelectTab handlers when a tab is switched. */\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\n/** Symbol under which the global TabsController instance is stored on `window`. */\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "/**\n * Event target considering shadow DOM (composedPath()[0] or fallback to target).\n * @param event - DOM event\n * @returns Target element\n */\nexport const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\n/**\n * True if the event target is a custom element (or missing), so we skip tab handling.\n * @param event - DOM event\n * @returns Whether to ignore\n */\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\n/**\n * Nearest ancestor (or self) that has overflow scroll. Used to preserve scroll when switching tabs.\n * @param element - Starting element\n * @returns Scrollable parent or undefined\n */\nexport const getClosestScrollableParent = (element: HTMLElement): HTMLElement | undefined => {\n if (Math.abs(element.scrollHeight - element.clientHeight) > 1) {\n return element;\n }\n\n return element.parentElement ? getClosestScrollableParent(element.parentElement) : undefined;\n};\n\n/** Position and scroll values used to restore scroll after tab switch. */\nexport interface ElementOffset {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n}\n\n/**\n * Offset of element relative to scrollable parent and parent's scroll position.\n * @param element - Child element\n * @param scrollableParent - Scroll container\n * @returns Offset and scroll values\n */\nexport const getOffsetByScrollableParent = (\n element: HTMLElement,\n scrollableParent: HTMLElement,\n): ElementOffset => {\n const elementBounds = element.getBoundingClientRect();\n const scrollableParentBounds = scrollableParent.getBoundingClientRect();\n return {\n top: elementBounds.top - scrollableParentBounds.top,\n left: elementBounds.left - scrollableParentBounds.left,\n scrollTop: scrollableParent.scrollTop,\n scrollLeft: scrollableParent.scrollLeft,\n };\n};\n", "import type {SelectedTabEvent, Tab} from '../common';\nimport type {ElementOffset} from './utils';\n\nimport {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n TABS_CLASSNAME,\n TABS_DROPDOWN_SELECT,\n TABS_LIST_CLASSNAME,\n TABS_RADIO_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_DATA_VARIANT,\n TAB_FORCED_OPEN,\n TAB_PANEL_CLASSNAME,\n TabsVariants,\n} from '../common';\n\nimport {\n getClosestScrollableParent,\n getEventTarget,\n getOffsetByScrollableParent,\n isCustom,\n} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n VERTICAL_TABS: `.${TABS_RADIO_CLASSNAME}`,\n};\n\n/**\n * Escape value for use in a CSS attribute selector (e.g. group id).\n * @param value - Raw attribute value.\n * @returns Escaped string safe for use inside [attr=\"...\"].\n */\nfunction escapeCssAttrValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Find tab elements by group and key without putting key in a selector (keys may contain %, spaces, etc.).\n * @param doc - Document to query.\n * @param group - Group id.\n * @param key - Tab key (data-tabs-key value).\n * @returns Matching tab elements.\n */\nfunction findTabsByGroupAndKey(doc: Document, group: string, key: string): Element[] {\n const containers = doc.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]`,\n );\n const result: Element[] = [];\n containers.forEach((container) => {\n container.querySelectorAll(Selector.TAB).forEach((tab) => {\n if (tab.getAttribute(TAB_DATA_KEY) === key) {\n result.push(tab);\n }\n });\n });\n return result;\n}\n\n/** Options for selectTabById (e.g. scroll the selected tab into view). */\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\ntype Handler = (data: SelectedTabEvent) => void;\n\ntype TabSwitchDirection = 'left' | 'right';\n\n/** Persisted tab state: group id -> { key, variant }. Used for localStorage and URL. */\nexport type TabsHistory = Record<string, {key: string; variant: TabsVariants}>;\n\n/** Controller options: whether to persist selection to localStorage and/or URL query. */\nexport type TabsControllerOptions = {\n saveTabsToLocalStorage: boolean;\n saveTabsToQueryStateMode: 'all' | 'page' | 'none';\n};\n\n/**\n * DOM controller for tab blocks: click/keyboard handling, active state, persistence (localStorage\n * and URL), and events. One instance per document; registered on window[GLOBAL_SYMBOL].\n */\nexport class TabsController {\n private _document: Document;\n private _onSelectTabHandlers: Set<Handler> = new Set();\n private _options: TabsControllerOptions;\n private _currentPageTabGroups: string[] = [];\n private _isRestoringTabs = false;\n\n // TODO: remove side effects from constructor\n constructor(document: Document, options: Partial<TabsControllerOptions> = {}) {\n this._document = document;\n this._options = Object.assign(\n {\n saveTabsToLocalStorage: false,\n saveTabsToQueryStateMode: 'none',\n },\n options,\n );\n\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (event.target) {\n this.hideAllDropdown(event.target as HTMLElement);\n }\n\n if (isCustom(event)) {\n return;\n }\n\n if (this.isElementDropdownSelect(target)) {\n target.classList.toggle(ACTIVE_CLASSNAME);\n\n return;\n }\n\n if (!this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n\n this._document.addEventListener('keydown', (event) => {\n let direction: TabSwitchDirection | null = null;\n switch (event.key) {\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowUp': {\n direction = 'left';\n break;\n }\n case 'ArrowDown': {\n direction = 'right';\n break;\n }\n }\n if (!direction) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const {tabs, nodes} = this.getTabs(target);\n const currentTab = this.getTabDataFromHTMLElement(target);\n const currentTabIndex = tabs.findIndex(\n ({key}) => currentTab?.key && key === currentTab.key,\n );\n if (!currentTab || tabs.length <= 1 || currentTabIndex === -1) {\n return;\n }\n\n const newIndex =\n (currentTabIndex + (direction === 'left' ? -1 : 1) + tabs.length) % tabs.length;\n\n this.selectTab(tabs[newIndex]);\n nodes[newIndex].focus();\n });\n }\n\n /**\n * Update controller options (e.g. enable persistence after init).\n * @param options - Partial options to merge\n * @returns void\n */\n configure(options: Partial<TabsControllerOptions>) {\n this._options = Object.assign(this._options, options);\n }\n\n /**\n * Subscribe to tab switch events.\n * @param handler - Callback on tab switch\n * @returns Unsubscribe function\n */\n onSelectTab(handler: Handler) {\n this._onSelectTabHandlers.add(handler);\n\n return () => {\n this._onSelectTabHandlers.delete(handler);\n };\n }\n\n /**\n * Select tab by data-diplodoc-id and optionally scroll it into view.\n * @param id - data-diplodoc-id value\n * @param options - e.g. scrollToElement\n * @returns void\n */\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n /**\n * Programmatically select a tab by { group, key, variant }.\n * @param tab - Tab descriptor\n * @returns void\n */\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n /**\n * Apply saved state: select each tab in tabsHistory (e.g. after navigation).\n * @param tabsHistory - Group -> { key, variant } map\n * @returns void\n */\n restoreTabs(tabsHistory: TabsHistory) {\n this._isRestoringTabs = true;\n try {\n for (const [group, fields] of Object.entries(tabsHistory)) {\n if (group) {\n const tab = {group, ...fields};\n this.selectTab(tab);\n }\n }\n } finally {\n this._isRestoringTabs = false;\n }\n }\n\n /**\n * Read persisted tab state from localStorage (key: tabsHistory).\n * @returns Parsed TabsHistory\n */\n getTabsFromLocalStorage(): TabsHistory {\n return JSON.parse(localStorage.getItem('tabsHistory') || '{}') as TabsHistory;\n }\n\n /**\n * Parse tab state from URL search params (tabs=group_key or group_key_variant).\n * @returns Parsed TabsHistory\n */\n getTabsFromSearchQuery(): TabsHistory {\n const tabsHistory = {} as TabsHistory;\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('tabs')) {\n const tabsFromQuery = urlParams.get('tabs') || '';\n const tabConfigs = tabsFromQuery.split(',');\n\n tabConfigs.forEach((config) => {\n const splitConfig = config.split('_');\n const [group, key] = splitConfig;\n let variant = TabsVariants.Regular;\n if (splitConfig.length === 3) {\n variant = splitConfig[2] as TabsVariants;\n }\n\n if (group && key && Object.values(TabsVariants).includes(variant)) {\n const keyWithSpaces = key;\n tabsHistory[group] = {key: keyWithSpaces, variant: variant};\n }\n });\n }\n\n return tabsHistory;\n }\n\n updateLocalStorageWithTabs(tabsHistory: TabsHistory) {\n if (!this._options.saveTabsToLocalStorage) {\n return;\n }\n\n // Don't update localStorage if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n localStorage.setItem('tabsHistory', JSON.stringify(tabsHistory));\n }\n\n updateQueryParamWithTabs(tabsHistory: TabsHistory) {\n // Don't update URL if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const tabsArray = Object.entries(tabsHistory).map(([group, {key, variant}]) => {\n if (variant === TabsVariants.Regular) {\n return `${group}_${key}`;\n }\n return `${group}_${key}_${variant}`;\n });\n\n // Clear or set tabs parameter\n if (tabsArray.length > 0) {\n urlParams.set('tabs', tabsArray.join(','));\n } else {\n urlParams.delete('tabs');\n }\n\n // Preserve existing state\n const currentState = history.state || {};\n\n // Use URL constructor for proper URL handling\n const url = new URL(window.location.href);\n url.search = urlParams.toString();\n\n window.history.replaceState({...currentState}, document.title, url.href);\n }\n\n /**\n * Filter tabsHistory to only groups present on the current page.\n * @param tabsHistory - Full history\n * @returns Filtered TabsHistory\n */\n getCurrentPageTabHistory(tabsHistory: TabsHistory): TabsHistory {\n return Object.fromEntries(\n Object.entries(tabsHistory).filter(([group]) =>\n this._currentPageTabGroups.includes(group),\n ),\n );\n }\n\n /**\n * Call after route/page change so persistence uses only groups on the current page.\n * @returns void\n */\n onPageChanged(): void {\n this._currentPageTabGroups = this.getCurrentPageTabGroups();\n }\n\n /**\n * List of tab group ids found in the document.\n * @returns Array of group ids\n */\n getCurrentPageTabGroups(): string[] {\n const tabs = this._document.getElementsByClassName(TABS_CLASSNAME);\n const groups = new Set<string>();\n\n Array.from(tabs).forEach((tab) => {\n const group = tab.getAttribute(GROUP_DATA_KEY);\n if (group) {\n groups.add(group);\n }\n });\n\n return Array.from(groups);\n }\n\n /**\n * Clear saved tab state from localStorage and URL.\n * @returns void\n */\n clearTabsPreferred(): void {\n localStorage.removeItem('tabsHistory');\n this.updateQueryParamWithTabs({});\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key, variant} = tab;\n\n if (!group) {\n return;\n }\n\n this.saveTabPreferred({group, key, variant});\n\n const scrollableParent = targetTab && getClosestScrollableParent(targetTab);\n const previousTargetOffset =\n scrollableParent && getOffsetByScrollableParent(targetTab, scrollableParent);\n\n const updatedTabs = this.updateHTML({group, key, variant}, targetTab, variant);\n\n if (updatedTabs > 0) {\n this.fireSelectTabEvent({group, key, variant}, targetTab?.dataset.diplodocId);\n\n if (previousTargetOffset) {\n this.resetScroll(targetTab, scrollableParent, previousTargetOffset);\n }\n }\n }\n\n private updateHTML(tab: Required<Tab>, target: HTMLElement | undefined, variant: TabsVariants) {\n switch (variant) {\n case TabsVariants.Radio: {\n return this.updateHTMLRadio(tab, target);\n }\n case TabsVariants.Accordion: {\n return this.updateHTMLAccordion(tab, target);\n }\n case TabsVariants.Regular: {\n return this.updateHTMLRegular(tab);\n }\n case TabsVariants.Dropdown: {\n return this.updateHTMLDropdown(tab);\n }\n default: {\n return 0;\n }\n }\n }\n\n private saveTabPreferred(tab: Required<Tab>) {\n let tabsHistory = {} as TabsHistory;\n\n if (this._options.saveTabsToLocalStorage) {\n tabsHistory = JSON.parse(localStorage.getItem('tabsHistory') || '{}');\n }\n\n tabsHistory[tab.group] = {key: tab.key, variant: tab.variant};\n\n if (this._options.saveTabsToLocalStorage) {\n this.updateLocalStorageWithTabs(tabsHistory);\n }\n\n switch (this._options.saveTabsToQueryStateMode) {\n case 'all': {\n this.updateQueryParamWithTabs(tabsHistory);\n break;\n }\n case 'page': {\n this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(tabsHistory));\n break;\n }\n }\n }\n\n private updateHTMLRadio(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const {isForced, root} = this.didTabOpenForce(target);\n\n let tabs = findTabsByGroupAndKey(this._document, group, key);\n if (isForced) {\n tabs = tabs.filter(\n (el) => (el as HTMLElement).getAttribute(TAB_FORCED_OPEN) === 'true',\n );\n }\n\n if (isForced) {\n root?.removeAttribute(TAB_FORCED_OPEN);\n }\n\n let updated = 0;\n\n tabs.forEach((tab) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const root = tab.parentNode!;\n const elements = root.children;\n\n for (let i = 0; i < elements.length; i += 2) {\n const [title, content] = [elements.item(i), elements.item(i + 1)] as HTMLElement[];\n\n const input = title.children.item(0) as HTMLInputElement;\n\n if (title === tab) {\n const checked = input.checked;\n\n if (checked) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n } else {\n title.classList.add('active');\n content?.classList.add('active');\n\n input.setAttribute('checked', 'true');\n }\n\n continue;\n }\n\n if (input.hasAttribute('checked')) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n }\n\n updated++;\n }\n });\n\n return updated;\n }\n\n private updateHTMLRegular(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let updated = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || htmlElem.dataset.diplodocIsActive === 'true') {\n return;\n }\n\n updated++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabList?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.children || []).filter((node) =>\n node.classList.contains(TAB_PANEL_CLASSNAME),\n );\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n const htmlElem = tab as HTMLElement;\n\n htmlElem.dataset.diplodocIsActive = isTargetTab ? 'true' : 'false';\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n return updated;\n }\n\n private updateHTMLDropdown(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const dropdown = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Dropdown}]`);\n\n if (!dropdown?.children) {\n return;\n }\n\n const select = dropdown.children.item(0) as HTMLElement;\n const menu = dropdown.children.item(1);\n\n select?.classList.remove(ACTIVE_CLASSNAME);\n\n /* first and second elements are select / menu, skipping them */\n const changedIndex = Array.from(menu?.children || []).indexOf(tab) + 2;\n\n for (let i = 2; i < dropdown.children.length; i++) {\n const item = dropdown.children.item(i) as HTMLElement;\n const menuItem = menu?.children.item(i - 2) as HTMLElement;\n\n changed++;\n\n if (changedIndex === i) {\n item?.classList.add(ACTIVE_CLASSNAME);\n menuItem.classList.add(ACTIVE_CLASSNAME);\n\n select.innerHTML = tab.innerHTML;\n select.classList.add('filled');\n\n continue;\n }\n\n menuItem.classList.remove(ACTIVE_CLASSNAME);\n item.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n return changed;\n }\n\n private updateHTMLAccordion(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const accordion = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Accordion}]`);\n\n if (!accordion?.children) {\n return;\n }\n\n for (let i = 0; i < accordion.children.length; i += 2) {\n const title = accordion.children.item(i);\n const currentTab = accordion.children.item(i + 1);\n\n changed++;\n\n if (tab === title) {\n title?.classList.toggle(ACTIVE_CLASSNAME);\n currentTab?.classList.toggle(ACTIVE_CLASSNAME);\n\n continue;\n }\n\n title?.classList.remove(ACTIVE_CLASSNAME);\n currentTab?.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n if (target && !this.checkVisible(target)) {\n setTimeout(() => {\n target.scrollIntoView({block: 'nearest'});\n });\n }\n\n return changed;\n }\n\n private checkVisible(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n }\n\n private hideAllDropdown(target: HTMLElement) {\n const dropdowns = this._document.querySelectorAll('.yfm-tabs-dropdown-select.active');\n\n dropdowns.forEach((menu) => {\n if (!menu.contains(target)) {\n menu.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n }\n\n private resetScroll(\n target: HTMLElement,\n scrollableParent: HTMLElement,\n previousTargetOffset: ElementOffset,\n ) {\n const targetOffset = getOffsetByScrollableParent(target, scrollableParent);\n const topDelta = targetOffset.top - previousTargetOffset.top;\n const leftDelta = targetOffset.left - previousTargetOffset.left;\n const scrollTopDelta = targetOffset.scrollTop - previousTargetOffset.scrollTop;\n const scrollLeftDelta = targetOffset.scrollLeft - previousTargetOffset.scrollLeft;\n scrollableParent.scrollTo(\n scrollableParent.scrollLeft + leftDelta - scrollLeftDelta,\n scrollableParent.scrollTop + topDelta - scrollTopDelta,\n );\n }\n\n private didTabOpenForce(target?: HTMLElement) {\n if (!target) {\n return {};\n }\n\n if (target.dataset.diplodocForced) {\n return {root: target, isForced: true};\n }\n\n const root = target.dataset.diplodocVerticalTab ? target : target.parentElement;\n\n const isForced = typeof root?.dataset.diplodocForced !== 'undefined';\n\n return {root, isForced};\n }\n\n private fireSelectTabEvent(tab: Required<Tab>, diplodocId?: string) {\n const {group, key, variant: align} = tab;\n\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key, variant: align}\n : tab;\n\n this._onSelectTabHandlers.forEach((handler) => {\n handler({tab: eventTab, currentTabId: diplodocId});\n });\n }\n\n private getTabsType(element: HTMLElement) {\n const tabsRoot = element.closest(`[${TAB_DATA_VARIANT}]`) as HTMLElement | undefined;\n\n if (!tabsRoot) {\n return undefined;\n }\n\n return tabsRoot.dataset.diplodocVariant;\n }\n\n private isValidTabElement(element: HTMLElement) {\n return Boolean(this.getTabsType(element));\n }\n\n private isElementDropdownSelect(target: HTMLElement) {\n return target.classList.contains(TABS_DROPDOWN_SELECT);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const type = this.getTabsType(target);\n\n if (type === TabsVariants.Radio) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const tab = target.dataset.diplodocVerticalTab ? target : target.parentElement!;\n\n const key = tab.dataset.diplodocKey;\n const group = (tab.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Radio} : null;\n }\n\n if (type === TabsVariants.Dropdown || type === TabsVariants.Accordion) {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: type} : null;\n }\n\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Regular} : null;\n }\n\n private getTabs(target: HTMLElement): {tabs: Tab[]; nodes: NodeListOf<HTMLElement>} {\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n const nodes = (\n target.closest(Selector.TAB_LIST) as HTMLElement\n )?.querySelectorAll<HTMLElement>(Selector.TAB);\n\n const tabs: Tab[] = [];\n nodes.forEach((tabEl) => {\n const key = tabEl?.dataset.diplodocKey;\n if (!key) {\n return;\n }\n\n /** horizontal-only supported feature (used in left/right button click) */\n tabs.push({\n group,\n key,\n variant: TabsVariants.Regular,\n });\n });\n\n return {tabs, nodes};\n }\n}\n", "/**\n * Tabs runtime entry: creates a single TabsController for the document and attaches it to window\n * under GLOBAL_SYMBOL so that React and other consumers can access it. Imports SCSS for tab styles.\n */\nimport {GLOBAL_SYMBOL} from '../common';\n\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TABS_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_LIST_CLASSNAME", "ACTIVE_CLASSNAME", "GROUP_DATA_KEY", "TAB_DATA_KEY", "TAB_DATA_VARIANT", "TAB_DATA_ID", "DEFAULT_TABS_GROUP_PREFIX", "TAB_FORCED_OPEN", "TABS_DROPDOWN_SELECT", "TABS_RADIO_CLASSNAME", "TabsVariants", "GLOBAL_SYMBOL", "getEventTarget", "event", "path", "isCustom", "target", "getClosestScrollableParent", "element", "getOffsetByScrollableParent", "scrollableParent", "elementBounds", "scrollableParentBounds", "Selector", "TABS_CLASSNAME", "TABS_LIST_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_RADIO_CLASSNAME", "escapeCssAttrValue", "value", "findTabsByGroupAndKey", "doc", "group", "key", "containers", "GROUP_DATA_KEY", "result", "container", "tab", "TAB_DATA_KEY", "TabsController", "document", "options", "event", "target", "getEventTarget", "isCustom", "ACTIVE_CLASSNAME", "direction", "tabs", "nodes", "currentTab", "currentTabIndex", "newIndex", "handler", "id", "TAB_DATA_ID", "tabsHistory", "fields", "urlParams", "config", "
|
|
3
|
+
"sources": ["../../node_modules/slugify/slugify.js", "../../src/common.ts", "../../src/tab-key.ts", "../../src/runtime/utils.ts", "../../src/runtime/TabsController.ts", "../../src/runtime/index.ts"],
|
|
4
|
+
"sourcesContent": ["\n;(function (name, root, factory) {\n if (typeof exports === 'object') {\n module.exports = factory()\n module.exports['default'] = factory()\n }\n /* istanbul ignore next */\n else if (typeof define === 'function' && define.amd) {\n define(factory)\n }\n else {\n root[name] = factory()\n }\n}('slugify', this, function () {\n var charMap = JSON.parse('{\"$\":\"dollar\",\"%\":\"percent\",\"&\":\"and\",\"<\":\"less\",\">\":\"greater\",\"|\":\"or\",\"\u00A2\":\"cent\",\"\u00A3\":\"pound\",\"\u00A4\":\"currency\",\"\u00A5\":\"yen\",\"\u00A9\":\"(c)\",\"\u00AA\":\"a\",\"\u00AE\":\"(r)\",\"\u00BA\":\"o\",\"\u00C0\":\"A\",\"\u00C1\":\"A\",\"\u00C2\":\"A\",\"\u00C3\":\"A\",\"\u00C4\":\"A\",\"\u00C5\":\"A\",\"\u00C6\":\"AE\",\"\u00C7\":\"C\",\"\u00C8\":\"E\",\"\u00C9\":\"E\",\"\u00CA\":\"E\",\"\u00CB\":\"E\",\"\u00CC\":\"I\",\"\u00CD\":\"I\",\"\u00CE\":\"I\",\"\u00CF\":\"I\",\"\u00D0\":\"D\",\"\u00D1\":\"N\",\"\u00D2\":\"O\",\"\u00D3\":\"O\",\"\u00D4\":\"O\",\"\u00D5\":\"O\",\"\u00D6\":\"O\",\"\u00D8\":\"O\",\"\u00D9\":\"U\",\"\u00DA\":\"U\",\"\u00DB\":\"U\",\"\u00DC\":\"U\",\"\u00DD\":\"Y\",\"\u00DE\":\"TH\",\"\u00DF\":\"ss\",\"\u00E0\":\"a\",\"\u00E1\":\"a\",\"\u00E2\":\"a\",\"\u00E3\":\"a\",\"\u00E4\":\"a\",\"\u00E5\":\"a\",\"\u00E6\":\"ae\",\"\u00E7\":\"c\",\"\u00E8\":\"e\",\"\u00E9\":\"e\",\"\u00EA\":\"e\",\"\u00EB\":\"e\",\"\u00EC\":\"i\",\"\u00ED\":\"i\",\"\u00EE\":\"i\",\"\u00EF\":\"i\",\"\u00F0\":\"d\",\"\u00F1\":\"n\",\"\u00F2\":\"o\",\"\u00F3\":\"o\",\"\u00F4\":\"o\",\"\u00F5\":\"o\",\"\u00F6\":\"o\",\"\u00F8\":\"o\",\"\u00F9\":\"u\",\"\u00FA\":\"u\",\"\u00FB\":\"u\",\"\u00FC\":\"u\",\"\u00FD\":\"y\",\"\u00FE\":\"th\",\"\u00FF\":\"y\",\"\u0100\":\"A\",\"\u0101\":\"a\",\"\u0102\":\"A\",\"\u0103\":\"a\",\"\u0104\":\"A\",\"\u0105\":\"a\",\"\u0106\":\"C\",\"\u0107\":\"c\",\"\u010C\":\"C\",\"\u010D\":\"c\",\"\u010E\":\"D\",\"\u010F\":\"d\",\"\u0110\":\"DJ\",\"\u0111\":\"dj\",\"\u0112\":\"E\",\"\u0113\":\"e\",\"\u0116\":\"E\",\"\u0117\":\"e\",\"\u0118\":\"e\",\"\u0119\":\"e\",\"\u011A\":\"E\",\"\u011B\":\"e\",\"\u011E\":\"G\",\"\u011F\":\"g\",\"\u0122\":\"G\",\"\u0123\":\"g\",\"\u0128\":\"I\",\"\u0129\":\"i\",\"\u012A\":\"i\",\"\u012B\":\"i\",\"\u012E\":\"I\",\"\u012F\":\"i\",\"\u0130\":\"I\",\"\u0131\":\"i\",\"\u0136\":\"k\",\"\u0137\":\"k\",\"\u013B\":\"L\",\"\u013C\":\"l\",\"\u013D\":\"L\",\"\u013E\":\"l\",\"\u0141\":\"L\",\"\u0142\":\"l\",\"\u0143\":\"N\",\"\u0144\":\"n\",\"\u0145\":\"N\",\"\u0146\":\"n\",\"\u0147\":\"N\",\"\u0148\":\"n\",\"\u014C\":\"O\",\"\u014D\":\"o\",\"\u0150\":\"O\",\"\u0151\":\"o\",\"\u0152\":\"OE\",\"\u0153\":\"oe\",\"\u0154\":\"R\",\"\u0155\":\"r\",\"\u0158\":\"R\",\"\u0159\":\"r\",\"\u015A\":\"S\",\"\u015B\":\"s\",\"\u015E\":\"S\",\"\u015F\":\"s\",\"\u0160\":\"S\",\"\u0161\":\"s\",\"\u0162\":\"T\",\"\u0163\":\"t\",\"\u0164\":\"T\",\"\u0165\":\"t\",\"\u0168\":\"U\",\"\u0169\":\"u\",\"\u016A\":\"u\",\"\u016B\":\"u\",\"\u016E\":\"U\",\"\u016F\":\"u\",\"\u0170\":\"U\",\"\u0171\":\"u\",\"\u0172\":\"U\",\"\u0173\":\"u\",\"\u0174\":\"W\",\"\u0175\":\"w\",\"\u0176\":\"Y\",\"\u0177\":\"y\",\"\u0178\":\"Y\",\"\u0179\":\"Z\",\"\u017A\":\"z\",\"\u017B\":\"Z\",\"\u017C\":\"z\",\"\u017D\":\"Z\",\"\u017E\":\"z\",\"\u018F\":\"E\",\"\u0192\":\"f\",\"\u01A0\":\"O\",\"\u01A1\":\"o\",\"\u01AF\":\"U\",\"\u01B0\":\"u\",\"\u01C8\":\"LJ\",\"\u01C9\":\"lj\",\"\u01CB\":\"NJ\",\"\u01CC\":\"nj\",\"\u0218\":\"S\",\"\u0219\":\"s\",\"\u021A\":\"T\",\"\u021B\":\"t\",\"\u0259\":\"e\",\"\u02DA\":\"o\",\"\u0386\":\"A\",\"\u0388\":\"E\",\"\u0389\":\"H\",\"\u038A\":\"I\",\"\u038C\":\"O\",\"\u038E\":\"Y\",\"\u038F\":\"W\",\"\u0390\":\"i\",\"\u0391\":\"A\",\"\u0392\":\"B\",\"\u0393\":\"G\",\"\u0394\":\"D\",\"\u0395\":\"E\",\"\u0396\":\"Z\",\"\u0397\":\"H\",\"\u0398\":\"8\",\"\u0399\":\"I\",\"\u039A\":\"K\",\"\u039B\":\"L\",\"\u039C\":\"M\",\"\u039D\":\"N\",\"\u039E\":\"3\",\"\u039F\":\"O\",\"\u03A0\":\"P\",\"\u03A1\":\"R\",\"\u03A3\":\"S\",\"\u03A4\":\"T\",\"\u03A5\":\"Y\",\"\u03A6\":\"F\",\"\u03A7\":\"X\",\"\u03A8\":\"PS\",\"\u03A9\":\"W\",\"\u03AA\":\"I\",\"\u03AB\":\"Y\",\"\u03AC\":\"a\",\"\u03AD\":\"e\",\"\u03AE\":\"h\",\"\u03AF\":\"i\",\"\u03B0\":\"y\",\"\u03B1\":\"a\",\"\u03B2\":\"b\",\"\u03B3\":\"g\",\"\u03B4\":\"d\",\"\u03B5\":\"e\",\"\u03B6\":\"z\",\"\u03B7\":\"h\",\"\u03B8\":\"8\",\"\u03B9\":\"i\",\"\u03BA\":\"k\",\"\u03BB\":\"l\",\"\u03BC\":\"m\",\"\u03BD\":\"n\",\"\u03BE\":\"3\",\"\u03BF\":\"o\",\"\u03C0\":\"p\",\"\u03C1\":\"r\",\"\u03C2\":\"s\",\"\u03C3\":\"s\",\"\u03C4\":\"t\",\"\u03C5\":\"y\",\"\u03C6\":\"f\",\"\u03C7\":\"x\",\"\u03C8\":\"ps\",\"\u03C9\":\"w\",\"\u03CA\":\"i\",\"\u03CB\":\"y\",\"\u03CC\":\"o\",\"\u03CD\":\"y\",\"\u03CE\":\"w\",\"\u0401\":\"Yo\",\"\u0402\":\"DJ\",\"\u0404\":\"Ye\",\"\u0406\":\"I\",\"\u0407\":\"Yi\",\"\u0408\":\"J\",\"\u0409\":\"LJ\",\"\u040A\":\"NJ\",\"\u040B\":\"C\",\"\u040F\":\"DZ\",\"\u0410\":\"A\",\"\u0411\":\"B\",\"\u0412\":\"V\",\"\u0413\":\"G\",\"\u0414\":\"D\",\"\u0415\":\"E\",\"\u0416\":\"Zh\",\"\u0417\":\"Z\",\"\u0418\":\"I\",\"\u0419\":\"J\",\"\u041A\":\"K\",\"\u041B\":\"L\",\"\u041C\":\"M\",\"\u041D\":\"N\",\"\u041E\":\"O\",\"\u041F\":\"P\",\"\u0420\":\"R\",\"\u0421\":\"S\",\"\u0422\":\"T\",\"\u0423\":\"U\",\"\u0424\":\"F\",\"\u0425\":\"H\",\"\u0426\":\"C\",\"\u0427\":\"Ch\",\"\u0428\":\"Sh\",\"\u0429\":\"Sh\",\"\u042A\":\"U\",\"\u042B\":\"Y\",\"\u042C\":\"\",\"\u042D\":\"E\",\"\u042E\":\"Yu\",\"\u042F\":\"Ya\",\"\u0430\":\"a\",\"\u0431\":\"b\",\"\u0432\":\"v\",\"\u0433\":\"g\",\"\u0434\":\"d\",\"\u0435\":\"e\",\"\u0436\":\"zh\",\"\u0437\":\"z\",\"\u0438\":\"i\",\"\u0439\":\"j\",\"\u043A\":\"k\",\"\u043B\":\"l\",\"\u043C\":\"m\",\"\u043D\":\"n\",\"\u043E\":\"o\",\"\u043F\":\"p\",\"\u0440\":\"r\",\"\u0441\":\"s\",\"\u0442\":\"t\",\"\u0443\":\"u\",\"\u0444\":\"f\",\"\u0445\":\"h\",\"\u0446\":\"c\",\"\u0447\":\"ch\",\"\u0448\":\"sh\",\"\u0449\":\"sh\",\"\u044A\":\"u\",\"\u044B\":\"y\",\"\u044C\":\"\",\"\u044D\":\"e\",\"\u044E\":\"yu\",\"\u044F\":\"ya\",\"\u0451\":\"yo\",\"\u0452\":\"dj\",\"\u0454\":\"ye\",\"\u0456\":\"i\",\"\u0457\":\"yi\",\"\u0458\":\"j\",\"\u0459\":\"lj\",\"\u045A\":\"nj\",\"\u045B\":\"c\",\"\u045D\":\"u\",\"\u045F\":\"dz\",\"\u0490\":\"G\",\"\u0491\":\"g\",\"\u0492\":\"GH\",\"\u0493\":\"gh\",\"\u049A\":\"KH\",\"\u049B\":\"kh\",\"\u04A2\":\"NG\",\"\u04A3\":\"ng\",\"\u04AE\":\"UE\",\"\u04AF\":\"ue\",\"\u04B0\":\"U\",\"\u04B1\":\"u\",\"\u04BA\":\"H\",\"\u04BB\":\"h\",\"\u04D8\":\"AE\",\"\u04D9\":\"ae\",\"\u04E8\":\"OE\",\"\u04E9\":\"oe\",\"\u0531\":\"A\",\"\u0532\":\"B\",\"\u0533\":\"G\",\"\u0534\":\"D\",\"\u0535\":\"E\",\"\u0536\":\"Z\",\"\u0537\":\"E\\'\",\"\u0538\":\"Y\\'\",\"\u0539\":\"T\\'\",\"\u053A\":\"JH\",\"\u053B\":\"I\",\"\u053C\":\"L\",\"\u053D\":\"X\",\"\u053E\":\"C\\'\",\"\u053F\":\"K\",\"\u0540\":\"H\",\"\u0541\":\"D\\'\",\"\u0542\":\"GH\",\"\u0543\":\"TW\",\"\u0544\":\"M\",\"\u0545\":\"Y\",\"\u0546\":\"N\",\"\u0547\":\"SH\",\"\u0549\":\"CH\",\"\u054A\":\"P\",\"\u054B\":\"J\",\"\u054C\":\"R\\'\",\"\u054D\":\"S\",\"\u054E\":\"V\",\"\u054F\":\"T\",\"\u0550\":\"R\",\"\u0551\":\"C\",\"\u0553\":\"P\\'\",\"\u0554\":\"Q\\'\",\"\u0555\":\"O\\'\\'\",\"\u0556\":\"F\",\"\u0587\":\"EV\",\"\u0621\":\"a\",\"\u0622\":\"aa\",\"\u0623\":\"a\",\"\u0624\":\"u\",\"\u0625\":\"i\",\"\u0626\":\"e\",\"\u0627\":\"a\",\"\u0628\":\"b\",\"\u0629\":\"h\",\"\u062A\":\"t\",\"\u062B\":\"th\",\"\u062C\":\"j\",\"\u062D\":\"h\",\"\u062E\":\"kh\",\"\u062F\":\"d\",\"\u0630\":\"th\",\"\u0631\":\"r\",\"\u0632\":\"z\",\"\u0633\":\"s\",\"\u0634\":\"sh\",\"\u0635\":\"s\",\"\u0636\":\"dh\",\"\u0637\":\"t\",\"\u0638\":\"z\",\"\u0639\":\"a\",\"\u063A\":\"gh\",\"\u0641\":\"f\",\"\u0642\":\"q\",\"\u0643\":\"k\",\"\u0644\":\"l\",\"\u0645\":\"m\",\"\u0646\":\"n\",\"\u0647\":\"h\",\"\u0648\":\"w\",\"\u0649\":\"a\",\"\u064A\":\"y\",\"\u064B\":\"an\",\"\u064C\":\"on\",\"\u064D\":\"en\",\"\u064E\":\"a\",\"\u064F\":\"u\",\"\u0650\":\"e\",\"\u0652\":\"\",\"\u0660\":\"0\",\"\u0661\":\"1\",\"\u0662\":\"2\",\"\u0663\":\"3\",\"\u0664\":\"4\",\"\u0665\":\"5\",\"\u0666\":\"6\",\"\u0667\":\"7\",\"\u0668\":\"8\",\"\u0669\":\"9\",\"\u067E\":\"p\",\"\u0686\":\"ch\",\"\u0698\":\"zh\",\"\u06A9\":\"k\",\"\u06AF\":\"g\",\"\u06CC\":\"y\",\"\u06F0\":\"0\",\"\u06F1\":\"1\",\"\u06F2\":\"2\",\"\u06F3\":\"3\",\"\u06F4\":\"4\",\"\u06F5\":\"5\",\"\u06F6\":\"6\",\"\u06F7\":\"7\",\"\u06F8\":\"8\",\"\u06F9\":\"9\",\"\u0E3F\":\"baht\",\"\u10D0\":\"a\",\"\u10D1\":\"b\",\"\u10D2\":\"g\",\"\u10D3\":\"d\",\"\u10D4\":\"e\",\"\u10D5\":\"v\",\"\u10D6\":\"z\",\"\u10D7\":\"t\",\"\u10D8\":\"i\",\"\u10D9\":\"k\",\"\u10DA\":\"l\",\"\u10DB\":\"m\",\"\u10DC\":\"n\",\"\u10DD\":\"o\",\"\u10DE\":\"p\",\"\u10DF\":\"zh\",\"\u10E0\":\"r\",\"\u10E1\":\"s\",\"\u10E2\":\"t\",\"\u10E3\":\"u\",\"\u10E4\":\"f\",\"\u10E5\":\"k\",\"\u10E6\":\"gh\",\"\u10E7\":\"q\",\"\u10E8\":\"sh\",\"\u10E9\":\"ch\",\"\u10EA\":\"ts\",\"\u10EB\":\"dz\",\"\u10EC\":\"ts\",\"\u10ED\":\"ch\",\"\u10EE\":\"kh\",\"\u10EF\":\"j\",\"\u10F0\":\"h\",\"\u1E62\":\"S\",\"\u1E63\":\"s\",\"\u1E80\":\"W\",\"\u1E81\":\"w\",\"\u1E82\":\"W\",\"\u1E83\":\"w\",\"\u1E84\":\"W\",\"\u1E85\":\"w\",\"\u1E9E\":\"SS\",\"\u1EA0\":\"A\",\"\u1EA1\":\"a\",\"\u1EA2\":\"A\",\"\u1EA3\":\"a\",\"\u1EA4\":\"A\",\"\u1EA5\":\"a\",\"\u1EA6\":\"A\",\"\u1EA7\":\"a\",\"\u1EA8\":\"A\",\"\u1EA9\":\"a\",\"\u1EAA\":\"A\",\"\u1EAB\":\"a\",\"\u1EAC\":\"A\",\"\u1EAD\":\"a\",\"\u1EAE\":\"A\",\"\u1EAF\":\"a\",\"\u1EB0\":\"A\",\"\u1EB1\":\"a\",\"\u1EB2\":\"A\",\"\u1EB3\":\"a\",\"\u1EB4\":\"A\",\"\u1EB5\":\"a\",\"\u1EB6\":\"A\",\"\u1EB7\":\"a\",\"\u1EB8\":\"E\",\"\u1EB9\":\"e\",\"\u1EBA\":\"E\",\"\u1EBB\":\"e\",\"\u1EBC\":\"E\",\"\u1EBD\":\"e\",\"\u1EBE\":\"E\",\"\u1EBF\":\"e\",\"\u1EC0\":\"E\",\"\u1EC1\":\"e\",\"\u1EC2\":\"E\",\"\u1EC3\":\"e\",\"\u1EC4\":\"E\",\"\u1EC5\":\"e\",\"\u1EC6\":\"E\",\"\u1EC7\":\"e\",\"\u1EC8\":\"I\",\"\u1EC9\":\"i\",\"\u1ECA\":\"I\",\"\u1ECB\":\"i\",\"\u1ECC\":\"O\",\"\u1ECD\":\"o\",\"\u1ECE\":\"O\",\"\u1ECF\":\"o\",\"\u1ED0\":\"O\",\"\u1ED1\":\"o\",\"\u1ED2\":\"O\",\"\u1ED3\":\"o\",\"\u1ED4\":\"O\",\"\u1ED5\":\"o\",\"\u1ED6\":\"O\",\"\u1ED7\":\"o\",\"\u1ED8\":\"O\",\"\u1ED9\":\"o\",\"\u1EDA\":\"O\",\"\u1EDB\":\"o\",\"\u1EDC\":\"O\",\"\u1EDD\":\"o\",\"\u1EDE\":\"O\",\"\u1EDF\":\"o\",\"\u1EE0\":\"O\",\"\u1EE1\":\"o\",\"\u1EE2\":\"O\",\"\u1EE3\":\"o\",\"\u1EE4\":\"U\",\"\u1EE5\":\"u\",\"\u1EE6\":\"U\",\"\u1EE7\":\"u\",\"\u1EE8\":\"U\",\"\u1EE9\":\"u\",\"\u1EEA\":\"U\",\"\u1EEB\":\"u\",\"\u1EEC\":\"U\",\"\u1EED\":\"u\",\"\u1EEE\":\"U\",\"\u1EEF\":\"u\",\"\u1EF0\":\"U\",\"\u1EF1\":\"u\",\"\u1EF2\":\"Y\",\"\u1EF3\":\"y\",\"\u1EF4\":\"Y\",\"\u1EF5\":\"y\",\"\u1EF6\":\"Y\",\"\u1EF7\":\"y\",\"\u1EF8\":\"Y\",\"\u1EF9\":\"y\",\"\u2013\":\"-\",\"\u2018\":\"\\'\",\"\u2019\":\"\\'\",\"\u201C\":\"\\\\\\\"\",\"\u201D\":\"\\\\\\\"\",\"\u201E\":\"\\\\\\\"\",\"\u2020\":\"+\",\"\u2022\":\"*\",\"\u2026\":\"...\",\"\u20A0\":\"ecu\",\"\u20A2\":\"cruzeiro\",\"\u20A3\":\"french franc\",\"\u20A4\":\"lira\",\"\u20A5\":\"mill\",\"\u20A6\":\"naira\",\"\u20A7\":\"peseta\",\"\u20A8\":\"rupee\",\"\u20A9\":\"won\",\"\u20AA\":\"new shequel\",\"\u20AB\":\"dong\",\"\u20AC\":\"euro\",\"\u20AD\":\"kip\",\"\u20AE\":\"tugrik\",\"\u20AF\":\"drachma\",\"\u20B0\":\"penny\",\"\u20B1\":\"peso\",\"\u20B2\":\"guarani\",\"\u20B3\":\"austral\",\"\u20B4\":\"hryvnia\",\"\u20B5\":\"cedi\",\"\u20B8\":\"kazakhstani tenge\",\"\u20B9\":\"indian rupee\",\"\u20BA\":\"turkish lira\",\"\u20BD\":\"russian ruble\",\"\u20BF\":\"bitcoin\",\"\u2120\":\"sm\",\"\u2122\":\"tm\",\"\u2202\":\"d\",\"\u2206\":\"delta\",\"\u2211\":\"sum\",\"\u221E\":\"infinity\",\"\u2665\":\"love\",\"\u5143\":\"yuan\",\"\u5186\":\"yen\",\"\uFDFC\":\"rial\",\"\uFEF5\":\"laa\",\"\uFEF7\":\"laa\",\"\uFEF9\":\"lai\",\"\uFEFB\":\"la\"}')\n var locales = JSON.parse('{\"bg\":{\"\u0419\":\"Y\",\"\u0426\":\"Ts\",\"\u0429\":\"Sht\",\"\u042A\":\"A\",\"\u042C\":\"Y\",\"\u0439\":\"y\",\"\u0446\":\"ts\",\"\u0449\":\"sht\",\"\u044A\":\"a\",\"\u044C\":\"y\"},\"de\":{\"\u00C4\":\"AE\",\"\u00E4\":\"ae\",\"\u00D6\":\"OE\",\"\u00F6\":\"oe\",\"\u00DC\":\"UE\",\"\u00FC\":\"ue\",\"\u00DF\":\"ss\",\"%\":\"prozent\",\"&\":\"und\",\"|\":\"oder\",\"\u2211\":\"summe\",\"\u221E\":\"unendlich\",\"\u2665\":\"liebe\"},\"es\":{\"%\":\"por ciento\",\"&\":\"y\",\"<\":\"menor que\",\">\":\"mayor que\",\"|\":\"o\",\"\u00A2\":\"centavos\",\"\u00A3\":\"libras\",\"\u00A4\":\"moneda\",\"\u20A3\":\"francos\",\"\u2211\":\"suma\",\"\u221E\":\"infinito\",\"\u2665\":\"amor\"},\"fr\":{\"%\":\"pourcent\",\"&\":\"et\",\"<\":\"plus petit\",\">\":\"plus grand\",\"|\":\"ou\",\"\u00A2\":\"centime\",\"\u00A3\":\"livre\",\"\u00A4\":\"devise\",\"\u20A3\":\"franc\",\"\u2211\":\"somme\",\"\u221E\":\"infini\",\"\u2665\":\"amour\"},\"pt\":{\"%\":\"porcento\",\"&\":\"e\",\"<\":\"menor\",\">\":\"maior\",\"|\":\"ou\",\"\u00A2\":\"centavo\",\"\u2211\":\"soma\",\"\u00A3\":\"libra\",\"\u221E\":\"infinito\",\"\u2665\":\"amor\"},\"uk\":{\"\u0418\":\"Y\",\"\u0438\":\"y\",\"\u0419\":\"Y\",\"\u0439\":\"y\",\"\u0426\":\"Ts\",\"\u0446\":\"ts\",\"\u0425\":\"Kh\",\"\u0445\":\"kh\",\"\u0429\":\"Shch\",\"\u0449\":\"shch\",\"\u0413\":\"H\",\"\u0433\":\"h\"},\"vi\":{\"\u0110\":\"D\",\"\u0111\":\"d\"},\"da\":{\"\u00D8\":\"OE\",\"\u00F8\":\"oe\",\"\u00C5\":\"AA\",\"\u00E5\":\"aa\",\"%\":\"procent\",\"&\":\"og\",\"|\":\"eller\",\"$\":\"dollar\",\"<\":\"mindre end\",\">\":\"st\u00F8rre end\"},\"nb\":{\"&\":\"og\",\"\u00C5\":\"AA\",\"\u00C6\":\"AE\",\"\u00D8\":\"OE\",\"\u00E5\":\"aa\",\"\u00E6\":\"ae\",\"\u00F8\":\"oe\"},\"it\":{\"&\":\"e\"},\"nl\":{\"&\":\"en\"},\"sv\":{\"&\":\"och\",\"\u00C5\":\"AA\",\"\u00C4\":\"AE\",\"\u00D6\":\"OE\",\"\u00E5\":\"aa\",\"\u00E4\":\"ae\",\"\u00F6\":\"oe\"}}')\n\n function replace (string, options) {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n options = (typeof options === 'string')\n ? {replacement: options}\n : options || {}\n\n var locale = locales[options.locale] || {}\n\n var replacement = options.replacement === undefined ? '-' : options.replacement\n\n var trim = options.trim === undefined ? true : options.trim\n\n var slug = string.normalize().split('')\n // replace characters based on charMap\n .reduce(function (result, ch) {\n var appendChar = locale[ch];\n if (appendChar === undefined) appendChar = charMap[ch];\n if (appendChar === undefined) appendChar = ch;\n if (appendChar === replacement) appendChar = ' ';\n return result + appendChar\n // remove not allowed characters\n .replace(options.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n }, '');\n\n if (options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '');\n }\n\n if (trim) {\n slug = slug.trim()\n }\n\n // Replace spaces with replacement character, treating multiple consecutive\n // spaces as a single space.\n slug = slug.replace(/\\s+/g, replacement);\n\n if (options.lower) {\n slug = slug.toLowerCase()\n }\n\n return slug\n }\n\n replace.extend = function (customMap) {\n Object.assign(charMap, customMap)\n }\n\n return replace\n}))\n", "/**\n * Shared constants, types and globals for the tabs extension.\n * Used by both the MarkdownIt plugin (compile-time) and the runtime controller (DOM).\n */\nimport {type TabsController} from './runtime/TabsController';\n\n/** Regex to match the opening `{% list tabs ... %}` tag (optionally backtick-escaped). */\nexport const TAB_RE = /`?{% list tabs .*?%}`?/;\n\n/** CSS class names for tab structure. */\nexport const TABS_CLASSNAME = 'yfm-tabs';\nexport const TAB_CLASSNAME = 'yfm-tab';\nexport const TAB_PANEL_CLASSNAME = 'yfm-tab-panel';\nexport const TABS_LIST_CLASSNAME = 'yfm-tab-list';\nexport const ACTIVE_CLASSNAME = 'active';\nexport const TAB_GROUP_CLASSNAME = 'yfm-tab-group';\n\n/** Data attributes used by the runtime to identify groups, keys, variants and active state. */\nexport const TAB_ACTIVE_KEY = 'data-diplodoc-is-active';\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_VARIANT = 'data-diplodoc-variant';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\nexport const ACTIVE_TAB_TEXT = '{selected}';\nexport const TAB_FORCED_OPEN = 'data-diplodoc-forced';\n\n/** Dropdown variant: container, menu and select element class names. */\nexport const TABS_DROPDOWN_CLASSNAME = 'yfm-tabs-dropdown';\nexport const TABS_DROPDOWN_MENU_CLASSNAME = 'yfm-tabs-dropdown-menu';\nexport const TABS_DROPDOWN_SELECT = 'yfm-tabs-dropdown-select';\n\n/** Accordion variant. */\nexport const TABS_ACCORDION_CLASSNAME = 'yfm-tabs-accordion';\nexport const TABS_ACCORDION_CLIENT_HEIGHT = 'data-yfm-tabs-accordion-client-heights';\n\n/** Radio (vertical) variant. */\nexport const TABS_RADIO_CLASSNAME = 'yfm-tabs-vertical';\nexport const VERTICAL_TAB_CLASSNAME = 'yfm-vertical-tab';\nexport const TAB_DATA_VERTICAL_TAB = 'data-diplodoc-vertical-tab';\nexport const TAB_RADIO_KEY = 'data-diplodoc-input';\n\n/** Available tab block variants (regular horizontal, radio, dropdown, accordion). */\nexport enum TabsVariants {\n Regular = 'regular',\n Radio = 'radio',\n Dropdown = 'dropdown',\n Accordion = 'accordion',\n}\n\n/** Which variants are enabled in the plugin (others fall back to Regular). */\nexport type EnabledVariants = Partial<Record<TabsVariants, boolean>>;\n\n/** Identifies a tab: group id, tab key (from content), and variant. */\nexport interface Tab {\n group?: string;\n key: string;\n variant: TabsVariants;\n}\n\n/** Payload passed to onSelectTab handlers when a tab is switched. */\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\n/** Symbol under which the global TabsController instance is stored on `window`. */\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "import slugify from 'slugify';\n\nconst SLUG_OPTIONS = {\n lower: true,\n strict: true,\n} as const;\n\nconst PUNCTUATION_OR_SPACE_REGEXP = /^[\\p{P}\\s]$/u;\nconst PRESERVED_PUNCTUATION = new Set(['#']);\n\n/**\n * Convert characters unsupported by slugify to stable Unicode code point tokens.\n * Punctuation and whitespace keep slugify's default separator/removal behaviour, except for\n * characters such as # that distinguish common tab names (for example C# and C++).\n * @param value - Raw tab key\n * @returns Text safe to pass to slugify\n */\nexport function encodeUnsupportedCodePoints(value: string): string {\n return Array.from(value)\n .map((character) => {\n if (slugify(character, SLUG_OPTIONS)) {\n return character;\n }\n\n if (\n PUNCTUATION_OR_SPACE_REGEXP.test(character) &&\n !PRESERVED_PUNCTUATION.has(character)\n ) {\n return character;\n }\n\n const codePoint = character.codePointAt(0);\n return typeof codePoint === 'number' ? ` u${codePoint.toString(16)} ` : character;\n })\n .join('');\n}\n\n/**\n * Create the canonical key stored in tab markup and new URLs.\n * @param value - Raw tab name or custom id\n * @returns Lowercase ASCII slug, with unsupported characters represented as u<hex>\n */\nexport function createTabKey(value: string): string {\n const normalized = value.normalize('NFC').trim();\n const slug = slugify(encodeUnsupportedCodePoints(normalized), SLUG_OPTIONS);\n\n if (slug) {\n return slug;\n }\n\n return Array.from(normalized)\n .map((character) => `u${character.codePointAt(0)?.toString(16)}`)\n .join('-');\n}\n\n/**\n * Convert a key read from an old URL to the current canonical form.\n * URLSearchParams has already decoded the outer query layer, so legacy keys need one additional\n * decodeURIComponent call before slug generation.\n * @param value - Key parsed from the tabs query parameter\n * @returns Canonical tab key\n */\nexport function normalizeTabKeyFromUrl(value: string): string {\n try {\n return createTabKey(decodeURIComponent(value));\n } catch {\n return createTabKey(value);\n }\n}\n", "/**\n * Event target considering shadow DOM (composedPath()[0] or fallback to target).\n * @param event - DOM event\n * @returns Target element\n */\nexport const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\n/**\n * True if the event target is a custom element (or missing), so we skip tab handling.\n * @param event - DOM event\n * @returns Whether to ignore\n */\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n\n/**\n * Nearest ancestor (or self) that has overflow scroll. Used to preserve scroll when switching tabs.\n * @param element - Starting element\n * @returns Scrollable parent or undefined\n */\nexport const getClosestScrollableParent = (element: HTMLElement): HTMLElement | undefined => {\n if (Math.abs(element.scrollHeight - element.clientHeight) > 1) {\n return element;\n }\n\n return element.parentElement ? getClosestScrollableParent(element.parentElement) : undefined;\n};\n\n/** Position and scroll values used to restore scroll after tab switch. */\nexport interface ElementOffset {\n top: number;\n left: number;\n scrollTop: number;\n scrollLeft: number;\n}\n\n/**\n * Offset of element relative to scrollable parent and parent's scroll position.\n * @param element - Child element\n * @param scrollableParent - Scroll container\n * @returns Offset and scroll values\n */\nexport const getOffsetByScrollableParent = (\n element: HTMLElement,\n scrollableParent: HTMLElement,\n): ElementOffset => {\n const elementBounds = element.getBoundingClientRect();\n const scrollableParentBounds = scrollableParent.getBoundingClientRect();\n return {\n top: elementBounds.top - scrollableParentBounds.top,\n left: elementBounds.left - scrollableParentBounds.left,\n scrollTop: scrollableParent.scrollTop,\n scrollLeft: scrollableParent.scrollLeft,\n };\n};\n", "import type {SelectedTabEvent, Tab} from '../common';\nimport type {ElementOffset} from './utils';\n\nimport {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n TABS_CLASSNAME,\n TABS_DROPDOWN_SELECT,\n TABS_LIST_CLASSNAME,\n TABS_RADIO_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_DATA_VARIANT,\n TAB_FORCED_OPEN,\n TAB_PANEL_CLASSNAME,\n TabsVariants,\n} from '../common';\nimport {normalizeTabKeyFromUrl} from '../tab-key';\n\nimport {\n getClosestScrollableParent,\n getEventTarget,\n getOffsetByScrollableParent,\n isCustom,\n} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n VERTICAL_TABS: `.${TABS_RADIO_CLASSNAME}`,\n};\n\n/**\n * Escape value for use in a CSS attribute selector (e.g. group id).\n * @param value - Raw attribute value.\n * @returns Escaped string safe for use inside [attr=\"...\"].\n */\nfunction escapeCssAttrValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Find tab elements by group and key without putting key in a selector (keys may contain %, spaces, etc.).\n * @param doc - Document to query.\n * @param group - Group id.\n * @param key - Tab key (data-tabs-key value).\n * @returns Matching tab elements.\n */\nfunction findTabsByGroupAndKey(doc: Document, group: string, key: string): Element[] {\n const containers = doc.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]`,\n );\n const result: Element[] = [];\n containers.forEach((container) => {\n container.querySelectorAll(Selector.TAB).forEach((tab) => {\n if (tab.getAttribute(TAB_DATA_KEY) === key) {\n result.push(tab);\n }\n });\n });\n return result;\n}\n\nfunction hasTabByGroupKeyAndVariant(\n doc: Document,\n group: string,\n key: string,\n variant: TabsVariants,\n): boolean {\n const containers = doc.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]` +\n `[${TAB_DATA_VARIANT}=\"${variant}\"]`,\n );\n\n return Array.from(containers).some((container) =>\n Array.from(container.querySelectorAll(Selector.TAB)).some(\n (tab) =>\n tab.closest(Selector.TABS) === container && tab.getAttribute(TAB_DATA_KEY) === key,\n ),\n );\n}\n\n/** Options for selectTabById (e.g. scroll the selected tab into view). */\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\ntype Handler = (data: SelectedTabEvent) => void;\n\ntype TabSwitchDirection = 'left' | 'right';\n\n/** Persisted tab state: group id -> { key, variant }. Used for localStorage and URL. */\nexport type TabsHistory = Record<string, {key: string; variant: TabsVariants}>;\n\n/** Controller options: whether to persist selection to localStorage and/or URL query. */\nexport type TabsControllerOptions = {\n saveTabsToLocalStorage: boolean;\n saveTabsToQueryStateMode: 'all' | 'page' | 'none';\n};\n\n/**\n * DOM controller for tab blocks: click/keyboard handling, active state, persistence (localStorage\n * and URL), and events. One instance per document; registered on window[GLOBAL_SYMBOL].\n */\nexport class TabsController {\n private _document: Document;\n private _onSelectTabHandlers: Set<Handler> = new Set();\n private _options: TabsControllerOptions;\n private _currentPageTabGroups: string[] = [];\n private _isRestoringTabs = false;\n private _defaultTabKeys = new WeakMap<Element, string | null>();\n\n // TODO: remove side effects from constructor\n constructor(document: Document, options: Partial<TabsControllerOptions> = {}) {\n this._document = document;\n this._options = Object.assign(\n {\n saveTabsToLocalStorage: false,\n saveTabsToQueryStateMode: 'none',\n },\n options,\n );\n\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (event.target) {\n this.hideAllDropdown(event.target as HTMLElement);\n }\n\n if (isCustom(event)) {\n return;\n }\n\n if (this.isElementDropdownSelect(target)) {\n target.classList.toggle(ACTIVE_CLASSNAME);\n\n return;\n }\n\n if (!this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n\n this._document.addEventListener('keydown', (event) => {\n let direction: TabSwitchDirection | null = null;\n switch (event.key) {\n case 'ArrowLeft': {\n direction = 'left';\n break;\n }\n case 'ArrowRight': {\n direction = 'right';\n break;\n }\n case 'ArrowUp': {\n direction = 'left';\n break;\n }\n case 'ArrowDown': {\n direction = 'right';\n break;\n }\n }\n if (!direction) {\n return;\n }\n\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const {tabs, nodes} = this.getTabs(target);\n const currentTab = this.getTabDataFromHTMLElement(target);\n const currentTabIndex = tabs.findIndex(\n ({key}) => currentTab?.key && key === currentTab.key,\n );\n if (!currentTab || tabs.length <= 1 || currentTabIndex === -1) {\n return;\n }\n\n const newIndex =\n (currentTabIndex + (direction === 'left' ? -1 : 1) + tabs.length) % tabs.length;\n\n this.selectTab(tabs[newIndex]);\n nodes[newIndex].focus();\n });\n\n this.rememberDefaultTabs();\n }\n\n /**\n * Update controller options (e.g. enable persistence after init).\n * @param options - Partial options to merge\n * @returns void\n */\n configure(options: Partial<TabsControllerOptions>) {\n this._options = Object.assign(this._options, options);\n }\n\n /**\n * Subscribe to tab switch events.\n * @param handler - Callback on tab switch\n * @returns Unsubscribe function\n */\n onSelectTab(handler: Handler) {\n this._onSelectTabHandlers.add(handler);\n\n return () => {\n this._onSelectTabHandlers.delete(handler);\n };\n }\n\n /**\n * Select tab by data-diplodoc-id and optionally scroll it into view.\n * @param id - data-diplodoc-id value\n * @param options - e.g. scrollToElement\n * @returns void\n */\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n /**\n * Programmatically select a tab by { group, key, variant }.\n * @param tab - Tab descriptor\n * @returns void\n */\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n /**\n * Apply saved state: select each tab in tabsHistory (e.g. after navigation).\n * @param tabsHistory - Group -> { key, variant } map\n * @returns void\n */\n restoreTabs(tabsHistory: TabsHistory) {\n this._isRestoringTabs = true;\n try {\n for (const [group, fields] of Object.entries(tabsHistory)) {\n if (group) {\n const tab = {group, ...fields, key: normalizeTabKeyFromUrl(fields.key)};\n this.selectTab(tab);\n }\n }\n } finally {\n this._isRestoringTabs = false;\n }\n }\n\n /**\n * Read persisted tab state from localStorage (key: tabsHistory).\n * @returns Parsed TabsHistory\n */\n getTabsFromLocalStorage(): TabsHistory {\n return JSON.parse(localStorage.getItem('tabsHistory') || '{}') as TabsHistory;\n }\n\n /**\n * Parse tab state from URL search params (tabs=group_key or group_key_variant).\n * @returns Parsed TabsHistory\n */\n getTabsFromSearchQuery(): TabsHistory {\n const tabsHistory = {} as TabsHistory;\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has('tabs')) {\n const tabsFromQuery = urlParams.get('tabs') || '';\n const tabConfigs = tabsFromQuery.split(',');\n const currentGroups = this.getCurrentPageTabGroups().sort(\n (left, right) => right.length - left.length,\n );\n\n tabConfigs.forEach((config) => {\n const knownGroup = currentGroups.find((group) => config.startsWith(`${group}_`));\n\n if (knownGroup) {\n const keyAndVariant = config.slice(knownGroup.length + 1);\n const variants = Object.values(TabsVariants).filter(\n (variant) => variant !== TabsVariants.Regular,\n );\n const regularKey = normalizeTabKeyFromUrl(keyAndVariant);\n const variant = hasTabByGroupKeyAndVariant(\n this._document,\n knownGroup,\n regularKey,\n TabsVariants.Regular,\n )\n ? undefined\n : variants.find((candidate) => {\n const suffix = `_${candidate}`;\n const candidateKey = keyAndVariant.slice(0, -suffix.length);\n\n return (\n keyAndVariant.endsWith(suffix) &&\n hasTabByGroupKeyAndVariant(\n this._document,\n knownGroup,\n normalizeTabKeyFromUrl(candidateKey),\n candidate,\n )\n );\n });\n const key = variant\n ? keyAndVariant.slice(0, -`_${variant}`.length)\n : keyAndVariant;\n\n if (key) {\n tabsHistory[knownGroup] = {\n key: normalizeTabKeyFromUrl(key),\n variant: variant ?? TabsVariants.Regular,\n };\n }\n\n return;\n }\n\n const splitConfig = config.split('_');\n const [group, key] = splitConfig;\n const variant =\n splitConfig.length === 3\n ? (splitConfig[2] as TabsVariants)\n : TabsVariants.Regular;\n\n if (group && key && Object.values(TabsVariants).includes(variant)) {\n tabsHistory[group] = {key: normalizeTabKeyFromUrl(key), variant: variant};\n }\n });\n }\n\n return tabsHistory;\n }\n\n updateLocalStorageWithTabs(tabsHistory: TabsHistory) {\n if (!this._options.saveTabsToLocalStorage) {\n return;\n }\n\n // Don't update localStorage if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n localStorage.setItem('tabsHistory', JSON.stringify(tabsHistory));\n }\n\n updateQueryParamWithTabs(tabsHistory: TabsHistory) {\n // Don't update URL if we're just restoring tabs\n if (this._isRestoringTabs) {\n return;\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n const tabsArray = Object.entries(tabsHistory).reduce<string[]>(\n (result, [group, {key, variant}]) => {\n const normalizedKey = normalizeTabKeyFromUrl(key);\n\n if (this.isDefaultTab(group, normalizedKey, variant)) {\n return result;\n }\n\n result.push(\n variant === TabsVariants.Regular\n ? `${group}_${normalizedKey}`\n : `${group}_${normalizedKey}_${variant}`,\n );\n\n return result;\n },\n [],\n );\n\n // Clear or set tabs parameter\n if (tabsArray.length > 0) {\n urlParams.set('tabs', tabsArray.join(','));\n } else {\n urlParams.delete('tabs');\n }\n\n // Preserve existing state\n const currentState = history.state || {};\n\n // Use URL constructor for proper URL handling\n const url = new URL(window.location.href);\n url.search = urlParams.toString();\n\n window.history.replaceState({...currentState}, document.title, url.href);\n }\n\n /**\n * Filter tabsHistory to only groups present on the current page.\n * @param tabsHistory - Full history\n * @returns Filtered TabsHistory\n */\n getCurrentPageTabHistory(tabsHistory: TabsHistory): TabsHistory {\n return Object.fromEntries(\n Object.entries(tabsHistory).filter(([group]) =>\n this._currentPageTabGroups.includes(group),\n ),\n );\n }\n\n /**\n * Call after route/page change so persistence uses only groups on the current page.\n * @returns void\n */\n onPageChanged(): void {\n this.rememberDefaultTabs();\n this._currentPageTabGroups = this.getCurrentPageTabGroups();\n }\n\n /**\n * List of tab group ids found in the document.\n * @returns Array of group ids\n */\n getCurrentPageTabGroups(): string[] {\n const tabs = this._document.getElementsByClassName(TABS_CLASSNAME);\n const groups = new Set<string>();\n\n Array.from(tabs).forEach((tab) => {\n const group = tab.getAttribute(GROUP_DATA_KEY);\n if (group) {\n groups.add(group);\n }\n });\n\n return Array.from(groups);\n }\n\n /**\n * Clear saved tab state from localStorage and URL.\n * @returns void\n */\n clearTabsPreferred(): void {\n localStorage.removeItem('tabsHistory');\n this.updateQueryParamWithTabs({});\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key, variant} = tab;\n\n if (!group) {\n return;\n }\n\n this.saveTabPreferred({group, key, variant});\n\n const scrollableParent = targetTab && getClosestScrollableParent(targetTab);\n const previousTargetOffset =\n scrollableParent && getOffsetByScrollableParent(targetTab, scrollableParent);\n\n const updatedTabs = this.updateHTML({group, key, variant}, targetTab, variant);\n\n if (updatedTabs > 0) {\n this.fireSelectTabEvent({group, key, variant}, targetTab?.dataset.diplodocId);\n\n if (previousTargetOffset) {\n this.resetScroll(targetTab, scrollableParent, previousTargetOffset);\n }\n }\n }\n\n private updateHTML(tab: Required<Tab>, target: HTMLElement | undefined, variant: TabsVariants) {\n switch (variant) {\n case TabsVariants.Radio: {\n return this.updateHTMLRadio(tab, target);\n }\n case TabsVariants.Accordion: {\n return this.updateHTMLAccordion(tab, target);\n }\n case TabsVariants.Regular: {\n return this.updateHTMLRegular(tab);\n }\n case TabsVariants.Dropdown: {\n return this.updateHTMLDropdown(tab);\n }\n default: {\n return 0;\n }\n }\n }\n\n private saveTabPreferred(tab: Required<Tab>) {\n let tabsHistory = {} as TabsHistory;\n\n if (this._options.saveTabsToLocalStorage) {\n tabsHistory = JSON.parse(localStorage.getItem('tabsHistory') || '{}');\n }\n\n tabsHistory[tab.group] = {key: tab.key, variant: tab.variant};\n\n if (this._options.saveTabsToLocalStorage) {\n this.updateLocalStorageWithTabs(tabsHistory);\n }\n\n switch (this._options.saveTabsToQueryStateMode) {\n case 'all': {\n this.updateQueryParamWithTabs(tabsHistory);\n break;\n }\n case 'page': {\n this.updateQueryParamWithTabs(this.getCurrentPageTabHistory(tabsHistory));\n break;\n }\n }\n }\n\n private isDefaultTab(group: string, key: string, variant: TabsVariants): boolean {\n if (variant !== TabsVariants.Regular) {\n return false;\n }\n\n this.rememberDefaultTabs();\n\n const containers = Array.from(\n this._document.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${escapeCssAttrValue(group)}\"]` +\n `[${TAB_DATA_VARIANT}=\"${variant}\"]`,\n ),\n );\n const containersWithTab = containers\n .map((container) =>\n Array.from(container.querySelectorAll(Selector.TAB)).filter(\n (tab) => tab.closest(Selector.TABS) === container,\n ),\n )\n .filter((tabs) => tabs.some((tab) => tab.getAttribute(TAB_DATA_KEY) === key));\n\n return (\n containersWithTab.length > 0 &&\n containersWithTab.every((tabs) => {\n const container = tabs[0]?.closest(Selector.TABS);\n return container ? this._defaultTabKeys.get(container) === key : false;\n })\n );\n }\n\n private rememberDefaultTabs(): void {\n const containers = this._document.querySelectorAll(\n `${Selector.TABS}[${TAB_DATA_VARIANT}=\"${TabsVariants.Regular}\"]`,\n );\n\n containers.forEach((container) => {\n if (this._defaultTabKeys.has(container)) {\n return;\n }\n\n const tabs = Array.from(container.querySelectorAll(Selector.TAB)).filter(\n (tab) => tab.closest(Selector.TABS) === container,\n );\n const defaultTab =\n tabs.find((tab) => tab.classList.contains(ACTIVE_CLASSNAME)) ?? tabs[0];\n\n this._defaultTabKeys.set(container, defaultTab?.getAttribute(TAB_DATA_KEY) ?? null);\n });\n }\n\n private updateHTMLRadio(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const {isForced, root} = this.didTabOpenForce(target);\n\n let tabs = findTabsByGroupAndKey(this._document, group, key);\n if (isForced) {\n tabs = tabs.filter(\n (el) => (el as HTMLElement).getAttribute(TAB_FORCED_OPEN) === 'true',\n );\n }\n\n if (isForced) {\n root?.removeAttribute(TAB_FORCED_OPEN);\n }\n\n let updated = 0;\n\n tabs.forEach((tab) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const root = tab.parentNode!;\n const elements = root.children;\n\n for (let i = 0; i < elements.length; i += 2) {\n const [title, content] = [elements.item(i), elements.item(i + 1)] as HTMLElement[];\n\n const input = title.children.item(0) as HTMLInputElement;\n\n if (title === tab) {\n const checked = input.checked;\n\n if (checked) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n } else {\n title.classList.add('active');\n content?.classList.add('active');\n\n input.setAttribute('checked', 'true');\n }\n\n continue;\n }\n\n if (input.hasAttribute('checked')) {\n title.classList.remove('active');\n content?.classList.remove('active');\n\n input.removeAttribute('checked');\n }\n\n updated++;\n }\n });\n\n return updated;\n }\n\n private updateHTMLRegular(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let updated = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || htmlElem.dataset.diplodocIsActive === 'true') {\n return;\n }\n\n updated++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabList?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.children || []).filter((node) =>\n node.classList.contains(TAB_PANEL_CLASSNAME),\n );\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n const htmlElem = tab as HTMLElement;\n\n htmlElem.dataset.diplodocIsActive = isTargetTab ? 'true' : 'false';\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n return updated;\n }\n\n private updateHTMLDropdown(tab: Required<Tab>) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const dropdown = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Dropdown}]`);\n\n if (!dropdown?.children) {\n return;\n }\n\n const select = dropdown.children.item(0) as HTMLElement;\n const menu = dropdown.children.item(1);\n\n select?.classList.remove(ACTIVE_CLASSNAME);\n\n /* first and second elements are select / menu, skipping them */\n const changedIndex = Array.from(menu?.children || []).indexOf(tab) + 2;\n\n for (let i = 2; i < dropdown.children.length; i++) {\n const item = dropdown.children.item(i) as HTMLElement;\n const menuItem = menu?.children.item(i - 2) as HTMLElement;\n\n changed++;\n\n if (changedIndex === i) {\n item?.classList.add(ACTIVE_CLASSNAME);\n menuItem.classList.add(ACTIVE_CLASSNAME);\n\n select.innerHTML = tab.innerHTML;\n select.classList.add('filled');\n\n continue;\n }\n\n menuItem.classList.remove(ACTIVE_CLASSNAME);\n item.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n return changed;\n }\n\n private updateHTMLAccordion(tab: Required<Tab>, target: HTMLElement | undefined) {\n const {group, key} = tab;\n\n const tabs = findTabsByGroupAndKey(this._document, group, key);\n\n let changed = 0;\n\n tabs.forEach((tab) => {\n const accordion = tab.closest(`[${TAB_DATA_VARIANT}=${TabsVariants.Accordion}]`);\n\n if (!accordion?.children) {\n return;\n }\n\n for (let i = 0; i < accordion.children.length; i += 2) {\n const title = accordion.children.item(i);\n const currentTab = accordion.children.item(i + 1);\n\n changed++;\n\n if (tab === title) {\n title?.classList.toggle(ACTIVE_CLASSNAME);\n currentTab?.classList.toggle(ACTIVE_CLASSNAME);\n\n continue;\n }\n\n title?.classList.remove(ACTIVE_CLASSNAME);\n currentTab?.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n\n if (target && !this.checkVisible(target)) {\n setTimeout(() => {\n target.scrollIntoView({block: 'nearest'});\n });\n }\n\n return changed;\n }\n\n private checkVisible(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n return !(rect.bottom < 0 || rect.top - viewHeight >= 0);\n }\n\n private hideAllDropdown(target: HTMLElement) {\n const dropdowns = this._document.querySelectorAll('.yfm-tabs-dropdown-select.active');\n\n dropdowns.forEach((menu) => {\n if (!menu.contains(target)) {\n menu.classList.remove(ACTIVE_CLASSNAME);\n }\n });\n }\n\n private resetScroll(\n target: HTMLElement,\n scrollableParent: HTMLElement,\n previousTargetOffset: ElementOffset,\n ) {\n const targetOffset = getOffsetByScrollableParent(target, scrollableParent);\n const topDelta = targetOffset.top - previousTargetOffset.top;\n const leftDelta = targetOffset.left - previousTargetOffset.left;\n const scrollTopDelta = targetOffset.scrollTop - previousTargetOffset.scrollTop;\n const scrollLeftDelta = targetOffset.scrollLeft - previousTargetOffset.scrollLeft;\n scrollableParent.scrollTo(\n scrollableParent.scrollLeft + leftDelta - scrollLeftDelta,\n scrollableParent.scrollTop + topDelta - scrollTopDelta,\n );\n }\n\n private didTabOpenForce(target?: HTMLElement) {\n if (!target) {\n return {};\n }\n\n if (target.dataset.diplodocForced) {\n return {root: target, isForced: true};\n }\n\n const root = target.dataset.diplodocVerticalTab ? target : target.parentElement;\n\n const isForced = typeof root?.dataset.diplodocForced !== 'undefined';\n\n return {root, isForced};\n }\n\n private fireSelectTabEvent(tab: Required<Tab>, diplodocId?: string) {\n const {group, key, variant: align} = tab;\n\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key, variant: align}\n : tab;\n\n this._onSelectTabHandlers.forEach((handler) => {\n handler({tab: eventTab, currentTabId: diplodocId});\n });\n }\n\n private getTabsType(element: HTMLElement) {\n const tabsRoot = element.closest(`[${TAB_DATA_VARIANT}]`) as HTMLElement | undefined;\n\n if (!tabsRoot) {\n return undefined;\n }\n\n return tabsRoot.dataset.diplodocVariant;\n }\n\n private isValidTabElement(element: HTMLElement) {\n return Boolean(this.getTabsType(element));\n }\n\n private isElementDropdownSelect(target: HTMLElement) {\n return target.classList.contains(TABS_DROPDOWN_SELECT);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const type = this.getTabsType(target);\n\n if (type === TabsVariants.Radio) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const tab = target.dataset.diplodocVerticalTab ? target : target.parentElement!;\n\n const key = tab.dataset.diplodocKey;\n const group = (tab.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Radio} : null;\n }\n\n if (type === TabsVariants.Dropdown || type === TabsVariants.Accordion) {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: type} : null;\n }\n\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key, variant: TabsVariants.Regular} : null;\n }\n\n private getTabs(target: HTMLElement): {tabs: Tab[]; nodes: NodeListOf<HTMLElement>} {\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n const nodes = (\n target.closest(Selector.TAB_LIST) as HTMLElement\n )?.querySelectorAll<HTMLElement>(Selector.TAB);\n\n const tabs: Tab[] = [];\n nodes.forEach((tabEl) => {\n const key = tabEl?.dataset.diplodocKey;\n if (!key) {\n return;\n }\n\n /** horizontal-only supported feature (used in left/right button click) */\n tabs.push({\n group,\n key,\n variant: TabsVariants.Regular,\n });\n });\n\n return {tabs, nodes};\n }\n}\n", "/**\n * Tabs runtime entry: creates a single TabsController for the document and attaches it to window\n * under GLOBAL_SYMBOL so that React and other consumers can access it. Imports SCSS for tab styles.\n */\nimport {GLOBAL_SYMBOL} from '../common';\n\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_slugify", "__commonJSMin", "exports", "module", "name", "root", "factory", "charMap", "locales", "replace", "string", "options", "locale", "replacement", "trim", "slug", "result", "ch", "appendChar", "customMap", "TABS_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_LIST_CLASSNAME", "ACTIVE_CLASSNAME", "GROUP_DATA_KEY", "TAB_DATA_KEY", "TAB_DATA_VARIANT", "TAB_DATA_ID", "DEFAULT_TABS_GROUP_PREFIX", "TAB_FORCED_OPEN", "TABS_DROPDOWN_SELECT", "TABS_RADIO_CLASSNAME", "TabsVariants", "GLOBAL_SYMBOL", "import_slugify", "SLUG_OPTIONS", "PUNCTUATION_OR_SPACE_REGEXP", "PRESERVED_PUNCTUATION", "encodeUnsupportedCodePoints", "value", "character", "slugify", "codePoint", "createTabKey", "normalized", "slug", "_a", "normalizeTabKeyFromUrl", "getEventTarget", "event", "path", "isCustom", "target", "getClosestScrollableParent", "element", "getOffsetByScrollableParent", "scrollableParent", "elementBounds", "scrollableParentBounds", "Selector", "TABS_CLASSNAME", "TABS_LIST_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TABS_RADIO_CLASSNAME", "escapeCssAttrValue", "value", "findTabsByGroupAndKey", "doc", "group", "key", "containers", "GROUP_DATA_KEY", "result", "container", "tab", "TAB_DATA_KEY", "hasTabByGroupKeyAndVariant", "variant", "TAB_DATA_VARIANT", "TabsController", "document", "options", "event", "target", "getEventTarget", "isCustom", "ACTIVE_CLASSNAME", "direction", "tabs", "nodes", "currentTab", "currentTabIndex", "newIndex", "handler", "id", "TAB_DATA_ID", "tabsHistory", "fields", "normalizeTabKeyFromUrl", "urlParams", "tabConfigs", "currentGroups", "left", "right", "config", "knownGroup", "keyAndVariant", "variants", "TabsVariants", "regularKey", "candidate", "suffix", "candidateKey", "splitConfig", "tabsArray", "normalizedKey", "currentState", "url", "groups", "targetTab", "scrollableParent", "getClosestScrollableParent", "previousTargetOffset", "getOffsetByScrollableParent", "containersWithTab", "_a", "_b", "defaultTab", "isForced", "root", "el", "TAB_FORCED_OPEN", "updated", "elements", "i", "title", "content", "input", "element", "htmlElem", "tabList", "tabsContainer", "allTabs", "allPanels", "node", "targetIndex", "panel", "isTargetTab", "changed", "dropdown", "select", "menu", "changedIndex", "item", "menuItem", "accordion", "rect", "viewHeight", "targetOffset", "topDelta", "leftDelta", "scrollTopDelta", "scrollLeftDelta", "diplodocId", "align", "eventTab", "DEFAULT_TABS_GROUP_PREFIX", "tabsRoot", "TABS_DROPDOWN_SELECT", "_c", "type", "tabEl", "GLOBAL_SYMBOL", "TabsController"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert characters unsupported by slugify to stable Unicode code point tokens.
|
|
3
|
+
* Punctuation and whitespace keep slugify's default separator/removal behaviour, except for
|
|
4
|
+
* characters such as # that distinguish common tab names (for example C# and C++).
|
|
5
|
+
* @param value - Raw tab key
|
|
6
|
+
* @returns Text safe to pass to slugify
|
|
7
|
+
*/
|
|
8
|
+
export declare function encodeUnsupportedCodePoints(value: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Create the canonical key stored in tab markup and new URLs.
|
|
11
|
+
* @param value - Raw tab name or custom id
|
|
12
|
+
* @returns Lowercase ASCII slug, with unsupported characters represented as u<hex>
|
|
13
|
+
*/
|
|
14
|
+
export declare function createTabKey(value: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Convert a key read from an old URL to the current canonical form.
|
|
17
|
+
* URLSearchParams has already decoded the outer query layer, so legacy keys need one additional
|
|
18
|
+
* decodeURIComponent call before slug generation.
|
|
19
|
+
* @param value - Key parsed from the tabs query parameter
|
|
20
|
+
* @returns Canonical tab key
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeTabKeyFromUrl(value: string): string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diplodoc/tabs-extension",
|
|
3
|
-
"version": "3.10.
|
|
3
|
+
"version": "3.10.7",
|
|
4
4
|
"description": "Tabs plugin for Diplodoc transformer and builder",
|
|
5
5
|
"main": "build/plugin/index.js",
|
|
6
6
|
"types": "build/plugin/index.d.ts",
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
"jsdom": "20.0.3",
|
|
71
71
|
"markdown-it": "^13.0.2",
|
|
72
72
|
"npm-run-all": "^4.1.5",
|
|
73
|
+
"slugify": "1.6.6",
|
|
73
74
|
"ts-dedent": "^2.2.0",
|
|
74
75
|
"typescript": "6.0.3",
|
|
75
76
|
"vitest": "^3.2.4"
|