vue-stack-tabs 2.3.0 → 2.4.0

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.
@@ -1 +1 @@
1
- import{createI18n as e,useI18n as t}from"vue-i18n-lite";import{Fragment as a,KeepAlive as r,Transition as n,TransitionGroup as o,cloneVNode as s,computed as i,createBlock as l,createCommentVNode as c,createElementBlock as u,createElementVNode as d,createVNode as f,defineComponent as m,getCurrentInstance as b,hasInjectionContext as p,inject as h,markRaw as v,mergeProps as g,nextTick as _,normalizeClass as y,normalizeStyle as k,onActivated as T,onBeforeMount as w,onBeforeUnmount as S,onDeactivated as P,onMounted as I,onScopeDispose as C,onUnmounted as x,openBlock as A,provide as R,reactive as M,ref as E,renderList as L,renderSlot as O,resolveComponent as B,resolveDynamicComponent as V,shallowRef as q,toDisplayString as W,toRef as $,triggerRef as F,unref as D,vShow as N,watch as K,withCtx as z,withDirectives as j,withModifiers as H}from"vue";import{NavigationFailureType as G,isNavigationFailure as U,useRoute as X,useRouter as Y}from"vue-router";import{defu as J}from"defu";import Q from"mitt";var Z=Object.defineProperty,ee=(e,t)=>{let a={};for(var r in e)Z(a,r,{get:e[r],enumerable:!0});return t||Z(a,Symbol.toStringTag,{value:"Module"}),a},te=/* @__PURE__ */ee({default:()=>ae}),ae={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"}},re=/* @__PURE__ */ee({default:()=>ne}),ne={VueStackTab:{close:"关闭",closeLeft:"关闭左侧",closeRight:"关闭右侧",closeOthers:"关闭其他",closeAll:"关闭所有",reload:"刷新",reloadAll:"刷新所有",maximum:"最大化",restore:"还原",undefined:"未命名",loading:"加载中",iframeTitle:"标签页内嵌页面",iframeLoadTimeout:"iframe 加载超时",retry:"重试",openInNewWindow:"在新窗口打开",scrollLeft:"向左滚动",scrollRight:"向右滚动"}},oe=/* @__PURE__ */new Set(["__proto__","constructor","prototype"]),se=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),ie=(e,t)=>{const a={...e};for(const[r,n]of Object.entries(t)){if(oe.has(r))continue;const e=a[r];a[r]=se(e)&&se(n)?ie(e,n):n}return a},le=()=>{const t=/* #__PURE__ */Object.assign({"./lang/en.ts":te,"./lang/zh-CN.ts":re});const a=()=>{const e={};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(".")),n=t[e];t[e]=n?{...n,...r.default}:r.default}}}(t,e),e};return{getI18n:t=>{const r=((e,t)=>{const a={...e};if(!t)return a;for(const r of t)r.messages&&!oe.has(r.locale)&&(a[r.locale]=ie(a[r.locale]??{},r.messages));return a})(a(),t);return e({locale:t?.[0]?.locale??"zh-CN",fallbackLocale:"en",messages:r})}}},ce=({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 ue=/* @__PURE__ */new Map,de=e=>{void 0!==e?ue.delete(e):ue.clear()},fe=(e=".stack-tab__container *")=>{const t=Date.now(),a=ue.get(e);if(a&&t-a.timestamp<100)return a.value;const r=document.querySelectorAll(e);let n=0;for(let s=0;s<r.length;s++){const e=+window.getComputedStyle(r[s]).zIndex||0;e<89999&&e>n&&(n=e)}const o=n+1;return ue.set(e,{value:o,timestamp:t}),o},me=/* @__PURE__ */new Set(["about:blank"]),be=/* @__PURE__ */new Set(["__tab","__src"]),pe=()=>"undefined"!=typeof window?window.location.origin:"http://localhost";function he(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(me.has(t.toLowerCase()))return!0;if(t.toLowerCase().startsWith("about:"))return!1;try{const e=new URL(t,pe());return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}function ve(e){return he(e)?e:"about:blank"}function ge(e){if("string"!=typeof e)return"about:blank";try{return ve(decodeURIComponent(e))}catch{return"about:blank"}}function _e(e){if(!e)return!1;const t=pe();try{const a=new URL(e,t);return("http:"===a.protocol||"https:"===a.protocol)&&a.origin!==new URL(t).origin}catch{return!0}}function ye(e){const t=e.indexOf("#"),a=t>=0?e.slice(t):"",[r="",n]=(t>=0?e.slice(0,t):e).split("?");if(void 0===n)return{path:r,query:{},hash:a};const o=new URLSearchParams(n),s={};for(const[i,l]of o.entries()){const e=s[i];void 0!==e?s[i]=Array.isArray(e)?[...e,l]:[e,l]:s[i]=l}return{path:r,query:s,hash:a}}function ke(e){return e&&"/"!==e?e.replace(/\/+$/,"")||"/":e}function Te(e={}){const t={};for(const[a,r]of Object.entries(e))t[a]=Array.isArray(r)?[...r]:r;return t}function we(e){return{...e,query:e.query?Te(e.query):void 0,_backParams:e._backParams?{...e._backParams}:void 0}}var Se=e=>be.has(e)||"_back"===e,Pe=(e,t)=>{const a=Array.isArray(e),r=Array.isArray(t);if(a||r){if(!a||!r||e.length!==t.length)return!1;for(let a=0;a<e.length;a++){const r=e[a],n=t[a];if(r!==n&&String(r??"")!==String(n??""))return!1}return!0}return e===t||String(e??"")===String(t??"")};function Ie(e={},t={}){let a=0;for(const n of Object.keys(e))if(!Se(n)){if(a++,!Object.prototype.hasOwnProperty.call(t,n))return!1;if(!Pe(e[n],t[n]))return!1}let r=0;for(const n of Object.keys(t))Se(n)||r++;return a===r}function Ce(e={}){const t={};for(const[a,r]of Object.entries(e))be.has(a)||(t[a]=Array.isArray(r)?[...r]:r);return t}var xe=(e,t)=>{t&&e(t)},Ae=/* @__PURE__ */function(e){return e.WHEEL="wheel",e.BUTTON="button",e.BOTH="both",e}({}),Re=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()}},Me=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.slice(0,256),iframe:e.iframe,closable:e.closable,refreshable:e.refreshable,iframeRefreshMode:"reload"===e.iframeRefreshMode?"reload":"postMessage"};return(e=>{const t=(new TextEncoder).encode(e);let a="";for(const r of t)a+=String.fromCharCode(r);return btoa(a).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")})(JSON.stringify(t))},Oe=e=>{if("string"!=typeof e||e.length>4096)return{...Ee};let t;try{t=(e=>{const t=e.replace(/-/g,"+").replace(/_/g,"/"),a=t+"=".repeat((4-t.length%4)%4),r=atob(a),n=new Uint8Array(r.length);for(let o=0;o<r.length;o++)n[o]=r.charCodeAt(o);return(new TextDecoder).decode(n)})(e)}catch{return{...Ee}}if(t.length>2048)return{...Ee};if(!t.trim().startsWith("{"))return(e=>{const t=e.split("|");if(t.length<5||t.length>6)return{...Ee};const[a="",r="",n,o,s,i]=t,l=e=>"Y"===e||"N"===e;return a.length>0&&a.length<=128&&a.trim()===a&&!(e=>{for(const t of e){const e=t.charCodeAt(0);if(e<=31||127===e)return!0}return!1})(a)&&l(n)&&l(o)&&l(s)?void 0!==i&&""!==i&&"R"!==i?{...Ee}:{id:a,title:r,iframe:"Y"===n,closable:"Y"===o,refreshable:"Y"===s,iframeRefreshMode:"R"===i?"reload":"postMessage"}:{...Ee}})(t);try{return a=JSON.parse(t),Me(a)?{id:"string"==typeof a.id?a.id:void 0,title:"string"==typeof a.title?a.title:Ee.title,iframe:"boolean"==typeof a.iframe?a.iframe:Ee.iframe,closable:"boolean"==typeof a.closable?a.closable:Ee.closable,refreshable:"boolean"==typeof a.refreshable?a.refreshable:Ee.refreshable,iframeRefreshMode:"reload"===a.iframeRefreshMode?"reload":"postMessage"}:{...Ee}}catch{return{...Ee}}var a},Be="",Ve=null,qe=()=>{const e=globalThis.crypto;if("function"==typeof e?.randomUUID)return e.randomUUID();const t=/* @__PURE__ */new Uint8Array(16);if("function"==typeof e?.getRandomValues)e.getRandomValues(t);else for(let r=0;r<t.length;r++)t[r]=Math.floor(256*Math.random());t[6]=15&t[6]|64,t[8]=63&t[8]|128;const a=[];for(const r of t)a.push(r.toString(16).padStart(2,"0"));return`${a.slice(0,4).join("")}-${a.slice(4,6).join("")}-${a.slice(6,8).join("")}-${a.slice(8,10).join("")}-${a.slice(10,16).join("")}`},We=()=>qe(),$e=Symbol("stackTabsContext"),Fe=Symbol("stackTabsMaximum"),De=null,Ne=!1,Ke=/* @__PURE__ */new WeakSet,ze=(e={})=>{const t={tabs:E([]),caches:q([]),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:Q()}},je=()=>{const e=(p()?h($e,null):null)??De;if(!e)throw new Error("VueStackTabs runtime context is not available. Render <VueStackTabs> before using vue-stack-tabs composables.");return e},He=/* @__PURE__ */function(e){return e.PAGE_LOADING="PAGE_LOADING",e.TAB_ACTIVE="TAB_ACTIVE",e.TAB_SCROLL_TO="TAB_SCROLL_TO",e.FORWARD="FORWARD",e.BACKWARD="BACKWARD",e.REFRESH_IFRAME_POSTMESSAGE="REFRESH_IFRAME_POSTMESSAGE",e}({}),Ge=Symbol("tabEmitter"),Ue=e=>(p()?h(Ge,null):null)??e?.eventBus??je().eventBus,Xe=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}},Ye=class extends Re{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.getPageAt(this.tabId,e)}isEmpty(){return 0===this.access.getPageCount(this.tabId)}size(){return this.access.getPageCount(this.tabId)}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:n,tabIdsToEvict:o}=e,s=(e=>{const{caches:t,components:a,cacheIdsToEvict:r,tabIdsToEvict:n}=e,o=new Set(t.value);let s=t.value;const i=()=>{if(s!==t.value){s=t.value,o.clear();for(const e of s)o.add(e)}},l=e=>{r.add(e)},c=e=>{if(i(),o.has(e)){o.delete(e);const a=s.indexOf(e);a>=0&&s.splice(a,1),F(t)}};return{markCacheForEviction:l,markTabPagesForEviction:e=>{for(const t of e.pages.readonlyList())l(t.id);n.add(e.id)},markTabPagesForEvictionOnly:e=>{for(const t of e.pages.readonlyList())l(t.id)},addCache:e=>{i(),o.has(e)||(o.add(e),s.push(e),F(t))},removeCache:c,evictPageCache:e=>{e&&(r.delete(e),c(e),a.delete(e))},replacePageCaches:(e,n)=>{i();const l=new Set(e);let c=!1;if(l.size>0){for(let e=s.length-1;e>=0;e--){const t=s[e];t&&l.has(t)&&(s.splice(e,1),c=!0)}for(const e of l)o.delete(e),r.delete(e),a.delete(e)}for(const t of n)o.has(t)||(o.add(t),s.push(t),c=!0);c&&F(t)},evictMarkedCaches:()=>{if(r.size<=0)return;i();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)o.delete(t),a.delete(t);F(t),r.clear()}}})(e),i=E([]),l=M(/* @__PURE__ */new Map),c=M(/* @__PURE__ */new Map),u=M(/* @__PURE__ */new Map),d=E(""),f=/* @__PURE__ */new Map,m=e=>t.value.find(t=>t.id===e)??null,b=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},h=e=>{const t=c.get(e);return t&&0!==t.length?u.get(t[t.length-1])??null:null},g=e=>u.get(e)?.refreshVersion??0,_=e=>{l.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,pinned:e.pinned}))(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),i.value.includes(e.id)||(i.value=[...i.value,e.id]),e.active&&(d.value=e.id)},y=(e,t)=>{if(!l.has(e))return;const a=c.get(e)??[];c.set(e,[...a,t.id]),u.set(t.id,t)},k=(e,t)=>{if(!l.has(e)||t<=0)return[];const a=[...c.get(e)??[]],r=[];for(let n=0;n<t;n++){const e=a.pop();if(!e)break;const t=u.get(e);t&&r.push(t),u.delete(e)}return c.set(e,a),r},T=e=>{if(l.has(e)){for(const t of b(e))u.delete(t);c.set(e,[])}},w=(e,t,a)=>{const r=c.get(e);if(!r||!r.includes(t))return"missing";const n=u.get(t);return n?a.id&&a.id!==t&&u.has(a.id)?"conflict":(Object.assign(n,a),a.id&&a.id!==t?(u.delete(t),u.set(a.id,n),c.set(e,r.map(e=>e===t?a.id:e)),"new-id"):"same-id"):"missing"},S={getPages:p,getPageIds:b,getPageAt:(e,t)=>{const a=c.get(e);if(!(!a||t<0||t>=a.length))return u.get(a[t])},getPageCount:e=>c.get(e)?.length??0,getTopPage:h,getPageRefreshVersion:g,appendPage:y,popPages:k,clearPages:T};function P(e){const t=l.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,a.pinned=t.pinned,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:v(new Ye(e,S)),pinned:t.pinned},f.set(e,a)),a}function I(){const e=[];for(const t of i.value){const a=P(t);a&&e.push(a)}t.value=e}return{...s,getTabs:()=>t.value,getTab:m,getActiveTab:()=>t.value.find(e=>e.active)??null,findTabByTopPagePath:e=>{for(const t of i.value)if(h(t)?.path===e)return f.get(t)??null;return null},hasTab:e=>l.has(e),canAddTab:()=>e.maxTabCount.value<=0||e.maxTabCount.value>0&&e.maxTabCount.value>i.value.length,getPages:p,getTopPage:h,getPageRefreshVersion:g,getPageSnapshot:e=>p(e).map(e=>we(e)),addTab:e=>{_(e),I()},addTabs:e=>{if(0!==e.length){for(const t of e)_(t);I()}},activateTab:e=>{const t=l.has(e)?e:"";return t!==d.value&&(d.value=t,I()),m(e)},updateTabTitle:(e,t)=>{const a=l.get(e);return!!a&&(a.title===t||(a.title=t,I()),!0)},moveTab:(e,t)=>{const a=i.value,r=a.indexOf(e);if(r<0||t<0||r===t)return!1;const n=l.get(e);if(!n||n.pinned)return!1;let o=0;for(let i=0;i<a.length;i++)l.get(a[i])?.pinned&&(o=i+1);const s=Math.max(t,o);if(s>=a.length||s===r)return!1;const c=[...a],[u]=c.splice(r,1);return!!u&&(c.splice(s,0,u),i.value=c,I(),!0)},removeTab:e=>{const t=i.value,a=t.indexOf(e);if(a<0)return{status:"not-found",removed:null,nextActiveId:""};const r=l.get(e);if(!r||!r.closable)return{status:"not-closable",removed:null,nextActiveId:e};const n=P(e),m=d.value===e;n&&s.markTabPagesForEviction(n);for(const o of b(e))u.delete(o);c.delete(e),l.delete(e),f.delete(e);let p="";return t.length>1&&m&&(p=(0===a?t[1]:t[a-1])??""),m&&(d.value=""),i.value=t.filter(t=>t!==e),I(),m||(s.evictMarkedCaches(),o.clear()),{status:"removed",removed:n,nextActiveId:p}},removeTabs:e=>{const t=[],a=[];return i.value.forEach((r,n)=>{const o=l.get(r),i=P(r);if(o&&i)if(o.closable&&e(i,n)){s.markTabPagesForEviction(i);for(const e of b(r))u.delete(e);c.delete(r),l.delete(r),f.delete(r),d.value===r&&(d.value=""),t.push(i)}else a.push(r)}),i.value=a,I(),t},appendPage:y,popPages:k,replacePages:(e,t)=>{if(!l.has(e))return;for(const r of b(e))u.delete(r);const a=[];for(const r of t){const e=we(r);u.set(e.id,e),a.push(e.id)}c.set(e,a)},clearPages:T,updatePage:(e,t,a)=>{const r=w(e,t,a);return"missing"!==r&&"conflict"!==r&&("new-id"===r&&I(),!0)},updatePages:e=>{let t=!1;for(const a of e)"new-id"===w(a.tabId,a.pageId,a.patch)&&(t=!0);t&&I()},consumeBackParams:(e,t)=>{const a=h(e);if(!a||a.id!==t||!a._backParams)return null;const r={...a._backParams};return delete a._backParams,r},isTabMarkedForEviction:e=>o.has(e),isCacheMarkedForEviction:e=>n.has(e),unmarkCacheForEviction:e=>n.delete(e),clearTabEvictionMarks:()=>o.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:I,reset:()=>{i.value=[],l.clear(),c.clear(),u.clear(),f.clear(),d.value="",t.value=[],a.value=[],r.clear(),n.clear(),o.clear()}}},Qe=/* @__PURE__ */new WeakMap,Ze=e=>e.startsWith("#")?document.getElementById(e.slice(1)):document.querySelector(e),et="__stack-tab-auto-scroll__:",tt=/* @__PURE__ */new Map,at=e=>{const t=document.getElementById(`W-${e}`);if(!t)return tt.delete(e),null;let a=tt.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),tt.set(e,a)),a},rt=(e,t)=>{const a=Number(t.slice(26));return Number.isInteger(a)?at(e)?.elements[a]??null:null},nt=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(et)?rt(e,t):Ze(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(et)&&a.delete(e);(at(e)?.elements??[]).forEach((e,t)=>{a.set((e=>`${et}${e}`)(t),{top:e.scrollTop,left:e.scrollLeft})});for(const e of a.keys()){if(e.startsWith(et))continue;const t=Ze(e);a.set(e,{top:t?.scrollTop??0,left:t?.scrollLeft??0})}}},removeScroller:e=>{const a=t.get(e);a&&(a.clear(),t.delete(e));const r=tt.get(e);r&&(r.observer?.disconnect(),tt.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})}}},ot=e=>{const t=()=>e.sessionPrefix.value+"stacktab-active-tab";let a=null,r=0,n=!1,o=null;const s=(e,t)=>{if("undefined"==typeof window)return!1;try{return window.sessionStorage.setItem(e,t),!0}catch(a){return!1}},i=()=>{n=!1;const e=a;if(a=null,!e||e.version!==r)return;const i=JSON.stringify(e.tab);i!==o&&s(t(),i)&&(o=i)},l=()=>{r++,a=null},c=()=>{l(),(e=>{if("undefined"!=typeof window)try{window.sessionStorage.removeItem(e)}catch(t){}})(t()),o=null};return{getSessionKey:t,saveActiveTabToSession:e=>{e.id&&(a={tab:e,version:++r},n||(n=!0,queueMicrotask(i)))},clearSession:c,restoreActiveTabSession:e=>{null!==e?(l(),s(t(),e)&&(o=e)):c()},restoreTabFromSession:e=>{if(null==e)return null;try{const a=JSON.parse(e,(e,t)=>"pages"===e&&Array.isArray(t)?new Re(t):t);return Me(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 Re?a:(c(),null)}catch{return c(),null}var t}}},st=e=>{const{getTabs:t,getTopPage:a,updatePage:r,updatePages:n,iframeRefreshKeys:o,createPageId:s,addCache:i,evictPageCache:l,replacePageCaches:c,refreshIframeByPostMessage:u}=e,d=(e,t,n,o)=>{const c=a(e.id);if(!c)return;if(e.active){const t={refreshVersion:(c.refreshVersion??0)+1};return void(o?o.push({tabId:e.id,pageId:c.id,patch:t}):r(e.id,c.id,t))}const u=c.id,d=s(),f={id:d,refreshVersion:0};if(o?o.push({tabId:e.id,pageId:u,patch:f}):r(e.id,u,f),t&&n)return t.push(u),void n.push(d);l(u),i(d)};return{refreshTab:e=>{const a=t().find(t=>t.id===e);a?.refreshable&&(a.iframe?(e=>{"reload"!==e.iframeRefreshMode?u(e.id):o.value={...o.value,[e.id]:(o.value[e.id]??0)+1}})(a):d(a))},refreshAllTabs:()=>{const e=[],a=[],r=[],s={...o.value};let i=!1;for(const n of t())n.refreshable&&(n.iframe?"reload"===n.iframeRefreshMode?(s[n.id]=(s[n.id]??0)+1,i=!0):u(n.id):d(n,e,a,r));i&&(o.value=s),n(r),c(e,a)}}},it=["aria-label"],lt=/*@__PURE__*/m({__name:"PageLoading",props:{tabId:{}},setup(e){const a=E(0),r=e,{t:n}=t(),o=Ue(),s=E(!1);K(s,e=>{e&&(de(".stack-tab__cache-page-wrapper *"),a.value=fe(".stack-tab__cache-page-wrapper *"))});const i=e=>{e.tId===r.tabId&&(s.value=e.value)};return o.on(He.PAGE_LOADING,i),x(()=>{o.off(He.PAGE_LOADING,i)}),(e,t)=>s.value?(A(),u("div",{key:0,class:"stack-tab-loading__mask",role:"status","aria-live":"polite","aria-label":D(n)("VueStackTab.loading"),style:k({zIndex:a.value})},[...t[0]||(t[0]=[d("div",{class:"stack-tab-loading__spin","aria-hidden":"true"},null,-1)])],12,it)):c("",!0)}}),ct="stack-tab__shadow-inset-top",ut="stack-tab__shadow-inset-bottom",dt="stack-tab__shadow-inset-vertical",ft=e=>"function"==typeof e?e():e.value,mt=e=>{if("undefined"==typeof document)return{sync:()=>{},clear:()=>{}};const t=!1!==e.watchResize,a=Math.max(0,e.edgeThreshold??5);let r=null,n=null,o=null,s=null;const i=e=>{e&&e.classList.remove(ct,ut,dt)},l=()=>{if(!n)return;const t=n,r=e.classTarget?ft(e.classTarget):n;if(o&&o!==r&&(i(o),o=null),o=r,!o)return;const{scrollTop:s,scrollHeight:l,clientHeight:c}=t,u=s>a,d=l-c-s>a;o.classList.toggle(dt,u&&d),o.classList.toggle(ct,u&&!d),o.classList.toggle(ut,!u&&d)},c=()=>{null===r&&(r=requestAnimationFrame(()=>{r=null,l()}))},u=()=>{const a=ft(e.target);a&&(a!==n?(n&&(n.removeEventListener("scroll",c),s?.disconnect(),s=null,i(o),o=null),n=a,a.addEventListener("scroll",c,{passive:!0}),t&&"undefined"!=typeof ResizeObserver&&(s=new ResizeObserver(()=>c()),s.observe(a)),c()):c())},d=()=>{null!==r&&(cancelAnimationFrame(r),r=null)},f=()=>{i(o),o=null,d()};return queueMicrotask(u),C(()=>{n&&n.removeEventListener("scroll",c),n=null,s?.disconnect(),s=null,i(o),o=null,d()}),{sync:()=>{const t=ft(e.target);t?t===n?c():u():f()},clear:f}},bt=e=>e.split(",").map(e=>Number.parseFloat(e.trim())||0),pt=e=>{if("undefined"==typeof window)return 0;const t=window.getComputedStyle(e),a=bt(t.transitionDuration||"0s"),r=bt(t.transitionDelay||"0s");return 0===a.length?0:1e3*Math.max(...a.map((e,t)=>e+(r[t%r.length]??0)))},ht=()=>new Promise(e=>{"function"==typeof requestAnimationFrame?requestAnimationFrame(()=>e()):setTimeout(e,16)}),vt=e=>{const{runtimeContext:t,consumeBackParams:a,getComponent:r,setComponent:n,addCache:o,evictMarkedCaches:i,clearTabEvictionMarks:l,addPageScroller:c,saveScroller:u,restoreScroller:d,removeScroller:b}=e;return{resolvePageComponent:e=>{const{cacheName:p,tabInfo:h}=e,v=r(p);if(v)return o(p),v;const g=/* @__PURE__ */m({name:`${p}-shell`,props:{vnode:{type:Object,required:!1,default:null}},setup:e=>()=>e.vnode}),y=/* @__PURE__ */m({name:p,props:{vnode:{type:Object,required:!1,default:void 0},refreshVersion:{type:Number,required:!1,default:0},transitionName:{type:String,required:!1,default:""}},emits:["onLoaded"],setup(e,r){const n=E(null),o=q(null),m=q(null),v=q(null),y=E(null),k=E(e.refreshVersion??0);let w=!1,C=!1,A=null,R=null,M=null,L="";const O=()=>{null!==R&&(clearTimeout(R),R=null)},B=()=>{const e=y.value,t=L;e&&t&&(e.classList.remove(`${t}-leave-active`,`${t}-leave-to`,`${t}-enter-active`,`${t}-enter-from`),L="")},V=e=>new Promise(t=>{const a=y.value;if(!a||e<=0)return void t();let r=!1;const n=()=>{r||(r=!0,M=null,O(),a.removeEventListener("transitionend",o),t())},o=e=>{e.target===a&&n()};M=n,a.addEventListener("transitionend",o),R=setTimeout(n,e+80)}),W=async t=>{const a=y.value,r=e.transitionName;if(!a||!r||"undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches)return void(k.value=t);L=r,a.classList.add(`${r}-leave-active`);const n=pt(a);if(n<=0)return B(),void(k.value=t);if(await ht(),w)return void B();if(a.classList.add(`${r}-leave-to`),await V(n),B(),w)return;if(k.value=t,await _(),w)return;L=r,a.classList.add(`${r}-enter-from`),a.offsetWidth,a.classList.add(`${r}-enter-active`);const o=pt(a);o<=0||(await ht(),w||(a.classList.remove(`${r}-enter-from`),await V(o))),B()};K(()=>e.refreshVersion??0,e=>{e===k.value&&null===A||(A=e,(async()=>{if(!C){C=!0;try{for(;!w&&null!==A;){const e=A;A=null,e!==k.value&&await W(e)}}finally{C=!1}}})())});const $=()=>{n.value=a(h.id,p)};I(()=>{r.emit("onLoaded"),c(p,`#W-${p}`),F.sync(),$()}),P(()=>{F.clear(),u(p)}),T(()=>{r.emit("onLoaded"),d(p),F.sync(),i(),l(),$()}),S(()=>{w=!0,A=null,M?.(),O(),B()}),x(()=>b(p));const F=mt({target:y,classTarget:()=>y.value?.parentElement??null});return()=>{const a=e.vnode,r=n.value;return a===o.value&&r===v.value||(m.value=a?s(a,{tId:h.id,pId:p,...r?{_back:r}:{}}):null,o.value=a,v.value=r),f("div",{ref:y,class:"stack-tab__cache-page-wrapper",id:`W-${p}`,style:[t.useGlobalScroll.value?"overflow:auto":"overflow:hidden","height: 100%"]},[m.value?f(g,{key:`${p}-${k.value}`,vnode:m.value},null):null,f(lt,{tabId:h.id},null)])}}});return n(p,y),o(p),y}}},gt=/* @__PURE__ */m({name:"StackTabEmptyPlaceholder",setup:()=>()=>null}),_t=()=>gt,yt=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},kt=e=>{const a=Y(),r=Ue(e),{t:n}=t(),{tabs:o,caches:s,refreshKey:l,iframeRefreshKeys:c,isInitialized:u}=e,{getTabs:d,getTab:f,getActiveTab:m,findTabByTopPagePath:b,hasTab:p,canAddTab:h,getPages:v,getTopPage:g,getPageRefreshVersion:_,getPageSnapshot:y,addTab:k,addTabs:T,activateTab:w,updateTabTitle:S,moveTab:P,removeTab:I,removeTabs:C,appendPage:x,popPages:A,replacePages:R,clearPages:M,updatePage:L,updatePages:O,consumeBackParams:B,markCacheForEviction:V,markTabPagesForEvictionOnly:q,addCache:W,removeCache:$,evictMarkedCaches:F,evictPageCache:D,replacePageCaches:N,isTabMarkedForEviction:K,isCacheMarkedForEviction:z,unmarkCacheForEviction:j,clearTabEvictionMarks:H,getComponent:G,setComponent:X,deleteComponent:Q,snapshotComponents:Z,restoreComponents:ee,snapshotCaches:te,restoreCaches:ae,reset:re}=(e=>{const t=Qe.get(e);if(t)return t;const a=Je(e);return Qe.set(e,a),a})(e),{restoreScroller:ne,saveScroller:oe,removeScroller:se,addPageScroller:ie}=nt(e),{saveActiveTabToSession:le,clearSession:ce,restoreTabFromSession:ue,restoreActiveTabSession:de,getSessionKey:fe}=ot(e),{resolvePageComponent:me}=vt({runtimeContext:e,consumeBackParams:B,getComponent:G,setComponent:X,addCache:W,evictMarkedCaches:F,clearTabEvictionMarks:H,addPageScroller:ie,saveScroller:oe,restoreScroller:ne,removeScroller:se}),be=e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode}),pe=()=>d().find(e=>e.pinned)??null,he=()=>{const e=pe(),t=e?g(e.id):null;if(!e||!t)return!1;const r={...Te(t.query),__tab:Le(be(e))};return Promise.resolve(a.replace({path:t.path,query:r,hash:""})).catch(e=>{}),!0},we=e=>{const t=e.query.__tab,a="string"==typeof t;if(a){const e=(e=>{if(e===Be&&Ve)return{...Ve};const t=Oe(e);return Be=e,Ve=t,{...t}})(t);if(e.id)return e}const r=yt(e),o=m(),s=o?g(o.id):null;if(o&&s?.path===r)return be(o);const i=b(r);return i?be(i):!a&&pe()?null:{id:qe(),title:n("VueStackTab.undefined"),closable:!0,refreshable:!0,iframe:!1}},Se=e=>{const t=we(e);if(null===t)return he(),{empty:!0};const n=t;if(K(n.id))return{empty:!0};const o=yt(e),s=((e,t)=>({...Te(e.query),__tab:e.query.__tab??Le(t)}))(e,n),i=e=>e.path===o&&Ie(s,e.query||{});let l,c=n.id?f(n.id):null,u=null;const d=c?g(c.id):null;if(c&&d)if(i(d))l=d.id;else if(d.path===o)l=We(),u={id:l,tabId:n.id,path:o,query:Te(s)};else{const e=v(c.id);let t=-1;for(let a=e.length-2;a>=0;a--){const r=e[a];if(r&&i(r)){t=a;break}}if(-1!==t){const a=e.length-1-t,r=A(c.id,a);for(const e of r)V(e.id);const i=g(c.id);l=i?i.id:We(),i||(u={id:l,tabId:n.id,path:o,query:Te(s)})}else l=We(),u={id:l,tabId:n.id,path:o,query:Te(s)}}else l=We(),u={id:l,tabId:n.id,path:o,query:Te(s)};if(z(l)){j(l);const e=G(l);if(e)return{recovered:e,cacheName:l}}return u?c=((e,t,a,n)=>{let o=e.id?f(e.id):null;if(null===o){const a=new Re;a.push(n);const s=t.query.__src;o={id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode??"postMessage",url:ge(s),active:!0,pages:a},w(""),k(o),r.emit(He.TAB_ACTIVE,{id:e.id,isRoute:!1})}else{w(o.id);const e=g(o.id);e&&e.id===n.id||x(o.id,n)}return o})(n,e,0,u):w(c.id),"string"!=typeof e.query.__tab&&a.replace({path:e.path,query:{...Te(e.query),__tab:Le(n)},hash:e.hash}).catch(e=>{}),le(c),{cacheName:l,tabInfo:n,targetTab:c}},Pe=E(""),xe=i(()=>{const e=m();return e?g(e.id)?.refreshVersion??0:0});let Ae="",Me=null;const Ee=e=>C(e),$e=()=>{if(Ee(()=>!0),m())return F(),void H();const e=d().at(-1);e&&r.emit(He.TAB_ACTIVE,{id:e.id})},{refreshTab:Fe,refreshAllTabs:De}=st({getTabs:d,getTopPage:g,updatePage:L,updatePages:O,iframeRefreshKeys:c,createPageId:We,addCache:W,evictPageCache:D,replacePageCaches:N,refreshIframeByPostMessage:e=>r.emit(He.REFRESH_IFRAME_POSTMESSAGE,e)});return{tabs:o,caches:s,refreshKey:l,activeCacheKey:Pe,activePageRefreshVersion:xe,isInitialized:u,setMaxSize:t=>{e.maxTabCount.value=t},canAddTab:h,initialize:(t,a)=>{if(u.value)return;const r=[];let n="";const o=(t,a={})=>{const r=J(t,{refreshable:!0,closable:!0,iframe:!1});r.id=t.id??(a.pinned?"__stack_tabs_home__":qe()),void 0!==a.closable&&(r.closable=a.closable);const n=r.id,o=Boolean(r.iframe),s=ye(r.path),i=We(),l=ke(o?e.iframePath.value:s.path),c=o?r.iframeRefreshMode??(_e(r.path)?"reload":"postMessage"):"postMessage";r.iframeRefreshMode=c;const u=Ce(o?r.query:s.query);o&&(u.__src=encodeURIComponent(r.path));const d={id:i,tabId:n,path:l,query:J(u,{__tab:Le(r)})},f=new Re;f.push(d);const m={id:n,title:r.title??"",closable:r.closable,refreshable:r.refreshable,iframe:o,iframeRefreshMode:c,url:o?ve(r.path):void 0,active:!1,pages:f,pinned:a.pinned};return W(i),m};if(a){const e=o(a,{pinned:!0,closable:!1});n=e.id,r.push({...e})}for(const e of t){if(n&&e.id===n)continue;const t=o(e);r.push({...t})}T(r);const s="undefined"!=typeof window?sessionStorage.getItem(fe()):null,i=ue(s);if(i&&!p(i.id))if(i.url&&(i.url=ve(i.url)),i.iframe&&i.url&&void 0===i.iframeRefreshMode&&(i.iframeRefreshMode=_e(i.url)?"reload":"postMessage"),i.pages&&"function"==typeof i.pages.list){k(i);for(const e of v(i.id))e&&e.id&&W(e.id)}else k(i);u.value=!0},size:()=>d().length,active:(e,t=!0)=>{r.emit(He.FORWARD);const n=f(e);if(!n)return Promise.resolve();if(n.active)return r.emit(He.TAB_SCROLL_TO,{id:e}),Promise.resolve();const o=g(e),s=()=>{const t=w(e);t&&le(t)};if(!t)return s(),Promise.resolve();if(!o)return s(),Promise.resolve();const i=Te(o.query);return"string"==typeof i.__tab&&i.__tab||(i.__tab=Le(be(n))),Xe({apply:()=>{const e=m()?.id,t="undefined"!=typeof window?window.sessionStorage.getItem(fe()):null;return s(),{prevActiveId:e,sessionSnapshot:t}},navigate:()=>a.push({path:o.path,query:i}),rollback:e=>{w(e.prevActiveId??""),de(e.sessionSnapshot)},isFailureResult:U,rejectFailureResult:!0})},updateTabTitle:(e,t)=>{if(!S(e,t))return!1;const r=f(e);if(!r)return!1;if(r.active){le(r);const t=g(e);t&&Promise.resolve(a.replace({path:t.path,query:{...Te(t.query),__tab:Le(be(r))},hash:a.currentRoute.value.hash})).catch(e=>{})}return!0},getCacheName:()=>We(),destroy:()=>{re(),c.value={},e.scrollPositionsByPageId.clear(),e.isInitialized.value=!1,e.refreshKey.value=0,ce()},reset:()=>$e(),addCache:W,removeCache:$,getTab:f,getActiveTab:m,getTopPage:g,getPages:v,getPageRefreshVersion:_,getPageSnapshot:y,moveTab:P,addTab:k,appendPage:x,popPages:A,replacePages:R,clearPages:M,updatePage:L,updatePages:O,removeTab:e=>{const t=I(e);return"not-found"===t.status?"":"not-closable"===t.status?e:(t.nextActiveId&&r.emit(He.TAB_ACTIVE,{id:t.nextActiveId}),t.nextActiveId)},removeAllTabs:$e,removeLeftTabs:e=>{const t=d().findIndex(t=>t?.id===e);if(t<=0)return;if(Ee((e,a)=>a<t),m())return F(),void H();const a=d()[0];a&&r.emit(He.TAB_ACTIVE,{id:a.id})},removeRightTabs:e=>{const t=d(),a=t.findIndex(t=>t?.id===e);if(a<0||a>=t.length-1)return;if(Ee((e,t)=>t>a),m())return F(),void H();const n=d().at(-1);n&&r.emit(He.TAB_ACTIVE,{id:n.id})},removeOtherTabs:e=>{const t=f(e);Ee(t=>t.id!==e),t&&!t.active?r.emit(He.TAB_ACTIVE,{id:e}):(F(),H())},hasTab:p,renewTab:e=>{const t=f(e.id);if(!t)return;const a=y(t.id),r=te(),n=Z();return q(t),F(),M(t.id),()=>{R(t.id,a),ae(r),ee(n)}},addPage:(e,t)=>{if(!t)return(e=>{if("string"==typeof e.query.__tab)return!1;const t=yt(e),a=m();if(a&&g(a.id)?.path===t)return!1;if(b(t))return!1;const r=pe();return Boolean(r&&g(r.id))})(e)&&he(),_t();const a=`${e.fullPath}::${l.value}`;if(a===Ae&&Me)return Me;const r=Se(e);if("empty"in r)return _t();if("recovered"in r)return W(r.cacheName),Pe.value=r.cacheName,Ae=a,Me=r.recovered,r.recovered;Pe.value=r.cacheName;const n=me(r);return Ae=a,Me=n,n},addComponent:X,getComponent:G,removeComponent:Q,markCacheForEviction:V,evictMarkedCaches:F,evictPageCache:D,clearTabEvictionMarks:H,refreshTab:Fe,refreshAllTabs:De,iframeRefreshKeys:c,addPageScroller:ie,setGlobalScroll:t=>{e.useGlobalScroll.value=t},clearSession:ce,setSessionPrefix:t=>{e.sessionPrefix.value=t}}},Tt=/* @__PURE__ */new WeakMap,wt=e=>{const t=e??je(),a=Tt.get(t);if(a)return a;const r=kt(t);return Tt.set(t,r),r};function St(e){const t=Y(),a=e??je(),{active:r,updateTabTitle:n,hasTab:o,refreshKey:s,reset:i,canAddTab:l,renewTab:c,getTab:u,getTopPage:d,tabs:f,moveTab:m,removeTab:b,removeAllTabs:p,refreshTab:h,refreshAllTabs:v}=wt(a),g=(e,r,n=!1)=>{const o=Le(r),s=Ce(e.query);let i,l,c=J(s,{__tab:o});if(e.iframe)c={...c,__src:encodeURIComponent(e.path),__tab:o},i=a.iframePath.value;else{const t=ye(e.path);i=t.path,l=t.hash||void 0,c=J(Ce(t.query),c,{__tab:o}),c={...c,__tab:o}}return he(e.path)?Xe({apply:()=>{},navigate:()=>t.push({path:i,query:c,hash:l}),rollback:()=>{},isFailureResult:e=>U(e)&&!(n&&U(e,G.duplicated)),rejectFailureResult:!0}):Promise.reject(/* @__PURE__ */new Error("Invalid tab URL"))};return{openTab:(e,t=!1)=>new Promise((a,n)=>{const i=(e=>{const t={refreshable:!0,closable:!0,iframe:!1};e.iframe&&void 0===e.iframeRefreshMode?t.iframeRefreshMode=_e(e.path??"")?"reload":"postMessage":e.iframe&&(t.iframeRefreshMode=e.iframeRefreshMode??"postMessage");const a=J(e,t);return a.id||(a.id=qe()),a})(e),d=Boolean(i.id&&o(i.id));if(d&&!t)return void Promise.resolve(r(i.id)).then(()=>a(i.id),n);let f,m;if(i.id&&t&&d){const t=u(i.id);f=c(e),t?.active&&(m=s.value,s.value++)}d||l()?g(e,i,d&&t).then(()=>a(i.id),e=>{f?.(),void 0!==m&&(s.value=m),n(e)}):n(/* @__PURE__ */new Error("Max Size"))}),closeTab:b,closeAllTabs:p,refreshTab:h,refreshAllTabs:v,activeTab:r,moveTab:m,updateTabTitle:n,reset:i,tabs:f,setIFramePath:e=>{a.iframePath.value=e},getWrapper:(e={})=>{if("undefined"==typeof document)return;const t=e.pageId??(e.tabId?d(e.tabId)?.id:void 0);return t?document.getElementById(`W-${t}`)??void 0:document.querySelector(".stack-tab__cache-page-wrapper")??void 0},openInNewWindow:e=>{const t=u(e);t?.iframe&&t.url&&he(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")}}}var Pt=["disabled"],It=(e,t)=>{const a=e.__vccOpts||e;for(const[r,n]of t)a[r]=n;return a},Ct=/*#__PURE__*/It(/*@__PURE__*/m({__name:"ContextMenuItem",props:{icon:{default:""},title:{},disabled:{type:Boolean,default:!1}},setup:e=>(t,a)=>(A(),u("button",{type:"button",role:"menuitem",class:"stack-tab__context-menu-item",disabled:e.disabled},[d("span",{class:y(["stack-tab__context-menu-icon",e.icon]),"aria-hidden":"true"},null,2),d("span",{class:"stack-tab__context-menu-title",onContextmenu:a[0]||(a[0]=H(()=>{},["prevent"]))},W(e.title),33)],8,Pt))}),[["__scopeId","data-v-fd76fc18"]]),xt={key:1,class:"divider div-transparent",role:"separator","aria-orientation":"horizontal"},At=/*#__PURE__*/It(/*@__PURE__*/m({__name:"index",props:{index:{},left:{default:0},top:{default:0},contextMenu:{default:()=>[]},restoreFocusElement:{default:null},tabItem:{},max:{}},emits:["close"],setup(e,{emit:r}){const n=e,o=r,{t:s}=t(),i=E(),d=M({left:n.left,top:n.top}),{closeTab:m,closeAllTabs:b,refreshTab:p,refreshAllTabs:h,openInNewWindow:v}=St(),{removeLeftTabs:g,removeRightTabs:y,removeOtherTabs:T}=wt(),w=E(0),S=()=>{n.restoreFocusElement&&document.contains(n.restoreFocusElement)?n.restoreFocusElement.focus():document.querySelector('[role="tab"][aria-selected="true"]')?.focus()},P=()=>{o("close"),_(S)},C=e=>{e?.(),P()},x=()=>{const e=i.value;return e?Array.from(e.querySelectorAll('[role="menuitem"]')).filter(e=>!e.disabled):[]},R=e=>{const t=x();t.length<=0||t[(e+t.length)%t.length]?.focus()},O=()=>x().findIndex(e=>e===document.activeElement),B=e=>{if("Escape"===e.key)return e.preventDefault(),void P();if("ArrowDown"===e.key){e.preventDefault();const t=O();return void R(-1===t?0:t+1)}if("ArrowUp"===e.key){e.preventDefault();const t=O();return void R(-1===t?-1:t-1)}if("Home"===e.key)return e.preventDefault(),void R(0);"End"===e.key&&(e.preventDefault(),R(x().length-1))},V=e=>e.key??`${e.title}-${e.icon??""}`;return I(()=>{de(".stack-tab,.stack-tab *"),w.value=fe(".stack-tab,.stack-tab *");const e=i.value,t=e?.clientWidth??0,a=e?.clientHeight??0;d.left+t>window.innerWidth&&(d.left=window.innerWidth-t-5),d.top+a>window.innerHeight&&(d.top=Math.max(0,window.innerHeight-a-5)),R(0)}),(t,r)=>(A(),u("div",{ref_key:"menuElementRef",ref:i,class:"stack-tab__context-menu",role:"menu",tabindex:"-1",style:k({left:`${d.left}px`,top:`${d.top}px`,"z-index":w.value}),onKeydown:B},[f(Ct,{icon:"stack-tab__icon stack-tab__icon--reload stack-tab__icon--mask",title:D(s)("VueStackTab.reload"),disabled:!e.tabItem.refreshable,onClick:r[0]||(r[0]=t=>C(()=>D(p)(e.tabItem.id)))},null,8,["title","disabled"]),f(Ct,{icon:"stack-tab__icon stack-tab__icon--reload-all stack-tab__icon--mask",title:D(s)("VueStackTab.reloadAll"),onClick:r[1]||(r[1]=e=>C(D(h)))},null,8,["title"]),f(Ct,{icon:"stack-tab__icon stack-tab__icon--close stack-tab__icon--mask",title:D(s)("VueStackTab.close"),disabled:!e.tabItem.closable,onClick:r[2]||(r[2]=t=>C(()=>D(m)(e.tabItem.id)))},null,8,["title","disabled"]),f(Ct,{icon:"stack-tab__icon stack-tab__icon--close-lefts stack-tab__icon--mask",title:D(s)("VueStackTab.closeLeft"),disabled:e.index<=0,onClick:r[3]||(r[3]=t=>C(()=>D(g)(e.tabItem.id)))},null,8,["title","disabled"]),f(Ct,{icon:"stack-tab__icon stack-tab__icon--close-rights stack-tab__icon--mask",title:D(s)("VueStackTab.closeRight"),disabled:e.index>=e.max-1,onClick:r[4]||(r[4]=t=>C(()=>D(y)(e.tabItem.id)))},null,8,["title","disabled"]),f(Ct,{icon:"stack-tab__icon stack-tab__icon--close-others stack-tab__icon--mask",title:D(s)("VueStackTab.closeOthers"),onClick:r[5]||(r[5]=t=>C(()=>D(T)(e.tabItem.id)))},null,8,["title"]),f(Ct,{icon:"stack-tab__icon stack-tab__icon--close-all stack-tab__icon--mask",title:D(s)("VueStackTab.closeAll"),onClick:r[6]||(r[6]=e=>C(D(b)))},null,8,["title"]),e.tabItem.iframe&&e.tabItem.url?(A(),l(Ct,{key:0,icon:"stack-tab__icon stack-tab__icon--open stack-tab__icon--mask",title:D(s)("VueStackTab.openInNewWindow"),onClick:r[7]||(r[7]=t=>C(()=>D(v)(e.tabItem.id)))},null,8,["title"])):c("",!0),void 0!==e.contextMenu&&e.contextMenu.length>0?(A(),u("div",xt)):c("",!0),(A(!0),u(a,null,L(e.contextMenu,t=>(A(),l(Ct,{key:V(t),"data-menu-key":V(t),icon:t.icon,title:t.title,disabled:t.disabled(e.tabItem),onClick:a=>C(()=>!t.disabled(e.tabItem)&&t.callback(e.tabItem.id))},null,8,["data-menu-key","icon","title","disabled","onClick"]))),128))],36))}}),[["__scopeId","data-v-626ff171"]]),Rt=e=>`stack-tab-tab-${encodeURIComponent(e)}`,Mt=e=>`stack-tab-panel-${encodeURIComponent(e)}`,Et=["draggable"],Lt=["id","data-tab-id","aria-controls","aria-selected","tabindex","title"],Ot={class:"stack-tab__item-title"},Bt={class:"stack-tab__item-title-content"},Vt=["title","aria-label","tabindex"],qt=/*@__PURE__*/m({__name:"TabHeaderItem",props:{item:{},dropPosition:{}},emits:["close","active","contextmenu","dragstart","dragover","drop","dragend"],setup(e,{emit:a}){const r=a,n=Ue(),{t:o}=t(),s=E(),l=E(!1),f=e,m=e=>{f.item.id===e.id&&g(e.isRoute??!0)};n.on(He.TAB_ACTIVE,m),x(()=>{n.off(He.TAB_ACTIVE,m)});const b=i(()=>f.item.title||o("VueStackTab.undefined")),p=()=>{r("close",f.item)},h=e=>{f.item.pinned?e.preventDefault():(l.value=!0,e.dataTransfer?.setData("text/plain",f.item.id),e.dataTransfer&&(e.dataTransfer.effectAllowed="move"),r("dragstart",f.item,e))},v=e=>{l.value=!1,r("dragend",f.item,e)},g=(e=!0)=>{r("active",f.item,s.value,e)},_=e=>{if("Enter"===e.key||" "===e.key)return e.preventDefault(),void g(!0);"Delete"!==e.key&&"Backspace"!==e.key||!f.item.closable||(e.preventDefault(),p())};return(t,a)=>(A(),u("li",{ref_key:"tabElementRef",ref:s,role:"presentation",class:y(["stack-tab__item",{"stack-tab__item--active":e.item.active,"stack-tab__item--closable":e.item.closable,"stack-tab__item--pinned":e.item.pinned,"stack-tab__item--dragging":l.value,"stack-tab__item--drop-before":"before"===e.dropPosition,"stack-tab__item--drop-after":"after"===e.dropPosition}]),draggable:!e.item.pinned,onClick:a[1]||(a[1]=H(e=>g(!0),["self"])),onContextmenu:a[2]||(a[2]=e=>t.$emit("contextmenu",e)),onDragstart:h,onDragend:v,onDragover:a[3]||(a[3]=H(a=>t.$emit("dragover",e.item,a),["prevent"])),onDrop:a[4]||(a[4]=H(a=>t.$emit("drop",e.item,a),["prevent"]))},[d("button",{id:D(Rt)(e.item.id),type:"button",role:"tab",class:"stack-tab__item-tab","data-tab-id":e.item.id,"aria-controls":D(Mt)(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:_},[d("span",Ot,[d("span",Bt,W(b.value),1)])],40,Lt),e.item.closable?(A(),u("button",{key:0,type:"button",class:"stack-tab__icon 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:H(p,["stop"])},null,8,Vt)):c("",!0)],42,Et))}}),Wt=["disabled","title","aria-label"],$t={key:1,class:"stack-tab__button"},Ft=/*@__PURE__*/m({__name:"TabHeaderButton",props:{disabled:{type:Boolean,default:!1},shadow:{default:null},iconClass:{default:""},title:{default:""},ariaLabel:{default:""}},setup(e){const t=e,a=i(()=>t.ariaLabel||t.title);return(t,r)=>(A(),u("button",{type:"button",class:y(["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?c("",!0):(A(),u("span",{key:0,class:y(["stack-tab__mask-button",e.iconClass])},null,2)),"icon"in t.$slots?(A(),u("span",$t,[O(t.$slots,"icon")])):c("",!0)],10,Wt))}}),Dt=/*@__PURE__*/m({__name:"TabHeaderScroll",props:{space:{default:300},isScrollWheel:{type:Boolean,default:!0},isScrollButton:{type:Boolean,default:!0}},setup(e,{expose:r}){const{t:n}=t(),o=E(null),s=E(null),i=E(null),f=E(!1),m=E(!1),b=E(!1),p=E(!1),h=E(!1),v=E(),g=e,_={clientWidth:0,scrollWidth:0,scrollLeft:0},k={startPageX:0,startThumbLeft:0};let T=0,w=0,S=null;const P=()=>{const{clientWidth:e,scrollWidth:t}=_;return t<=e||0===t?0:e/t*e},C=e=>{const{clientWidth:t,scrollWidth:a}=_,r=a-t;return r<=0?0:(t-P())*(e/r)},R=()=>{const e=o.value;e&&(_.clientWidth=e.clientWidth,_.scrollWidth=e.scrollWidth,_.scrollLeft=e.scrollLeft,h.value=_.scrollWidth>_.clientWidth,p.value=g.isScrollButton&&h.value,m.value=_.scrollLeft<=10,b.value=_.clientWidth+_.scrollLeft-_.scrollWidth>=-10,(e=>{const t=i.value;t&&h.value&&(t.style.width=`${P()}px`,t.style.transform=`translateX(${C(e)}px)`)})(_.scrollLeft))},M=()=>{const e=o.value?.querySelector(".stack-tab__item--active");e&&!Y(e)&&X(e)};let L=null,B=null,V=0;const q=(e,t=!0)=>{ce({wrap:o.value,left:e,top:0,smooth:t})},W=e=>{q(o.value.scrollLeft+e)},$=e=>{if(!g.isScrollWheel||!o.value)return;if(Math.abs(e.deltaX)>Math.abs(e.deltaY))return;if(!e.deltaY)return;const t=e.deltaY<0;q(o.value.scrollLeft+(t?-g.space:g.space))},F=()=>{if(T=0,!f.value||!o.value)return;const{clientWidth:e,scrollWidth:t}=_,a=t-e,r=e-P();if(a<=0||r<=0)return;const n=Math.min(Math.max(k.startThumbLeft+w-k.startPageX,0),r);ce({wrap:o.value,left:n*a/r,top:0,smooth:!1}),i.value&&(i.value.style.transform=`translateX(${n}px)`)},z=e=>{const t=i.value,a="mouse"!==e.pointerType||0===e.button;if(!t||!a)return;const r=o.value?.scrollLeft??0;k.startPageX=e.pageX,k.startThumbLeft=C(r),w=e.pageX,f.value=!0,S=e.pointerId,t.setPointerCapture?.(e.pointerId)},G=e=>{f.value&&(w=e.pageX,T||(T=requestAnimationFrame(F)))},U=()=>{T&&(cancelAnimationFrame(T),T=0),f.value=!1;const e=S;S=null;const t=i.value;t&&null!==e&&t.hasPointerCapture?.(e)&&t.releasePointerCapture(e)};I(()=>{if("undefined"!=typeof ResizeObserver){L=new ResizeObserver(()=>{R(),M()}),B=new ResizeObserver(()=>{const e=o.value?.querySelectorAll(".stack-tab__item").length??0,t=e!==V;V=e,h.value&&t&&M(),R()}),v.value&&L.observe(v.value);const e=o.value?.querySelector(".stack-tab__nav");V=o.value?.querySelectorAll(".stack-tab__item").length??0,e&&B.observe(e)}R()}),x(()=>{U(),L?.disconnect(),B?.disconnect(),L=null,B=null}),K(()=>g.isScrollButton,()=>{p.value=g.isScrollButton&&h.value});const X=e=>{!function({el:e,wrap:t,block:a="start",inline:r="nearest"}){const n=t&&"object"==typeof t&&"value"in t?t.value:t;if(e&&n)if(e.scrollIntoView)e.scrollIntoView({behavior:"smooth",block:a,inline:r});else{const{offsetLeft:t,offsetTop:o}=e;let s,i;i="center"===a?o+(e.clientHeight-n.clientHeight)/2:o,s="center"===r?t+(e.clientWidth-n.clientWidth)/2:t,ce({wrap:n,left:s,top:i})}}({el:e,wrap:o.value,block:"end",inline:"center"})},Y=e=>{if(!h.value)return!0;const t=e.offsetLeft,a=o.value.scrollLeft;return!(t<a||t+e.clientWidth>a+o.value.clientWidth)};return r({scrollIntoView:X,isInView:Y}),(t,r)=>(A(),u(a,null,[p.value?(A(),l(Ft,{key:0,"icon-class":"stack-tab__icon stack-tab__icon--left-arrow",disabled:m.value,title:D(n)("VueStackTab.scrollLeft"),"aria-label":D(n)("VueStackTab.scrollLeft"),onClick:r[0]||(r[0]=t=>!m.value&&W(-1*e.space))},null,8,["disabled","title","aria-label"])):c("",!0),d("div",{ref_key:"headerScroll",ref:v,class:"stack-tab__scroll",onWheelPassive:$},[d("div",{ref_key:"container",ref:o,class:y(["stack-tab__scroll-container",{"stack-tab__shadow-inset-left":!m.value&&b.value,"stack-tab__shadow-inset-right":!b.value&&m.value,"stack-tab__shadow-inset-all":!m.value&&!b.value}]),onScrollPassive:R},[O(t.$slots,"default")],34),j(d("div",{ref_key:"bar",ref:s,class:y(["stack-tab__scrollbar",{"stack-tab__scrollbar--dragging":f.value}])},[d("div",{ref_key:"thumb",ref:i,class:y(["stack-tab__scrollbar-thumb",{"stack-tab__scrollbar-thumb--dragging":f.value}]),onPointerdown:H(z,["prevent"]),onPointermove:G,onPointerup:U,onPointercancel:U,onLostpointercapture:U},null,34)],2),[[N,h.value]])],544),p.value?(A(),l(Ft,{key:1,"icon-class":"stack-tab__icon stack-tab__icon--right-arrow",disabled:b.value,title:D(n)("VueStackTab.scrollRight"),"aria-label":D(n)("VueStackTab.scrollRight"),onClick:r[1]||(r[1]=t=>!b.value&&W(e.space))},null,8,["disabled","title","aria-label"])):c("",!0)],64))}}),Nt=/*@__PURE__*/m({__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(e,{emit:r}){const{t:s}=t(),d=h(Fe,E(!1)),m=r,b=E(),p=E(),{shown:v,contextMenuData:y,showContextMenu:k}=(()=>{const e=M({item:{},index:-1,left:0,top:0,max:0}),t=E(!1),a=()=>{t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",s)};let r=0;const n=e=>{e.target.closest?.(".stack-tab__context-menu")||Date.now()-r<250||a()},o=e=>{e.target instanceof HTMLIFrameElement&&a()},s=()=>{window.requestAnimationFrame(()=>{document.activeElement instanceof HTMLIFrameElement&&a()})};return x(()=>{a()}),{shown:t,contextMenuData:e,showContextMenu:async(a,i,l,c)=>{r=Date.now(),t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",s),await _();const{clientY:u,clientX:d}=a;t.value=!0,Object.assign(e,{item:i,index:l,top:u,left:d,max:c}),await _(),document.addEventListener("click",n),document.addEventListener("focusin",o,!0),window.addEventListener("blur",s)}}})(),T=E(null),w=()=>{v.value=!1},S=e,{closeTab:P,activeTab:I,moveTab:C,tabs:R}=St(),B=i(()=>R.value.find(e=>e.active)?.id??""),V=e=>{const t=b.value;if(!t)return;const a=(p.value?.querySelector(e?`.stack-tab__nav [role="tab"][data-tab-id="${CSS.escape(e)}"]`:".stack-tab__nav .stack-tab__item--active"))?.closest(".stack-tab__item");a&&!t.isInView(a)&&t.scrollIntoView(a)};K(B,()=>{_(()=>V())});const q=Ue(),W=({id:e})=>{_(()=>V(e))};q.on(He.TAB_SCROLL_TO,W),x(()=>{q.off(He.TAB_SCROLL_TO,W)});const $=E(null),F=E(null),N=i(()=>!1!==S.contextmenu),j=i(()=>Array.isArray(S.contextmenu)?S.contextmenu:[]),G=(e,t,a,r)=>{N.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))},U=e=>{e.pinned||($.value=e.id)},X=(e,t)=>{if(!$.value||$.value===e.id)return void(F.value=null);const a=t.currentTarget instanceof HTMLElement?t.currentTarget:null;if(!a)return;const{left:r,width:n}=a.getBoundingClientRect(),o=t.clientX<r+n/2?"before":"after";F.value={tabId:e.id,position:e.pinned&&"before"===o?"after":o},t.dataTransfer&&(t.dataTransfer.dropEffect="move")},Y=e=>{const t=$.value,a=F.value;if($.value=null,F.value=null,!t||t===e.id||a?.tabId!==e.id)return;const r=R.value.findIndex(e=>e.id===t),n=R.value.findIndex(t=>t.id===e.id);if(r<0||n<0)return;let o=n;"before"===a.position&&r<n&&o--,"after"===a.position&&r>n&&o++;let s=0;R.value.forEach((e,t)=>{e.pinned&&(s=t+1)}),o=Math.max(o,s),C(t,o)},J=()=>{$.value=null,F.value=null},Q=e=>e.target instanceof Element&&Boolean(e.target.closest(".stack-tab__item")),Z=e=>{if(!$.value||Q(e))return;const t=R.value[R.value.length-1];t&&t.id!==$.value&&(F.value={tabId:t.id,position:"after"},e.dataTransfer&&(e.dataTransfer.dropEffect="move"))},ee=e=>{if(Q(e))return;const t=R.value[R.value.length-1];t&&Y(t)},te=i(()=>"string"==typeof S.tabTransition?{name:S.tabTransition}:S.tabTransition),ae=e=>{const t=R.value[e];var a;t&&(ie(t,void 0,!0),a=String(t.id),_(()=>{const e=p.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))}))},re=e=>{const t=R.value.length;if(t<=0)return;const a=R.value.findIndex(e=>e.active);return"ArrowRight"===e.key?(e.preventDefault(),void ae(-1===a?0:(a+1)%t)):"ArrowLeft"===e.key?(e.preventDefault(),void ae(-1===a?t-1:(a-1+t)%t)):"Home"===e.key?(e.preventDefault(),void ae(0)):void("End"===e.key&&(e.preventDefault(),ae(t-1)))},ne=i(()=>S.tabScrollMode===Ae.BOTH||S.tabScrollMode===Ae.BUTTON),oe=i(()=>S.tabScrollMode===Ae.BOTH||S.tabScrollMode===Ae.WHEEL),se=e=>{e.closable&&P(e.id),v.value=!1},ie=(e,t,a)=>{b.value&&t&&_(()=>{b.value.isInView(t)||b.value.scrollIntoView(t)}),Promise.resolve(I(e.id,a)).then(()=>m("active",e.id)).catch(e=>{})};return(t,r)=>(A(),u("div",{ref_key:"headerRef",ref:p,class:"stack-tab__header"},[O(t.$slots,"leftButton"),f(Dt,{ref_key:"scrollContainerRef",ref:b,space:e.space,"is-scroll-wheel":oe.value,"is-scroll-button":ne.value},{default:z(()=>[f(o,g({key:"tab-list-transition",tag:"ul",class:"stack-tab__nav",role:"tablist","aria-orientation":"horizontal"},te.value,{appear:"",onKeydown:re,onDragover:H(Z,["prevent"]),onDrop:H(ee,["prevent"])}),{default:z(()=>[(A(!0),u(a,null,L(D(R),(e,t)=>(A(),l(qt,{key:e.id,item:e,"drop-position":F.value?.tabId===e.id?F.value.position:void 0,onContextmenu:a=>G(a,e,t,D(R).length),onMouseup:H(t=>se(e),["middle","prevent"]),onClose:se,onActive:ie,onDragstart:U,onDragover:X,onDrop:Y,onDragend:J},null,8,["item","drop-position","onContextmenu","onMouseup"]))),128))]),_:1},16)]),_:1},8,["space","is-scroll-wheel","is-scroll-button"]),O(t.$slots,"rightButton"),f(Ft,{"icon-class":D(d)?"stack-tab__icon stack-tab__icon--restore":"stack-tab__icon stack-tab__icon--fullscreen",title:D(d)?D(s)("VueStackTab.restore"):D(s)("VueStackTab.maximum"),"aria-label":D(d)?D(s)("VueStackTab.restore"):D(s)("VueStackTab.maximum"),onClick:r[0]||(r[0]=e=>d.value=!D(d))},null,8,["icon-class","title","aria-label"]),f(n,{name:"stack-tab-zoom",appear:""},{default:z(()=>[D(v)?(A(),l(At,{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":j.value,"restore-focus-element":T.value,onClose:w},null,8,["left","top","tab-item","max","index","context-menu","restore-focus-element"])):c("",!0)]),_:1})],512))}}),Kt=/*@__PURE__*/m({__name:"StackCacheRenderer",props:{route:{},component:{}},setup(e){const t=e,{refreshKey:a,activeCacheKey:r,addPage:n}=wt(),o=q(_t());return K([()=>t.route.fullPath,()=>{return e=t.component,e?.type??e;var e},()=>a.value],()=>{o.value=n(t.route,t.component)},{immediate:!0}),(t,a)=>O(t.$slots,"default",{wrappedComponent:o.value,activeCacheKey:D(r),component:e.component})}}),zt=/*@__PURE__*/m({__name:"StackKeepAlive",props:{transitionName:{default:"stack-tab-swap"}},emits:["loaded"],setup(e,{emit:t}){const a=t,{caches:o,getPageRefreshVersion:s}=wt(),i=()=>{a("loaded")};return(t,a)=>{const c=B("router-view");return A(),l(c,null,{default:z(({Component:t,route:a})=>[f(Kt,{route:a,component:t},{default:z(({wrappedComponent:t,activeCacheKey:a,component:c})=>[f(n,{name:e.transitionName,appear:"",mode:"out-in"},{default:z(()=>[(A(),l(r,{include:D(o)},[(A(),l(V(t),{key:a,vnode:c,"refresh-version":D(s)(a),"transition-name":e.transitionName,onOnLoaded:i},null,40,["vnode","refresh-version","transition-name"]))],1032,["include"]))]),_:2},1032,["name"])]),_:1},8,["route","component"])]),_:1})}}}),jt=/* @__PURE__ */new Set(["vue-stack-tabs:openTab","openTab"]),Ht=e=>"string"==typeof e||"number"==typeof e||null==e,Gt=e=>"boolean"==typeof e?e:void 0,Ut=e=>{if(!Me(e))return null;const{id:t,title:a,path:r,query:n,iframe:o,closable:s,refreshable:i,iframeRefreshMode:l}=e;if("string"!=typeof a||""===a.trim())return null;if("string"!=typeof r||""===r.trim()||!he(r))return null;const c=(e=>{if(!Me(e))return;const t={};for(const[a,r]of Object.entries(e))(Ht(r)||Array.isArray(r)&&r.every(Ht))&&(t[a]=r);return Object.keys(t).length>0?t:void 0})(n),u=Gt(o),d=Gt(s),f=Gt(i),m=(e=>{if("reload"===e||"postMessage"===e)return e})(l);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}:{},...m?{iframeRefreshMode:m}:{}}};function Xt(e){const{tabs:t,iframeRefreshKeys:a,iframeLoadTimeout:r,t:n}=e,o=i(()=>t.value.filter(e=>e.iframe)),s=i(()=>t.value.find(e=>e.active&&!e.iframe)),l=i(()=>Boolean(s.value)),c=M({}),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,n=a>=0?e.slice(a):"",o=r.indexOf("?"),s=o>=0?r.slice(0,o):r,i=o>=0?r.slice(o+1):"",l=new URLSearchParams(i);return l.set("__stack_tabs_refresh",String(t)),`${s}?${l.toString()}${n}`})(c[e.id]?a:"about:blank",t)},f=i(()=>{const e={};for(const t of o.value){const a=u(t.id);e[t.id]=d(t,a)}return e}),m=M({}),b=e=>m[e]??{status:"idle"},p=/* @__PURE__ */new Map,h=e=>{const t=p.get(e);t&&(clearTimeout(t),p.delete(e))},v=(e,t={})=>{("loaded"!==b(e).status||t.force)&&(h(e),m[e]={status:"loading"},p.set(e,setTimeout(()=>{p.delete(e),"loading"===b(e).status&&(m[e]={status:"timeout",message:n("VueStackTab.iframeLoadTimeout")})},r.value)))},g=M({}),y=i(()=>o.value.map(e=>`${e.id}:${e.active?1:0}`).join("|"));K(y,()=>{const e=o.value;for(const a of e)a.active&&(c[a.id]=!0,v(a.id));const t=new Set(e.map(e=>e.id));for(const a of Object.keys(m))t.has(a)||(h(a),delete m[a],delete c[a],delete g[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}),K(a,(e,t={})=>{for(const a of o.value)a.active&&(e[a.id]??0)!==(t[a.id]??0)&&v(a.id,{force:!0})});return S(()=>{for(const e of p.values())clearTimeout(e);p.clear()}),{iframeTabs:o,activeNonIframeTab:s,hasActiveNonIframeTab:l,iframeSrcMap:f,getIframeRefreshKey:u,getIframeKey:e=>`${e.id}-${u(e.id)}`,getIframeLoadState:b,shouldShowIframeLoading:e=>"loading"===b(e).status,shouldShowIframeError:e=>"timeout"===b(e).status,retryIframe:e=>{m[e]={status:"idle"},a.value={...a.value,[e]:(a.value[e]??0)+1},_(()=>{v(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 n;c[e.id]&&("about:blank"!==d(e,r)&&r===u(e.id)&&a===g[e.id]&&(n=e.id,h(n),m[n]={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||!he(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(n){}},createMessageHandler:(e,t)=>{const a=e=>Object.values(g).some(t=>t?.contentWindow===e);return r=>{if(!e.value.includes(r.origin))return;const n=((e,t)=>{if(!t(e.source))return null;if(!Me(e.data))return null;const a=e.data;return"string"==typeof a.type&&jt.has(a.type)?Ut(a.payload):null})(r,a);n&&t(n).catch(e=>{})}}}}var Yt={class:"stack-tab__container"},Jt=["id","role","aria-labelledby","aria-hidden","hidden"],Qt={class:"stack-tab__iframes"},Zt=["id","aria-labelledby"],ea=["aria-label"],ta={class:"stack-tab__iframe-loading-text"},aa={key:1,class:"stack-tab__iframe-error",role:"alert"},ra={class:"stack-tab__iframe-error-text"},na=["onClick"],oa=["onClick"],sa=["src","data-refresh-key","title","sandbox","referrerpolicy","allow","onLoad"],ia=/*@__PURE__*/m({__name:"StackTabs",props:{defaultTabs:{default:()=>[]},homeTab:{default:void 0},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(e,{emit:r}){const o=r,s=e;"string"!=typeof s.iframePath||s.iframePath.trim();const{changeLocale:m,t:p}=t(),v=h($e,null)??ze({iframePath:s.iframePath,maxTabCount:s.max,useGlobalScroll:s.globalScroll,sessionPrefix:s.sessionPrefix}),g=b()?.appContext.app,_=((e,t={})=>{if(t.app&&!Ke.has(t.app))return Ke.add(t.app),!0;if(!t.app){if(!De)return De=e,Ne=!0,!0;if(De===e&&!Ne)return Ne=!0,!0}if(t.isProduction??!0)return!1;throw new Error("VueStackTabs only supports one <VueStackTabs> instance per Vue app.")})(v,g?{app:g}:void 0);_&&(R($e,v),R(Ge,v.eventBus));const T=E(!1),P=E();_&&R(Fe,T),K(T,e=>{de(),P.value=e?fe("body *:not(.stack-tab,.stack-tab *)"):void 0});const{tabs:I,iframeRefreshKeys:C,destroy:x,initialize:M,setMaxSize:B,setGlobalScroll:V,setSessionPrefix:q}=_?wt(v):{tabs:v.tabs,iframeRefreshKeys:v.iframeRefreshKeys,destroy:()=>{},initialize:()=>{},setMaxSize:()=>{},setGlobalScroll:()=>{},setSessionPrefix:()=>{}},{setIFramePath:F,openTab:H,openInNewWindow:G}=_?St(v):{setIFramePath:()=>{},openTab:()=>Promise.resolve(void 0),openInNewWindow:()=>{}};_&&(F(s.iframePath),V(s.globalScroll),B(s.max),xe(m,s.i18n),K(()=>s.max,e=>B(e)),K(()=>s.globalScroll,e=>V(e)),K(()=>s.sessionPrefix,e=>q(e)),K(()=>s.i18n,e=>xe(m,e)));const U=e=>{o("onActive",e)},X=()=>{o("onPageLoaded")},Y=E(s.pageTransition),J=v.eventBus;K(()=>s.pageTransition,(e,t)=>{Y.value===t&&(Y.value=e)}),K(()=>s.pageTransitionBack,(e,t)=>{Y.value===t&&(Y.value=e)});const Q=()=>{Y.value=s.pageTransition},Z=()=>{Y.value=s.pageTransitionBack};_&&(J.on(He.FORWARD,Q),J.on(He.BACKWARD,Z));const{iframeTabs:ee,activeNonIframeTab:te,hasActiveNonIframeTab:ae,iframeSrcMap:re,getIframeRefreshKey:ne,getIframeKey:oe,getIframeLoadState:se,shouldShowIframeLoading:ie,shouldShowIframeError:le,retryIframe:ce,setIframeRef:ue,handleIframeLoad:me,handleRefreshIframePostMessage:be,createMessageHandler:pe}=Xt({tabs:I,iframeRefreshKeys:C,iframeLoadTimeout:$(s,"iframeLoadTimeout"),t:p}),ve=pe(i(()=>["undefined"!=typeof window?window.location.origin:"",...s.iframeAllowedOrigins??[]].filter(Boolean)),H);return _&&J.on(He.REFRESH_IFRAME_POSTMESSAGE,be),w(()=>{_&&(q(s.sessionPrefix),M(s.defaultTabs,s.homeTab),window.addEventListener("message",ve))}),S(()=>{_&&(window.removeEventListener("message",ve),J.off(He.REFRESH_IFRAME_POSTMESSAGE,be),J.off(He.FORWARD,Q),J.off(He.BACKWARD,Z),x(),((e,t={})=>{t.app?Ke.delete(t.app):(De===e&&(Ne=!1),De===e&&(De=null))})(v,g?{app:g}:void 0))}),(t,r)=>D(_)?(A(),u("div",{key:0,class:y(["stack-tab",{"stack-tab--maximum":T.value}]),style:k({width:e.width,height:e.height,"z-index":P.value})},[f(Nt,{space:e.space,"tab-transition":e.tabTransition,"tab-scroll-mode":e.tabScrollMode,contextmenu:e.contextmenu,max:e.max,onActive:U},{leftButton:z(()=>[O(t.$slots,"leftButton")]),rightButton:z(()=>[O(t.$slots,"rightButton")]),_:3},8,["space","tab-transition","tab-scroll-mode","contextmenu","max"]),d("div",Yt,[f(n,{name:Y.value,appear:""},{default:z(()=>[j((A(),u("div",{id:D(te)?D(Mt)(D(te).id):void 0,key:"keep-alive",class:"stack-tab__keep-alive-panel",role:D(te)?"tabpanel":void 0,"aria-labelledby":D(te)?D(Rt)(D(te).id):void 0,"aria-hidden":D(te)?void 0:"true",hidden:!D(ae)},[f(zt,{"transition-name":Y.value,onLoaded:X},null,8,["transition-name"])],8,Jt)),[[N,D(ae)]])]),_:1},8,["name"]),d("div",Qt,[(A(!0),u(a,null,L(D(ee),a=>(A(),l(n,{key:D(oe)(a),name:Y.value,appear:""},{default:z(()=>[j((A(),u("div",{id:D(Mt)(a.id),key:D(oe)(a),class:"stack-tab__iframe-wrapper",role:"tabpanel","aria-labelledby":D(Rt)(a.id)},[D(ie)(a.id)?(A(),u("div",{key:0,class:"stack-tab__iframe-loading",role:"status","aria-live":"polite","aria-label":D(p)("VueStackTab.loading")},[O(t.$slots,"iframeLoading",{tab:a},()=>[d("span",ta,W(D(p)("VueStackTab.loading")),1)])],8,ea)):c("",!0),D(le)(a.id)?(A(),u("div",aa,[O(t.$slots,"iframeError",{tab:a,retry:D(ce)},()=>[d("span",ra,W(D(se)(a.id).message??D(p)("VueStackTab.iframeLoadTimeout")),1),d("button",{type:"button",class:"stack-tab__iframe-error-retry",onClick:e=>D(ce)(a.id)},W(D(p)("VueStackTab.retry")),9,na),a.url&&D(he)(a.url)?(A(),u("button",{key:0,type:"button",class:"stack-tab__iframe-error-open",onClick:e=>D(G)(a.id)},W(D(p)("VueStackTab.openInNewWindow")),9,oa)):c("",!0)])])):c("",!0),d("iframe",{ref_for:!0,ref:e=>D(ue)(a.id,e),class:"stack-tab__iframe",src:D(re)[a.id]||"about:blank","data-refresh-key":D(ne)(a.id),title:a.title||D(p)("VueStackTab.iframeTitle")||"Stack tab iframe",sandbox:e.iframeSandbox||void 0,referrerpolicy:e.iframeReferrerPolicy,allow:e.iframeAllow||void 0,frameborder:"0",onLoad:e=>D(me)(a,e)},null,40,sa)],8,Zt)),[[N,a.active]])]),_:2},1032,["name"]))),128))])])],6)):c("",!0)}});function la(){const{attrs:e,props:t}=b(),a=e.tId??t.tId,r=e.pId??t.pId,n=X(),o=Y(),s=Ue(),{getTab:i,getTopPage:l,getPages:c,appendPage:u,popPages:d,getPageSnapshot:f,replacePages:m,updatePage:p,evictPageCache:h,addPageScroller:v,active:g}=wt(),_=n.query.__tab;let y=0;return{forward:e=>{const t=i(a),r=e.query||{},n=ke(e.path);if(t){const e=l(t.id);if(e&&e.path===n&&Ie(r,e.query||{}))return void(t.active||g(t.id))}const d={...Ce(r)};"string"==typeof _&&_&&(d.__tab=_);const b=++y;s.emit(He.FORWARD);let p="";Xe({apply:()=>{const e=t?f(t.id):[];return t&&(p=We(),u(t.id,{id:p,tabId:t.id,path:n,query:Te(d)})),e},navigate:()=>o.push({path:e.path,query:d}),rollback:e=>{t&&m(t.id,e)},isFailureResult:U,isCurrent:()=>y===b,cleanupStale:()=>{if(!t||!p)return;const e=c(t.id).filter(e=>e.id!==p);m(t.id,e)}}).catch(e=>{})},backward:(e,t)=>{const r=i(a);if(!r)return!1;const n=c(r.id);let u=0;if("number"==typeof e)u=Math.abs(e);else{const t=ye(e),a=t.query||{},r=ke(t.path);let o=!1;for(let e=n.length-2;e>=0;e--){u++;const t=n[e];if(t?.path===r&&Ie(a,t?.query||{})){o=!0;break}}if(!o)return!1}if(u<=0)return!1;const b=n.length-1;if(b<u&&(u=b),u<=0)return!1;const v=f(r.id),g=d(r.id,u).map(e=>e.id),k=l(r.id);if(!k)return m(r.id,v),!1;t&&p(r.id,k.id,{_backParams:t}),s.emit(He.BACKWARD);const T={...Ce(k.query||{})};"string"==typeof _&&_&&(T.__tab=_);const w=++y;return Xe({apply:()=>v,navigate:()=>o.push({path:k.path,query:T}),rollback:e=>m(r.id,e),isFailureResult:U,isCurrent:()=>y===w,commit:()=>{for(const e of g)h(e)},cleanupStale:()=>{const e=new Set(c(r.id).map(e=>e.id));for(const t of g)e.has(t)||h(t)}}).catch(e=>{}),!0},addScrollTarget:(...e)=>{v(r,...e)}}}var ca=/*@__PURE__*/m({__name:"iframe",setup:e=>(la(),()=>{})}),ua=()=>{const e=Ue(),{attrs:t}=b(),a=()=>String(t.tId??"");x(()=>{r()});const r=()=>{e.emit(He.PAGE_LOADING,{tId:a(),value:!1})};return{openTabLoading:()=>{e.emit(He.PAGE_LOADING,{tId:a(),value:!0})},closeTabLoading:r}},da="vue-stack-tabs:refresh",fa="vue-stack-tabs:openTab";function ma(e,t={}){"undefined"!=typeof window&&window.parent&&window.parent.postMessage({type:fa,payload:e},t.targetOrigin??window.location.origin)}function ba(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 pa={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")})("2.3.0");const a=ze();e.provide($e,a),e.provide(Ge,a.eventBus),e.component("VueStackTabs",ia).use(le().getI18n(t))}};export{ca as IFrame,fa as MSG_OPEN_TAB,da as MSG_REFRESH,Re as Stack,ia as StackTab,ia as VueStackTabs,Ft as TabHeaderButton,Ae as TabScrollMode,pa as default,ba as onRefreshRequest,ma as postOpenTab,St as useTabActions,ua as useTabLoading,la as useTabRouter};
1
+ import{createI18n as e,useI18n as t}from"vue-i18n-lite";import{Fragment as a,KeepAlive as r,Transition as n,TransitionGroup as o,cloneVNode as s,computed as i,createBlock as l,createCommentVNode as c,createElementBlock as u,createElementVNode as d,createVNode as f,defineComponent as m,getCurrentInstance as b,hasInjectionContext as p,inject as h,markRaw as v,mergeProps as g,nextTick as _,normalizeClass as y,normalizeStyle as k,onActivated as T,onBeforeMount as w,onBeforeUnmount as S,onDeactivated as I,onMounted as P,onScopeDispose as C,onUnmounted as x,openBlock as A,provide as R,reactive as M,ref as E,renderList as L,renderSlot as O,resolveComponent as B,resolveDynamicComponent as V,shallowRef as q,toDisplayString as W,toRef as $,triggerRef as F,unref as D,vShow as N,watch as K,withCtx as z,withDirectives as j,withModifiers as H}from"vue";import{NavigationFailureType as G,isNavigationFailure as U,useRoute as X,useRouter as Y}from"vue-router";import{defu as J}from"defu";import Q from"mitt";var Z=Object.defineProperty,ee=(e,t)=>{let a={};for(var r in e)Z(a,r,{get:e[r],enumerable:!0});return t||Z(a,Symbol.toStringTag,{value:"Module"}),a},te=/* @__PURE__ */ee({default:()=>ae}),ae={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"}},re=/* @__PURE__ */ee({default:()=>ne}),ne={VueStackTab:{close:"关闭",closeLeft:"关闭左侧",closeRight:"关闭右侧",closeOthers:"关闭其他",closeAll:"关闭所有",reload:"刷新",reloadAll:"刷新所有",maximum:"最大化",restore:"还原",undefined:"未命名",loading:"加载中",iframeTitle:"标签页内嵌页面",iframeLoadTimeout:"iframe 加载超时",retry:"重试",openInNewWindow:"在新窗口打开",scrollLeft:"向左滚动",scrollRight:"向右滚动"}},oe=/* @__PURE__ */new Set(["__proto__","constructor","prototype"]),se=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),ie=(e,t)=>{const a={...e};for(const[r,n]of Object.entries(t)){if(oe.has(r))continue;const e=a[r];a[r]=se(e)&&se(n)?ie(e,n):n}return a},le=()=>{const t=/* #__PURE__ */Object.assign({"./lang/en.ts":te,"./lang/zh-CN.ts":re});const a=()=>{const e={};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(".")),n=t[e];t[e]=n?{...n,...r.default}:r.default}}}(t,e),e};return{getI18n:t=>{const r=((e,t)=>{const a={...e};if(!t)return a;for(const r of t)r.messages&&!oe.has(r.locale)&&(a[r.locale]=ie(a[r.locale]??{},r.messages));return a})(a(),t);return e({locale:t?.[0]?.locale??"zh-CN",fallbackLocale:"en",messages:r})}}},ce=({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 ue=/* @__PURE__ */new Map,de=e=>{void 0!==e?ue.delete(e):ue.clear()},fe=(e=".stack-tab__container *")=>{const t=Date.now(),a=ue.get(e);if(a&&t-a.timestamp<100)return a.value;const r=document.querySelectorAll(e);let n=0;for(let s=0;s<r.length;s++){const e=+window.getComputedStyle(r[s]).zIndex||0;e<89999&&e>n&&(n=e)}const o=n+1;return ue.set(e,{value:o,timestamp:t}),o},me=/* @__PURE__ */new Set(["about:blank"]),be=/* @__PURE__ */new Set(["__tab","__src"]),pe=()=>"undefined"!=typeof window?window.location.origin:"http://localhost";function he(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(me.has(t.toLowerCase()))return!0;if(t.toLowerCase().startsWith("about:"))return!1;try{const e=new URL(t,pe());return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}function ve(e){return he(e)?e:"about:blank"}function ge(e){if("string"!=typeof e)return"about:blank";try{return ve(decodeURIComponent(e))}catch{return"about:blank"}}function _e(e){if(!e)return!1;const t=pe();try{const a=new URL(e,t);return("http:"===a.protocol||"https:"===a.protocol)&&a.origin!==new URL(t).origin}catch{return!0}}function ye(e){const t=e.indexOf("#"),a=t>=0?e.slice(t):"",[r="",n]=(t>=0?e.slice(0,t):e).split("?");if(void 0===n)return{path:r,query:{},hash:a};const o=new URLSearchParams(n),s={};for(const[i,l]of o.entries()){const e=s[i];void 0!==e?s[i]=Array.isArray(e)?[...e,l]:[e,l]:s[i]=l}return{path:r,query:s,hash:a}}function ke(e){return e&&"/"!==e?e.replace(/\/+$/,"")||"/":e}function Te(e={}){const t={};for(const[a,r]of Object.entries(e))t[a]=Array.isArray(r)?[...r]:r;return t}function we(e){return{...e,query:e.query?Te(e.query):void 0,_backParams:e._backParams?{...e._backParams}:void 0}}var Se=e=>be.has(e)||"_back"===e,Ie=(e,t)=>{const a=Array.isArray(e),r=Array.isArray(t);if(a||r){if(!a||!r||e.length!==t.length)return!1;for(let a=0;a<e.length;a++){const r=e[a],n=t[a];if(r!==n&&String(r??"")!==String(n??""))return!1}return!0}return e===t||String(e??"")===String(t??"")};function Pe(e={},t={}){let a=0;for(const n of Object.keys(e))if(!Se(n)){if(a++,!Object.prototype.hasOwnProperty.call(t,n))return!1;if(!Ie(e[n],t[n]))return!1}let r=0;for(const n of Object.keys(t))Se(n)||r++;return a===r}function Ce(e={}){const t={};for(const[a,r]of Object.entries(e))be.has(a)||(t[a]=Array.isArray(r)?[...r]:r);return t}var xe=(e,t)=>{t&&e(t)},Ae=/* @__PURE__ */function(e){return e.WHEEL="wheel",e.BUTTON="button",e.BOTH="both",e}({}),Re=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()}},Me=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.slice(0,256),iframe:e.iframe,closable:e.closable,refreshable:e.refreshable,iframeRefreshMode:"reload"===e.iframeRefreshMode?"reload":"postMessage"};return(e=>{const t=(new TextEncoder).encode(e);let a="";for(const r of t)a+=String.fromCharCode(r);return btoa(a).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")})(JSON.stringify(t))},Oe=e=>{if("string"!=typeof e||e.length>4096)return{...Ee};let t;try{t=(e=>{const t=e.replace(/-/g,"+").replace(/_/g,"/"),a=t+"=".repeat((4-t.length%4)%4),r=atob(a),n=new Uint8Array(r.length);for(let o=0;o<r.length;o++)n[o]=r.charCodeAt(o);return(new TextDecoder).decode(n)})(e)}catch{return{...Ee}}if(t.length>2048)return{...Ee};if(!t.trim().startsWith("{"))return(e=>{const t=e.split("|");if(t.length<5||t.length>6)return{...Ee};const[a="",r="",n,o,s,i]=t,l=e=>"Y"===e||"N"===e;return a.length>0&&a.length<=128&&a.trim()===a&&!(e=>{for(const t of e){const e=t.charCodeAt(0);if(e<=31||127===e)return!0}return!1})(a)&&l(n)&&l(o)&&l(s)?void 0!==i&&""!==i&&"R"!==i?{...Ee}:{id:a,title:r,iframe:"Y"===n,closable:"Y"===o,refreshable:"Y"===s,iframeRefreshMode:"R"===i?"reload":"postMessage"}:{...Ee}})(t);try{return a=JSON.parse(t),Me(a)?{id:"string"==typeof a.id?a.id:void 0,title:"string"==typeof a.title?a.title:Ee.title,iframe:"boolean"==typeof a.iframe?a.iframe:Ee.iframe,closable:"boolean"==typeof a.closable?a.closable:Ee.closable,refreshable:"boolean"==typeof a.refreshable?a.refreshable:Ee.refreshable,iframeRefreshMode:"reload"===a.iframeRefreshMode?"reload":"postMessage"}:{...Ee}}catch{return{...Ee}}var a},Be="",Ve=null,qe=()=>{const e=globalThis.crypto;if("function"==typeof e?.randomUUID)return e.randomUUID();const t=/* @__PURE__ */new Uint8Array(16);if("function"==typeof e?.getRandomValues)e.getRandomValues(t);else for(let r=0;r<t.length;r++)t[r]=Math.floor(256*Math.random());t[6]=15&t[6]|64,t[8]=63&t[8]|128;const a=[];for(const r of t)a.push(r.toString(16).padStart(2,"0"));return`${a.slice(0,4).join("")}-${a.slice(4,6).join("")}-${a.slice(6,8).join("")}-${a.slice(8,10).join("")}-${a.slice(10,16).join("")}`},We=()=>qe(),$e=Symbol("stackTabsContext"),Fe=Symbol("stackTabsMaximum"),De=null,Ne=!1,Ke=/* @__PURE__ */new WeakSet,ze=(e={})=>{const t={tabs:E([]),caches:q([]),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:Q()}},je=()=>{const e=(p()?h($e,null):null)??De;if(!e)throw new Error("VueStackTabs runtime context is not available. Render <VueStackTabs> before using vue-stack-tabs composables.");return e},He=/* @__PURE__ */function(e){return e.PAGE_LOADING="PAGE_LOADING",e.TAB_ACTIVE="TAB_ACTIVE",e.TAB_SCROLL_TO="TAB_SCROLL_TO",e.FORWARD="FORWARD",e.BACKWARD="BACKWARD",e.REFRESH_IFRAME_POSTMESSAGE="REFRESH_IFRAME_POSTMESSAGE",e}({}),Ge=Symbol("tabEmitter"),Ue=e=>(p()?h(Ge,null):null)??e?.eventBus??je().eventBus,Xe=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}},Ye=class extends Re{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.getPageAt(this.tabId,e)}isEmpty(){return 0===this.access.getPageCount(this.tabId)}size(){return this.access.getPageCount(this.tabId)}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:n,tabIdsToEvict:o}=e,s=(e=>{const{caches:t,components:a,cacheIdsToEvict:r,tabIdsToEvict:n}=e,o=new Set(t.value);let s=t.value;const i=()=>{if(s!==t.value){s=t.value,o.clear();for(const e of s)o.add(e)}},l=e=>{r.add(e)},c=e=>{if(i(),o.has(e)){o.delete(e);const a=s.indexOf(e);a>=0&&s.splice(a,1),F(t)}};return{markCacheForEviction:l,markTabPagesForEviction:e=>{for(const t of e.pages.readonlyList())l(t.id);n.add(e.id)},markTabPagesForEvictionOnly:e=>{for(const t of e.pages.readonlyList())l(t.id)},addCache:e=>{i(),o.has(e)||(o.add(e),s.push(e),F(t))},removeCache:c,evictPageCache:e=>{e&&(r.delete(e),c(e),a.delete(e))},replacePageCaches:(e,n)=>{i();const l=new Set(e);let c=!1;if(l.size>0){for(let e=s.length-1;e>=0;e--){const t=s[e];t&&l.has(t)&&(s.splice(e,1),c=!0)}for(const e of l)o.delete(e),r.delete(e),a.delete(e)}for(const t of n)o.has(t)||(o.add(t),s.push(t),c=!0);c&&F(t)},evictMarkedCaches:()=>{if(r.size<=0)return;i();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)o.delete(t),a.delete(t);F(t),r.clear()}}})(e),i=E([]),l=M(/* @__PURE__ */new Map),c=M(/* @__PURE__ */new Map),u=M(/* @__PURE__ */new Map),d=E(""),f=/* @__PURE__ */new Map,m=e=>t.value.find(t=>t.id===e)??null,b=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},h=e=>{const t=c.get(e);return t&&0!==t.length?u.get(t[t.length-1])??null:null},g=e=>u.get(e)?.refreshVersion??0,_=e=>{l.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,pinned:e.pinned}))(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),i.value.includes(e.id)||(i.value=[...i.value,e.id]),e.active&&(d.value=e.id)},y=(e,t)=>{if(!l.has(e))return;const a=c.get(e)??[];c.set(e,[...a,t.id]),u.set(t.id,t)},k=(e,t)=>{if(!l.has(e)||t<=0)return[];const a=[...c.get(e)??[]],r=[];for(let n=0;n<t;n++){const e=a.pop();if(!e)break;const t=u.get(e);t&&r.push(t),u.delete(e)}return c.set(e,a),r},T=e=>{if(l.has(e)){for(const t of b(e))u.delete(t);c.set(e,[])}},w=(e,t,a)=>{const r=c.get(e);if(!r||!r.includes(t))return"missing";const n=u.get(t);return n?a.id&&a.id!==t&&u.has(a.id)?"conflict":(Object.assign(n,a),a.id&&a.id!==t?(u.delete(t),u.set(a.id,n),c.set(e,r.map(e=>e===t?a.id:e)),"new-id"):"same-id"):"missing"},S={getPages:p,getPageIds:b,getPageAt:(e,t)=>{const a=c.get(e);if(!(!a||t<0||t>=a.length))return u.get(a[t])},getPageCount:e=>c.get(e)?.length??0,getTopPage:h,getPageRefreshVersion:g,appendPage:y,popPages:k,clearPages:T};function I(e){const t=l.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,a.pinned=t.pinned,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:v(new Ye(e,S)),pinned:t.pinned},f.set(e,a)),a}function P(){const e=[];for(const t of i.value){const a=I(t);a&&e.push(a)}t.value=e}return{...s,getTabs:()=>t.value,getTab:m,getActiveTab:()=>t.value.find(e=>e.active)??null,findTabByTopPagePath:e=>{for(const t of i.value)if(h(t)?.path===e)return f.get(t)??null;return null},hasTab:e=>l.has(e),canAddTab:()=>e.maxTabCount.value<=0||e.maxTabCount.value>0&&e.maxTabCount.value>i.value.length,getPages:p,getTopPage:h,getPageRefreshVersion:g,getPageSnapshot:e=>p(e).map(e=>we(e)),addTab:e=>{_(e),P()},addTabs:e=>{if(0!==e.length){for(const t of e)_(t);P()}},activateTab:e=>{const t=l.has(e)?e:"";return t!==d.value&&(d.value=t,P()),m(e)},updateTabTitle:(e,t)=>{const a=l.get(e);return!!a&&(a.title===t||(a.title=t,P()),!0)},moveTab:(e,t)=>{const a=i.value,r=a.indexOf(e);if(r<0||t<0||r===t)return!1;const n=l.get(e);if(!n||n.pinned)return!1;let o=0;for(let i=0;i<a.length;i++)l.get(a[i])?.pinned&&(o=i+1);const s=Math.max(t,o);if(s>=a.length||s===r)return!1;const c=[...a],[u]=c.splice(r,1);return!!u&&(c.splice(s,0,u),i.value=c,P(),!0)},removeTab:e=>{const t=i.value,a=t.indexOf(e);if(a<0)return{status:"not-found",removed:null,nextActiveId:""};const r=l.get(e);if(!r||!r.closable)return{status:"not-closable",removed:null,nextActiveId:e};const n=I(e),m=d.value===e;n&&s.markTabPagesForEviction(n);for(const o of b(e))u.delete(o);c.delete(e),l.delete(e),f.delete(e);let p="";return t.length>1&&m&&(p=(0===a?t[1]:t[a-1])??""),m&&(d.value=""),i.value=t.filter(t=>t!==e),P(),m||(s.evictMarkedCaches(),o.clear()),{status:"removed",removed:n,nextActiveId:p}},removeTabs:e=>{const t=[],a=[];return i.value.forEach((r,n)=>{const o=l.get(r),i=I(r);if(o&&i)if(o.closable&&e(i,n)){s.markTabPagesForEviction(i);for(const e of b(r))u.delete(e);c.delete(r),l.delete(r),f.delete(r),d.value===r&&(d.value=""),t.push(i)}else a.push(r)}),i.value=a,P(),t},appendPage:y,popPages:k,replacePages:(e,t)=>{if(!l.has(e))return;for(const r of b(e))u.delete(r);const a=[];for(const r of t){const e=we(r);u.set(e.id,e),a.push(e.id)}c.set(e,a)},clearPages:T,updatePage:(e,t,a)=>{const r=w(e,t,a);return"missing"!==r&&"conflict"!==r&&("new-id"===r&&P(),!0)},updatePages:e=>{let t=!1;for(const a of e)"new-id"===w(a.tabId,a.pageId,a.patch)&&(t=!0);t&&P()},consumeBackParams:(e,t)=>{const a=h(e);if(!a||a.id!==t||!a._backParams)return null;const r={...a._backParams};return delete a._backParams,r},isTabMarkedForEviction:e=>o.has(e),isCacheMarkedForEviction:e=>n.has(e),unmarkCacheForEviction:e=>n.delete(e),clearTabEvictionMarks:()=>o.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:P,reset:()=>{i.value=[],l.clear(),c.clear(),u.clear(),f.clear(),d.value="",t.value=[],a.value=[],r.clear(),n.clear(),o.clear()}}},Qe=/* @__PURE__ */new WeakMap,Ze=e=>e.startsWith("#")?document.getElementById(e.slice(1)):document.querySelector(e),et="__stack-tab-auto-scroll__:",tt=/* @__PURE__ */new Map,at=e=>{const t=document.getElementById(`W-${e}`);if(!t)return tt.delete(e),null;let a=tt.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),tt.set(e,a)),a},rt=(e,t)=>{const a=Number(t.slice(26));return Number.isInteger(a)?at(e)?.elements[a]??null:null},nt=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(et)?rt(e,t):Ze(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(et)&&a.delete(e);(at(e)?.elements??[]).forEach((e,t)=>{a.set((e=>`${et}${e}`)(t),{top:e.scrollTop,left:e.scrollLeft})});for(const e of a.keys()){if(e.startsWith(et))continue;const t=Ze(e);a.set(e,{top:t?.scrollTop??0,left:t?.scrollLeft??0})}}},removeScroller:e=>{const a=t.get(e);a&&(a.clear(),t.delete(e));const r=tt.get(e);r&&(r.observer?.disconnect(),tt.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})}}},ot=e=>{const t=()=>e.sessionPrefix.value+"stacktab-active-tab";let a=null,r=0,n=!1,o=null;const s=(e,t)=>{if("undefined"==typeof window)return!1;try{return window.sessionStorage.setItem(e,t),!0}catch(a){return!1}},i=()=>{n=!1;const e=a;if(a=null,!e||e.version!==r)return;const i=JSON.stringify(e.tab);i!==o&&s(t(),i)&&(o=i)},l=()=>{r++,a=null},c=()=>{l(),(e=>{if("undefined"!=typeof window)try{window.sessionStorage.removeItem(e)}catch(t){}})(t()),o=null};return{getSessionKey:t,saveActiveTabToSession:e=>{e.id&&(a={tab:e,version:++r},n||(n=!0,queueMicrotask(i)))},clearSession:c,restoreActiveTabSession:e=>{null!==e?(l(),s(t(),e)&&(o=e)):c()},restoreTabFromSession:e=>{if(null==e)return null;try{const a=JSON.parse(e,(e,t)=>"pages"===e&&Array.isArray(t)?new Re(t):t);return Me(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 Re?a:(c(),null)}catch{return c(),null}var t}}},st=e=>{const{getTabs:t,getTopPage:a,updatePage:r,updatePages:n,iframeRefreshKeys:o,createPageId:s,addCache:i,evictPageCache:l,replacePageCaches:c,refreshIframeByPostMessage:u}=e,d=(e,t,n,o)=>{const c=a(e.id);if(!c)return;if(e.active){const t={refreshVersion:(c.refreshVersion??0)+1};return void(o?o.push({tabId:e.id,pageId:c.id,patch:t}):r(e.id,c.id,t))}const u=c.id,d=s(),f={id:d,refreshVersion:0};if(o?o.push({tabId:e.id,pageId:u,patch:f}):r(e.id,u,f),t&&n)return t.push(u),void n.push(d);l(u),i(d)};return{refreshTab:e=>{const a=t().find(t=>t.id===e);a?.refreshable&&(a.iframe?(e=>{"reload"!==e.iframeRefreshMode?u(e.id):o.value={...o.value,[e.id]:(o.value[e.id]??0)+1}})(a):d(a))},refreshAllTabs:()=>{const e=[],a=[],r=[],s={...o.value};let i=!1;for(const n of t())n.refreshable&&(n.iframe?"reload"===n.iframeRefreshMode?(s[n.id]=(s[n.id]??0)+1,i=!0):u(n.id):d(n,e,a,r));i&&(o.value=s),n(r),c(e,a)}}},it=["aria-label"],lt=/*@__PURE__*/m({__name:"PageLoading",props:{tabId:{}},setup(e){const a=E(0),r=e,{t:n}=t(),o=Ue(),s=E(!1);K(s,e=>{e&&(de(".stack-tab__cache-page-wrapper *"),a.value=fe(".stack-tab__cache-page-wrapper *"))});const i=e=>{e.tId===r.tabId&&(s.value=e.value)};return o.on(He.PAGE_LOADING,i),x(()=>{o.off(He.PAGE_LOADING,i)}),(e,t)=>s.value?(A(),u("div",{key:0,class:"stack-tab-loading__mask",role:"status","aria-live":"polite","aria-label":D(n)("VueStackTab.loading"),style:k({zIndex:a.value})},[...t[0]||(t[0]=[d("div",{class:"stack-tab-loading__spin","aria-hidden":"true"},null,-1)])],12,it)):c("",!0)}}),ct=Symbol("tabPageContext"),ut=()=>{if(p()){const e=h(ct,null);if(e)return e}const e=b();if(!e)return null;const t=e.attrs.tId??e.props.tId,a=e.attrs.pId??e.props.pId,r={};return"string"==typeof t&&(r.tabId=t),"string"==typeof a&&(r.pageId=a),void 0!==r.tabId||void 0!==r.pageId?r:null},dt="stack-tab__shadow-inset-top",ft="stack-tab__shadow-inset-bottom",mt="stack-tab__shadow-inset-vertical",bt=e=>"function"==typeof e?e():e.value,pt=e=>{if("undefined"==typeof document)return{sync:()=>{},clear:()=>{}};const t=!1!==e.watchResize,a=Math.max(0,e.edgeThreshold??5);let r=null,n=null,o=null,s=null;const i=e=>{e&&e.classList.remove(dt,ft,mt)},l=()=>{if(!n)return;const t=n,r=e.classTarget?bt(e.classTarget):n;if(o&&o!==r&&(i(o),o=null),o=r,!o)return;const{scrollTop:s,scrollHeight:l,clientHeight:c}=t,u=s>a,d=l-c-s>a;o.classList.toggle(mt,u&&d),o.classList.toggle(dt,u&&!d),o.classList.toggle(ft,!u&&d)},c=()=>{null===r&&(r=requestAnimationFrame(()=>{r=null,l()}))},u=()=>{const a=bt(e.target);a&&(a!==n?(n&&(n.removeEventListener("scroll",c),s?.disconnect(),s=null,i(o),o=null),n=a,a.addEventListener("scroll",c,{passive:!0}),t&&"undefined"!=typeof ResizeObserver&&(s=new ResizeObserver(()=>c()),s.observe(a)),c()):c())},d=()=>{null!==r&&(cancelAnimationFrame(r),r=null)},f=()=>{i(o),o=null,d()};return queueMicrotask(u),C(()=>{n&&n.removeEventListener("scroll",c),n=null,s?.disconnect(),s=null,i(o),o=null,d()}),{sync:()=>{const t=bt(e.target);t?t===n?c():u():f()},clear:f}},ht=e=>e.split(",").map(e=>Number.parseFloat(e.trim())||0),vt=e=>{if("undefined"==typeof window)return 0;const t=window.getComputedStyle(e),a=ht(t.transitionDuration||"0s"),r=ht(t.transitionDelay||"0s");return 0===a.length?0:1e3*Math.max(...a.map((e,t)=>e+(r[t%r.length]??0)))},gt=()=>new Promise(e=>{"function"==typeof requestAnimationFrame?requestAnimationFrame(()=>e()):setTimeout(e,16)}),_t=e=>{const{runtimeContext:t,consumeBackParams:a,getComponent:r,setComponent:n,addCache:o,evictMarkedCaches:i,clearTabEvictionMarks:l,addPageScroller:c,saveScroller:u,restoreScroller:d,removeScroller:b}=e;return{resolvePageComponent:e=>{const{cacheName:p,tabInfo:h}=e,v=r(p);if(v)return o(p),v;const g=/* @__PURE__ */m({name:`${p}-shell`,props:{vnode:{type:Object,required:!1,default:null}},setup:e=>()=>e.vnode}),y=/* @__PURE__ */m({name:p,props:{vnode:{type:Object,required:!1,default:void 0},refreshVersion:{type:Number,required:!1,default:0},transitionName:{type:String,required:!1,default:""}},emits:["onLoaded"],setup(e,r){R(ct,{tabId:h.id,pageId:p});const n=E(null),o=q(null),m=q(null),v=q(null),y=E(null),k=E(e.refreshVersion??0);let w=!1,C=!1,A=null,M=null,L=null,O="";const B=()=>{null!==M&&(clearTimeout(M),M=null)},V=()=>{const e=y.value,t=O;e&&t&&(e.classList.remove(`${t}-leave-active`,`${t}-leave-to`,`${t}-enter-active`,`${t}-enter-from`),O="")},W=e=>new Promise(t=>{const a=y.value;if(!a||e<=0)return void t();let r=!1;const n=()=>{r||(r=!0,L=null,B(),a.removeEventListener("transitionend",o),t())},o=e=>{e.target===a&&n()};L=n,a.addEventListener("transitionend",o),M=setTimeout(n,e+80)}),$=async t=>{const a=y.value,r=e.transitionName;if(!a||!r||"undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches)return void(k.value=t);O=r,a.classList.add(`${r}-leave-active`);const n=vt(a);if(n<=0)return V(),void(k.value=t);if(await gt(),w)return void V();if(a.classList.add(`${r}-leave-to`),await W(n),V(),w)return;if(k.value=t,await _(),w)return;O=r,a.classList.add(`${r}-enter-from`),a.offsetWidth,a.classList.add(`${r}-enter-active`);const o=vt(a);o<=0||(await gt(),w||(a.classList.remove(`${r}-enter-from`),await W(o))),V()};K(()=>e.refreshVersion??0,e=>{e===k.value&&null===A||(A=e,(async()=>{if(!C){C=!0;try{for(;!w&&null!==A;){const e=A;A=null,e!==k.value&&await $(e)}}finally{C=!1}}})())});const F=()=>{n.value=a(h.id,p)};P(()=>{r.emit("onLoaded"),c(p,`#W-${p}`),D.sync(),F()}),I(()=>{D.clear(),u(p)}),T(()=>{r.emit("onLoaded"),d(p),D.sync(),i(),l(),F()}),S(()=>{w=!0,A=null,L?.(),B(),V()}),x(()=>b(p));const D=pt({target:y,classTarget:()=>y.value?.parentElement??null});return()=>{const a=e.vnode,r=n.value;return a===o.value&&r===v.value||(m.value=a?s(a,r?{_back:r}:null):null,o.value=a,v.value=r),f("div",{ref:y,class:"stack-tab__cache-page-wrapper",id:`W-${p}`,style:[t.useGlobalScroll.value?"overflow:auto":"overflow:hidden","height: 100%"]},[m.value?f(g,{key:`${p}-${k.value}`,vnode:m.value},null):null,f(lt,{tabId:h.id},null)])}}});return n(p,y),o(p),y}}},yt=/* @__PURE__ */m({name:"StackTabEmptyPlaceholder",setup:()=>()=>null}),kt=()=>yt,Tt=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},wt=e=>{const a=Y(),r=Ue(e),{t:n}=t(),{tabs:o,caches:s,refreshKey:l,iframeRefreshKeys:c,isInitialized:u}=e,{getTabs:d,getTab:f,getActiveTab:m,findTabByTopPagePath:b,hasTab:p,canAddTab:h,getPages:v,getTopPage:g,getPageRefreshVersion:_,getPageSnapshot:y,addTab:k,addTabs:T,activateTab:w,updateTabTitle:S,moveTab:I,removeTab:P,removeTabs:C,appendPage:x,popPages:A,replacePages:R,clearPages:M,updatePage:L,updatePages:O,consumeBackParams:B,markCacheForEviction:V,markTabPagesForEvictionOnly:q,addCache:W,removeCache:$,evictMarkedCaches:F,evictPageCache:D,replacePageCaches:N,isTabMarkedForEviction:K,isCacheMarkedForEviction:z,unmarkCacheForEviction:j,clearTabEvictionMarks:H,getComponent:G,setComponent:X,deleteComponent:Q,snapshotComponents:Z,restoreComponents:ee,snapshotCaches:te,restoreCaches:ae,reset:re}=(e=>{const t=Qe.get(e);if(t)return t;const a=Je(e);return Qe.set(e,a),a})(e),{restoreScroller:ne,saveScroller:oe,removeScroller:se,addPageScroller:ie}=nt(e),{saveActiveTabToSession:le,clearSession:ce,restoreTabFromSession:ue,restoreActiveTabSession:de,getSessionKey:fe}=ot(e),{resolvePageComponent:me}=_t({runtimeContext:e,consumeBackParams:B,getComponent:G,setComponent:X,addCache:W,evictMarkedCaches:F,clearTabEvictionMarks:H,addPageScroller:ie,saveScroller:oe,restoreScroller:ne,removeScroller:se}),be=e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode}),pe=()=>d().find(e=>e.pinned)??null,he=()=>{const e=pe(),t=e?g(e.id):null;if(!e||!t)return!1;const r={...Te(t.query),__tab:Le(be(e))};return Promise.resolve(a.replace({path:t.path,query:r,hash:""})).catch(e=>{}),!0},we=e=>{const t=e.query.__tab,a="string"==typeof t;if(a){const e=(e=>{if(e===Be&&Ve)return{...Ve};const t=Oe(e);return Be=e,Ve=t,{...t}})(t);if(e.id)return e}const r=Tt(e),o=m(),s=o?g(o.id):null;if(o&&s?.path===r)return be(o);const i=b(r);return i?be(i):!a&&pe()?null:{id:qe(),title:n("VueStackTab.undefined"),closable:!0,refreshable:!0,iframe:!1}},Se=e=>{const t=we(e);if(null===t)return he(),{empty:!0};const n=t;if(K(n.id))return{empty:!0};const o=Tt(e),s=((e,t)=>({...Te(e.query),__tab:e.query.__tab??Le(t)}))(e,n),i=e=>e.path===o&&Pe(s,e.query||{});let l,c=n.id?f(n.id):null,u=null;const d=c?g(c.id):null;if(c&&d)if(i(d))l=d.id;else if(d.path===o)l=We(),u={id:l,tabId:n.id,path:o,query:Te(s)};else{const e=v(c.id);let t=-1;for(let a=e.length-2;a>=0;a--){const r=e[a];if(r&&i(r)){t=a;break}}if(-1!==t){const a=e.length-1-t,r=A(c.id,a);for(const e of r)V(e.id);const i=g(c.id);l=i?i.id:We(),i||(u={id:l,tabId:n.id,path:o,query:Te(s)})}else l=We(),u={id:l,tabId:n.id,path:o,query:Te(s)}}else l=We(),u={id:l,tabId:n.id,path:o,query:Te(s)};if(z(l)){j(l);const e=G(l);if(e)return{recovered:e,cacheName:l}}return u?c=((e,t,a,n)=>{let o=e.id?f(e.id):null;if(null===o){const a=new Re;a.push(n);const s=t.query.__src;o={id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode??"postMessage",url:ge(s),active:!0,pages:a},w(""),k(o),r.emit(He.TAB_ACTIVE,{id:e.id,isRoute:!1})}else{w(o.id);const e=g(o.id);e&&e.id===n.id||x(o.id,n)}return o})(n,e,0,u):w(c.id),"string"!=typeof e.query.__tab&&a.replace({path:e.path,query:{...Te(e.query),__tab:Le(n)},hash:e.hash}).catch(e=>{}),le(c),{cacheName:l,tabInfo:n,targetTab:c}},Ie=E(""),xe=i(()=>{const e=m();return e?g(e.id)?.refreshVersion??0:0});let Ae="",Me=null;const Ee=e=>C(e),$e=()=>{if(Ee(()=>!0),m())return F(),void H();const e=d().at(-1);e&&r.emit(He.TAB_ACTIVE,{id:e.id})},{refreshTab:Fe,refreshAllTabs:De}=st({getTabs:d,getTopPage:g,updatePage:L,updatePages:O,iframeRefreshKeys:c,createPageId:We,addCache:W,evictPageCache:D,replacePageCaches:N,refreshIframeByPostMessage:e=>r.emit(He.REFRESH_IFRAME_POSTMESSAGE,e)});return{tabs:o,caches:s,refreshKey:l,activeCacheKey:Ie,activePageRefreshVersion:xe,isInitialized:u,setMaxSize:t=>{e.maxTabCount.value=t},canAddTab:h,initialize:(t,a)=>{if(u.value)return;const r=[];let n="";const o=(t,a={})=>{const r=J(t,{refreshable:!0,closable:!0,iframe:!1});r.id=t.id??(a.pinned?"__stack_tabs_home__":qe()),void 0!==a.closable&&(r.closable=a.closable);const n=r.id,o=Boolean(r.iframe),s=ye(r.path),i=We(),l=ke(o?e.iframePath.value:s.path),c=o?r.iframeRefreshMode??(_e(r.path)?"reload":"postMessage"):"postMessage";r.iframeRefreshMode=c;const u=Ce(o?r.query:s.query);o&&(u.__src=encodeURIComponent(r.path));const d={id:i,tabId:n,path:l,query:J(u,{__tab:Le(r)})},f=new Re;f.push(d);const m={id:n,title:r.title??"",closable:r.closable,refreshable:r.refreshable,iframe:o,iframeRefreshMode:c,url:o?ve(r.path):void 0,active:!1,pages:f,pinned:a.pinned};return W(i),m};if(a){const e=o(a,{pinned:!0,closable:!1});n=e.id,r.push({...e})}for(const e of t){if(n&&e.id===n)continue;const t=o(e);r.push({...t})}T(r);const s="undefined"!=typeof window?sessionStorage.getItem(fe()):null,i=ue(s);if(i&&!p(i.id))if(i.url&&(i.url=ve(i.url)),i.iframe&&i.url&&void 0===i.iframeRefreshMode&&(i.iframeRefreshMode=_e(i.url)?"reload":"postMessage"),i.pages&&"function"==typeof i.pages.list){k(i);for(const e of v(i.id))e&&e.id&&W(e.id)}else k(i);u.value=!0},size:()=>d().length,active:(e,t=!0)=>{r.emit(He.FORWARD);const n=f(e);if(!n)return Promise.resolve();if(n.active)return r.emit(He.TAB_SCROLL_TO,{id:e}),Promise.resolve();const o=g(e),s=()=>{const t=w(e);t&&le(t)};if(!t)return s(),Promise.resolve();if(!o)return s(),Promise.resolve();const i=Te(o.query);return"string"==typeof i.__tab&&i.__tab||(i.__tab=Le(be(n))),Xe({apply:()=>{const e=m()?.id,t="undefined"!=typeof window?window.sessionStorage.getItem(fe()):null;return s(),{prevActiveId:e,sessionSnapshot:t}},navigate:()=>a.push({path:o.path,query:i}),rollback:e=>{w(e.prevActiveId??""),de(e.sessionSnapshot)},isFailureResult:U,rejectFailureResult:!0})},updateTabTitle:(e,t)=>{if(!S(e,t))return!1;const r=f(e);if(!r)return!1;if(r.active){le(r);const t=g(e);t&&Promise.resolve(a.replace({path:t.path,query:{...Te(t.query),__tab:Le(be(r))},hash:a.currentRoute.value.hash})).catch(e=>{})}return!0},getCacheName:()=>We(),destroy:()=>{re(),c.value={},e.scrollPositionsByPageId.clear(),e.isInitialized.value=!1,e.refreshKey.value=0,ce()},reset:()=>$e(),addCache:W,removeCache:$,getTab:f,getActiveTab:m,getTopPage:g,getPages:v,getPageRefreshVersion:_,getPageSnapshot:y,moveTab:I,addTab:k,appendPage:x,popPages:A,replacePages:R,clearPages:M,updatePage:L,updatePages:O,removeTab:e=>{const t=P(e);return"not-found"===t.status?"":"not-closable"===t.status?e:(t.nextActiveId&&r.emit(He.TAB_ACTIVE,{id:t.nextActiveId}),t.nextActiveId)},removeAllTabs:$e,removeLeftTabs:e=>{const t=d().findIndex(t=>t?.id===e);if(t<=0)return;if(Ee((e,a)=>a<t),m())return F(),void H();const a=d()[0];a&&r.emit(He.TAB_ACTIVE,{id:a.id})},removeRightTabs:e=>{const t=d(),a=t.findIndex(t=>t?.id===e);if(a<0||a>=t.length-1)return;if(Ee((e,t)=>t>a),m())return F(),void H();const n=d().at(-1);n&&r.emit(He.TAB_ACTIVE,{id:n.id})},removeOtherTabs:e=>{const t=f(e);Ee(t=>t.id!==e),t&&!t.active?r.emit(He.TAB_ACTIVE,{id:e}):(F(),H())},hasTab:p,renewTab:e=>{const t=f(e.id);if(!t)return;const a=y(t.id),r=te(),n=Z();return q(t),F(),M(t.id),()=>{R(t.id,a),ae(r),ee(n)}},addPage:(e,t)=>{if(!t)return(e=>{if("string"==typeof e.query.__tab)return!1;const t=Tt(e),a=m();if(a&&g(a.id)?.path===t)return!1;if(b(t))return!1;const r=pe();return Boolean(r&&g(r.id))})(e)&&he(),kt();const a=`${e.fullPath}::${l.value}`;if(a===Ae&&Me)return Me;const r=Se(e);if("empty"in r)return kt();if("recovered"in r)return W(r.cacheName),Ie.value=r.cacheName,Ae=a,Me=r.recovered,r.recovered;Ie.value=r.cacheName;const n=me(r);return Ae=a,Me=n,n},addComponent:X,getComponent:G,removeComponent:Q,markCacheForEviction:V,evictMarkedCaches:F,evictPageCache:D,clearTabEvictionMarks:H,refreshTab:Fe,refreshAllTabs:De,iframeRefreshKeys:c,addPageScroller:ie,setGlobalScroll:t=>{e.useGlobalScroll.value=t},clearSession:ce,setSessionPrefix:t=>{e.sessionPrefix.value=t}}},St=/* @__PURE__ */new WeakMap,It=e=>{const t=e??je(),a=St.get(t);if(a)return a;const r=wt(t);return St.set(t,r),r};function Pt(e){const t=Y(),a=e??je(),{active:r,updateTabTitle:n,hasTab:o,refreshKey:s,reset:i,canAddTab:l,renewTab:c,getTab:u,getTopPage:d,tabs:f,moveTab:m,removeTab:b,removeAllTabs:p,refreshTab:h,refreshAllTabs:v}=It(a),g=(e,r,n=!1)=>{const o=Le(r),s=Ce(e.query);let i,l,c=J(s,{__tab:o});if(e.iframe)c={...c,__src:encodeURIComponent(e.path),__tab:o},i=a.iframePath.value;else{const t=ye(e.path);i=t.path,l=t.hash||void 0,c=J(Ce(t.query),c,{__tab:o}),c={...c,__tab:o}}return he(e.path)?Xe({apply:()=>{},navigate:()=>t.push({path:i,query:c,hash:l}),rollback:()=>{},isFailureResult:e=>U(e)&&!(n&&U(e,G.duplicated)),rejectFailureResult:!0}):Promise.reject(/* @__PURE__ */new Error("Invalid tab URL"))};return{openTab:(e,t=!1)=>new Promise((a,n)=>{const i=(e=>{const t={refreshable:!0,closable:!0,iframe:!1};e.iframe&&void 0===e.iframeRefreshMode?t.iframeRefreshMode=_e(e.path??"")?"reload":"postMessage":e.iframe&&(t.iframeRefreshMode=e.iframeRefreshMode??"postMessage");const a=J(e,t);return a.id||(a.id=qe()),a})(e),d=Boolean(i.id&&o(i.id));if(d&&!t)return void Promise.resolve(r(i.id)).then(()=>a(i.id),n);let f,m;if(i.id&&t&&d){const t=u(i.id);f=c(e),t?.active&&(m=s.value,s.value++)}d||l()?g(e,i,d&&t).then(()=>a(i.id),e=>{f?.(),void 0!==m&&(s.value=m),n(e)}):n(/* @__PURE__ */new Error("Max Size"))}),closeTab:b,closeAllTabs:p,refreshTab:h,refreshAllTabs:v,activeTab:r,moveTab:m,updateTabTitle:n,reset:i,tabs:f,setIFramePath:e=>{a.iframePath.value=e},getWrapper:(e={})=>{if("undefined"==typeof document)return;const t=e.pageId??(e.tabId?d(e.tabId)?.id:void 0);return t?document.getElementById(`W-${t}`)??void 0:document.querySelector(".stack-tab__cache-page-wrapper")??void 0},openInNewWindow:e=>{const t=u(e);t?.iframe&&t.url&&he(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")}}}var Ct=["disabled"],xt=(e,t)=>{const a=e.__vccOpts||e;for(const[r,n]of t)a[r]=n;return a},At=/*#__PURE__*/xt(/*@__PURE__*/m({__name:"ContextMenuItem",props:{icon:{default:""},title:{},disabled:{type:Boolean,default:!1}},setup:e=>(t,a)=>(A(),u("button",{type:"button",role:"menuitem",class:"stack-tab__context-menu-item",disabled:e.disabled},[d("span",{class:y(["stack-tab__context-menu-icon",e.icon]),"aria-hidden":"true"},null,2),d("span",{class:"stack-tab__context-menu-title",onContextmenu:a[0]||(a[0]=H(()=>{},["prevent"]))},W(e.title),33)],8,Ct))}),[["__scopeId","data-v-fd76fc18"]]),Rt={key:1,class:"divider div-transparent",role:"separator","aria-orientation":"horizontal"},Mt=/*#__PURE__*/xt(/*@__PURE__*/m({__name:"index",props:{index:{},left:{default:0},top:{default:0},contextMenu:{default:()=>[]},restoreFocusElement:{default:null},tabItem:{},max:{}},emits:["close"],setup(e,{emit:r}){const n=e,o=r,{t:s}=t(),i=E(),d=M({left:n.left,top:n.top}),{closeTab:m,closeAllTabs:b,refreshTab:p,refreshAllTabs:h,openInNewWindow:v}=Pt(),{removeLeftTabs:g,removeRightTabs:y,removeOtherTabs:T}=It(),w=E(0),S=()=>{n.restoreFocusElement&&document.contains(n.restoreFocusElement)?n.restoreFocusElement.focus():document.querySelector('[role="tab"][aria-selected="true"]')?.focus()},I=()=>{o("close"),_(S)},C=e=>{e?.(),I()},x=()=>{const e=i.value;return e?Array.from(e.querySelectorAll('[role="menuitem"]')).filter(e=>!e.disabled):[]},R=e=>{const t=x();t.length<=0||t[(e+t.length)%t.length]?.focus()},O=()=>x().findIndex(e=>e===document.activeElement),B=e=>{if("Escape"===e.key)return e.preventDefault(),void I();if("ArrowDown"===e.key){e.preventDefault();const t=O();return void R(-1===t?0:t+1)}if("ArrowUp"===e.key){e.preventDefault();const t=O();return void R(-1===t?-1:t-1)}if("Home"===e.key)return e.preventDefault(),void R(0);"End"===e.key&&(e.preventDefault(),R(x().length-1))},V=e=>e.key??`${e.title}-${e.icon??""}`;return P(()=>{de(".stack-tab,.stack-tab *"),w.value=fe(".stack-tab,.stack-tab *");const e=i.value,t=e?.clientWidth??0,a=e?.clientHeight??0;d.left+t>window.innerWidth&&(d.left=window.innerWidth-t-5),d.top+a>window.innerHeight&&(d.top=Math.max(0,window.innerHeight-a-5)),R(0)}),(t,r)=>(A(),u("div",{ref_key:"menuElementRef",ref:i,class:"stack-tab__context-menu",role:"menu",tabindex:"-1",style:k({left:`${d.left}px`,top:`${d.top}px`,"z-index":w.value}),onKeydown:B},[f(At,{icon:"stack-tab__icon stack-tab__icon--reload stack-tab__icon--mask",title:D(s)("VueStackTab.reload"),disabled:!e.tabItem.refreshable,onClick:r[0]||(r[0]=t=>C(()=>D(p)(e.tabItem.id)))},null,8,["title","disabled"]),f(At,{icon:"stack-tab__icon stack-tab__icon--reload-all stack-tab__icon--mask",title:D(s)("VueStackTab.reloadAll"),onClick:r[1]||(r[1]=e=>C(D(h)))},null,8,["title"]),f(At,{icon:"stack-tab__icon stack-tab__icon--close stack-tab__icon--mask",title:D(s)("VueStackTab.close"),disabled:!e.tabItem.closable,onClick:r[2]||(r[2]=t=>C(()=>D(m)(e.tabItem.id)))},null,8,["title","disabled"]),f(At,{icon:"stack-tab__icon stack-tab__icon--close-lefts stack-tab__icon--mask",title:D(s)("VueStackTab.closeLeft"),disabled:e.index<=0,onClick:r[3]||(r[3]=t=>C(()=>D(g)(e.tabItem.id)))},null,8,["title","disabled"]),f(At,{icon:"stack-tab__icon stack-tab__icon--close-rights stack-tab__icon--mask",title:D(s)("VueStackTab.closeRight"),disabled:e.index>=e.max-1,onClick:r[4]||(r[4]=t=>C(()=>D(y)(e.tabItem.id)))},null,8,["title","disabled"]),f(At,{icon:"stack-tab__icon stack-tab__icon--close-others stack-tab__icon--mask",title:D(s)("VueStackTab.closeOthers"),onClick:r[5]||(r[5]=t=>C(()=>D(T)(e.tabItem.id)))},null,8,["title"]),f(At,{icon:"stack-tab__icon stack-tab__icon--close-all stack-tab__icon--mask",title:D(s)("VueStackTab.closeAll"),onClick:r[6]||(r[6]=e=>C(D(b)))},null,8,["title"]),e.tabItem.iframe&&e.tabItem.url?(A(),l(At,{key:0,icon:"stack-tab__icon stack-tab__icon--open stack-tab__icon--mask",title:D(s)("VueStackTab.openInNewWindow"),onClick:r[7]||(r[7]=t=>C(()=>D(v)(e.tabItem.id)))},null,8,["title"])):c("",!0),void 0!==e.contextMenu&&e.contextMenu.length>0?(A(),u("div",Rt)):c("",!0),(A(!0),u(a,null,L(e.contextMenu,t=>(A(),l(At,{key:V(t),"data-menu-key":V(t),icon:t.icon,title:t.title,disabled:t.disabled(e.tabItem),onClick:a=>C(()=>!t.disabled(e.tabItem)&&t.callback(e.tabItem.id))},null,8,["data-menu-key","icon","title","disabled","onClick"]))),128))],36))}}),[["__scopeId","data-v-73711048"]]),Et=e=>`stack-tab-tab-${encodeURIComponent(e)}`,Lt=e=>`stack-tab-panel-${encodeURIComponent(e)}`,Ot=["draggable"],Bt=["id","data-tab-id","aria-controls","aria-selected","tabindex","title"],Vt={class:"stack-tab__item-title"},qt={class:"stack-tab__item-title-content"},Wt=["title","aria-label","tabindex"],$t=/*@__PURE__*/m({__name:"TabHeaderItem",props:{item:{},dropPosition:{}},emits:["close","active","contextmenu","dragstart","dragover","drop","dragend"],setup(e,{emit:a}){const r=a,n=Ue(),{t:o}=t(),s=E(),l=E(!1),f=e,m=e=>{f.item.id===e.id&&g(e.isRoute??!0)};n.on(He.TAB_ACTIVE,m),x(()=>{n.off(He.TAB_ACTIVE,m)});const b=i(()=>f.item.title||o("VueStackTab.undefined")),p=()=>{r("close",f.item)},h=e=>{f.item.pinned?e.preventDefault():(l.value=!0,e.dataTransfer?.setData("text/plain",f.item.id),e.dataTransfer&&(e.dataTransfer.effectAllowed="move"),r("dragstart",f.item,e))},v=e=>{l.value=!1,r("dragend",f.item,e)},g=(e=!0)=>{r("active",f.item,s.value,e)},_=e=>{if("Enter"===e.key||" "===e.key)return e.preventDefault(),void g(!0);"Delete"!==e.key&&"Backspace"!==e.key||!f.item.closable||(e.preventDefault(),p())};return(t,a)=>(A(),u("li",{ref_key:"tabElementRef",ref:s,role:"presentation",class:y(["stack-tab__item",{"stack-tab__item--active":e.item.active,"stack-tab__item--closable":e.item.closable,"stack-tab__item--pinned":e.item.pinned,"stack-tab__item--dragging":l.value,"stack-tab__item--drop-before":"before"===e.dropPosition,"stack-tab__item--drop-after":"after"===e.dropPosition}]),draggable:!e.item.pinned,onClick:a[1]||(a[1]=H(e=>g(!0),["self"])),onContextmenu:a[2]||(a[2]=e=>t.$emit("contextmenu",e)),onDragstart:h,onDragend:v,onDragover:a[3]||(a[3]=H(a=>t.$emit("dragover",e.item,a),["prevent"])),onDrop:a[4]||(a[4]=H(a=>t.$emit("drop",e.item,a),["prevent"]))},[d("button",{id:D(Et)(e.item.id),type:"button",role:"tab",class:"stack-tab__item-tab","data-tab-id":e.item.id,"aria-controls":D(Lt)(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:_},[d("span",Vt,[d("span",qt,W(b.value),1)])],40,Bt),e.item.closable?(A(),u("button",{key:0,type:"button",class:"stack-tab__icon 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:H(p,["stop"])},null,8,Wt)):c("",!0)],42,Ot))}}),Ft=["disabled","title","aria-label"],Dt={key:1,class:"stack-tab__button"},Nt=/*@__PURE__*/m({__name:"TabHeaderButton",props:{disabled:{type:Boolean,default:!1},shadow:{default:null},iconClass:{default:""},title:{default:""},ariaLabel:{default:""}},setup(e){const t=e,a=i(()=>t.ariaLabel||t.title);return(t,r)=>(A(),u("button",{type:"button",class:y(["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?c("",!0):(A(),u("span",{key:0,class:y(["stack-tab__mask-button",e.iconClass])},null,2)),"icon"in t.$slots?(A(),u("span",Dt,[O(t.$slots,"icon")])):c("",!0)],10,Ft))}}),Kt=/*@__PURE__*/m({__name:"TabHeaderScroll",props:{space:{default:300},isScrollWheel:{type:Boolean,default:!0},isScrollButton:{type:Boolean,default:!0}},setup(e,{expose:r}){const{t:n}=t(),o=E(null),s=E(null),i=E(null),f=E(!1),m=E(!1),b=E(!1),p=E(!1),h=E(!1),v=E(),g=e,_={clientWidth:0,scrollWidth:0,scrollLeft:0},k={startPageX:0,startThumbLeft:0};let T=0,w=0,S=null;const I=()=>{const{clientWidth:e,scrollWidth:t}=_;return t<=e||0===t?0:e/t*e},C=e=>{const{clientWidth:t,scrollWidth:a}=_,r=a-t;return r<=0?0:(t-I())*(e/r)},R=()=>{const e=o.value;e&&(_.clientWidth=e.clientWidth,_.scrollWidth=e.scrollWidth,_.scrollLeft=e.scrollLeft,h.value=_.scrollWidth>_.clientWidth,p.value=g.isScrollButton&&h.value,m.value=_.scrollLeft<=10,b.value=_.clientWidth+_.scrollLeft-_.scrollWidth>=-10,(e=>{const t=i.value;t&&h.value&&(t.style.width=`${I()}px`,t.style.transform=`translateX(${C(e)}px)`)})(_.scrollLeft))},M=()=>{const e=o.value?.querySelector(".stack-tab__item--active");e&&!Y(e)&&X(e)};let L=null,B=null,V=0;const q=(e,t=!0)=>{ce({wrap:o.value,left:e,top:0,smooth:t})},W=e=>{q(o.value.scrollLeft+e)},$=e=>{if(!g.isScrollWheel||!o.value)return;if(Math.abs(e.deltaX)>Math.abs(e.deltaY))return;if(!e.deltaY)return;const t=e.deltaY<0;q(o.value.scrollLeft+(t?-g.space:g.space))},F=()=>{if(T=0,!f.value||!o.value)return;const{clientWidth:e,scrollWidth:t}=_,a=t-e,r=e-I();if(a<=0||r<=0)return;const n=Math.min(Math.max(k.startThumbLeft+w-k.startPageX,0),r);ce({wrap:o.value,left:n*a/r,top:0,smooth:!1}),i.value&&(i.value.style.transform=`translateX(${n}px)`)},z=e=>{const t=i.value,a="mouse"!==e.pointerType||0===e.button;if(!t||!a)return;const r=o.value?.scrollLeft??0;k.startPageX=e.pageX,k.startThumbLeft=C(r),w=e.pageX,f.value=!0,S=e.pointerId,t.setPointerCapture?.(e.pointerId)},G=e=>{f.value&&(w=e.pageX,T||(T=requestAnimationFrame(F)))},U=()=>{T&&(cancelAnimationFrame(T),T=0),f.value=!1;const e=S;S=null;const t=i.value;t&&null!==e&&t.hasPointerCapture?.(e)&&t.releasePointerCapture(e)};P(()=>{if("undefined"!=typeof ResizeObserver){L=new ResizeObserver(()=>{R(),M()}),B=new ResizeObserver(()=>{const e=o.value?.querySelectorAll(".stack-tab__item").length??0,t=e!==V;V=e,h.value&&t&&M(),R()}),v.value&&L.observe(v.value);const e=o.value?.querySelector(".stack-tab__nav");V=o.value?.querySelectorAll(".stack-tab__item").length??0,e&&B.observe(e)}R()}),x(()=>{U(),L?.disconnect(),B?.disconnect(),L=null,B=null}),K(()=>g.isScrollButton,()=>{p.value=g.isScrollButton&&h.value});const X=e=>{!function({el:e,wrap:t,block:a="start",inline:r="nearest"}){const n=t&&"object"==typeof t&&"value"in t?t.value:t;if(e&&n)if(e.scrollIntoView)e.scrollIntoView({behavior:"smooth",block:a,inline:r});else{const{offsetLeft:t,offsetTop:o}=e;let s,i;i="center"===a?o+(e.clientHeight-n.clientHeight)/2:o,s="center"===r?t+(e.clientWidth-n.clientWidth)/2:t,ce({wrap:n,left:s,top:i})}}({el:e,wrap:o.value,block:"end",inline:"center"})},Y=e=>{if(!h.value)return!0;const t=e.offsetLeft,a=o.value.scrollLeft;return!(t<a||t+e.clientWidth>a+o.value.clientWidth)};return r({scrollIntoView:X,isInView:Y}),(t,r)=>(A(),u(a,null,[p.value?(A(),l(Nt,{key:0,"icon-class":"stack-tab__icon stack-tab__icon--left-arrow",disabled:m.value,title:D(n)("VueStackTab.scrollLeft"),"aria-label":D(n)("VueStackTab.scrollLeft"),onClick:r[0]||(r[0]=t=>!m.value&&W(-1*e.space))},null,8,["disabled","title","aria-label"])):c("",!0),d("div",{ref_key:"headerScroll",ref:v,class:"stack-tab__scroll",onWheelPassive:$},[d("div",{ref_key:"container",ref:o,class:y(["stack-tab__scroll-container",{"stack-tab__shadow-inset-left":!m.value&&b.value,"stack-tab__shadow-inset-right":!b.value&&m.value,"stack-tab__shadow-inset-all":!m.value&&!b.value}]),onScrollPassive:R},[O(t.$slots,"default")],34),j(d("div",{ref_key:"bar",ref:s,class:y(["stack-tab__scrollbar",{"stack-tab__scrollbar--dragging":f.value}])},[d("div",{ref_key:"thumb",ref:i,class:y(["stack-tab__scrollbar-thumb",{"stack-tab__scrollbar-thumb--dragging":f.value}]),onPointerdown:H(z,["prevent"]),onPointermove:G,onPointerup:U,onPointercancel:U,onLostpointercapture:U},null,34)],2),[[N,h.value]])],544),p.value?(A(),l(Nt,{key:1,"icon-class":"stack-tab__icon stack-tab__icon--right-arrow",disabled:b.value,title:D(n)("VueStackTab.scrollRight"),"aria-label":D(n)("VueStackTab.scrollRight"),onClick:r[1]||(r[1]=t=>!b.value&&W(e.space))},null,8,["disabled","title","aria-label"])):c("",!0)],64))}}),zt=/*@__PURE__*/m({__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(e,{emit:r}){const{t:s}=t(),d=h(Fe,E(!1)),m=r,b=E(),p=E(),{shown:v,contextMenuData:y,showContextMenu:k}=(()=>{const e=M({item:{},index:-1,left:0,top:0,max:0}),t=E(!1),a=()=>{t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",s)};let r=0;const n=e=>{e.target.closest?.(".stack-tab__context-menu")||Date.now()-r<250||a()},o=e=>{e.target instanceof HTMLIFrameElement&&a()},s=()=>{window.requestAnimationFrame(()=>{document.activeElement instanceof HTMLIFrameElement&&a()})};return x(()=>{a()}),{shown:t,contextMenuData:e,showContextMenu:async(a,i,l,c)=>{r=Date.now(),t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",s),await _();const{clientY:u,clientX:d}=a;t.value=!0,Object.assign(e,{item:i,index:l,top:u,left:d,max:c}),await _(),document.addEventListener("click",n),document.addEventListener("focusin",o,!0),window.addEventListener("blur",s)}}})(),T=E(null),w=()=>{v.value=!1},S=e,{closeTab:I,activeTab:P,moveTab:C,tabs:R}=Pt(),B=i(()=>R.value.find(e=>e.active)?.id??""),V=e=>{const t=b.value;if(!t)return;const a=(p.value?.querySelector(e?`.stack-tab__nav [role="tab"][data-tab-id="${CSS.escape(e)}"]`:".stack-tab__nav .stack-tab__item--active"))?.closest(".stack-tab__item");a&&!t.isInView(a)&&t.scrollIntoView(a)};K(B,()=>{_(()=>V())});const q=Ue(),W=({id:e})=>{_(()=>V(e))};q.on(He.TAB_SCROLL_TO,W),x(()=>{q.off(He.TAB_SCROLL_TO,W)});const $=E(null),F=E(null),N=i(()=>!1!==S.contextmenu),j=i(()=>Array.isArray(S.contextmenu)?S.contextmenu:[]),G=(e,t,a,r)=>{N.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))},U=e=>{e.pinned||($.value=e.id)},X=(e,t)=>{if(!$.value||$.value===e.id)return void(F.value=null);const a=t.currentTarget instanceof HTMLElement?t.currentTarget:null;if(!a)return;const{left:r,width:n}=a.getBoundingClientRect(),o=t.clientX<r+n/2?"before":"after";F.value={tabId:e.id,position:e.pinned&&"before"===o?"after":o},t.dataTransfer&&(t.dataTransfer.dropEffect="move")},Y=e=>{const t=$.value,a=F.value;if($.value=null,F.value=null,!t||t===e.id||a?.tabId!==e.id)return;const r=R.value.findIndex(e=>e.id===t),n=R.value.findIndex(t=>t.id===e.id);if(r<0||n<0)return;let o=n;"before"===a.position&&r<n&&o--,"after"===a.position&&r>n&&o++;let s=0;R.value.forEach((e,t)=>{e.pinned&&(s=t+1)}),o=Math.max(o,s),C(t,o)},J=()=>{$.value=null,F.value=null},Q=e=>e.target instanceof Element&&Boolean(e.target.closest(".stack-tab__item")),Z=e=>{if(!$.value||Q(e))return;const t=R.value[R.value.length-1];t&&t.id!==$.value&&(F.value={tabId:t.id,position:"after"},e.dataTransfer&&(e.dataTransfer.dropEffect="move"))},ee=e=>{if(Q(e))return;const t=R.value[R.value.length-1];t&&Y(t)},te=i(()=>"string"==typeof S.tabTransition?{name:S.tabTransition}:S.tabTransition),ae=e=>{const t=R.value[e];var a;t&&(ie(t,void 0,!0),a=String(t.id),_(()=>{const e=p.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))}))},re=e=>{const t=R.value.length;if(t<=0)return;const a=R.value.findIndex(e=>e.active);return"ArrowRight"===e.key?(e.preventDefault(),void ae(-1===a?0:(a+1)%t)):"ArrowLeft"===e.key?(e.preventDefault(),void ae(-1===a?t-1:(a-1+t)%t)):"Home"===e.key?(e.preventDefault(),void ae(0)):void("End"===e.key&&(e.preventDefault(),ae(t-1)))},ne=i(()=>S.tabScrollMode===Ae.BOTH||S.tabScrollMode===Ae.BUTTON),oe=i(()=>S.tabScrollMode===Ae.BOTH||S.tabScrollMode===Ae.WHEEL),se=e=>{e.closable&&I(e.id),v.value=!1},ie=(e,t,a)=>{b.value&&t&&_(()=>{b.value.isInView(t)||b.value.scrollIntoView(t)}),Promise.resolve(P(e.id,a)).then(()=>m("active",e.id)).catch(e=>{})};return(t,r)=>(A(),u("div",{ref_key:"headerRef",ref:p,class:"stack-tab__header"},[O(t.$slots,"leftButton"),f(Kt,{ref_key:"scrollContainerRef",ref:b,space:e.space,"is-scroll-wheel":oe.value,"is-scroll-button":ne.value},{default:z(()=>[f(o,g({key:"tab-list-transition",tag:"ul",class:"stack-tab__nav",role:"tablist","aria-orientation":"horizontal"},te.value,{appear:"",onKeydown:re,onDragover:H(Z,["prevent"]),onDrop:H(ee,["prevent"])}),{default:z(()=>[(A(!0),u(a,null,L(D(R),(e,t)=>(A(),l($t,{key:e.id,item:e,"drop-position":F.value?.tabId===e.id?F.value.position:void 0,onContextmenu:a=>G(a,e,t,D(R).length),onMouseup:H(t=>se(e),["middle","prevent"]),onClose:se,onActive:ie,onDragstart:U,onDragover:X,onDrop:Y,onDragend:J},null,8,["item","drop-position","onContextmenu","onMouseup"]))),128))]),_:1},16)]),_:1},8,["space","is-scroll-wheel","is-scroll-button"]),O(t.$slots,"rightButton"),f(Nt,{"icon-class":D(d)?"stack-tab__icon stack-tab__icon--restore":"stack-tab__icon stack-tab__icon--fullscreen",title:D(d)?D(s)("VueStackTab.restore"):D(s)("VueStackTab.maximum"),"aria-label":D(d)?D(s)("VueStackTab.restore"):D(s)("VueStackTab.maximum"),onClick:r[0]||(r[0]=e=>d.value=!D(d))},null,8,["icon-class","title","aria-label"]),f(n,{name:"stack-tab-zoom",appear:""},{default:z(()=>[D(v)?(A(),l(Mt,{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":j.value,"restore-focus-element":T.value,onClose:w},null,8,["left","top","tab-item","max","index","context-menu","restore-focus-element"])):c("",!0)]),_:1})],512))}}),jt=/*@__PURE__*/m({__name:"StackCacheRenderer",props:{route:{},component:{}},setup(e){const t=e,{refreshKey:a,activeCacheKey:r,addPage:n}=It(),o=q(kt());return K([()=>t.route.fullPath,()=>{return e=t.component,e?.type??e;var e},()=>a.value],()=>{o.value=n(t.route,t.component)},{immediate:!0}),(t,a)=>O(t.$slots,"default",{wrappedComponent:o.value,activeCacheKey:D(r),component:e.component})}}),Ht=/*@__PURE__*/m({__name:"StackKeepAlive",props:{transitionName:{default:"stack-tab-swap"}},emits:["loaded"],setup(e,{emit:t}){const a=t,{caches:o,getPageRefreshVersion:s}=It(),i=()=>{a("loaded")};return(t,a)=>{const c=B("router-view");return A(),l(c,null,{default:z(({Component:t,route:a})=>[f(jt,{route:a,component:t},{default:z(({wrappedComponent:t,activeCacheKey:a,component:c})=>[f(n,{name:e.transitionName,appear:"",mode:"out-in"},{default:z(()=>[(A(),l(r,{include:D(o)},[(A(),l(V(t),{key:a,vnode:c,"refresh-version":D(s)(a),"transition-name":e.transitionName,onOnLoaded:i},null,40,["vnode","refresh-version","transition-name"]))],1032,["include"]))]),_:2},1032,["name"])]),_:1},8,["route","component"])]),_:1})}}}),Gt=/* @__PURE__ */new Set(["vue-stack-tabs:openTab","openTab"]),Ut=e=>"string"==typeof e||"number"==typeof e||null==e,Xt=e=>"boolean"==typeof e?e:void 0,Yt=e=>{if(!Me(e))return null;const{id:t,title:a,path:r,query:n,iframe:o,closable:s,refreshable:i,iframeRefreshMode:l}=e;if("string"!=typeof a||""===a.trim())return null;if("string"!=typeof r||""===r.trim()||!he(r))return null;const c=(e=>{if(!Me(e))return;const t={};for(const[a,r]of Object.entries(e))(Ut(r)||Array.isArray(r)&&r.every(Ut))&&(t[a]=r);return Object.keys(t).length>0?t:void 0})(n),u=Xt(o),d=Xt(s),f=Xt(i),m=(e=>{if("reload"===e||"postMessage"===e)return e})(l);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}:{},...m?{iframeRefreshMode:m}:{}}};function Jt(e){const{tabs:t,iframeRefreshKeys:a,iframeLoadTimeout:r,t:n}=e,o=i(()=>t.value.filter(e=>e.iframe)),s=i(()=>t.value.find(e=>e.active&&!e.iframe)),l=i(()=>Boolean(s.value)),c=M({}),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,n=a>=0?e.slice(a):"",o=r.indexOf("?"),s=o>=0?r.slice(0,o):r,i=o>=0?r.slice(o+1):"",l=new URLSearchParams(i);return l.set("__stack_tabs_refresh",String(t)),`${s}?${l.toString()}${n}`})(c[e.id]?a:"about:blank",t)},f=i(()=>{const e={};for(const t of o.value){const a=u(t.id);e[t.id]=d(t,a)}return e}),m=M({}),b=e=>m[e]??{status:"idle"},p=/* @__PURE__ */new Map,h=e=>{const t=p.get(e);t&&(clearTimeout(t),p.delete(e))},v=(e,t={})=>{("loaded"!==b(e).status||t.force)&&(h(e),m[e]={status:"loading"},p.set(e,setTimeout(()=>{p.delete(e),"loading"===b(e).status&&(m[e]={status:"timeout",message:n("VueStackTab.iframeLoadTimeout")})},r.value)))},g=M({}),y=i(()=>o.value.map(e=>`${e.id}:${e.active?1:0}`).join("|"));K(y,()=>{const e=o.value;for(const a of e)a.active&&(c[a.id]=!0,v(a.id));const t=new Set(e.map(e=>e.id));for(const a of Object.keys(m))t.has(a)||(h(a),delete m[a],delete c[a],delete g[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}),K(a,(e,t={})=>{for(const a of o.value)a.active&&(e[a.id]??0)!==(t[a.id]??0)&&v(a.id,{force:!0})});return S(()=>{for(const e of p.values())clearTimeout(e);p.clear()}),{iframeTabs:o,activeNonIframeTab:s,hasActiveNonIframeTab:l,iframeSrcMap:f,getIframeRefreshKey:u,getIframeKey:e=>`${e.id}-${u(e.id)}`,getIframeLoadState:b,shouldShowIframeLoading:e=>"loading"===b(e).status,shouldShowIframeError:e=>"timeout"===b(e).status,retryIframe:e=>{m[e]={status:"idle"},a.value={...a.value,[e]:(a.value[e]??0)+1},_(()=>{v(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 n;c[e.id]&&("about:blank"!==d(e,r)&&r===u(e.id)&&a===g[e.id]&&(n=e.id,h(n),m[n]={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||!he(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(n){}},createMessageHandler:(e,t)=>{const a=e=>Object.values(g).some(t=>t?.contentWindow===e);return r=>{if(!e.value.includes(r.origin))return;const n=((e,t)=>{if(!t(e.source))return null;if(!Me(e.data))return null;const a=e.data;return"string"==typeof a.type&&Gt.has(a.type)?Yt(a.payload):null})(r,a);n&&t(n).catch(e=>{})}}}}var Qt={class:"stack-tab__container"},Zt=["id","role","aria-labelledby","aria-hidden","hidden"],ea={class:"stack-tab__iframes"},ta=["id","aria-labelledby"],aa=["aria-label"],ra={class:"stack-tab__iframe-loading-text"},na={key:1,class:"stack-tab__iframe-error",role:"alert"},oa={class:"stack-tab__iframe-error-text"},sa=["onClick"],ia=["onClick"],la=["src","data-refresh-key","title","sandbox","referrerpolicy","allow","onLoad"],ca=/*@__PURE__*/m({__name:"StackTabs",props:{defaultTabs:{default:()=>[]},homeTab:{default:void 0},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(e,{emit:r}){const o=r,s=e;"string"!=typeof s.iframePath||s.iframePath.trim();const{changeLocale:m,t:p}=t(),v=h($e,null)??ze({iframePath:s.iframePath,maxTabCount:s.max,useGlobalScroll:s.globalScroll,sessionPrefix:s.sessionPrefix}),g=b()?.appContext.app,_=((e,t={})=>{if(t.app&&!Ke.has(t.app))return Ke.add(t.app),!0;if(!t.app){if(!De)return De=e,Ne=!0,!0;if(De===e&&!Ne)return Ne=!0,!0}if(t.isProduction??!0)return!1;throw new Error("VueStackTabs only supports one <VueStackTabs> instance per Vue app.")})(v,g?{app:g}:void 0);_&&(R($e,v),R(Ge,v.eventBus));const T=E(!1),I=E();_&&R(Fe,T),K(T,e=>{de(),I.value=e?fe("body *:not(.stack-tab,.stack-tab *)"):void 0});const{tabs:P,iframeRefreshKeys:C,destroy:x,initialize:M,setMaxSize:B,setGlobalScroll:V,setSessionPrefix:q}=_?It(v):{tabs:v.tabs,iframeRefreshKeys:v.iframeRefreshKeys,destroy:()=>{},initialize:()=>{},setMaxSize:()=>{},setGlobalScroll:()=>{},setSessionPrefix:()=>{}},{setIFramePath:F,openTab:H,openInNewWindow:G}=_?Pt(v):{setIFramePath:()=>{},openTab:()=>Promise.resolve(void 0),openInNewWindow:()=>{}};_&&(F(s.iframePath),V(s.globalScroll),B(s.max),xe(m,s.i18n),K(()=>s.max,e=>B(e)),K(()=>s.globalScroll,e=>V(e)),K(()=>s.sessionPrefix,e=>q(e)),K(()=>s.i18n,e=>xe(m,e)));const U=e=>{o("onActive",e)},X=()=>{o("onPageLoaded")},Y=E(s.pageTransition),J=v.eventBus;K(()=>s.pageTransition,(e,t)=>{Y.value===t&&(Y.value=e)}),K(()=>s.pageTransitionBack,(e,t)=>{Y.value===t&&(Y.value=e)});const Q=()=>{Y.value=s.pageTransition},Z=()=>{Y.value=s.pageTransitionBack};_&&(J.on(He.FORWARD,Q),J.on(He.BACKWARD,Z));const{iframeTabs:ee,activeNonIframeTab:te,hasActiveNonIframeTab:ae,iframeSrcMap:re,getIframeRefreshKey:ne,getIframeKey:oe,getIframeLoadState:se,shouldShowIframeLoading:ie,shouldShowIframeError:le,retryIframe:ce,setIframeRef:ue,handleIframeLoad:me,handleRefreshIframePostMessage:be,createMessageHandler:pe}=Jt({tabs:P,iframeRefreshKeys:C,iframeLoadTimeout:$(s,"iframeLoadTimeout"),t:p}),ve=pe(i(()=>["undefined"!=typeof window?window.location.origin:"",...s.iframeAllowedOrigins??[]].filter(Boolean)),H);return _&&J.on(He.REFRESH_IFRAME_POSTMESSAGE,be),w(()=>{_&&(q(s.sessionPrefix),M(s.defaultTabs,s.homeTab),window.addEventListener("message",ve))}),S(()=>{_&&(window.removeEventListener("message",ve),J.off(He.REFRESH_IFRAME_POSTMESSAGE,be),J.off(He.FORWARD,Q),J.off(He.BACKWARD,Z),x(),((e,t={})=>{t.app?Ke.delete(t.app):(De===e&&(Ne=!1),De===e&&(De=null))})(v,g?{app:g}:void 0))}),(t,r)=>D(_)?(A(),u("div",{key:0,class:y(["stack-tab",{"stack-tab--maximum":T.value}]),style:k({width:e.width,height:e.height,"z-index":I.value})},[f(zt,{space:e.space,"tab-transition":e.tabTransition,"tab-scroll-mode":e.tabScrollMode,contextmenu:e.contextmenu,max:e.max,onActive:U},{leftButton:z(()=>[O(t.$slots,"leftButton")]),rightButton:z(()=>[O(t.$slots,"rightButton")]),_:3},8,["space","tab-transition","tab-scroll-mode","contextmenu","max"]),d("div",Qt,[f(n,{name:Y.value,appear:""},{default:z(()=>[j((A(),u("div",{id:D(te)?D(Lt)(D(te).id):void 0,key:"keep-alive",class:"stack-tab__keep-alive-panel",role:D(te)?"tabpanel":void 0,"aria-labelledby":D(te)?D(Et)(D(te).id):void 0,"aria-hidden":D(te)?void 0:"true",hidden:!D(ae)},[f(Ht,{"transition-name":Y.value,onLoaded:X},null,8,["transition-name"])],8,Zt)),[[N,D(ae)]])]),_:1},8,["name"]),d("div",ea,[(A(!0),u(a,null,L(D(ee),a=>(A(),l(n,{key:D(oe)(a),name:Y.value,appear:""},{default:z(()=>[j((A(),u("div",{id:D(Lt)(a.id),key:D(oe)(a),class:"stack-tab__iframe-wrapper",role:"tabpanel","aria-labelledby":D(Et)(a.id)},[D(ie)(a.id)?(A(),u("div",{key:0,class:"stack-tab__iframe-loading",role:"status","aria-live":"polite","aria-label":D(p)("VueStackTab.loading")},[O(t.$slots,"iframeLoading",{tab:a},()=>[d("span",ra,W(D(p)("VueStackTab.loading")),1)])],8,aa)):c("",!0),D(le)(a.id)?(A(),u("div",na,[O(t.$slots,"iframeError",{tab:a,retry:D(ce)},()=>[d("span",oa,W(D(se)(a.id).message??D(p)("VueStackTab.iframeLoadTimeout")),1),d("button",{type:"button",class:"stack-tab__iframe-error-retry",onClick:e=>D(ce)(a.id)},W(D(p)("VueStackTab.retry")),9,sa),a.url&&D(he)(a.url)?(A(),u("button",{key:0,type:"button",class:"stack-tab__iframe-error-open",onClick:e=>D(G)(a.id)},W(D(p)("VueStackTab.openInNewWindow")),9,ia)):c("",!0)])])):c("",!0),d("iframe",{ref_for:!0,ref:e=>D(ue)(a.id,e),class:"stack-tab__iframe",src:D(re)[a.id]||"about:blank","data-refresh-key":D(ne)(a.id),title:a.title||D(p)("VueStackTab.iframeTitle")||"Stack tab iframe",sandbox:e.iframeSandbox||void 0,referrerpolicy:e.iframeReferrerPolicy,allow:e.iframeAllow||void 0,frameborder:"0",onLoad:e=>D(me)(a,e)},null,40,la)],8,ta)),[[N,a.active]])]),_:2},1032,["name"]))),128))])])],6)):c("",!0)}});function ua(){const e=ut(),t=e?.tabId??"",a=e?.pageId??"",r=X(),n=Y(),o=Ue(),{getTab:s,getTopPage:i,getPages:l,appendPage:c,popPages:u,getPageSnapshot:d,replacePages:f,updatePage:m,evictPageCache:b,addPageScroller:p,active:h}=It(),v=r.query.__tab;let g=0;return{forward:e=>{const a=s(t),r=e.query||{},u=ke(e.path);if(a){const e=i(a.id);if(e&&e.path===u&&Pe(r,e.query||{}))return void(a.active||h(a.id))}const m={...Ce(r)};"string"==typeof v&&v&&(m.__tab=v);const b=++g;o.emit(He.FORWARD);let p="";Xe({apply:()=>{const e=a?d(a.id):[];return a&&(p=We(),c(a.id,{id:p,tabId:a.id,path:u,query:Te(m)})),e},navigate:()=>n.push({path:e.path,query:m}),rollback:e=>{a&&f(a.id,e)},isFailureResult:U,isCurrent:()=>g===b,cleanupStale:()=>{if(!a||!p)return;const e=l(a.id).filter(e=>e.id!==p);f(a.id,e)}}).catch(e=>{})},backward:(e,a)=>{const r=s(t);if(!r)return!1;const c=l(r.id);let p=0;if("number"==typeof e)p=Math.abs(e);else{const t=ye(e),a=t.query||{},r=ke(t.path);let n=!1;for(let e=c.length-2;e>=0;e--){p++;const t=c[e];if(t?.path===r&&Pe(a,t?.query||{})){n=!0;break}}if(!n)return!1}if(p<=0)return!1;const h=c.length-1;if(h<p&&(p=h),p<=0)return!1;const _=d(r.id),y=u(r.id,p).map(e=>e.id),k=i(r.id);if(!k)return f(r.id,_),!1;a&&m(r.id,k.id,{_backParams:a}),o.emit(He.BACKWARD);const T={...Ce(k.query||{})};"string"==typeof v&&v&&(T.__tab=v);const w=++g;return Xe({apply:()=>_,navigate:()=>n.push({path:k.path,query:T}),rollback:e=>f(r.id,e),isFailureResult:U,isCurrent:()=>g===w,commit:()=>{for(const e of y)b(e)},cleanupStale:()=>{const e=new Set(l(r.id).map(e=>e.id));for(const t of y)e.has(t)||b(t)}}).catch(e=>{}),!0},addScrollTarget:(...e)=>{p(a,...e)},tabId:t,pageId:a}}var da=/*@__PURE__*/m({__name:"iframe",setup:e=>(ua(),()=>{})}),fa=()=>{const e=Ue(),t=ut(),a=()=>t?.tabId??"";x(()=>{r()});const r=()=>{e.emit(He.PAGE_LOADING,{tId:a(),value:!1})};return{openTabLoading:()=>{e.emit(He.PAGE_LOADING,{tId:a(),value:!0})},closeTabLoading:r}},ma="vue-stack-tabs:refresh",ba="vue-stack-tabs:openTab";function pa(e,t={}){"undefined"!=typeof window&&window.parent&&window.parent.postMessage({type:ba,payload:e},t.targetOrigin??window.location.origin)}function ha(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 va={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")})("2.4.0");const a=ze();e.provide($e,a),e.provide(Ge,a.eventBus),e.component("VueStackTabs",ca).use(le().getI18n(t))}};export{da as IFrame,ba as MSG_OPEN_TAB,ma as MSG_REFRESH,Re as Stack,ca as StackTab,ca as VueStackTabs,Nt as TabHeaderButton,Ae as TabScrollMode,va as default,ha as onRefreshRequest,pa as postOpenTab,Pt as useTabActions,fa as useTabLoading,ua as useTabRouter};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-stack-tabs",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "private": false,
5
5
  "type": "module",
6
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.",
@@ -75,7 +75,7 @@
75
75
  "access": "public"
76
76
  },
77
77
  "scripts": {
78
- "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('✅ 端口已经空闲或清理完成'); }\"",
78
+ "clean:ports": "node -e \"const { execSync } = require('child_process'); try { if (process.platform === 'win32') { execSync('netstat -ano | findstr \":18081\" | 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 \":18080\" | 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:18081 | xargs kill -9 || true', { shell: '/bin/bash' }); execSync('lsof -ti:18080 | xargs kill -9 || true', { shell: '/bin/bash' }); } console.log('✅ 端口清理完成'); } catch(e) { console.log('✅ 端口已经空闲或清理完成'); }\"",
79
79
  "docs:dev": "run-p docs:dev:docs docs:dev:demo",
80
80
  "docs:dev:docs": "vitepress dev docs",
81
81
  "docs:dev:demo": "vite --config vite.config.docs-demo.ts",
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="200" height="200"><path d="M640 384v-85.333H213.333v597.334h597.334V384H640zm0-128h128v128h128V256H128v640h85.333V384H640V256z" fill="#444444"/></svg>
1
+ <svg t="1792720458737" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4399" width="200" height="200"><path d="M873.952 107.563H243.889c-46.574 0-84.465 37.89-84.465 84.465v223.997h-46.749c-25.966 0-47.091 21.125-47.091 47.091v406.231c0 25.966 21.125 47.091 47.091 47.091h503.726c25.967 0 47.091-21.125 47.091-47.091v-96.846h210.459c46.574 0 84.465-37.891 84.465-84.465V192.027c0-46.574-37.891-84.464-84.464-84.464z m-2.234 87.525v20.687c0 6.6-5.4 12-11.999 12h-20.687c-6.6 0-11.999-5.4-11.999-12v-20.687c0-6.598 5.399-11.998 11.999-11.998h20.687c6.599 0 11.999 5.4 11.999 11.998z m-72.614 0v20.687c0 6.6-5.4 12-11.999 12h-20.687c-6.6 0-11.999-5.4-11.999-12v-20.687c0-6.598 5.4-11.998 11.999-11.998h20.687c6.599 0 11.999 5.4 11.999 11.998z m-72.614 0v20.687c0 6.6-5.4 12-11.999 12h-20.687c-6.6 0-11.999-5.4-11.999-12v-20.687c0-6.598 5.4-11.998 11.999-11.998h20.687c6.6 0 11.999 5.4 11.999 11.998zM539.217 495.614c0 8.937-7.312 16.249-16.249 16.249-8.937 0-16.249-7.312-16.249-16.249 0-8.937 7.312-16.249 16.249-16.249 8.937 0 16.249 7.312 16.249 16.249z m-52.81 0c0 8.937-7.312 16.249-16.249 16.249-8.937 0-16.249-7.312-16.249-16.249 0-8.937 7.312-16.249 16.249-16.249 8.937 0 16.249 7.312 16.249 16.249z m89.371-16.249c8.937 0 16.249 7.312 16.249 16.249 0 8.937-7.312 16.249-16.249 16.249-8.937 0-16.249-7.312-16.249-16.249 0-8.937 7.312-16.249 16.249-16.249z m-448.51 375.388V544.361h474.54v310.392h-474.54z m746.684-143.938H663.494V500.356l-0.001-0.074v-37.167c0-25.966-21.125-47.091-47.091-47.091h-32.684a85.707 85.707 0 0 0-4.688-0.132H221.108V272.461h675.624v415.574c0 12.561-10.219 22.78-22.78 22.78z" p-id="4400"></path></svg>
@@ -31,15 +31,15 @@
31
31
 
32
32
  // 图标按钮的默认色及 hover/active 反馈
33
33
  @mixin icon-button-color {
34
- background-color: $stack-tab-text-color;
34
+ background-color: $stack-tab-icon-mask;
35
35
  transition: $stack-tab-transition-fast;
36
36
 
37
37
  &:hover {
38
- background-color: $stack-tab-color-primary;
38
+ background-color: $stack-tab-accent;
39
39
  }
40
40
 
41
41
  &:active {
42
- background-color: $stack-tab-color-primary-activate;
42
+ background-color: $stack-tab-accent-active;
43
43
  }
44
44
  }
45
45
 
@@ -48,12 +48,12 @@
48
48
  width: $icon-size;
49
49
  height: $icon-size;
50
50
  margin-left: $icon-margin;
51
- background-color: $stack-tab-text-color;
51
+ background-color: $stack-tab-icon-mask;
52
52
  @include mask-icon($icon-url);
53
53
 
54
54
  &:hover {
55
55
  cursor: pointer;
56
- background-color: $stack-tab-color-primary;
56
+ background-color: $stack-tab-accent;
57
57
  animation: rotate-center 0.3s ease-in-out both;
58
58
  mask:
59
59
  url($icon-url),
@@ -63,7 +63,7 @@
63
63
  }
64
64
 
65
65
  &:active {
66
- background-color: $stack-tab-color-primary-activate;
66
+ background-color: $stack-tab-accent-active;
67
67
  mask:
68
68
  url($icon-url),
69
69
  url('../image/mask.svg') no-repeat center center;
@@ -0,0 +1,148 @@
1
+ @use 'var' as *;
2
+
3
+ // ============================================================
4
+ // 主题令牌默认值(浅色)
5
+ //
6
+ // 所有默认值都等于改造前的硬编码值,保证升级后浅色外观零变化。
7
+ // 宿主在 :root 或任意作用域覆盖这些变量即可换肤,无需覆盖内部类名。
8
+ // ============================================================
9
+
10
+ :root {
11
+ /* accent */
12
+ --stack-tab-accent: #{$stack-tab-color-primary};
13
+ --stack-tab-accent-active: #{$stack-tab-color-primary-activate};
14
+ --stack-tab-accent-contrast: #{$stack-tab-color-accent-contrast};
15
+ --stack-tab-accent-shadow: #{rgba($stack-tab-color-primary, 0.8)};
16
+
17
+ /* surface */
18
+ --stack-tab-surface: #{$stack-tab-background-color-base};
19
+ --stack-tab-surface-muted: #{$stack-tab-background-color-inactive};
20
+ --stack-tab-overlay: #{$stack-tab-loading-mask-color};
21
+
22
+ /* border */
23
+ --stack-tab-border: #{$stack-tab-border-color};
24
+ --stack-tab-divider: #{$stack-tab-color-divider};
25
+
26
+ /* text / icon */
27
+ --stack-tab-text: #{$stack-tab-text-color};
28
+ --stack-tab-text-strong: #{$stack-tab-color-black};
29
+ --stack-tab-text-disabled: #{$stack-tab-color-disabled};
30
+ --stack-tab-mask: #{$stack-tab-text-color};
31
+
32
+ /* feedback */
33
+ --stack-tab-scrollbar: #{$stack-tab-color-scrollbar};
34
+
35
+ /* shadow:颜色层 */
36
+ --stack-tab-shadow-color: #{$stack-tab-shadow-color};
37
+ --stack-tab-shadow-soft: #{$stack-tab-shadow-soft-color};
38
+
39
+ /* shadow:整体层(引用颜色层,深色只需覆盖颜色) */
40
+ --stack-tab-shadow-tab:
41
+ -5px 0 5px -5px var(--stack-tab-shadow-color), 5px 0 5px -5px var(--stack-tab-shadow-color);
42
+ --stack-tab-shadow-tab-left: -5px 0 5px -5px var(--stack-tab-shadow-color);
43
+ --stack-tab-shadow-tab-right: 5px 0 5px -5px var(--stack-tab-shadow-color);
44
+ --stack-tab-shadow-menu: 5px 5px 5px var(--stack-tab-shadow-soft);
45
+ --stack-tab-shadow-drop: 0 0 6px var(--stack-tab-accent-shadow);
46
+
47
+ /* shadow:inset 工具类 */
48
+ --stack-tab-shadow-inset-left: inset 5px 0 5px -5px var(--stack-tab-shadow-color);
49
+ --stack-tab-shadow-inset-right: inset -5px 0 5px -5px var(--stack-tab-shadow-color);
50
+ --stack-tab-shadow-inset-top: inset 0 5px 5px -5px var(--stack-tab-shadow-color);
51
+ --stack-tab-shadow-inset-bottom: inset 0 -5px 5px -5px var(--stack-tab-shadow-color);
52
+ --stack-tab-shadow-inset-vertical:
53
+ inset 0 5px 5px -5px var(--stack-tab-shadow-color),
54
+ inset 0 -5px 5px -5px var(--stack-tab-shadow-color);
55
+ --stack-tab-shadow-inset-all:
56
+ inset 5px 0 5px -5px var(--stack-tab-shadow-color),
57
+ inset -5px 0 5px -5px var(--stack-tab-shadow-color);
58
+
59
+ /* badge */
60
+ --stack-tab-badge-default: #{$stack-tab-color-danger};
61
+ --stack-tab-badge-primary: #{$stack-tab-color-primary};
62
+
63
+ /* loading */
64
+ --stack-tab-loading-accent: #{$stack-tab-loading-color};
65
+
66
+ /* iframe(已有变量,这里给出显式默认值) */
67
+ --stack-tab-iframe-loading-bg: #{$stack-tab-iframe-loading-bg};
68
+ --stack-tab-iframe-loading-color: #{$stack-tab-iframe-loading-color};
69
+ --stack-tab-iframe-error-bg: #{$stack-tab-iframe-error-bg};
70
+ --stack-tab-iframe-error-color: #{$stack-tab-iframe-error-color};
71
+
72
+ /* typography */
73
+ --stack-tab-font-size: #{$stack-tab-font-size};
74
+ }
75
+
76
+ /**
77
+ * 深色主题
78
+ *
79
+ * 同时支持两种触发方式:
80
+ * - <html class="dark">(Element Plus / VueUse 生态的常见约定)
81
+ * - <html data-theme="dark"> 或任意容器 [data-theme="dark"]
82
+ *
83
+ * 以下是一套中性深色默认值,宿主可整体覆盖。
84
+ */
85
+ :root.dark,
86
+ :root[data-theme='dark'],
87
+ [data-theme='dark'] {
88
+ color-scheme: dark;
89
+
90
+ --stack-tab-accent: #6ea8fe;
91
+ --stack-tab-accent-active: #4d8fe0;
92
+ --stack-tab-accent-contrast: #0b1120;
93
+ --stack-tab-accent-shadow: rgb(110 168 254 / 0.8);
94
+
95
+ --stack-tab-surface: #111827;
96
+ --stack-tab-surface-muted: #1f2937;
97
+ --stack-tab-overlay: rgb(17 24 39 / 0.8);
98
+
99
+ --stack-tab-border: #334155;
100
+ --stack-tab-divider: #475569;
101
+
102
+ --stack-tab-text: #e2e8f0;
103
+ --stack-tab-text-strong: #f8fafc;
104
+ --stack-tab-text-disabled: #475569;
105
+ --stack-tab-mask: #94a3b8;
106
+
107
+ --stack-tab-scrollbar: rgb(255 255 255 / 0.18);
108
+
109
+ /* 深色背景会吞掉纯黑阴影:用描边 + 顶部高光 + 柔和投影表达层次 */
110
+ --stack-tab-shadow-color: rgb(255 255 255 / 0.55);
111
+ --stack-tab-shadow-soft: rgb(0 0 0 / 0.45);
112
+ --stack-tab-shadow-tab:
113
+ 0 0 0 1px var(--stack-tab-border),
114
+ 0 10px 26px color-mix(in srgb, var(--stack-tab-accent) 30%, transparent),
115
+ inset 0 1px 0 rgb(255 255 255 / 0.08);
116
+ --stack-tab-shadow-tab-left:
117
+ 0 0 0 1px var(--stack-tab-border),
118
+ 0 10px 26px color-mix(in srgb, var(--stack-tab-accent) 22%, transparent);
119
+ --stack-tab-shadow-tab-right:
120
+ 0 0 0 1px var(--stack-tab-border),
121
+ 0 10px 26px color-mix(in srgb, var(--stack-tab-accent) 22%, transparent);
122
+ --stack-tab-shadow-menu:
123
+ 0 0 0 1px var(--stack-tab-border),
124
+ 0 14px 36px color-mix(in srgb, var(--stack-tab-accent) 18%, transparent),
125
+ 0 12px 30px rgb(0 0 0 / 0.5);
126
+
127
+ /* inset 阴影在深色下需要更宽的渐变带,颜色仍由 --stack-tab-shadow-color 控制 */
128
+ --stack-tab-shadow-inset-left: inset 12px 0 12px -12px var(--stack-tab-shadow-color);
129
+ --stack-tab-shadow-inset-right: inset -12px 0 12px -12px var(--stack-tab-shadow-color);
130
+ --stack-tab-shadow-inset-top: inset 0 14px 14px -14px var(--stack-tab-shadow-color);
131
+ --stack-tab-shadow-inset-bottom: inset 0 -14px 14px -14px var(--stack-tab-shadow-color);
132
+ --stack-tab-shadow-inset-vertical:
133
+ inset 0 14px 14px -14px var(--stack-tab-shadow-color),
134
+ inset 0 -14px 14px -14px var(--stack-tab-shadow-color);
135
+ --stack-tab-shadow-inset-all:
136
+ inset 12px 0 12px -12px var(--stack-tab-shadow-color),
137
+ inset -12px 0 12px -12px var(--stack-tab-shadow-color);
138
+
139
+ --stack-tab-badge-default: #f87171;
140
+ --stack-tab-badge-primary: #6ea8fe;
141
+
142
+ --stack-tab-loading-accent: #60a5fa;
143
+
144
+ --stack-tab-iframe-loading-bg: #0f172a;
145
+ --stack-tab-iframe-loading-color: #94a3b8;
146
+ --stack-tab-iframe-error-bg: rgb(17 24 39 / 0.95);
147
+ --stack-tab-iframe-error-color: #cbd5e1;
148
+ }