vue-stack-tabs 1.3.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +119 -52
- package/README.md +103 -42
- package/README.ru.md +125 -54
- package/dist/{src/lib/StackTabs.vue.d.ts → StackTabs.vue.d.ts} +5 -5
- package/dist/{src/lib/components → components}/ContextMenu/index.vue.d.ts +1 -1
- package/dist/components/StackKeepAlive/emptyPlaceholder.d.ts +3 -0
- package/dist/{src/lib/components → components}/TabHeader/TabHeaderItem.vue.d.ts +9 -0
- package/dist/{src/lib/components → components}/TabHeader/index.vue.d.ts +3 -3
- package/dist/{src/lib/hooks → hooks}/stackTabsContext.d.ts +5 -2
- package/dist/hooks/tabPanel/pageComponentFactory.d.ts +23 -0
- package/dist/{src/lib/hooks → hooks}/tabPanel/refresh.d.ts +6 -3
- package/dist/{src/lib/hooks → hooks}/tabPanel/scroll.d.ts +2 -0
- package/dist/hooks/tabPanel/tabStore.d.ts +69 -0
- package/dist/hooks/useScrollShadow.d.ts +20 -0
- package/dist/{src/lib/hooks → hooks}/useTabActions.d.ts +7 -2
- package/dist/{src/lib/hooks → hooks}/useTabEventBus.d.ts +2 -1
- package/dist/{src/lib/hooks → hooks}/useTabPanel.d.ts +16 -4
- package/dist/iframe-bridge.mjs +1 -1
- package/dist/index.d.ts +22 -6
- package/dist/{src/lib/model → model}/TabModel.d.ts +21 -0
- package/dist/nuxt/module.mjs +10 -6
- package/dist/nuxt/runtime/plugin.mjs +1600 -4
- package/dist/style.css +1 -1
- package/dist/utils/iframeBridge.d.ts +7 -1
- package/dist/{src/lib/utils → utils}/scrollUtils.d.ts +7 -1
- package/dist/{src/lib/versionLogger.d.ts → versionLogger.d.ts} +1 -1
- package/dist/vue-stack-tabs.css +1 -1
- package/dist/vue-stack-tabs.es.js +1 -1
- package/package.json +64 -40
- package/src/lib/StackTabs.vue +16 -3
- package/src/lib/assets/style/common/var.scss +2 -0
- package/src/lib/assets/style/stackTab.scss +17 -3
- package/src/lib/components/ContextMenu/index.vue +12 -3
- package/src/lib/components/PageLoading.vue +10 -2
- package/src/lib/components/StackKeepAlive/StackCacheRenderer.vue +3 -9
- package/src/lib/components/StackKeepAlive/emptyPlaceholder.tsx +18 -0
- package/src/lib/components/TabHeader/index.vue +4 -3
- package/src/lib/hooks/stackTabsContext.ts +23 -18
- package/src/lib/hooks/tabPanel/pageComponentFactory.tsx +136 -0
- package/src/lib/hooks/tabPanel/refresh.ts +20 -13
- package/src/lib/hooks/tabPanel/scroll.ts +110 -7
- package/src/lib/hooks/tabPanel/session.ts +29 -3
- package/src/lib/hooks/tabPanel/tabStore.ts +595 -0
- package/src/lib/hooks/useContextMenu.ts +57 -11
- package/src/lib/hooks/useIframeManager.ts +18 -2
- package/src/lib/hooks/useScrollShadow.ts +124 -0
- package/src/lib/hooks/useTabActions.ts +18 -8
- package/src/lib/hooks/useTabEventBus.ts +5 -3
- package/src/lib/hooks/useTabPanel.tsx +183 -302
- package/src/lib/hooks/useTabRouter.ts +42 -38
- package/src/lib/i18n/index.ts +3 -3
- package/src/lib/model/TabModel.ts +40 -1
- package/src/lib/nuxt/module.ts +10 -3
- package/src/lib/nuxt/runtime/plugin.ts +13 -2
- package/src/lib/utils/iframeBridge.ts +9 -1
- package/src/lib/utils/scrollUtils.ts +35 -2
- package/src/lib/utils/tabInfoEncoder.ts +21 -8
- package/src/lib/utils/urlParser.ts +3 -1
- package/src/lib/versionLogger.ts +6 -2
- package/dist/favicon.svg +0 -10
- package/dist/iframe-bridge.html +0 -77
- package/dist/iframe-child.html +0 -88
- package/dist/nuxt/favicon.svg +0 -10
- package/dist/nuxt/iframe-bridge.html +0 -77
- package/dist/nuxt/iframe-child.html +0 -88
- package/dist/nuxt/plugin.mjs +0 -9
- package/dist/src/lib/iframe-bridge.d.ts +0 -8
- package/dist/src/lib/index.d.ts +0 -22
- package/dist/src/lib/nuxt/module.d.ts +0 -6
- package/dist/src/lib/nuxt/runtime/plugin.client.d.ts +0 -2
- package/dist/src/lib/nuxt/runtime/plugin.d.ts +0 -2
- package/dist/src/lib/utils/iframeBridge.d.ts +0 -39
- package/src/lib/nuxt/runtime/plugin.client.ts +0 -10
- /package/dist/{src/lib/components → components}/ContextMenu/ContextMenuItem.vue.d.ts +0 -0
- /package/dist/{src/lib/components → components}/PageLoading.vue.d.ts +0 -0
- /package/dist/{src/lib/components → components}/StackKeepAlive/StackCacheRenderer.vue.d.ts +0 -0
- /package/dist/{src/lib/components → components}/StackKeepAlive/StackKeepAlive.vue.d.ts +0 -0
- /package/dist/{src/lib/components → components}/TabHeader/TabHeaderButton.vue.d.ts +0 -0
- /package/dist/{src/lib/components → components}/TabHeader/TabHeaderScroll.vue.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/tabPanel/evict.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/tabPanel/navigationTransaction.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/tabPanel/session.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/tabPanel/state.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/useContextMenu.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/useIframeManager.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/useTabLoading.d.ts +0 -0
- /package/dist/{src/lib/hooks → hooks}/useTabRouter.d.ts +0 -0
- /package/dist/{src/lib/i18n → i18n}/index.d.ts +0 -0
- /package/dist/{src/lib/i18n → i18n}/lang/en.d.ts +0 -0
- /package/dist/{src/lib/i18n → i18n}/lang/zh-CN.d.ts +0 -0
- /package/dist/{src/lib/i18n → i18n}/stackTabsLocale.d.ts +0 -0
- /package/dist/{src/lib/iframe.vue.d.ts → iframe.vue.d.ts} +0 -0
- /package/dist/{src/lib/utils → utils}/stackTabsA11y.d.ts +0 -0
- /package/dist/{src/lib/utils → utils}/stackTabsMessage.d.ts +0 -0
- /package/dist/{src/lib/utils → utils}/tabInfoEncoder.d.ts +0 -0
- /package/dist/{src/lib/utils → utils}/typeGuards.d.ts +0 -0
- /package/dist/{src/lib/utils → utils}/urlParser.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Fragment as e,KeepAlive as t,Transition as a,TransitionGroup as r,cloneVNode as o,computed as n,createBlock as l,createCommentVNode as s,createElementBlock as i,createElementVNode as c,createVNode as u,defineComponent as d,getCurrentInstance as f,hasInjectionContext as b,inject as m,mergeProps as p,nextTick as v,normalizeClass as h,normalizeStyle as g,onActivated as y,onBeforeMount as k,onBeforeUnmount as _,onDeactivated as T,onMounted as w,onUnmounted as S,openBlock as I,provide as A,reactive as x,readonly as R,ref as C,renderList as P,renderSlot as E,resolveComponent as L,resolveDynamicComponent as M,shallowRef as O,toDisplayString as V,toRaw as W,triggerRef as B,unref as q,vShow as F,watch as j,withCtx as D,withDirectives as N,withModifiers as K}from"vue";import{isNavigationFailure as $,useRoute as z,useRouter as G}from"vue-router";var U=Object.defineProperty,H=(e,t)=>{let a={};for(var r in e)U(a,r,{get:e[r],enumerable:!0});return t||U(a,Symbol.toStringTag,{value:"Module"}),a},X=/* @__PURE__ */H({default:()=>J}),J={VueStackTab:{close:"close",closeLeft:"close left",closeRight:"close right",closeOthers:"close others",closeAll:"close all",reload:"reload",reloadAll:"reload all",maximum:"maximum",restore:"restore",undefined:"undefined",loading:"loading",iframeTitle:"Embedded tab page",iframeLoadTimeout:"IFrame loading timed out",retry:"Retry",openInNewWindow:"Open in new window",scrollLeft:"Scroll left",scrollRight:"Scroll right"}},Y=/* @__PURE__ */H({default:()=>Q}),Q={VueStackTab:{close:"关闭",closeLeft:"关闭左侧",closeRight:"关闭右侧",closeOthers:"关闭其他",closeAll:"关闭所有",reload:"刷新",reloadAll:"刷新所有",maximum:"最大化",restore:"还原",undefined:"未命名",loading:"加载中",iframeTitle:"标签页内嵌页面",iframeLoadTimeout:"iframe 加载超时",retry:"重试",openInNewWindow:"在新窗口打开",scrollLeft:"向左滚动",scrollRight:"向右滚动"}},Z=["__proto__","prototype","constructor"];function ee(e){const t=e.split("."),a=[];for(let r=0;r<t.length;r++){let e=t[r];for(;"\\"===e[e.length-1]&&void 0!==t[r+1];)e=e.slice(0,-1)+".",e+=t[++r];a.push(e)}return a.some(e=>-1!==Z.indexOf(e))?[]:a}function te(e,t){if(!function(e){const t=typeof e;return null!==e&&("object"===t||"function"===t)}(e))return"";const a=ee(t);if(0===a.length)return"";let r=Object.assign({},e);for(let o=0;o<a.length;o++){if("string"==typeof r[a[o]])return r[a[o]];if(r=r[a[o]],null==r){if(o!==a.length-1)return"";break}}return""}function ae(e,t){return Object.keys(t).forEach(a=>{t[a]instanceof Object&&a in e&&(t[a]={...t[a],...ae(e[a],t[a])})}),{...e||{},...t}}var re="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,oe=/* @__PURE__ */(e=>re?Symbol(e):"_vt_"+e)("i18n");function ne(){return m(oe)}function le(e){const t=Object.assign({locale:"en",fallbackLocale:"en",messages:{}},e),a=C(t.locale),r=x({});return Object.entries(t.messages).forEach(([e,t])=>{r[e]=t}),{t(e,o){if(!e)return"";let n=te(r["string"==typeof o&&o?o:a.value],e)||te(r[t.fallbackLocale],e);if(o&&"string"!=typeof o){const e=function(e,t){if(Array.isArray(t)){const a={},r=[...e.matchAll(/{(.+?)}/g)];return r&&r.forEach((e,r)=>{t[r]&&(a[e[1]]=t[r])}),a}return t}(n,o);l=e,(Array.isArray(l)?l.length:Object.keys(l).length)&&(n=function(e,t){for(const a in t)e=e.replace(`{${a}}`,String(t[a]));return e}(n,e))}var l;return n||e},current:R(a),options:R(e||{}),install(e){e.config.globalProperties.$t=this.t,e.provide(oe,this)},changeLocale(e){a.value=e},setLocaleMessage(e,t){r[e]=ae(W(r[e]||{}),t)},getLocaleMessage:e=>r[e]||{}}}var se=new Set(["__proto__","constructor","prototype"]),ie=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),ce=(e,t)=>{const a={...e};for(const[r,o]of Object.entries(t)){if(se.has(r))continue;const e=a[r];a[r]=ie(e)&&ie(o)?ce(e,o):o}return a},ue=()=>{const e=/* @__PURE__ */Object.assign({"./lang/en.ts":X,"./lang/zh-CN.ts":Y});return{getI18n:t=>{const a=((e,t)=>{const a={...e};if(!t)return a;for(const r of t)r.messages&&!se.has(r.locale)&&(a[r.locale]=ce(a[r.locale]??{},r.messages));return a})((()=>{const t={};return function(e,t){for(const a in e){const r=e[a];if(r?.default){const e=a.substring(a.lastIndexOf("/")+1,a.lastIndexOf(".")),o=t[e];t[e]=o?{...o,...r.default}:r.default}}}(e,t),t})(),t);return le({locale:t?.[0]?.locale??"zh-CN",fallbackLocale:"en",messages:a})}}},de=({wrap:e,left:t=0,top:a=0,smooth:r=!0})=>{e&&(e.scrollTo?e.scrollTo({left:t,top:a,behavior:r?"smooth":"auto"}):(e.scrollLeft=t,e.scrollTop=a))};!function(){let e=null}();var fe=(e=".stack-tab__container *")=>{const t=document.querySelectorAll(e);let a=0;for(let r=0;r<t.length;r++){const e=+window.getComputedStyle(t[r]).zIndex||0;e<89999&&e>a&&(a=e)}return a+1},be=new Set(["about:blank"]),me=new Set(["__tab","__src"]);function pe(e){const t=e.trim();if(!t)return!0;if((e=>{for(const t of e){const e=t.charCodeAt(0);if(e<=31||127===e||e>=128&&e<=159||8203===e||8204===e||8205===e||8288===e||65279===e||e>=8234&&e<=8238||e>=8294&&e<=8297)return!0}return!1})(t))return!1;if(be.has(t.toLowerCase()))return!0;if(t.toLowerCase().startsWith("about:"))return!1;try{const e=new URL(t,"undefined"!=typeof window?window.location.origin:"http://localhost");return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}function ve(e){return pe(e)?e:"about:blank"}function he(e){if("string"!=typeof e)return"about:blank";try{return ve(decodeURIComponent(e))}catch{return"about:blank"}}function ge(e){if(!e||!/^https?:\/\//i.test(e))return!1;try{const t="undefined"!=typeof window?window.location:{origin:"http://localhost"};return new URL(e,t.origin).origin!==t.origin}catch{return!0}}function ye(e){const[t="",a]=e.split("?");if(void 0===a)return{path:t,query:{}};const r=new URLSearchParams(a),o={};for(const[n,l]of r.entries()){const e=o[n];void 0!==e?o[n]=Array.isArray(e)?[...e,l]:[e,l]:o[n]=l}return{path:t,query:o}}function ke(e={}){const t={};for(const[a,r]of Object.entries(e))t[a]=Array.isArray(r)?[...r]:r;return t}function _e(e){return{...e,query:e.query?ke(e.query):void 0,_backParams:e._backParams?{...e._backParams}:void 0}}function Te(e={},t={}){const a=e=>{const t={};for(const[a,r]of Object.entries(e))me.has(a)||"_back"===a||(t[a]=Array.isArray(r)?r.map(e=>String(e??"")):String(r??""));return t},r=a(e),o=a(t),n=Object.keys(r),l=Object.keys(o);return n.length===l.length&&n.every(e=>{const t=r[e],a=o[e];return Array.isArray(t)||Array.isArray(a)?Array.isArray(t)&&Array.isArray(a)&&t.length===a.length&&t.every((e,t)=>e===a[t]):t===a})}function we(e={}){const t={};for(const[a,r]of Object.entries(e))me.has(a)||(t[a]=Array.isArray(r)?[...r]:r);return t}var Se=/* @__PURE__ */function(e){return e.WHEEL="wheel",e.BUTTON="button",e.BOTH="both",e}({}),Ie=class{items;constructor(e){this.items=e?[...e]:[]}push(e){this.items.push(e)}pop(){return this.items.pop()}peek(){return this.items.length>0?this.items[this.items.length-1]:void 0}at(e){return this.items[e]}isEmpty(){return 0===this.items.length}size(){return this.items.length}clear(){this.items.length=0}list(){return[...this.items]}readonlyList(){return this.items}toJSON(){return this.list()}toString(){return this.items.toString()}};function Ae(e){if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return(null===t||t===Object.prototype||null===Object.getPrototypeOf(t))&&(!(Symbol.iterator in e)&&(!(Symbol.toStringTag in e)||"[object Module]"===Object.prototype.toString.call(e)))}function xe(e,t,a=".",r){if(!Ae(t))return xe(e,{},a,r);const o={...t};for(const n of Object.keys(e)){if("__proto__"===n||"constructor"===n)continue;const t=e[n];null!=t&&(r&&r(o,n,t,a)||(Array.isArray(t)&&Array.isArray(o[n])?o[n]=[...t,...o[n]]:Ae(t)&&Ae(o[n])?o[n]=xe(t,o[n],(a?`${a}.`:"")+n.toString(),r):o[n]=t))}return o}function Re(e){return(...t)=>t.reduce((t,a)=>xe(t,a,"",e),{})}var Ce=Re(),Pe=(Re((e,t,a)=>{if(void 0!==e[t]&&"function"==typeof a)return e[t]=a(e[t]),!0}),Re((e,t,a)=>{if(Array.isArray(e[t])&&"function"==typeof a)return e[t]=a(e[t]),!0}),e=>"object"==typeof e&&null!==e&&!Array.isArray(e)),Ee={id:"",title:"",iframe:!1,closable:!0,refreshable:!0,iframeRefreshMode:"postMessage"},Le=e=>{const t={version:1,id:e.id,title:e.title,iframe:e.iframe,closable:e.closable,refreshable:e.refreshable,iframeRefreshMode:"reload"===e.iframeRefreshMode?"reload":"postMessage"};return a=JSON.stringify(t),encodeURIComponent(btoa(encodeURIComponent(a)));var a},Me=e=>{if(e.length>4096)return{...Ee};try{const a=(e=>decodeURIComponent(atob(decodeURIComponent(e))))(e);return a.length>2048?{...Ee}:a.trim().startsWith("{")?(t=JSON.parse(a),Pe(t)?{id:"string"==typeof t.id?t.id:Ee.id,title:"string"==typeof t.title?t.title:Ee.title,iframe:"boolean"==typeof t.iframe?t.iframe:Ee.iframe,closable:"boolean"==typeof t.closable?t.closable:Ee.closable,refreshable:"boolean"==typeof t.refreshable?t.refreshable:Ee.refreshable,iframeRefreshMode:"reload"===t.iframeRefreshMode?"reload":"postMessage"}:{...Ee}):(e=>{const t=e.split("|"),a="R"===t[5]?"reload":"postMessage";return{id:t[0]??"",title:t[1]??"",iframe:"Y"===t[2],closable:"Y"===t[3],refreshable:"Y"===t[4],iframeRefreshMode:a}})(a)}catch{return{...Ee}}var t},Oe=()=>crypto.randomUUID();var Ve=Symbol("stackTabsContext"),We=Symbol("stackTabsMaximum"),Be=null,qe=!1,Fe=/* @__PURE__ */new WeakSet,je=(e={})=>{const t={tabs:C([]),defaultTabs:C([]),caches:O([]),components:/* @__PURE__ */new Map,cacheIdsToEvict:/* @__PURE__ */new Set,tabIdsToEvict:/* @__PURE__ */new Set,refreshKey:C(0),scrollPositionsByPageId:/* @__PURE__ */new Map,isInitialized:C(!1),iframeRefreshKeys:C({}),maxTabCount:C(0),useGlobalScroll:C(!1),sessionPrefix:C("")};return{...t,maxTabCount:C(e.maxTabCount??t.maxTabCount.value),useGlobalScroll:C(e.useGlobalScroll??t.useGlobalScroll.value),sessionPrefix:C(e.sessionPrefix??t.sessionPrefix.value),iframePath:C(e.iframePath??""),eventBus:{all:a=a||/* @__PURE__ */new Map,on:function(e,t){var r=a.get(e);r?r.push(t):a.set(e,[t])},off:function(e,t){var r=a.get(e);r&&(t?r.splice(r.indexOf(t)>>>0,1):a.set(e,[]))},emit:function(e,t){var r=a.get(e);r&&r.slice().map(function(e){e(t)}),(r=a.get("*"))&&r.slice().map(function(a){a(e,t)})}}};var a},De=()=>{const e=(b()?m(Ve,null):null)??Be;if(!e)throw new Error("VueStackTabs runtime context is not available. Render <VueStackTabs> before using vue-stack-tabs composables.");return e},Ne=/* @__PURE__ */function(e){return e.PAGE_LOADING="PAGE_LOADING",e.TAB_ACTIVE="TAB_ACTIVE",e.FORWARD="FORWARD",e.BACKWARD="BACKWARD",e.REFRESH_IFRAME_POSTMESSAGE="REFRESH_IFRAME_POSTMESSAGE",e}({}),Ke=Symbol("tabEmitter"),$e=()=>(b()?m(Ke,null):null)??De().eventBus,ze=["aria-label"],Ge=/* @__PURE__ */d({__name:"PageLoading",props:{tabId:{}},setup(e){const t=e,{t:a}=ne(),r=$e(),o=C(!1),n=e=>{e.tId===t.tabId&&(o.value=e.value)};return r.on(Ne.PAGE_LOADING,n),S(()=>{r.off(Ne.PAGE_LOADING,n)}),(e,t)=>o.value?(I(),i("div",{key:0,class:"stack-tab-loading-mask",role:"status","aria-live":"polite","aria-label":q(a)("VueStackTab.loading"),style:g({zIndex:q(fe)(".cache-page-wrapper *")})},[...t[0]||(t[0]=[c("div",{class:"stack-tab-loading--spin turn","aria-hidden":"true"},null,-1)])],12,ze)):s("",!0)}}),Ue=async e=>{const t=e.apply();try{const a=await e.navigate();if(e.isFailureResult?.(a)){if(e.isCurrent?.()??1?e.rollback(t):e.cleanupStale?.(),e.rejectFailureResult)throw a;return a}return(e.isCurrent?.()??1)&&e.commit?.(),a}catch(a){throw e.isCurrent?.()??1?e.rollback(t):e.cleanupStale?.(),a}},He=e=>e.startsWith("#")?document.getElementById(e.slice(1)):document.querySelector(e),Xe=e=>{const t=()=>e.sessionPrefix.value+"stacktab-active-tab";let a=null,r=0,o=!1;const n=()=>{o=!1;const e=a;a=null,e&&e.version===r&&window.sessionStorage.setItem(t(),JSON.stringify(e.tab))},l=()=>{r++,a=null},s=()=>{l(),window.sessionStorage.removeItem(t())};return{getSessionKey:t,saveActiveTabToSession:e=>{e.id&&(a={tab:e,version:++r},o||(o=!0,queueMicrotask(n)))},clearSession:s,restoreActiveTabSession:e=>{null!==e?(l(),window.sessionStorage.setItem(t(),e)):s()},restoreTabFromSession:e=>{if(null==e)return null;try{const a=JSON.parse(e,(e,t)=>"pages"===e&&Array.isArray(t)?new Ie(t):t);return Pe(t=a)&&"string"==typeof t.id&&"string"==typeof t.title&&"boolean"==typeof t.closable&&"boolean"==typeof t.refreshable&&"boolean"==typeof t.iframe&&"boolean"==typeof t.active&&t.pages instanceof Ie?a:(s(),null)}catch{return s(),null}var t}}},Je=e=>{const{tabs:t,iframeRefreshKeys:a,getTab:r,createPageId:o,addCache:n,evictPageCache:l,replacePageCaches:s,refreshIframeByPostMessage:i}=e,c=(e,t,a)=>{const r=e.pages.peek();if(!r)return;if(e.active)return void(r.refreshVersion=(r.refreshVersion??0)+1);const s=r.id;if(r.id=o(),r.refreshVersion=0,t&&a)return t.push(s),void a.push(r.id);l(s),n(r.id)};return{refreshTab:e=>{const t=r(e);t?.refreshable&&(t.iframe?(e=>{"reload"!==e.iframeRefreshMode?i(e.id):a.value={...a.value,[e.id]:(a.value[e.id]??0)+1}})(t):c(t))},refreshAllTabs:()=>{const e=[],r=[],o={...a.value};let n=!1;for(const a of t.value)a.refreshable&&(a.iframe?"reload"===a.iframeRefreshMode?(o[a.id]=(o[a.id]??0)+1,n=!0):i(a.id):c(a,e,r));n&&(a.value=o),s(e,r)}}},Ye=/* @__PURE__ */d({name:"StackTabEmptyPlaceholder",setup:()=>()=>null}),Qe=(e,t)=>({...ke(e.query),__tab:e.query.__tab??Le(t)}),Ze=e=>{const t=e.matched[e.matched.length-1]?.path??e.path,a=e.path.endsWith("/")?e.path.slice(0,-1):e.path;return t===a?a:e.path},et=()=>{const e=G(),t=$e(),{t:a}=ne(),r=De(),{tabs:l,defaultTabs:s,caches:i,components:c,tabIdsToEvict:f,refreshKey:b,iframeRefreshKeys:m,isInitialized:p,cacheIdsToEvict:v}=r,{markCacheForEviction:h,markTabPagesForEviction:g,markTabPagesForEvictionOnly:k,addCache:_,removeCache:I,evictMarkedCaches:A,evictPageCache:x,replacePageCaches:R}=(e=>{const{caches:t,components:a,cacheIdsToEvict:r,tabIdsToEvict:o}=e,n=new Set(t.value);let l=t.value;const s=()=>{if(l!==t.value){l=t.value,n.clear();for(const e of l)n.add(e)}},i=e=>{r.add(e)},c=e=>{if(s(),n.has(e)){n.delete(e);const a=l.indexOf(e);a>=0&&l.splice(a,1),B(t)}};return{markCacheForEviction:i,markTabPagesForEviction:e=>{for(const t of e.pages.list())i(t.id);o.add(e.id)},markTabPagesForEvictionOnly:e=>{for(const t of e.pages.list())i(t.id)},addCache:e=>{s(),n.has(e)||(n.add(e),l.push(e),B(t))},removeCache:c,evictPageCache:e=>{e&&(r.delete(e),c(e),a.delete(e))},replacePageCaches:(e,o)=>{s();const i=new Set(e);let c=!1;if(i.size>0){for(let e=l.length-1;e>=0;e--){const t=l[e];t&&i.has(t)&&(l.splice(e,1),c=!0)}for(const e of i)n.delete(e),r.delete(e),a.delete(e)}for(const t of o)n.has(t)||(n.add(t),l.push(t),c=!0);c&&B(t)},evictMarkedCaches:()=>{if(r.size<=0)return;s();const e=new Set(r);for(let t=l.length-1;t>=0;t--){const a=l[t];a&&e.has(a)&&l.splice(t,1)}for(const t of e)n.delete(t),a.delete(t);B(t),r.clear()}}})(r),{restoreScroller:P,saveScroller:E,removeScroller:L,addPageScroller:M}=(e=>{const{scrollPositionsByPageId:t}=e;return{restoreScroller:e=>{const a=t.get(e);if(a)for(const[t,r]of a){const e=He(t);e&&(e.scrollTop=r.top,e.scrollLeft=r.left)}},saveScroller:e=>{const a=t.get(e);if(a)for(const t of a.keys()){const e=He(t);a.set(t,{top:e?.scrollTop??0,left:e?.scrollLeft??0})}},removeScroller:e=>{const a=t.get(e);a&&(a.clear(),t.delete(e))},addPageScroller:(e,...a)=>{t.has(e)||t.set(e,/* @__PURE__ */new Map);const r=t.get(e);for(const t of a)r.set(t,{top:0,left:0})}}})(r),{saveActiveTabToSession:V,clearSession:W,restoreTabFromSession:q,restoreActiveTabSession:F,getSessionKey:j}=Xe(r),D=e=>{l.value=[...l.value,e]},N=e=>l.value.find(t=>t.id===e)??null,K=e=>{const r=(e=>{if("string"==typeof e.query.__tab){const t=Me(e.query.__tab);if(t.id)return t}const t=Ze(e),r=l.value.find(e=>e.active),o=r?.pages.peek();return r&&o?.path===t?{id:r.id,title:r.title,closable:r.closable,refreshable:r.refreshable,iframe:r.iframe,iframeRefreshMode:r.iframeRefreshMode}:{id:crypto.randomUUID(),title:a("VueStackTab.undefined"),closable:!0,refreshable:!0,iframe:!1}})(e);if(f.has(r.id))return{empty:!0};const o=Ze(e);let n,s=r.id?N(r.id):null,i=null;if(s&&!s.pages.isEmpty()){const t=s.pages.peek();if(!t)throw new Error("[vue-stack-tabs] Stack is not empty but peek() returned undefined");if(t.path===o)n=t.id;else{const t=s.pages.readonlyList();let a=-1;for(let e=t.length-2;e>=0;e--){const r=t[e];if(r&&r.path===o){a=e;break}}if(-1!==a){const o=t.length-1-a;for(let e=0;e<o;e++){const e=s.pages.pop();e&&x(e.id)}const l=s.pages.peek();n=l?l.id:Oe(),l||(i={id:n,tabId:r.id,path:e.path,query:Qe(e,r)})}else n=Oe(),i={id:n,tabId:r.id,path:e.path,query:Qe(e,r)}}}else n=Oe(),i={id:n,tabId:r.id,path:e.path,query:Qe(e,r)};if(v.has(n)){v.delete(n);const e=c.get(n);if(e)return{recovered:e,cacheName:n}}if(i)s=((e,a,r,o)=>{let n=null;for(const t of l.value)t.active=!1,t.id===e.id&&(n=t);if(null===n){const r=new Ie;r.push(o);const l=a.query.__src;n={id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode??"postMessage",url:he(l),active:!0,pages:r},D(n),t.emit(Ne.TAB_ACTIVE,{id:e.id,isRoute:!1})}else n.active=!0,(n.pages.isEmpty()||n.pages.peek().id!==o.id)&&n.pages.push(o);return n})(r,e,0,i);else{for(const e of l.value)e.active=!1;s.active=!0}return V(s),{cacheName:n,tabInfo:r,targetTab:s}},z=C(""),U=n(()=>l.value.find(e=>e.active)?.pages.peek()?.refreshVersion??0);let H="",X=null;const J=e=>{const t=l.value;for(let a=t.length-1;a>=0;a--){const r=t[a];r&&r.closable&&e(r,a)&&(g(r),r.pages.clear(),t.splice(a,1))}},Y=()=>{const e=l.value;if(J(()=>!0),e.some(e=>e.active))return A(),void f.clear();const a=e[e.length-1];a&&t.emit(Ne.TAB_ACTIVE,{id:a.id})},{refreshTab:Q,refreshAllTabs:Z}=Je({tabs:l,iframeRefreshKeys:m,getTab:N,createPageId:Oe,addCache:_,evictPageCache:x,replacePageCaches:R,refreshIframeByPostMessage:e=>t.emit(Ne.REFRESH_IFRAME_POSTMESSAGE,e)});return{tabs:l,caches:i,refreshKey:b,activeCacheKey:z,activePageRefreshVersion:U,isInitialized:p,setMaxSize:e=>{r.maxTabCount.value=e},canAddTab:()=>r.maxTabCount.value<=0||r.maxTabCount.value>0&&r.maxTabCount.value>l.value.length,initialize:e=>{const t=[],a=[];for(const o of e){const e=Ce(o,{id:crypto.randomUUID(),refreshable:!0,closable:!0,iframe:!1}),r=e.id??crypto.randomUUID();e.id=r;const n=ye(e.path),l=Oe(),s={id:l,tabId:r,path:n.path,query:Ce(we(n.query),{__tab:Le(e)})},i=new Ie;i.push(s);const c={id:r,title:e.title??"",closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:"reload"===e.iframeRefreshMode?"reload":"postMessage",active:!1,pages:i};_(l),t.push(c),a.push({...c})}s.value=[...s.value,...t],l.value=[...l.value,...a];const r=q(sessionStorage.getItem(j()));r&&!l.value.some(e=>e.id===r.id)&&(r.url&&(r.url=ve(r.url)),r.iframe&&r.url&&void 0===r.iframeRefreshMode&&(r.iframeRefreshMode=ge(r.url)?"reload":"postMessage"),r.pages&&"function"==typeof r.pages.list&&r.pages.list().forEach(e=>{e&&e.id&&_(e.id)}),l.value=[...l.value,r]),p.value=!0},size:()=>l.value.length,active:(a,r=!0)=>{t.emit(Ne.FORWARD);const o=N(a);if(!o)return Promise.resolve();if(o.active)return Promise.resolve();const n=o.pages.peek(),s=()=>{for(const e of l.value)e.active=e.id===a;V(o),l.value=l.value.slice()};if(!r)return s(),Promise.resolve();if(!n)return s(),Promise.resolve();const i=Ce({__tab:Le({id:o.id,title:o.title,closable:o.closable,refreshable:o.refreshable,iframe:o.iframe})},n.query||{});return Ue({apply:()=>{const e=l.value.find(e=>e.active)?.id,t=window.sessionStorage.getItem(j());return s(),{prevActiveId:e,sessionSnapshot:t}},navigate:()=>e.push({path:n.path,query:i}),rollback:e=>{for(const t of l.value)t.active=t.id===e.prevActiveId;l.value=l.value.slice(),F(e.sessionSnapshot)},isFailureResult:$,rejectFailureResult:!0})},getCacheName:()=>Oe(),destroy:()=>{l.value=[],s.value=[],v.clear(),f.clear(),m.value={},i.value=[],c.clear(),r.scrollPositionsByPageId.clear(),r.isInitialized.value=!1,r.refreshKey.value=0,W()},reset:()=>Y(),addCache:_,removeCache:I,getTab:N,addTab:D,removeTab:e=>{let a="";const r=N(e),o=l.value,n=o.findIndex(t=>t?.id===e);if(n<0)return"";const s=o[n];return s.closable?(g(s),s.pages.clear(),o.length>1&&s.active&&(a=(0===n?o[1]:o[n-1])?.id??""),o.splice(n,1),a&&t.emit(Ne.TAB_ACTIVE,{id:a}),r?.active||(A(),f.clear()),a):e},removeAllTabs:Y,removeLeftTabs:e=>{const a=l.value,r=a.findIndex(t=>t?.id===e);if(r<=0)return;if(J((e,t)=>t<r),a.some(e=>e.active))return A(),void f.clear();const o=a[0];o&&t.emit(Ne.TAB_ACTIVE,{id:o.id})},removeRightTabs:e=>{const a=l.value,r=a.findIndex(t=>t?.id===e);if(r<0||r>=a.length-1)return;if(J((e,t)=>t>r),a.some(e=>e.active))return A(),void f.clear();const o=a[a.length-1];o&&t.emit(Ne.TAB_ACTIVE,{id:o.id})},removeOtherTabs:e=>{const a=l.value.find(t=>t.id===e);J(t=>t.id!==e),a&&!a.active?t.emit(Ne.TAB_ACTIVE,{id:e}):(A(),f.clear())},hasTab:e=>l.value.some(t=>t.id===e),renewTab:e=>{const t=N(e.id);if(!t)return;const a=t.pages.list().map(e=>_e(e)),r=[...i.value],o=new Map(c);return k(t),A(),t.pages.clear(),()=>{t.pages.clear();for(const e of a)t.pages.push(_e(e));i.value=[...r],c.clear();for(const[e,t]of o)c.set(e,t)}},addPage:(e,t)=>{if(!t)return Ye;const a=e.fullPath+(e.query.__tab||"");if(a===H&&X)return X;const n=K(e);if("empty"in n)return Ye;if("recovered"in n)return _(n.cacheName),z.value=n.cacheName,H=a,X=n.recovered,n.recovered;z.value=n.cacheName;const l=(e=>{const{cacheName:t,tabInfo:a}=e;if(c.has(t))return _(t),c.get(t);const n=/* @__PURE__ */d({name:t,props:{vnode:{type:Object,required:!1,default:void 0}},emits:["onLoaded"],setup(e,n){const l=C(null),s=O(null),i=O(null),c=O(null),d=()=>{try{const e=N(a.id)?.pages.peek();e&&e.id===t&&e._backParams?(l.value={...e._backParams},delete e._backParams):l.value=null}catch{l.value=null}};return w(()=>{n.emit("onLoaded"),M(t,`#W-${t}`),d()}),T(()=>E(t)),y(()=>{n.emit("onLoaded"),P(t),A(),f.clear(),d()}),S(()=>L(t)),()=>{const n=e.vnode,d=l.value;if(n!==s.value||d!==c.value){const e=d?{_back:d}:{};i.value=n?o(n,{tId:a.id,pId:t,...e}):null,s.value=n,c.value=d}return u("div",{class:"cache-page-wrapper",id:`W-${t}`,style:[r.useGlobalScroll.value?"overflow:auto":"overflow:hidden","height: 100%"]},[i.value,u(Ge,{tabId:a.id},null)])}}});return c.set(t,n),_(t),n})(n);return H=a,X=l,l},addComponent:(e,t)=>c.set(e,t),getComponent:e=>c.get(e),removeComponent:e=>c.delete(e),markCacheForEviction:h,evictMarkedCaches:A,evictPageCache:x,refreshTab:Q,refreshAllTabs:Z,iframeRefreshKeys:m,addPageScroller:M,setGlobalScroll:e=>{r.useGlobalScroll.value=e},clearSession:W,setSessionPrefix:e=>{r.sessionPrefix.value=e}}};function tt(){const e=G(),t=De(),{active:a,hasTab:r,refreshKey:o,reset:n,canAddTab:l,renewTab:s,getTab:i,tabs:c,removeTab:u,removeAllTabs:d,refreshTab:f,refreshAllTabs:b}=et(),m=(a,r)=>{const o=Le(r);let n,l=Ce(we(a.query),{__tab:o});if(a.iframe)l={...l,__src:encodeURIComponent(a.path),__tab:o},n=t.iframePath.value;else{const e=ye(a.path);n=e.path,l=Ce(we(e.query),l,{__tab:o}),l={...l,__tab:o}}return pe(a.path)?Ue({apply:()=>{},navigate:()=>e.push({path:n,query:l}),rollback:()=>{},isFailureResult:$,rejectFailureResult:!0}):Promise.reject(/* @__PURE__ */new Error("Invalid tab URL"))};return{openTab:(e,t=!1)=>new Promise((n,c)=>{const u=(e=>{const t={refreshable:!0,closable:!0,iframe:!1};e.iframe&&void 0===e.iframeRefreshMode?t.iframeRefreshMode=ge(e.path??"")?"reload":"postMessage":e.iframe&&(t.iframeRefreshMode=e.iframeRefreshMode??"postMessage");const a=Ce(e,t);return a.id||(a.id=crypto.randomUUID()),a})(e),d=Boolean(u.id&&r(u.id));if(d&&!t)return void Promise.resolve(a(u.id)).then(()=>n(u.id),c);let f,b;if(u.id&&t&&d){const t=i(e.id);f=s(e),t?.active&&(b=o.value,o.value++)}d||l()?m(e,u).then(()=>n(u.id),e=>{f?.(),void 0!==b&&(o.value=b),c(e)}):c(/* @__PURE__ */new Error("Max Size"))}),closeTab:u,closeAllTabs:d,refreshTab:f,refreshAllTabs:b,activeTab:a,reset:n,tabs:c,setIFramePath:e=>{t.iframePath.value=e},getWrapper:()=>document.getElementsByClassName("cache-page-wrapper")[0],openInNewWindow:e=>{const t=i(e);t?.iframe&&t.url&&pe(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")}}}var at=["disabled"],rt=(e,t)=>{const a=e.__vccOpts||e;for(const[r,o]of t)a[r]=o;return a},ot=/* @__PURE__ */rt(/* @__PURE__ */d({__name:"ContextMenuItem",props:{icon:{default:""},title:{},disabled:{type:Boolean,default:!1}},setup:e=>(t,a)=>(I(),i("button",{type:"button",role:"menuitem",class:"stack-tab__contextmenu-item",disabled:e.disabled},[c("span",{class:h(["stack-tab__contextmenu-icon",e.icon]),"aria-hidden":"true"},null,2),c("span",{class:"stack-tab__contextmenu-title",onContextmenu:a[0]||(a[0]=K(()=>{},["prevent"]))},V(e.title),33)],8,at))}),[["__scopeId","data-v-3d616fa0"]]),nt={key:1,class:"divider div-transparent",role:"separator","aria-orientation":"horizontal"},lt=/* @__PURE__ */rt(/* @__PURE__ */d({__name:"index",props:{index:{},left:{default:0},top:{default:0},contextMenu:{default:()=>[]},restoreFocusElement:{default:null},tabItem:{},max:{}},emits:["close"],setup(t,{emit:a}){const r=t,o=a,{t:n}=ne(),c=C(),d=x({left:r.left,top:r.top}),{closeTab:f,closeAllTabs:b,refreshTab:m,refreshAllTabs:p,openInNewWindow:h}=tt(),{removeLeftTabs:y,removeRightTabs:k,removeOtherTabs:_}=et(),T=()=>{r.restoreFocusElement&&document.contains(r.restoreFocusElement)?r.restoreFocusElement.focus():document.querySelector('[role="tab"][aria-selected="true"]')?.focus()},S=()=>{o("close"),v(T)},A=e=>{e?.(),S()},R=()=>{const e=c.value;return e?Array.from(e.querySelectorAll('[role="menuitem"]')).filter(e=>!e.disabled):[]},E=e=>{const t=R();t.length<=0||t[(e+t.length)%t.length]?.focus()},L=()=>R().findIndex(e=>e===document.activeElement),M=e=>{if("Escape"===e.key)return e.preventDefault(),void S();if("ArrowDown"===e.key){e.preventDefault();const t=L();return void E(-1===t?0:t+1)}if("ArrowUp"===e.key){e.preventDefault();const t=L();return void E(-1===t?-1:t-1)}if("Home"===e.key)return e.preventDefault(),void E(0);"End"===e.key&&(e.preventDefault(),E(R().length-1))},O=e=>e.key??`${e.title}-${e.icon??""}`;return w(()=>{const e=c.value?.clientWidth??0;d.left+e>window.innerWidth&&(d.left=window.innerWidth-e-5),E(0)}),(a,r)=>(I(),i("div",{ref_key:"menuElementRef",ref:c,class:"stack-tab__contextmenu",role:"menu",tabindex:"-1",style:g({left:`${d.left}px`,top:`${d.top}px`,"z-index":q(fe)(".stack-tab,.stack-tab *")}),onKeydown:M},[u(ot,{icon:"stack-tab__icon-reload svg-mask",title:q(n)("VueStackTab.reload"),disabled:!t.tabItem.refreshable,onClick:r[0]||(r[0]=e=>A(()=>q(m)(t.tabItem.id)))},null,8,["title","disabled"]),u(ot,{icon:"stack-tab__icon-reload-all svg-mask",title:q(n)("VueStackTab.reloadAll"),onClick:r[1]||(r[1]=e=>A(q(p)))},null,8,["title"]),u(ot,{icon:"stack-tab__icon-close svg-mask",title:q(n)("VueStackTab.close"),disabled:!t.tabItem.closable,onClick:r[2]||(r[2]=e=>A(()=>q(f)(t.tabItem.id)))},null,8,["title","disabled"]),u(ot,{icon:"stack-tab__icon-close-lefts svg-mask",title:q(n)("VueStackTab.closeLeft"),disabled:t.index<=0,onClick:r[3]||(r[3]=e=>A(()=>q(y)(t.tabItem.id)))},null,8,["title","disabled"]),u(ot,{icon:"stack-tab__icon-close-rights svg-mask",title:q(n)("VueStackTab.closeRight"),disabled:t.index>=t.max-1,onClick:r[4]||(r[4]=e=>A(()=>q(k)(t.tabItem.id)))},null,8,["title","disabled"]),u(ot,{icon:"stack-tab__icon-close-others svg-mask",title:q(n)("VueStackTab.closeOthers"),onClick:r[5]||(r[5]=e=>A(()=>q(_)(t.tabItem.id)))},null,8,["title"]),u(ot,{icon:"stack-tab__icon-close-all svg-mask",title:q(n)("VueStackTab.closeAll"),onClick:r[6]||(r[6]=e=>A(q(b)))},null,8,["title"]),t.tabItem.iframe&&t.tabItem.url?(I(),l(ot,{key:0,icon:"stack-tab__icon-open svg-mask",title:q(n)("VueStackTab.openInNewWindow"),onClick:r[7]||(r[7]=e=>A(()=>q(h)(t.tabItem.id)))},null,8,["title"])):s("",!0),void 0!==t.contextMenu&&t.contextMenu.length>0?(I(),i("div",nt)):s("",!0),(I(!0),i(e,null,P(t.contextMenu,e=>(I(),l(ot,{key:O(e),"data-menu-key":O(e),icon:e.icon,title:e.title,disabled:e.disabled(t.tabItem),onClick:a=>A(()=>!e.disabled(t.tabItem)&&e.callback(t.tabItem.id))},null,8,["data-menu-key","icon","title","disabled","onClick"]))),128))],36))}}),[["__scopeId","data-v-f6a9b3bf"]]),st=e=>`stack-tab-tab-${encodeURIComponent(e)}`,it=e=>`stack-tab-panel-${encodeURIComponent(e)}`,ct=["id","data-tab-id","aria-controls","aria-selected","tabindex","title"],ut={class:"stack-tab__item-title"},dt={class:"stack-tab__item-title-content"},ft=["title","aria-label","tabindex"],bt=/* @__PURE__ */d({__name:"TabHeaderItem",props:{item:{}},emits:["close","active","contextmenu"],setup(e,{emit:t}){const a=t,r=$e(),{t:o}=ne(),l=C(),u=e,d=e=>{u.item.id===e.id&&m(e.isRoute??!0)};r.on(Ne.TAB_ACTIVE,d),S(()=>{r.off(Ne.TAB_ACTIVE,d)});const f=n(()=>u.item.title||o("VueStackTab.undefined")),b=()=>{a("close",u.item)},m=(e=!0)=>{a("active",u.item,l.value,e)},p=e=>{if("Enter"===e.key||" "===e.key)return e.preventDefault(),void m(!0);"Delete"!==e.key&&"Backspace"!==e.key||!u.item.closable||(e.preventDefault(),b())};return(t,a)=>(I(),i("li",{ref_key:"tabElementRef",ref:l,role:"presentation",class:h(["stack-tab__item",{"is-active":e.item.active,"is-icon":e.item.closable}]),onClick:a[1]||(a[1]=K(e=>m(!0),["self"])),onContextmenu:a[2]||(a[2]=e=>t.$emit("contextmenu",e))},[c("button",{id:q(st)(e.item.id),type:"button",role:"tab",class:"stack-tab__item-tab","data-tab-id":e.item.id,"aria-controls":q(it)(e.item.id),"aria-selected":e.item.active?"true":"false",tabindex:e.item.active?0:-1,title:f.value,onClick:a[0]||(a[0]=e=>m(!0)),onKeydown:p},[c("span",ut,[c("span",dt,V(f.value),1)])],40,ct),e.item.closable?(I(),i("button",{key:0,type:"button",class:"stack-tab__icon-close-fill stack-tab__item-button",title:q(o)("VueStackTab.close"),"aria-label":`${q(o)("VueStackTab.close")} ${f.value}`,tabindex:e.item.active?0:-1,onClick:K(b,["stop"])},null,8,ft)):s("",!0)],34))}}),mt=["disabled","title","aria-label"],pt={key:1,class:"stack-tab__button"},vt=/* @__PURE__ */d({__name:"TabHeaderButton",props:{disabled:{type:Boolean,default:!1},shadow:{default:null},iconClass:{default:""},title:{default:""},ariaLabel:{default:""}},setup(e){const t=e,a=n(()=>t.ariaLabel||t.title);return(t,r)=>(I(),i("button",{type:"button",class:h(["stack-tab__header-button",{"stack-tab__shadow-right":"right"===e.shadow,"stack-tab__shadow-left":"left"===e.shadow}]),disabled:e.disabled,title:e.title,"aria-label":a.value},["icon"in t.$slots?s("",!0):(I(),i("span",{key:0,class:h(["stack-tab__mask-button",e.iconClass])},null,2)),"icon"in t.$slots?(I(),i("span",pt,[E(t.$slots,"icon")])):s("",!0)],10,mt))}}),ht=/* @__PURE__ */d({__name:"TabHeaderScroll",props:{space:{default:300},isScrollWheel:{type:Boolean,default:!0},isScrollButton:{type:Boolean,default:!0}},setup(t,{expose:a}){const{t:r}=ne(),o=C(null),u=C(null),d=C(null),f=C(!1),b=C(!1),m=C(!1),p=C(!1),v=C(),y=t,k=x({clientWidth:0,scrollWidth:0,scrollLeft:0}),_=x({thumbLeft:0,startScrollLeft:0,startThumbLeft:0,startPageX:0});j(k,e=>{T(e)}),j(()=>y.isScrollButton,()=>T(k));const T=e=>{const t=e.scrollWidth>e.clientWidth;b.value=e.scrollLeft<=10,m.value=e.clientWidth+e.scrollLeft-e.scrollWidth>=-10,p.value=y.isScrollButton&&t},A=n(()=>k.scrollWidth>k.clientWidth),R=n(()=>{if(!A.value)return 0;const{clientWidth:e,scrollWidth:t}=k;return e/t*e}),P=n(()=>{if(!A.value)return 0;const{clientWidth:e,scrollWidth:t,scrollLeft:a}=k;return(e-R.value)*(a/(t-e))}),L=()=>{if(!o.value)return;const{clientWidth:e,scrollWidth:t,scrollLeft:a}=o.value;Object.assign(k,{clientWidth:e,scrollWidth:t,scrollLeft:a})},M=()=>{const e=o.value?.querySelector(".stack-tab__item.is-active");e&&!H(e)&&U(e)};let O=null,V=null;const W=(e,t=!0)=>{de({wrap:o.value,left:e,top:0,smooth:t})},B=e=>{W(o.value.scrollLeft+e)},D=e=>{if(!y.isScrollWheel||!o.value)return;const t=e.deltaY<0;W(o.value.scrollLeft+(t?-y.space:y.space))},$=e=>{Object.assign(_,{startPageX:e.pageX,startScrollLeft:o.value?.scrollLeft,startThumbLeft:P.value,thumbLeft:P.value}),f.value=!0,document.addEventListener("mousemove",z),document.addEventListener("mouseup",G)},z=e=>{const{clientWidth:t,scrollWidth:a}=k;let r=_.startThumbLeft+e.pageX-_.startPageX;const o=t-R.value;r<0?r=0:r>o&&(r=o),_.thumbLeft=r,W(r*(a-t)/(t-R.value),!1),e.preventDefault()},G=()=>{f.value=!1,document.removeEventListener("mousemove",z),document.removeEventListener("mouseup",G)};w(()=>{if("undefined"==typeof ResizeObserver)return;O=new ResizeObserver(()=>{L(),M()}),V=new ResizeObserver(()=>{A.value||M(),L()}),v.value&&O.observe(v.value);const e=o.value?.querySelector(".stack-tab__nav");e&&V.observe(e)}),S(()=>{O?.disconnect(),V?.disconnect(),O=null,V=null});const U=e=>{!function({el:e,wrap:t,block:a="start",inline:r="nearest"}){const o=t&&"object"==typeof t&&"value"in t?t.value:t;if(e&&o)if(e.scrollIntoView)e.scrollIntoView({behavior:"smooth",block:a,inline:r});else{const{offsetLeft:t,offsetTop:n}=e;let l,s;s="center"===a?n+(e.clientHeight-o.clientHeight)/2:n,l="center"===r?t+(e.clientWidth-o.clientWidth)/2:t,de({wrap:o,left:l,top:s})}}({el:e,wrap:o.value,block:"end",inline:"center"})},H=e=>{if(!A.value)return!0;const t=e.offsetLeft,a=o.value.scrollLeft;return!(t<a||t+e.clientWidth>a+o.value.clientWidth)};return a({scrollIntoView:U,isInView:H}),(a,n)=>(I(),i(e,null,[p.value?(I(),l(vt,{key:0,"icon-class":"stack-tab__icon-left-arrow",disabled:b.value,title:q(r)("VueStackTab.scrollLeft"),"aria-label":q(r)("VueStackTab.scrollLeft"),onClick:n[0]||(n[0]=e=>!b.value&&B(-1*t.space))},null,8,["disabled","title","aria-label"])):s("",!0),c("div",{ref_key:"headerScroll",ref:v,class:"stack-tab__scroll",onWheelPassive:D},[c("div",{ref_key:"container",ref:o,class:h(["stack-tab__scroll-container",{"stack-tab__shadow-inset-left":!b.value&&m.value,"stack-tab__shadow-inset-right":!m.value&&b.value,"stack-tab__shadow-inset-all":!b.value&&!m.value}]),onScrollPassive:L},[E(a.$slots,"default")],34),N(c("div",{ref_key:"bar",ref:u,class:h(["stack-tab__scrollbar",{"is-dragging":f.value}])},[c("div",{ref_key:"thumb",ref:d,class:h(["stack-tab__scrollbar-thumb",{"is-dragging":f.value}]),style:g({width:`${R.value}px`,transform:`translateX(${P.value}px)`}),onMousedown:K($,["prevent"])},null,38)],2),[[F,A.value]])],544),p.value?(I(),l(vt,{key:1,"icon-class":"stack-tab__icon-right-arrow",disabled:m.value,title:q(r)("VueStackTab.scrollRight"),"aria-label":q(r)("VueStackTab.scrollRight"),onClick:n[1]||(n[1]=e=>!m.value&&B(t.space))},null,8,["disabled","title","aria-label"])):s("",!0)],64))}}),gt=/* @__PURE__ */d({__name:"index",props:{space:{},tabScrollMode:{default:Se.BOTH},tabTransition:{default:()=>({name:"stack-tab-zoom"})},contextmenu:{type:[Boolean,Object],default:!0},max:{default:20}},emits:["active"],setup(t,{emit:o}){const{t:c}=ne(),d=m(We,C(!1)),f=o,b=C(),h=C(),{shown:g,contextMenuData:y,showContextMenu:k}=(()=>{const e=x({item:{},index:-1,left:0,top:0,max:0}),t=C(!1),a=e=>{e.target.closest?.(".stack-tab__contextmenu")||(t.value=!1,document.removeEventListener("click",a))};return S(()=>{document.removeEventListener("click",a)}),{shown:t,contextMenuData:e,showContextMenu:async(r,o,n,l)=>{t.value=!1,document.removeEventListener("click",a),await v(()=>{const{clientY:s,clientX:i}=r;t.value=!0,Object.assign(e,{item:o,index:n,top:s,left:i,max:l}),v(()=>document.addEventListener("click",a))})}}})(),_=C(null),T=()=>{g.value=!1},w=t,{closeTab:A,activeTab:R,tabs:L}=tt(),M=n(()=>!1!==w.contextmenu),O=n(()=>Array.isArray(w.contextmenu)?w.contextmenu:[]),V=(e,t,a,r)=>{M.value&&(e.preventDefault(),_.value=(e=>{const t=(e.target instanceof Element?e.target:null)?.closest('[role="tab"]');return t||((e.currentTarget instanceof HTMLElement?e.currentTarget:null)?.querySelector('[role="tab"]')??null)})(e),k(e,t,a,r))},W=n(()=>"string"==typeof w.tabTransition?{name:w.tabTransition}:w.tabTransition),B=e=>{const t=L.value[e];var a;t&&(z(t,void 0,!0),a=String(t.id),v(()=>{const e=h.value?.querySelector(`.stack-tab__nav [role="tab"][data-tab-id="${CSS.escape(a)}"]`);e&&(e.focus(),b.value&&!b.value.isInView(e)&&b.value.scrollIntoView(e))}))},F=e=>{const t=L.value.length;if(t<=0)return;const a=L.value.findIndex(e=>e.active),r=a>=0?a:0;return"ArrowRight"===e.key?(e.preventDefault(),void B((r+1)%t)):"ArrowLeft"===e.key?(e.preventDefault(),void B((r-1+t)%t)):"Home"===e.key?(e.preventDefault(),void B(0)):void("End"===e.key&&(e.preventDefault(),B(t-1)))},j=n(()=>w.tabScrollMode===Se.BOTH||w.tabScrollMode===Se.BUTTON),N=n(()=>w.tabScrollMode===Se.BOTH||w.tabScrollMode===Se.WHEEL),$=e=>{e.closable&&A(e.id),g.value=!1},z=(e,t,a)=>{b.value&&t&&v(()=>{b.value.isInView(t)||b.value.scrollIntoView(t)}),Promise.resolve(R(e.id,a)).then(()=>f("active",e.id)).catch(e=>{})};return(o,n)=>(I(),i("div",{ref_key:"headerRef",ref:h,class:"stack-tab__header"},[E(o.$slots,"leftButton"),u(ht,{ref_key:"scrollContainerRef",ref:b,space:t.space,"is-scroll-wheel":N.value,"is-scroll-button":j.value},{default:D(()=>[u(r,p({key:"tab-list-transition",tag:"ul",class:"stack-tab__nav",role:"tablist","aria-orientation":"horizontal"},W.value,{appear:"",onKeydown:F}),{default:D(()=>[(I(!0),i(e,null,P(q(L),(e,t)=>(I(),l(bt,{key:e.id,item:e,onContextmenu:a=>V(a,e,t,q(L).length),onMouseup:K(t=>$(e),["middle","prevent"]),onClose:$,onActive:z},null,8,["item","onContextmenu","onMouseup"]))),128))]),_:1},16)]),_:1},8,["space","is-scroll-wheel","is-scroll-button"]),E(o.$slots,"rightButton"),u(vt,{"icon-class":q(d)?"stack-tab__icon-restore":"stack-tab__icon-fullscreen",title:q(d)?q(c)("VueStackTab.restore"):q(c)("VueStackTab.maximum"),"aria-label":q(d)?q(c)("VueStackTab.restore"):q(c)("VueStackTab.maximum"),onClick:n[0]||(n[0]=e=>d.value=!q(d))},null,8,["icon-class","title","aria-label"]),u(a,{name:"stack-tab-zoom",appear:""},{default:D(()=>[q(g)?(I(),l(lt,{key:"context-menu-transition",left:q(y).left,top:q(y).top,"tab-item":q(y).item,max:q(y).max,index:q(y).index,"context-menu":O.value,"restore-focus-element":_.value,onClose:T},null,8,["left","top","tab-item","max","index","context-menu","restore-focus-element"])):s("",!0)]),_:1})],512))}}),yt=/* @__PURE__ */d({__name:"StackCacheRenderer",props:{route:{},component:{}},setup(e){const t=e,{refreshKey:a,activeCacheKey:r,activePageRefreshVersion:o,addPage:n}=et(),l=O(d({name:"StackCacheRendererEmpty",setup:()=>()=>null}));return j([()=>t.route.fullPath,()=>{return e=t.component,e?.type??e;var e},()=>a.value],()=>{l.value=n(t.route,t.component)},{immediate:!0}),(t,n)=>E(t.$slots,"default",{wrappedComponent:l.value,activeCacheKey:q(r),refreshKey:q(a),activePageRefreshVersion:q(o),component:e.component})}}),kt=/* @__PURE__ */d({__name:"StackKeepAlive",props:{transitionName:{default:"stack-tab-swap"}},emits:["loaded"],setup(e,{emit:r}){const o=r,{caches:n}=et(),s=()=>{o("loaded")};return(r,o)=>{const i=L("router-view");return I(),l(i,null,{default:D(({Component:r,route:o})=>[u(yt,{route:o,component:r},{default:D(({wrappedComponent:r,activeCacheKey:o,activePageRefreshVersion:i,component:c})=>[u(a,{name:e.transitionName,appear:"",mode:"out-in"},{default:D(()=>[(I(),l(t,{include:q(n)},[(I(),l(M(r),{key:`${o}-${i}`,vnode:c,onOnLoaded:s},null,40,["vnode"]))],1032,["include"]))]),_:2},1032,["name"])]),_:1},8,["route","component"])]),_:1})}}}),_t=new Set(["vue-stack-tabs:openTab","openTab"]),Tt=e=>"string"==typeof e||"number"==typeof e||null==e,wt=e=>"boolean"==typeof e?e:void 0,St=e=>{if(!Pe(e))return null;const{id:t,title:a,path:r,query:o,iframe:n,closable:l,refreshable:s,iframeRefreshMode:i}=e;if("string"!=typeof a||""===a.trim())return null;if("string"!=typeof r||""===r.trim()||!pe(r))return null;const c=(e=>{if(!Pe(e))return;const t={};for(const[a,r]of Object.entries(e))(Tt(r)||Array.isArray(r)&&r.every(Tt))&&(t[a]=r);return Object.keys(t).length>0?t:void 0})(o),u=wt(n),d=wt(l),f=wt(s),b=(e=>{if("reload"===e||"postMessage"===e)return e})(i);return{..."string"==typeof t&&t?{id:t}:{},title:a,path:r,...c?{query:c}:{},...void 0!==u?{iframe:u}:{},...void 0!==d?{closable:d}:{},...void 0!==f?{refreshable:f}:{},...b?{iframeRefreshMode:b}:{}}};function It(e){const{tabs:t,iframeRefreshKeys:a,iframeLoadTimeout:r,t:o}=e,l=n(()=>t.value.filter(e=>e.iframe)),s=n(()=>t.value.find(e=>e.active&&!e.iframe)),i=n(()=>Boolean(s.value)),c=x({}),u=e=>a.value[e]??0,d=(e,t=u(e.id))=>{const a=ve(e.url??"");return((e,t)=>{if(t<=0||"about:blank"===e)return e;const a=e.indexOf("#"),r=a>=0?e.slice(0,a):e,o=a>=0?e.slice(a):"",n=r.indexOf("?"),l=n>=0?r.slice(0,n):r,s=n>=0?r.slice(n+1):"",i=new URLSearchParams(s);return i.set("__stack_tabs_refresh",String(t)),`${l}?${i.toString()}${o}`})(c[e.id]?a:"about:blank",t)},f=n(()=>{const e={};for(const t of l.value){const a=u(t.id);e[t.id]=d(t,a)}return e}),b=x({}),m=e=>b[e]??{status:"idle"},p=/* @__PURE__ */new Map,v=e=>{const t=p.get(e);t&&(clearTimeout(t),p.delete(e))},h=(e,t={})=>{("loaded"!==m(e).status||t.force)&&(v(e),b[e]={status:"loading"},p.set(e,setTimeout(()=>{p.delete(e),"loading"===m(e).status&&(b[e]={status:"timeout",message:o("VueStackTab.iframeLoadTimeout")})},r)))},g=x({});j(()=>l.value.map(e=>({id:e.id,active:e.active})),e=>{for(const a of e)a.active&&(c[a.id]=!0,h(a.id));const t=new Set(e.map(e=>e.id));for(const a of Object.keys(b))t.has(a)||(v(a),delete b[a],delete c[a],delete g[a])},{immediate:!0}),j(a,(e,t={})=>{for(const a of l.value)a.active&&(e[a.id]??0)!==(t[a.id]??0)&&h(a.id,{force:!0})},{deep:!0});return _(()=>{for(const e of p.values())clearTimeout(e);p.clear()}),{iframeTabs:l,activeNonIframeTab:s,hasActiveNonIframeTab:i,iframeSrcMap:f,getIframeRefreshKey:u,getIframeKey:e=>`${e.id}-${u(e.id)}`,getIframeLoadState:m,shouldShowIframeLoading:e=>"loading"===m(e).status,shouldShowIframeError:e=>"timeout"===m(e).status,retryIframe:e=>{b[e]={status:"idle"},a.value={...a.value,[e]:(a.value[e]??0)+1},h(e,{force:!0})},setIframeRef:(e,t)=>{t?g[e]=t:delete g[e]},handleIframeLoad:(e,t)=>{const a=t.currentTarget,r=Number(a?.dataset.refreshKey??0);var o;c[e.id]&&("about:blank"!==d(e,r)&&r===u(e.id)&&a===g[e.id]&&(o=e.id,v(o),b[o]={status:"loaded"}))},handleRefreshIframePostMessage:e=>{const a=g[e],r=t.value.find(t=>t.id===e);if(a?.contentWindow)try{const e=((e,t)=>{if(!e||!pe(e))return null;try{const a=t??("undefined"!=typeof window?window.location.origin:void 0);if(!a&&!/^https?:\/\//i.test(e))return null;const r=new URL(e,a);if("http:"===r.protocol||"https:"===r.protocol)return r.origin}catch{return null}return null})(r?.url??"");if(!e)return;a.contentWindow.postMessage({type:"vue-stack-tabs:refresh"},e)}catch(o){}},createMessageHandler:(e,t)=>{const a=e=>Object.values(g).some(t=>t?.contentWindow===e);return r=>{if(!e.value.includes(r.origin))return;const o=((e,t)=>{if(!t(e.source))return null;if(!Pe(e.data))return null;const a=e.data;return"string"==typeof a.type&&_t.has(a.type)?St(a.payload):null})(r,a);o&&t(o).catch(e=>{})}}}}var At={class:"stack-tab__container"},xt=["id","role","aria-labelledby","aria-hidden","hidden"],Rt={class:"stack-tab__iframes"},Ct=["id","aria-labelledby"],Pt=["aria-label"],Et={class:"stack-tab__iframe-loading-text"},Lt={key:1,class:"stack-tab__iframe-error",role:"alert"},Mt={class:"stack-tab__iframe-error-text"},Ot=["onClick"],Vt=["onClick"],Wt=["src","data-refresh-key","title","sandbox","referrerpolicy","allow","onLoad"],Bt=/* @__PURE__ */d({__name:"StackTabs",props:{defaultTabs:{default:()=>[]},max:{default:20},contextmenu:{type:[Boolean,Object],default:!0},pageTransition:{default:"stack-tab-swap"},pageTransitionBack:{default:"stack-tab-swap-back"},tabTransition:{default:"stack-tab-zoom"},tabScrollMode:{default:Se.BOTH},width:{default:"100%"},height:{default:"100%"},i18n:{default:void 0},space:{default:300},globalScroll:{type:Boolean,default:!1},iframePath:{},sessionPrefix:{default:""},iframeAllowedOrigins:{default:()=>[]},iframeSandbox:{default:"allow-scripts allow-forms allow-popups allow-downloads allow-same-origin"},iframeReferrerPolicy:{default:"strict-origin-when-cross-origin"},iframeAllow:{default:""},iframeLoadTimeout:{default:15e3}},emits:["onActive","onPageLoaded"],setup(t,{emit:r}){const o=r,d=t,{changeLocale:b,t:p}=ne(),v=m(Ve,null)??je({iframePath:d.iframePath,maxTabCount:d.max,useGlobalScroll:d.globalScroll,sessionPrefix:d.sessionPrefix}),y=f()?.appContext.app,T=((e,t={})=>{if(Be||(Be=e),t.app&&!Fe.has(t.app))return Fe.add(t.app),!0;if(!t.app&&Be===e&&!qe)return qe=!0,!0;if(t.isProduction??1)return!1;throw new Error("VueStackTabs only supports one <VueStackTabs> instance per Vue app.")})(v,y?{app:y}:void 0);T&&(A(Ve,v),A(Ke,v.eventBus));const w=C(!1),S=C();T&&A(We,w),j(w,e=>{S.value=e?fe("body *:not(.stack-tab,.stack-tab *)"):void 0});const{tabs:x,iframeRefreshKeys:R,destroy:L,initialize:M,setMaxSize:O,setGlobalScroll:W,setSessionPrefix:B}=T?et():{tabs:v.tabs,iframeRefreshKeys:v.iframeRefreshKeys,destroy:()=>{},initialize:()=>{},setMaxSize:()=>{},setGlobalScroll:()=>{},setSessionPrefix:()=>{}},{setIFramePath:K,openTab:$,openInNewWindow:z}=T?tt():{setIFramePath:()=>{},openTab:()=>Promise.resolve(void 0),openInNewWindow:()=>{}};T&&(K(d.iframePath),W(d.globalScroll),O(d.max),((e,t)=>{t&&e(t)})(b,d.i18n));const G=e=>{o("onActive",e)},U=()=>{o("onPageLoaded")},H=C(d.pageTransition),X=v.eventBus,J=()=>{H.value=d.pageTransition},Y=()=>{H.value=d.pageTransitionBack};T&&(X.on(Ne.FORWARD,J),X.on(Ne.BACKWARD,Y));const{iframeTabs:Q,activeNonIframeTab:Z,hasActiveNonIframeTab:ee,iframeSrcMap:te,getIframeRefreshKey:ae,getIframeKey:re,getIframeLoadState:oe,shouldShowIframeLoading:le,shouldShowIframeError:se,retryIframe:ie,setIframeRef:ce,handleIframeLoad:ue,handleRefreshIframePostMessage:de,createMessageHandler:be}=It({tabs:x,iframeRefreshKeys:R,iframeLoadTimeout:d.iframeLoadTimeout,t:p}),me=be(n(()=>["undefined"!=typeof window?window.location.origin:"",...d.iframeAllowedOrigins??[]].filter(Boolean)),$);return T&&X.on(Ne.REFRESH_IFRAME_POSTMESSAGE,de),k(()=>{T&&(B(d.sessionPrefix),M(d.defaultTabs),window.addEventListener("message",me))}),_(()=>{T&&(window.removeEventListener("message",me),X.off(Ne.REFRESH_IFRAME_POSTMESSAGE,de),X.off(Ne.FORWARD,J),X.off(Ne.BACKWARD,Y),L(),((e,t={})=>{t.app&&Fe.delete(t.app),t.app||Be!==e||(qe=!1),Be===e&&(Be=null)})(v,y?{app:y}:void 0))}),(r,o)=>q(T)?(I(),i("div",{key:0,class:h(["stack-tab",{"stack-tab__maximum":w.value}]),style:g({width:t.width,height:t.height,"z-index":S.value})},[u(gt,{space:t.space,"tab-transition":t.tabTransition,"tab-scroll-mode":t.tabScrollMode,contextmenu:t.contextmenu,max:t.max,onActive:G},{leftButton:D(()=>[E(r.$slots,"leftButton")]),rightButton:D(()=>[E(r.$slots,"rightButton")]),_:3},8,["space","tab-transition","tab-scroll-mode","contextmenu","max"]),c("div",At,[u(a,{name:H.value,appear:""},{default:D(()=>[N((I(),i("div",{id:q(Z)?q(it)(q(Z).id):void 0,key:"keep-alive",class:"stack-tab__keep-alive-panel",role:q(Z)?"tabpanel":void 0,"aria-labelledby":q(Z)?q(st)(q(Z).id):void 0,"aria-hidden":q(Z)?void 0:"true",hidden:!q(ee)},[u(kt,{"transition-name":H.value,onLoaded:U},null,8,["transition-name"])],8,xt)),[[F,q(ee)]])]),_:1},8,["name"]),c("div",Rt,[(I(!0),i(e,null,P(q(Q),e=>(I(),l(a,{key:q(re)(e),name:H.value,appear:""},{default:D(()=>[N((I(),i("div",{id:q(it)(e.id),key:q(re)(e),class:"stack-tab__iframe-wrapper",role:"tabpanel","aria-labelledby":q(st)(e.id)},[q(le)(e.id)?(I(),i("div",{key:0,class:"stack-tab__iframe-loading",role:"status","aria-live":"polite","aria-label":q(p)("VueStackTab.loading")},[E(r.$slots,"iframeLoading",{tab:e},()=>[c("span",Et,V(q(p)("VueStackTab.loading")),1)])],8,Pt)):s("",!0),q(se)(e.id)?(I(),i("div",Lt,[E(r.$slots,"iframeError",{tab:e,retry:q(ie)},()=>[c("span",Mt,V(q(oe)(e.id).message??q(p)("VueStackTab.iframeLoadTimeout")),1),c("button",{type:"button",class:"stack-tab__iframe-error-retry",onClick:t=>q(ie)(e.id)},V(q(p)("VueStackTab.retry")),9,Ot),e.url&&q(pe)(e.url)?(I(),i("button",{key:0,type:"button",class:"stack-tab__iframe-error-open",onClick:t=>q(z)(e.id)},V(q(p)("VueStackTab.openInNewWindow")),9,Vt)):s("",!0)])])):s("",!0),c("iframe",{ref_for:!0,ref:t=>q(ce)(e.id,t),class:"stack-tab__iframe",src:q(te)[e.id]||"about:blank","data-refresh-key":q(ae)(e.id),title:e.title||q(p)("VueStackTab.iframeTitle")||"Stack tab iframe",sandbox:t.iframeSandbox||void 0,referrerpolicy:t.iframeReferrerPolicy,allow:t.iframeAllow||void 0,frameborder:"0",onLoad:t=>q(ue)(e,t)},null,40,Wt)],8,Ct)),[[F,e.active]])]),_:2},1032,["name"]))),128))])])],6)):s("",!0)}}),qt=(e,t)=>{e.clear();for(const a of t)e.push(_e(a))};function Ft(){const{attrs:e,props:t}=f(),a=e.tId??t.tId,r=e.pId??t.pId,o=z(),n=G(),l=$e(),{getTab:s,evictPageCache:i,addPageScroller:c,active:u}=et(),d=o.query.__tab;let b=0;return{forward:e=>{const t=s(a),r=e.query||{};if(t){const a=t.pages.peek();if(a&&a.path===e.path&&Te(r,a.query||{}))return void(t.active||u(t.id))}const o=Ce({__tab:d},e.query),i=++b;l.emit(Ne.FORWARD);let c="";Ue({apply:()=>{const a=t?t.pages.readonlyList().map(e=>_e(e)):[];return t&&(c=Oe(),t.pages.push({id:c,tabId:t.id,path:e.path,query:ke(r)})),a},navigate:()=>n.push({path:e.path,query:o}),rollback:e=>{t&&qt(t.pages,e)},isFailureResult:$,isCurrent:()=>b===i,cleanupStale:()=>{if(!t||!c)return;const e=t.pages.list().filter(e=>e.id!==c);qt(t.pages,e)}}).catch(e=>{})},backward:(e,t)=>{const r=s(a);if(!r)return!1;const o=r.pages;let c=0;if("number"==typeof e)c=Math.abs(e);else{const t=ye(e),a=t.query||{},r=o.readonlyList();let n=!1;for(let e=o.size()-2;e>=0;e--){c++;const o=r[e];if(o?.path===t.path&&Te(a,o?.query||{})){n=!0;break}}if(!n)return!1}if(c<=0)return!1;if(o.size()<=c&&(c=o.size()-1),c<=0)return!1;const u=o.readonlyList().map(e=>_e(e)),f=[];for(let a=0;a<c;a++){const e=o.pop();e&&f.push(e.id)}const m=o.peek();if(!m)return qt(o,u),!1;t&&(m._backParams=t),l.emit(Ne.BACKWARD);const p=Ce({__tab:d},m.query||{}),v=++b;return Ue({apply:()=>u,navigate:()=>n.push({path:m.path,query:p}),rollback:e=>qt(o,e),isFailureResult:$,isCurrent:()=>b===v,commit:()=>{for(const e of f)i(e)},cleanupStale:()=>{const e=new Set(o.list().map(e=>e.id));for(const t of f)e.has(t)||i(t)}}).catch(e=>{}),!0},addScrollTarget:(...e)=>{c(r,...e)}}}var jt=/* @__PURE__ */d({__name:"iframe",setup:e=>(Ft(),()=>{})}),Dt=()=>{const e=$e(),{attrs:t}=f(),a=()=>String(t.tId??"");S(()=>{r()});const r=()=>{e.emit(Ne.PAGE_LOADING,{tId:a(),value:!1})};return{openTabLoading:()=>{e.emit(Ne.PAGE_LOADING,{tId:a(),value:!0})},closeTabLoading:r}},Nt="vue-stack-tabs:refresh",Kt="vue-stack-tabs:openTab";function $t(e,t={}){"undefined"!=typeof window&&window.parent&&window.parent.postMessage({type:Kt,payload:e},t.targetOrigin??window.location.origin)}function zt(e=()=>window.location.reload(),t={}){if("undefined"==typeof window)return()=>{};const a=t.allowedOrigins??[],r=t=>{t.source===window.parent&&(a.length>0&&!a.includes(t.origin)||"vue-stack-tabs:refresh"===t.data?.type&&e())};return window.addEventListener("message",r),()=>window.removeEventListener("message",r)}var Gt={install(e,t){var a;a="1.3.0","undefined"!=typeof window&&window.console.log("%c vue-stack-tabs %c v"+a+" %c","background:#306fff; padding:2px 8px; border-radius:3px 0 0 3px; color:#fff;","background:#00d797; padding:2px 8px; border-radius:0 3px 3px 0; color:#fff;","background:transparent");const r=je();e.provide(Ve,r),e.provide(Ke,r.eventBus),e.component("VueStackTabs",Bt).use(ue().getI18n(t))}};export{jt as IFrame,Kt as MSG_OPEN_TAB,Nt as MSG_REFRESH,Ie as Stack,Bt as StackTab,Bt as VueStackTabs,vt as TabHeaderButton,Se as TabScrollMode,Gt as default,zt as onRefreshRequest,$t as postOpenTab,tt as useTabActions,Dt as useTabLoading,Ft as useTabRouter};
|
|
1
|
+
import{Fragment as e,KeepAlive as t,Transition as a,TransitionGroup as r,cloneVNode as o,computed as n,createBlock as s,createCommentVNode as l,createElementBlock as i,createElementVNode as c,createVNode as u,defineComponent as d,getCurrentInstance as f,hasInjectionContext as b,inject as m,mergeProps as p,nextTick as v,normalizeClass as h,normalizeStyle as g,onActivated as y,onBeforeMount as k,onBeforeUnmount as T,onDeactivated as _,onMounted as w,onScopeDispose as S,onUnmounted as I,openBlock as P,provide as A,reactive as x,readonly as C,ref as E,renderList as R,renderSlot as M,resolveComponent as L,resolveDynamicComponent as O,shallowRef as B,toDisplayString as W,toRaw as V,triggerRef as F,unref as D,vShow as q,watch as j,withCtx as $,withDirectives as N,withModifiers as K}from"vue";import{isNavigationFailure as z,useRoute as H,useRouter as G}from"vue-router";var U=Object.defineProperty,X=(e,t)=>{let a={};for(var r in e)U(a,r,{get:e[r],enumerable:!0});return t||U(a,Symbol.toStringTag,{value:"Module"}),a},J=/* @__PURE__ */X({default:()=>Y}),Y={VueStackTab:{close:"close",closeLeft:"close left",closeRight:"close right",closeOthers:"close others",closeAll:"close all",reload:"reload",reloadAll:"reload all",maximum:"maximum",restore:"restore",undefined:"undefined",loading:"loading",iframeTitle:"Embedded tab page",iframeLoadTimeout:"IFrame loading timed out",retry:"Retry",openInNewWindow:"Open in new window",scrollLeft:"Scroll left",scrollRight:"Scroll right"}},Q=/* @__PURE__ */X({default:()=>Z}),Z={VueStackTab:{close:"关闭",closeLeft:"关闭左侧",closeRight:"关闭右侧",closeOthers:"关闭其他",closeAll:"关闭所有",reload:"刷新",reloadAll:"刷新所有",maximum:"最大化",restore:"还原",undefined:"未命名",loading:"加载中",iframeTitle:"标签页内嵌页面",iframeLoadTimeout:"iframe 加载超时",retry:"重试",openInNewWindow:"在新窗口打开",scrollLeft:"向左滚动",scrollRight:"向右滚动"}},ee=["__proto__","prototype","constructor"];function te(e){const t=e.split("."),a=[];for(let r=0;r<t.length;r++){let e=t[r];for(;"\\"===e[e.length-1]&&void 0!==t[r+1];)e=e.slice(0,-1)+".",e+=t[++r];a.push(e)}return a.some(e=>-1!==ee.indexOf(e))?[]:a}function ae(e,t){if(!function(e){const t=typeof e;return null!==e&&("object"===t||"function"===t)}(e))return"";const a=te(t);if(0===a.length)return"";let r=Object.assign({},e);for(let o=0;o<a.length;o++){if("string"==typeof r[a[o]])return r[a[o]];if(r=r[a[o]],null==r){if(o!==a.length-1)return"";break}}return""}function re(e,t){return Object.keys(t).forEach(a=>{t[a]instanceof Object&&a in e&&(t[a]={...t[a],...re(e[a],t[a])})}),{...e||{},...t}}var oe="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,ne=/*#__PURE__*/(e=>oe?Symbol(e):"_vt_"+e)("i18n");function se(){return m(ne)}function le(e){const t=Object.assign({locale:"en",fallbackLocale:"en",messages:{}},e),a=E(t.locale),r=x({});return Object.entries(t.messages).forEach(([e,t])=>{r[e]=t}),{t(e,o){if(!e)return"";const n="string"==typeof o&&o?o:a.value;let s=ae(r[n],e)||ae(r[t.fallbackLocale],e);if(o&&"string"!=typeof o){const e=function(e,t){if(Array.isArray(t)){const a={},r=[...e.matchAll(/{(.+?)}/g)];return r&&r.forEach((e,r)=>{t[r]&&(a[e[1]]=t[r])}),a}return t}(s,o);l=e,(Array.isArray(l)?l.length:Object.keys(l).length)&&(s=function(e,t){for(const a in t)e=e.replace(`{${a}}`,String(t[a]));return e}(s,e))}var l;return s||e},current:C(a),options:C(e||{}),install(e){e.config.globalProperties.$t=this.t,e.provide(ne,this)},changeLocale(e){a.value=e},setLocaleMessage(e,t){r[e]=re(V(r[e]||{}),t)},getLocaleMessage:e=>r[e]||{}}}var ie=/* @__PURE__ */new Set(["__proto__","constructor","prototype"]),ce=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),ue=(e,t)=>{const a={...e};for(const[r,o]of Object.entries(t)){if(ie.has(r))continue;const e=a[r];a[r]=ce(e)&&ce(o)?ue(e,o):o}return a},de=()=>{const e=/* #__PURE__ */Object.assign({"./lang/en.ts":J,"./lang/zh-CN.ts":Q});const t=()=>{const t={};return function(e,t){for(const a of Object.keys(e)){const r=e[a];if(r?.default){const e=a.substring(a.lastIndexOf("/")+1,a.lastIndexOf(".")),o=t[e];t[e]=o?{...o,...r.default}:r.default}}}(e,t),t};return{getI18n:e=>{const a=((e,t)=>{const a={...e};if(!t)return a;for(const r of t)r.messages&&!ie.has(r.locale)&&(a[r.locale]=ue(a[r.locale]??{},r.messages));return a})(t(),e);return le({locale:e?.[0]?.locale??"zh-CN",fallbackLocale:"en",messages:a})}}},fe=({wrap:e,left:t=0,top:a=0,smooth:r=!0})=>{e&&(e.scrollTo?e.scrollTo({left:t,top:a,behavior:r?"smooth":"auto"}):(e.scrollLeft=t,e.scrollTop=a))};var be=/* @__PURE__ */new Map,me=e=>{void 0!==e?be.delete(e):be.clear()},pe=(e=".stack-tab__container *")=>{const t=Date.now(),a=be.get(e);if(a&&t-a.timestamp<100)return a.value;const r=document.querySelectorAll(e);let o=0;for(let s=0;s<r.length;s++){const e=+window.getComputedStyle(r[s]).zIndex||0;e<89999&&e>o&&(o=e)}const n=o+1;return be.set(e,{value:n,timestamp:t}),n},ve=/* @__PURE__ */new Set(["about:blank"]),he=/* @__PURE__ */new Set(["__tab","__src"]);function ge(e){const t=e.trim();if(!t)return!0;if((e=>{for(const t of e){const e=t.charCodeAt(0);if(e<=31||127===e||e>=128&&e<=159||8203===e||8204===e||8205===e||8288===e||65279===e||e>=8234&&e<=8238||e>=8294&&e<=8297)return!0}return!1})(t))return!1;if(ve.has(t.toLowerCase()))return!0;if(t.toLowerCase().startsWith("about:"))return!1;try{const e=new URL(t,"undefined"!=typeof window?window.location.origin:"http://localhost");return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}function ye(e){return ge(e)?e:"about:blank"}function ke(e){if("string"!=typeof e)return"about:blank";try{return ye(decodeURIComponent(e))}catch{return"about:blank"}}function Te(e){if(!e||!/^https?:\/\//i.test(e))return!1;try{const t="undefined"!=typeof window?window.location:{origin:"http://localhost"};return new URL(e,t.origin).origin!==t.origin}catch{return!0}}function _e(e){const[t="",a]=e.split("?");if(void 0===a)return{path:t,query:{}};const r=new URLSearchParams(a),o={};for(const[n,s]of r.entries()){const e=o[n];void 0!==e?o[n]=Array.isArray(e)?[...e,s]:[e,s]:o[n]=s}return{path:t,query:o}}function we(e={}){const t={};for(const[a,r]of Object.entries(e))t[a]=Array.isArray(r)?[...r]:r;return t}function Se(e){return{...e,query:e.query?we(e.query):void 0,_backParams:e._backParams?{...e._backParams}:void 0}}function Ie(e={},t={}){const a=e=>{const t={};for(const[a,r]of Object.entries(e))he.has(a)||"_back"===a||(t[a]=Array.isArray(r)?r.map(e=>String(e??"")):String(r??""));return t},r=a(e),o=a(t),n=Object.keys(r),s=Object.keys(o);return n.length===s.length&&n.every(e=>{const t=r[e],a=o[e];return Array.isArray(t)||Array.isArray(a)?Array.isArray(t)&&Array.isArray(a)&&t.length===a.length&&t.every((e,t)=>e===a[t]):t===a})}function Pe(e={}){const t={};for(const[a,r]of Object.entries(e))he.has(a)||(t[a]=Array.isArray(r)?[...r]:r);return t}var Ae=/* @__PURE__ */function(e){return e.WHEEL="wheel",e.BUTTON="button",e.BOTH="both",e}({}),xe=class{items;constructor(e){this.items=e?[...e]:[]}push(e){this.items.push(e)}pop(){return this.items.pop()}peek(){return this.items.length>0?this.items[this.items.length-1]:void 0}at(e){return this.items[e]}isEmpty(){return 0===this.items.length}size(){return this.items.length}clear(){this.items.length=0}list(){return[...this.items]}readonlyList(){return[...this.items]}find(e){return this.items.find(e)}findIndex(e){return this.items.findIndex(e)}filter(e){return this.items.filter(e)}some(e){return this.items.some(e)}forEachTopDown(e){for(let t=this.items.length-1;t>=0;t--)e(this.items[t],t)}toJSON(){return this.list()}toString(){return this.items.toString()}};function Ce(e){if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return(null===t||t===Object.prototype||null===Object.getPrototypeOf(t))&&(!(Symbol.iterator in e)&&(!(Symbol.toStringTag in e)||"[object Module]"===Object.prototype.toString.call(e)))}function Ee(e,t,a=".",r){if(!Ce(t))return Ee(e,{},a,r);const o={...t};for(const n of Object.keys(e)){if("__proto__"===n||"constructor"===n)continue;const t=e[n];null!=t&&(r&&r(o,n,t,a)||(Array.isArray(t)&&Array.isArray(o[n])?o[n]=[...t,...o[n]]:Ce(t)&&Ce(o[n])?o[n]=Ee(t,o[n],(a?`${a}.`:"")+n.toString(),r):o[n]=t))}return o}function Re(e){return(...t)=>t.reduce((t,a)=>Ee(t,a,"",e),{})}var Me=Re(),Le=(Re((e,t,a)=>{if(void 0!==e[t]&&"function"==typeof a)return e[t]=a(e[t]),!0}),Re((e,t,a)=>{if(Array.isArray(e[t])&&"function"==typeof a)return e[t]=a(e[t]),!0}),e=>"object"==typeof e&&null!==e&&!Array.isArray(e)),Oe={id:"",title:"",iframe:!1,closable:!0,refreshable:!0,iframeRefreshMode:"postMessage"},Be=e=>{const t={version:1,id:e.id,title:e.title,iframe:e.iframe,closable:e.closable,refreshable:e.refreshable,iframeRefreshMode:"reload"===e.iframeRefreshMode?"reload":"postMessage"};return a=JSON.stringify(t),btoa(unescape(encodeURIComponent(a)));var a},We=e=>{if("string"!=typeof e||e.length>4096)return{...Oe};let t;try{t=(e=>decodeURIComponent(escape(atob(e))))(e)}catch{return{...Oe}}if(t.length>2048)return{...Oe};if(!t.trim().startsWith("{"))return(e=>{const t=e.split("|"),a="R"===t[5]?"reload":"postMessage";return{id:t[0]??"",title:t[1]??"",iframe:"Y"===t[2],closable:"Y"===t[3],refreshable:"Y"===t[4],iframeRefreshMode:a}})(t);try{return a=JSON.parse(t),Le(a)?{id:"string"==typeof a.id?a.id:void 0,title:"string"==typeof a.title?a.title:Oe.title,iframe:"boolean"==typeof a.iframe?a.iframe:Oe.iframe,closable:"boolean"==typeof a.closable?a.closable:Oe.closable,refreshable:"boolean"==typeof a.refreshable?a.refreshable:Oe.refreshable,iframeRefreshMode:"reload"===a.iframeRefreshMode?"reload":"postMessage"}:{...Oe}}catch{return{...Oe}}var a},Ve=()=>crypto.randomUUID();var Fe=Symbol("stackTabsContext"),De=Symbol("stackTabsMaximum"),qe=null,je=!1,$e=/* @__PURE__ */new WeakSet,Ne=(e={})=>{const t={tabs:E([]),defaultTabs:E([]),caches:B([]),components:/* @__PURE__ */new Map,cacheIdsToEvict:/* @__PURE__ */new Set,tabIdsToEvict:/* @__PURE__ */new Set,refreshKey:E(0),scrollPositionsByPageId:/* @__PURE__ */new Map,isInitialized:E(!1),iframeRefreshKeys:E({}),maxTabCount:E(0),useGlobalScroll:E(!1),sessionPrefix:E("")};return{...t,maxTabCount:E(e.maxTabCount??t.maxTabCount.value),useGlobalScroll:E(e.useGlobalScroll??t.useGlobalScroll.value),sessionPrefix:E(e.sessionPrefix??t.sessionPrefix.value),iframePath:E(e.iframePath??""),eventBus:{all:a=a||/* @__PURE__ */new Map,on:function(e,t){var r=a.get(e);r?r.push(t):a.set(e,[t])},off:function(e,t){var r=a.get(e);r&&(t?r.splice(r.indexOf(t)>>>0,1):a.set(e,[]))},emit:function(e,t){var r=a.get(e);r&&r.slice().map(function(e){e(t)}),(r=a.get("*"))&&r.slice().map(function(a){a(e,t)})}}};var a},Ke=()=>{const e=(b()?m(Fe,null):null)??qe;if(!e)throw new Error("VueStackTabs runtime context is not available. Render <VueStackTabs> before using vue-stack-tabs composables.");return e},ze=/* @__PURE__ */function(e){return e.PAGE_LOADING="PAGE_LOADING",e.TAB_ACTIVE="TAB_ACTIVE",e.FORWARD="FORWARD",e.BACKWARD="BACKWARD",e.REFRESH_IFRAME_POSTMESSAGE="REFRESH_IFRAME_POSTMESSAGE",e}({}),He=Symbol("tabEmitter"),Ge=e=>(b()?m(He,null):null)??e?.eventBus??Ke().eventBus,Ue=async e=>{const t=e.apply();try{const a=await e.navigate();if(e.isFailureResult?.(a)){if(e.isCurrent?.()??!0?e.rollback(t):e.cleanupStale?.(),e.rejectFailureResult)throw a;return a}return(e.isCurrent?.()??!0)&&e.commit?.(),a}catch(a){throw e.isCurrent?.()??!0?e.rollback(t):e.cleanupStale?.(),a}},Xe=class extends xe{tabId;access;constructor(e,t){super(),this.tabId=e,this.access=t}push(e){this.access.appendPage(this.tabId,e)}pop(){return this.access.popPages(this.tabId,1)[0]}peek(){return this.access.getTopPage(this.tabId)??void 0}at(e){return this.access.getPages(this.tabId)[e]}isEmpty(){return 0===this.access.getPages(this.tabId).length}size(){return this.access.getPages(this.tabId).length}clear(){this.access.clearPages(this.tabId)}list(){return[...this.access.getPages(this.tabId)]}readonlyList(){return this.access.getPages(this.tabId)}find(e){return this.list().find(e)}findIndex(e){return this.list().findIndex(e)}filter(e){return this.list().filter(e)}some(e){return this.list().some(e)}forEachTopDown(e){const t=this.list();for(let a=t.length-1;a>=0;a--)e(t[a],a)}toJSON(){return this.list()}toString(){return this.list().toString()}},Je=e=>{const{tabs:t,caches:a,components:r,cacheIdsToEvict:o,tabIdsToEvict:n}=e,s=(e=>{const{caches:t,components:a,cacheIdsToEvict:r,tabIdsToEvict:o}=e,n=new Set(t.value);let s=t.value;const l=()=>{if(s!==t.value){s=t.value,n.clear();for(const e of s)n.add(e)}},i=e=>{r.add(e)},c=e=>{if(l(),n.has(e)){n.delete(e);const a=s.indexOf(e);a>=0&&s.splice(a,1),F(t)}};return{markCacheForEviction:i,markTabPagesForEviction:e=>{for(const t of e.pages.list())i(t.id);o.add(e.id)},markTabPagesForEvictionOnly:e=>{for(const t of e.pages.list())i(t.id)},addCache:e=>{l(),n.has(e)||(n.add(e),s.push(e),F(t))},removeCache:c,evictPageCache:e=>{e&&(r.delete(e),c(e),a.delete(e))},replacePageCaches:(e,o)=>{l();const i=new Set(e);let c=!1;if(i.size>0){for(let e=s.length-1;e>=0;e--){const t=s[e];t&&i.has(t)&&(s.splice(e,1),c=!0)}for(const e of i)n.delete(e),r.delete(e),a.delete(e)}for(const t of o)n.has(t)||(n.add(t),s.push(t),c=!0);c&&F(t)},evictMarkedCaches:()=>{if(r.size<=0)return;l();const e=new Set(r);for(let t=s.length-1;t>=0;t--){const a=s[t];a&&e.has(a)&&s.splice(t,1)}for(const t of e)n.delete(t),a.delete(t);F(t),r.clear()}}})(e),l=E([]),i=x(/* @__PURE__ */new Map),c=x(/* @__PURE__ */new Map),u=x(/* @__PURE__ */new Map),d=E(""),f=/* @__PURE__ */new Map,b=e=>t.value.find(t=>t.id===e)??null,m=e=>c.get(e)??[],p=e=>{const t=c.get(e);if(!t||0===t.length)return[];const a=[];for(const r of t){const e=u.get(r);e&&a.push(e)}return a},v=e=>{const t=c.get(e);return t&&0!==t.length?u.get(t[t.length-1])??null:null},h=e=>{i.set(e.id,(e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode,url:e.url}))(e));const t=e.pages.list(),a=t.map(e=>e.id);for(const r of t)u.set(r.id,r);c.set(e.id,a),f.delete(e.id),l.value.includes(e.id)||(l.value=[...l.value,e.id]),e.active&&(d.value=e.id)},g=(e,t)=>{if(!i.has(e))return;const a=c.get(e)??[];c.set(e,[...a,t.id]),u.set(t.id,t),w()},y=(e,t)=>{if(!i.has(e)||t<=0)return[];const a=[...c.get(e)??[]],r=[];for(let o=0;o<t;o++){const e=a.pop();if(!e)break;const t=u.get(e);t&&r.push(t),u.delete(e)}return c.set(e,a),w(),r},k=e=>{if(i.has(e)){for(const t of m(e))u.delete(t);c.set(e,[]),w()}},T={getPages:p,getTopPage:v,appendPage:g,popPages:y,clearPages:k};function _(e){const t=i.get(e);if(!t)return null;let a=f.get(e);return a?(a.title=t.title,a.closable=t.closable,a.refreshable=t.refreshable,a.iframe=t.iframe,a.active=d.value===e,void 0===t.iframeRefreshMode?delete a.iframeRefreshMode:a.iframeRefreshMode=t.iframeRefreshMode,void 0===t.url?delete a.url:a.url=t.url):(a={id:t.id,title:t.title,closable:t.closable,refreshable:t.refreshable,iframe:t.iframe,iframeRefreshMode:t.iframeRefreshMode,url:t.url,active:d.value===e,pages:new Xe(e,T)},f.set(e,a)),a}function w(){const e=[];for(const t of l.value){const a=_(t);a&&e.push(a)}t.value=e}return{...s,getTabs:()=>t.value,getTab:b,getActiveTab:()=>t.value.find(e=>e.active)??null,findTabByTopPagePath:e=>{for(const t of l.value)if(v(t)?.path===e)return b(t);return null},hasTab:e=>i.has(e),canAddTab:()=>e.maxTabCount.value<=0||e.maxTabCount.value>0&&e.maxTabCount.value>l.value.length,getPages:p,getTopPage:v,getPageSnapshot:e=>p(e).map(e=>Se(e)),addTab:e=>{h(e),w()},addTabs:e=>{if(0!==e.length){for(const t of e)h(t);w()}},activateTab:e=>(d.value=i.has(e)?e:"",w(),b(e)),moveTab:(e,t)=>{const a=l.value,r=a.indexOf(e);if(r<0||t<0||t>=a.length||r===t)return!1;const o=[...a],[n]=o.splice(r,1);return!!n&&(o.splice(t,0,n),l.value=o,w(),!0)},removeTab:e=>{const t=l.value,a=t.indexOf(e);if(a<0)return{status:"not-found",removed:null,nextActiveId:""};const r=i.get(e);if(!r||!r.closable)return{status:"not-closable",removed:null,nextActiveId:e};const o=_(e),b=d.value===e;o&&s.markTabPagesForEviction(o);for(const n of m(e))u.delete(n);c.delete(e),i.delete(e),f.delete(e);let p="";return t.length>1&&b&&(p=(0===a?t[1]:t[a-1])??""),b&&(d.value=""),l.value=t.filter(t=>t!==e),w(),b||(s.evictMarkedCaches(),n.clear()),{status:"removed",removed:o,nextActiveId:p}},removeTabs:e=>{const t=[],a=[];return l.value.forEach((r,o)=>{const n=i.get(r),l=_(r);if(n&&l)if(n.closable&&e(l,o)){s.markTabPagesForEviction(l);for(const e of m(r))u.delete(e);c.delete(r),i.delete(r),f.delete(r),d.value===r&&(d.value=""),t.push(l)}else a.push(r)}),l.value=a,w(),t},appendPage:g,popPages:y,replacePages:(e,t)=>{if(!i.has(e))return;for(const r of m(e))u.delete(r);const a=[];for(const r of t){const e=Se(r);u.set(e.id,e),a.push(e.id)}c.set(e,a),w()},clearPages:k,updatePage:(e,t,a)=>{const r=c.get(e);if(!r||!r.includes(t))return!1;const o=u.get(t);return!!o&&(Object.assign(o,a),a.id&&a.id!==t&&(u.delete(t),u.set(a.id,o),c.set(e,r.map(e=>e===t?a.id:e))),w(),!0)},consumeBackParams:(e,t)=>{const a=v(e);if(!a||a.id!==t||!a._backParams)return null;const r={...a._backParams};return delete a._backParams,w(),r},isTabMarkedForEviction:e=>n.has(e),isCacheMarkedForEviction:e=>o.has(e),unmarkCacheForEviction:e=>o.delete(e),clearTabEvictionMarks:()=>n.clear(),getComponent:e=>r.get(e),setComponent:(e,t)=>r.set(e,t),deleteComponent:e=>r.delete(e),snapshotComponents:()=>new Map(r),restoreComponents:e=>{r.clear();for(const[t,a]of e)r.set(t,a)},snapshotCaches:()=>[...a.value],restoreCaches:e=>{a.value=[...e]},touchTabs:w,reset:()=>{l.value=[],i.clear(),c.clear(),u.clear(),f.clear(),d.value="",t.value=[],a.value=[],r.clear(),o.clear(),n.clear()}}},Ye=/* @__PURE__ */new WeakMap,Qe=e=>e.startsWith("#")?document.getElementById(e.slice(1)):document.querySelector(e),Ze="__stack-tab-auto-scroll__:",et=/* @__PURE__ */new Map,tt=e=>{const t=document.getElementById(`W-${e}`);if(!t)return et.delete(e),null;let a=et.get(e);return a?0===a.elements.length&&a.observer&&(a.elements=Array.from(t.querySelectorAll("[data-stack-tab-scroll]"))):(a=(e=>{const t=()=>Array.from(e.querySelectorAll("[data-stack-tab-scroll]")),a={elements:t(),observer:null};return"undefined"!=typeof MutationObserver&&(a.observer=new MutationObserver(()=>{a.elements=t()}),a.observer.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-stack-tab-scroll"]})),a})(t),et.set(e,a)),a},at=(e,t)=>{const a=Number(t.slice(26));return Number.isInteger(a)?tt(e)?.elements[a]??null:null},rt=e=>{const{scrollPositionsByPageId:t}=e;return{restoreScroller:e=>{const a=t.get(e);if(a)for(const[t,r]of a){const a=t.startsWith(Ze)?at(e,t):Qe(t);a&&(a.scrollTop=r.top,a.scrollLeft=r.left)}},saveScroller:e=>{const a=t.get(e);if(a){for(const e of a.keys())e.startsWith(Ze)&&a.delete(e);(tt(e)?.elements??[]).forEach((e,t)=>{a.set((e=>`${Ze}${e}`)(t),{top:e.scrollTop,left:e.scrollLeft})});for(const t of a.keys()){const r=t.startsWith(Ze)?at(e,t):Qe(t);a.set(t,{top:r?.scrollTop??0,left:r?.scrollLeft??0})}}},removeScroller:e=>{const a=t.get(e);a&&(a.clear(),t.delete(e));const r=et.get(e);r&&(r.observer?.disconnect(),et.delete(e))},addPageScroller:(e,...a)=>{t.has(e)||t.set(e,/* @__PURE__ */new Map);const r=t.get(e);for(const t of a)r.set(t,{top:0,left:0})},invalidateAutoScrollCache:e=>{const t=et.get(e);t&&(t.elements=[],t.observer?.disconnect(),et.delete(e))}}},ot=e=>{const t=()=>e.sessionPrefix.value+"stacktab-active-tab";let a=null,r=0,o=!1;const n=(e,t)=>{if("undefined"!=typeof window)try{window.sessionStorage.setItem(e,t)}catch(a){}},s=()=>{o=!1;const e=a;a=null,e&&e.version===r&&n(t(),JSON.stringify(e.tab))},l=()=>{r++,a=null},i=()=>{l(),(e=>{if("undefined"!=typeof window)try{window.sessionStorage.removeItem(e)}catch(t){}})(t())};return{getSessionKey:t,saveActiveTabToSession:e=>{e.id&&(a={tab:e,version:++r},o||(o=!0,queueMicrotask(s)))},clearSession:i,restoreActiveTabSession:e=>{null!==e?(l(),n(t(),e)):i()},restoreTabFromSession:e=>{if(null==e)return null;try{const a=JSON.parse(e,(e,t)=>"pages"===e&&Array.isArray(t)?new xe(t):t);return Le(t=a)&&"string"==typeof t.id&&"string"==typeof t.title&&"boolean"==typeof t.closable&&"boolean"==typeof t.refreshable&&"boolean"==typeof t.iframe&&"boolean"==typeof t.active&&t.pages instanceof xe?a:(i(),null)}catch{return i(),null}var t}}},nt=e=>{const{getTabs:t,getTopPage:a,updatePage:r,iframeRefreshKeys:o,createPageId:n,addCache:s,evictPageCache:l,replacePageCaches:i,refreshIframeByPostMessage:c}=e,u=(e,t,o)=>{const i=a(e.id);if(!i)return;if(e.active)return void r(e.id,i.id,{refreshVersion:(i.refreshVersion??0)+1});const c=i.id,u=n();if(r(e.id,c,{id:u,refreshVersion:0}),t&&o)return t.push(c),void o.push(u);l(c),s(u)};return{refreshTab:e=>{const a=t().find(t=>t.id===e);a?.refreshable&&(a.iframe?(e=>{"reload"!==e.iframeRefreshMode?c(e.id):o.value={...o.value,[e.id]:(o.value[e.id]??0)+1}})(a):u(a))},refreshAllTabs:()=>{const e=[],a=[],r={...o.value};let n=!1;for(const o of t())o.refreshable&&(o.iframe?"reload"===o.iframeRefreshMode?(r[o.id]=(r[o.id]??0)+1,n=!0):c(o.id):u(o,e,a));n&&(o.value=r),i(e,a)}}},st=["aria-label"],lt=/*@__PURE__*/d({__name:"PageLoading",props:{tabId:{}},setup(e){const t=e,{t:a}=se(),r=Ge(),o=E(!1),n=e=>{e.tId===t.tabId&&(o.value=e.value)};return r.on(ze.PAGE_LOADING,n),I(()=>{r.off(ze.PAGE_LOADING,n)}),(e,t)=>o.value?(P(),i("div",{key:0,class:"stack-tab-loading-mask",role:"status","aria-live":"polite","aria-label":D(a)("VueStackTab.loading"),style:g({zIndex:(me(".cache-page-wrapper *"),pe(".cache-page-wrapper *"))})},[...t[0]||(t[0]=[c("div",{class:"stack-tab-loading--spin turn","aria-hidden":"true"},null,-1)])],12,st)):l("",!0)}}),it="stack-tab__shadow-inset-top",ct="stack-tab__shadow-inset-bottom",ut="stack-tab__shadow-inset-vertical",dt=e=>{if("undefined"==typeof document)return{sync:()=>{}};const t=!1!==e.watchResize,a=Math.max(0,e.edgeThreshold??5);let r=null,o=null,n=null;const s=()=>{null===r&&(r=requestAnimationFrame(()=>{r=null,(()=>{if(!o)return;const e=o,{scrollTop:t,scrollHeight:r,clientHeight:n}=e,s=t>a,l=r-n-t>a;e.classList.toggle(ut,s&&l),e.classList.toggle(it,s&&!l),e.classList.toggle(ct,!s&&l)})()}))};return queueMicrotask(()=>{const a="function"==typeof(r=e.target)?r():r.value;var r;a&&a!==o&&(o&&(o.removeEventListener("scroll",s),n?.disconnect(),n=null),o=a,a.addEventListener("scroll",s,{passive:!0}),t&&"undefined"!=typeof ResizeObserver&&(n=new ResizeObserver(()=>s()),n.observe(a)),s())}),S(()=>{o&&(o.removeEventListener("scroll",s),o.classList.remove(it,ct,ut),o=null),n?.disconnect(),n=null,null!==r&&(cancelAnimationFrame(r),r=null)}),{sync:()=>s()}},ft=/* @__PURE__ */d({name:"StackTabEmptyPlaceholder",setup:()=>()=>null}),bt=()=>ft,mt=(e,t)=>({...we(e.query),__tab:e.query.__tab??Be(t)}),pt=e=>{const t=e.matched[e.matched.length-1]?.path??e.path,a=e.path.endsWith("/")?e.path.slice(0,-1):e.path;return t===a?a:e.path},vt=e=>{const t=G(),a=e??Ke(),r=Ge(a),{t:s}=se(),{tabs:l,defaultTabs:i,caches:c,refreshKey:f,iframeRefreshKeys:b,isInitialized:m}=a,{getTabs:p,getTab:v,getActiveTab:h,findTabByTopPagePath:g,hasTab:k,canAddTab:T,getPages:S,getTopPage:P,getPageSnapshot:A,addTab:x,addTabs:C,activateTab:R,moveTab:M,removeTab:L,removeTabs:O,appendPage:W,popPages:V,replacePages:F,clearPages:D,updatePage:q,consumeBackParams:j,markCacheForEviction:$,markTabPagesForEvictionOnly:N,addCache:K,removeCache:H,evictMarkedCaches:U,evictPageCache:X,replacePageCaches:J,isTabMarkedForEviction:Y,isCacheMarkedForEviction:Q,unmarkCacheForEviction:Z,clearTabEvictionMarks:ee,getComponent:te,setComponent:ae,deleteComponent:re,snapshotComponents:oe,restoreComponents:ne,snapshotCaches:le,restoreCaches:ie,reset:ce}=(e=>{const t=Ye.get(e);if(t)return t;const a=Je(e);return Ye.set(e,a),a})(a),{restoreScroller:ue,saveScroller:de,removeScroller:fe,addPageScroller:be}=rt(a),{saveActiveTabToSession:me,clearSession:pe,restoreTabFromSession:ve,restoreActiveTabSession:he,getSessionKey:ge}=ot(a),{resolvePageComponent:Se}=(e=>{const{runtimeContext:t,consumeBackParams:a,getComponent:r,setComponent:n,addCache:s,evictMarkedCaches:l,clearTabEvictionMarks:i,addPageScroller:c,saveScroller:f,restoreScroller:b,removeScroller:m}=e;return{resolvePageComponent:e=>{const{cacheName:p,tabInfo:v}=e,h=r(p);if(h)return s(p),h;const g=/* @__PURE__ */d({name:p,props:{vnode:{type:Object,required:!1,default:void 0}},emits:["onLoaded"],setup(e,r){const n=E(null),s=B(null),d=B(null),h=B(null),g=E(null),k=()=>{n.value=a(v.id,p)};return w(()=>{r.emit("onLoaded"),c(p,`#W-${p}`),k()}),_(()=>f(p)),y(()=>{r.emit("onLoaded"),b(p),l(),i(),k()}),I(()=>m(p)),dt({target:g}),()=>{const a=e.vnode,r=n.value;return a===s.value&&r===h.value||(d.value=a?o(a,{tId:v.id,pId:p,...r?{_back:r}:{}}):null,s.value=a,h.value=r),u("div",{ref:g,class:"cache-page-wrapper",id:`W-${p}`,style:[t.useGlobalScroll.value?"overflow:auto":"overflow:hidden","height: 100%"]},[d.value,u(lt,{tabId:v.id},null)])}}});return n(p,g),s(p),g}}})({runtimeContext:a,consumeBackParams:j,getComponent:te,setComponent:ae,addCache:K,evictMarkedCaches:U,clearTabEvictionMarks:ee,addPageScroller:be,saveScroller:de,restoreScroller:ue,removeScroller:fe}),Ie=e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode}),Ae=e=>{const a=(e=>{if("string"==typeof e.query.__tab){const t=We(e.query.__tab);if(t.id)return t}const t=pt(e),a=h(),r=a?P(a.id):null;if(a&&r?.path===t)return Ie(a);const o=g(t);return o?Ie(o):{id:crypto.randomUUID(),title:s("VueStackTab.undefined"),closable:!0,refreshable:!0,iframe:!1}})(e);if(Y(a.id))return{empty:!0};const o=pt(e);let n,l=a.id?v(a.id):null,i=null;if(l&&P(l.id)){const t=P(l.id);if(!t)throw new Error("[vue-stack-tabs] Stack is not empty but peek() returned undefined");if(t.path===o)n=t.id;else{const t=S(l.id);let r=-1;for(let e=t.length-2;e>=0;e--){const a=t[e];if(a&&a.path===o){r=e;break}}if(-1!==r){const o=t.length-1-r,s=V(l.id,o);for(const e of s)$(e.id);const c=P(l.id);n=c?c.id:Ve(),c||(i={id:n,tabId:a.id,path:e.path,query:mt(e,a)})}else n=Ve(),i={id:n,tabId:a.id,path:e.path,query:mt(e,a)}}}else n=Ve(),i={id:n,tabId:a.id,path:e.path,query:mt(e,a)};if(Q(n)){Z(n);const e=te(n);if(e)return{recovered:e,cacheName:n}}return i?l=((e,t,a,o)=>{let n=e.id?v(e.id):null;if(null===n){const a=new xe;a.push(o);const s=t.query.__src;n={id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode??"postMessage",url:ke(s),active:!0,pages:a},R(""),x(n),r.emit(ze.TAB_ACTIVE,{id:e.id,isRoute:!1})}else{R(n.id);const e=P(n.id);e&&e.id===o.id||W(n.id,o)}return n})(a,e,0,i):R(l.id),"string"!=typeof e.query.__tab&&t.replace({path:e.path,query:{...we(e.query),__tab:Be(a)},hash:e.hash}),me(l),{cacheName:n,tabInfo:a,targetTab:l}},Ce=E(""),Ee=n(()=>{const e=h();return e?P(e.id)?.refreshVersion??0:0});let Re="",Le=null;const Oe=e=>O(e),Fe=()=>{if(Oe(()=>!0),h())return U(),void ee();const e=p().at(-1);e&&r.emit(ze.TAB_ACTIVE,{id:e.id})},{refreshTab:De,refreshAllTabs:qe}=nt({getTabs:p,getTopPage:P,updatePage:q,iframeRefreshKeys:b,createPageId:Ve,addCache:K,evictPageCache:X,replacePageCaches:J,refreshIframeByPostMessage:e=>r.emit(ze.REFRESH_IFRAME_POSTMESSAGE,e)});return{tabs:l,caches:c,refreshKey:f,activeCacheKey:Ce,activePageRefreshVersion:Ee,isInitialized:m,setMaxSize:e=>{a.maxTabCount.value=e},canAddTab:T,initialize:e=>{const t=[],a=[];for(const n of e){const e=Me(n,{refreshable:!0,closable:!0,iframe:!1});e.id=n.id??crypto.randomUUID();const r=e.id,o=_e(e.path),s=Ve(),l={id:s,tabId:r,path:o.path,query:Me(Pe(o.query),{__tab:Be(e)})},i=new xe;i.push(l);const c={id:r,title:e.title??"",closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:"reload"===e.iframeRefreshMode?"reload":"postMessage",active:!1,pages:i};K(s),t.push(c),a.push({...c})}i.value=[...i.value,...t],C(a);const r="undefined"!=typeof window?sessionStorage.getItem(ge()):null,o=ve(r);if(o&&!k(o.id))if(o.url&&(o.url=ye(o.url)),o.iframe&&o.url&&void 0===o.iframeRefreshMode&&(o.iframeRefreshMode=Te(o.url)?"reload":"postMessage"),o.pages&&"function"==typeof o.pages.list){x(o);for(const e of S(o.id))e&&e.id&&K(e.id)}else x(o);m.value=!0},size:()=>p().length,active:(e,a=!0)=>{r.emit(ze.FORWARD);const o=v(e);if(!o)return Promise.resolve();if(o.active)return Promise.resolve();const n=P(e),s=()=>{const t=R(e);t&&me(t)};if(!a)return s(),Promise.resolve();if(!n)return s(),Promise.resolve();const l=Be({id:o.id,title:o.title,closable:o.closable,refreshable:o.refreshable,iframe:o.iframe}),i=Me(n.query||{},{__tab:l});return Ue({apply:()=>{const e=h()?.id,t="undefined"!=typeof window?window.sessionStorage.getItem(ge()):null;return s(),{prevActiveId:e,sessionSnapshot:t}},navigate:()=>t.push({path:n.path,query:i}),rollback:e=>{R(e.prevActiveId??""),he(e.sessionSnapshot)},isFailureResult:z,rejectFailureResult:!0})},getCacheName:()=>Ve(),destroy:()=>{ce(),i.value=[],b.value={},a.scrollPositionsByPageId.clear(),a.isInitialized.value=!1,a.refreshKey.value=0,pe()},reset:()=>Fe(),addCache:K,removeCache:H,getTab:v,getActiveTab:h,getTopPage:P,getPages:S,getPageSnapshot:A,moveTab:M,addTab:x,appendPage:W,popPages:V,replacePages:F,clearPages:D,updatePage:q,removeTab:e=>{const t=L(e);return"not-found"===t.status?"":"not-closable"===t.status?e:(t.nextActiveId&&r.emit(ze.TAB_ACTIVE,{id:t.nextActiveId}),t.nextActiveId)},removeAllTabs:Fe,removeLeftTabs:e=>{const t=p().findIndex(t=>t?.id===e);if(t<=0)return;if(Oe((e,a)=>a<t),h())return U(),void ee();const a=p()[0];a&&r.emit(ze.TAB_ACTIVE,{id:a.id})},removeRightTabs:e=>{const t=p(),a=t.findIndex(t=>t?.id===e);if(a<0||a>=t.length-1)return;if(Oe((e,t)=>t>a),h())return U(),void ee();const o=p().at(-1);o&&r.emit(ze.TAB_ACTIVE,{id:o.id})},removeOtherTabs:e=>{const t=v(e);Oe(t=>t.id!==e),t&&!t.active?r.emit(ze.TAB_ACTIVE,{id:e}):(U(),ee())},hasTab:k,renewTab:e=>{const t=v(e.id);if(!t)return;const a=A(t.id),r=le(),o=oe();return N(t),U(),D(t.id),()=>{F(t.id,a),ie(r),ne(o)}},addPage:(e,t)=>{if(!t)return bt();const a=e.fullPath+(e.query.__tab||"");if(a===Re&&Le)return Le;const r=Ae(e);if("empty"in r)return bt();if("recovered"in r)return K(r.cacheName),Ce.value=r.cacheName,Re=a,Le=r.recovered,r.recovered;Ce.value=r.cacheName;const o=Se(r);return Re=a,Le=o,o},addComponent:ae,getComponent:te,removeComponent:re,markCacheForEviction:$,evictMarkedCaches:U,evictPageCache:X,clearTabEvictionMarks:ee,refreshTab:De,refreshAllTabs:qe,iframeRefreshKeys:b,addPageScroller:be,setGlobalScroll:e=>{a.useGlobalScroll.value=e},clearSession:pe,setSessionPrefix:e=>{a.sessionPrefix.value=e}}};function ht(e){const t=G(),a=e??Ke(),{active:r,hasTab:o,refreshKey:n,reset:s,canAddTab:l,renewTab:i,getTab:c,getTopPage:u,tabs:d,moveTab:f,removeTab:b,removeAllTabs:m,refreshTab:p,refreshAllTabs:v}=vt(a),h=(e,r)=>{const o=Be(r),n=Pe(e.query);let s,l=Me(n,{__tab:o});if(e.iframe)l={...l,__src:encodeURIComponent(e.path),__tab:o},s=a.iframePath.value;else{const t=_e(e.path);s=t.path,l=Me(Pe(t.query),l,{__tab:o}),l={...l,__tab:o}}return ge(e.path)?Ue({apply:()=>{},navigate:()=>t.push({path:s,query:l}),rollback:()=>{},isFailureResult:z,rejectFailureResult:!0}):Promise.reject(/* @__PURE__ */new Error("Invalid tab URL"))};return{openTab:(e,t=!1)=>new Promise((a,s)=>{const u=(e=>{const t={refreshable:!0,closable:!0,iframe:!1};e.iframe&&void 0===e.iframeRefreshMode?t.iframeRefreshMode=Te(e.path??"")?"reload":"postMessage":e.iframe&&(t.iframeRefreshMode=e.iframeRefreshMode??"postMessage");const a=Me(e,t);return a.id||(a.id=crypto.randomUUID()),a})(e),d=Boolean(u.id&&o(u.id));if(d&&!t)return void Promise.resolve(r(u.id)).then(()=>a(u.id),s);let f,b;if(u.id&&t&&d){const t=c(u.id);f=i(e),t?.active&&(b=n.value,n.value++)}d||l()?h(e,u).then(()=>a(u.id),e=>{f?.(),void 0!==b&&(n.value=b),s(e)}):s(/* @__PURE__ */new Error("Max Size"))}),closeTab:b,closeAllTabs:m,refreshTab:p,refreshAllTabs:v,activeTab:r,moveTab:f,reset:s,tabs:d,setIFramePath:e=>{a.iframePath.value=e},getWrapper:(e={})=>{if("undefined"==typeof document)return;const t=e.pageId??(e.tabId?u(e.tabId)?.id:void 0);return t?document.getElementById(`W-${t}`)??void 0:document.querySelector(".cache-page-wrapper")??void 0},openInNewWindow:e=>{const t=c(e);t?.iframe&&t.url&&ge(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")}}}var gt=["disabled"],yt=(e,t)=>{const a=e.__vccOpts||e;for(const[r,o]of t)a[r]=o;return a},kt=/*#__PURE__*/yt(/*@__PURE__*/d({__name:"ContextMenuItem",props:{icon:{default:""},title:{},disabled:{type:Boolean,default:!1}},setup:e=>(t,a)=>(P(),i("button",{type:"button",role:"menuitem",class:"stack-tab__contextmenu-item",disabled:e.disabled},[c("span",{class:h(["stack-tab__contextmenu-icon",e.icon]),"aria-hidden":"true"},null,2),c("span",{class:"stack-tab__contextmenu-title",onContextmenu:a[0]||(a[0]=K(()=>{},["prevent"]))},W(e.title),33)],8,gt))}),[["__scopeId","data-v-3d616fa0"]]),Tt={key:1,class:"divider div-transparent",role:"separator","aria-orientation":"horizontal"},_t=/*#__PURE__*/yt(/*@__PURE__*/d({__name:"index",props:{index:{},left:{default:0},top:{default:0},contextMenu:{default:()=>[]},restoreFocusElement:{default:null},tabItem:{},max:{}},emits:["close"],setup(t,{emit:a}){const r=t,o=a,{t:n}=se(),c=E(),d=x({left:r.left,top:r.top}),{closeTab:f,closeAllTabs:b,refreshTab:m,refreshAllTabs:p,openInNewWindow:h}=ht(),{removeLeftTabs:y,removeRightTabs:k,removeOtherTabs:T}=vt(),_=()=>{r.restoreFocusElement&&document.contains(r.restoreFocusElement)?r.restoreFocusElement.focus():document.querySelector('[role="tab"][aria-selected="true"]')?.focus()},S=()=>{o("close"),v(_)},I=e=>{e?.(),S()},A=()=>{const e=c.value;return e?Array.from(e.querySelectorAll('[role="menuitem"]')).filter(e=>!e.disabled):[]},C=e=>{const t=A();t.length<=0||t[(e+t.length)%t.length]?.focus()},M=()=>A().findIndex(e=>e===document.activeElement),L=e=>{if("Escape"===e.key)return e.preventDefault(),void S();if("ArrowDown"===e.key){e.preventDefault();const t=M();return void C(-1===t?0:t+1)}if("ArrowUp"===e.key){e.preventDefault();const t=M();return void C(-1===t?-1:t-1)}if("Home"===e.key)return e.preventDefault(),void C(0);"End"===e.key&&(e.preventDefault(),C(A().length-1))},O=e=>e.key??`${e.title}-${e.icon??""}`;return w(()=>{const e=c.value?.clientWidth??0;d.left+e>window.innerWidth&&(d.left=window.innerWidth-e-5),C(0)}),(a,r)=>(P(),i("div",{ref_key:"menuElementRef",ref:c,class:"stack-tab__contextmenu",role:"menu",tabindex:"-1",style:g({left:`${d.left}px`,top:`${d.top}px`,"z-index":(me(".stack-tab,.stack-tab *"),pe(".stack-tab,.stack-tab *"))}),onKeydown:L},[u(kt,{icon:"stack-tab__icon-reload svg-mask",title:D(n)("VueStackTab.reload"),disabled:!t.tabItem.refreshable,onClick:r[0]||(r[0]=e=>I(()=>D(m)(t.tabItem.id)))},null,8,["title","disabled"]),u(kt,{icon:"stack-tab__icon-reload-all svg-mask",title:D(n)("VueStackTab.reloadAll"),onClick:r[1]||(r[1]=e=>I(D(p)))},null,8,["title"]),u(kt,{icon:"stack-tab__icon-close svg-mask",title:D(n)("VueStackTab.close"),disabled:!t.tabItem.closable,onClick:r[2]||(r[2]=e=>I(()=>D(f)(t.tabItem.id)))},null,8,["title","disabled"]),u(kt,{icon:"stack-tab__icon-close-lefts svg-mask",title:D(n)("VueStackTab.closeLeft"),disabled:t.index<=0,onClick:r[3]||(r[3]=e=>I(()=>D(y)(t.tabItem.id)))},null,8,["title","disabled"]),u(kt,{icon:"stack-tab__icon-close-rights svg-mask",title:D(n)("VueStackTab.closeRight"),disabled:t.index>=t.max-1,onClick:r[4]||(r[4]=e=>I(()=>D(k)(t.tabItem.id)))},null,8,["title","disabled"]),u(kt,{icon:"stack-tab__icon-close-others svg-mask",title:D(n)("VueStackTab.closeOthers"),onClick:r[5]||(r[5]=e=>I(()=>D(T)(t.tabItem.id)))},null,8,["title"]),u(kt,{icon:"stack-tab__icon-close-all svg-mask",title:D(n)("VueStackTab.closeAll"),onClick:r[6]||(r[6]=e=>I(D(b)))},null,8,["title"]),t.tabItem.iframe&&t.tabItem.url?(P(),s(kt,{key:0,icon:"stack-tab__icon-open svg-mask",title:D(n)("VueStackTab.openInNewWindow"),onClick:r[7]||(r[7]=e=>I(()=>D(h)(t.tabItem.id)))},null,8,["title"])):l("",!0),void 0!==t.contextMenu&&t.contextMenu.length>0?(P(),i("div",Tt)):l("",!0),(P(!0),i(e,null,R(t.contextMenu,e=>(P(),s(kt,{key:O(e),"data-menu-key":O(e),icon:e.icon,title:e.title,disabled:e.disabled(t.tabItem),onClick:a=>I(()=>!e.disabled(t.tabItem)&&e.callback(t.tabItem.id))},null,8,["data-menu-key","icon","title","disabled","onClick"]))),128))],36))}}),[["__scopeId","data-v-cfc33246"]]),wt=e=>`stack-tab-tab-${encodeURIComponent(e)}`,St=e=>`stack-tab-panel-${encodeURIComponent(e)}`,It=["id","data-tab-id","aria-controls","aria-selected","tabindex","title"],Pt={class:"stack-tab__item-title"},At={class:"stack-tab__item-title-content"},xt=["title","aria-label","tabindex"],Ct=/*@__PURE__*/d({__name:"TabHeaderItem",props:{item:{},dropPosition:{}},emits:["close","active","contextmenu","dragstart","dragover","drop","dragend"],setup(e,{emit:t}){const a=t,r=Ge(),{t:o}=se(),s=E(),u=E(!1),d=e,f=e=>{d.item.id===e.id&&g(e.isRoute??!0)};r.on(ze.TAB_ACTIVE,f),I(()=>{r.off(ze.TAB_ACTIVE,f)});const b=n(()=>d.item.title||o("VueStackTab.undefined")),m=()=>{a("close",d.item)},p=e=>{u.value=!0,e.dataTransfer?.setData("text/plain",d.item.id),e.dataTransfer&&(e.dataTransfer.effectAllowed="move"),a("dragstart",d.item,e)},v=e=>{u.value=!1,a("dragend",d.item,e)},g=(e=!0)=>{a("active",d.item,s.value,e)},y=e=>{if("Enter"===e.key||" "===e.key)return e.preventDefault(),void g(!0);"Delete"!==e.key&&"Backspace"!==e.key||!d.item.closable||(e.preventDefault(),m())};return(t,a)=>(P(),i("li",{ref_key:"tabElementRef",ref:s,role:"presentation",class:h(["stack-tab__item",{"is-active":e.item.active,"is-icon":e.item.closable,"is-dragging":u.value,"is-drop-before":"before"===e.dropPosition,"is-drop-after":"after"===e.dropPosition}]),draggable:!0,onClick:a[1]||(a[1]=K(e=>g(!0),["self"])),onContextmenu:a[2]||(a[2]=e=>t.$emit("contextmenu",e)),onDragstart:p,onDragend:v,onDragover:a[3]||(a[3]=K(a=>t.$emit("dragover",e.item,a),["prevent"])),onDrop:a[4]||(a[4]=K(a=>t.$emit("drop",e.item,a),["prevent"]))},[c("button",{id:D(wt)(e.item.id),type:"button",role:"tab",class:"stack-tab__item-tab","data-tab-id":e.item.id,"aria-controls":D(St)(e.item.id),"aria-selected":e.item.active?"true":"false",tabindex:e.item.active?0:-1,title:b.value,onClick:a[0]||(a[0]=e=>g(!0)),onKeydown:y},[c("span",Pt,[c("span",At,W(b.value),1)])],40,It),e.item.closable?(P(),i("button",{key:0,type:"button",class:"stack-tab__icon-close-fill stack-tab__item-button",title:D(o)("VueStackTab.close"),"aria-label":`${D(o)("VueStackTab.close")} ${b.value}`,tabindex:e.item.active?0:-1,onClick:K(m,["stop"])},null,8,xt)):l("",!0)],34))}}),Et=["disabled","title","aria-label"],Rt={key:1,class:"stack-tab__button"},Mt=/*@__PURE__*/d({__name:"TabHeaderButton",props:{disabled:{type:Boolean,default:!1},shadow:{default:null},iconClass:{default:""},title:{default:""},ariaLabel:{default:""}},setup(e){const t=e,a=n(()=>t.ariaLabel||t.title);return(t,r)=>(P(),i("button",{type:"button",class:h(["stack-tab__header-button",{"stack-tab__shadow-right":"right"===e.shadow,"stack-tab__shadow-left":"left"===e.shadow}]),disabled:e.disabled,title:e.title,"aria-label":a.value},["icon"in t.$slots?l("",!0):(P(),i("span",{key:0,class:h(["stack-tab__mask-button",e.iconClass])},null,2)),"icon"in t.$slots?(P(),i("span",Rt,[M(t.$slots,"icon")])):l("",!0)],10,Et))}}),Lt=/*@__PURE__*/d({__name:"TabHeaderScroll",props:{space:{default:300},isScrollWheel:{type:Boolean,default:!0},isScrollButton:{type:Boolean,default:!0}},setup(t,{expose:a}){const{t:r}=se(),o=E(null),u=E(null),d=E(null),f=E(!1),b=E(!1),m=E(!1),p=E(!1),v=E(),y=t,k=x({clientWidth:0,scrollWidth:0,scrollLeft:0}),T=x({thumbLeft:0,startScrollLeft:0,startThumbLeft:0,startPageX:0});j(k,e=>{_(e)}),j(()=>y.isScrollButton,()=>_(k));const _=e=>{const t=e.scrollWidth>e.clientWidth;b.value=e.scrollLeft<=10,m.value=e.clientWidth+e.scrollLeft-e.scrollWidth>=-10,p.value=y.isScrollButton&&t},S=n(()=>k.scrollWidth>k.clientWidth),A=n(()=>{if(!S.value)return 0;const{clientWidth:e,scrollWidth:t}=k;return e/t*e}),C=n(()=>{if(!S.value)return 0;const{clientWidth:e,scrollWidth:t,scrollLeft:a}=k;return(e-A.value)*(a/(t-e))}),R=()=>{if(!o.value)return;const{clientWidth:e,scrollWidth:t,scrollLeft:a}=o.value;Object.assign(k,{clientWidth:e,scrollWidth:t,scrollLeft:a})},L=()=>{const e=o.value?.querySelector(".stack-tab__item.is-active");e&&!U(e)&&G(e)};let O=null,B=null;const W=(e,t=!0)=>{fe({wrap:o.value,left:e,top:0,smooth:t})},V=e=>{W(o.value.scrollLeft+e)},F=e=>{if(!y.isScrollWheel||!o.value)return;const t=e.deltaY<0;W(o.value.scrollLeft+(t?-y.space:y.space))},$=e=>{Object.assign(T,{startPageX:e.pageX,startScrollLeft:o.value?.scrollLeft,startThumbLeft:C.value,thumbLeft:C.value}),f.value=!0,document.addEventListener("mousemove",z),document.addEventListener("mouseup",H)},z=e=>{const{clientWidth:t,scrollWidth:a}=k;let r=T.startThumbLeft+e.pageX-T.startPageX;const o=t-A.value;r<0?r=0:r>o&&(r=o),T.thumbLeft=r,W(r*(a-t)/(t-A.value),!1),e.preventDefault()},H=()=>{f.value=!1,document.removeEventListener("mousemove",z),document.removeEventListener("mouseup",H)};w(()=>{if("undefined"==typeof ResizeObserver)return;O=new ResizeObserver(()=>{R(),L()}),B=new ResizeObserver(()=>{S.value||L(),R()}),v.value&&O.observe(v.value);const e=o.value?.querySelector(".stack-tab__nav");e&&B.observe(e)}),I(()=>{O?.disconnect(),B?.disconnect(),O=null,B=null});const G=e=>{!function({el:e,wrap:t,block:a="start",inline:r="nearest"}){const o=t&&"object"==typeof t&&"value"in t?t.value:t;if(e&&o)if(e.scrollIntoView)e.scrollIntoView({behavior:"smooth",block:a,inline:r});else{const{offsetLeft:t,offsetTop:n}=e;let s,l;l="center"===a?n+(e.clientHeight-o.clientHeight)/2:n,s="center"===r?t+(e.clientWidth-o.clientWidth)/2:t,fe({wrap:o,left:s,top:l})}}({el:e,wrap:o.value,block:"end",inline:"center"})},U=e=>{if(!S.value)return!0;const t=e.offsetLeft,a=o.value.scrollLeft;return!(t<a||t+e.clientWidth>a+o.value.clientWidth)};return a({scrollIntoView:G,isInView:U}),(a,n)=>(P(),i(e,null,[p.value?(P(),s(Mt,{key:0,"icon-class":"stack-tab__icon-left-arrow",disabled:b.value,title:D(r)("VueStackTab.scrollLeft"),"aria-label":D(r)("VueStackTab.scrollLeft"),onClick:n[0]||(n[0]=e=>!b.value&&V(-1*t.space))},null,8,["disabled","title","aria-label"])):l("",!0),c("div",{ref_key:"headerScroll",ref:v,class:"stack-tab__scroll",onWheelPassive:F},[c("div",{ref_key:"container",ref:o,class:h(["stack-tab__scroll-container",{"stack-tab__shadow-inset-left":!b.value&&m.value,"stack-tab__shadow-inset-right":!m.value&&b.value,"stack-tab__shadow-inset-all":!b.value&&!m.value}]),onScrollPassive:R},[M(a.$slots,"default")],34),N(c("div",{ref_key:"bar",ref:u,class:h(["stack-tab__scrollbar",{"is-dragging":f.value}])},[c("div",{ref_key:"thumb",ref:d,class:h(["stack-tab__scrollbar-thumb",{"is-dragging":f.value}]),style:g({width:`${A.value}px`,transform:`translateX(${C.value}px)`}),onMousedown:K($,["prevent"])},null,38)],2),[[q,S.value]])],544),p.value?(P(),s(Mt,{key:1,"icon-class":"stack-tab__icon-right-arrow",disabled:m.value,title:D(r)("VueStackTab.scrollRight"),"aria-label":D(r)("VueStackTab.scrollRight"),onClick:n[1]||(n[1]=e=>!m.value&&V(t.space))},null,8,["disabled","title","aria-label"])):l("",!0)],64))}}),Ot=/*@__PURE__*/d({__name:"index",props:{space:{},tabScrollMode:{default:Ae.BOTH},tabTransition:{default:()=>({name:"stack-tab-zoom"})},contextmenu:{type:[Boolean,Object],default:!0},max:{default:20}},emits:["active"],setup(t,{emit:o}){const{t:c}=se(),d=m(De,E(!1)),f=o,b=E(),h=E(),{shown:g,contextMenuData:y,showContextMenu:k}=(()=>{const e=x({item:{},index:-1,left:0,top:0,max:0}),t=E(!1),a=()=>{t.value=!1,document.removeEventListener("click",o),document.removeEventListener("focusin",n,!0),window.removeEventListener("blur",s)};let r=0;const o=e=>{e.target.closest?.(".stack-tab__contextmenu")||Date.now()-r<250||a()},n=e=>{e.target instanceof HTMLIFrameElement&&a()},s=()=>{window.requestAnimationFrame(()=>{document.activeElement instanceof HTMLIFrameElement&&a()})};return I(()=>{a()}),{shown:t,contextMenuData:e,showContextMenu:async(a,l,i,c)=>{r=Date.now(),t.value=!1,document.removeEventListener("click",o),document.removeEventListener("focusin",n,!0),window.removeEventListener("blur",s),await v();const{clientY:u,clientX:d}=a;t.value=!0,Object.assign(e,{item:l,index:i,top:u,left:d,max:c}),await v(),document.addEventListener("click",o),document.addEventListener("focusin",n,!0),window.addEventListener("blur",s)}}})(),T=E(null),_=()=>{g.value=!1},w=t,{closeTab:S,activeTab:A,moveTab:C,tabs:L}=ht(),O=E(null),B=E(null),W=n(()=>!1!==w.contextmenu),V=n(()=>Array.isArray(w.contextmenu)?w.contextmenu:[]),F=(e,t,a,r)=>{W.value&&(e.preventDefault(),T.value=(e=>{const t=(e.target instanceof Element?e.target:null)?.closest('[role="tab"]');return t||((e.currentTarget instanceof HTMLElement?e.currentTarget:null)?.querySelector('[role="tab"]')??null)})(e),k(e,t,a,r))},q=e=>{O.value=e.id},j=(e,t)=>{if(!O.value||O.value===e.id)return void(B.value=null);const a=t.currentTarget instanceof HTMLElement?t.currentTarget:null;if(!a)return;const{left:r,width:o}=a.getBoundingClientRect();B.value={tabId:e.id,position:t.clientX<r+o/2?"before":"after"},t.dataTransfer&&(t.dataTransfer.dropEffect="move")},N=e=>{const t=O.value,a=B.value;if(O.value=null,B.value=null,!t||t===e.id||a?.tabId!==e.id)return;const r=L.value.findIndex(e=>e.id===t),o=L.value.findIndex(t=>t.id===e.id);if(r<0||o<0)return;let n=o;"before"===a.position&&r<o&&n--,"after"===a.position&&r>o&&n++,C(t,n)},z=()=>{O.value=null,B.value=null},H=e=>e.target instanceof Element&&Boolean(e.target.closest(".stack-tab__item")),G=e=>{if(!O.value||H(e))return;const t=L.value[L.value.length-1];t&&t.id!==O.value&&(B.value={tabId:t.id,position:"after"},e.dataTransfer&&(e.dataTransfer.dropEffect="move"))},U=e=>{if(H(e))return;const t=L.value[L.value.length-1];t&&N(t)},X=n(()=>"string"==typeof w.tabTransition?{name:w.tabTransition}:w.tabTransition),J=e=>{const t=L.value[e];var a;t&&(te(t,void 0,!0),a=String(t.id),v(()=>{const e=h.value?.querySelector(`.stack-tab__nav [role="tab"][data-tab-id="${CSS.escape(a)}"]`);e&&(e.focus(),b.value&&!b.value.isInView(e)&&b.value.scrollIntoView(e))}))},Y=e=>{const t=L.value.length;if(t<=0)return;const a=L.value.findIndex(e=>e.active);return"ArrowRight"===e.key?(e.preventDefault(),void J(-1===a?0:(a+1)%t)):"ArrowLeft"===e.key?(e.preventDefault(),void J(-1===a?t-1:(a-1+t)%t)):"Home"===e.key?(e.preventDefault(),void J(0)):void("End"===e.key&&(e.preventDefault(),J(t-1)))},Q=n(()=>w.tabScrollMode===Ae.BOTH||w.tabScrollMode===Ae.BUTTON),Z=n(()=>w.tabScrollMode===Ae.BOTH||w.tabScrollMode===Ae.WHEEL),ee=e=>{e.closable&&S(e.id),g.value=!1},te=(e,t,a)=>{b.value&&t&&v(()=>{b.value.isInView(t)||b.value.scrollIntoView(t)}),Promise.resolve(A(e.id,a)).then(()=>f("active",e.id)).catch(e=>{})};return(o,n)=>(P(),i("div",{ref_key:"headerRef",ref:h,class:"stack-tab__header"},[M(o.$slots,"leftButton"),u(Lt,{ref_key:"scrollContainerRef",ref:b,space:t.space,"is-scroll-wheel":Z.value,"is-scroll-button":Q.value},{default:$(()=>[u(r,p({key:"tab-list-transition",tag:"ul",class:"stack-tab__nav",role:"tablist","aria-orientation":"horizontal"},X.value,{appear:"",onKeydown:Y,onDragover:K(G,["prevent"]),onDrop:K(U,["prevent"])}),{default:$(()=>[(P(!0),i(e,null,R(D(L),(e,t)=>(P(),s(Ct,{key:e.id,item:e,"drop-position":B.value?.tabId===e.id?B.value.position:void 0,onContextmenu:a=>F(a,e,t,D(L).length),onMouseup:K(t=>ee(e),["middle","prevent"]),onClose:ee,onActive:te,onDragstart:q,onDragover:j,onDrop:N,onDragend:z},null,8,["item","drop-position","onContextmenu","onMouseup"]))),128))]),_:1},16)]),_:1},8,["space","is-scroll-wheel","is-scroll-button"]),M(o.$slots,"rightButton"),u(Mt,{"icon-class":D(d)?"stack-tab__icon-restore":"stack-tab__icon-fullscreen",title:D(d)?D(c)("VueStackTab.restore"):D(c)("VueStackTab.maximum"),"aria-label":D(d)?D(c)("VueStackTab.restore"):D(c)("VueStackTab.maximum"),onClick:n[0]||(n[0]=e=>d.value=!D(d))},null,8,["icon-class","title","aria-label"]),u(a,{name:"stack-tab-zoom",appear:""},{default:$(()=>[D(g)?(P(),s(_t,{key:"context-menu-transition",left:D(y).left,top:D(y).top,"tab-item":D(y).item,max:D(y).max,index:D(y).index,"context-menu":V.value,"restore-focus-element":T.value,onClose:_},null,8,["left","top","tab-item","max","index","context-menu","restore-focus-element"])):l("",!0)]),_:1})],512))}}),Bt=/*@__PURE__*/d({__name:"StackCacheRenderer",props:{route:{},component:{}},setup(e){const t=e,{refreshKey:a,activeCacheKey:r,activePageRefreshVersion:o,addPage:n}=vt(),s=B(bt());return j([()=>t.route.fullPath,()=>{return e=t.component,e?.type??e;var e},()=>a.value],()=>{s.value=n(t.route,t.component)},{immediate:!0}),(t,n)=>M(t.$slots,"default",{wrappedComponent:s.value,activeCacheKey:D(r),refreshKey:D(a),activePageRefreshVersion:D(o),component:e.component})}}),Wt=/*@__PURE__*/d({__name:"StackKeepAlive",props:{transitionName:{default:"stack-tab-swap"}},emits:["loaded"],setup(e,{emit:r}){const o=r,{caches:n}=vt(),l=()=>{o("loaded")};return(r,o)=>{const i=L("router-view");return P(),s(i,null,{default:$(({Component:r,route:o})=>[u(Bt,{route:o,component:r},{default:$(({wrappedComponent:r,activeCacheKey:o,activePageRefreshVersion:i,component:c})=>[u(a,{name:e.transitionName,appear:"",mode:"out-in"},{default:$(()=>[(P(),s(t,{include:D(n)},[(P(),s(O(r),{key:`${o}-${i}`,vnode:c,onOnLoaded:l},null,40,["vnode"]))],1032,["include"]))]),_:2},1032,["name"])]),_:1},8,["route","component"])]),_:1})}}}),Vt=/* @__PURE__ */new Set(["vue-stack-tabs:openTab","openTab"]),Ft=e=>"string"==typeof e||"number"==typeof e||null==e,Dt=e=>"boolean"==typeof e?e:void 0,qt=e=>{if(!Le(e))return null;const{id:t,title:a,path:r,query:o,iframe:n,closable:s,refreshable:l,iframeRefreshMode:i}=e;if("string"!=typeof a||""===a.trim())return null;if("string"!=typeof r||""===r.trim()||!ge(r))return null;const c=(e=>{if(!Le(e))return;const t={};for(const[a,r]of Object.entries(e))(Ft(r)||Array.isArray(r)&&r.every(Ft))&&(t[a]=r);return Object.keys(t).length>0?t:void 0})(o),u=Dt(n),d=Dt(s),f=Dt(l),b=(e=>{if("reload"===e||"postMessage"===e)return e})(i);return{..."string"==typeof t&&t?{id:t}:{},title:a,path:r,...c?{query:c}:{},...void 0!==u?{iframe:u}:{},...void 0!==d?{closable:d}:{},...void 0!==f?{refreshable:f}:{},...b?{iframeRefreshMode:b}:{}}};function jt(e){const{tabs:t,iframeRefreshKeys:a,iframeLoadTimeout:r,t:o}=e,s=n(()=>t.value.filter(e=>e.iframe)),l=n(()=>t.value.find(e=>e.active&&!e.iframe)),i=n(()=>Boolean(l.value)),c=x({}),u=e=>a.value[e]??0,d=(e,t=u(e.id))=>{const a=ye(e.url??"");return((e,t)=>{if(t<=0||"about:blank"===e)return e;const a=e.indexOf("#"),r=a>=0?e.slice(0,a):e,o=a>=0?e.slice(a):"",n=r.indexOf("?"),s=n>=0?r.slice(0,n):r,l=n>=0?r.slice(n+1):"",i=new URLSearchParams(l);return i.set("__stack_tabs_refresh",String(t)),`${s}?${i.toString()}${o}`})(c[e.id]?a:"about:blank",t)},f=n(()=>{const e={};for(const t of s.value){const a=u(t.id);e[t.id]=d(t,a)}return e}),b=x({}),m=e=>b[e]??{status:"idle"},p=/* @__PURE__ */new Map,h=e=>{const t=p.get(e);t&&(clearTimeout(t),p.delete(e))},g=(e,t={})=>{("loaded"!==m(e).status||t.force)&&(h(e),b[e]={status:"loading"},p.set(e,setTimeout(()=>{p.delete(e),"loading"===m(e).status&&(b[e]={status:"timeout",message:o("VueStackTab.iframeLoadTimeout")})},r)))},y=x({});j(()=>s.value.map(e=>({id:e.id,active:e.active})),e=>{for(const a of e)a.active&&(c[a.id]=!0,g(a.id));const t=new Set(e.map(e=>e.id));for(const a of Object.keys(b))t.has(a)||(h(a),delete b[a],delete c[a],delete y[a]);if(t.size<Object.keys(a.value).length){const e={};for(const r of t){const t=a.value[r];"number"==typeof t&&(e[r]=t)}a.value=e}},{immediate:!0}),j(a,(e,t={})=>{for(const a of s.value)a.active&&(e[a.id]??0)!==(t[a.id]??0)&&g(a.id,{force:!0})},{deep:!0});return T(()=>{for(const e of p.values())clearTimeout(e);p.clear()}),{iframeTabs:s,activeNonIframeTab:l,hasActiveNonIframeTab:i,iframeSrcMap:f,getIframeRefreshKey:u,getIframeKey:e=>`${e.id}-${u(e.id)}`,getIframeLoadState:m,shouldShowIframeLoading:e=>"loading"===m(e).status,shouldShowIframeError:e=>"timeout"===m(e).status,retryIframe:e=>{b[e]={status:"idle"},a.value={...a.value,[e]:(a.value[e]??0)+1},v(()=>{g(e,{force:!0})})},setIframeRef:(e,t)=>{t?y[e]=t:delete y[e]},handleIframeLoad:(e,t)=>{const a=t.currentTarget,r=Number(a?.dataset.refreshKey??0);var o;c[e.id]&&("about:blank"!==d(e,r)&&r===u(e.id)&&a===y[e.id]&&(o=e.id,h(o),b[o]={status:"loaded"}))},handleRefreshIframePostMessage:e=>{const a=y[e],r=t.value.find(t=>t.id===e);if(a?.contentWindow)try{const e=((e,t)=>{if(!e||!ge(e))return null;try{const a=t??("undefined"!=typeof window?window.location.origin:void 0);if(!a&&!/^https?:\/\//i.test(e))return null;const r=new URL(e,a);if("http:"===r.protocol||"https:"===r.protocol)return r.origin}catch{return null}return null})(r?.url??"");if(!e)return;a.contentWindow.postMessage({type:"vue-stack-tabs:refresh"},e)}catch(o){}},createMessageHandler:(e,t)=>{const a=e=>Object.values(y).some(t=>t?.contentWindow===e);return r=>{if(!e.value.includes(r.origin))return;const o=((e,t)=>{if(!t(e.source))return null;if(!Le(e.data))return null;const a=e.data;return"string"==typeof a.type&&Vt.has(a.type)?qt(a.payload):null})(r,a);o&&t(o).catch(e=>{})}}}}var $t={class:"stack-tab__container"},Nt=["id","role","aria-labelledby","aria-hidden","hidden"],Kt={class:"stack-tab__iframes"},zt=["id","aria-labelledby"],Ht=["aria-label"],Gt={class:"stack-tab__iframe-loading-text"},Ut={key:1,class:"stack-tab__iframe-error",role:"alert"},Xt={class:"stack-tab__iframe-error-text"},Jt=["onClick"],Yt=["onClick"],Qt=["src","data-refresh-key","title","sandbox","referrerpolicy","allow","onLoad"],Zt=/*@__PURE__*/d({__name:"StackTabs",props:{defaultTabs:{default:()=>[]},max:{default:20},contextmenu:{type:[Boolean,Object],default:!0},pageTransition:{default:"stack-tab-swap"},pageTransitionBack:{default:"stack-tab-swap-back"},tabTransition:{default:"stack-tab-zoom"},tabScrollMode:{default:Ae.BOTH},width:{default:"100%"},height:{default:"100%"},i18n:{default:void 0},space:{default:300},globalScroll:{type:Boolean,default:!1},iframePath:{},sessionPrefix:{default:""},iframeAllowedOrigins:{default:()=>[]},iframeSandbox:{default:"allow-scripts allow-forms allow-popups allow-downloads allow-same-origin"},iframeReferrerPolicy:{default:"strict-origin-when-cross-origin"},iframeAllow:{default:""},iframeLoadTimeout:{default:15e3}},emits:["onActive","onPageLoaded"],setup(t,{emit:r}){const o=r,d=t;"string"!=typeof d.iframePath||d.iframePath.trim();const{changeLocale:b,t:p}=se(),v=m(Fe,null)??Ne({iframePath:d.iframePath,maxTabCount:d.max,useGlobalScroll:d.globalScroll,sessionPrefix:d.sessionPrefix}),y=f()?.appContext.app,_=((e,t={})=>{if(t.app&&!$e.has(t.app))return $e.add(t.app),!0;if(!t.app){if(!qe)return qe=e,je=!0,!0;if(qe===e&&!je)return je=!0,!0}if(t.isProduction??!0)return!1;throw new Error("VueStackTabs only supports one <VueStackTabs> instance per Vue app.")})(v,y?{app:y}:void 0);_&&(A(Fe,v),A(He,v.eventBus));const w=E(!1),S=E();_&&A(De,w),j(w,e=>{me(),S.value=e?pe("body *:not(.stack-tab,.stack-tab *)"):void 0});const{tabs:I,iframeRefreshKeys:x,destroy:C,initialize:L,setMaxSize:O,setGlobalScroll:B,setSessionPrefix:V}=_?vt(v):{tabs:v.tabs,iframeRefreshKeys:v.iframeRefreshKeys,destroy:()=>{},initialize:()=>{},setMaxSize:()=>{},setGlobalScroll:()=>{},setSessionPrefix:()=>{}},{setIFramePath:F,openTab:K,openInNewWindow:z}=_?ht(v):{setIFramePath:()=>{},openTab:()=>Promise.resolve(void 0),openInNewWindow:()=>{}};_&&(F(d.iframePath),B(d.globalScroll),O(d.max),((e,t)=>{t&&e(t)})(b,d.i18n));const H=e=>{o("onActive",e)},G=()=>{o("onPageLoaded")},U=E(d.pageTransition),X=v.eventBus,J=()=>{U.value=d.pageTransition},Y=()=>{U.value=d.pageTransitionBack};_&&(X.on(ze.FORWARD,J),X.on(ze.BACKWARD,Y));const{iframeTabs:Q,activeNonIframeTab:Z,hasActiveNonIframeTab:ee,iframeSrcMap:te,getIframeRefreshKey:ae,getIframeKey:re,getIframeLoadState:oe,shouldShowIframeLoading:ne,shouldShowIframeError:le,retryIframe:ie,setIframeRef:ce,handleIframeLoad:ue,handleRefreshIframePostMessage:de,createMessageHandler:fe}=jt({tabs:I,iframeRefreshKeys:x,iframeLoadTimeout:d.iframeLoadTimeout,t:p}),be=fe(n(()=>["undefined"!=typeof window?window.location.origin:"",...d.iframeAllowedOrigins??[]].filter(Boolean)),K);return _&&X.on(ze.REFRESH_IFRAME_POSTMESSAGE,de),k(()=>{_&&(V(d.sessionPrefix),L(d.defaultTabs),window.addEventListener("message",be))}),T(()=>{_&&(window.removeEventListener("message",be),X.off(ze.REFRESH_IFRAME_POSTMESSAGE,de),X.off(ze.FORWARD,J),X.off(ze.BACKWARD,Y),C(),((e,t={})=>{t.app?$e.delete(t.app):(qe===e&&(je=!1),qe===e&&(qe=null))})(v,y?{app:y}:void 0))}),(r,o)=>D(_)?(P(),i("div",{key:0,class:h(["stack-tab",{"stack-tab__maximum":w.value}]),style:g({width:t.width,height:t.height,"z-index":S.value})},[u(Ot,{space:t.space,"tab-transition":t.tabTransition,"tab-scroll-mode":t.tabScrollMode,contextmenu:t.contextmenu,max:t.max,onActive:H},{leftButton:$(()=>[M(r.$slots,"leftButton")]),rightButton:$(()=>[M(r.$slots,"rightButton")]),_:3},8,["space","tab-transition","tab-scroll-mode","contextmenu","max"]),c("div",$t,[u(a,{name:U.value,appear:""},{default:$(()=>[N((P(),i("div",{id:D(Z)?D(St)(D(Z).id):void 0,key:"keep-alive",class:"stack-tab__keep-alive-panel",role:D(Z)?"tabpanel":void 0,"aria-labelledby":D(Z)?D(wt)(D(Z).id):void 0,"aria-hidden":D(Z)?void 0:"true",hidden:!D(ee)},[u(Wt,{"transition-name":U.value,onLoaded:G},null,8,["transition-name"])],8,Nt)),[[q,D(ee)]])]),_:1},8,["name"]),c("div",Kt,[(P(!0),i(e,null,R(D(Q),e=>(P(),s(a,{key:D(re)(e),name:U.value,appear:""},{default:$(()=>[N((P(),i("div",{id:D(St)(e.id),key:D(re)(e),class:"stack-tab__iframe-wrapper",role:"tabpanel","aria-labelledby":D(wt)(e.id)},[D(ne)(e.id)?(P(),i("div",{key:0,class:"stack-tab__iframe-loading",role:"status","aria-live":"polite","aria-label":D(p)("VueStackTab.loading")},[M(r.$slots,"iframeLoading",{tab:e},()=>[c("span",Gt,W(D(p)("VueStackTab.loading")),1)])],8,Ht)):l("",!0),D(le)(e.id)?(P(),i("div",Ut,[M(r.$slots,"iframeError",{tab:e,retry:D(ie)},()=>[c("span",Xt,W(D(oe)(e.id).message??D(p)("VueStackTab.iframeLoadTimeout")),1),c("button",{type:"button",class:"stack-tab__iframe-error-retry",onClick:t=>D(ie)(e.id)},W(D(p)("VueStackTab.retry")),9,Jt),e.url&&D(ge)(e.url)?(P(),i("button",{key:0,type:"button",class:"stack-tab__iframe-error-open",onClick:t=>D(z)(e.id)},W(D(p)("VueStackTab.openInNewWindow")),9,Yt)):l("",!0)])])):l("",!0),c("iframe",{ref_for:!0,ref:t=>D(ce)(e.id,t),class:"stack-tab__iframe",src:D(te)[e.id]||"about:blank","data-refresh-key":D(ae)(e.id),title:e.title||D(p)("VueStackTab.iframeTitle")||"Stack tab iframe",sandbox:t.iframeSandbox||void 0,referrerpolicy:t.iframeReferrerPolicy,allow:t.iframeAllow||void 0,frameborder:"0",onLoad:t=>D(ue)(e,t)},null,40,Qt)],8,zt)),[[q,e.active]])]),_:2},1032,["name"]))),128))])])],6)):l("",!0)}});function ea(){const{attrs:e,props:t}=f(),a=e.tId??t.tId,r=e.pId??t.pId,o=H(),n=G(),s=Ge(),{getTab:l,getTopPage:i,getPages:c,appendPage:u,popPages:d,getPageSnapshot:b,replacePages:m,updatePage:p,evictPageCache:v,addPageScroller:h,active:g}=vt(),y=o.query.__tab;let k=0;return{forward:e=>{const t=l(a),r=e.query||{};if(t){const a=i(t.id);if(a&&a.path===e.path&&Ie(r,a.query||{}))return void(t.active||g(t.id))}const o=Me(e.query,{__tab:y}),d=++k;s.emit(ze.FORWARD);let f="";Ue({apply:()=>{const a=t?b(t.id):[];return t&&(f=Ve(),u(t.id,{id:f,tabId:t.id,path:e.path,query:we(r)})),a},navigate:()=>n.push({path:e.path,query:o}),rollback:e=>{t&&m(t.id,e)},isFailureResult:z,isCurrent:()=>k===d,cleanupStale:()=>{if(!t||!f)return;const e=c(t.id).filter(e=>e.id!==f);m(t.id,e)}}).catch(e=>{})},backward:(e,t)=>{const r=l(a);if(!r)return!1;const o=c(r.id);let u=0;if("number"==typeof e)u=Math.abs(e);else{const t=_e(e),a=t.query||{};let r=!1;for(let e=o.length-2;e>=0;e--){u++;const n=o[e];if(n?.path===t.path&&Ie(a,n?.query||{})){r=!0;break}}if(!r)return!1}if(u<=0)return!1;const f=o.length-1;if(f<u&&(u=f),u<=0)return!1;const h=b(r.id),g=d(r.id,u).map(e=>e.id),T=i(r.id);if(!T)return m(r.id,h),!1;t&&p(r.id,T.id,{_backParams:t}),s.emit(ze.BACKWARD);const _=Me(T.query||{},{__tab:y}),w=++k;return Ue({apply:()=>h,navigate:()=>n.push({path:T.path,query:_}),rollback:e=>m(r.id,e),isFailureResult:z,isCurrent:()=>k===w,commit:()=>{for(const e of g)v(e)},cleanupStale:()=>{const e=new Set(c(r.id).map(e=>e.id));for(const t of g)e.has(t)||v(t)}}).catch(e=>{}),!0},addScrollTarget:(...e)=>{h(r,...e)}}}var ta=/*@__PURE__*/d({__name:"iframe",setup:e=>(ea(),()=>{})}),aa=()=>{const e=Ge(),{attrs:t}=f(),a=()=>String(t.tId??"");I(()=>{r()});const r=()=>{e.emit(ze.PAGE_LOADING,{tId:a(),value:!1})};return{openTabLoading:()=>{e.emit(ze.PAGE_LOADING,{tId:a(),value:!0})},closeTabLoading:r}},ra="vue-stack-tabs:refresh",oa="vue-stack-tabs:openTab";function na(e,t={}){"undefined"!=typeof window&&window.parent&&window.parent.postMessage({type:oa,payload:e},t.targetOrigin??window.location.origin)}function sa(e=()=>window.location.reload(),t={}){if("undefined"==typeof window)return()=>{};const a=t.allowedOrigins??[],r=t=>{t.source===window.parent&&(a.length>0&&!a.includes(t.origin)||"vue-stack-tabs:refresh"===t.data?.type&&e())};return window.addEventListener("message",r),()=>window.removeEventListener("message",r)}var la={install(e,t){(e=>{if("undefined"==typeof window)return;const t="string"==typeof e&&e.length>0?e:"dev";window.console.log("%c vue-stack-tabs %c v"+t+" %c","background:#306fff; padding:2px 8px; border-radius:3px 0 0 3px; color:#fff;","background:#00d797; padding:2px 8px; border-radius:0 3px 3px 0; color:#fff;","background:transparent")})("1.4.2");const a=Ne();e.provide(Fe,a),e.provide(He,a.eventBus),e.component("VueStackTabs",Zt).use(de().getI18n(t))}};export{ta as IFrame,oa as MSG_OPEN_TAB,ra as MSG_REFRESH,xe as Stack,Zt as StackTab,Zt as VueStackTabs,Mt as TabHeaderButton,Ae as TabScrollMode,la as default,sa as onRefreshRequest,na as postOpenTab,ht as useTabActions,aa as useTabLoading,ea as useTabRouter};
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vue-stack-tabs",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1",
|
|
3
|
+
"version": "1.4.2",
|
|
5
4
|
"private": false,
|
|
6
5
|
"type": "module",
|
|
6
|
+
"description": "Vue 3 multi-tab manager built on Vue Router with iframe-like tab isolation: per-tab component scope, stack-based forward/backward navigation, keep-alive page caching, scroll position memory, i18n and a Nuxt 3/4 module.",
|
|
7
7
|
"files": [
|
|
8
8
|
"src/lib",
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
|
+
"sideEffects": [
|
|
12
|
+
"**/*.css",
|
|
13
|
+
"**/*.scss"
|
|
14
|
+
],
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
13
17
|
"types": "./dist/index.d.ts",
|
|
@@ -25,7 +29,9 @@
|
|
|
25
29
|
"./dist/vue-stack-tabs.css": "./dist/vue-stack-tabs.css"
|
|
26
30
|
},
|
|
27
31
|
"peerDependencies": {
|
|
28
|
-
"nuxt": "^3.0.0 || ^4.0.0"
|
|
32
|
+
"nuxt": "^3.0.0 || ^4.0.0",
|
|
33
|
+
"vue": "^3.5.43",
|
|
34
|
+
"vue-router": "^5.4.0"
|
|
29
35
|
},
|
|
30
36
|
"peerDependenciesMeta": {
|
|
31
37
|
"nuxt": {
|
|
@@ -34,6 +40,7 @@
|
|
|
34
40
|
},
|
|
35
41
|
"main": "./dist/vue-stack-tabs.es.js",
|
|
36
42
|
"module": "./dist/vue-stack-tabs.es.js",
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
37
44
|
"typings": "./dist/index.d.ts",
|
|
38
45
|
"repository": {
|
|
39
46
|
"type": "git",
|
|
@@ -41,20 +48,39 @@
|
|
|
41
48
|
},
|
|
42
49
|
"keywords": [
|
|
43
50
|
"vue",
|
|
44
|
-
"
|
|
51
|
+
"vue3",
|
|
52
|
+
"vue-router",
|
|
53
|
+
"router",
|
|
45
54
|
"tabs",
|
|
46
|
-
"
|
|
55
|
+
"tab",
|
|
56
|
+
"tab-panel",
|
|
57
|
+
"multi-tab",
|
|
58
|
+
"tabs-router",
|
|
59
|
+
"keep-alive",
|
|
60
|
+
"cache",
|
|
61
|
+
"iframe",
|
|
62
|
+
"nuxt",
|
|
63
|
+
"nuxt3",
|
|
64
|
+
"nuxt-module",
|
|
65
|
+
"navigation",
|
|
66
|
+
"vue-component",
|
|
67
|
+
"typescript"
|
|
47
68
|
],
|
|
48
69
|
"author": "tantan",
|
|
49
|
-
"license": "Apache
|
|
70
|
+
"license": "Apache-2.0",
|
|
50
71
|
"bugs": {
|
|
51
72
|
"url": "https://github.com/jktantan/vue-stack-tabs/issues"
|
|
52
73
|
},
|
|
53
|
-
"homepage": "https://github.
|
|
74
|
+
"homepage": "https://jktantan.github.io/vue-stack-tabs/",
|
|
75
|
+
"publishConfig": {
|
|
76
|
+
"access": "public"
|
|
77
|
+
},
|
|
54
78
|
"scripts": {
|
|
55
79
|
"clean:ports": "node -e \"const { execSync } = require('child_process'); try { if (process.platform === 'win32') { execSync('netstat -ano | findstr \":5173\" | findstr \"LISTENING\"').toString().split('\\n').forEach(line => { const pid = line.trim().split(/\\s+/)[4]; if (pid) try { execSync(`taskkill /F /PID ${pid}`, { stdio: 'ignore' }); } catch(e) {} }); execSync('netstat -ano | findstr \":5174\" | findstr \"LISTENING\"').toString().split('\\n').forEach(line => { const pid = line.trim().split(/\\s+/)[4]; if (pid) try { execSync(`taskkill /F /PID ${pid}`, { stdio: 'ignore' }); } catch(e) {} }); } else { execSync('lsof -ti:5173 | xargs kill -9 || true', { shell: '/bin/bash' }); execSync('lsof -ti:5174 | xargs kill -9 || true', { shell: '/bin/bash' }); } console.log('✅ 端口清理完成'); } catch(e) { console.log('✅ 端口已经空闲或清理完成'); }\"",
|
|
56
|
-
"docs:dev": "
|
|
57
|
-
"docs:
|
|
80
|
+
"docs:dev": "run-p docs:dev:docs docs:dev:demo",
|
|
81
|
+
"docs:dev:docs": "vitepress dev docs",
|
|
82
|
+
"docs:dev:demo": "vite --config vite.config.docs-demo.ts",
|
|
83
|
+
"docs:build": "vitepress build docs && vite build --config vite.config.docs-demo.ts",
|
|
58
84
|
"dev": "vite --host ",
|
|
59
85
|
"build": "run-p type-check \"build-only {@}\" --",
|
|
60
86
|
"preview": "vite preview",
|
|
@@ -64,64 +90,60 @@
|
|
|
64
90
|
"lint:check": "eslint .",
|
|
65
91
|
"format": "prettier --write .",
|
|
66
92
|
"format:check": "prettier --check .",
|
|
67
|
-
"lib:build": "vite --config vite.config.lib.ts build && vite --config vite.config.iframe-bridge.ts build && vite --config vite.config.nuxt.ts build && node -e \"const fs=require('fs');fs.copyFileSync('dist/vue-stack-tabs.css','dist/style.css');fs.
|
|
93
|
+
"lib:build": "vite --config vite.config.lib.ts build && vite --config vite.config.iframe-bridge.ts build && vite --config vite.config.nuxt.ts build && node -e \"const fs=require('fs');fs.copyFileSync('dist/vue-stack-tabs.css','dist/style.css');fs.rmSync('dist/src',{recursive:true,force:true});\"",
|
|
68
94
|
"test": "vitest run",
|
|
69
95
|
"test:watch": "vitest",
|
|
70
|
-
"test:coverage": "vitest run --coverage"
|
|
71
|
-
"test:prepack": "node scripts/verify-prepack.mjs",
|
|
72
|
-
"test:packaged": "pnpm run lib:build && node scripts/verify-packaged.mjs"
|
|
96
|
+
"test:coverage": "vitest run --coverage"
|
|
73
97
|
},
|
|
74
98
|
"dependencies": {
|
|
75
99
|
"defu": "^6.1.7",
|
|
76
100
|
"mitt": "^3.0.1",
|
|
77
|
-
"nostics": "^1.
|
|
101
|
+
"nostics": "^1.3.0",
|
|
78
102
|
"throttle-debounce": "^5.0.2",
|
|
79
|
-
"vue": "^
|
|
80
|
-
"vue-i18n-lite": "^1.0.2",
|
|
81
|
-
"vue-router": "^5.3.0"
|
|
103
|
+
"vue-i18n-lite": "^1.0.2"
|
|
82
104
|
},
|
|
83
105
|
"devDependencies": {
|
|
84
|
-
"@ctrl/tinycolor": "^4.2.
|
|
106
|
+
"@ctrl/tinycolor": "^4.2.1",
|
|
85
107
|
"@element-plus/icons-vue": "^2.3.2",
|
|
86
108
|
"@eslint/js": "^10.0.1",
|
|
87
109
|
"@floating-ui/core": "^1.8.0",
|
|
88
110
|
"@floating-ui/dom": "^1.8.0",
|
|
89
111
|
"@floating-ui/utils": "^0.2.12",
|
|
90
|
-
"@mdit/plugin-tasklist": "^1.1.
|
|
112
|
+
"@mdit/plugin-tasklist": "^1.1.3",
|
|
91
113
|
"@popperjs/core": "^2.11.8",
|
|
92
114
|
"@rushstack/eslint-patch": "^1.16.1",
|
|
93
115
|
"@tsconfig/node26": "^26.0.1",
|
|
94
116
|
"@types/lodash-es": "^4.17.12",
|
|
95
|
-
"@types/node": "^26.
|
|
117
|
+
"@types/node": "^26.6.5",
|
|
96
118
|
"@types/throttle-debounce": "^5.0.2",
|
|
97
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
119
|
+
"@vitejs/plugin-vue": "^6.0.10",
|
|
98
120
|
"@vitejs/plugin-vue-jsx": "^5.1.6",
|
|
99
121
|
"@vitest/coverage-v8": "4.1.10",
|
|
100
|
-
"@vue/compiler-core": "^3.5.
|
|
101
|
-
"@vue/compiler-dom": "^3.5.
|
|
122
|
+
"@vue/compiler-core": "^3.5.43",
|
|
123
|
+
"@vue/compiler-dom": "^3.5.43",
|
|
102
124
|
"@vue/devtools-api": "^8.2.1",
|
|
103
125
|
"@vue/devtools-kit": "^8.2.1",
|
|
104
126
|
"@vue/devtools-shared": "^8.2.1",
|
|
105
127
|
"@vue/eslint-config-prettier": "^10.2.0",
|
|
106
128
|
"@vue/eslint-config-typescript": "^14.9.0",
|
|
107
|
-
"@vue/reactivity": "^3.5.
|
|
108
|
-
"@vue/runtime-core": "^3.5.
|
|
109
|
-
"@vue/runtime-dom": "^3.5.
|
|
110
|
-
"@vue/shared": "^3.5.
|
|
111
|
-
"@vue/test-utils": "^2.5.
|
|
129
|
+
"@vue/reactivity": "^3.5.43",
|
|
130
|
+
"@vue/runtime-core": "^3.5.43",
|
|
131
|
+
"@vue/runtime-dom": "^3.5.43",
|
|
132
|
+
"@vue/shared": "^3.5.43",
|
|
133
|
+
"@vue/test-utils": "^2.5.1",
|
|
112
134
|
"@vue/tsconfig": "^0.9.1",
|
|
113
135
|
"@vueuse/core": "^14.4.0",
|
|
114
136
|
"@vueuse/shared": "^14.4.0",
|
|
115
137
|
"async-validator": "^4.2.5",
|
|
116
138
|
"birpc": "^4.2.0",
|
|
117
139
|
"dayjs": "^1.11.23",
|
|
118
|
-
"element-plus": "^2.14.
|
|
119
|
-
"eslint": "^10.
|
|
140
|
+
"element-plus": "^2.14.7",
|
|
141
|
+
"eslint": "^10.12.0",
|
|
120
142
|
"eslint-config-prettier": "^10.1.8",
|
|
121
|
-
"eslint-plugin-vue": "^10.
|
|
122
|
-
"globals": "^17.
|
|
123
|
-
"happy-dom": "^20.
|
|
124
|
-
"hookable": "^6.1.
|
|
143
|
+
"eslint-plugin-vue": "^10.11.1",
|
|
144
|
+
"globals": "^17.13.0",
|
|
145
|
+
"happy-dom": "^20.14.6",
|
|
146
|
+
"hookable": "^6.1.2",
|
|
125
147
|
"lodash-es": "^4.18.1",
|
|
126
148
|
"lodash-unified": "^1.0.3",
|
|
127
149
|
"memoize-one": "^6.0.0",
|
|
@@ -129,18 +151,20 @@
|
|
|
129
151
|
"normalize.css": "^8.0.1",
|
|
130
152
|
"npm-run-all2": "^9.0.3",
|
|
131
153
|
"perfect-debounce": "^2.1.0",
|
|
132
|
-
"prettier": "^3.9.
|
|
133
|
-
"sass-embedded": "^1.
|
|
154
|
+
"prettier": "^3.9.10",
|
|
155
|
+
"sass-embedded": "^1.105.1",
|
|
134
156
|
"terser": "^5.51.2",
|
|
135
|
-
"typescript": "
|
|
136
|
-
"typescript-eslint": "^8.
|
|
157
|
+
"typescript": "^6.0.3",
|
|
158
|
+
"typescript-eslint": "^8.71.1",
|
|
137
159
|
"unplugin-auto-import": "^21.1.0",
|
|
138
160
|
"unplugin-vue-components": "^32.1.0",
|
|
139
|
-
"vite": "^8.
|
|
161
|
+
"vite": "^8.3.4",
|
|
140
162
|
"vite-plugin-dts": "5.0.3",
|
|
141
163
|
"vite-plugin-package-version": "^1.1.0",
|
|
142
164
|
"vitepress": "^1.6.4",
|
|
143
165
|
"vitest": "^4.1.11",
|
|
144
|
-
"vue
|
|
166
|
+
"vue": "^3.5.43",
|
|
167
|
+
"vue-router": "^5.4.0",
|
|
168
|
+
"vue-tsc": "^3.3.13"
|
|
145
169
|
}
|
|
146
170
|
}
|
package/src/lib/StackTabs.vue
CHANGED
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
watch
|
|
23
23
|
} from 'vue'
|
|
24
24
|
import type { TransitionProps } from 'vue'
|
|
25
|
-
import { getMaxZIndex } from './utils/scrollUtils'
|
|
25
|
+
import { getMaxZIndex, invalidateZIndexCache } from './utils/scrollUtils'
|
|
26
26
|
import { isAllowedTabUrl } from './utils/urlParser'
|
|
27
27
|
import { applyStackTabsLocale } from './i18n/stackTabsLocale'
|
|
28
28
|
import { type ITabData, TabScrollMode } from './model/TabModel'
|
|
@@ -96,6 +96,17 @@ const props = withDefaults(
|
|
|
96
96
|
iframeLoadTimeout: 15000
|
|
97
97
|
}
|
|
98
98
|
)
|
|
99
|
+
|
|
100
|
+
// iframePath 必填:用于 iframe 占位页(StackTabs 把 iframe 标签路由到这个 path 渲染)。
|
|
101
|
+
// 这里在开发期给出明确错误,避免空字符串导致 router.push({ path: '' }) 跳到首页的隐式行为。
|
|
102
|
+
if (typeof props.iframePath !== 'string' || props.iframePath.trim() === '') {
|
|
103
|
+
const message = '[vue-stack-tabs] <VueStackTabs> requires the "iframePath" prop (e.g. "/iframe").'
|
|
104
|
+
if (!import.meta.env.PROD) {
|
|
105
|
+
throw new Error(message)
|
|
106
|
+
}
|
|
107
|
+
console.error(message)
|
|
108
|
+
}
|
|
109
|
+
|
|
99
110
|
const { changeLocale, t } = useI18n()
|
|
100
111
|
const runtimeContext =
|
|
101
112
|
inject(stackTabsContextKey, null) ??
|
|
@@ -120,10 +131,12 @@ if (isRuntimeContextOwner) {
|
|
|
120
131
|
provide(maximumKey, maximum)
|
|
121
132
|
}
|
|
122
133
|
watch(maximum, (isMaximum) => {
|
|
134
|
+
// 最大化切换会显著改变 body 下元素层叠顺序,先失效缓存再读取避免过期结果。
|
|
135
|
+
invalidateZIndexCache()
|
|
123
136
|
maximumZIndex.value = isMaximum ? getMaxZIndex('body *:not(.stack-tab,.stack-tab *)') : undefined
|
|
124
137
|
})
|
|
125
138
|
const panelApi = isRuntimeContextOwner
|
|
126
|
-
? useTabPanel()
|
|
139
|
+
? useTabPanel(runtimeContext)
|
|
127
140
|
: {
|
|
128
141
|
tabs: runtimeContext.tabs,
|
|
129
142
|
iframeRefreshKeys: runtimeContext.iframeRefreshKeys,
|
|
@@ -143,7 +156,7 @@ const {
|
|
|
143
156
|
setSessionPrefix
|
|
144
157
|
} = panelApi
|
|
145
158
|
const tabActions = isRuntimeContextOwner
|
|
146
|
-
? useTabActions()
|
|
159
|
+
? useTabActions(runtimeContext)
|
|
147
160
|
: {
|
|
148
161
|
setIFramePath: () => undefined,
|
|
149
162
|
openTab: () => Promise.resolve(undefined),
|
|
@@ -63,4 +63,6 @@ $stack-tab-shadow-left: -5px 0 5px -5px rgb(0 0 0 / 60%); //#ccc;
|
|
|
63
63
|
$stack-tab-shadow-right: 5px 0 5px -5px rgb(0 0 0 / 60%); //#ccc;
|
|
64
64
|
$stack-tab-shadow-right-inset: inset -5px 0 5px -5px rgb(0 0 0 / 60%); //#ccc;
|
|
65
65
|
$stack-tab-shadow-left-inset: inset 5px 0 5px -5px rgb(0 0 0 / 60%); //#ccc;
|
|
66
|
+
$stack-tab-shadow-top-inset: inset 0 5px 5px -5px rgb(0 0 0 / 60%); //#ccc;
|
|
67
|
+
$stack-tab-shadow-bottom-inset: inset 0 -5px 5px -5px rgb(0 0 0 / 60%); //#ccc;
|
|
66
68
|
$stack-tab-shadow-context-menu: 5px 5px 5px rgb(0 0 0 / 10%);
|
|
@@ -443,7 +443,6 @@
|
|
|
443
443
|
border-radius: 10px 0;
|
|
444
444
|
box-shadow: $stack-tab-shadow-context-menu;
|
|
445
445
|
transform-origin: left top;
|
|
446
|
-
transition: all 0.25s ease-in;
|
|
447
446
|
|
|
448
447
|
&-item {
|
|
449
448
|
display: flex;
|
|
@@ -464,7 +463,10 @@
|
|
|
464
463
|
background: transparent;
|
|
465
464
|
border: 0;
|
|
466
465
|
border-radius: 10px 0;
|
|
467
|
-
|
|
466
|
+
// 仅过渡悬停态实际会改变的颜色,避免触发菜单布局与合成层的无关动画。
|
|
467
|
+
transition:
|
|
468
|
+
color 0.2s ease-in-out,
|
|
469
|
+
background-color 0.2s ease-in-out;
|
|
468
470
|
user-select: none;
|
|
469
471
|
|
|
470
472
|
&:hover,
|
|
@@ -497,7 +499,7 @@
|
|
|
497
499
|
&-icon {
|
|
498
500
|
width: $stack-tab-font-size;
|
|
499
501
|
height: $stack-tab-font-size;
|
|
500
|
-
transition:
|
|
502
|
+
transition: background-color 0.2s ease-in-out;
|
|
501
503
|
|
|
502
504
|
&.svg-mask {
|
|
503
505
|
width: $stack-tab-font-size;
|
|
@@ -532,4 +534,16 @@
|
|
|
532
534
|
@include mixins.insetShadow();
|
|
533
535
|
box-shadow: $stack-tab-shadow-left-inset, $stack-tab-shadow-right-inset;
|
|
534
536
|
}
|
|
537
|
+
&-top::after {
|
|
538
|
+
@include mixins.insetShadow();
|
|
539
|
+
box-shadow: $stack-tab-shadow-top-inset;
|
|
540
|
+
}
|
|
541
|
+
&-bottom::after {
|
|
542
|
+
@include mixins.insetShadow();
|
|
543
|
+
box-shadow: $stack-tab-shadow-bottom-inset;
|
|
544
|
+
}
|
|
545
|
+
&-vertical::after {
|
|
546
|
+
@include mixins.insetShadow();
|
|
547
|
+
box-shadow: $stack-tab-shadow-top-inset, $stack-tab-shadow-bottom-inset;
|
|
548
|
+
}
|
|
535
549
|
}
|