vue-stack-tabs 2.6.0 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/tabPanel/pageComponentFactory.d.ts +1 -0
- package/dist/hooks/tabPanel/scroll.d.ts +7 -0
- package/dist/vue-stack-tabs.es.js +1 -1
- package/package.json +1 -1
- package/src/lib/hooks/tabPanel/pageComponentFactory.tsx +11 -3
- package/src/lib/hooks/tabPanel/scroll.ts +42 -5
- package/src/lib/hooks/useTabPanel.tsx +9 -2
|
@@ -13,6 +13,7 @@ interface PageComponentFactoryOptions {
|
|
|
13
13
|
addPageScroller: (pageId: string, ...selectors: string[]) => void;
|
|
14
14
|
setPageScrollAdapter: (pageId: string, getter: (() => StackTabsScrollAdapter | null) | null) => void;
|
|
15
15
|
saveScroller: (pageId: string) => void;
|
|
16
|
+
recordMainScroller: (pageId: string) => void;
|
|
16
17
|
restoreScroller: (pageId: string) => void;
|
|
17
18
|
removeScroller: (pageId: string) => void;
|
|
18
19
|
}
|
|
@@ -3,6 +3,13 @@ import { StackTabsScrollAdapter } from '../../model/ScrollAdapter';
|
|
|
3
3
|
export interface TabPanelScrollApi {
|
|
4
4
|
restoreScroller: (pageCacheId: string) => void;
|
|
5
5
|
saveScroller: (pageCacheId: string) => void;
|
|
6
|
+
/**
|
|
7
|
+
* 记录主滚动容器的实时位置(由页面滚动事件调用)。
|
|
8
|
+
*
|
|
9
|
+
* keep-alive 停用时会先把页面 DOM 移入隐藏容器,原生 scrollTop 随之归零;
|
|
10
|
+
* 因此不能只在 onDeactivated 时读取 DOM,必须在滚动过程中持续记录。
|
|
11
|
+
*/
|
|
12
|
+
recordMainScroller: (pageCacheId: string) => void;
|
|
6
13
|
removeScroller: (pageCacheId: string) => void;
|
|
7
14
|
addPageScroller: (pageCacheId: string, ...selectorIds: string[]) => void;
|
|
8
15
|
/**
|
|
@@ -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 l,computed as s,createBlock as i,createCommentVNode as c,createElementBlock as u,createElementVNode as d,createVNode as f,defineComponent as p,getCurrentInstance as m,h as b,hasInjectionContext as h,inject as v,markRaw as g,mergeProps as _,nextTick as y,normalizeClass as k,normalizeStyle as T,onActivated as w,onBeforeMount as S,onBeforeUnmount as P,onDeactivated as I,onMounted as C,onScopeDispose as A,onUnmounted as x,openBlock as M,provide as E,reactive as R,ref as L,renderList as O,renderSlot as B,resolveComponent as V,resolveDynamicComponent as W,shallowRef as q,toDisplayString as $,toRef as F,triggerRef as D,unref as H,vShow as N,watch as K,withCtx as z,withDirectives as j,withModifiers as G}from"vue";import{NavigationFailureType as U,isNavigationFailure as X,useRoute as Y,useRouter as J}from"vue-router";import{defu as Q}from"defu";import Z from"mitt";var ee=Object.defineProperty,te=(e,t)=>{let a={};for(var r in e)ee(a,r,{get:e[r],enumerable:!0});return t||ee(a,Symbol.toStringTag,{value:"Module"}),a},ae=/* @__PURE__ */te({default:()=>re}),re={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"}},ne=/* @__PURE__ */te({default:()=>oe}),oe={VueStackTab:{close:"关闭",closeLeft:"关闭左侧",closeRight:"关闭右侧",closeOthers:"关闭其他",closeAll:"关闭所有",reload:"刷新",reloadAll:"刷新所有",maximum:"最大化",restore:"还原",undefined:"未命名",loading:"加载中",iframeTitle:"标签页内嵌页面",iframeLoadTimeout:"iframe 加载超时",retry:"重试",openInNewWindow:"在新窗口打开",scrollLeft:"向左滚动",scrollRight:"向右滚动"}},le=/* @__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(le.has(r))continue;const e=a[r];a[r]=se(e)&&se(n)?ie(e,n):n}return a},ce=()=>{const t=/* #__PURE__ */Object.assign({"./lang/en.ts":ae,"./lang/zh-CN.ts":ne});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&&!le.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})}}},ue=({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 de=/* @__PURE__ */new Map,fe=e=>{void 0!==e?de.delete(e):de.clear()},pe=(e=".stack-tab__container *")=>{const t=Date.now(),a=de.get(e);if(a&&t-a.timestamp<100)return a.value;const r=document.querySelectorAll(e);let n=0;for(let l=0;l<r.length;l++){const e=+window.getComputedStyle(r[l]).zIndex||0;e<89999&&e>n&&(n=e)}const o=n+1;return de.set(e,{value:o,timestamp:t}),o},me=/* @__PURE__ */new Set(["about:blank"]),be=/* @__PURE__ */new Set(["__tab","__src"]),he=()=>"undefined"!=typeof window?window.location.origin:"http://localhost";function ve(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,he());return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}function ge(e){return ve(e)?e:"about:blank"}function _e(e){if("string"!=typeof e)return"about:blank";try{return ge(decodeURIComponent(e))}catch{return"about:blank"}}function ye(e){if(!e)return!1;const t=he();try{const a=new URL(e,t);return("http:"===a.protocol||"https:"===a.protocol)&&a.origin!==new URL(t).origin}catch{return!0}}function ke(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),l={};for(const[s,i]of o.entries()){const e=l[s];void 0!==e?l[s]=Array.isArray(e)?[...e,i]:[e,i]:l[s]=i}return{path:r,query:l,hash:a}}function Te(e){return e&&"/"!==e?e.replace(/\/+$/,"")||"/":e}function we(e={}){const t={};for(const[a,r]of Object.entries(e))t[a]=Array.isArray(r)?[...r]:r;return t}function Se(e){return{...e,query:e.query?we(e.query):void 0,_backParams:e._backParams?{...e._backParams}:void 0}}var Pe=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 Ce(e={},t={}){let a=0;for(const n of Object.keys(e))if(!Pe(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))Pe(n)||r++;return a===r}function Ae(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)},Me=/* @__PURE__ */function(e){return e.WHEEL="wheel",e.BUTTON="button",e.BOTH="both",e}({}),Ee=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()}},Re=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),Le={id:"",title:"",iframe:!1,closable:!0,refreshable:!0,iframeRefreshMode:"postMessage"},Oe=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))},Be=e=>{if("string"!=typeof e||e.length>4096)return{...Le};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{...Le}}if(t.length>2048)return{...Le};if(!t.trim().startsWith("{"))return(e=>{const t=e.split("|");if(t.length<5||t.length>6)return{...Le};const[a="",r="",n,o,l,s]=t,i=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)&&i(n)&&i(o)&&i(l)?void 0!==s&&""!==s&&"R"!==s?{...Le}:{id:a,title:r,iframe:"Y"===n,closable:"Y"===o,refreshable:"Y"===l,iframeRefreshMode:"R"===s?"reload":"postMessage"}:{...Le}})(t);try{return a=JSON.parse(t),Re(a)?{id:"string"==typeof a.id?a.id:void 0,title:"string"==typeof a.title?a.title:Le.title,iframe:"boolean"==typeof a.iframe?a.iframe:Le.iframe,closable:"boolean"==typeof a.closable?a.closable:Le.closable,refreshable:"boolean"==typeof a.refreshable?a.refreshable:Le.refreshable,iframeRefreshMode:"reload"===a.iframeRefreshMode?"reload":"postMessage"}:{...Le}}catch{return{...Le}}var a},Ve="",We=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("")}`},$e=()=>qe(),Fe=Symbol("stackTabsContext"),De=Symbol("stackTabsMaximum"),He=null,Ne=!1,Ke=/* @__PURE__ */new WeakSet,ze=(e={})=>{const t={tabs:L([]),caches:q([]),components:/* @__PURE__ */new Map,cacheIdsToEvict:/* @__PURE__ */new Set,tabIdsToEvict:/* @__PURE__ */new Set,refreshKey:L(0),scrollPositionsByPageId:/* @__PURE__ */new Map,isInitialized:L(!1),iframeRefreshKeys:L({}),maxTabCount:L(0),useGlobalScroll:L(!1),sessionPrefix:L("")};return{...t,maxTabCount:L(e.maxTabCount??t.maxTabCount.value),useGlobalScroll:L(e.useGlobalScroll??t.useGlobalScroll.value),scrollContainer:q(e.scrollContainer??null),sessionPrefix:L(e.sessionPrefix??t.sessionPrefix.value),iframePath:L(e.iframePath??""),eventBus:Z()}},je=()=>{const e=(h()?v(Fe,null):null)??He;if(!e)throw new Error("VueStackTabs runtime context is not available. Render <VueStackTabs> before using vue-stack-tabs composables.");return e},Ge=/* @__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}({}),Ue=Symbol("tabEmitter"),Xe=e=>(h()?v(Ue,null):null)??e?.eventBus??je().eventBus,Ye=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}},Je=class extends Ee{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()}},Qe=e=>{const{tabs:t,caches:a,components:r,cacheIdsToEvict:n,tabIdsToEvict:o}=e,l=(e=>{const{caches:t,components:a,cacheIdsToEvict:r,tabIdsToEvict:n}=e,o=new Set(t.value);let l=t.value;const s=()=>{if(l!==t.value){l=t.value,o.clear();for(const e of l)o.add(e)}},i=e=>{r.add(e)},c=e=>{if(s(),o.has(e)){o.delete(e);const a=l.indexOf(e);a>=0&&l.splice(a,1),D(t)}};return{markCacheForEviction:i,markTabPagesForEviction:e=>{for(const t of e.pages.readonlyList())i(t.id);n.add(e.id)},markTabPagesForEvictionOnly:e=>{for(const t of e.pages.readonlyList())i(t.id)},addCache:e=>{s(),o.has(e)||(o.add(e),l.push(e),D(t))},removeCache:c,evictPageCache:e=>{e&&(r.delete(e),c(e),a.delete(e))},replacePageCaches:(e,n)=>{s();const i=new Set(e);let c=!1;if(i.size>0){for(let e=l.length-1;e>=0;e--){const t=l[e];t&&i.has(t)&&(l.splice(e,1),c=!0)}for(const e of i)o.delete(e),r.delete(e),a.delete(e)}for(const t of n)o.has(t)||(o.add(t),l.push(t),c=!0);c&&D(t)},evictMarkedCaches:()=>{if(r.size<=0)return;s();const e=new Set(r);for(let t=l.length-1;t>=0;t--){const a=l[t];a&&e.has(a)&&l.splice(t,1)}for(const t of e)o.delete(t),a.delete(t);D(t),r.clear()}}})(e),s=L([]),i=R(/* @__PURE__ */new Map),c=R(/* @__PURE__ */new Map),u=R(/* @__PURE__ */new Map),d=L(""),f=/* @__PURE__ */new Map,p=e=>t.value.find(t=>t.id===e)??null,m=e=>c.get(e)??[],b=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},v=e=>u.get(e)?.refreshVersion??0,_=e=>{i.set(e.id,(e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode,url:e.url,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),s.value.includes(e.id)||(s.value=[...s.value,e.id]),e.active&&(d.value=e.id)},y=(e,t)=>{if(!i.has(e))return;const a=c.get(e)??[];c.set(e,[...a,t.id]),u.set(t.id,t)},k=(e,t)=>{if(!i.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(i.has(e)){for(const t of m(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:b,getPageIds:m,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:v,appendPage:y,popPages:k,clearPages:T};function P(e){const t=i.get(e);if(!t)return null;let a=f.get(e);return a?(a.title=t.title,a.closable=t.closable,a.refreshable=t.refreshable,a.iframe=t.iframe,a.active=d.value===e,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:g(new Je(e,S)),pinned:t.pinned},f.set(e,a)),a}function I(){const e=[];for(const t of s.value){const a=P(t);a&&e.push(a)}t.value=e}return{...l,getTabs:()=>t.value,getTab:p,getActiveTab:()=>t.value.find(e=>e.active)??null,findTabByTopPagePath:e=>{for(const t of s.value)if(h(t)?.path===e)return f.get(t)??null;return null},hasTab:e=>i.has(e),canAddTab:()=>e.maxTabCount.value<=0||e.maxTabCount.value>0&&e.maxTabCount.value>s.value.length,getPages:b,getTopPage:h,getPageRefreshVersion:v,getPageSnapshot:e=>b(e).map(e=>Se(e)),addTab:e=>{_(e),I()},addTabs:e=>{if(0!==e.length){for(const t of e)_(t);I()}},activateTab:e=>{const t=i.has(e)?e:"";return t!==d.value&&(d.value=t,I()),p(e)},updateTabTitle:(e,t)=>{const a=i.get(e);return!!a&&(a.title===t||(a.title=t,I()),!0)},moveTab:(e,t)=>{const a=s.value,r=a.indexOf(e);if(r<0||t<0||r===t)return!1;const n=i.get(e);if(!n||n.pinned)return!1;let o=0;for(let s=0;s<a.length;s++)i.get(a[s])?.pinned&&(o=s+1);const l=Math.max(t,o);if(l>=a.length||l===r)return!1;const c=[...a],[u]=c.splice(r,1);return!!u&&(c.splice(l,0,u),s.value=c,I(),!0)},removeTab:e=>{const t=s.value,a=t.indexOf(e);if(a<0)return{status:"not-found",removed:null,nextActiveId:""};const r=i.get(e);if(!r||!r.closable)return{status:"not-closable",removed:null,nextActiveId:e};const n=P(e),p=d.value===e;n&&l.markTabPagesForEviction(n);for(const o of m(e))u.delete(o);c.delete(e),i.delete(e),f.delete(e);let b="";return t.length>1&&p&&(b=(0===a?t[1]:t[a-1])??""),p&&(d.value=""),s.value=t.filter(t=>t!==e),I(),p||(l.evictMarkedCaches(),o.clear()),{status:"removed",removed:n,nextActiveId:b}},removeTabs:e=>{const t=[],a=[];return s.value.forEach((r,n)=>{const o=i.get(r),s=P(r);if(o&&s)if(o.closable&&e(s,n)){l.markTabPagesForEviction(s);for(const e of m(r))u.delete(e);c.delete(r),i.delete(r),f.delete(r),d.value===r&&(d.value=""),t.push(s)}else a.push(r)}),s.value=a,I(),t},appendPage:y,popPages:k,replacePages:(e,t)=>{if(!i.has(e))return;for(const r of m(e))u.delete(r);const a=[];for(const r of t){const e=Se(r);u.set(e.id,e),a.push(e.id)}c.set(e,a)},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:()=>{s.value=[],i.clear(),c.clear(),u.clear(),f.clear(),d.value="",t.value=[],a.value=[],r.clear(),n.clear(),o.clear()}}},Ze=/* @__PURE__ */new WeakMap,et=e=>"undefined"!=typeof HTMLElement&&e instanceof HTMLElement,tt=e=>{if(!e)return null;if(et(e))return e;if("function"==typeof e)return tt(e());const t=e.value;return et(t)?t:null},at=e=>"number"==typeof e&&Number.isFinite(e)?e:0,rt=e=>e?{top:at(e.top),left:at(e.left)}:null,nt="__stack-tab-main-scroller__",ot=e=>e.startsWith("#")?document.getElementById(e.slice(1)):document.querySelector(e),lt="__stack-tab-auto-scroll__:",st=/* @__PURE__ */new Map,it=e=>{const t=document.getElementById(`W-${e}`);if(!t)return st.delete(e),null;let a=st.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),st.set(e,a)),a},ct=(e,t)=>{const a=Number(t.slice(26));return Number.isInteger(a)?it(e)?.elements[a]??null:null},ut=e=>{const{scrollPositionsByPageId:t}=e,a=/* @__PURE__ */new Map,r=e=>a.get(e)?.()??null;return{restoreScroller:e=>{const a=t.get(e);if(!a)return;for(const[t,r]of a){if(t===nt)continue;const a=t.startsWith(lt)?ct(e,t):ot(t);a&&(a.scrollTop=r.top,a.scrollLeft=r.left)}const n=a.get(nt);if(!n)return;const o=r(e);if(o&&((e,t)=>{if(!e)return!1;if(e.setPosition)return e.setPosition(t),!0;const a=e.scrollElement;return!!a&&(a.scrollTop=t.top,a.scrollLeft=t.left,!0)})(o,n))return;const l=document.getElementById(`W-${e}`);l&&(l.scrollTop=n.top,l.scrollLeft=n.left)},saveScroller:e=>{const n=t.get(e);if(n){if(a.has(e)){n.delete(`#W-${e}`);const t=(e=>{if(!e)return null;if(e.getPosition)return rt(e.getPosition());const t=e.scrollElement;return t?{top:t.scrollTop,left:t.scrollLeft}:null})(r(e));t&&n.set(nt,t)}for(const e of n.keys())e.startsWith(lt)&&n.delete(e);(it(e)?.elements??[]).forEach((e,t)=>{n.set((e=>`${lt}${e}`)(t),{top:e.scrollTop,left:e.scrollLeft})});for(const e of n.keys()){if(e.startsWith(lt)||e===nt)continue;const t=ot(e);n.set(e,{top:t?.scrollTop??0,left:t?.scrollLeft??0})}}},removeScroller:e=>{const r=t.get(e);r&&(r.clear(),t.delete(e)),a.delete(e);const n=st.get(e);n&&(n.observer?.disconnect(),st.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})},setPageScrollAdapter:(e,r)=>{if(!r)return void a.delete(e);a.set(e,r),t.has(e)||t.set(e,/* @__PURE__ */new Map);const n=t.get(e);n.has(nt)||n.set(nt,{top:0,left:0})}}},dt=e=>{const t=()=>e.sessionPrefix.value+"stacktab-active-tab";let a=null,r=0,n=!1,o=null;const l=(e,t)=>{if("undefined"==typeof window)return!1;try{return window.sessionStorage.setItem(e,t),!0}catch(a){return!1}},s=()=>{n=!1;const e=a;if(a=null,!e||e.version!==r)return;const s=JSON.stringify(e.tab);s!==o&&l(t(),s)&&(o=s)},i=()=>{r++,a=null},c=()=>{i(),(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(s)))},clearSession:c,restoreActiveTabSession:e=>{null!==e?(i(),l(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 Ee(t):t);return Re(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 Ee?a:(c(),null)}catch{return c(),null}var t}}},ft=e=>{const{getTabs:t,getTopPage:a,updatePage:r,updatePages:n,iframeRefreshKeys:o,createPageId:l,addCache:s,evictPageCache:i,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=l(),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);i(u),s(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=[],l={...o.value};let s=!1;for(const n of t())n.refreshable&&(n.iframe?"reload"===n.iframeRefreshMode?(l[n.id]=(l[n.id]??0)+1,s=!0):u(n.id):d(n,e,a,r));s&&(o.value=l),n(r),c(e,a)}}},pt=["aria-label"],mt=/*@__PURE__*/p({__name:"PageLoading",props:{tabId:{}},setup(e){const a=L(0),r=e,{t:n}=t(),o=Xe(),l=L(!1);K(l,e=>{e&&(fe(".stack-tab__cache-page-wrapper *"),a.value=pe(".stack-tab__cache-page-wrapper *"))});const s=e=>{e.tId===r.tabId&&(l.value=e.value)};return o.on(Ge.PAGE_LOADING,s),x(()=>{o.off(Ge.PAGE_LOADING,s)}),(e,t)=>l.value?(M(),u("div",{key:0,class:"stack-tab-loading__mask",role:"status","aria-live":"polite","aria-label":H(n)("VueStackTab.loading"),style:T({zIndex:a.value})},[...t[0]||(t[0]=[d("div",{class:"stack-tab-loading__spin","aria-hidden":"true"},null,-1)])],12,pt)):c("",!0)}}),bt=Symbol("tabPageContext"),ht=()=>{if(h()){const e=v(bt,null);if(e)return e}const e=m();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},vt="stack-tab__shadow-inset-top",gt="stack-tab__shadow-inset-bottom",_t="stack-tab__shadow-inset-vertical",yt=e=>"function"==typeof e?e():e.value,kt=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,l=null,s=null,i=null;const c=e=>{e&&e.classList.remove(vt,gt,_t)},u=()=>{if(!n&&!e.getMetrics)return;const t=e.classTarget?yt(e.classTarget):n;if(s&&s!==t&&(c(s),s=null),s=t,!s)return;const r=e.getMetrics?.()??(n?{scrollTop:n.scrollTop,scrollHeight:n.scrollHeight,clientHeight:n.clientHeight}:null);if(!r)return;const{scrollTop:o,scrollHeight:l,clientHeight:i}=r,u=o>a,d=l-i-o>a;s.classList.toggle(_t,u&&d),s.classList.toggle(vt,u&&!d),s.classList.toggle(gt,!u&&d)},d=()=>{null===r&&(r=requestAnimationFrame(()=>{r=null,u()}))},f=()=>{n&&n.removeEventListener("scroll",d),l&&(l(),l=null),o=null,i?.disconnect(),i=null},p=(a=!1)=>{const r=yt(e.target),u=e.onScroll??null;if(r||u||e.getMetrics)if(a||r!==n||u!==o){if(f(),c(s),s=null,n=r,u){o=u;const e=u(d);l="function"==typeof e?e:null}else r&&r.addEventListener("scroll",d,{passive:!0});t&&r&&"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>d()),i.observe(r)),d()}else d()},m=()=>{null!==r&&(cancelAnimationFrame(r),r=null)},b=()=>{f(),n=null,c(s),s=null,m()};return queueMicrotask(p),A(b),{sync:(t=!1)=>{const a=yt(e.target),r=e.onScroll??null;a||r||e.getMetrics?t||a!==n||r!==o?p(t):d():b()},clear:()=>{c(s),s=null,m()}}},Tt=e=>e.split(",").map(e=>Number.parseFloat(e.trim())||0),wt=e=>{if("undefined"==typeof window)return 0;const t=window.getComputedStyle(e),a=Tt(t.transitionDuration||"0s"),r=Tt(t.transitionDelay||"0s");return 0===a.length?0:1e3*Math.max(...a.map((e,t)=>e+(r[t%r.length]??0)))},St=()=>new Promise(e=>{"function"==typeof requestAnimationFrame?requestAnimationFrame(()=>e()):setTimeout(e,16)}),Pt=e=>{const{runtimeContext:t,consumeBackParams:a,getComponent:r,setComponent:n,addCache:o,evictMarkedCaches:s,clearTabEvictionMarks:i,addPageScroller:c,setPageScrollAdapter:u,saveScroller:d,restoreScroller:m,removeScroller:h}=e;return{resolvePageComponent:e=>{const{cacheName:v,tabInfo:g}=e,_=r(v);if(_)return o(v),_;const k=/* @__PURE__ */p({name:`${v}-shell`,props:{vnode:{type:Object,required:!1,default:null}},setup:e=>()=>e.vnode}),T=/* @__PURE__ */p({name:v,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){E(bt,{tabId:g.id,pageId:v});const n=L(null),o=q(null),p=q(null),_=q(null),T=L(null),S=L(null),A=q(null),M=L(e.refreshVersion??0),R=()=>Boolean(t.scrollContainer.value),O=()=>R()?A.value:T.value?{scrollElement:T.value}:null,B=()=>{A.value=R()?(e=>{if(null==e)return null;if(et(e))return{scrollElement:e};const t=e,a=tt(t.scrollElement),r="function"==typeof t.getPosition?()=>rt(t.getPosition.call(e)):void 0,n="function"==typeof t.setPosition?a=>{t.setPosition.call(e,a)}:void 0,o="function"==typeof t.getMetrics?()=>{const a=t.getMetrics.call(e);return a?{scrollTop:at(a.scrollTop),scrollHeight:at(a.scrollHeight),clientHeight:at(a.clientHeight)}:null}:void 0,l="function"==typeof t.onScroll?a=>{const r=t.onScroll.call(e,a);return"function"==typeof r?r:()=>{}}:void 0;return a||r||n||o||l?{scrollElement:a,getPosition:r,setPosition:n,getMetrics:o,onScroll:l}:null})(S.value):null},V=kt({target:()=>O()?.scrollElement??null,classTarget:()=>T.value?.parentElement??null,getMetrics:()=>(e=>{if(!e)return null;const t=e.getMetrics?.();if(t)return{scrollTop:at(t.scrollTop),scrollHeight:at(t.scrollHeight),clientHeight:at(t.clientHeight)};const a=e.scrollElement;return a?{scrollTop:a.scrollTop,scrollHeight:a.scrollHeight,clientHeight:a.clientHeight}:null})(O()),onScroll:e=>{const t=O();if(t?.onScroll)return t.onScroll(e);const a=t?.scrollElement;return a?(a.addEventListener("scroll",e,{passive:!0}),()=>a.removeEventListener("scroll",e)):()=>{}}}),W=()=>{R()?u(v,()=>A.value):(c(v,`#W-${v}`),u(v,null))};let $=!1,F=!1,D=null,H=null,N=null,z="";const j=()=>{null!==H&&(clearTimeout(H),H=null)},G=()=>{const e=T.value,t=z;e&&t&&(e.classList.remove(`${t}-leave-active`,`${t}-leave-to`,`${t}-enter-active`,`${t}-enter-from`),z="")},U=e=>new Promise(t=>{const a=T.value;if(!a||e<=0)return void t();let r=!1;const n=()=>{r||(r=!0,N=null,j(),a.removeEventListener("transitionend",o),t())},o=e=>{e.target===a&&n()};N=n,a.addEventListener("transitionend",o),H=setTimeout(n,e+80)}),X=async t=>{const a=T.value,r=e.transitionName;if(!a||!r||"undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches)return void(M.value=t);z=r,a.classList.add(`${r}-leave-active`);const n=wt(a);if(n<=0)return G(),void(M.value=t);if(await St(),$)return void G();if(a.classList.add(`${r}-leave-to`),await U(n),G(),$)return;if(M.value=t,await y(),$)return;z=r,a.classList.add(`${r}-enter-from`),a.offsetWidth,a.classList.add(`${r}-enter-active`);const o=wt(a);o<=0||(await St(),$||(a.classList.remove(`${r}-enter-from`),await U(o))),G()};K(()=>e.refreshVersion??0,e=>{e===M.value&&null===D||(D=e,(async()=>{if(!F){F=!0;try{for(;!$&&null!==D;){const e=D;D=null,e!==M.value&&await X(e)}}finally{F=!1}}})())});const Y=()=>{n.value=a(g.id,v)};return C(()=>{r.emit("onLoaded"),W(),B(),V.sync(!0),Y(),y(()=>{if($)return;const e=Boolean(A.value);B(),!e&&A.value&&m(v),V.sync(!0)})}),I(()=>{V.clear(),d(v)}),w(()=>{r.emit("onLoaded"),B(),m(v),V.sync(!0),s(),i(),Y()}),P(()=>{$=!0,D=null,N?.(),j(),G()}),x(()=>h(v)),K(()=>t.scrollContainer.value,()=>{d(v),y(()=>{$||(W(),B(),m(v),V.sync(!0))})}),()=>{const a=e.vnode,r=n.value;a===o.value&&r===_.value||(p.value=a?l(a,r?{_back:r}:null):null,o.value=a,_.value=r);const s=t.scrollContainer.value,i=p.value?f(k,{key:`${v}-${M.value}`,vnode:p.value},null):null;return f("div",{ref:T,class:"stack-tab__cache-page-wrapper",id:`W-${v}`,style:[!s&&t.useGlobalScroll.value?"overflow:auto":"overflow:hidden","height: 100%"]},[s?b(s,{ref:S},{default:()=>i}):i,f(mt,{tabId:g.id},null)])}}});return n(v,T),o(v),T}}},It=/* @__PURE__ */p({name:"StackTabEmptyPlaceholder",setup:()=>()=>null}),Ct=()=>It,At=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},xt=e=>{const a=J(),r=Xe(e),{t:n}=t(),{tabs:o,caches:l,refreshKey:i,iframeRefreshKeys:c,isInitialized:u}=e,{getTabs:d,getTab:f,getActiveTab:p,findTabByTopPagePath:m,hasTab:b,canAddTab:h,getPages:v,getTopPage:g,getPageRefreshVersion:_,getPageSnapshot:y,addTab:k,addTabs:T,activateTab:w,updateTabTitle:S,moveTab:P,removeTab:I,removeTabs:C,appendPage:A,popPages:x,replacePages:M,clearPages:E,updatePage:R,updatePages:O,consumeBackParams:B,markCacheForEviction:V,markTabPagesForEvictionOnly:W,addCache:q,removeCache:$,evictMarkedCaches:F,evictPageCache:D,replacePageCaches:H,isTabMarkedForEviction:N,isCacheMarkedForEviction:K,unmarkCacheForEviction:z,clearTabEvictionMarks:j,getComponent:G,setComponent:U,deleteComponent:Y,snapshotComponents:Z,restoreComponents:ee,snapshotCaches:te,restoreCaches:ae,reset:re}=(e=>{const t=Ze.get(e);if(t)return t;const a=Qe(e);return Ze.set(e,a),a})(e),{restoreScroller:ne,saveScroller:oe,removeScroller:le,addPageScroller:se,setPageScrollAdapter:ie}=ut(e),{saveActiveTabToSession:ce,clearSession:ue,restoreTabFromSession:de,restoreActiveTabSession:fe,getSessionKey:pe}=dt(e),{resolvePageComponent:me}=Pt({runtimeContext:e,consumeBackParams:B,getComponent:G,setComponent:U,addCache:q,evictMarkedCaches:F,clearTabEvictionMarks:j,addPageScroller:se,setPageScrollAdapter:ie,saveScroller:oe,restoreScroller:ne,removeScroller:le}),be=e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode}),he=()=>d().find(e=>e.pinned)??null,ve=()=>{const e=he(),t=e?g(e.id):null;if(!e||!t)return!1;const r={...we(t.query),__tab:Oe(be(e))};return Promise.resolve(a.replace({path:t.path,query:r,hash:""})).catch(e=>{}),!0},Se=e=>{const t=e.query.__tab,a="string"==typeof t;if(a){const e=(e=>{if(e===Ve&&We)return{...We};const t=Be(e);return Ve=e,We=t,{...t}})(t);if(e.id)return e}const r=At(e),o=p(),l=o?g(o.id):null;if(o&&l?.path===r)return be(o);const s=m(r);return s?be(s):!a&&he()?null:{id:qe(),title:n("VueStackTab.undefined"),closable:!0,refreshable:!0,iframe:!1}},Pe=e=>{const t=Se(e);if(null===t)return ve(),{empty:!0};const n=t;if(N(n.id))return{empty:!0};const o=At(e),l=((e,t)=>({...we(e.query),__tab:e.query.__tab??Oe(t)}))(e,n),s=e=>e.path===o&&Ce(l,e.query||{});let i,c=n.id?f(n.id):null,u=null;const d=c?g(c.id):null;if(c&&d)if(s(d))i=d.id;else if(d.path===o)i=$e(),u={id:i,tabId:n.id,path:o,query:we(l)};else{const e=v(c.id);let t=-1;for(let a=e.length-2;a>=0;a--){const r=e[a];if(r&&s(r)){t=a;break}}if(-1!==t){const a=e.length-1-t,r=x(c.id,a);for(const e of r)V(e.id);const s=g(c.id);i=s?s.id:$e(),s||(u={id:i,tabId:n.id,path:o,query:we(l)})}else i=$e(),u={id:i,tabId:n.id,path:o,query:we(l)}}else i=$e(),u={id:i,tabId:n.id,path:o,query:we(l)};if(K(i)){z(i);const e=G(i);if(e)return{recovered:e,cacheName:i}}return u?c=((e,t,a,n)=>{let o=e.id?f(e.id):null;if(null===o){const a=new Ee;a.push(n);const l=t.query.__src;o={id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode??"postMessage",url:_e(l),active:!0,pages:a},w(""),k(o),r.emit(Ge.TAB_ACTIVE,{id:e.id,isRoute:!1})}else{w(o.id);const e=g(o.id);e&&e.id===n.id||A(o.id,n)}return o})(n,e,0,u):w(c.id),"string"!=typeof e.query.__tab&&a.replace({path:e.path,query:{...we(e.query),__tab:Oe(n)},hash:e.hash}).catch(e=>{}),ce(c),{cacheName:i,tabInfo:n,targetTab:c}},Ie=L(""),xe=s(()=>{const e=p();return e?g(e.id)?.refreshVersion??0:0});let Me="",Re=null;const Le=e=>C(e),Fe=()=>{if(Le(()=>!0),p())return F(),void j();const e=d().at(-1);e&&r.emit(Ge.TAB_ACTIVE,{id:e.id})},{refreshTab:De,refreshAllTabs:He}=ft({getTabs:d,getTopPage:g,updatePage:R,updatePages:O,iframeRefreshKeys:c,createPageId:$e,addCache:q,evictPageCache:D,replacePageCaches:H,refreshIframeByPostMessage:e=>r.emit(Ge.REFRESH_IFRAME_POSTMESSAGE,e)});return{tabs:o,caches:l,refreshKey:i,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=Q(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),l=ke(r.path),s=$e(),i=Te(o?e.iframePath.value:l.path),c=o?r.iframeRefreshMode??(ye(r.path)?"reload":"postMessage"):"postMessage";r.iframeRefreshMode=c;const u=Ae(o?r.query:l.query);o&&(u.__src=encodeURIComponent(r.path));const d={id:s,tabId:n,path:i,query:Q(u,{__tab:Oe(r)})},f=new Ee;f.push(d);const p={id:n,title:r.title??"",closable:r.closable,refreshable:r.refreshable,iframe:o,iframeRefreshMode:c,url:o?ge(r.path):void 0,active:!1,pages:f,pinned:a.pinned};return q(s),p};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 l="undefined"!=typeof window?sessionStorage.getItem(pe()):null,s=de(l);if(s&&!b(s.id))if(s.url&&(s.url=ge(s.url)),s.iframe&&s.url&&void 0===s.iframeRefreshMode&&(s.iframeRefreshMode=ye(s.url)?"reload":"postMessage"),s.pages&&"function"==typeof s.pages.list){k(s);for(const e of v(s.id))e&&e.id&&q(e.id)}else k(s);u.value=!0},size:()=>d().length,active:(e,t=!0)=>{r.emit(Ge.FORWARD);const n=f(e);if(!n)return Promise.resolve();if(n.active)return r.emit(Ge.TAB_SCROLL_TO,{id:e}),Promise.resolve();const o=g(e),l=()=>{const t=w(e);t&&ce(t)};if(!t)return l(),Promise.resolve();if(!o)return l(),Promise.resolve();const s=we(o.query);return"string"==typeof s.__tab&&s.__tab||(s.__tab=Oe(be(n))),Ye({apply:()=>{const e=p()?.id,t="undefined"!=typeof window?window.sessionStorage.getItem(pe()):null;return l(),{prevActiveId:e,sessionSnapshot:t}},navigate:()=>a.push({path:o.path,query:s}),rollback:e=>{w(e.prevActiveId??""),fe(e.sessionSnapshot)},isFailureResult:X,rejectFailureResult:!0})},updateTabTitle:(e,t)=>{if(!S(e,t))return!1;const r=f(e);if(!r)return!1;if(r.active){ce(r);const t=g(e);t&&Promise.resolve(a.replace({path:t.path,query:{...we(t.query),__tab:Oe(be(r))},hash:a.currentRoute.value.hash})).catch(e=>{})}return!0},getCacheName:()=>$e(),destroy:()=>{re(),c.value={},e.scrollPositionsByPageId.clear(),e.isInitialized.value=!1,e.refreshKey.value=0,ue()},reset:()=>Fe(),addCache:q,removeCache:$,getTab:f,getActiveTab:p,getTopPage:g,getPages:v,getPageRefreshVersion:_,getPageSnapshot:y,moveTab:P,addTab:k,appendPage:A,popPages:x,replacePages:M,clearPages:E,updatePage:R,updatePages:O,removeTab:e=>{const t=I(e);return"not-found"===t.status?"":"not-closable"===t.status?e:(t.nextActiveId&&r.emit(Ge.TAB_ACTIVE,{id:t.nextActiveId}),t.nextActiveId)},removeAllTabs:Fe,removeLeftTabs:e=>{const t=d().findIndex(t=>t?.id===e);if(t<=0)return;if(Le((e,a)=>a<t),p())return F(),void j();const a=d()[0];a&&r.emit(Ge.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(Le((e,t)=>t>a),p())return F(),void j();const n=d().at(-1);n&&r.emit(Ge.TAB_ACTIVE,{id:n.id})},removeOtherTabs:e=>{const t=f(e);Le(t=>t.id!==e),t&&!t.active?r.emit(Ge.TAB_ACTIVE,{id:e}):(F(),j())},hasTab:b,renewTab:e=>{const t=f(e.id);if(!t)return;const a=y(t.id),r=te(),n=Z();return W(t),F(),E(t.id),()=>{M(t.id,a),ae(r),ee(n)}},addPage:(e,t)=>{if(!t)return(e=>{if("string"==typeof e.query.__tab)return!1;const t=At(e),a=p();if(a&&g(a.id)?.path===t)return!1;if(m(t))return!1;const r=he();return Boolean(r&&g(r.id))})(e)&&ve(),Ct();const a=`${e.fullPath}::${i.value}`;if(a===Me&&Re)return Re;const r=Pe(e);if("empty"in r)return Ct();if("recovered"in r)return q(r.cacheName),Ie.value=r.cacheName,Me=a,Re=r.recovered,r.recovered;Ie.value=r.cacheName;const n=me(r);return Me=a,Re=n,n},addComponent:U,getComponent:G,removeComponent:Y,markCacheForEviction:V,evictMarkedCaches:F,evictPageCache:D,clearTabEvictionMarks:j,refreshTab:De,refreshAllTabs:He,iframeRefreshKeys:c,addPageScroller:se,setGlobalScroll:t=>{e.useGlobalScroll.value=t},setScrollContainer:t=>{e.scrollContainer.value=t??null},clearSession:ue,setSessionPrefix:t=>{e.sessionPrefix.value=t}}},Mt=/* @__PURE__ */new WeakMap,Et=e=>{const t=e??je(),a=Mt.get(t);if(a)return a;const r=xt(t);return Mt.set(t,r),r};function Rt(e){const t=J(),a=e??je(),{active:r,updateTabTitle:n,hasTab:o,refreshKey:l,reset:s,canAddTab:i,renewTab:c,getTab:u,getTopPage:d,tabs:f,moveTab:p,removeTab:m,removeAllTabs:b,refreshTab:h,refreshAllTabs:v}=Et(a),g=(e,r,n=!1)=>{const o=Oe(r),l=Ae(e.query);let s,i,c=Q(l,{__tab:o});if(e.iframe)c={...c,__src:encodeURIComponent(e.path),__tab:o},s=a.iframePath.value;else{const t=ke(e.path);s=t.path,i=t.hash||void 0,c=Q(Ae(t.query),c,{__tab:o}),c={...c,__tab:o}}return ve(e.path)?Ye({apply:()=>{},navigate:()=>t.push({path:s,query:c,hash:i}),rollback:()=>{},isFailureResult:e=>X(e)&&!(n&&X(e,U.duplicated)),rejectFailureResult:!0}):Promise.reject(/* @__PURE__ */new Error("Invalid tab URL"))};return{openTab:(e,t=!1)=>new Promise((a,n)=>{const s=(e=>{const t={refreshable:!0,closable:!0,iframe:!1};e.iframe&&void 0===e.iframeRefreshMode?t.iframeRefreshMode=ye(e.path??"")?"reload":"postMessage":e.iframe&&(t.iframeRefreshMode=e.iframeRefreshMode??"postMessage");const a=Q(e,t);return a.id||(a.id=qe()),a})(e),d=Boolean(s.id&&o(s.id));if(d&&!t)return void Promise.resolve(r(s.id)).then(()=>a(s.id),n);let f,p;if(s.id&&t&&d){const t=u(s.id);f=c(e),t?.active&&(p=l.value,l.value++)}d||i()?g(e,s,d&&t).then(()=>a(s.id),e=>{f?.(),void 0!==p&&(l.value=p),n(e)}):n(/* @__PURE__ */new Error("Max Size"))}),closeTab:m,closeAllTabs:b,refreshTab:h,refreshAllTabs:v,activeTab:r,moveTab:p,updateTabTitle:n,reset:s,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&&ve(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")}}}var Lt=["disabled"],Ot=(e,t)=>{const a=e.__vccOpts||e;for(const[r,n]of t)a[r]=n;return a},Bt=/*#__PURE__*/Ot(/*@__PURE__*/p({__name:"ContextMenuItem",props:{icon:{default:""},title:{},disabled:{type:Boolean,default:!1}},setup:e=>(t,a)=>(M(),u("button",{type:"button",role:"menuitem",class:"stack-tab__context-menu-item",disabled:e.disabled},[d("span",{class:k(["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]=G(()=>{},["prevent"]))},$(e.title),33)],8,Lt))}),[["__scopeId","data-v-fd76fc18"]]),Vt={key:1,class:"divider div-transparent",role:"separator","aria-orientation":"horizontal"},Wt=/*#__PURE__*/Ot(/*@__PURE__*/p({__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:l}=t(),s=L(),d=R({left:n.left,top:n.top}),{closeTab:p,closeAllTabs:m,refreshTab:b,refreshAllTabs:h,openInNewWindow:v}=Rt(),{removeLeftTabs:g,removeRightTabs:_,removeOtherTabs:k}=Et(),w=L(0),S=()=>{n.restoreFocusElement&&document.contains(n.restoreFocusElement)?n.restoreFocusElement.focus():document.querySelector('[role="tab"][aria-selected="true"]')?.focus()},P=()=>{o("close"),y(S)},I=e=>{e?.(),P()},A=()=>{const e=s.value;return e?Array.from(e.querySelectorAll('[role="menuitem"]')).filter(e=>!e.disabled):[]},x=e=>{const t=A();t.length<=0||t[(e+t.length)%t.length]?.focus()},E=()=>A().findIndex(e=>e===document.activeElement),B=e=>{if("Escape"===e.key)return e.preventDefault(),void P();if("ArrowDown"===e.key){e.preventDefault();const t=E();return void x(-1===t?0:t+1)}if("ArrowUp"===e.key){e.preventDefault();const t=E();return void x(-1===t?-1:t-1)}if("Home"===e.key)return e.preventDefault(),void x(0);"End"===e.key&&(e.preventDefault(),x(A().length-1))},V=e=>e.key??`${e.title}-${e.icon??""}`;return C(()=>{fe(".stack-tab,.stack-tab *"),w.value=pe(".stack-tab,.stack-tab *");const e=s.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)),x(0)}),(t,r)=>(M(),u("div",{ref_key:"menuElementRef",ref:s,class:"stack-tab__context-menu",role:"menu",tabindex:"-1",style:T({left:`${d.left}px`,top:`${d.top}px`,"z-index":w.value}),onKeydown:B},[f(Bt,{icon:"stack-tab__icon stack-tab__icon--reload stack-tab__icon--mask",title:H(l)("VueStackTab.reload"),disabled:!e.tabItem.refreshable,onClick:r[0]||(r[0]=t=>I(()=>H(b)(e.tabItem.id)))},null,8,["title","disabled"]),f(Bt,{icon:"stack-tab__icon stack-tab__icon--reload-all stack-tab__icon--mask",title:H(l)("VueStackTab.reloadAll"),onClick:r[1]||(r[1]=e=>I(H(h)))},null,8,["title"]),f(Bt,{icon:"stack-tab__icon stack-tab__icon--close stack-tab__icon--mask",title:H(l)("VueStackTab.close"),disabled:!e.tabItem.closable,onClick:r[2]||(r[2]=t=>I(()=>H(p)(e.tabItem.id)))},null,8,["title","disabled"]),f(Bt,{icon:"stack-tab__icon stack-tab__icon--close-lefts stack-tab__icon--mask",title:H(l)("VueStackTab.closeLeft"),disabled:e.index<=0,onClick:r[3]||(r[3]=t=>I(()=>H(g)(e.tabItem.id)))},null,8,["title","disabled"]),f(Bt,{icon:"stack-tab__icon stack-tab__icon--close-rights stack-tab__icon--mask",title:H(l)("VueStackTab.closeRight"),disabled:e.index>=e.max-1,onClick:r[4]||(r[4]=t=>I(()=>H(_)(e.tabItem.id)))},null,8,["title","disabled"]),f(Bt,{icon:"stack-tab__icon stack-tab__icon--close-others stack-tab__icon--mask",title:H(l)("VueStackTab.closeOthers"),onClick:r[5]||(r[5]=t=>I(()=>H(k)(e.tabItem.id)))},null,8,["title"]),f(Bt,{icon:"stack-tab__icon stack-tab__icon--close-all stack-tab__icon--mask",title:H(l)("VueStackTab.closeAll"),onClick:r[6]||(r[6]=e=>I(H(m)))},null,8,["title"]),e.tabItem.iframe&&e.tabItem.url?(M(),i(Bt,{key:0,icon:"stack-tab__icon stack-tab__icon--open stack-tab__icon--mask",title:H(l)("VueStackTab.openInNewWindow"),onClick:r[7]||(r[7]=t=>I(()=>H(v)(e.tabItem.id)))},null,8,["title"])):c("",!0),void 0!==e.contextMenu&&e.contextMenu.length>0?(M(),u("div",Vt)):c("",!0),(M(!0),u(a,null,O(e.contextMenu,t=>(M(),i(Bt,{key:V(t),"data-menu-key":V(t),icon:t.icon,title:t.title,disabled:t.disabled(e.tabItem),onClick:a=>I(()=>!t.disabled(e.tabItem)&&t.callback(e.tabItem.id))},null,8,["data-menu-key","icon","title","disabled","onClick"]))),128))],36))}}),[["__scopeId","data-v-73711048"]]),qt=e=>`stack-tab-tab-${encodeURIComponent(e)}`,$t=e=>`stack-tab-panel-${encodeURIComponent(e)}`,Ft=["draggable"],Dt=["id","data-tab-id","aria-controls","aria-selected","tabindex","title"],Ht={class:"stack-tab__item-title"},Nt={class:"stack-tab__item-title-content"},Kt=["title","aria-label","tabindex"],zt=/*@__PURE__*/p({__name:"TabHeaderItem",props:{item:{},dropPosition:{}},emits:["close","active","contextmenu","dragstart","dragover","drop","dragend"],setup(e,{emit:a}){const r=a,n=Xe(),{t:o}=t(),l=L(),i=L(!1),f=e,p=e=>{f.item.id===e.id&&g(e.isRoute??!0)};n.on(Ge.TAB_ACTIVE,p),x(()=>{n.off(Ge.TAB_ACTIVE,p)});const m=s(()=>f.item.title||o("VueStackTab.undefined")),b=()=>{r("close",f.item)},h=e=>{f.item.pinned?e.preventDefault():(i.value=!0,e.dataTransfer?.setData("text/plain",f.item.id),e.dataTransfer&&(e.dataTransfer.effectAllowed="move"),r("dragstart",f.item,e))},v=e=>{i.value=!1,r("dragend",f.item,e)},g=(e=!0)=>{r("active",f.item,l.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(),b())};return(t,a)=>(M(),u("li",{ref_key:"tabElementRef",ref:l,role:"presentation",class:k(["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":i.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]=G(e=>g(!0),["self"])),onContextmenu:a[2]||(a[2]=e=>t.$emit("contextmenu",e)),onDragstart:h,onDragend:v,onDragover:a[3]||(a[3]=G(a=>t.$emit("dragover",e.item,a),["prevent"])),onDrop:a[4]||(a[4]=G(a=>t.$emit("drop",e.item,a),["prevent"]))},[d("button",{id:H(qt)(e.item.id),type:"button",role:"tab",class:"stack-tab__item-tab","data-tab-id":e.item.id,"aria-controls":H($t)(e.item.id),"aria-selected":e.item.active?"true":"false",tabindex:e.item.active?0:-1,title:m.value,onClick:a[0]||(a[0]=e=>g(!0)),onKeydown:_},[d("span",Ht,[d("span",Nt,$(m.value),1)])],40,Dt),e.item.closable?(M(),u("button",{key:0,type:"button",class:"stack-tab__icon stack-tab__icon--close-fill stack-tab__item-button",title:H(o)("VueStackTab.close"),"aria-label":`${H(o)("VueStackTab.close")} ${m.value}`,tabindex:e.item.active?0:-1,onClick:G(b,["stop"])},null,8,Kt)):c("",!0)],42,Ft))}}),jt=["disabled","title","aria-label"],Gt={key:1,class:"stack-tab__button"},Ut=/*@__PURE__*/p({__name:"TabHeaderButton",props:{disabled:{type:Boolean,default:!1},shadow:{default:null},iconClass:{default:""},title:{default:""},ariaLabel:{default:""}},setup(e){const t=e,a=s(()=>t.ariaLabel||t.title);return(t,r)=>(M(),u("button",{type:"button",class:k(["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):(M(),u("span",{key:0,class:k(["stack-tab__mask-button",e.iconClass])},null,2)),"icon"in t.$slots?(M(),u("span",Gt,[B(t.$slots,"icon")])):c("",!0)],10,jt))}}),Xt=/*@__PURE__*/p({__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=L(null),l=L(null),s=L(null),f=L(!1),p=L(!1),m=L(!1),b=L(!1),h=L(!1),v=L(),g=e,_={clientWidth:0,scrollWidth:0,scrollLeft:0},y={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},I=e=>{const{clientWidth:t,scrollWidth:a}=_,r=a-t;return r<=0?0:(t-P())*(e/r)},A=()=>{const e=o.value;e&&(_.clientWidth=e.clientWidth,_.scrollWidth=e.scrollWidth,_.scrollLeft=e.scrollLeft,h.value=_.scrollWidth>_.clientWidth,b.value=g.isScrollButton&&h.value,p.value=_.scrollLeft<=10,m.value=_.clientWidth+_.scrollLeft-_.scrollWidth>=-10,(e=>{const t=s.value;t&&h.value&&(t.style.width=`${P()}px`,t.style.transform=`translateX(${I(e)}px)`)})(_.scrollLeft))},E=()=>{const e=o.value?.querySelector(".stack-tab__item--active");e&&!Y(e)&&X(e)};let R=null,O=null,V=0;const W=(e,t=!0)=>{ue({wrap:o.value,left:e,top:0,smooth:t})},q=e=>{W(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;W(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(y.startThumbLeft+w-y.startPageX,0),r);ue({wrap:o.value,left:n*a/r,top:0,smooth:!1}),s.value&&(s.value.style.transform=`translateX(${n}px)`)},D=e=>{const t=s.value,a="mouse"!==e.pointerType||0===e.button;if(!t||!a)return;const r=o.value?.scrollLeft??0;y.startPageX=e.pageX,y.startThumbLeft=I(r),w=e.pageX,f.value=!0,S=e.pointerId,t.setPointerCapture?.(e.pointerId)},z=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=s.value;t&&null!==e&&t.hasPointerCapture?.(e)&&t.releasePointerCapture(e)};C(()=>{if("undefined"!=typeof ResizeObserver){R=new ResizeObserver(()=>{A(),E()}),O=new ResizeObserver(()=>{const e=o.value?.querySelectorAll(".stack-tab__item").length??0,t=e!==V;V=e,h.value&&t&&E(),A()}),v.value&&R.observe(v.value);const e=o.value?.querySelector(".stack-tab__nav");V=o.value?.querySelectorAll(".stack-tab__item").length??0,e&&O.observe(e)}A()}),x(()=>{U(),R?.disconnect(),O?.disconnect(),R=null,O=null}),K(()=>g.isScrollButton,()=>{b.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 l,s;s="center"===a?o+(e.clientHeight-n.clientHeight)/2:o,l="center"===r?t+(e.clientWidth-n.clientWidth)/2:t,ue({wrap:n,left:l,top:s})}}({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)=>(M(),u(a,null,[b.value?(M(),i(Ut,{key:0,"icon-class":"stack-tab__icon stack-tab__icon--left-arrow",disabled:p.value,title:H(n)("VueStackTab.scrollLeft"),"aria-label":H(n)("VueStackTab.scrollLeft"),onClick:r[0]||(r[0]=t=>!p.value&&q(-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:k(["stack-tab__scroll-container",{"stack-tab__shadow-inset-left":!p.value&&m.value,"stack-tab__shadow-inset-right":!m.value&&p.value,"stack-tab__shadow-inset-all":!p.value&&!m.value}]),onScrollPassive:A},[B(t.$slots,"default")],34),j(d("div",{ref_key:"bar",ref:l,class:k(["stack-tab__scrollbar",{"stack-tab__scrollbar--dragging":f.value}])},[d("div",{ref_key:"thumb",ref:s,class:k(["stack-tab__scrollbar-thumb",{"stack-tab__scrollbar-thumb--dragging":f.value}]),onPointerdown:G(D,["prevent"]),onPointermove:z,onPointerup:U,onPointercancel:U,onLostpointercapture:U},null,34)],2),[[N,h.value]])],544),b.value?(M(),i(Ut,{key:1,"icon-class":"stack-tab__icon stack-tab__icon--right-arrow",disabled:m.value,title:H(n)("VueStackTab.scrollRight"),"aria-label":H(n)("VueStackTab.scrollRight"),onClick:r[1]||(r[1]=t=>!m.value&&q(e.space))},null,8,["disabled","title","aria-label"])):c("",!0)],64))}}),Yt=/*@__PURE__*/p({__name:"index",props:{space:{},tabScrollMode:{default:Me.BOTH},tabTransition:{default:()=>({name:"stack-tab-zoom"})},contextmenu:{type:[Boolean,Object],default:!0},max:{default:20}},emits:["active"],setup(e,{emit:r}){const{t:l}=t(),d=v(De,L(!1)),p=r,m=L(),b=L(),{shown:h,contextMenuData:g,showContextMenu:k}=(()=>{const e=R({item:{},index:-1,left:0,top:0,max:0}),t=L(!1),a=()=>{t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",l)};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()},l=()=>{window.requestAnimationFrame(()=>{document.activeElement instanceof HTMLIFrameElement&&a()})};return x(()=>{a()}),{shown:t,contextMenuData:e,showContextMenu:async(a,s,i,c)=>{r=Date.now(),t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",l),await y();const{clientY:u,clientX:d}=a;t.value=!0,Object.assign(e,{item:s,index:i,top:u,left:d,max:c}),await y(),document.addEventListener("click",n),document.addEventListener("focusin",o,!0),window.addEventListener("blur",l)}}})(),T=L(null),w=()=>{h.value=!1},S=e,{closeTab:P,activeTab:I,moveTab:C,tabs:A}=Rt(),E=s(()=>A.value.find(e=>e.active)?.id??""),V=e=>{const t=m.value;if(!t)return;const a=(b.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(E,()=>{y(()=>V())});const W=Xe(),q=({id:e})=>{y(()=>V(e))};W.on(Ge.TAB_SCROLL_TO,q),x(()=>{W.off(Ge.TAB_SCROLL_TO,q)});const $=L(null),F=L(null),D=s(()=>!1!==S.contextmenu),N=s(()=>Array.isArray(S.contextmenu)?S.contextmenu:[]),j=(e,t,a,r)=>{D.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=A.value.findIndex(e=>e.id===t),n=A.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 l=0;A.value.forEach((e,t)=>{e.pinned&&(l=t+1)}),o=Math.max(o,l),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=A.value[A.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=A.value[A.value.length-1];t&&Y(t)},te=s(()=>"string"==typeof S.tabTransition?{name:S.tabTransition}:S.tabTransition),ae=e=>{const t=A.value[e];var a;t&&(se(t,void 0,!0),a=String(t.id),y(()=>{const e=b.value?.querySelector(`.stack-tab__nav [role="tab"][data-tab-id="${CSS.escape(a)}"]`);e&&(e.focus(),m.value&&!m.value.isInView(e)&&m.value.scrollIntoView(e))}))},re=e=>{const t=A.value.length;if(t<=0)return;const a=A.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=s(()=>S.tabScrollMode===Me.BOTH||S.tabScrollMode===Me.BUTTON),oe=s(()=>S.tabScrollMode===Me.BOTH||S.tabScrollMode===Me.WHEEL),le=e=>{e.closable&&P(e.id),h.value=!1},se=(e,t,a)=>{m.value&&t&&y(()=>{m.value.isInView(t)||m.value.scrollIntoView(t)}),Promise.resolve(I(e.id,a)).then(()=>p("active",e.id)).catch(e=>{})};return(t,r)=>(M(),u("div",{ref_key:"headerRef",ref:b,class:"stack-tab__header"},[B(t.$slots,"leftButton"),f(Xt,{ref_key:"scrollContainerRef",ref:m,space:e.space,"is-scroll-wheel":oe.value,"is-scroll-button":ne.value},{default:z(()=>[f(o,_({key:"tab-list-transition",tag:"ul",class:"stack-tab__nav",role:"tablist","aria-orientation":"horizontal"},te.value,{appear:"",onKeydown:re,onDragover:G(Z,["prevent"]),onDrop:G(ee,["prevent"])}),{default:z(()=>[(M(!0),u(a,null,O(H(A),(e,t)=>(M(),i(zt,{key:e.id,item:e,"drop-position":F.value?.tabId===e.id?F.value.position:void 0,onContextmenu:a=>j(a,e,t,H(A).length),onMouseup:G(t=>le(e),["middle","prevent"]),onClose:le,onActive:se,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"]),B(t.$slots,"rightButton"),f(Ut,{"icon-class":H(d)?"stack-tab__icon stack-tab__icon--restore":"stack-tab__icon stack-tab__icon--fullscreen",title:H(d)?H(l)("VueStackTab.restore"):H(l)("VueStackTab.maximum"),"aria-label":H(d)?H(l)("VueStackTab.restore"):H(l)("VueStackTab.maximum"),onClick:r[0]||(r[0]=e=>d.value=!H(d))},null,8,["icon-class","title","aria-label"]),f(n,{name:"stack-tab-zoom",appear:""},{default:z(()=>[H(h)?(M(),i(Wt,{key:"context-menu-transition",left:H(g).left,top:H(g).top,"tab-item":H(g).item,max:H(g).max,index:H(g).index,"context-menu":N.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__*/p({__name:"StackCacheRenderer",props:{route:{},component:{}},setup(e){const t=e,{refreshKey:a,activeCacheKey:r,addPage:n}=Et(),o=q(Ct());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)=>B(t.$slots,"default",{wrappedComponent:o.value,activeCacheKey:H(r),component:e.component})}}),Qt=/*@__PURE__*/p({__name:"StackKeepAlive",props:{transitionName:{default:"stack-tab-swap"}},emits:["loaded"],setup(e,{emit:t}){const a=t,{caches:o,getPageRefreshVersion:l}=Et(),s=()=>{a("loaded")};return(t,a)=>{const c=V("router-view");return M(),i(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(()=>[(M(),i(r,{include:H(o)},[(M(),i(W(t),{key:a,vnode:c,"refresh-version":H(l)(a),"transition-name":e.transitionName,onOnLoaded:s},null,40,["vnode","refresh-version","transition-name"]))],1032,["include"]))]),_:2},1032,["name"])]),_:1},8,["route","component"])]),_:1})}}}),Zt=/* @__PURE__ */new Set(["vue-stack-tabs:openTab","openTab"]),ea=e=>"string"==typeof e||"number"==typeof e||null==e,ta=e=>"boolean"==typeof e?e:void 0,aa=e=>{if(!Re(e))return null;const{id:t,title:a,path:r,query:n,iframe:o,closable:l,refreshable:s,iframeRefreshMode:i}=e;if("string"!=typeof a||""===a.trim())return null;if("string"!=typeof r||""===r.trim()||!ve(r))return null;const c=(e=>{if(!Re(e))return;const t={};for(const[a,r]of Object.entries(e))(ea(r)||Array.isArray(r)&&r.every(ea))&&(t[a]=r);return Object.keys(t).length>0?t:void 0})(n),u=ta(o),d=ta(l),f=ta(s),p=(e=>{if("reload"===e||"postMessage"===e)return e})(i);return{..."string"==typeof t&&t?{id:t}:{},title:a,path:r,...c?{query:c}:{},...void 0!==u?{iframe:u}:{},...void 0!==d?{closable:d}:{},...void 0!==f?{refreshable:f}:{},...p?{iframeRefreshMode:p}:{}}};function ra(e){const{tabs:t,iframeRefreshKeys:a,iframeLoadTimeout:r,t:n}=e,o=s(()=>t.value.filter(e=>e.iframe)),l=s(()=>t.value.find(e=>e.active&&!e.iframe)),i=s(()=>Boolean(l.value)),c=R({}),u=e=>a.value[e]??0,d=(e,t=u(e.id))=>{const a=ge(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("?"),l=o>=0?r.slice(0,o):r,s=o>=0?r.slice(o+1):"",i=new URLSearchParams(s);return i.set("__stack_tabs_refresh",String(t)),`${l}?${i.toString()}${n}`})(c[e.id]?a:"about:blank",t)},f=s(()=>{const e={};for(const t of o.value){const a=u(t.id);e[t.id]=d(t,a)}return e}),p=R({}),m=e=>p[e]??{status:"idle"},b=/* @__PURE__ */new Map,h=e=>{const t=b.get(e);t&&(clearTimeout(t),b.delete(e))},v=(e,t={})=>{("loaded"!==m(e).status||t.force)&&(h(e),p[e]={status:"loading"},b.set(e,setTimeout(()=>{b.delete(e),"loading"===m(e).status&&(p[e]={status:"timeout",message:n("VueStackTab.iframeLoadTimeout")})},r.value)))},g=R({}),_=s(()=>o.value.map(e=>`${e.id}:${e.active?1:0}`).join("|"));K(_,()=>{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(p))t.has(a)||(h(a),delete p[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 P(()=>{for(const e of b.values())clearTimeout(e);b.clear()}),{iframeTabs:o,activeNonIframeTab:l,hasActiveNonIframeTab:i,iframeSrcMap:f,getIframeRefreshKey:u,getIframeKey:e=>`${e.id}-${u(e.id)}`,getIframeLoadState:m,shouldShowIframeLoading:e=>"loading"===m(e).status,shouldShowIframeError:e=>"timeout"===m(e).status,retryIframe:e=>{p[e]={status:"idle"},a.value={...a.value,[e]:(a.value[e]??0)+1},y(()=>{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),p[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||!ve(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(!Re(e.data))return null;const a=e.data;return"string"==typeof a.type&&Zt.has(a.type)?aa(a.payload):null})(r,a);n&&t(n).catch(e=>{})}}}}var na={class:"stack-tab__container"},oa=["id","role","aria-labelledby","aria-hidden","hidden"],la={class:"stack-tab__iframes"},sa=["id","aria-labelledby"],ia=["aria-label"],ca={class:"stack-tab__iframe-loading-text"},ua={key:1,class:"stack-tab__iframe-error",role:"alert"},da={class:"stack-tab__iframe-error-text"},fa=["onClick"],pa=["onClick"],ma=["src","data-refresh-key","title","sandbox","referrerpolicy","allow","onLoad"],ba=/*@__PURE__*/p({__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:Me.BOTH},width:{default:"100%"},height:{default:"100%"},i18n:{default:void 0},space:{default:300},globalScroll:{type:Boolean,default:!1},scrollContainer:{},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,l=e;"string"!=typeof l.iframePath||l.iframePath.trim();const{changeLocale:p,t:b}=t(),h=v(Fe,null)??ze({iframePath:l.iframePath,maxTabCount:l.max,useGlobalScroll:l.globalScroll,scrollContainer:l.scrollContainer,sessionPrefix:l.sessionPrefix}),g=m()?.appContext.app,_=((e,t={})=>{if(t.app&&!Ke.has(t.app))return Ke.add(t.app),!0;if(!t.app){if(!He)return He=e,Ne=!0,!0;if(He===e&&!Ne)return Ne=!0,!0}if(t.isProduction??!0)return!1;throw new Error("VueStackTabs only supports one <VueStackTabs> instance per Vue app.")})(h,g?{app:g}:void 0);_&&(E(Fe,h),E(Ue,h.eventBus));const y=L(!1),w=L();_&&E(De,y),K(y,e=>{fe(),w.value=e?pe("body *:not(.stack-tab,.stack-tab *)"):void 0});const{tabs:I,iframeRefreshKeys:C,destroy:A,initialize:x,setMaxSize:R,setGlobalScroll:V,setScrollContainer:W,setSessionPrefix:q}=_?Et(h):{tabs:h.tabs,iframeRefreshKeys:h.iframeRefreshKeys,destroy:()=>{},initialize:()=>{},setMaxSize:()=>{},setGlobalScroll:()=>{},setScrollContainer:()=>{},setSessionPrefix:()=>{}},{setIFramePath:D,openTab:G,openInNewWindow:U}=_?Rt(h):{setIFramePath:()=>{},openTab:()=>Promise.resolve(void 0),openInNewWindow:()=>{}};_&&(D(l.iframePath),V(l.globalScroll),W(l.scrollContainer),R(l.max),xe(p,l.i18n),K(()=>l.max,e=>R(e)),K(()=>l.globalScroll,e=>V(e)),K(()=>l.scrollContainer,e=>W(e)),K(()=>l.sessionPrefix,e=>q(e)),K(()=>l.i18n,e=>xe(p,e)));const X=e=>{o("onActive",e)},Y=()=>{o("onPageLoaded")},J=L(l.pageTransition),Q=h.eventBus;K(()=>l.pageTransition,(e,t)=>{J.value===t&&(J.value=e)}),K(()=>l.pageTransitionBack,(e,t)=>{J.value===t&&(J.value=e)});const Z=()=>{J.value=l.pageTransition},ee=()=>{J.value=l.pageTransitionBack};_&&(Q.on(Ge.FORWARD,Z),Q.on(Ge.BACKWARD,ee));const{iframeTabs:te,activeNonIframeTab:ae,hasActiveNonIframeTab:re,iframeSrcMap:ne,getIframeRefreshKey:oe,getIframeKey:le,getIframeLoadState:se,shouldShowIframeLoading:ie,shouldShowIframeError:ce,retryIframe:ue,setIframeRef:de,handleIframeLoad:me,handleRefreshIframePostMessage:be,createMessageHandler:he}=ra({tabs:I,iframeRefreshKeys:C,iframeLoadTimeout:F(l,"iframeLoadTimeout"),t:b}),ge=he(s(()=>["undefined"!=typeof window?window.location.origin:"",...l.iframeAllowedOrigins??[]].filter(Boolean)),G);return _&&Q.on(Ge.REFRESH_IFRAME_POSTMESSAGE,be),S(()=>{_&&(q(l.sessionPrefix),x(l.defaultTabs,l.homeTab),window.addEventListener("message",ge))}),P(()=>{_&&(window.removeEventListener("message",ge),Q.off(Ge.REFRESH_IFRAME_POSTMESSAGE,be),Q.off(Ge.FORWARD,Z),Q.off(Ge.BACKWARD,ee),A(),((e,t={})=>{t.app?Ke.delete(t.app):(He===e&&(Ne=!1),He===e&&(He=null))})(h,g?{app:g}:void 0))}),(t,r)=>H(_)?(M(),u("div",{key:0,class:k(["stack-tab",{"stack-tab--maximum":y.value}]),style:T({width:e.width,height:e.height,"z-index":w.value})},[f(Yt,{space:e.space,"tab-transition":e.tabTransition,"tab-scroll-mode":e.tabScrollMode,contextmenu:e.contextmenu,max:e.max,onActive:X},{leftButton:z(()=>[B(t.$slots,"leftButton")]),rightButton:z(()=>[B(t.$slots,"rightButton")]),_:3},8,["space","tab-transition","tab-scroll-mode","contextmenu","max"]),d("div",na,[f(n,{name:J.value,appear:""},{default:z(()=>[j((M(),u("div",{id:H(ae)?H($t)(H(ae).id):void 0,key:"keep-alive",class:"stack-tab__keep-alive-panel",role:H(ae)?"tabpanel":void 0,"aria-labelledby":H(ae)?H(qt)(H(ae).id):void 0,"aria-hidden":H(ae)?void 0:"true",hidden:!H(re)},[f(Qt,{"transition-name":J.value,onLoaded:Y},null,8,["transition-name"])],8,oa)),[[N,H(re)]])]),_:1},8,["name"]),d("div",la,[(M(!0),u(a,null,O(H(te),a=>(M(),i(n,{key:H(le)(a),name:J.value,appear:""},{default:z(()=>[j((M(),u("div",{id:H($t)(a.id),key:H(le)(a),class:"stack-tab__iframe-wrapper",role:"tabpanel","aria-labelledby":H(qt)(a.id)},[H(ie)(a.id)?(M(),u("div",{key:0,class:"stack-tab__iframe-loading",role:"status","aria-live":"polite","aria-label":H(b)("VueStackTab.loading")},[B(t.$slots,"iframeLoading",{tab:a},()=>[d("span",ca,$(H(b)("VueStackTab.loading")),1)])],8,ia)):c("",!0),H(ce)(a.id)?(M(),u("div",ua,[B(t.$slots,"iframeError",{tab:a,retry:H(ue)},()=>[d("span",da,$(H(se)(a.id).message??H(b)("VueStackTab.iframeLoadTimeout")),1),d("button",{type:"button",class:"stack-tab__iframe-error-retry",onClick:e=>H(ue)(a.id)},$(H(b)("VueStackTab.retry")),9,fa),a.url&&H(ve)(a.url)?(M(),u("button",{key:0,type:"button",class:"stack-tab__iframe-error-open",onClick:e=>H(U)(a.id)},$(H(b)("VueStackTab.openInNewWindow")),9,pa)):c("",!0)])])):c("",!0),d("iframe",{ref_for:!0,ref:e=>H(de)(a.id,e),class:"stack-tab__iframe",src:H(ne)[a.id]||"about:blank","data-refresh-key":H(oe)(a.id),title:a.title||H(b)("VueStackTab.iframeTitle")||"Stack tab iframe",sandbox:e.iframeSandbox||void 0,referrerpolicy:e.iframeReferrerPolicy,allow:e.iframeAllow||void 0,frameborder:"0",onLoad:e=>H(me)(a,e)},null,40,ma)],8,sa)),[[N,a.active]])]),_:2},1032,["name"]))),128))])])],6)):c("",!0)}});function ha(){const e=ht(),t=e?.tabId??"",a=e?.pageId??"",r=Y(),n=J(),o=Xe(),{getTab:l,getTopPage:s,getPages:i,appendPage:c,popPages:u,getPageSnapshot:d,replacePages:f,updatePage:p,evictPageCache:m,addPageScroller:b,active:h}=Et(),v=r.query.__tab;let g=0;return{forward:e=>{const a=l(t),r=e.query||{},u=Te(e.path);if(a){const e=s(a.id);if(e&&e.path===u&&Ce(r,e.query||{}))return void(a.active||h(a.id))}const p={...Ae(r)};"string"==typeof v&&v&&(p.__tab=v);const m=++g;o.emit(Ge.FORWARD);let b="";Ye({apply:()=>{const e=a?d(a.id):[];return a&&(b=$e(),c(a.id,{id:b,tabId:a.id,path:u,query:we(p)})),e},navigate:()=>n.push({path:e.path,query:p}),rollback:e=>{a&&f(a.id,e)},isFailureResult:X,isCurrent:()=>g===m,cleanupStale:()=>{if(!a||!b)return;const e=i(a.id).filter(e=>e.id!==b);f(a.id,e)}}).catch(e=>{})},backward:(e,a)=>{const r=l(t);if(!r)return!1;const c=i(r.id);let b=0;if("number"==typeof e)b=Math.abs(e);else{const t=ke(e),a=t.query||{},r=Te(t.path);let n=!1;for(let e=c.length-2;e>=0;e--){b++;const t=c[e];if(t?.path===r&&Ce(a,t?.query||{})){n=!0;break}}if(!n)return!1}if(b<=0)return!1;const h=c.length-1;if(h<b&&(b=h),b<=0)return!1;const _=d(r.id),y=u(r.id,b).map(e=>e.id),k=s(r.id);if(!k)return f(r.id,_),!1;a&&p(r.id,k.id,{_backParams:a}),o.emit(Ge.BACKWARD);const T={...Ae(k.query||{})};"string"==typeof v&&v&&(T.__tab=v);const w=++g;return Ye({apply:()=>_,navigate:()=>n.push({path:k.path,query:T}),rollback:e=>f(r.id,e),isFailureResult:X,isCurrent:()=>g===w,commit:()=>{for(const e of y)m(e)},cleanupStale:()=>{const e=new Set(i(r.id).map(e=>e.id));for(const t of y)e.has(t)||m(t)}}).catch(e=>{}),!0},addScrollTarget:(...e)=>{b(a,...e)},tabId:t,pageId:a}}var va=/*@__PURE__*/p({__name:"iframe",setup:e=>(ha(),()=>{})}),ga=()=>{const e=Xe(),t=ht(),a=()=>t?.tabId??"";x(()=>{r()});const r=()=>{e.emit(Ge.PAGE_LOADING,{tId:a(),value:!1})};return{openTabLoading:()=>{e.emit(Ge.PAGE_LOADING,{tId:a(),value:!0})},closeTabLoading:r}},_a="vue-stack-tabs:refresh",ya="vue-stack-tabs:openTab";function ka(e,t={}){"undefined"!=typeof window&&window.parent&&window.parent.postMessage({type:ya,payload:e},t.targetOrigin??window.location.origin)}function Ta(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 wa={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.6.0");const a=ze();e.provide(Fe,a),e.provide(Ue,a.eventBus),e.component("VueStackTabs",ba).use(ce().getI18n(t))}};export{va as IFrame,ya as MSG_OPEN_TAB,_a as MSG_REFRESH,Ee as Stack,ba as StackTab,ba as VueStackTabs,Ut as TabHeaderButton,Me as TabScrollMode,wa as default,Ta as onRefreshRequest,ka as postOpenTab,Rt as useTabActions,ga as useTabLoading,ha 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 l,computed as s,createBlock as i,createCommentVNode as c,createElementBlock as u,createElementVNode as d,createVNode as f,defineComponent as p,getCurrentInstance as m,h as b,hasInjectionContext as h,inject as v,markRaw as g,mergeProps as _,nextTick as y,normalizeClass as k,normalizeStyle as T,onActivated as w,onBeforeMount as S,onBeforeUnmount as P,onDeactivated as I,onMounted as C,onScopeDispose as A,onUnmounted as x,openBlock as M,provide as E,reactive as R,ref as L,renderList as O,renderSlot as B,resolveComponent as V,resolveDynamicComponent as W,shallowRef as q,toDisplayString as $,toRef as F,triggerRef as D,unref as H,vShow as N,watch as K,withCtx as z,withDirectives as j,withModifiers as G}from"vue";import{NavigationFailureType as U,isNavigationFailure as X,useRoute as Y,useRouter as J}from"vue-router";import{defu as Q}from"defu";import Z from"mitt";var ee=Object.defineProperty,te=(e,t)=>{let a={};for(var r in e)ee(a,r,{get:e[r],enumerable:!0});return t||ee(a,Symbol.toStringTag,{value:"Module"}),a},ae=/* @__PURE__ */te({default:()=>re}),re={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"}},ne=/* @__PURE__ */te({default:()=>oe}),oe={VueStackTab:{close:"关闭",closeLeft:"关闭左侧",closeRight:"关闭右侧",closeOthers:"关闭其他",closeAll:"关闭所有",reload:"刷新",reloadAll:"刷新所有",maximum:"最大化",restore:"还原",undefined:"未命名",loading:"加载中",iframeTitle:"标签页内嵌页面",iframeLoadTimeout:"iframe 加载超时",retry:"重试",openInNewWindow:"在新窗口打开",scrollLeft:"向左滚动",scrollRight:"向右滚动"}},le=/* @__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(le.has(r))continue;const e=a[r];a[r]=se(e)&&se(n)?ie(e,n):n}return a},ce=()=>{const t=/* #__PURE__ */Object.assign({"./lang/en.ts":ae,"./lang/zh-CN.ts":ne});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&&!le.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})}}},ue=({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 de=/* @__PURE__ */new Map,fe=e=>{void 0!==e?de.delete(e):de.clear()},pe=(e=".stack-tab__container *")=>{const t=Date.now(),a=de.get(e);if(a&&t-a.timestamp<100)return a.value;const r=document.querySelectorAll(e);let n=0;for(let l=0;l<r.length;l++){const e=+window.getComputedStyle(r[l]).zIndex||0;e<89999&&e>n&&(n=e)}const o=n+1;return de.set(e,{value:o,timestamp:t}),o},me=/* @__PURE__ */new Set(["about:blank"]),be=/* @__PURE__ */new Set(["__tab","__src"]),he=()=>"undefined"!=typeof window?window.location.origin:"http://localhost";function ve(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,he());return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}}function ge(e){return ve(e)?e:"about:blank"}function _e(e){if("string"!=typeof e)return"about:blank";try{return ge(decodeURIComponent(e))}catch{return"about:blank"}}function ye(e){if(!e)return!1;const t=he();try{const a=new URL(e,t);return("http:"===a.protocol||"https:"===a.protocol)&&a.origin!==new URL(t).origin}catch{return!0}}function ke(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),l={};for(const[s,i]of o.entries()){const e=l[s];void 0!==e?l[s]=Array.isArray(e)?[...e,i]:[e,i]:l[s]=i}return{path:r,query:l,hash:a}}function Te(e){return e&&"/"!==e?e.replace(/\/+$/,"")||"/":e}function we(e={}){const t={};for(const[a,r]of Object.entries(e))t[a]=Array.isArray(r)?[...r]:r;return t}function Se(e){return{...e,query:e.query?we(e.query):void 0,_backParams:e._backParams?{...e._backParams}:void 0}}var Pe=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 Ce(e={},t={}){let a=0;for(const n of Object.keys(e))if(!Pe(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))Pe(n)||r++;return a===r}function Ae(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)},Me=/* @__PURE__ */function(e){return e.WHEEL="wheel",e.BUTTON="button",e.BOTH="both",e}({}),Ee=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()}},Re=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),Le={id:"",title:"",iframe:!1,closable:!0,refreshable:!0,iframeRefreshMode:"postMessage"},Oe=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))},Be=e=>{if("string"!=typeof e||e.length>4096)return{...Le};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{...Le}}if(t.length>2048)return{...Le};if(!t.trim().startsWith("{"))return(e=>{const t=e.split("|");if(t.length<5||t.length>6)return{...Le};const[a="",r="",n,o,l,s]=t,i=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)&&i(n)&&i(o)&&i(l)?void 0!==s&&""!==s&&"R"!==s?{...Le}:{id:a,title:r,iframe:"Y"===n,closable:"Y"===o,refreshable:"Y"===l,iframeRefreshMode:"R"===s?"reload":"postMessage"}:{...Le}})(t);try{return a=JSON.parse(t),Re(a)?{id:"string"==typeof a.id?a.id:void 0,title:"string"==typeof a.title?a.title:Le.title,iframe:"boolean"==typeof a.iframe?a.iframe:Le.iframe,closable:"boolean"==typeof a.closable?a.closable:Le.closable,refreshable:"boolean"==typeof a.refreshable?a.refreshable:Le.refreshable,iframeRefreshMode:"reload"===a.iframeRefreshMode?"reload":"postMessage"}:{...Le}}catch{return{...Le}}var a},Ve="",We=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("")}`},$e=()=>qe(),Fe=Symbol("stackTabsContext"),De=Symbol("stackTabsMaximum"),He=null,Ne=!1,Ke=/* @__PURE__ */new WeakSet,ze=(e={})=>{const t={tabs:L([]),caches:q([]),components:/* @__PURE__ */new Map,cacheIdsToEvict:/* @__PURE__ */new Set,tabIdsToEvict:/* @__PURE__ */new Set,refreshKey:L(0),scrollPositionsByPageId:/* @__PURE__ */new Map,isInitialized:L(!1),iframeRefreshKeys:L({}),maxTabCount:L(0),useGlobalScroll:L(!1),sessionPrefix:L("")};return{...t,maxTabCount:L(e.maxTabCount??t.maxTabCount.value),useGlobalScroll:L(e.useGlobalScroll??t.useGlobalScroll.value),scrollContainer:q(e.scrollContainer??null),sessionPrefix:L(e.sessionPrefix??t.sessionPrefix.value),iframePath:L(e.iframePath??""),eventBus:Z()}},je=()=>{const e=(h()?v(Fe,null):null)??He;if(!e)throw new Error("VueStackTabs runtime context is not available. Render <VueStackTabs> before using vue-stack-tabs composables.");return e},Ge=/* @__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}({}),Ue=Symbol("tabEmitter"),Xe=e=>(h()?v(Ue,null):null)??e?.eventBus??je().eventBus,Ye=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}},Je=class extends Ee{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()}},Qe=e=>{const{tabs:t,caches:a,components:r,cacheIdsToEvict:n,tabIdsToEvict:o}=e,l=(e=>{const{caches:t,components:a,cacheIdsToEvict:r,tabIdsToEvict:n}=e,o=new Set(t.value);let l=t.value;const s=()=>{if(l!==t.value){l=t.value,o.clear();for(const e of l)o.add(e)}},i=e=>{r.add(e)},c=e=>{if(s(),o.has(e)){o.delete(e);const a=l.indexOf(e);a>=0&&l.splice(a,1),D(t)}};return{markCacheForEviction:i,markTabPagesForEviction:e=>{for(const t of e.pages.readonlyList())i(t.id);n.add(e.id)},markTabPagesForEvictionOnly:e=>{for(const t of e.pages.readonlyList())i(t.id)},addCache:e=>{s(),o.has(e)||(o.add(e),l.push(e),D(t))},removeCache:c,evictPageCache:e=>{e&&(r.delete(e),c(e),a.delete(e))},replacePageCaches:(e,n)=>{s();const i=new Set(e);let c=!1;if(i.size>0){for(let e=l.length-1;e>=0;e--){const t=l[e];t&&i.has(t)&&(l.splice(e,1),c=!0)}for(const e of i)o.delete(e),r.delete(e),a.delete(e)}for(const t of n)o.has(t)||(o.add(t),l.push(t),c=!0);c&&D(t)},evictMarkedCaches:()=>{if(r.size<=0)return;s();const e=new Set(r);for(let t=l.length-1;t>=0;t--){const a=l[t];a&&e.has(a)&&l.splice(t,1)}for(const t of e)o.delete(t),a.delete(t);D(t),r.clear()}}})(e),s=L([]),i=R(/* @__PURE__ */new Map),c=R(/* @__PURE__ */new Map),u=R(/* @__PURE__ */new Map),d=L(""),f=/* @__PURE__ */new Map,p=e=>t.value.find(t=>t.id===e)??null,m=e=>c.get(e)??[],b=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},v=e=>u.get(e)?.refreshVersion??0,_=e=>{i.set(e.id,(e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode,url:e.url,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),s.value.includes(e.id)||(s.value=[...s.value,e.id]),e.active&&(d.value=e.id)},y=(e,t)=>{if(!i.has(e))return;const a=c.get(e)??[];c.set(e,[...a,t.id]),u.set(t.id,t)},k=(e,t)=>{if(!i.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(i.has(e)){for(const t of m(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:b,getPageIds:m,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:v,appendPage:y,popPages:k,clearPages:T};function P(e){const t=i.get(e);if(!t)return null;let a=f.get(e);return a?(a.title=t.title,a.closable=t.closable,a.refreshable=t.refreshable,a.iframe=t.iframe,a.active=d.value===e,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:g(new Je(e,S)),pinned:t.pinned},f.set(e,a)),a}function I(){const e=[];for(const t of s.value){const a=P(t);a&&e.push(a)}t.value=e}return{...l,getTabs:()=>t.value,getTab:p,getActiveTab:()=>t.value.find(e=>e.active)??null,findTabByTopPagePath:e=>{for(const t of s.value)if(h(t)?.path===e)return f.get(t)??null;return null},hasTab:e=>i.has(e),canAddTab:()=>e.maxTabCount.value<=0||e.maxTabCount.value>0&&e.maxTabCount.value>s.value.length,getPages:b,getTopPage:h,getPageRefreshVersion:v,getPageSnapshot:e=>b(e).map(e=>Se(e)),addTab:e=>{_(e),I()},addTabs:e=>{if(0!==e.length){for(const t of e)_(t);I()}},activateTab:e=>{const t=i.has(e)?e:"";return t!==d.value&&(d.value=t,I()),p(e)},updateTabTitle:(e,t)=>{const a=i.get(e);return!!a&&(a.title===t||(a.title=t,I()),!0)},moveTab:(e,t)=>{const a=s.value,r=a.indexOf(e);if(r<0||t<0||r===t)return!1;const n=i.get(e);if(!n||n.pinned)return!1;let o=0;for(let s=0;s<a.length;s++)i.get(a[s])?.pinned&&(o=s+1);const l=Math.max(t,o);if(l>=a.length||l===r)return!1;const c=[...a],[u]=c.splice(r,1);return!!u&&(c.splice(l,0,u),s.value=c,I(),!0)},removeTab:e=>{const t=s.value,a=t.indexOf(e);if(a<0)return{status:"not-found",removed:null,nextActiveId:""};const r=i.get(e);if(!r||!r.closable)return{status:"not-closable",removed:null,nextActiveId:e};const n=P(e),p=d.value===e;n&&l.markTabPagesForEviction(n);for(const o of m(e))u.delete(o);c.delete(e),i.delete(e),f.delete(e);let b="";return t.length>1&&p&&(b=(0===a?t[1]:t[a-1])??""),p&&(d.value=""),s.value=t.filter(t=>t!==e),I(),p||(l.evictMarkedCaches(),o.clear()),{status:"removed",removed:n,nextActiveId:b}},removeTabs:e=>{const t=[],a=[];return s.value.forEach((r,n)=>{const o=i.get(r),s=P(r);if(o&&s)if(o.closable&&e(s,n)){l.markTabPagesForEviction(s);for(const e of m(r))u.delete(e);c.delete(r),i.delete(r),f.delete(r),d.value===r&&(d.value=""),t.push(s)}else a.push(r)}),s.value=a,I(),t},appendPage:y,popPages:k,replacePages:(e,t)=>{if(!i.has(e))return;for(const r of m(e))u.delete(r);const a=[];for(const r of t){const e=Se(r);u.set(e.id,e),a.push(e.id)}c.set(e,a)},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:()=>{s.value=[],i.clear(),c.clear(),u.clear(),f.clear(),d.value="",t.value=[],a.value=[],r.clear(),n.clear(),o.clear()}}},Ze=/* @__PURE__ */new WeakMap,et=e=>"undefined"!=typeof HTMLElement&&e instanceof HTMLElement,tt=e=>{if(!e)return null;if(et(e))return e;if("function"==typeof e)return tt(e());const t=e.value;return et(t)?t:null},at=e=>"number"==typeof e&&Number.isFinite(e)?e:0,rt=e=>e?{top:at(e.top),left:at(e.left)}:null,nt=e=>{if(!e)return null;if(e.getPosition)return rt(e.getPosition());const t=e.scrollElement;return t?{top:t.scrollTop,left:t.scrollLeft}:null},ot="__stack-tab-main-scroller__",lt=e=>!e||0===e.top&&0===e.left,st=e=>e.startsWith("#")?document.getElementById(e.slice(1)):document.querySelector(e),it="__stack-tab-auto-scroll__:",ct=/* @__PURE__ */new Map,ut=e=>{const t=document.getElementById(`W-${e}`);if(!t)return ct.delete(e),null;let a=ct.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),ct.set(e,a)),a},dt=(e,t)=>{const a=Number(t.slice(26));return Number.isInteger(a)?ut(e)?.elements[a]??null:null},ft=e=>{const{scrollPositionsByPageId:t}=e,a=/* @__PURE__ */new Map,r=e=>a.get(e)?.()??null;return{restoreScroller:e=>{const a=t.get(e);if(!a)return;for(const[t,r]of a){if(t===ot)continue;const a=t.startsWith(it)?dt(e,t):st(t);a&&(a.scrollTop=r.top,a.scrollLeft=r.left)}const n=a.get(ot);if(!n)return;const o=r(e);if(o&&((e,t)=>{if(!e)return!1;if(e.setPosition)return e.setPosition(t),!0;const a=e.scrollElement;return!!a&&(a.scrollTop=t.top,a.scrollLeft=t.left,!0)})(o,n))return;const l=document.getElementById(`W-${e}`);l&&(l.scrollTop=n.top,l.scrollLeft=n.left)},saveScroller:e=>{const n=t.get(e);if(n){if(a.has(e)){n.delete(`#W-${e}`);const t=nt(r(e)),a=n.get(ot);!t||lt(t)&&!lt(a)||n.set(ot,t)}for(const e of n.keys())e.startsWith(it)&&n.delete(e);(ut(e)?.elements??[]).forEach((e,t)=>{n.set((e=>`${it}${e}`)(t),{top:e.scrollTop,left:e.scrollLeft})});for(const e of n.keys()){if(e.startsWith(it)||e===ot)continue;const t=st(e),a={top:t?.scrollTop??0,left:t?.scrollLeft??0},r=n.get(e);!t||lt(a)&&!lt(r)?r&&n.set(e,r):n.set(e,a)}}},recordMainScroller:e=>{const n=t.get(e);if(!n)return;if(a.has(e)){const t=nt(r(e));return void(t&&n.set(ot,t))}const o="undefined"!=typeof document?document.getElementById(`W-${e}`):null;o&&n.set(`#W-${e}`,{top:o.scrollTop,left:o.scrollLeft})},removeScroller:e=>{const r=t.get(e);r&&(r.clear(),t.delete(e)),a.delete(e);const n=ct.get(e);n&&(n.observer?.disconnect(),ct.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})},setPageScrollAdapter:(e,r)=>{if(!r)return void a.delete(e);a.set(e,r),t.has(e)||t.set(e,/* @__PURE__ */new Map);const n=t.get(e);n.has(ot)||n.set(ot,{top:0,left:0})}}},pt=e=>{const t=()=>e.sessionPrefix.value+"stacktab-active-tab";let a=null,r=0,n=!1,o=null;const l=(e,t)=>{if("undefined"==typeof window)return!1;try{return window.sessionStorage.setItem(e,t),!0}catch(a){return!1}},s=()=>{n=!1;const e=a;if(a=null,!e||e.version!==r)return;const s=JSON.stringify(e.tab);s!==o&&l(t(),s)&&(o=s)},i=()=>{r++,a=null},c=()=>{i(),(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(s)))},clearSession:c,restoreActiveTabSession:e=>{null!==e?(i(),l(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 Ee(t):t);return Re(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 Ee?a:(c(),null)}catch{return c(),null}var t}}},mt=e=>{const{getTabs:t,getTopPage:a,updatePage:r,updatePages:n,iframeRefreshKeys:o,createPageId:l,addCache:s,evictPageCache:i,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=l(),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);i(u),s(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=[],l={...o.value};let s=!1;for(const n of t())n.refreshable&&(n.iframe?"reload"===n.iframeRefreshMode?(l[n.id]=(l[n.id]??0)+1,s=!0):u(n.id):d(n,e,a,r));s&&(o.value=l),n(r),c(e,a)}}},bt=["aria-label"],ht=/*@__PURE__*/p({__name:"PageLoading",props:{tabId:{}},setup(e){const a=L(0),r=e,{t:n}=t(),o=Xe(),l=L(!1);K(l,e=>{e&&(fe(".stack-tab__cache-page-wrapper *"),a.value=pe(".stack-tab__cache-page-wrapper *"))});const s=e=>{e.tId===r.tabId&&(l.value=e.value)};return o.on(Ge.PAGE_LOADING,s),x(()=>{o.off(Ge.PAGE_LOADING,s)}),(e,t)=>l.value?(M(),u("div",{key:0,class:"stack-tab-loading__mask",role:"status","aria-live":"polite","aria-label":H(n)("VueStackTab.loading"),style:T({zIndex:a.value})},[...t[0]||(t[0]=[d("div",{class:"stack-tab-loading__spin","aria-hidden":"true"},null,-1)])],12,bt)):c("",!0)}}),vt=Symbol("tabPageContext"),gt=()=>{if(h()){const e=v(vt,null);if(e)return e}const e=m();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},_t="stack-tab__shadow-inset-top",yt="stack-tab__shadow-inset-bottom",kt="stack-tab__shadow-inset-vertical",Tt=e=>"function"==typeof e?e():e.value,wt=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,l=null,s=null,i=null;const c=e=>{e&&e.classList.remove(_t,yt,kt)},u=()=>{if(!n&&!e.getMetrics)return;const t=e.classTarget?Tt(e.classTarget):n;if(s&&s!==t&&(c(s),s=null),s=t,!s)return;const r=e.getMetrics?.()??(n?{scrollTop:n.scrollTop,scrollHeight:n.scrollHeight,clientHeight:n.clientHeight}:null);if(!r)return;const{scrollTop:o,scrollHeight:l,clientHeight:i}=r,u=o>a,d=l-i-o>a;s.classList.toggle(kt,u&&d),s.classList.toggle(_t,u&&!d),s.classList.toggle(yt,!u&&d)},d=()=>{null===r&&(r=requestAnimationFrame(()=>{r=null,u()}))},f=()=>{n&&n.removeEventListener("scroll",d),l&&(l(),l=null),o=null,i?.disconnect(),i=null},p=(a=!1)=>{const r=Tt(e.target),u=e.onScroll??null;if(r||u||e.getMetrics)if(a||r!==n||u!==o){if(f(),c(s),s=null,n=r,u){o=u;const e=u(d);l="function"==typeof e?e:null}else r&&r.addEventListener("scroll",d,{passive:!0});t&&r&&"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>d()),i.observe(r)),d()}else d()},m=()=>{null!==r&&(cancelAnimationFrame(r),r=null)},b=()=>{f(),n=null,c(s),s=null,m()};return queueMicrotask(p),A(b),{sync:(t=!1)=>{const a=Tt(e.target),r=e.onScroll??null;a||r||e.getMetrics?t||a!==n||r!==o?p(t):d():b()},clear:()=>{c(s),s=null,m()}}},St=e=>e.split(",").map(e=>Number.parseFloat(e.trim())||0),Pt=e=>{if("undefined"==typeof window)return 0;const t=window.getComputedStyle(e),a=St(t.transitionDuration||"0s"),r=St(t.transitionDelay||"0s");return 0===a.length?0:1e3*Math.max(...a.map((e,t)=>e+(r[t%r.length]??0)))},It=()=>new Promise(e=>{"function"==typeof requestAnimationFrame?requestAnimationFrame(()=>e()):setTimeout(e,16)}),Ct=e=>{const{runtimeContext:t,consumeBackParams:a,getComponent:r,setComponent:n,addCache:o,evictMarkedCaches:s,clearTabEvictionMarks:i,addPageScroller:c,setPageScrollAdapter:u,saveScroller:d,recordMainScroller:m,restoreScroller:h,removeScroller:v}=e;return{resolvePageComponent:e=>{const{cacheName:g,tabInfo:_}=e,k=r(g);if(k)return o(g),k;const T=/* @__PURE__ */p({name:`${g}-shell`,props:{vnode:{type:Object,required:!1,default:null}},setup:e=>()=>e.vnode}),S=/* @__PURE__ */p({name:g,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){E(vt,{tabId:_.id,pageId:g});const n=L(null),o=q(null),p=q(null),k=q(null),S=L(null),A=L(null),M=q(null),R=L(e.refreshVersion??0),O=()=>Boolean(t.scrollContainer.value),B=()=>O()?M.value:S.value?{scrollElement:S.value}:null,V=()=>{M.value=O()?(e=>{if(null==e)return null;if(et(e))return{scrollElement:e};const t=e,a=tt(t.scrollElement),r="function"==typeof t.getPosition?()=>rt(t.getPosition.call(e)):void 0,n="function"==typeof t.setPosition?a=>{t.setPosition.call(e,a)}:void 0,o="function"==typeof t.getMetrics?()=>{const a=t.getMetrics.call(e);return a?{scrollTop:at(a.scrollTop),scrollHeight:at(a.scrollHeight),clientHeight:at(a.clientHeight)}:null}:void 0,l="function"==typeof t.onScroll?a=>{const r=t.onScroll.call(e,a);return"function"==typeof r?r:()=>{}}:void 0;return a||r||n||o||l?{scrollElement:a,getPosition:r,setPosition:n,getMetrics:o,onScroll:l}:null})(A.value):null},W=wt({target:()=>B()?.scrollElement??null,classTarget:()=>S.value?.parentElement??null,getMetrics:()=>(e=>{if(!e)return null;const t=e.getMetrics?.();if(t)return{scrollTop:at(t.scrollTop),scrollHeight:at(t.scrollHeight),clientHeight:at(t.clientHeight)};const a=e.scrollElement;return a?{scrollTop:a.scrollTop,scrollHeight:a.scrollHeight,clientHeight:a.clientHeight}:null})(B()),onScroll:e=>{const t=B(),a=()=>{m(g),e()};if(t?.onScroll)return t.onScroll(a);const r=t?.scrollElement;return r?(r.addEventListener("scroll",a,{passive:!0}),()=>r.removeEventListener("scroll",a)):()=>{}}}),$=()=>{O()?u(g,()=>M.value):(c(g,`#W-${g}`),u(g,null))};let F=!1,D=!1,H=null,N=null,z=null,j="";const G=()=>{null!==N&&(clearTimeout(N),N=null)},U=()=>{const e=S.value,t=j;e&&t&&(e.classList.remove(`${t}-leave-active`,`${t}-leave-to`,`${t}-enter-active`,`${t}-enter-from`),j="")},X=e=>new Promise(t=>{const a=S.value;if(!a||e<=0)return void t();let r=!1;const n=()=>{r||(r=!0,z=null,G(),a.removeEventListener("transitionend",o),t())},o=e=>{e.target===a&&n()};z=n,a.addEventListener("transitionend",o),N=setTimeout(n,e+80)}),Y=async t=>{const a=S.value,r=e.transitionName;if(!a||!r||"undefined"!=typeof window&&"function"==typeof window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches)return void(R.value=t);j=r,a.classList.add(`${r}-leave-active`);const n=Pt(a);if(n<=0)return U(),void(R.value=t);if(await It(),F)return void U();if(a.classList.add(`${r}-leave-to`),await X(n),U(),F)return;if(R.value=t,await y(),F)return;j=r,a.classList.add(`${r}-enter-from`),a.offsetWidth,a.classList.add(`${r}-enter-active`);const o=Pt(a);o<=0||(await It(),F||(a.classList.remove(`${r}-enter-from`),await X(o))),U()};K(()=>e.refreshVersion??0,e=>{e===R.value&&null===H||(H=e,(async()=>{if(!D){D=!0;try{for(;!F&&null!==H;){const e=H;H=null,e!==R.value&&await Y(e)}}finally{D=!1}}})())});const J=()=>{n.value=a(_.id,g)};return C(()=>{r.emit("onLoaded"),$(),V(),W.sync(!0),J(),y(()=>{if(F)return;const e=Boolean(M.value);V(),!e&&M.value&&h(g),W.sync(!0)})}),I(()=>{W.clear(),d(g)}),w(()=>{r.emit("onLoaded"),V(),h(g),W.sync(!0),s(),i(),J()}),P(()=>{F=!0,H=null,z?.(),G(),U()}),x(()=>v(g)),K(()=>t.scrollContainer.value,()=>{d(g),y(()=>{F||($(),V(),h(g),W.sync(!0))})}),()=>{const a=e.vnode,r=n.value;a===o.value&&r===k.value||(p.value=a?l(a,r?{_back:r}:null):null,o.value=a,k.value=r);const s=t.scrollContainer.value,i=p.value?f(T,{key:`${g}-${R.value}`,vnode:p.value},null):null;return f("div",{ref:S,class:"stack-tab__cache-page-wrapper",id:`W-${g}`,style:[!s&&t.useGlobalScroll.value?"overflow:auto":"overflow:hidden","height: 100%"]},[s?b(s,{ref:A},{default:()=>i}):i,f(ht,{tabId:_.id},null)])}}});return n(g,S),o(g),S}}},At=/* @__PURE__ */p({name:"StackTabEmptyPlaceholder",setup:()=>()=>null}),xt=()=>At,Mt=e=>{const t=e.matched[e.matched.length-1]?.path??e.path,a=e.path.endsWith("/")?e.path.slice(0,-1):e.path;return t===a?a:e.path},Et=e=>{const a=J(),r=Xe(e),{t:n}=t(),{tabs:o,caches:l,refreshKey:i,iframeRefreshKeys:c,isInitialized:u}=e,{getTabs:d,getTab:f,getActiveTab:p,findTabByTopPagePath:m,hasTab:b,canAddTab:h,getPages:v,getTopPage:g,getPageRefreshVersion:_,getPageSnapshot:y,addTab:k,addTabs:T,activateTab:w,updateTabTitle:S,moveTab:P,removeTab:I,removeTabs:C,appendPage:A,popPages:x,replacePages:M,clearPages:E,updatePage:R,updatePages:O,consumeBackParams:B,markCacheForEviction:V,markTabPagesForEvictionOnly:W,addCache:q,removeCache:$,evictMarkedCaches:F,evictPageCache:D,replacePageCaches:H,isTabMarkedForEviction:N,isCacheMarkedForEviction:K,unmarkCacheForEviction:z,clearTabEvictionMarks:j,getComponent:G,setComponent:U,deleteComponent:Y,snapshotComponents:Z,restoreComponents:ee,snapshotCaches:te,restoreCaches:ae,reset:re}=(e=>{const t=Ze.get(e);if(t)return t;const a=Qe(e);return Ze.set(e,a),a})(e),{restoreScroller:ne,saveScroller:oe,recordMainScroller:le,removeScroller:se,addPageScroller:ie,setPageScrollAdapter:ce}=ft(e),{saveActiveTabToSession:ue,clearSession:de,restoreTabFromSession:fe,restoreActiveTabSession:pe,getSessionKey:me}=pt(e),{resolvePageComponent:be}=Ct({runtimeContext:e,consumeBackParams:B,getComponent:G,setComponent:U,addCache:q,evictMarkedCaches:F,clearTabEvictionMarks:j,addPageScroller:ie,setPageScrollAdapter:ce,saveScroller:oe,recordMainScroller:le,restoreScroller:ne,removeScroller:se}),he=e=>({id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode}),ve=()=>d().find(e=>e.pinned)??null,Se=()=>{const e=ve(),t=e?g(e.id):null;if(!e||!t)return!1;const r={...we(t.query),__tab:Oe(he(e))};return Promise.resolve(a.replace({path:t.path,query:r,hash:""})).catch(e=>{}),!0},Pe=e=>{const t=e.query.__tab,a="string"==typeof t;if(a){const e=(e=>{if(e===Ve&&We)return{...We};const t=Be(e);return Ve=e,We=t,{...t}})(t);if(e.id)return e}const r=Mt(e),o=p(),l=o?g(o.id):null;if(o&&l?.path===r)return he(o);const s=m(r);return s?he(s):!a&&ve()?null:{id:qe(),title:n("VueStackTab.undefined"),closable:!0,refreshable:!0,iframe:!1}},Ie=e=>{const t=Pe(e);if(null===t)return Se(),{empty:!0};const n=t;if(N(n.id))return{empty:!0};const o=Mt(e),l=((e,t)=>({...we(e.query),__tab:e.query.__tab??Oe(t)}))(e,n),s=e=>e.path===o&&Ce(l,e.query||{});let i,c=n.id?f(n.id):null,u=null;const d=c?g(c.id):null;if(c&&d)if(s(d))i=d.id;else if(d.path===o)i=$e(),u={id:i,tabId:n.id,path:o,query:we(l)};else{const e=v(c.id);let t=-1;for(let a=e.length-2;a>=0;a--){const r=e[a];if(r&&s(r)){t=a;break}}if(-1!==t){const a=e.length-1-t,r=x(c.id,a);for(const e of r)V(e.id);const s=g(c.id);i=s?s.id:$e(),s||(u={id:i,tabId:n.id,path:o,query:we(l)})}else i=$e(),u={id:i,tabId:n.id,path:o,query:we(l)}}else i=$e(),u={id:i,tabId:n.id,path:o,query:we(l)};if(K(i)){z(i);const e=G(i);if(e)return{recovered:e,cacheName:i}}return u?c=((e,t,a,n)=>{let o=e.id?f(e.id):null;if(null===o){const a=new Ee;a.push(n);const l=t.query.__src;o={id:e.id,title:e.title,closable:e.closable,refreshable:e.refreshable,iframe:e.iframe,iframeRefreshMode:e.iframeRefreshMode??"postMessage",url:_e(l),active:!0,pages:a},w(""),k(o),r.emit(Ge.TAB_ACTIVE,{id:e.id,isRoute:!1})}else{w(o.id);const e=g(o.id);e&&e.id===n.id||A(o.id,n)}return o})(n,e,0,u):w(c.id),"string"!=typeof e.query.__tab&&a.replace({path:e.path,query:{...we(e.query),__tab:Oe(n)},hash:e.hash}).catch(e=>{}),ue(c),{cacheName:i,tabInfo:n,targetTab:c}},xe=L(""),Me=s(()=>{const e=p();return e?g(e.id)?.refreshVersion??0:0});let Re="",Le=null;const Fe=e=>C(e),De=()=>{if(Fe(()=>!0),p())return F(),void j();const e=d().at(-1);e&&r.emit(Ge.TAB_ACTIVE,{id:e.id})},{refreshTab:He,refreshAllTabs:Ne}=mt({getTabs:d,getTopPage:g,updatePage:R,updatePages:O,iframeRefreshKeys:c,createPageId:$e,addCache:q,evictPageCache:D,replacePageCaches:H,refreshIframeByPostMessage:e=>r.emit(Ge.REFRESH_IFRAME_POSTMESSAGE,e)});return{tabs:o,caches:l,refreshKey:i,activeCacheKey:xe,activePageRefreshVersion:Me,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=Q(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),l=ke(r.path),s=$e(),i=Te(o?e.iframePath.value:l.path),c=o?r.iframeRefreshMode??(ye(r.path)?"reload":"postMessage"):"postMessage";r.iframeRefreshMode=c;const u=Ae(o?r.query:l.query);o&&(u.__src=encodeURIComponent(r.path));const d={id:s,tabId:n,path:i,query:Q(u,{__tab:Oe(r)})},f=new Ee;f.push(d);const p={id:n,title:r.title??"",closable:r.closable,refreshable:r.refreshable,iframe:o,iframeRefreshMode:c,url:o?ge(r.path):void 0,active:!1,pages:f,pinned:a.pinned};return q(s),p};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 l="undefined"!=typeof window?sessionStorage.getItem(me()):null,s=fe(l);if(s&&!b(s.id))if(s.url&&(s.url=ge(s.url)),s.iframe&&s.url&&void 0===s.iframeRefreshMode&&(s.iframeRefreshMode=ye(s.url)?"reload":"postMessage"),s.pages&&"function"==typeof s.pages.list){k(s);for(const e of v(s.id))e&&e.id&&q(e.id)}else k(s);u.value=!0},size:()=>d().length,active:(e,t=!0)=>{r.emit(Ge.FORWARD);const n=f(e);if(!n)return Promise.resolve();if(n.active)return r.emit(Ge.TAB_SCROLL_TO,{id:e}),Promise.resolve();const o=g(e),l=()=>{const t=w(e);t&&ue(t)};if(!t)return l(),Promise.resolve();if(!o)return l(),Promise.resolve();const s=we(o.query);return"string"==typeof s.__tab&&s.__tab||(s.__tab=Oe(he(n))),Ye({apply:()=>{const e=p()?.id,t="undefined"!=typeof window?window.sessionStorage.getItem(me()):null;return l(),{prevActiveId:e,sessionSnapshot:t}},navigate:()=>a.push({path:o.path,query:s}),rollback:e=>{w(e.prevActiveId??""),pe(e.sessionSnapshot)},isFailureResult:X,rejectFailureResult:!0})},updateTabTitle:(e,t)=>{if(!S(e,t))return!1;const r=f(e);if(!r)return!1;if(r.active){ue(r);const t=g(e);t&&Promise.resolve(a.replace({path:t.path,query:{...we(t.query),__tab:Oe(he(r))},hash:a.currentRoute.value.hash})).catch(e=>{})}return!0},getCacheName:()=>$e(),destroy:()=>{re(),c.value={},e.scrollPositionsByPageId.clear(),e.isInitialized.value=!1,e.refreshKey.value=0,de()},reset:()=>De(),addCache:q,removeCache:$,getTab:f,getActiveTab:p,getTopPage:g,getPages:v,getPageRefreshVersion:_,getPageSnapshot:y,moveTab:P,addTab:k,appendPage:A,popPages:x,replacePages:M,clearPages:E,updatePage:R,updatePages:O,removeTab:e=>{const t=I(e);return"not-found"===t.status?"":"not-closable"===t.status?e:(t.nextActiveId&&r.emit(Ge.TAB_ACTIVE,{id:t.nextActiveId}),t.nextActiveId)},removeAllTabs:De,removeLeftTabs:e=>{const t=d().findIndex(t=>t?.id===e);if(t<=0)return;if(Fe((e,a)=>a<t),p())return F(),void j();const a=d()[0];a&&r.emit(Ge.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(Fe((e,t)=>t>a),p())return F(),void j();const n=d().at(-1);n&&r.emit(Ge.TAB_ACTIVE,{id:n.id})},removeOtherTabs:e=>{const t=f(e);Fe(t=>t.id!==e),t&&!t.active?r.emit(Ge.TAB_ACTIVE,{id:e}):(F(),j())},hasTab:b,renewTab:e=>{const t=f(e.id);if(!t)return;const a=y(t.id),r=te(),n=Z();return W(t),F(),E(t.id),()=>{M(t.id,a),ae(r),ee(n)}},addPage:(e,t)=>{if(!t)return(e=>{if("string"==typeof e.query.__tab)return!1;const t=Mt(e),a=p();if(a&&g(a.id)?.path===t)return!1;if(m(t))return!1;const r=ve();return Boolean(r&&g(r.id))})(e)&&Se(),xt();const a=`${e.fullPath}::${i.value}`;if(a===Re&&Le)return Le;const r=Ie(e);if("empty"in r)return xt();if("recovered"in r)return q(r.cacheName),xe.value=r.cacheName,Re=a,Le=r.recovered,r.recovered;xe.value=r.cacheName;const n=be(r);return Re=a,Le=n,n},addComponent:U,getComponent:G,removeComponent:Y,markCacheForEviction:V,evictMarkedCaches:F,evictPageCache:D,clearTabEvictionMarks:j,refreshTab:He,refreshAllTabs:Ne,iframeRefreshKeys:c,addPageScroller:ie,setGlobalScroll:t=>{e.useGlobalScroll.value=t},setScrollContainer:t=>{e.scrollContainer.value=t??null},clearSession:de,setSessionPrefix:t=>{e.sessionPrefix.value=t}}},Rt=/* @__PURE__ */new WeakMap,Lt=e=>{const t=e??je(),a=Rt.get(t);if(a)return a;const r=Et(t);return Rt.set(t,r),r};function Ot(e){const t=J(),a=e??je(),{active:r,updateTabTitle:n,hasTab:o,refreshKey:l,reset:s,canAddTab:i,renewTab:c,getTab:u,getTopPage:d,tabs:f,moveTab:p,removeTab:m,removeAllTabs:b,refreshTab:h,refreshAllTabs:v}=Lt(a),g=(e,r,n=!1)=>{const o=Oe(r),l=Ae(e.query);let s,i,c=Q(l,{__tab:o});if(e.iframe)c={...c,__src:encodeURIComponent(e.path),__tab:o},s=a.iframePath.value;else{const t=ke(e.path);s=t.path,i=t.hash||void 0,c=Q(Ae(t.query),c,{__tab:o}),c={...c,__tab:o}}return ve(e.path)?Ye({apply:()=>{},navigate:()=>t.push({path:s,query:c,hash:i}),rollback:()=>{},isFailureResult:e=>X(e)&&!(n&&X(e,U.duplicated)),rejectFailureResult:!0}):Promise.reject(/* @__PURE__ */new Error("Invalid tab URL"))};return{openTab:(e,t=!1)=>new Promise((a,n)=>{const s=(e=>{const t={refreshable:!0,closable:!0,iframe:!1};e.iframe&&void 0===e.iframeRefreshMode?t.iframeRefreshMode=ye(e.path??"")?"reload":"postMessage":e.iframe&&(t.iframeRefreshMode=e.iframeRefreshMode??"postMessage");const a=Q(e,t);return a.id||(a.id=qe()),a})(e),d=Boolean(s.id&&o(s.id));if(d&&!t)return void Promise.resolve(r(s.id)).then(()=>a(s.id),n);let f,p;if(s.id&&t&&d){const t=u(s.id);f=c(e),t?.active&&(p=l.value,l.value++)}d||i()?g(e,s,d&&t).then(()=>a(s.id),e=>{f?.(),void 0!==p&&(l.value=p),n(e)}):n(/* @__PURE__ */new Error("Max Size"))}),closeTab:m,closeAllTabs:b,refreshTab:h,refreshAllTabs:v,activeTab:r,moveTab:p,updateTabTitle:n,reset:s,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&&ve(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")}}}var Bt=["disabled"],Vt=(e,t)=>{const a=e.__vccOpts||e;for(const[r,n]of t)a[r]=n;return a},Wt=/*#__PURE__*/Vt(/*@__PURE__*/p({__name:"ContextMenuItem",props:{icon:{default:""},title:{},disabled:{type:Boolean,default:!1}},setup:e=>(t,a)=>(M(),u("button",{type:"button",role:"menuitem",class:"stack-tab__context-menu-item",disabled:e.disabled},[d("span",{class:k(["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]=G(()=>{},["prevent"]))},$(e.title),33)],8,Bt))}),[["__scopeId","data-v-fd76fc18"]]),qt={key:1,class:"divider div-transparent",role:"separator","aria-orientation":"horizontal"},$t=/*#__PURE__*/Vt(/*@__PURE__*/p({__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:l}=t(),s=L(),d=R({left:n.left,top:n.top}),{closeTab:p,closeAllTabs:m,refreshTab:b,refreshAllTabs:h,openInNewWindow:v}=Ot(),{removeLeftTabs:g,removeRightTabs:_,removeOtherTabs:k}=Lt(),w=L(0),S=()=>{n.restoreFocusElement&&document.contains(n.restoreFocusElement)?n.restoreFocusElement.focus():document.querySelector('[role="tab"][aria-selected="true"]')?.focus()},P=()=>{o("close"),y(S)},I=e=>{e?.(),P()},A=()=>{const e=s.value;return e?Array.from(e.querySelectorAll('[role="menuitem"]')).filter(e=>!e.disabled):[]},x=e=>{const t=A();t.length<=0||t[(e+t.length)%t.length]?.focus()},E=()=>A().findIndex(e=>e===document.activeElement),B=e=>{if("Escape"===e.key)return e.preventDefault(),void P();if("ArrowDown"===e.key){e.preventDefault();const t=E();return void x(-1===t?0:t+1)}if("ArrowUp"===e.key){e.preventDefault();const t=E();return void x(-1===t?-1:t-1)}if("Home"===e.key)return e.preventDefault(),void x(0);"End"===e.key&&(e.preventDefault(),x(A().length-1))},V=e=>e.key??`${e.title}-${e.icon??""}`;return C(()=>{fe(".stack-tab,.stack-tab *"),w.value=pe(".stack-tab,.stack-tab *");const e=s.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)),x(0)}),(t,r)=>(M(),u("div",{ref_key:"menuElementRef",ref:s,class:"stack-tab__context-menu",role:"menu",tabindex:"-1",style:T({left:`${d.left}px`,top:`${d.top}px`,"z-index":w.value}),onKeydown:B},[f(Wt,{icon:"stack-tab__icon stack-tab__icon--reload stack-tab__icon--mask",title:H(l)("VueStackTab.reload"),disabled:!e.tabItem.refreshable,onClick:r[0]||(r[0]=t=>I(()=>H(b)(e.tabItem.id)))},null,8,["title","disabled"]),f(Wt,{icon:"stack-tab__icon stack-tab__icon--reload-all stack-tab__icon--mask",title:H(l)("VueStackTab.reloadAll"),onClick:r[1]||(r[1]=e=>I(H(h)))},null,8,["title"]),f(Wt,{icon:"stack-tab__icon stack-tab__icon--close stack-tab__icon--mask",title:H(l)("VueStackTab.close"),disabled:!e.tabItem.closable,onClick:r[2]||(r[2]=t=>I(()=>H(p)(e.tabItem.id)))},null,8,["title","disabled"]),f(Wt,{icon:"stack-tab__icon stack-tab__icon--close-lefts stack-tab__icon--mask",title:H(l)("VueStackTab.closeLeft"),disabled:e.index<=0,onClick:r[3]||(r[3]=t=>I(()=>H(g)(e.tabItem.id)))},null,8,["title","disabled"]),f(Wt,{icon:"stack-tab__icon stack-tab__icon--close-rights stack-tab__icon--mask",title:H(l)("VueStackTab.closeRight"),disabled:e.index>=e.max-1,onClick:r[4]||(r[4]=t=>I(()=>H(_)(e.tabItem.id)))},null,8,["title","disabled"]),f(Wt,{icon:"stack-tab__icon stack-tab__icon--close-others stack-tab__icon--mask",title:H(l)("VueStackTab.closeOthers"),onClick:r[5]||(r[5]=t=>I(()=>H(k)(e.tabItem.id)))},null,8,["title"]),f(Wt,{icon:"stack-tab__icon stack-tab__icon--close-all stack-tab__icon--mask",title:H(l)("VueStackTab.closeAll"),onClick:r[6]||(r[6]=e=>I(H(m)))},null,8,["title"]),e.tabItem.iframe&&e.tabItem.url?(M(),i(Wt,{key:0,icon:"stack-tab__icon stack-tab__icon--open stack-tab__icon--mask",title:H(l)("VueStackTab.openInNewWindow"),onClick:r[7]||(r[7]=t=>I(()=>H(v)(e.tabItem.id)))},null,8,["title"])):c("",!0),void 0!==e.contextMenu&&e.contextMenu.length>0?(M(),u("div",qt)):c("",!0),(M(!0),u(a,null,O(e.contextMenu,t=>(M(),i(Wt,{key:V(t),"data-menu-key":V(t),icon:t.icon,title:t.title,disabled:t.disabled(e.tabItem),onClick:a=>I(()=>!t.disabled(e.tabItem)&&t.callback(e.tabItem.id))},null,8,["data-menu-key","icon","title","disabled","onClick"]))),128))],36))}}),[["__scopeId","data-v-73711048"]]),Ft=e=>`stack-tab-tab-${encodeURIComponent(e)}`,Dt=e=>`stack-tab-panel-${encodeURIComponent(e)}`,Ht=["draggable"],Nt=["id","data-tab-id","aria-controls","aria-selected","tabindex","title"],Kt={class:"stack-tab__item-title"},zt={class:"stack-tab__item-title-content"},jt=["title","aria-label","tabindex"],Gt=/*@__PURE__*/p({__name:"TabHeaderItem",props:{item:{},dropPosition:{}},emits:["close","active","contextmenu","dragstart","dragover","drop","dragend"],setup(e,{emit:a}){const r=a,n=Xe(),{t:o}=t(),l=L(),i=L(!1),f=e,p=e=>{f.item.id===e.id&&g(e.isRoute??!0)};n.on(Ge.TAB_ACTIVE,p),x(()=>{n.off(Ge.TAB_ACTIVE,p)});const m=s(()=>f.item.title||o("VueStackTab.undefined")),b=()=>{r("close",f.item)},h=e=>{f.item.pinned?e.preventDefault():(i.value=!0,e.dataTransfer?.setData("text/plain",f.item.id),e.dataTransfer&&(e.dataTransfer.effectAllowed="move"),r("dragstart",f.item,e))},v=e=>{i.value=!1,r("dragend",f.item,e)},g=(e=!0)=>{r("active",f.item,l.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(),b())};return(t,a)=>(M(),u("li",{ref_key:"tabElementRef",ref:l,role:"presentation",class:k(["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":i.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]=G(e=>g(!0),["self"])),onContextmenu:a[2]||(a[2]=e=>t.$emit("contextmenu",e)),onDragstart:h,onDragend:v,onDragover:a[3]||(a[3]=G(a=>t.$emit("dragover",e.item,a),["prevent"])),onDrop:a[4]||(a[4]=G(a=>t.$emit("drop",e.item,a),["prevent"]))},[d("button",{id:H(Ft)(e.item.id),type:"button",role:"tab",class:"stack-tab__item-tab","data-tab-id":e.item.id,"aria-controls":H(Dt)(e.item.id),"aria-selected":e.item.active?"true":"false",tabindex:e.item.active?0:-1,title:m.value,onClick:a[0]||(a[0]=e=>g(!0)),onKeydown:_},[d("span",Kt,[d("span",zt,$(m.value),1)])],40,Nt),e.item.closable?(M(),u("button",{key:0,type:"button",class:"stack-tab__icon stack-tab__icon--close-fill stack-tab__item-button",title:H(o)("VueStackTab.close"),"aria-label":`${H(o)("VueStackTab.close")} ${m.value}`,tabindex:e.item.active?0:-1,onClick:G(b,["stop"])},null,8,jt)):c("",!0)],42,Ht))}}),Ut=["disabled","title","aria-label"],Xt={key:1,class:"stack-tab__button"},Yt=/*@__PURE__*/p({__name:"TabHeaderButton",props:{disabled:{type:Boolean,default:!1},shadow:{default:null},iconClass:{default:""},title:{default:""},ariaLabel:{default:""}},setup(e){const t=e,a=s(()=>t.ariaLabel||t.title);return(t,r)=>(M(),u("button",{type:"button",class:k(["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):(M(),u("span",{key:0,class:k(["stack-tab__mask-button",e.iconClass])},null,2)),"icon"in t.$slots?(M(),u("span",Xt,[B(t.$slots,"icon")])):c("",!0)],10,Ut))}}),Jt=/*@__PURE__*/p({__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=L(null),l=L(null),s=L(null),f=L(!1),p=L(!1),m=L(!1),b=L(!1),h=L(!1),v=L(),g=e,_={clientWidth:0,scrollWidth:0,scrollLeft:0},y={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},I=e=>{const{clientWidth:t,scrollWidth:a}=_,r=a-t;return r<=0?0:(t-P())*(e/r)},A=()=>{const e=o.value;e&&(_.clientWidth=e.clientWidth,_.scrollWidth=e.scrollWidth,_.scrollLeft=e.scrollLeft,h.value=_.scrollWidth>_.clientWidth,b.value=g.isScrollButton&&h.value,p.value=_.scrollLeft<=10,m.value=_.clientWidth+_.scrollLeft-_.scrollWidth>=-10,(e=>{const t=s.value;t&&h.value&&(t.style.width=`${P()}px`,t.style.transform=`translateX(${I(e)}px)`)})(_.scrollLeft))},E=()=>{const e=o.value?.querySelector(".stack-tab__item--active");e&&!Y(e)&&X(e)};let R=null,O=null,V=0;const W=(e,t=!0)=>{ue({wrap:o.value,left:e,top:0,smooth:t})},q=e=>{W(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;W(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(y.startThumbLeft+w-y.startPageX,0),r);ue({wrap:o.value,left:n*a/r,top:0,smooth:!1}),s.value&&(s.value.style.transform=`translateX(${n}px)`)},D=e=>{const t=s.value,a="mouse"!==e.pointerType||0===e.button;if(!t||!a)return;const r=o.value?.scrollLeft??0;y.startPageX=e.pageX,y.startThumbLeft=I(r),w=e.pageX,f.value=!0,S=e.pointerId,t.setPointerCapture?.(e.pointerId)},z=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=s.value;t&&null!==e&&t.hasPointerCapture?.(e)&&t.releasePointerCapture(e)};C(()=>{if("undefined"!=typeof ResizeObserver){R=new ResizeObserver(()=>{A(),E()}),O=new ResizeObserver(()=>{const e=o.value?.querySelectorAll(".stack-tab__item").length??0,t=e!==V;V=e,h.value&&t&&E(),A()}),v.value&&R.observe(v.value);const e=o.value?.querySelector(".stack-tab__nav");V=o.value?.querySelectorAll(".stack-tab__item").length??0,e&&O.observe(e)}A()}),x(()=>{U(),R?.disconnect(),O?.disconnect(),R=null,O=null}),K(()=>g.isScrollButton,()=>{b.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 l,s;s="center"===a?o+(e.clientHeight-n.clientHeight)/2:o,l="center"===r?t+(e.clientWidth-n.clientWidth)/2:t,ue({wrap:n,left:l,top:s})}}({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)=>(M(),u(a,null,[b.value?(M(),i(Yt,{key:0,"icon-class":"stack-tab__icon stack-tab__icon--left-arrow",disabled:p.value,title:H(n)("VueStackTab.scrollLeft"),"aria-label":H(n)("VueStackTab.scrollLeft"),onClick:r[0]||(r[0]=t=>!p.value&&q(-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:k(["stack-tab__scroll-container",{"stack-tab__shadow-inset-left":!p.value&&m.value,"stack-tab__shadow-inset-right":!m.value&&p.value,"stack-tab__shadow-inset-all":!p.value&&!m.value}]),onScrollPassive:A},[B(t.$slots,"default")],34),j(d("div",{ref_key:"bar",ref:l,class:k(["stack-tab__scrollbar",{"stack-tab__scrollbar--dragging":f.value}])},[d("div",{ref_key:"thumb",ref:s,class:k(["stack-tab__scrollbar-thumb",{"stack-tab__scrollbar-thumb--dragging":f.value}]),onPointerdown:G(D,["prevent"]),onPointermove:z,onPointerup:U,onPointercancel:U,onLostpointercapture:U},null,34)],2),[[N,h.value]])],544),b.value?(M(),i(Yt,{key:1,"icon-class":"stack-tab__icon stack-tab__icon--right-arrow",disabled:m.value,title:H(n)("VueStackTab.scrollRight"),"aria-label":H(n)("VueStackTab.scrollRight"),onClick:r[1]||(r[1]=t=>!m.value&&q(e.space))},null,8,["disabled","title","aria-label"])):c("",!0)],64))}}),Qt=/*@__PURE__*/p({__name:"index",props:{space:{},tabScrollMode:{default:Me.BOTH},tabTransition:{default:()=>({name:"stack-tab-zoom"})},contextmenu:{type:[Boolean,Object],default:!0},max:{default:20}},emits:["active"],setup(e,{emit:r}){const{t:l}=t(),d=v(De,L(!1)),p=r,m=L(),b=L(),{shown:h,contextMenuData:g,showContextMenu:k}=(()=>{const e=R({item:{},index:-1,left:0,top:0,max:0}),t=L(!1),a=()=>{t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",l)};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()},l=()=>{window.requestAnimationFrame(()=>{document.activeElement instanceof HTMLIFrameElement&&a()})};return x(()=>{a()}),{shown:t,contextMenuData:e,showContextMenu:async(a,s,i,c)=>{r=Date.now(),t.value=!1,document.removeEventListener("click",n),document.removeEventListener("focusin",o,!0),window.removeEventListener("blur",l),await y();const{clientY:u,clientX:d}=a;t.value=!0,Object.assign(e,{item:s,index:i,top:u,left:d,max:c}),await y(),document.addEventListener("click",n),document.addEventListener("focusin",o,!0),window.addEventListener("blur",l)}}})(),T=L(null),w=()=>{h.value=!1},S=e,{closeTab:P,activeTab:I,moveTab:C,tabs:A}=Ot(),E=s(()=>A.value.find(e=>e.active)?.id??""),V=e=>{const t=m.value;if(!t)return;const a=(b.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(E,()=>{y(()=>V())});const W=Xe(),q=({id:e})=>{y(()=>V(e))};W.on(Ge.TAB_SCROLL_TO,q),x(()=>{W.off(Ge.TAB_SCROLL_TO,q)});const $=L(null),F=L(null),D=s(()=>!1!==S.contextmenu),N=s(()=>Array.isArray(S.contextmenu)?S.contextmenu:[]),j=(e,t,a,r)=>{D.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=A.value.findIndex(e=>e.id===t),n=A.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 l=0;A.value.forEach((e,t)=>{e.pinned&&(l=t+1)}),o=Math.max(o,l),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=A.value[A.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=A.value[A.value.length-1];t&&Y(t)},te=s(()=>"string"==typeof S.tabTransition?{name:S.tabTransition}:S.tabTransition),ae=e=>{const t=A.value[e];var a;t&&(se(t,void 0,!0),a=String(t.id),y(()=>{const e=b.value?.querySelector(`.stack-tab__nav [role="tab"][data-tab-id="${CSS.escape(a)}"]`);e&&(e.focus(),m.value&&!m.value.isInView(e)&&m.value.scrollIntoView(e))}))},re=e=>{const t=A.value.length;if(t<=0)return;const a=A.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=s(()=>S.tabScrollMode===Me.BOTH||S.tabScrollMode===Me.BUTTON),oe=s(()=>S.tabScrollMode===Me.BOTH||S.tabScrollMode===Me.WHEEL),le=e=>{e.closable&&P(e.id),h.value=!1},se=(e,t,a)=>{m.value&&t&&y(()=>{m.value.isInView(t)||m.value.scrollIntoView(t)}),Promise.resolve(I(e.id,a)).then(()=>p("active",e.id)).catch(e=>{})};return(t,r)=>(M(),u("div",{ref_key:"headerRef",ref:b,class:"stack-tab__header"},[B(t.$slots,"leftButton"),f(Jt,{ref_key:"scrollContainerRef",ref:m,space:e.space,"is-scroll-wheel":oe.value,"is-scroll-button":ne.value},{default:z(()=>[f(o,_({key:"tab-list-transition",tag:"ul",class:"stack-tab__nav",role:"tablist","aria-orientation":"horizontal"},te.value,{appear:"",onKeydown:re,onDragover:G(Z,["prevent"]),onDrop:G(ee,["prevent"])}),{default:z(()=>[(M(!0),u(a,null,O(H(A),(e,t)=>(M(),i(Gt,{key:e.id,item:e,"drop-position":F.value?.tabId===e.id?F.value.position:void 0,onContextmenu:a=>j(a,e,t,H(A).length),onMouseup:G(t=>le(e),["middle","prevent"]),onClose:le,onActive:se,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"]),B(t.$slots,"rightButton"),f(Yt,{"icon-class":H(d)?"stack-tab__icon stack-tab__icon--restore":"stack-tab__icon stack-tab__icon--fullscreen",title:H(d)?H(l)("VueStackTab.restore"):H(l)("VueStackTab.maximum"),"aria-label":H(d)?H(l)("VueStackTab.restore"):H(l)("VueStackTab.maximum"),onClick:r[0]||(r[0]=e=>d.value=!H(d))},null,8,["icon-class","title","aria-label"]),f(n,{name:"stack-tab-zoom",appear:""},{default:z(()=>[H(h)?(M(),i($t,{key:"context-menu-transition",left:H(g).left,top:H(g).top,"tab-item":H(g).item,max:H(g).max,index:H(g).index,"context-menu":N.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))}}),Zt=/*@__PURE__*/p({__name:"StackCacheRenderer",props:{route:{},component:{}},setup(e){const t=e,{refreshKey:a,activeCacheKey:r,addPage:n}=Lt(),o=q(xt());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)=>B(t.$slots,"default",{wrappedComponent:o.value,activeCacheKey:H(r),component:e.component})}}),ea=/*@__PURE__*/p({__name:"StackKeepAlive",props:{transitionName:{default:"stack-tab-swap"}},emits:["loaded"],setup(e,{emit:t}){const a=t,{caches:o,getPageRefreshVersion:l}=Lt(),s=()=>{a("loaded")};return(t,a)=>{const c=V("router-view");return M(),i(c,null,{default:z(({Component:t,route:a})=>[f(Zt,{route:a,component:t},{default:z(({wrappedComponent:t,activeCacheKey:a,component:c})=>[f(n,{name:e.transitionName,appear:"",mode:"out-in"},{default:z(()=>[(M(),i(r,{include:H(o)},[(M(),i(W(t),{key:a,vnode:c,"refresh-version":H(l)(a),"transition-name":e.transitionName,onOnLoaded:s},null,40,["vnode","refresh-version","transition-name"]))],1032,["include"]))]),_:2},1032,["name"])]),_:1},8,["route","component"])]),_:1})}}}),ta=/* @__PURE__ */new Set(["vue-stack-tabs:openTab","openTab"]),aa=e=>"string"==typeof e||"number"==typeof e||null==e,ra=e=>"boolean"==typeof e?e:void 0,na=e=>{if(!Re(e))return null;const{id:t,title:a,path:r,query:n,iframe:o,closable:l,refreshable:s,iframeRefreshMode:i}=e;if("string"!=typeof a||""===a.trim())return null;if("string"!=typeof r||""===r.trim()||!ve(r))return null;const c=(e=>{if(!Re(e))return;const t={};for(const[a,r]of Object.entries(e))(aa(r)||Array.isArray(r)&&r.every(aa))&&(t[a]=r);return Object.keys(t).length>0?t:void 0})(n),u=ra(o),d=ra(l),f=ra(s),p=(e=>{if("reload"===e||"postMessage"===e)return e})(i);return{..."string"==typeof t&&t?{id:t}:{},title:a,path:r,...c?{query:c}:{},...void 0!==u?{iframe:u}:{},...void 0!==d?{closable:d}:{},...void 0!==f?{refreshable:f}:{},...p?{iframeRefreshMode:p}:{}}};function oa(e){const{tabs:t,iframeRefreshKeys:a,iframeLoadTimeout:r,t:n}=e,o=s(()=>t.value.filter(e=>e.iframe)),l=s(()=>t.value.find(e=>e.active&&!e.iframe)),i=s(()=>Boolean(l.value)),c=R({}),u=e=>a.value[e]??0,d=(e,t=u(e.id))=>{const a=ge(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("?"),l=o>=0?r.slice(0,o):r,s=o>=0?r.slice(o+1):"",i=new URLSearchParams(s);return i.set("__stack_tabs_refresh",String(t)),`${l}?${i.toString()}${n}`})(c[e.id]?a:"about:blank",t)},f=s(()=>{const e={};for(const t of o.value){const a=u(t.id);e[t.id]=d(t,a)}return e}),p=R({}),m=e=>p[e]??{status:"idle"},b=/* @__PURE__ */new Map,h=e=>{const t=b.get(e);t&&(clearTimeout(t),b.delete(e))},v=(e,t={})=>{("loaded"!==m(e).status||t.force)&&(h(e),p[e]={status:"loading"},b.set(e,setTimeout(()=>{b.delete(e),"loading"===m(e).status&&(p[e]={status:"timeout",message:n("VueStackTab.iframeLoadTimeout")})},r.value)))},g=R({}),_=s(()=>o.value.map(e=>`${e.id}:${e.active?1:0}`).join("|"));K(_,()=>{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(p))t.has(a)||(h(a),delete p[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 P(()=>{for(const e of b.values())clearTimeout(e);b.clear()}),{iframeTabs:o,activeNonIframeTab:l,hasActiveNonIframeTab:i,iframeSrcMap:f,getIframeRefreshKey:u,getIframeKey:e=>`${e.id}-${u(e.id)}`,getIframeLoadState:m,shouldShowIframeLoading:e=>"loading"===m(e).status,shouldShowIframeError:e=>"timeout"===m(e).status,retryIframe:e=>{p[e]={status:"idle"},a.value={...a.value,[e]:(a.value[e]??0)+1},y(()=>{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),p[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||!ve(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(!Re(e.data))return null;const a=e.data;return"string"==typeof a.type&&ta.has(a.type)?na(a.payload):null})(r,a);n&&t(n).catch(e=>{})}}}}var la={class:"stack-tab__container"},sa=["id","role","aria-labelledby","aria-hidden","hidden"],ia={class:"stack-tab__iframes"},ca=["id","aria-labelledby"],ua=["aria-label"],da={class:"stack-tab__iframe-loading-text"},fa={key:1,class:"stack-tab__iframe-error",role:"alert"},pa={class:"stack-tab__iframe-error-text"},ma=["onClick"],ba=["onClick"],ha=["src","data-refresh-key","title","sandbox","referrerpolicy","allow","onLoad"],va=/*@__PURE__*/p({__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:Me.BOTH},width:{default:"100%"},height:{default:"100%"},i18n:{default:void 0},space:{default:300},globalScroll:{type:Boolean,default:!1},scrollContainer:{},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,l=e;"string"!=typeof l.iframePath||l.iframePath.trim();const{changeLocale:p,t:b}=t(),h=v(Fe,null)??ze({iframePath:l.iframePath,maxTabCount:l.max,useGlobalScroll:l.globalScroll,scrollContainer:l.scrollContainer,sessionPrefix:l.sessionPrefix}),g=m()?.appContext.app,_=((e,t={})=>{if(t.app&&!Ke.has(t.app))return Ke.add(t.app),!0;if(!t.app){if(!He)return He=e,Ne=!0,!0;if(He===e&&!Ne)return Ne=!0,!0}if(t.isProduction??!0)return!1;throw new Error("VueStackTabs only supports one <VueStackTabs> instance per Vue app.")})(h,g?{app:g}:void 0);_&&(E(Fe,h),E(Ue,h.eventBus));const y=L(!1),w=L();_&&E(De,y),K(y,e=>{fe(),w.value=e?pe("body *:not(.stack-tab,.stack-tab *)"):void 0});const{tabs:I,iframeRefreshKeys:C,destroy:A,initialize:x,setMaxSize:R,setGlobalScroll:V,setScrollContainer:W,setSessionPrefix:q}=_?Lt(h):{tabs:h.tabs,iframeRefreshKeys:h.iframeRefreshKeys,destroy:()=>{},initialize:()=>{},setMaxSize:()=>{},setGlobalScroll:()=>{},setScrollContainer:()=>{},setSessionPrefix:()=>{}},{setIFramePath:D,openTab:G,openInNewWindow:U}=_?Ot(h):{setIFramePath:()=>{},openTab:()=>Promise.resolve(void 0),openInNewWindow:()=>{}};_&&(D(l.iframePath),V(l.globalScroll),W(l.scrollContainer),R(l.max),xe(p,l.i18n),K(()=>l.max,e=>R(e)),K(()=>l.globalScroll,e=>V(e)),K(()=>l.scrollContainer,e=>W(e)),K(()=>l.sessionPrefix,e=>q(e)),K(()=>l.i18n,e=>xe(p,e)));const X=e=>{o("onActive",e)},Y=()=>{o("onPageLoaded")},J=L(l.pageTransition),Q=h.eventBus;K(()=>l.pageTransition,(e,t)=>{J.value===t&&(J.value=e)}),K(()=>l.pageTransitionBack,(e,t)=>{J.value===t&&(J.value=e)});const Z=()=>{J.value=l.pageTransition},ee=()=>{J.value=l.pageTransitionBack};_&&(Q.on(Ge.FORWARD,Z),Q.on(Ge.BACKWARD,ee));const{iframeTabs:te,activeNonIframeTab:ae,hasActiveNonIframeTab:re,iframeSrcMap:ne,getIframeRefreshKey:oe,getIframeKey:le,getIframeLoadState:se,shouldShowIframeLoading:ie,shouldShowIframeError:ce,retryIframe:ue,setIframeRef:de,handleIframeLoad:me,handleRefreshIframePostMessage:be,createMessageHandler:he}=oa({tabs:I,iframeRefreshKeys:C,iframeLoadTimeout:F(l,"iframeLoadTimeout"),t:b}),ge=he(s(()=>["undefined"!=typeof window?window.location.origin:"",...l.iframeAllowedOrigins??[]].filter(Boolean)),G);return _&&Q.on(Ge.REFRESH_IFRAME_POSTMESSAGE,be),S(()=>{_&&(q(l.sessionPrefix),x(l.defaultTabs,l.homeTab),window.addEventListener("message",ge))}),P(()=>{_&&(window.removeEventListener("message",ge),Q.off(Ge.REFRESH_IFRAME_POSTMESSAGE,be),Q.off(Ge.FORWARD,Z),Q.off(Ge.BACKWARD,ee),A(),((e,t={})=>{t.app?Ke.delete(t.app):(He===e&&(Ne=!1),He===e&&(He=null))})(h,g?{app:g}:void 0))}),(t,r)=>H(_)?(M(),u("div",{key:0,class:k(["stack-tab",{"stack-tab--maximum":y.value}]),style:T({width:e.width,height:e.height,"z-index":w.value})},[f(Qt,{space:e.space,"tab-transition":e.tabTransition,"tab-scroll-mode":e.tabScrollMode,contextmenu:e.contextmenu,max:e.max,onActive:X},{leftButton:z(()=>[B(t.$slots,"leftButton")]),rightButton:z(()=>[B(t.$slots,"rightButton")]),_:3},8,["space","tab-transition","tab-scroll-mode","contextmenu","max"]),d("div",la,[f(n,{name:J.value,appear:""},{default:z(()=>[j((M(),u("div",{id:H(ae)?H(Dt)(H(ae).id):void 0,key:"keep-alive",class:"stack-tab__keep-alive-panel",role:H(ae)?"tabpanel":void 0,"aria-labelledby":H(ae)?H(Ft)(H(ae).id):void 0,"aria-hidden":H(ae)?void 0:"true",hidden:!H(re)},[f(ea,{"transition-name":J.value,onLoaded:Y},null,8,["transition-name"])],8,sa)),[[N,H(re)]])]),_:1},8,["name"]),d("div",ia,[(M(!0),u(a,null,O(H(te),a=>(M(),i(n,{key:H(le)(a),name:J.value,appear:""},{default:z(()=>[j((M(),u("div",{id:H(Dt)(a.id),key:H(le)(a),class:"stack-tab__iframe-wrapper",role:"tabpanel","aria-labelledby":H(Ft)(a.id)},[H(ie)(a.id)?(M(),u("div",{key:0,class:"stack-tab__iframe-loading",role:"status","aria-live":"polite","aria-label":H(b)("VueStackTab.loading")},[B(t.$slots,"iframeLoading",{tab:a},()=>[d("span",da,$(H(b)("VueStackTab.loading")),1)])],8,ua)):c("",!0),H(ce)(a.id)?(M(),u("div",fa,[B(t.$slots,"iframeError",{tab:a,retry:H(ue)},()=>[d("span",pa,$(H(se)(a.id).message??H(b)("VueStackTab.iframeLoadTimeout")),1),d("button",{type:"button",class:"stack-tab__iframe-error-retry",onClick:e=>H(ue)(a.id)},$(H(b)("VueStackTab.retry")),9,ma),a.url&&H(ve)(a.url)?(M(),u("button",{key:0,type:"button",class:"stack-tab__iframe-error-open",onClick:e=>H(U)(a.id)},$(H(b)("VueStackTab.openInNewWindow")),9,ba)):c("",!0)])])):c("",!0),d("iframe",{ref_for:!0,ref:e=>H(de)(a.id,e),class:"stack-tab__iframe",src:H(ne)[a.id]||"about:blank","data-refresh-key":H(oe)(a.id),title:a.title||H(b)("VueStackTab.iframeTitle")||"Stack tab iframe",sandbox:e.iframeSandbox||void 0,referrerpolicy:e.iframeReferrerPolicy,allow:e.iframeAllow||void 0,frameborder:"0",onLoad:e=>H(me)(a,e)},null,40,ha)],8,ca)),[[N,a.active]])]),_:2},1032,["name"]))),128))])])],6)):c("",!0)}});function ga(){const e=gt(),t=e?.tabId??"",a=e?.pageId??"",r=Y(),n=J(),o=Xe(),{getTab:l,getTopPage:s,getPages:i,appendPage:c,popPages:u,getPageSnapshot:d,replacePages:f,updatePage:p,evictPageCache:m,addPageScroller:b,active:h}=Lt(),v=r.query.__tab;let g=0;return{forward:e=>{const a=l(t),r=e.query||{},u=Te(e.path);if(a){const e=s(a.id);if(e&&e.path===u&&Ce(r,e.query||{}))return void(a.active||h(a.id))}const p={...Ae(r)};"string"==typeof v&&v&&(p.__tab=v);const m=++g;o.emit(Ge.FORWARD);let b="";Ye({apply:()=>{const e=a?d(a.id):[];return a&&(b=$e(),c(a.id,{id:b,tabId:a.id,path:u,query:we(p)})),e},navigate:()=>n.push({path:e.path,query:p}),rollback:e=>{a&&f(a.id,e)},isFailureResult:X,isCurrent:()=>g===m,cleanupStale:()=>{if(!a||!b)return;const e=i(a.id).filter(e=>e.id!==b);f(a.id,e)}}).catch(e=>{})},backward:(e,a)=>{const r=l(t);if(!r)return!1;const c=i(r.id);let b=0;if("number"==typeof e)b=Math.abs(e);else{const t=ke(e),a=t.query||{},r=Te(t.path);let n=!1;for(let e=c.length-2;e>=0;e--){b++;const t=c[e];if(t?.path===r&&Ce(a,t?.query||{})){n=!0;break}}if(!n)return!1}if(b<=0)return!1;const h=c.length-1;if(h<b&&(b=h),b<=0)return!1;const _=d(r.id),y=u(r.id,b).map(e=>e.id),k=s(r.id);if(!k)return f(r.id,_),!1;a&&p(r.id,k.id,{_backParams:a}),o.emit(Ge.BACKWARD);const T={...Ae(k.query||{})};"string"==typeof v&&v&&(T.__tab=v);const w=++g;return Ye({apply:()=>_,navigate:()=>n.push({path:k.path,query:T}),rollback:e=>f(r.id,e),isFailureResult:X,isCurrent:()=>g===w,commit:()=>{for(const e of y)m(e)},cleanupStale:()=>{const e=new Set(i(r.id).map(e=>e.id));for(const t of y)e.has(t)||m(t)}}).catch(e=>{}),!0},addScrollTarget:(...e)=>{b(a,...e)},tabId:t,pageId:a}}var _a=/*@__PURE__*/p({__name:"iframe",setup:e=>(ga(),()=>{})}),ya=()=>{const e=Xe(),t=gt(),a=()=>t?.tabId??"";x(()=>{r()});const r=()=>{e.emit(Ge.PAGE_LOADING,{tId:a(),value:!1})};return{openTabLoading:()=>{e.emit(Ge.PAGE_LOADING,{tId:a(),value:!0})},closeTabLoading:r}},ka="vue-stack-tabs:refresh",Ta="vue-stack-tabs:openTab";function wa(e,t={}){"undefined"!=typeof window&&window.parent&&window.parent.postMessage({type:Ta,payload:e},t.targetOrigin??window.location.origin)}function Sa(e=()=>window.location.reload(),t={}){if("undefined"==typeof window)return()=>{};const a=t.allowedOrigins??[],r=t=>{t.source===window.parent&&(a.length>0&&!a.includes(t.origin)||"vue-stack-tabs:refresh"===t.data?.type&&e())};return window.addEventListener("message",r),()=>window.removeEventListener("message",r)}var 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.6.1");const a=ze();e.provide(Fe,a),e.provide(Ue,a.eventBus),e.component("VueStackTabs",va).use(ce().getI18n(t))}};export{_a as IFrame,Ta as MSG_OPEN_TAB,ka as MSG_REFRESH,Ee as Stack,va as StackTab,va as VueStackTabs,Yt as TabHeaderButton,Me as TabScrollMode,Pa as default,Sa as onRefreshRequest,wa as postOpenTab,Ot as useTabActions,ya as useTabLoading,ga as useTabRouter};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vue-stack-tabs",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.1",
|
|
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.",
|
|
@@ -45,6 +45,7 @@ interface PageComponentFactoryOptions {
|
|
|
45
45
|
getter: (() => StackTabsScrollAdapter | null) | null
|
|
46
46
|
) => void
|
|
47
47
|
saveScroller: (pageId: string) => void
|
|
48
|
+
recordMainScroller: (pageId: string) => void
|
|
48
49
|
restoreScroller: (pageId: string) => void
|
|
49
50
|
removeScroller: (pageId: string) => void
|
|
50
51
|
}
|
|
@@ -91,6 +92,7 @@ export const createPageComponentFactory = (options: PageComponentFactoryOptions)
|
|
|
91
92
|
addPageScroller,
|
|
92
93
|
setPageScrollAdapter,
|
|
93
94
|
saveScroller,
|
|
95
|
+
recordMainScroller,
|
|
94
96
|
restoreScroller,
|
|
95
97
|
removeScroller
|
|
96
98
|
} = options
|
|
@@ -203,11 +205,17 @@ export const createPageComponentFactory = (options: PageComponentFactoryOptions)
|
|
|
203
205
|
/** 阴影订阅:优先用适配器的 onScroll,缺失时监听原生滚动元素。 */
|
|
204
206
|
const subscribeAdapterScroll = (listener: () => void): (() => void) => {
|
|
205
207
|
const adapter = getScrollAdapter()
|
|
206
|
-
|
|
208
|
+
// keep-alive 停用会先把 DOM 移入隐藏容器、让 scrollTop 归零,
|
|
209
|
+
// 因此滚动过程中就要记录位置,不能等到 onDeactivated 再读 DOM。
|
|
210
|
+
const handleScroll = () => {
|
|
211
|
+
recordMainScroller(cacheName)
|
|
212
|
+
listener()
|
|
213
|
+
}
|
|
214
|
+
if (adapter?.onScroll) return adapter.onScroll(handleScroll)
|
|
207
215
|
const element = adapter?.scrollElement
|
|
208
216
|
if (!element) return () => undefined
|
|
209
|
-
element.addEventListener('scroll',
|
|
210
|
-
return () => element.removeEventListener('scroll',
|
|
217
|
+
element.addEventListener('scroll', handleScroll, { passive: true })
|
|
218
|
+
return () => element.removeEventListener('scroll', handleScroll)
|
|
211
219
|
}
|
|
212
220
|
|
|
213
221
|
// 阴影类挂到不被刷新动画 transform 的 panel 上;滚动监听绑定真实滚动元素。
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* 避免每次 deactivate 都全量 querySelectorAll。
|
|
7
7
|
*/
|
|
8
8
|
import type { StackTabsRuntimeContext } from '../stackTabsContext'
|
|
9
|
+
import type { ScrollPosition } from './state'
|
|
9
10
|
import {
|
|
10
11
|
readAdapterScrollPosition,
|
|
11
12
|
writeAdapterScrollPosition,
|
|
@@ -15,6 +16,13 @@ import {
|
|
|
15
16
|
export interface TabPanelScrollApi {
|
|
16
17
|
restoreScroller: (pageCacheId: string) => void
|
|
17
18
|
saveScroller: (pageCacheId: string) => void
|
|
19
|
+
/**
|
|
20
|
+
* 记录主滚动容器的实时位置(由页面滚动事件调用)。
|
|
21
|
+
*
|
|
22
|
+
* keep-alive 停用时会先把页面 DOM 移入隐藏容器,原生 scrollTop 随之归零;
|
|
23
|
+
* 因此不能只在 onDeactivated 时读取 DOM,必须在滚动过程中持续记录。
|
|
24
|
+
*/
|
|
25
|
+
recordMainScroller: (pageCacheId: string) => void
|
|
18
26
|
removeScroller: (pageCacheId: string) => void
|
|
19
27
|
addPageScroller: (pageCacheId: string, ...selectorIds: string[]) => void
|
|
20
28
|
/**
|
|
@@ -33,6 +41,10 @@ export interface TabPanelScrollApi {
|
|
|
33
41
|
/** 自定义滚动容器对应的主滚动位置 key;无自定义容器时仍使用 `#W-<cacheName>`。 */
|
|
34
42
|
const MAIN_SCROLLER_KEY = '__stack-tab-main-scroller__'
|
|
35
43
|
|
|
44
|
+
/** 位置是否为原点(或尚未记录)。 */
|
|
45
|
+
const isZeroPosition = (position: ScrollPosition | undefined): boolean =>
|
|
46
|
+
!position || (position.top === 0 && position.left === 0)
|
|
47
|
+
|
|
36
48
|
const resolveScrollElement = (selector: string): HTMLElement | null =>
|
|
37
49
|
selector.startsWith('#')
|
|
38
50
|
? document.getElementById(selector.slice(1))
|
|
@@ -113,6 +125,22 @@ export const createTabPanelScroll = (context: StackTabsRuntimeContext): TabPanel
|
|
|
113
125
|
const getPageAdapter = (pageCacheId: string): StackTabsScrollAdapter | null =>
|
|
114
126
|
adapterGetters.get(pageCacheId)?.() ?? null
|
|
115
127
|
|
|
128
|
+
const recordMainScroller = (pageCacheId: string): void => {
|
|
129
|
+
const positions = scrollPositionsByPageId.get(pageCacheId)
|
|
130
|
+
if (!positions) return
|
|
131
|
+
|
|
132
|
+
if (adapterGetters.has(pageCacheId)) {
|
|
133
|
+
const position = readAdapterScrollPosition(getPageAdapter(pageCacheId))
|
|
134
|
+
if (position) positions.set(MAIN_SCROLLER_KEY, position)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const wrapper =
|
|
139
|
+
typeof document !== 'undefined' ? document.getElementById(`W-${pageCacheId}`) : null
|
|
140
|
+
if (!wrapper) return
|
|
141
|
+
positions.set(`#W-${pageCacheId}`, { top: wrapper.scrollTop, left: wrapper.scrollLeft })
|
|
142
|
+
}
|
|
143
|
+
|
|
116
144
|
const restoreScroller = (pageCacheId: string): void => {
|
|
117
145
|
const positions = scrollPositionsByPageId.get(pageCacheId)
|
|
118
146
|
if (!positions) return
|
|
@@ -151,7 +179,11 @@ export const createTabPanelScroll = (context: StackTabsRuntimeContext): TabPanel
|
|
|
151
179
|
if (adapterGetters.has(pageCacheId)) {
|
|
152
180
|
positions.delete(`#W-${pageCacheId}`)
|
|
153
181
|
const position = readAdapterScrollPosition(getPageAdapter(pageCacheId))
|
|
154
|
-
|
|
182
|
+
const previous = positions.get(MAIN_SCROLLER_KEY)
|
|
183
|
+
// 停用时滚动元素可能已被移入隐藏容器而读到 0;保留滚动过程中的记录值。
|
|
184
|
+
if (position && (!isZeroPosition(position) || isZeroPosition(previous))) {
|
|
185
|
+
positions.set(MAIN_SCROLLER_KEY, position)
|
|
186
|
+
}
|
|
155
187
|
}
|
|
156
188
|
|
|
157
189
|
// 与当前页面 DOM 同步自动标记的容器;移除的元素不保留过期位置。
|
|
@@ -171,10 +203,14 @@ export const createTabPanelScroll = (context: StackTabsRuntimeContext): TabPanel
|
|
|
171
203
|
// auto key 已在上一步按 DOM 顺序写入,主滚动位置由适配器维护,均无需再次解析。
|
|
172
204
|
if (selector.startsWith(AUTO_SCROLLER_PREFIX) || selector === MAIN_SCROLLER_KEY) continue
|
|
173
205
|
const element = resolveScrollElement(selector)
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
206
|
+
const next = { top: element?.scrollTop ?? 0, left: element?.scrollLeft ?? 0 }
|
|
207
|
+
const previous = positions.get(selector)
|
|
208
|
+
// 元素不可用,或停用后读到 0 而此前记录过非零位置时,保留记录值。
|
|
209
|
+
if (!element || (isZeroPosition(next) && !isZeroPosition(previous))) {
|
|
210
|
+
if (previous) positions.set(selector, previous)
|
|
211
|
+
continue
|
|
212
|
+
}
|
|
213
|
+
positions.set(selector, next)
|
|
178
214
|
}
|
|
179
215
|
}
|
|
180
216
|
|
|
@@ -224,6 +260,7 @@ export const createTabPanelScroll = (context: StackTabsRuntimeContext): TabPanel
|
|
|
224
260
|
return {
|
|
225
261
|
restoreScroller,
|
|
226
262
|
saveScroller,
|
|
263
|
+
recordMainScroller,
|
|
227
264
|
removeScroller,
|
|
228
265
|
addPageScroller,
|
|
229
266
|
setPageScrollAdapter
|
|
@@ -108,8 +108,14 @@ const createTabPanelApi = (runtimeContext: StackTabsRuntimeContext) => {
|
|
|
108
108
|
restoreCaches,
|
|
109
109
|
reset: resetStore
|
|
110
110
|
} = store
|
|
111
|
-
const {
|
|
112
|
-
|
|
111
|
+
const {
|
|
112
|
+
restoreScroller,
|
|
113
|
+
saveScroller,
|
|
114
|
+
recordMainScroller,
|
|
115
|
+
removeScroller,
|
|
116
|
+
addPageScroller,
|
|
117
|
+
setPageScrollAdapter
|
|
118
|
+
} = createTabPanelScroll(runtimeContext)
|
|
113
119
|
const {
|
|
114
120
|
saveActiveTabToSession,
|
|
115
121
|
clearSession,
|
|
@@ -248,6 +254,7 @@ const createTabPanelApi = (runtimeContext: StackTabsRuntimeContext) => {
|
|
|
248
254
|
addPageScroller,
|
|
249
255
|
setPageScrollAdapter,
|
|
250
256
|
saveScroller,
|
|
257
|
+
recordMainScroller,
|
|
251
258
|
restoreScroller,
|
|
252
259
|
removeScroller
|
|
253
260
|
})
|